diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc index fbbe05fa2174b2d7c6bb896cc62889bff5fd4dc9..56045a29e51e1dc332eabbb9f660fa64ad776430 100644 --- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc +++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc @@ -22,25 +22,35 @@ #include <lofar_config.h> #include <Common/LofarLogger.h> +#include <GCF/TM/GCF_ETHRawPort.h> +#include <GCF/TM/GCF_DevicePort.h> +#include <GCF/TM/GCF_TimerPort.h> #include <APL/TBB_Protocol/TBB_Protocol.ph> #include "BoardCmdHandler.h" + + using namespace LOFAR; using namespace TBB_Protocol; using namespace TBB; -BoardCmdHandler::BoardCmdHandler() +BoardCmdHandler::BoardCmdHandler(GCFTimerPort* port) : GCFFsm((State)&BoardCmdHandler::idle_state) { + itsSleepTimer = port; TS = TbbSettings::instance(); itsDone = true; itsRetries = 0; itsClientPort = 0; - itsCmd = 0; + itsCmd = 0; + } -BoardCmdHandler::~BoardCmdHandler() { } +BoardCmdHandler::~BoardCmdHandler() +{ + delete itsSleepTimer; +} GCFEvent::TResult BoardCmdHandler::idle_state(GCFEvent& event, GCFPortInterface& port) @@ -127,6 +137,11 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa } break; case F_TIMER: { + if (&port == itsSleepTimer) { + TRAN(BoardCmdHandler::send_state); + break; + } + // time-out, retry if ((itsRetries < TS->maxRetries()) && !itsCmd->isDone()) { LOG_DEBUG("=TIME-OUT="); @@ -135,7 +150,12 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa LOG_DEBUG_STR(formatString("itsRetries[%d] = %d", itsCmd->getBoardNr(), itsRetries)); } else { itsCmd->saveTpAckEvent(event); // max retries or done, save zero's - TRAN(BoardCmdHandler::send_state); + if (itsCmd->getSleepTime()) { + itsSleepTimer->setTimer((long)itsCmd->getSleepTime()); + itsCmd->setSleepTime(0); + } else { + TRAN(BoardCmdHandler::send_state); + } } } break; @@ -146,8 +166,12 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa if (itsCmd->isValid(event)) { port.cancelAllTimers(); itsCmd->saveTpAckEvent(event); - - TRAN(BoardCmdHandler::send_state); + if (itsCmd->getSleepTime()) { + itsSleepTimer->setTimer((long)itsCmd->getSleepTime()); + itsCmd->setSleepTime(0); + } else { + TRAN(BoardCmdHandler::send_state); + } } else { status = GCFEvent::NOT_HANDLED; } diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h index 79334bcdc4bcd56ca6b0350a32794d29f129cc8c..6b9f2556369e7a4869817fb84f73d2025ac54f63 100644 --- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h +++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.h @@ -37,6 +37,9 @@ #define BOARDCMDHANDLER_H_ #include <GCF/TM/GCF_Control.h> +#include <GCF/TM/GCF_ETHRawPort.h> +#include <GCF/TM/GCF_DevicePort.h> +#include <GCF/TM/GCF_TimerPort.h> #include "Command.h" #include "DriverSettings.h" @@ -50,7 +53,7 @@ namespace LOFAR { public: // Constructors for a SyncAction object. // Default direction is read. - BoardCmdHandler(); + BoardCmdHandler(GCFTimerPort* port); // Destructor for SyncAction. */ ~BoardCmdHandler(); @@ -66,16 +69,17 @@ namespace LOFAR { protected: private: - TbbSettings *TS; + TbbSettings* TS; bool itsDone; bool itsFlashMode; // variables int32 itsRetries; - GCFPortInterface *itsClientPort; // return port of the actual commmand - Command *itsCmd; // command to use + GCFPortInterface* itsClientPort; // return port of the actual commmand + Command* itsCmd; // command to use + GCFTimerPort* itsSleepTimer; }; } // end TBB namespace } // end LOFAR namespace -#endif /* BOARDACTION_H_ */ +#endif diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc index 8f62dd6c43dcb7d4c6e1c16fa0e3e172d7ffa374..01f7b716a82505e13d3b2864d4134ad82a278699 100644 --- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc @@ -107,6 +107,9 @@ void ClearCmd::saveTpAckEvent(GCFEvent& event) delete itsTPackE; nextBoardNr(); + if (isDone()) { + setSleepTime(3); // clearing the registers will last 3 seconds + } } // ---------------------------------------------------------------------------- @@ -116,6 +119,5 @@ void ClearCmd::sendTbbAckEvent(GCFPortInterface* clientport) if (itsTBBackE->status_mask[boardnr] == 0) itsTBBackE->status_mask[boardnr] = TBB_SUCCESS; } - sleep(3); clientport->send(*itsTBBackE); } diff --git a/MAC/APL/PIC/TBBDriver/src/Command.cc b/MAC/APL/PIC/TBBDriver/src/Command.cc index 7db70b694d6abe8e0122e263b9519cd42b41c74a..1cd1cb18927d11f0434243190089332393cda14a 100644 --- a/MAC/APL/PIC/TBBDriver/src/Command.cc +++ b/MAC/APL/PIC/TBBDriver/src/Command.cc @@ -29,7 +29,8 @@ using namespace LOFAR; using namespace TBB; Command::Command() : - itsWaitAck(false), itsDone(false), itsAllPorts(false), itsBoard(-1), itsChannel(-1), itsBoardMask(0) + itsWaitAck(false), itsDone(false), itsAllPorts(false), itsBoard(-1), + itsChannel(-1), itsBoardMask(0), itsSleepTime(0) { TS = TbbSettings::instance(); } @@ -103,6 +104,18 @@ void Command::setWaitAck(bool waitack) itsWaitAck = waitack; } +// ---------------------------------------------------------------------------- +void Command::setSleepTime(uint32 sleeptime) +{ + itsSleepTime = sleeptime; +} + +// ---------------------------------------------------------------------------- +uint32 Command::getSleepTime() +{ + return (itsSleepTime); +} + // ---------------------------------------------------------------------------- void Command::setBoardMask(uint32 mask) { diff --git a/MAC/APL/PIC/TBBDriver/src/Command.h b/MAC/APL/PIC/TBBDriver/src/Command.h index b9749232b356121c8fce42f829f24a1081d08363..d9e40f3736685ba1c979a8e401aa83d9957d1e80 100644 --- a/MAC/APL/PIC/TBBDriver/src/Command.h +++ b/MAC/APL/PIC/TBBDriver/src/Command.h @@ -55,6 +55,10 @@ namespace LOFAR { void setWaitAck(bool waitack); + void setSleepTime(uint32 sleeptime); + + uint32 getSleepTime(); + bool isDone(); void setDone(bool done); @@ -88,6 +92,7 @@ namespace LOFAR { int32 itsBoard; int32 itsChannel; uint32 itsBoardMask; + uint32 itsSleepTime; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc index 58f46e019a4595b464597f7cc2644ed83ed4aaf8..2a93573d4bee7110290bed82a628c6a0d0061a23 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc @@ -52,7 +52,7 @@ TbbSettings* TbbSettings::instance() // Default constructor // TbbSettings::TbbSettings() : - itsDriverVersion(112), // set cvs version of TBBDriver.c (now 1.12) + itsDriverVersion(DRIVER_VERSION), // set cvs version of TBBDriver.c (now 1.13) itsMaxBoards(0), // max.number of boards on 1 driver itsMaxChannels(0), // max.number of channels on 1 driver itsMpsOnBoard(4), // number of MPs on 1 board @@ -185,7 +185,8 @@ void TbbSettings::setMaxBoards (int32 maxboards) itsChannelInfo[ch].TriggerReleased = false; itsChannelInfo[ch].Triggered = false; itsChannelInfo[ch].TriggerLevel = 0; - itsChannelInfo[ch].TriggerMode = 0; + itsChannelInfo[ch].TriggerStartMode = 0; + itsChannelInfo[ch].TriggerStopMode = 0; itsChannelInfo[ch].FilterSelect = 0; itsChannelInfo[ch].DetectWindow = 0; itsChannelInfo[ch].TriggerDummy = 0; diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h index 0ae1dba66822f2186431dbdb7dc8bf8128be16b5..8f7a580b2d8f9328c3b36a344f99506e1217b6bf 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h @@ -35,6 +35,8 @@ namespace LOFAR { namespace TBB { +static const int DRIVER_VERSION = 113; // 1.13 in cvs + enum SetupStateT {boardReset,boardCleared,boardFreed,boardReady}; // info for all channels @@ -52,12 +54,13 @@ struct ChannelInfo // settings for the trigger system bool TriggerReleased; bool Triggered; - uint32 TriggerLevel; - uint32 TriggerMode; - uint32 FilterSelect; - uint32 DetectWindow; - uint32 TriggerDummy; - uint32 Coefficient[4]; + uint16 TriggerLevel; + uint8 TriggerStartMode; + uint8 TriggerStopMode; + uint8 FilterSelect; + uint8 DetectWindow; + uint16 TriggerDummy; + uint16 Coefficient[4]; }; struct BoardInfo @@ -111,12 +114,13 @@ public: uint32 getChPageSize(int32 channelnr); bool isChTriggerReleased(int32 channelnr); bool isChTriggered(int32 channelnr); - uint32 getChTriggerLevel(int32 channelnr); - uint32 getChTriggerMode(int32 channelnr); - uint32 getChFilterSelect(int32 channelnr); - uint32 getChDetectWindow(int32 channelnr); - uint32 getChTriggerDummy(int32 channelnr); - uint32 getChFilterCoefficient(int32 channelnr, int32 coef_nr); + uint16 getChTriggerLevel(int32 channelnr); + uint8 getChTriggerStartMode(int32 channelnr); + uint8 getChTriggerStopMode(int32 channelnr); + uint8 getChFilterSelect(int32 channelnr); + uint8 getChDetectWindow(int32 channelnr); + uint16 getChTriggerDummy(int32 channelnr); + uint16 getChFilterCoefficient(int32 channelnr, int32 coef_nr); string getIfName(); string getSrcIp(int32 boardnr); @@ -137,12 +141,13 @@ public: void setChPageSize(int32 channelnr, uint32 pagesize); void setChTriggered(int32 channelnr, bool triggered); void setChTriggerReleased(int32 channelnr, bool released); - void setChTriggerLevel(int32 channelnr, uint32 level); - void setChTriggerMode(int32 channelnr, uint32 mode); - void setChFilterSelect(int32 channelnr, uint32 filter_select); - void setChDetectWindow(int32 channelnr, uint32 detect_window); - void setChTriggerDummy(int32 channelnr, uint32 dummy); - void setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint32 coef); + void setChTriggerLevel(int32 channelnr, uint16 level); + void setChTriggerStartMode(int32 channelnr, uint8 mode); + void setChTriggerStopMode(int32 channelnr, uint8 mode); + void setChFilterSelect(int32 channelnr, uint8 filter_select); + void setChDetectWindow(int32 channelnr, uint8 detect_window); + void setChTriggerDummy(int32 channelnr, uint16 dummy); + void setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef); void clearRcuSettings(int32 boardnr); @@ -234,12 +239,13 @@ inline uint32 TbbSettings::getChStartAddr(int32 channelnr) { return (itsChannelI inline uint32 TbbSettings::getChPageSize(int32 channelnr) { return (itsChannelInfo[channelnr].PageSize); } inline bool TbbSettings::isChTriggered(int32 channelnr) { return (itsChannelInfo[channelnr].Triggered); } inline bool TbbSettings::isChTriggerReleased(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerReleased); } -inline uint32 TbbSettings::getChTriggerLevel(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerLevel); } -inline uint32 TbbSettings::getChTriggerMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerMode); } -inline uint32 TbbSettings::getChFilterSelect(int32 channelnr) { return (itsChannelInfo[channelnr].FilterSelect); } -inline uint32 TbbSettings::getChDetectWindow(int32 channelnr) { return (itsChannelInfo[channelnr].DetectWindow); } -inline uint32 TbbSettings::getChTriggerDummy(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerDummy); } -inline uint32 TbbSettings::getChFilterCoefficient(int32 channelnr, int32 coef_nr) { return (itsChannelInfo[channelnr].Coefficient[coef_nr]); } +inline uint16 TbbSettings::getChTriggerLevel(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerLevel); } +inline uint8 TbbSettings::getChTriggerStartMode(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerStartMode); } +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 uint16 TbbSettings::getChTriggerDummy(int32 channelnr) { return (itsChannelInfo[channelnr].TriggerDummy); } +inline uint16 TbbSettings::getChFilterCoefficient(int32 channelnr, int32 coef_nr) { return (itsChannelInfo[channelnr].Coefficient[coef_nr]); } inline string TbbSettings::getIfName() { return(itsIfName); } inline string TbbSettings::getSrcIp(int32 boardnr) { return(itsBoardInfo[boardnr].srcIp); } inline string TbbSettings::getDstIp(int32 boardnr) { return(itsBoardInfo[boardnr].dstIp); } @@ -253,12 +259,13 @@ inline void TbbSettings::setChStartAddr(int32 channelnr, uint32 startaddr){ itsC inline void TbbSettings::setChPageSize(int32 channelnr, uint32 pagesize){ itsChannelInfo[channelnr].PageSize = pagesize; } inline void TbbSettings::setChTriggered(int32 channelnr, bool triggered){ itsChannelInfo[channelnr].Triggered = triggered; } inline void TbbSettings::setChTriggerReleased(int32 channelnr, bool release){ itsChannelInfo[channelnr].TriggerReleased = release; } -inline void TbbSettings::setChTriggerLevel(int32 channelnr, uint32 level){ itsChannelInfo[channelnr].TriggerLevel = level; } -inline void TbbSettings::setChTriggerMode(int32 channelnr, uint32 mode){ itsChannelInfo[channelnr].TriggerMode = mode; } -inline void TbbSettings::setChFilterSelect(int32 channelnr, uint32 select){ itsChannelInfo[channelnr].FilterSelect = select; } -inline void TbbSettings::setChDetectWindow(int32 channelnr, uint32 window){ itsChannelInfo[channelnr].DetectWindow = window; } -inline void TbbSettings::setChTriggerDummy(int32 channelnr, uint32 dummy){ itsChannelInfo[channelnr].TriggerDummy = dummy; } -inline void TbbSettings::setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint32 coef){ itsChannelInfo[channelnr].Coefficient[coef_nr] = coef; } +inline void TbbSettings::setChTriggerLevel(int32 channelnr, uint16 level){ itsChannelInfo[channelnr].TriggerLevel = level; } +inline void TbbSettings::setChTriggerStartMode(int32 channelnr, uint8 mode){ itsChannelInfo[channelnr].TriggerStartMode = mode; } +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::setChTriggerDummy(int32 channelnr, uint16 dummy){ itsChannelInfo[channelnr].TriggerDummy = dummy; } +inline void TbbSettings::setChFilterCoefficient(int32 channelnr, int32 coef_nr, uint16 coef){ itsChannelInfo[channelnr].Coefficient[coef_nr] = coef; } //---- inline functions for board information ------------ inline uint32 TbbSettings::getMemorySize(int32 boardnr) { return (itsBoardInfo[boardnr].memorySize); } diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc index e4c66cce3b328380bbfe66a44ea76a013617b1ea..45a401696192326705a4221968688f5996638c31 100644 --- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc @@ -117,7 +117,7 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event) char info[256]; memset(info,0,256); memcpy(info,&itsTPackE->data,256); - LOG_DEBUG_STR(formatString("ImageInfoCmd: %s",info)); + LOG_DEBUG_STR("ImageInfoCmd: " << info); itsTBBackE->image_version[itsImage]= itsTPackE->data[0]; itsTBBackE->write_date[itsImage] = itsTPackE->data[1]; @@ -126,7 +126,8 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event) &itsTBBackE->tp_file_name[itsImage][0], &itsTBBackE->mp_file_name[itsImage][0]); - + LOG_DEBUG_STR("tp_file_name: " << itsTBBackE->tp_file_name[itsImage]); + LOG_DEBUG_STR("mp_file_name: " << itsTBBackE->mp_file_name[itsImage]); //itsTBBackE->image_version[itsImage]= itsTPackE->data[0]; //itsTBBackE->write_date[itsImage] = itsTPackE->data[1]; diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc index 65e99f75644a25052c7c9b920b8988006befc10f..1975e4a0ad167c886938124ada8dacad15d33fa2 100644 --- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc @@ -81,6 +81,8 @@ void ResetCmd::saveTbbEvent(GCFEvent& event) } TS->setActiveBoardsMask(boardmask); setDone(true); + setSleepTime(3); // full reset will take 3 seconds + delete itsTBBE; } @@ -105,6 +107,5 @@ void ResetCmd::sendTbbAckEvent(GCFPortInterface* clientport) if (itsTBBackE->status_mask[boardnr] == 0) itsTBBackE->status_mask[boardnr] = TBB_SUCCESS; } - sleep(3); clientport->send(*itsTBBackE); } diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc index 9c391d5e7e6284f74a627e9edbc296ad7d31a632..4f020bb36cd1415f3814671bf96a8791eadbff3f 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc @@ -1,23 +1,23 @@ -//# TBBDriver.cc: one line description +//# TBBDriver.cc: one line description +//# +//# Copyright (C) 2006 +//# ASTRON (Netherlands Foundation for Research in Astronomy) +//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl +//# +//# This program is free software; you can redistribute it and/or modify +//# it under the terms of the GNU General Public License as published by +//# the Free Software Foundation; either version 2 of the License, or +//# (at your option) any later version. +//# +//# This program is distributed in the hope that it will be useful, +//# but WITHOUT ANY WARRANTY; without even the implied warranty of +//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +//# GNU General Public License for more details. +//# +//# You should have received a copy of the GNU General Public License +//# along with this program; if not, write to the Free Software +//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //# -//# Copyright (C) 2006 -//# ASTRON (Netherlands Foundation for Research in Astronomy) -//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl -//# -//# This program is free software; you can redistribute it and/or modify -//# it under the terms of the GNU General Public License as published by -//# the Free Software Foundation; either version 2 of the License, or -//# (at your option) any later version. -//# -//# This program is distributed in the hope that it will be useful, -//# but WITHOUT ANY WARRANTY; without even the implied warranty of -//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//# GNU General Public License for more details. -//# -//# You should have received a copy of the GNU General Public License -//# along with this program; if not, write to the Free Software -//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -//# //# $Id$ //# Always #include <lofar_config.h> first! @@ -171,10 +171,11 @@ TBBDriver::TBBDriver(string name) itsAliveTimer = new GCFTimerPort(*this, "AliveTimer"); itsSetupTimer = new GCFTimerPort(*this, "SetupTimer"); + itsCmdTimer = new GCFTimerPort(*this, "CmdTimer"); - // create cmd & msg handler + // create cmd & msg handler LOG_DEBUG_STR("initializing handlers"); - cmdhandler = new BoardCmdHandler(); + cmdhandler = new BoardCmdHandler(itsCmdTimer); msghandler = new MsgHandler(); itsResetCount = new int32[TS->maxBoards()]; @@ -504,6 +505,25 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) port.send(ack); } break; + case TBB_TRIG_SETTINGS: { + TBBTrigSettingsAckEvent ack; + int rcu; + for (int32 ch = 0; ch < TS->maxChannels(); ch++) { + rcu = TS->getChRcuNr(ch); + + ack.setup[rcu].level = TS->getChTriggerLevel(ch); + ack.setup[rcu].start_mode = TS->getChTriggerStartMode(ch); + ack.setup[rcu].stop_mode = TS->getChTriggerStopMode(ch); + ack.setup[rcu].filter_select = TS->getChFilterSelect(ch); + ack.setup[rcu].window = TS->getChDetectWindow(ch); + ack.coefficients[rcu].c0 = TS->getChFilterCoefficient(ch,0); + ack.coefficients[rcu].c1 = TS->getChFilterCoefficient(ch,1); + ack.coefficients[rcu].c2 = TS->getChFilterCoefficient(ch,2); + ack.coefficients[rcu].c3 = TS->getChFilterCoefficient(ch,3); + } + port.send(ack); + } break; + case TBB_SUBSCRIBE: { msghandler->addClient(port) ; TBBSubscribeAckEvent subscribeack; diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h index 5f6356270cd7bc619214a0efa7d2123ee80b4404..b346fd5ed30e0d4930eeea53073cdf32940ba6fe 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h @@ -103,7 +103,7 @@ namespace LOFAR{ // define some variables TPAliveEvent *itsAlive; - BoardCmdHandler *cmdhandler; + BoardCmdHandler *cmdhandler; MsgHandler *msghandler; Command *cmd; bool itsAliveCheck; @@ -126,6 +126,7 @@ namespace LOFAR{ GCFETHRawPort* itsBoard; // array of ports, one for each TBB board GCFTimerPort* itsAliveTimer; GCFTimerPort* itsSetupTimer; + GCFTimerPort* itsCmdTimer; std::list<GCFPortInterface*> itsClientList; // list of clients }; } // end TBB namespace diff --git a/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc b/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc index ce2e8b6376e76892fdeb2797acf8ce4729c7064d..78f0249aef88840965341f7268f390e5b9e49f2f 100644 --- a/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/TrigSetupCmd.cc @@ -76,7 +76,8 @@ void TrigSetupCmd::saveTbbEvent(GCFEvent& event) channel = (board * TS->nrChannelsOnBoard()) + board_channel; TS->setChTriggerLevel(channel, itsTBBE->setup[rcunr].level); - TS->setChTriggerMode(channel, itsTBBE->setup[rcunr].td_mode); + TS->setChTriggerStartMode(channel, (itsTBBE->setup[rcunr].start_mode)); + TS->setChTriggerStopMode(channel, (itsTBBE->setup[rcunr].stop_mode)); TS->setChFilterSelect(channel, itsTBBE->setup[rcunr].filter_select); TS->setChDetectWindow(channel, itsTBBE->setup[rcunr].window); TS->setChTriggerDummy(channel, itsTBBE->setup[rcunr].dummy); @@ -110,14 +111,11 @@ void TrigSetupCmd::sendTpEvent() itsTPE->mp = TS->getChMpNr(getChannelNr()); for (int ch = 0; ch < 4; ch++) { itsTPE->channel[ch].level = static_cast<uint32>(TS->getChTriggerLevel(getChannelNr() + ch)); - itsTPE->channel[ch].td_mode = static_cast<uint32>(TS->getChTriggerMode(getChannelNr() + ch)); + itsTPE->channel[ch].td_mode = static_cast<uint32>((TS->getChTriggerStartMode(getChannelNr() + ch) + + (TS->getChTriggerStopMode(getChannelNr() + ch) << 4))); itsTPE->channel[ch].filter_select = static_cast<uint32>(TS->getChFilterSelect(getChannelNr() + ch)); itsTPE->channel[ch].window = static_cast<uint32>(TS->getChDetectWindow(getChannelNr() + ch)); itsTPE->channel[ch].dummy = static_cast<uint32>(TS->getChTriggerDummy(getChannelNr() + ch)); - - LOG_DEBUG_STR(formatString("TrigSetup --> board[%d],channel[%d],level[%08X],mode[%08X],filter[%08X],window[%08X],dummy[%08X]", - getBoardNr(), (getChannelNr() + ch), TS->getChTriggerLevel(getChannelNr() + ch), TS->getChTriggerMode(getChannelNr() + ch), - TS->getChFilterSelect(getChannelNr() + ch), TS->getChDetectWindow(getChannelNr() + ch), TS->getChTriggerDummy(getChannelNr() + ch))); } TS->boardPort(getBoardNr()).send(*itsTPE); diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc index e206901c52ec8ae555d11beca98a5119b12a9a68..aa9deefd853115cad1b9a0a7d33abb2cc51cc783 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc @@ -56,6 +56,8 @@ using namespace LOFAR; using namespace TBB_Protocol; using namespace TbbCtl; +static const long DELAY = 1; + //---- ALLOC ---------------------------------------------------------------- AllocCmd::AllocCmd(GCFPortInterface& port) : Command(port) { @@ -72,7 +74,7 @@ void AllocCmd::send() if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -124,7 +126,7 @@ void ChannelInfoCmd::send() { TBBRcuInfoEvent event; itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -175,7 +177,7 @@ void FreeCmd::send() if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -229,7 +231,7 @@ void RecordCmd::send() if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -285,7 +287,7 @@ void StopCmd::send() if (isSelectionDone()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -323,6 +325,49 @@ GCFEvent::TResult StopCmd::ack(GCFEvent& e) return(GCFEvent::HANDLED); } +//---- TRIGGERSETTINGS -------------------------------------------------------- +TriggerSettingsCmd::TriggerSettingsCmd(GCFPortInterface& port) : Command(port) +{ + cout << endl; + cout << "== TBB ===================================================== rcu info =======" << endl; + cout << endl; +} + +//----------------------------------------------------------------------------- +void TriggerSettingsCmd::send() +{ + TBBTrigSettingsEvent event; + itsPort.send(event); + itsPort.setTimer(DELAY); +} + +//----------------------------------------------------------------------------- +GCFEvent::TResult TriggerSettingsCmd::ack(GCFEvent& e) +{ + TBBTrigSettingsAckEvent ack(e); + + int32 bnr = 0; + int32 oldbnr = -1; + 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 c0 c1 c2 c3" << endl; + cout << "--- ----- ------ ------ ------ ------ ------ ------ ------ ------ ------" << endl; + } + cout << formatString("%3d %5d %6d %6d %6d %6d %6d %6d %6d %6d %6d", + 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.coefficients[rcu].c0, + ack.coefficients[rcu].c1, ack.coefficients[rcu].c2, ack.coefficients[rcu].c3) << endl; + } + oldbnr = bnr; + } + cout << endl; + + setCmdDone(true); + return(GCFEvent::HANDLED); +} + //---- TRIGRELEASE ------------------------------------------------------------ TrigReleaseCmd::TrigReleaseCmd(GCFPortInterface& port) : Command(port) { @@ -340,7 +385,7 @@ void TrigReleaseCmd::send() event.rcu_start_mask = getRcuMask(); } itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -388,7 +433,7 @@ void TrigGenerateCmd::send() event.rcu_mask = getRcuMask(); } itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -415,7 +460,7 @@ GCFEvent::TResult TrigGenerateCmd::ack(GCFEvent& e) //---- TRIGSETUP -------------------------------------------------------------- TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port), - itsLevel(0), itsMode(0), itsFilter(0), itsWindow(0), itsDummy(0) + itsLevel(0), itsStartMode(0), itsStopMode(0),itsFilter(0), itsWindow(0), itsDummy(0) { cout << endl; cout << "== TBB ============================ trigger system setup for selected rcu's ====" << endl; @@ -429,14 +474,15 @@ void TrigSetupCmd::send() if (isSelectionDone()) { for (int cnr=0; cnr < getMaxSelections(); cnr++) { event.setup[cnr].level = itsLevel; - event.setup[cnr].td_mode = itsMode; + 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].dummy = itsDummy + (cnr << 24); } } itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -487,7 +533,7 @@ void TrigCoefficientCmd::send() } } itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -530,7 +576,7 @@ void TrigInfoCmd::send() event.rcu = getRcu(); } itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -605,7 +651,7 @@ void ListenCmd::send() default: { } break; } - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -667,7 +713,7 @@ void ReadCmd::send() event.prepages = itsPrePages; event.postpages = itsPostPages; itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -707,7 +753,7 @@ void ModeCmd::send() event.board = (uint32)getBoard(); event.rec_mode = itsRecMode; itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -741,7 +787,7 @@ void VersionCmd::send() TBBVersionEvent event; event.boardmask = getBoardMask(); itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -791,7 +837,7 @@ void SizeCmd::send() TBBSizeEvent event; event.boardmask = getBoardMask(); itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -832,7 +878,7 @@ void StatusCmd::send() TBBStatusEvent event; event.boardmask = getBoardMask(); itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1129,7 +1175,7 @@ void ImageInfoCmd::send() TBBImageInfoEvent event; event.board = getBoard(); itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1159,7 +1205,8 @@ GCFEvent::TResult ImageInfoCmd::ack(GCFEvent& e) t.tm_mday,t.tm_mon+1,t.tm_year+1900, t.tm_hour,t.tm_min,t.tm_sec, ack.tp_file_name[image], - ack.mp_file_name[image]) << endl;; + ack.mp_file_name[image]) << endl; + cout << "TP: " << ack.tp_file_name[image] << ", MP: " << ack.mp_file_name[image] << endl; } } } else { @@ -1191,7 +1238,7 @@ void ReadwCmd::send() event.mp = itsMp; event.addr = itsAddr; itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1239,7 +1286,7 @@ void WritewCmd::send() event.wordlo = itsWordLo; event.wordhi = itsWordHi; itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1334,7 +1381,7 @@ void TestDdrCmd::send() default: break; } - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1465,7 +1512,7 @@ void ReadrCmd::send() event.regid = itsRegId; itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1520,7 +1567,7 @@ void WriterCmd::send() event.data[i] = itsData[i]; } itsPort.send(event); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } //----------------------------------------------------------------------------- @@ -1549,7 +1596,7 @@ GCFEvent::TResult WriterCmd::ack(GCFEvent& e) return(GCFEvent::HANDLED); } -//---- READPAGE ------------------------------------------------------------------ +//---- EADPAGE ------------------------------------------------------------------ ReadPageCmd::ReadPageCmd(GCFPortInterface& port) : Command(port), itsRcu(0),itsStartPage(0),itsPages(1),itsCmdStage(0),itsPage(0),itsTotalSize(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0), itsStationId(0),itsRspId(0),itsRcuId(0),itsSampleFreq(0),itsTime(0),itsSampleNr(0),itsSamplesPerFrame(0), @@ -1569,14 +1616,14 @@ void ReadPageCmd::send() case 0: { // get info about allocated RCU's TBBRcuInfoEvent send; itsPort.send(send); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } break; case 1: { // get total memmory size TBBSizeEvent send; send.boardmask = (1 << itsBoard); itsPort.send(send); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); } break; case 2: { // write page address to board @@ -1592,7 +1639,7 @@ void ReadPageCmd::send() send.data[1] = 0; send.data[2] = 0; itsPort.send(send); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.data[0])); @@ -1608,7 +1655,7 @@ void ReadPageCmd::send() send.data[1] = 0; send.data[2] = 0; itsPort.send(send); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.data[0])); @@ -1623,7 +1670,7 @@ void ReadPageCmd::send() send.pagelength = 256; send.pageaddr = 0; itsPort.send(send); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.pagelength,send.pageaddr)); @@ -1638,7 +1685,7 @@ void ReadPageCmd::send() send.pagelength = 256; send.pageaddr = 256; itsPort.send(send); - itsPort.setTimer((long)1); + itsPort.setTimer(DELAY); LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.pagelength,send.pageaddr)); @@ -1787,14 +1834,18 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) // print size of progressbar on screen bar_interval = itsPages / bar_size; + int recvtime = static_cast<int>((1043. / 262144.) * itsPages); // measured 262144 pages in 1043 seconds + int hours = recvtime / (60 * 60); + int mins = (recvtime - (hours * 60 * 60)) / 60; + int secs = recvtime - (hours * 60 * 60) - (mins * 60) + 1; // 1 second for overhead cout << endl; - cout << "Progress |"; + cout << " Estimated receive time " << formatString("%d:%02d:%02d",hours, mins, secs) << endl; + cout << "Progress |"; for (int i = 0; i < bar_size; i++) { cout << "-"; } cout << "|" << endl ; - cout << " |"; - + cout << " |" << flush; snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId); } @@ -1964,6 +2015,7 @@ void TBBCtl::commandHelp(int level) cout << " tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages # transfer recorded data from rcunr to CEP, " << endl; cout << " # use first --mode to setup UDP/IP header" << endl; cout << "______| TRIGGER |_________________________________________________________________________________________________________" << endl; + cout << " tbbctl --settings [--select=<set>] # list trigger settings for selected rcu's" << endl; cout << " tbbctl --release [--select=<set>] # release trigger system for selected rcu's" << endl; cout << " tbbctl --generate [--select=<set>] # generate a trigger for selected rcu's" << endl; cout << " tbbctl --setup=level,start,stop,filter,window,x [--select=<set>] # setup trigger system for selected rcu's, x = dummy" << endl; @@ -2042,7 +2094,7 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port) case F_ENTRY: { if (!itsServerPort.isConnected()) { itsServerPort.open(); - itsServerPort.setTimer((long)1); + itsServerPort.setTimer(DELAY); } } break; @@ -2075,7 +2127,7 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port) } break; case F_DISCONNECTED: { - //port.setTimer((long)1); + //port.setTimer(DELAY); port.close(); } break; @@ -2144,6 +2196,7 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port) case TBB_FREE_ACK: case TBB_RECORD_ACK: case TBB_STOP_ACK: + case TBB_TRIG_SETTINGS_ACK: case TBB_TRIG_RELEASE_ACK: case TBB_TRIG_SETUP_ACK: case TBB_TRIG_COEF_ACK: @@ -2210,7 +2263,8 @@ Command* TBBCtl::parse_options(int argc, char** argv) { "rcuinfo", no_argument, 0, 'i' }, { "free", no_argument, 0, 'f' }, { "record", no_argument, 0, 'r' }, - { "stop", no_argument, 0, 's' }, + { "stop", no_argument, 0, 's' }, + { "settings", no_argument, 0, 'b' }, { "release", no_argument, 0, 'e' }, { "generate", no_argument, 0, 'g' }, { "setup", required_argument, 0, 't' }, @@ -2242,7 +2296,7 @@ Command* TBBCtl::parse_options(int argc, char** argv) int option_index = 0; int c = getopt_long(argc, argv, - "l:afrsegt:c:I:LR:m:vzAp:CZS:1:2:3:8:4:5:9:6:7:hX", + "l:afrsbegt:c:I:LR:m:vzAp:CZS:1:2:3:8:4:5:9:6:7:hX", long_options, &option_index); if (c == -1) { @@ -2310,6 +2364,13 @@ Command* TBBCtl::parse_options(int argc, char** argv) command->setCmdType(RCUCMD); } break; + case 'b': { + if (command) delete command; + TriggerSettingsCmd* trigsettingscmd = new TriggerSettingsCmd(itsServerPort); + command = trigsettingscmd; + command->setCmdType(RCUCMD); + } break; + case 'e': { // --trigrelease if (command) delete command; TrigReleaseCmd* trigreleasecmd = new TrigReleaseCmd(itsServerPort); @@ -2361,11 +2422,12 @@ Command* TBBCtl::parse_options(int argc, char** argv) exit(EXIT_FAILURE); } - trigsetupcmd->setLevel(static_cast<uint32>(level)); - trigsetupcmd->setMode(static_cast<uint32>(start + (stop << 4))); - trigsetupcmd->setFilter(static_cast<uint32>(filter)); - trigsetupcmd->setWindow(static_cast<uint32>(window)); - trigsetupcmd->setDummy(static_cast<uint32>(dummy)); + 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->setDummy(static_cast<uint16>(dummy)); } command->setCmdType(RCUCMD); } break; diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h index 05e6c82f198c2726946c5a8244e4f66653ec1670..d727d5f173a626d6cc81b4a2e8c9765bd25b80ea 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h @@ -350,6 +350,17 @@ class StopCmd : public Command private: }; +//----------------------------------------------------------------------------- +class TriggerSettingsCmd : public Command +{ + public: + TriggerSettingsCmd(GCFPortInterface& port); + virtual ~TriggerSettingsCmd() { } + virtual void send(); + virtual GCFEvent::TResult ack(GCFEvent& e); + private: +}; + //----------------------------------------------------------------------------- class TrigReleaseCmd : public Command { @@ -380,17 +391,19 @@ class TrigSetupCmd : public Command virtual ~TrigSetupCmd() { } virtual void send(); virtual GCFEvent::TResult ack(GCFEvent& e); - void setLevel(uint32 level) { itsLevel = level; } - void setMode(uint32 mode) { itsMode = mode; } - void setFilter(uint32 filter) { itsFilter = filter; } - void setWindow(uint32 window) { itsWindow = window; } - void setDummy(uint32 dummy) { itsDummy = dummy; } + void setLevel(uint16 level) { itsLevel = level; } + void setStartMode(uint8 mode) { itsStartMode = mode; } + void setStopMode(uint8 mode) { itsStopMode = mode; } + void setFilter(uint8 filter) { itsFilter = filter; } + void setWindow(uint8 window) { itsWindow = window; } + void setDummy(uint16 dummy) { itsDummy = dummy; } private: - uint32 itsLevel; - uint32 itsMode; - uint32 itsFilter; - uint32 itsWindow; - uint32 itsDummy; + uint16 itsLevel; + uint8 itsStartMode; + uint8 itsStopMode; + uint8 itsFilter; + uint8 itsWindow; + uint16 itsDummy; }; //-----------------------------------------------------------------------------