diff --git a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc index b79ed87b2849ff9681b2ec6f31d85ae8fc249a5b..bea9a3425d23e5dad5ddffe706307ebd3df59750 100644 --- a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc +++ b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.cc @@ -204,11 +204,12 @@ void TbbSettings::setMaxBoards (int32 maxboards) // initialize filter settings itsChannelInfo[ch].TriggerReleased = false; itsChannelInfo[ch].Triggered = false; - itsChannelInfo[ch].TriggerLevel = 0; + itsChannelInfo[ch].TriggerLevel = 2047; itsChannelInfo[ch].TriggerStartMode = 0; itsChannelInfo[ch].TriggerStopMode = 0; itsChannelInfo[ch].FilterSelect = 0; itsChannelInfo[ch].DetectWindow = 0; + itsChannelInfo[ch].TriggerMode = 0; itsChannelInfo[ch].OperatingMode = 0; for (int i = 0; i < 4; i++) { itsChannelInfo[ch].Coefficient[i] = 0; @@ -216,7 +217,6 @@ void TbbSettings::setMaxBoards (int32 maxboards) } itsBoardSetup = false; - itsTriggerMode = 0; if (itsBoardInfo) delete itsBoardInfo; itsBoardInfo = new BoardInfo[itsMaxBoards]; @@ -322,7 +322,20 @@ void TbbSettings::clearRcuSettings(int32 boardnr) itsChannelInfo[(boardnr * 16) + cn].Status = 0; itsChannelInfo[(boardnr * 16) + cn].State = 'F'; itsChannelInfo[(boardnr * 16) + cn].StartAddr = 0; - itsChannelInfo[(boardnr * 16) + cn].PageSize = 0; + itsChannelInfo[(boardnr * 16) + cn].PageSize = 0; + + itsChannelInfo[(boardnr * 16) + cn].TriggerReleased = false; + itsChannelInfo[(boardnr * 16) + cn].Triggered = false; + itsChannelInfo[(boardnr * 16) + cn].TriggerLevel = 2047; + itsChannelInfo[(boardnr * 16) + cn].TriggerStartMode = 0; + itsChannelInfo[(boardnr * 16) + cn].TriggerStopMode = 0; + itsChannelInfo[(boardnr * 16) + cn].FilterSelect = 0; + itsChannelInfo[(boardnr * 16) + cn].DetectWindow = 0; + itsChannelInfo[(boardnr * 16) + cn].TriggerMode = 0; + itsChannelInfo[(boardnr * 16) + cn].OperatingMode = 0; + for (int i = 0; i < 4; i++) { + itsChannelInfo[(boardnr * 16) + cn].Coefficient[i] = 0; + } } } diff --git a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h index 939e0a4dd388ff76116cdca13c1dc3901267a2b6..1a85320c5dcc0e5a7ddf4a3563ac8dd951aa67d0 100644 --- a/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h +++ b/MAC/APL/PIC/TBB_Driver/src/DriverSettings.h @@ -35,7 +35,7 @@ namespace LOFAR { using GCF::TM::GCFPortInterface; namespace TBB { -static const int DRIVER_VERSION = 221; // TBBDriver V2.21 +static const int DRIVER_VERSION = 222; // TBBDriver V2.22 enum BoardStateT {noBoard, setImage1, image1Set, @@ -66,6 +66,7 @@ struct ChannelInfo uint8 TriggerStopMode; uint8 FilterSelect; uint8 DetectWindow; + uint8 TriggerMode; uint8 OperatingMode; uint16 Coefficient[4]; }; @@ -133,9 +134,9 @@ public: uint8 getChTriggerStopMode(int32 channelnr); uint8 getChFilterSelect(int32 channelnr); uint8 getChDetectWindow(int32 channelnr); + uint8 getChTriggerMode(int32 channelnr); uint8 getChOperatingMode(int32 channelnr); uint16 getChFilterCoefficient(int32 channelnr, int32 coef_nr); - uint16 getTriggerMode(); string getIfName(); string getDstMac(int32 boardnr); @@ -178,9 +179,9 @@ public: void setChTriggerStopMode(int32 channelnr, uint8 mode); void setChFilterSelect(int32 channelnr, uint8 filter_select); void setChDetectWindow(int32 channelnr, uint8 detect_window); + void setChTriggerMode(int32 channelnr, uint8 trigger_mode); void setChOperatingMode(int32 channelnr, uint8 operating_mode); void setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef); - void setTriggerMode(uint16 trigger_mode); void clearRcuSettings(int32 boardnr); @@ -236,7 +237,6 @@ private: BoardInfo *itsBoardInfo; ChannelInfo *itsChannelInfo; bool itsBoardSetup; - uint16 itsTriggerMode; string itsIfName; static TbbSettings *theirTbbSettings; @@ -293,9 +293,9 @@ inline uint8 TbbSettings::getChTriggerStartMode(int32 channelnr) { return (itsCh inline uint8 TbbSettings::getChTriggerStopMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerStopMode); } inline uint8 TbbSettings::getChFilterSelect(int32 channelnr) { return (itsChannelInfo[channelnr].FilterSelect); } inline uint8 TbbSettings::getChDetectWindow(int32 channelnr) { return (itsChannelInfo[channelnr].DetectWindow); } +inline uint8 TbbSettings::getChTriggerMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerMode); } inline uint8 TbbSettings::getChOperatingMode(int32 channelnr) { return (itsChannelInfo[channelnr].OperatingMode); } inline uint16 TbbSettings::getChFilterCoefficient(int32 channelnr, int32 coef_nr) { return (itsChannelInfo[channelnr].Coefficient[coef_nr]); } -inline uint16 TbbSettings::getTriggerMode() { return (itsTriggerMode); } inline string TbbSettings::getIfName() { return(itsIfName); } inline string TbbSettings::getDstMac(int32 boardnr) { return(itsBoardInfo[boardnr].dstMac); } inline string TbbSettings::getSrcIpCep(int32 boardnr) { return(itsBoardInfo[boardnr].srcIpCep); } @@ -321,9 +321,9 @@ inline void TbbSettings::setChTriggerStartMode(int32 channelnr, uint8 mode){ its inline void TbbSettings::setChTriggerStopMode(int32 channelnr, uint8 mode){ itsChannelInfo[channelnr].TriggerStopMode = mode; } inline void TbbSettings::setChFilterSelect(int32 channelnr, uint8 select){ itsChannelInfo[channelnr].FilterSelect = select; } inline void TbbSettings::setChDetectWindow(int32 channelnr, uint8 window){ itsChannelInfo[channelnr].DetectWindow = window; } +inline void TbbSettings::setChTriggerMode(int32 channelnr, uint8 trigger_mode){ itsChannelInfo[channelnr].TriggerMode = trigger_mode; } inline void TbbSettings::setChOperatingMode(int32 channelnr, uint8 operating_mode){ itsChannelInfo[channelnr].OperatingMode = operating_mode; } inline void TbbSettings::setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef){ itsChannelInfo[channelnr].Coefficient[coef_nr] = coef; } -inline void TbbSettings::setTriggerMode(uint16 triggermode){ itsTriggerMode = triggermode; } //---- inline functions for board information ------------ inline uint32 TbbSettings::getMemorySize(int32 boardnr) { return (itsBoardInfo[boardnr].memorySize); } inline void TbbSettings::setMemorySize(int32 boardnr,uint32 pages) { itsBoardInfo[boardnr].memorySize = pages; } diff --git a/MAC/APL/PIC/TBB_Driver/src/Makefile.am b/MAC/APL/PIC/TBB_Driver/src/Makefile.am index 64134b0057025572edb66f3a19e36da57e221cc0..8ec30ad44bc96c54792a36054019c798782076ac 100644 --- a/MAC/APL/PIC/TBB_Driver/src/Makefile.am +++ b/MAC/APL/PIC/TBB_Driver/src/Makefile.am @@ -41,7 +41,9 @@ libtbbdriver_la_SOURCES = Package__Version.cc \ TrigReleaseCmd.cc \ TrigGenCmd.cc\ TrigSetupCmd.cc\ + TrigSetupSameCmd.cc\ TrigCoefCmd.cc\ + TrigCoefSameCmd.cc\ TrigInfoCmd.cc\ ReadCmd.cc \ UdpCmd.cc \ @@ -89,7 +91,9 @@ noinst_HEADERS = \ TrigReleaseCmd.h \ TrigGenCmd.h\ TrigSetupCmd.h\ + TrigSetupSameCmd.h\ TrigCoefCmd.h\ + TrigCoefSameCmd.h\ TrigInfoCmd.h\ ReadCmd.h \ UdpCmd.h \ diff --git a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc index dd1ac4f1053e3192115504c929c7c6fa7d8ed42b..f93aa93aeb65bde4641fe17da9fc59aa0953a6bd 100644 --- a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc +++ b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.cc @@ -46,7 +46,8 @@ StatusCmd::StatusCmd() itsTmp1[boardnr] = 0; itsTmp2[boardnr] = 0; itsTmp3[boardnr] = 0; - itsImage[boardnr] = 0; + itsCurrentImage[boardnr] = 0; + itsFlashState[boardnr] = 0; itsWatchDogMode[boardnr] = 0; itsPgood[boardnr] = 0; } @@ -108,7 +109,8 @@ void StatusCmd::saveTpAckEvent(GCFEvent& event) itsTmp1[getBoardNr()] = tp_ack.Tmp1; itsTmp2[getBoardNr()] = tp_ack.Tmp2; itsTmp3[getBoardNr()] = tp_ack.Tmp3; - itsImage[getBoardNr()] = TS->getImageNr(getBoardNr()); + itsCurrentImage[getBoardNr()] = TS->getImageNr(getBoardNr()); + itsFlashState[getBoardNr()] = ((tp_ack.info[5] >> 8) & 0xff); itsWatchDogMode[getBoardNr()] = ((tp_ack.info[5] >> 16) & 0xf); itsPgood[getBoardNr()] = tp_ack.info[0]; @@ -136,7 +138,8 @@ void StatusCmd::sendTbbAckEvent(GCFPortInterface* clientport) tbb_ack.Tmp1[i] = itsTmp1[i]; tbb_ack.Tmp2[i] = itsTmp2[i]; tbb_ack.Tmp3[i] = itsTmp3[i]; - tbb_ack.Image[i] = itsImage[i]; + tbb_ack.CurrentImage[i] = itsCurrentImage[i]; + tbb_ack.FlashState[i] = itsFlashState[i]; tbb_ack.WatchDogMode[i] = itsWatchDogMode[i]; tbb_ack.Pgood[i] = itsPgood[i]; } diff --git a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h index 580fdf30bc6a2180c53c0ac92551193e8bfa9877..c61bd19c4917b7b6fd2117e9545a84a224c83ad1 100644 --- a/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h +++ b/MAC/APL/PIC/TBB_Driver/src/StatusCmd.h @@ -68,7 +68,8 @@ private: uint32 itsTmp1[MAX_N_TBBOARDS]; uint32 itsTmp2[MAX_N_TBBOARDS]; uint32 itsTmp3[MAX_N_TBBOARDS]; - uint32 itsImage[MAX_N_TBBOARDS]; + uint32 itsCurrentImage[MAX_N_TBBOARDS]; + uint32 itsFlashState[MAX_N_TBBOARDS]; uint32 itsWatchDogMode[MAX_N_TBBOARDS]; uint32 itsPgood[MAX_N_TBBOARDS]; }; diff --git a/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc b/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc index 55e9efdc7ea581bc6e4a0a51396995e844dcf3b8..0d1d65f9539511a4a9e1247e53328aa9f7f08b18 100644 --- a/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc +++ b/MAC/APL/PIC/TBB_Driver/src/TBBDriver.cc @@ -43,7 +43,9 @@ #include "TrigReleaseCmd.h" #include "TrigGenCmd.h" #include "TrigSetupCmd.h" +#include "TrigSetupSameCmd.h" #include "TrigCoefCmd.h" +#include "TrigCoefSameCmd.h" #include "TrigInfoCmd.h" #include "ReadCmd.h" #include "UdpCmd.h" @@ -470,9 +472,6 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port int board = TS->port2Board(&port); // get board nr itsBoard[board].cancelAllTimers(); TS->setBoardState(board,modeSet); - for (int i = 0; i < TS->maxChannels(); i++) { - TS->setChOperatingMode(i,static_cast<uint8>(TBB_MODE_TRANSIENT)); - } TS->setSetupWaitTime(board, 0); TS->setSetupCmdDone(board, true); } break; @@ -1083,6 +1082,7 @@ bool TBBDriver::sendInfo(GCFEvent& event, GCFPortInterface& port) case TBB_TRIG_SETTINGS: { if (TS->activeBoardsMask() != 0) { TBBTrigSettingsAckEvent ack; + ack.status_mask = TS->activeBoardsMask(); int rcu; for (int32 ch = 0; ch < TS->maxChannels(); ch++) { rcu = TS->getChRcuNr(ch); @@ -1092,6 +1092,7 @@ bool TBBDriver::sendInfo(GCFEvent& event, GCFPortInterface& port) ack.setup[rcu].stop_mode = TS->getChTriggerStopMode(ch); ack.setup[rcu].filter_select = TS->getChFilterSelect(ch); ack.setup[rcu].window = TS->getChDetectWindow(ch); + ack.setup[rcu].trigger_mode = TS->getChTriggerMode(ch); ack.setup[rcu].operating_mode = TS->getChOperatingMode(ch); ack.coefficients[rcu].c0 = TS->getChFilterCoefficient(ch,0); ack.coefficients[rcu].c1 = TS->getChFilterCoefficient(ch,1); @@ -1128,7 +1129,9 @@ bool TBBDriver::addTbbCommandToQueue(GCFEvent& event, GCFPortInterface& port) case TBB_TRIG_RELEASE: case TBB_TRIG_GENERATE: case TBB_TRIG_SETUP: + case TBB_TRIG_SETUP_SAME: case TBB_TRIG_COEF: + case TBB_TRIG_COEF_SAME: case TBB_TRIG_SETTINGS: case TBB_TRIG_INFO: case TBB_READ: @@ -1230,6 +1233,12 @@ bool TBBDriver::SetTbbCommand(unsigned short signal) itsCmd = new TrigSetupCmd(); itsCmdHandler->setTpCmd(itsCmd); } break; + + case TBB_TRIG_SETUP_SAME: { + TrigSetupSameCmd *itsCmd; + itsCmd = new TrigSetupSameCmd(); + itsCmdHandler->setTpCmd(itsCmd); + } break; case TBB_TRIG_COEF: { TrigCoefCmd *itsCmd; @@ -1237,6 +1246,12 @@ bool TBBDriver::SetTbbCommand(unsigned short signal) itsCmdHandler->setTpCmd(itsCmd); } break; + case TBB_TRIG_COEF_SAME: { + TrigCoefSameCmd *itsCmd; + itsCmd = new TrigCoefSameCmd(); + itsCmdHandler->setTpCmd(itsCmd); + } break; + case TBB_TRIG_INFO: { TrigInfoCmd *itsCmd; itsCmd = new TrigInfoCmd(); diff --git a/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc b/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc index 0bfa9a037a7aa93f13b57cf0e867a2feaebb9ecd..cf9726274e48b6dd681fb1ef0c680d9626432576 100644 --- a/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc +++ b/MAC/APL/PIC/TBB_Driver/src/TrigSetupCmd.cc @@ -70,9 +70,8 @@ void TrigSetupCmd::saveTbbEvent(GCFEvent& event) TS->setChTriggerStopMode(channel, (tbb_event.setup[rcunr].stop_mode)); TS->setChFilterSelect(channel, tbb_event.setup[rcunr].filter_select); TS->setChDetectWindow(channel, tbb_event.setup[rcunr].window); - TS->setChOperatingMode(channel, tbb_event.setup[rcunr].operating_mode); + TS->setChTriggerMode(channel, tbb_event.setup[rcunr].trigger_mode); } - TS->setTriggerMode(tbb_event.trigger_mode); std::bitset<MAX_N_RCUS> channels; channels.set(); @@ -96,7 +95,7 @@ void TrigSetupCmd::sendTpEvent() (TS->getChTriggerStopMode(getChannelNr() + i) << 4))); tp_event.channel[i].filter_select = static_cast<uint32>(TS->getChFilterSelect(getChannelNr() + i)); tp_event.channel[i].window = static_cast<uint32>(TS->getChDetectWindow(getChannelNr() + i)); - tp_event.channel[i].dummy = static_cast<uint32>(TS->getChOperatingMode(getChannelNr() + i)); + tp_event.channel[i].dummy = static_cast<uint32>(TS->getChTriggerMode(getChannelNr() + i)); } TS->boardPort(getBoardNr()).send(tp_event); diff --git a/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc b/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc index 8ee9000eec72286a9d163643c41201226856b244..31e2ba05708f25b4e59778082938577aa3805849 100644 --- a/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc +++ b/MAC/APL/PIC/TBB_Driver/src/UdpCmd.cc @@ -63,9 +63,7 @@ void UdpCmd::saveTbbEvent(GCFEvent& event) setBoards(0xFFF); itsMode = tbb_event.rec_mode; - for (int i = 0; i < TS->maxChannels(); i++) { - TS->setChOperatingMode(i,static_cast<uint8>(itsMode)); - } + nextBoardNr(); } @@ -104,7 +102,12 @@ void UdpCmd::saveTpAckEvent(GCFEvent& event) if (tp_ack.status != 0) { setStatus(getBoardNr(), (tp_ack.status << 24)); } - + else { + int start_channel = getBoardNr() * TS->nrChannelsOnBoard(); + for (int i = 0; i < TS->nrChannelsOnBoard();++i) { + TS->setChOperatingMode((start_channel + i), itsMode); + } + } LOG_DEBUG_STR(formatString("Received UdpAck from boardnr[%d]", getBoardNr())); } nextBoardNr(); diff --git a/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc b/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc index 11278d5a5e035323908178e86d32829535dc5ba6..a9a09db20ac8317a87526a0e46746c9c4122f611 100644 --- a/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc +++ b/MAC/APL/PIC/TBB_Driver/src/tbbctl.cc @@ -349,18 +349,31 @@ GCFEvent::TResult TriggerSettingsCmd::ack(GCFEvent& e) int32 bnr = 0; int32 oldbnr = -1; + + char trig_mode[4][10] = {"shot RSP","cont RSP","shot Ext","cont Ext"}; + char oper_mode[4][10] = {"?","transient","subbands","?"}; + for (int rcu=0; rcu < getMaxSelections(); rcu++) { bnr = static_cast<int32>(rcu / 16); if (isSelected(rcu) ) { if (bnr != oldbnr) { - cout << "Rcu Board level start stop filter window mode c0 c1 c2 c3" << endl; - cout << "--- ----- ----- ----- ----- ------ ------ ----- ----- ----- ----- -----" << endl; - } - cout << formatString("%3d %5d %5d %5d %5d %5d %5d %5d %5d %5d %5d %5d", - rcu, bnr, ack.setup[rcu].level, ack.setup[rcu].start_mode, ack.setup[rcu].stop_mode, - ack.setup[rcu].filter_select, ack.setup[rcu].window, ack.setup[rcu].operating_mode, - ack.coefficients[rcu].c0, ack.coefficients[rcu].c1, - ack.coefficients[rcu].c2, ack.coefficients[rcu].c3) << endl; + if (ack.status_mask & (1 << bnr)) { + cout << "Rcu Board level start stop filter window mode c0 c1 c2 c3" << endl; + cout << "--- ----- ----- ----- ----- ------ ------ ------------------- ----- ----- ----- -----" << endl; + } + else { + cout << formatString("board-%d not active",bnr) << endl; + } + } + if (ack.status_mask & (1 << bnr)) { + cout << formatString("%3d %5d %5d %5d %5d %6d %6d %8s, %9s %5d %5d %5d %5d", + rcu, bnr, ack.setup[rcu].level, ack.setup[rcu].start_mode, ack.setup[rcu].stop_mode, + ack.setup[rcu].filter_select, ack.setup[rcu].window, + trig_mode[ack.setup[rcu].trigger_mode], + oper_mode[ack.setup[rcu].operating_mode], + ack.coefficients[rcu].c0, ack.coefficients[rcu].c1, + ack.coefficients[rcu].c2, ack.coefficients[rcu].c3) << endl; + } } oldbnr = bnr; } @@ -476,7 +489,7 @@ GCFEvent::TResult TrigGenerateCmd::ack(GCFEvent& e) //---- TRIGSETUP -------------------------------------------------------------- TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port), - itsLevel(0), itsStartMode(0), itsStopMode(0),itsFilter(0), itsWindow(0), itsOperatingMode(0), itsTriggerMode(0) + itsLevel(0), itsStartMode(0), itsStopMode(0),itsFilter(0), itsWindow(0), itsTriggerMode(0) { cout << endl; cout << "== TBB ============================ trigger system setup for selected rcu's ====" << endl; @@ -486,17 +499,16 @@ TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port), //----------------------------------------------------------------------------- void TrigSetupCmd::send() { - TBBTrigSetupEvent event; + TBBTrigSetupSameEvent event; + if (isSelectionDone()) { - for (int cnr=0; cnr < getMaxSelections(); cnr++) { - event.setup[cnr].level = itsLevel; - event.setup[cnr].start_mode = itsStartMode; - event.setup[cnr].stop_mode = itsStopMode; - event.setup[cnr].filter_select = itsFilter; - event.setup[cnr].window = itsWindow; - event.setup[cnr].operating_mode = itsOperatingMode; - event.trigger_mode = itsTriggerMode; - } + event.rcu_mask = getRcuMask(); // if select cmd is used + event.setup.level = itsLevel; + event.setup.start_mode = itsStartMode; + event.setup.stop_mode = itsStopMode; + event.setup.filter_select = itsFilter; + event.setup.window = itsWindow; + event.setup.trigger_mode = itsTriggerMode; } itsPort.send(event); itsPort.setTimer(DELAY); @@ -505,8 +517,8 @@ void TrigSetupCmd::send() //----------------------------------------------------------------------------- GCFEvent::TResult TrigSetupCmd::ack(GCFEvent& e) { - if (e.signal == TBB_TRIG_SETUP_ACK) { - TBBTrigSetupAckEvent ack(e); + if (e.signal == TBB_TRIG_SETUP_SAME_ACK) { + TBBTrigSetupSameAckEvent ack(e); cout << "TBB Info" << endl; cout << "--- -------------------------------------------------------" << endl; int32 bnr = 0; @@ -516,7 +528,7 @@ GCFEvent::TResult TrigSetupCmd::ack(GCFEvent& e) if (bnr != oldbnr) { if (ack.status_mask[bnr] == TBB_SUCCESS) { - cout << formatString(" %2d setup trigger system for all rcu's",bnr ) << endl; + cout << formatString(" %2d setup trigger system for all selected rcu's",bnr ) << endl; } else { cout << formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()) << endl; } @@ -540,14 +552,13 @@ TrigCoefficientCmd::TrigCoefficientCmd(GCFPortInterface& port) : Command(port), //----------------------------------------------------------------------------- void TrigCoefficientCmd::send() { - TBBTrigCoefEvent event; + TBBTrigCoefSameEvent event; if (isSelectionDone()) { - for (int cnr=0; cnr < getMaxSelections(); cnr++) { - event.coefficients[cnr].c0 = itsC0; - event.coefficients[cnr].c1 = itsC1; - event.coefficients[cnr].c2 = itsC2; - event.coefficients[cnr].c3 = itsC3; - } + event.rcu_mask = getRcuMask(); // if select cmd is used + event.coefficients.c0 = itsC0; + event.coefficients.c1 = itsC1; + event.coefficients.c2 = itsC2; + event.coefficients.c3 = itsC3; } itsPort.send(event); itsPort.setTimer(DELAY); @@ -556,7 +567,7 @@ void TrigCoefficientCmd::send() //----------------------------------------------------------------------------- GCFEvent::TResult TrigCoefficientCmd::ack(GCFEvent& e) { - TBBTrigCoefAckEvent ack(e); + TBBTrigCoefSameAckEvent ack(e); cout << "TBB Info" << endl; cout << "--- -------------------------------------------------------" << endl; int32 bnr = 0; @@ -566,7 +577,7 @@ GCFEvent::TResult TrigCoefficientCmd::ack(GCFEvent& e) if (bnr != oldbnr) { if (ack.status_mask[bnr] == TBB_SUCCESS) { - cout << formatString(" %2d setup trigger system for all rcu's",bnr ) << endl; + cout << formatString(" %2d setup trigger system for all selected rcu's",bnr ) << endl; } else { cout << formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()) << endl; } @@ -664,7 +675,7 @@ void ListenCmd::send() cout << "-release all trigger systems, and waiting (STOP WAITING WITH CTRL-C)" << endl; setCmdSendNext(false); TBBTrigReleaseEvent release; - release.rcu_stop_mask.reset(); + release.rcu_stop_mask = getRcuMask(); release.rcu_start_mask = getRcuMask(); itsPort.send(release); cout << endl; @@ -1103,16 +1114,16 @@ GCFEvent::TResult StatusCmd::ack(GCFEvent& e) { TBBStatusAckEvent ack(e); - cout << "TBB Image WD mode V 1.2 V 2.5 V 3.3 PCB TP MP0 MP1 MP2 MP3 " << endl; - cout << "--- ----- ------- ----- ----- ----- ---- ---- ------- ------- ------- -------" << endl; + cout << "TBB Image WDmode V 1.2 V 2.5 V 3.3 PCB TP MP0 MP1 MP2 MP3 Flash" << endl; + cout << "--- ----- ------ ----- ----- ----- ---- ---- ------- ------- ------- ------- -----" << endl; for (int bnr=0; bnr < getMaxSelections(); bnr++) { if (isSelected(bnr) ) { if (ack.status_mask[bnr] == TBB_SUCCESS) { - cout << formatString(" %2d %2d %s %4.2fV %4.2fV %4.2fV %2u'C %2u'C %2u'C %s %2u'C %s %2u'C %s %2u'C %s", + cout << formatString("%3d %5d %6s %4.2fV %4.2fV %4.2fV %2u'C %2u'C %2u'C %s %2u'C %s %2u'C %s %2u'C %s 0x%2x", bnr, - ack.Image[bnr], - ack.WatchDogMode[bnr]?" ETH ":"clock", + ack.CurrentImage[bnr], + ack.WatchDogMode[bnr]?"ETH":"clock", ((double)ack.V12[bnr] * (2.5 / 192.)), // MAX6652 pin-2: 2.5 / 192 = 0.0130 / count ((double)ack.V25[bnr] * (3.3 / 192.)), // MAX6652 pin-3: 3.3 / 192 = 0.0172 / count ((double)ack.V33[bnr] * (5.0 / 192.)), // MAX6652 pin-1: 5.0 / 192 = 0.0625 / count @@ -1121,7 +1132,8 @@ GCFEvent::TResult StatusCmd::ack(GCFEvent& e) ack.Tmp0[bnr], (ack.Pgood[bnr] & 0x1)?"Pg":"Pb", ack.Tmp1[bnr], (ack.Pgood[bnr] & 0x2)?"Pg":"Pb", ack.Tmp2[bnr], (ack.Pgood[bnr] & 0x4)?"Pg":"Pb", - ack.Tmp3[bnr], (ack.Pgood[bnr] & 0x8)?"Pg":"Pb" ) << endl; + ack.Tmp3[bnr], (ack.Pgood[bnr] & 0x8)?"Pg":"Pb", + ack.FlashState[bnr]) << endl; } else { cout << formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str()) << endl; } @@ -2531,9 +2543,9 @@ void TBBCtl::commandHelp(int level) cout << " tbbctl --stop [--select=<set>] # stop recording on selected rcu's" << endl; cout << endl; cout << "______| CEP |_____________________________________________________________________________________________________________" << endl; - cout << " tbbctl --mode=[transient | subbands] # set mode to configure UDP/IP header for CEP tranport" << endl; - cout << " # before using: --read, readall, --arp or --arpmode," << endl; - cout << " # first use --mode to setup UDP/IP header" << endl; + cout << " tbbctl --mode=[transient | subbands] # set mode to configure UDP/IP header for CEP tranport" << endl; + cout << " # before using: --read, readall, --arp or --arpmode," << endl; + cout << " # first use --mode to setup UDP/IP header" << endl; cout << " tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages # transfer recorded data from rcunr to CEP, " << endl; cout << " tbbctl --readall=pages [--select=<set>] # transfer number of pages from all selected rcunr to CEP, " << endl; cout << " tbbctl --stopcep [--select=<set>] # stop sending data to CEP" << endl; @@ -2748,7 +2760,9 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port) case TBB_TRIG_SETTINGS_ACK: case TBB_TRIG_RELEASE_ACK: case TBB_TRIG_SETUP_ACK: + case TBB_TRIG_SETUP_SAME_ACK: case TBB_TRIG_COEF_ACK: + case TBB_TRIG_COEF_SAME_ACK: case TBB_TRIG_GENERATE_ACK: case TBB_TRIG_INFO_ACK: case TBB_TRIGGER: @@ -2976,7 +2990,7 @@ Command* TBBCtl::parse_options(int argc, char** argv) int numitems = sscanf(optarg, "%u,%u,%u,%u,%u,%u",&level, &start, &stop, &filter, &window, &triggermode); // check if valid arguments if ( numitems < 6 || numitems == EOF - || level < 1 || level > 255 + || level < 1 || level > 2047 || start < 1 || start > 15 || stop < 1 || stop > 15 || window > 8 @@ -2984,31 +2998,22 @@ Command* TBBCtl::parse_options(int argc, char** argv) { cout << "Error: invalid number of arguments. Should be of the format " << endl; cout << " '--trigsetup=level, start, stop, filter, window, mode' (use decimal values)" << endl; - cout << " level=1..255, start=1..15, stop=1..15, filter=0(in) or 1(bypassed)" << endl; + cout << " level=1..2047, start=1..15, stop=1..15, filter=0(in) or 1(bypassed)" << endl; cout << " window=0..8, mode=0..3 (b0=0 single shot),(b0=1 continues)" << endl; cout << " (b1=0 RSP input),(b1=1 external input)" << endl; exit(EXIT_FAILURE); } - //================================================ - // set triggermode to single shot, continues mode - // will give more than 6000 triggers per second per - // board, if level is chosen to low, the driver can't - // handle that amount of trigger per board. - if ((triggermode == 1) && (level < 3)){ - cout << "mode=1 with level < 3 can generate to many triggers, auto corrected to level = 3" << endl; - level = 3; + if ((triggermode & 1) && (level < 4)){ + cout << "mode=continues with level < 4 can generate to many triggers, auto corrected to level = 4" << endl; + level = 4; } - - //================================================ - trigsetupcmd->setLevel(static_cast<uint16>(level)); trigsetupcmd->setStartMode(static_cast<uint8>(start)); trigsetupcmd->setStopMode(static_cast<uint8>(stop)); trigsetupcmd->setFilter(static_cast<uint8>(filter)); trigsetupcmd->setWindow(static_cast<uint8>(window)); - trigsetupcmd->setOperatingMode(static_cast<uint16>(triggermode)); trigsetupcmd->setTriggerMode(static_cast<uint16>(triggermode)); } diff --git a/MAC/APL/PIC/TBB_Driver/src/tbbctl.h b/MAC/APL/PIC/TBB_Driver/src/tbbctl.h index 4d2ce1b4445b1a9d4d35e75cd7f6dc2cafe6ca2d..226547967214d31ddaf443e5f5c8ddad64acfbce 100644 --- a/MAC/APL/PIC/TBB_Driver/src/tbbctl.h +++ b/MAC/APL/PIC/TBB_Driver/src/tbbctl.h @@ -44,7 +44,7 @@ namespace LOFAR { GCFTimerPort* itsCmdTimer; -static const int TBBCTL_VERSION = 220; // tbbctl V2.20 +static const int TBBCTL_VERSION = 222; // tbbctl V2.22 // MAX_N_TBBOARDS and MAX_N_RCUS come from TBB_protocol.ph @@ -455,16 +455,14 @@ public: void setStopMode(uint8 mode) { itsStopMode = mode; } void setFilter(uint8 filter) { itsFilter = filter; } void setWindow(uint8 window) { itsWindow = window; } - void setOperatingMode(uint16 mode) { itsOperatingMode = mode; } - void setTriggerMode(uint16 mode) { itsTriggerMode = mode; } + void setTriggerMode(uint8 mode) { itsTriggerMode = mode; } private: uint16 itsLevel; uint8 itsStartMode; uint8 itsStopMode; uint8 itsFilter; uint8 itsWindow; - uint8 itsOperatingMode; - uint16 itsTriggerMode; + uint8 itsTriggerMode; }; //-----------------------------------------------------------------------------