diff --git a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc index 07c6a69ccd3e95aeeaaf9893c489957985d5bcc2..a6023941d4b531bd6359a11262e532676b8b5372 100644 --- a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc @@ -39,7 +39,7 @@ AllocCmd::AllocCmd(): itsStage(0),itsRcuStatus(0) itsTPE = new TPAllocEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBAllocackEvent(); + itsTBBackE = new TBBAllocAckEvent(); for(int boardnr = 0;boardnr < TS->maxBoards();boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -59,8 +59,8 @@ AllocCmd::~AllocCmd() bool AllocCmd::isValid(GCFEvent& event) { if ((event.signal == TBB_ALLOC) - || (event.signal == TP_ALLOCACK) - || (event.signal == TP_SIZEACK)) { + || (event.signal == TP_ALLOC_ACK) + || (event.signal == TP_SIZE_ACK)) { return(true); } return(false); @@ -72,18 +72,21 @@ void AllocCmd::saveTbbEvent(GCFEvent& event) itsTBBE = new TBBAllocEvent(event); // convert rcu-bitmask to tbb-channelmask - int32 board; - int32 channel; + int32 board; // board 0 .. 11 + int32 board_channel;// board_channel 0 .. 15 + int32 channel; // channel 0 .. 191 (= maxboard * max_channels_on_board) for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) { if(itsTBBE->rcu_mask.test(rcunr)) { - TS->convertRcu2Ch(rcunr,&board,&channel); - itsChannelMask[board] |= (1 << channel); + TS->convertRcu2Ch(rcunr,&board,&board_channel); + channel = (board * TS->nrChannelsOnBoard()) + board_channel; + itsChannelMask[board] |= (1 << board_channel); + TS->setChSelected(channel,true); } } uint32 boardmask = 0; for (int boardnr = 0; boardnr < TS->maxBoards(); boardnr++) { - if (itsChannelMask[board] != 0) boardmask |= (1 << boardnr); + if (itsChannelMask[boardnr] != 0) boardmask |= (1 << boardnr); if (TS->isBoardActive(boardnr)) { @@ -95,7 +98,6 @@ void AllocCmd::saveTbbEvent(GCFEvent& event) if (TS->getChState((ch + (boardnr * 16))) != 'F') { itsTBBackE->status_mask[boardnr] |= TBB_ALLOC_ERROR; } else { - TS->setChSelected((ch + (boardnr * 16)),true); LOG_DEBUG_STR(formatString("Ch[%d] is selected",ch + (boardnr * 16))); } } @@ -111,6 +113,7 @@ void AllocCmd::saveTbbEvent(GCFEvent& event) } setBoardMask(boardmask); + LOG_DEBUG_STR(formatString("boardmask = 0x%08X",boardmask)); // select first board to handle nextBoardNr(); @@ -125,7 +128,7 @@ void AllocCmd::saveTbbEvent(GCFEvent& event) // ---------------------------------------------------------------------------- void AllocCmd::sendTpEvent() { - if (itsTBBackE->status_mask[getBoardNr()] == 0) { + //if (itsTBBackE->status_mask[getBoardNr()] == 0) { switch (itsStage) { // stage 1, get board memory size @@ -150,16 +153,16 @@ void AllocCmd::sendTpEvent() itsRcuStatus |= TBB_RCU_NOT_FREE; // send cmd if no errors - if (itsRcuStatus == 0) { + //if (itsRcuStatus == 0) { TS->boardPort(getBoardNr()).send(*itsTPE); LOG_DEBUG_STR(formatString("Sending Alloc to boardnr[%d], channel[%d]",getBoardNr(),getChannelNr())); - } + //} } break; default: { } break; } - } + //} TS->boardPort(getBoardNr()).setTimer(TS->timeout()); } @@ -173,12 +176,14 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR; } else { - TPSizeackEvent *sizeAckEvent = new TPSizeackEvent(event); + TPSizeAckEvent *sizeAckEvent = new TPSizeAckEvent(event); - if ((sizeAckEvent->status >= 0xF0) && (sizeAckEvent->status <= 0xF6)) + if ((sizeAckEvent->status >= 0xF0) && (sizeAckEvent->status <= 0xF6)) { itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (sizeAckEvent->status & 0x0F))); + } - TS->setMemorySize(getBoardNr(),sizeAckEvent->npages); + //TS->setMemorySize(getBoardNr(),sizeAckEvent->npages); + TS->setMemorySize(getBoardNr(),4194304); if (!devideChannels(getBoardNr())) // calculate allocations itsTBBackE->status_mask[getBoardNr()] |= TBB_ALLOC_ERROR; @@ -192,7 +197,7 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event) if (isDone()) { setDone(false); resetChannelNr(); - nextChannelNr(); + nextSelectedChannelNr(); itsStage = 1; } } break; @@ -206,7 +211,7 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event) LOG_INFO_STR(formatString("F_TIMER AllocCmd DriverStatus[0x%08X], RcuStatus[0x%08X]", itsTBBackE->status_mask[getBoardNr()],itsRcuStatus)); } else { - itsTPackE = new TPAllocackEvent(event); + itsTPackE = new TPAllocAckEvent(event); if (itsTPackE->status == 0) { TS->setChState(getChannelNr(),'A'); @@ -231,12 +236,17 @@ void AllocCmd::saveTpAckEvent(GCFEvent& event) if (itsRcuStatus || itsTBBackE->status_mask[getBoardNr()]) { int32 rcu; TS->convertCh2Rcu(getChannelNr(),&rcu); - LOG_INFO_STR(formatString("ERROR AllocCmd Rcu[%d], DriverStatus[0x%x], RcuStatus[0x%x]", + LOG_INFO_STR(formatString("ERROR AllocCmd Rcu[%d], DriverStatus[0x%08x], RcuStatus[0x%08x]", rcu, itsTBBackE->status_mask[getBoardNr()],itsRcuStatus)); } itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus; - nextChannelNr(); + /* + if (itsTBBackE->status_mask[getBoardNr()] != 0) { + setChannelNr((getBoardNr() * 16) + 15); + } + */ + nextSelectedChannelNr(); } break; default: { diff --git a/MAC/APL/PIC/TBBDriver/src/AllocCmd.h b/MAC/APL/PIC/TBBDriver/src/AllocCmd.h index e5b4215346ed98f5e1ffc44a27dca7e0cb165720..37c67f5a68618fb2abbbffcff49a2ec07d088961 100644 --- a/MAC/APL/PIC/TBBDriver/src/AllocCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/AllocCmd.h @@ -68,9 +68,9 @@ namespace LOFAR { uint32 itsChannelMask[MAX_N_TBBBOARDS]; TPAllocEvent *itsTPE; - TPAllocackEvent *itsTPackE; + TPAllocAckEvent *itsTPackE; TBBAllocEvent *itsTBBE; - TBBAllocackEvent *itsTBBackE; + TBBAllocAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc index 58bd038bd431f46965f3469053035e1ceb2fba8d..19f3beb0c2735cd81fdfbc83b82bb0b4e6ec9aca 100644 --- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc @@ -37,7 +37,7 @@ ClearCmd::ClearCmd() itsTPE = new TPClearEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBClearackEvent(); + itsTBBackE = new TBBClearAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -55,7 +55,7 @@ ClearCmd::~ClearCmd() // ---------------------------------------------------------------------------- bool ClearCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_CLEAR)||(event.signal == TP_CLEARACK)) { + if ((event.signal == TBB_CLEAR)||(event.signal == TP_CLEAR_ACK)) { return(true); } return(false); @@ -97,7 +97,7 @@ void ClearCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { ; } else { - itsTPackE = new TPClearackEvent(event); + itsTPackE = new TPClearAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F))); diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.h b/MAC/APL/PIC/TBBDriver/src/ClearCmd.h index 9b33a07af0f9f13220a32ee303c0e40261dca296..59deebbe26012ce03c9312f950fdba2aad29790a 100644 --- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPClearEvent *itsTPE; - TPClearackEvent *itsTPackE; + TPClearAckEvent *itsTPackE; TBBClearEvent *itsTBBE; - TBBClearackEvent *itsTBBackE; + TBBClearAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/Command.cc b/MAC/APL/PIC/TBBDriver/src/Command.cc index 693e7ac66d3d9d0424bfee7ee82c7b6f36f94dcc..d8f7da8802193942473afb7ee944d102ebd8eeb5 100644 --- a/MAC/APL/PIC/TBBDriver/src/Command.cc +++ b/MAC/APL/PIC/TBBDriver/src/Command.cc @@ -143,6 +143,40 @@ void Command::nextChannelNr() { bool validNr = false; + do { + itsChannel++; + itsBoard = TS->getChBoardNr(itsChannel); + + if (itsBoard < TS->maxBoards()) { + // see if board is active + if ( TS->boardPort(itsBoard).isConnected() + && TS->isBoardActive(itsBoard) + && (itsChannel < TS->maxChannels())) + { + validNr = true; + } + } else { + break; + } + } while (!validNr && (itsChannel < TS->maxChannels())); + + // if all nr done send clear all variables + if (!validNr) { + itsDone = true; + itsChannel = -1; + for (int ch = 0; ch < TS->maxChannels(); ch++) { + TS->setChSelected(ch, false); + } + } + LOG_DEBUG_STR(formatString("nextChannelNr() = %d",itsChannel)); +} + +// ---------------------------------------------------------------------------- +// only channels with a state different than 'F' are selected +void Command::nextSelectedChannelNr() +{ + bool validNr = false; + do { itsChannel++; itsBoard = TS->getChBoardNr(itsChannel); @@ -150,7 +184,8 @@ void Command::nextChannelNr() if (itsBoard < TS->maxBoards()) { // see if board is active and channel is selected if (TS->boardPort(itsBoard).isConnected() - && TS->isBoardActive(itsBoard) + && TS->isBoardActive(itsBoard) + && (itsChannel < TS->maxChannels()) && TS->isChSelected(itsChannel)) { validNr = true; @@ -164,8 +199,9 @@ void Command::nextChannelNr() if (!validNr) { itsDone = true; itsChannel = -1; + for (int ch = 0; ch < TS->maxChannels(); ch++) { + TS->setChSelected(ch, false); + } } - LOG_DEBUG_STR(formatString("nextChannelNr() = %d",itsChannel)); + LOG_DEBUG_STR(formatString("nextSelectedChannelNr() = %d",itsChannel)); } - - diff --git a/MAC/APL/PIC/TBBDriver/src/Command.h b/MAC/APL/PIC/TBBDriver/src/Command.h index 4d68e4176be63c326d907df3075ab77892093617..b9749232b356121c8fce42f829f24a1081d08363 100644 --- a/MAC/APL/PIC/TBBDriver/src/Command.h +++ b/MAC/APL/PIC/TBBDriver/src/Command.h @@ -75,6 +75,8 @@ namespace LOFAR { void nextChannelNr(); + void nextSelectedChannelNr(); + void setBoardMask(uint32 mask); private: diff --git a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc index 98bf9c82ddf55ca22f2905e24bbe185f66bf4ec7..4a6c89c8f45766b5634abcdb6867066ebf62885e 100644 --- a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc @@ -38,7 +38,7 @@ ConfigCmd::ConfigCmd() itsTPE = new TPConfigEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBConfigackEvent(); + itsTBBackE = new TBBConfigAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -56,7 +56,7 @@ ConfigCmd::~ConfigCmd() // ---------------------------------------------------------------------------- bool ConfigCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_CONFIG)||(event.signal == TP_CONFIGACK)) { + if ((event.signal == TBB_CONFIG)||(event.signal == TP_CONFIG_ACK)) { return(true); } return(false); @@ -100,7 +100,7 @@ void ConfigCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR; } else { - itsTPackE = new TPConfigackEvent(event); + itsTPackE = new TPConfigAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F))); diff --git a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h index 30cc767a7c14f7b44509d9017c3e033c996b8883..8c6039ae61c609afb28aa6f440f20a2a13d8f206 100644 --- a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPConfigEvent *itsTPE; - TPConfigackEvent *itsTPackE; + TPConfigAckEvent *itsTPackE; TBBConfigEvent *itsTBBE; - TBBConfigackEvent *itsTBBackE; + TBBConfigAckEvent *itsTBBackE; }; } // 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 02242567c26a22b9ff718e65e2e26f632799953c..36587a738287b29a2f680197116b6debf491563a 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc @@ -51,7 +51,7 @@ TbbSettings* TbbSettings::instance() // Default constructor // TbbSettings::TbbSettings() : - itsDriverVersion(10), // driver version 1.0 + itsDriverVersion(19), // driver version 1.9 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 @@ -178,6 +178,18 @@ void TbbSettings::setMaxBoards (int32 maxboards) boardnr++; } mpnr = (int32)(inputnr / 4); + + // initialize filter settings + itsChannelInfo[ch].TriggerReleased = false; + itsChannelInfo[ch].Triggered = false; + itsChannelInfo[ch].TriggerLevel = 0; + itsChannelInfo[ch].TriggerMode = 0; + itsChannelInfo[ch].FilterSelect = 0; + itsChannelInfo[ch].DetectWindow = 0; + itsChannelInfo[ch].TriggerDummy = 0; + for (int i = 0; i < 4; i++) { + itsChannelInfo[ch].Coefficient[i] = 0; + } } if (itsBoardInfo) delete itsBoardInfo; @@ -228,8 +240,8 @@ void TbbSettings::setConversionTable(int32 rcu, int32 channel) void TbbSettings::convertRcu2Ch(int32 rcunr, int32 *boardnr, int32 *channelnr) { - int32 board; - int32 channel; + int32 board; // board 0 .. 11 + int32 channel; // channel 0 .. 15 board = (int32)(rcunr / itsChannelsOnBoard); channel = itsRcu2ChTable[rcunr - (board * itsChannelsOnBoard)]; diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h index 4999d1c9d907c4615ced085bcb89899332b4259b..51230d81e78b4aa8b73894c8dbd7c6f12b28d6df 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h @@ -47,6 +47,15 @@ struct ChannelInfo int32 MpNr; uint32 StartAddr; uint32 PageSize; + // settings for the trigger system + bool TriggerReleased; + bool Triggered; + uint32 TriggerLevel; + uint32 TriggerMode; + uint32 FilterSelect; + uint32 DetectWindow; + uint32 TriggerDummy; + uint32 Coefficient[4]; }; struct BoardInfo @@ -97,6 +106,14 @@ public: int32 getChMpNr(int32 channelnr); uint32 getChStartAddr(int32 channelnr); 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); string getIfName(); string getSrcIp(int32 boardnr); @@ -109,6 +126,14 @@ public: void setChState(int32 channelnr, char state); void setChStartAddr(int32 channelnr, uint32 startaddr); 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 convertRcu2Ch(int32 rcunr, int32 *boardnr, int32 *channelnr); void convertCh2Rcu(int32 channelnr, int32 *rcunr); @@ -195,6 +220,14 @@ inline int32 TbbSettings::getChInputNr(int32 channelnr) { return (itsChannelInfo inline int32 TbbSettings::getChMpNr(int32 channelnr) { return (itsChannelInfo[channelnr].MpNr); } inline uint32 TbbSettings::getChStartAddr(int32 channelnr) { return (itsChannelInfo[channelnr].StartAddr); } 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 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); } @@ -206,6 +239,14 @@ inline void TbbSettings::setChStatus(int32 channelnr, uint32 status){ itsChannel inline void TbbSettings::setChState(int32 channelnr, char state){ itsChannelInfo[channelnr].State = state; } inline void TbbSettings::setChStartAddr(int32 channelnr, uint32 startaddr){ itsChannelInfo[channelnr].StartAddr = startaddr; } 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 functions for board information ------------ inline uint32 TbbSettings::getMemorySize(int32 boardnr) { return (itsBoardInfo[boardnr].memorySize); } diff --git a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc index fd1ce20de5880ed0e12d2f7695df24919184fa50..9b89f2ca2084801cc7324fd3ac27f14387520748 100644 --- a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.cc @@ -68,7 +68,7 @@ ErasefCmd::~ErasefCmd() // ---------------------------------------------------------------------------- bool ErasefCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_ERASE_IMAGE)||(event.signal == TP_ERASEFACK)) { + if ((event.signal == TBB_ERASE_IMAGE)||(event.signal == TP_ERASEF_ACK)) { return(true); } return(false); @@ -78,10 +78,14 @@ bool ErasefCmd::isValid(GCFEvent& event) void ErasefCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBEraseImageEvent(event); - - setBoardNr(itsTBBE->board); - itsTBBackE->status_mask = 0; + itsTBBackE->status_mask = 0; + if (TS->isBoardActive(itsTBBE->board)) { + setBoardNr(itsTBBE->board); + } else { + itsTBBackE->status_mask |= TBB_NO_BOARD ; + setDone(true); + } itsImage = itsTBBE->image; itsSector = (itsImage * FL_SECTORS_IN_PAGE); @@ -110,7 +114,7 @@ void ErasefCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask |= TBB_COMM_ERROR; } else { - itsTPackE = new TPErasefackEvent(event); + itsTPackE = new TPErasefAckEvent(event); itsBoardStatus = itsTPackE->status; if (itsBoardStatus == 0) { diff --git a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h index 899c40e0e433ad78029653ec0e1a6e60e68d0f25..76a42b3b752e56cd630a41cfb6cbd5de43fd7f3f 100644 --- a/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ErasefCmd.h @@ -61,7 +61,7 @@ namespace LOFAR { TbbSettings *TS; TPErasefEvent *itsTPE; - TPErasefackEvent *itsTPackE; + TPErasefAckEvent *itsTPackE; TBBEraseImageEvent *itsTBBE; TBBEraseImageAckEvent *itsTBBackE; diff --git a/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc b/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc index 82e66a0053955c748eb5cbd92904f74bea62a612..7f79aaf213d7ed0d489d6ea0e3f76d7ec2f9a5bc 100644 --- a/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/FreeCmd.cc @@ -38,7 +38,7 @@ FreeCmd::FreeCmd(): itsTPE = new TPFreeEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBFreeackEvent(); + itsTBBackE = new TBBFreeAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -57,7 +57,7 @@ FreeCmd::~FreeCmd() // ---------------------------------------------------------------------------- bool FreeCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_FREE)||(event.signal == TP_FREEACK)) { + if ((event.signal == TBB_FREE)||(event.signal == TP_FREE_ACK)) { return(true); } return(false); @@ -69,16 +69,16 @@ void FreeCmd::saveTbbEvent(GCFEvent& event) itsTBBE = new TBBFreeEvent(event); // convert rcu-bitmask to tbb-channelmask - int boardnr; - int channelnr; + int32 board; // board 0 .. 11 + int32 board_channel;// board_channel 0 .. 15 + int32 channel; // channel 0 .. 191 (= maxboard * max_channels_on_board) for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) { + TS->convertRcu2Ch(rcunr,&board,&board_channel); + channel = (board * TS->nrChannelsOnBoard()) + board_channel; if(itsTBBE->rcu_mask.test(rcunr)) { - TS->convertRcu2Ch(rcunr,&boardnr,&channelnr); - itsChannelMask[boardnr] |= (1 << channelnr); - TS->setChSelected(((boardnr * 16) + channelnr),true); + itsChannelMask[board] |= (1 << board_channel); + TS->setChSelected(channel,true); } - //else - // TS->setChSelected(((boardnr * 16) + channelnr),false); } uint32 boardmask = 0; @@ -99,7 +99,7 @@ void FreeCmd::saveTbbEvent(GCFEvent& event) setBoardMask(boardmask); // select firt channel to handle - nextChannelNr(); + nextSelectedChannelNr(); // initialize TP send frame itsTPE->opcode = TPFREE; @@ -148,7 +148,7 @@ void FreeCmd::saveTpAckEvent(GCFEvent& event) itsRcuStatus |= TBB_TIMEOUT_ETH; } else { - itsTPackE = new TPFreeackEvent(event); + itsTPackE = new TPFreeAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsRcuStatus |= (1 << (16 + (itsTPackE->status & 0x0F))); @@ -182,8 +182,10 @@ void FreeCmd::saveTpAckEvent(GCFEvent& event) (getBoardNr() * 16),((getBoardNr() + 1) * 16), itsTBBackE->status_mask[getBoardNr()],itsRcuStatus)); } itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus; - - nextChannelNr(); + if (itsTPE->channel == 0xFFFFFFFF) { + setChannelNr((getBoardNr() * 16) + 15); + } + nextSelectedChannelNr(); } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/FreeCmd.h b/MAC/APL/PIC/TBBDriver/src/FreeCmd.h index 39237391cceac75622c91d47dda6f3b93ee1c044..97866072548b9066543782479b9612067b7309b8 100644 --- a/MAC/APL/PIC/TBBDriver/src/FreeCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/FreeCmd.h @@ -66,9 +66,9 @@ namespace LOFAR { uint32 itsRcuStatus; TPFreeEvent *itsTPE; - TPFreeackEvent *itsTPackE; + TPFreeAckEvent *itsTPackE; TBBFreeEvent *itsTBBE; - TBBFreeackEvent *itsTBBackE; + TBBFreeAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc index 62ff78f2641f11744bfbcd05949c14382dc76b40..93e9308c1d70b6a91569ee1cc3b5aec4cc546794 100644 --- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc @@ -70,7 +70,7 @@ ImageInfoCmd::~ImageInfoCmd() // ---------------------------------------------------------------------------- bool ImageInfoCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_IMAGE_INFO)||(event.signal == TP_READFACK)) { + if ((event.signal == TBB_IMAGE_INFO)||(event.signal == TP_READF_ACK)) { return(true); } return(false); @@ -111,7 +111,7 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_COMM_ERROR; setDone(true); } else { - itsTPackE = new TPReadfackEvent(event); + itsTPackE = new TPReadfAckEvent(event); if (itsTPackE->status == 0) { itsTBBackE->image_version[itsImage]= itsTPackE->data[0]; diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h index 2a98972dfc49b9d939db39e898b7a0c913b44d87..65869760551bea543a70b11ebebc8783bc80e2cf 100644 --- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.h @@ -61,7 +61,7 @@ namespace LOFAR { TbbSettings *TS; TPReadfEvent *itsTPE; - TPReadfackEvent *itsTPackE; + TPReadfAckEvent *itsTPackE; TBBImageInfoEvent *itsTBBE; TBBImageInfoAckEvent *itsTBBackE; diff --git a/MAC/APL/PIC/TBBDriver/src/Makefile.am b/MAC/APL/PIC/TBBDriver/src/Makefile.am index 19eaa38c010d6b0148a056e0c62b0301ec999ea7..343844b3ba9d6772ee8a1adfe82c5c34f4418181 100644 --- a/MAC/APL/PIC/TBBDriver/src/Makefile.am +++ b/MAC/APL/PIC/TBBDriver/src/Makefile.am @@ -60,7 +60,11 @@ libtbbdriver_la_SOURCES = \ FreeCmd.cc \ RecordCmd.cc \ StopCmd.cc \ - TrigclrCmd.cc \ + TrigReleaseCmd.cc \ + TrigGenCmd.cc\ + TrigSetupCmd.cc\ + TrigCoefCmd.cc\ + TrigInfoCmd.cc\ ReadCmd.cc \ UdpCmd.cc \ PageperiodCmd.cc \ @@ -89,7 +93,11 @@ noinst_HEADERS = \ FreeCmd.h \ RecordCmd.h \ StopCmd.h \ - TrigclrCmd.h \ + TrigReleaseCmd.h \ + TrigGenCmd.h\ + TrigSetupCmd.h\ + TrigCoefCmd.h\ + TrigInfoCmd.h\ ReadCmd.h \ UdpCmd.h \ PageperiodCmd.h \ diff --git a/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc b/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc index 4f7c32fb427b12b687a37a152eb043f7b1f6e8be..80a7ddc012683e44723cd026e97122fead7e0d2a 100644 --- a/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc +++ b/MAC/APL/PIC/TBBDriver/src/MsgHandler.cc @@ -31,6 +31,7 @@ namespace LOFAR { MsgHandler::MsgHandler() { + TS = TbbSettings::instance(); itsTriggerE = new TBBTriggerEvent(); itsErrorE = new TBBErrorEvent(); itsBoardchangeE = new TBBBoardchangeEvent(); @@ -61,17 +62,21 @@ void MsgHandler::removeClient(GCFPortInterface& port) } //----------------------------------------------------------------------------- -void MsgHandler::sendTrigger(GCFEvent& event) +void MsgHandler::sendTrigger(GCFEvent& event, int boardnr) { TPTriggerEvent *TPE; TPE = new TPTriggerEvent(event); - - itsTriggerE->channel = TPE->channel; - itsTriggerE->time = TPE->time; - itsTriggerE->sample = TPE->sample; - + int channel = TPE->trigger.channel + (boardnr * TS->maxBoards()); + TS->convertCh2Rcu(channel, &itsTriggerE->rcu); + itsTriggerE->sequence_nr = TPE->trigger.sequence_nr; + itsTriggerE->time = TPE->trigger.time; + itsTriggerE->sample_nr = TPE->trigger.sample_nr; + itsTriggerE->trigger_sum = TPE->trigger.sum; + itsTriggerE->trigger_samples = TPE->trigger.samples; + itsTriggerE->peak_value = TPE->trigger.peak; + sendMessage(*itsTriggerE); - + TS->setChTriggered(channel, true); delete TPE; } diff --git a/MAC/APL/PIC/TBBDriver/src/MsgHandler.h b/MAC/APL/PIC/TBBDriver/src/MsgHandler.h index e1ba7daa74e540346cc2fe12eee8f30b38b9e1af..0643f1793f18ce89d0681ebc0435368e03b51797 100644 --- a/MAC/APL/PIC/TBBDriver/src/MsgHandler.h +++ b/MAC/APL/PIC/TBBDriver/src/MsgHandler.h @@ -33,6 +33,7 @@ #include <APL/TBB_Protocol/TBB_Protocol.ph> #include "TP_Protocol.ph" +#include "DriverSettings.h" namespace LOFAR { namespace TBB { @@ -51,7 +52,7 @@ namespace LOFAR { void removeClient(GCFPortInterface& port); - void sendTrigger(GCFEvent& event); + void sendTrigger(GCFEvent& event, int boardnr); void sendError(GCFEvent& event); @@ -62,6 +63,7 @@ namespace LOFAR { protected: private: + TbbSettings *TS; std::set<GCFPortInterface*> itsClientMsgList; // list of clients witch receive messages diff --git a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc index b5a61474827d9e816cf7a7b47a6b45464d5a37c8..03331fa22971ecf501a3b3733b25fbe844d01e02 100644 --- a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.cc @@ -38,7 +38,7 @@ PageperiodCmd::PageperiodCmd(): itsTPE = new TPPageperiodEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBPageperiodackEvent(); + itsTBBackE = new TBBPageperiodAckEvent(); setWaitAck(true); } @@ -52,7 +52,7 @@ PageperiodCmd::~PageperiodCmd() // ---------------------------------------------------------------------------- bool PageperiodCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_PAGEPERIOD)||(event.signal == TP_PAGEPERIODACK)) { + if ((event.signal == TBB_PAGEPERIOD)||(event.signal == TP_PAGEPERIOD_ACK)) { return(true); } return(false); @@ -94,7 +94,7 @@ void PageperiodCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_COMM_ERROR; } else { - itsTPackE = new TPPageperiodackEvent(event); + itsTPackE = new TPPageperiodAckEvent(event); itsBoardStatus = itsTPackE->status; itsTBBackE->pageperiod = itsTPackE->pageperiod; diff --git a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h index 7307f6ea3c0606743ab25f473ffe52c9ef8a3d8e..e195b45d239e6ee747416010f7fb3cf9eb8f0c05 100644 --- a/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/PageperiodCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPPageperiodEvent *itsTPE; - TPPageperiodackEvent *itsTPackE; + TPPageperiodAckEvent *itsTPackE; TBBPageperiodEvent *itsTBBE; - TBBPageperiodackEvent *itsTBBackE; + TBBPageperiodAckEvent *itsTBBackE; // variables holding data from tp cmd uint32 itsBoardStatus; diff --git a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc index b2d753efbbda68d8398f59d52987022d7b926482..e72fde040d6b8e6fa601378354f7e8c626078d09 100644 --- a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc +++ b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc @@ -65,56 +65,72 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port) // // If no error, lookup buf.opcode number, else assign ACK_ERROR buf.event.signal number // + // for all commands opcode(4) + status(4) switch(buf.opcode) { - case TPALLOC: - buf.event.signal = TP_ALLOCACK; + buf.event.signal = TP_ALLOC_ACK; buf.event.length = 8; break; case TPFREE: - buf.event.signal = TP_FREEACK; + buf.event.signal = TP_FREE_ACK; buf.event.length = 8; break; case TPRECORD: - buf.event.signal = TP_RECORDACK; + buf.event.signal = TP_RECORD_ACK; buf.event.length = 8; break; case TPSTOP: - buf.event.signal = TP_STOPACK; + buf.event.signal = TP_STOP_ACK; buf.event.length = 8; break; case TPTRIGGER: buf.event.signal = TP_TRIGGER; - buf.event.length = 20; + buf.event.length = 44; + break; + case TPTRIGRELEASE: + buf.event.signal = TP_TRIG_RELEASE_ACK; + buf.event.length = 8; + break; + case TPTRIGGENERATE: + buf.event.signal = TP_TRIG_GENERATE_ACK; + buf.event.length = 8; break; - case TPTRIGCLR: - buf.event.signal = TP_TRIGCLRACK; + case TPTRIGSETUP: + buf.event.signal = TP_TRIG_SETUP_ACK; buf.event.length = 8; break; + case TPTRIGCOEF: + buf.event.signal = TP_TRIG_COEF_ACK; + buf.event.length = 8; + break; + case TPTRIGINFO: + buf.event.signal = TP_TRIG_INFO_ACK; + buf.event.length = 40; + break; case TPREAD: - buf.event.signal = TP_READACK; + buf.event.signal = TP_READ_ACK; buf.event.length = 8; break; case TPUDP: - buf.event.signal = TP_UDPACK; + buf.event.signal = TP_UDP_ACK; buf.event.length = 8; break; case TPPAGEPERIOD: - buf.event.signal = TP_PAGEPERIODACK; + buf.event.signal = TP_PAGEPERIOD_ACK; buf.event.length = 12; break; case TPVERSION: - buf.event.signal = TP_VERSIONACK; + buf.event.signal = TP_VERSION_ACK; buf.event.length = 40; break; case TPSIZE: - buf.event.signal = TP_SIZEACK; + buf.event.signal = TP_SIZE_ACK; buf.event.length = 12; break; case TPSTATUS: - buf.event.signal = TP_STATUSACK; + buf.event.signal = TP_STATUS_ACK; buf.event.length = 44; break; case TPERROR: @@ -122,51 +138,51 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port) buf.event.length = 12; break; case TPCLEAR: - buf.event.signal = TP_CLEARACK; + buf.event.signal = TP_CLEAR_ACK; buf.event.length = 8; break; case TPRESET: - buf.event.signal = TP_RESETACK; + buf.event.signal = TP_RESET_ACK; buf.event.length = 8; break; case TPCONFIG: - buf.event.signal = TP_CONFIGACK; + buf.event.signal = TP_CONFIG_ACK; buf.event.length = 8; break; case TPERASEF: - buf.event.signal = TP_ERASEFACK; + buf.event.signal = TP_ERASEF_ACK; buf.event.length = 8; break; case TPREADF: - buf.event.signal = TP_READFACK; + buf.event.signal = TP_READF_ACK; buf.event.length = 1032; break; case TPWRITEF: - buf.event.signal = TP_WRITEFACK; + buf.event.signal = TP_WRITEF_ACK; buf.event.length = 8; break; case TPREADW: - buf.event.signal = TP_READWACK; + buf.event.signal = TP_READW_ACK; buf.event.length = 16; break; case TPWRITEW: - buf.event.signal = TP_WRITEWACK; + buf.event.signal = TP_WRITEW_ACK; buf.event.length = 8; break; case TPREADR: - buf.event.signal = TP_READRACK; + buf.event.signal = TP_READR_ACK; buf.event.length = 2056; break; case TPWRITER: - buf.event.signal = TP_WRITERACK; + buf.event.signal = TP_WRITER_ACK; buf.event.length = 8; break; case TPREADX: - buf.event.signal = TP_READXACK; + buf.event.signal = TP_READX_ACK; buf.event.length = 1032; break; case TPALIVE: - buf.event.signal = TP_ALIVEACK; + buf.event.signal = TP_ALIVE_ACK; buf.event.length = 12; break; diff --git a/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc index 4f53da285b8ffee05f72235c07fe0b3cf89d3ef7..c1c1140a5d957e5d4cda618b8f03cc67e6573310 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ReadCmd.cc @@ -39,7 +39,7 @@ ReadCmd::ReadCmd() itsTPE = new TPReadEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBReadackEvent(); + itsTBBackE = new TBBReadAckEvent(); itsTBBackE->status_mask = 0; setWaitAck(true); @@ -55,7 +55,7 @@ ReadCmd::~ReadCmd() // ---------------------------------------------------------------------------- bool ReadCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_READ)||(event.signal == TP_READACK)) { + if ((event.signal == TBB_READ)||(event.signal == TP_READ_ACK)) { return(true); } return(false); @@ -71,6 +71,11 @@ void ReadCmd::saveTbbEvent(GCFEvent& event) TS->convertRcu2Ch(itsTBBE->channel,&boardnr,&channelnr); setChannelNr(channelnr); + + if (!TS->isBoardActive(getBoardNr())) { + itsTBBackE->status_mask |= TBB_NO_BOARD ; + setDone(true); + } // initialize TP send frame itsTPE->opcode = TPREAD; @@ -98,7 +103,7 @@ void ReadCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask |= TBB_COMM_ERROR; } else { - itsTPackE = new TPReadackEvent(event); + itsTPackE = new TPReadAckEvent(event); LOG_DEBUG_STR(formatString("Received ReadAck from boardnr[%d]", getBoardNr())); delete itsTPackE; diff --git a/MAC/APL/PIC/TBBDriver/src/ReadCmd.h b/MAC/APL/PIC/TBBDriver/src/ReadCmd.h index 7c9fe6def0a82067c77cfd2b918980bffc443692..797a161c405e877d456ee37426a7321dc48b018d 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ReadCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPReadEvent *itsTPE; - TPReadackEvent *itsTPackE; + TPReadAckEvent *itsTPackE; TBBReadEvent *itsTBBE; - TBBReadackEvent *itsTBBackE; + TBBReadAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc index 2c235cb47b389d413a7f738b66d46634bab8d91b..38f6f1f4c25b8e1c199dcabb250aa1a7994e47a2 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc @@ -34,7 +34,7 @@ using namespace TBB; static const int FL_SIZE = 64 * 1024 *1024; // 64 MB in bytes static const int FL_N_PAGES = 32; // 32 pages in flash static const int FL_N_SECTORS = 512; // 512 sectors in flash -static const int FL_N_BLOCKS = 65536; // 65336 blocks in flash +static const int FL_N_BLOCKS = 65536; // 65536 blocks in flash static const int FL_PAGE_SIZE = FL_SIZE / FL_N_PAGES; // 2.097.152 bytes static const int FL_SECTOR_SIZE = FL_SIZE / FL_N_SECTORS; // 131.072 bytes @@ -70,7 +70,7 @@ ReadfCmd::~ReadfCmd() // ---------------------------------------------------------------------------- bool ReadfCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_READ_IMAGE)||(event.signal == TP_READFACK)) { + if ((event.signal == TBB_READ_IMAGE)||(event.signal == TP_READF_ACK)) { return(true); } return(false); @@ -81,9 +81,13 @@ void ReadfCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBReadImageEvent(event); - setBoardNr(itsTBBE->board); - itsTBBackE->status_mask = 0; + if (TS->isBoardActive(itsTBBE->board)) { + setBoardNr(itsTBBE->board); + } else { + itsTBBackE->status_mask |= TBB_NO_BOARD ; + setDone(true); + } itsImage = itsTBBE->image; itsBlock = (itsImage * FL_BLOCKS_IN_PAGE); @@ -101,7 +105,7 @@ void ReadfCmd::sendTpEvent() { itsTPE->addr = static_cast<uint32>(itsBlock * FL_BLOCK_SIZE); TS->boardPort(getBoardNr()).send(*itsTPE); - TS->boardPort(getBoardNr()).setTimer(TS->timeout()); + TS->boardPort(getBoardNr()).setTimer(0.2); } // ---------------------------------------------------------------------------- @@ -112,7 +116,7 @@ void ReadfCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_COMM_ERROR; setDone(true); } else { - itsTPackE = new TPReadfackEvent(event); + itsTPackE = new TPReadfAckEvent(event); itsBoardStatus = itsTPackE->status; @@ -142,7 +146,7 @@ void ReadfCmd::saveTpAckEvent(GCFEvent& event) } itsBlock++; - if (itsBlock >= ((itsImage + 1) * FL_BLOCKS_IN_PAGE)) { + if (itsBlock == ((itsImage + 1) * FL_BLOCKS_IN_PAGE)) { setDone(true); } } else { diff --git a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h index 5740e86e7a22747d274537c00730ce312c570396..1563a9d5ed5fcf868a533c575b469c31aed7f662 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.h @@ -61,7 +61,7 @@ namespace LOFAR { TbbSettings *TS; TPReadfEvent *itsTPE; - TPReadfackEvent *itsTPackE; + TPReadfAckEvent *itsTPackE; TBBReadImageEvent *itsTBBE; TBBReadImageAckEvent *itsTBBackE; FILE *itsFile; diff --git a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc index e37a5e7f8dcdfdbe47f81bd548371becebc30a4b..f98ab62add456975d333fecd2553355e7b181f82 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.cc @@ -38,7 +38,9 @@ ReadwCmd::ReadwCmd(): itsTPE = new TPReadwEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBReadwackEvent(); + itsTBBackE = new TBBReadwAckEvent(); + + itsTBBackE->status_mask = 0; setWaitAck(true); } @@ -52,7 +54,7 @@ ReadwCmd::~ReadwCmd() // ---------------------------------------------------------------------------- bool ReadwCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_READW)||(event.signal == TP_READWACK)) { + if ((event.signal == TBB_READW)||(event.signal == TP_READW_ACK)) { return(true); } return(false); @@ -63,9 +65,12 @@ void ReadwCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBReadwEvent(event); - setBoardNr(itsTBBE->board); - - itsTBBackE->status_mask = 0; + if (TS->isBoardActive(itsTBBE->board)) { + setBoardNr(itsTBBE->board); + } else { + itsTBBackE->status_mask |= TBB_NO_BOARD ; + setDone(true); + } // initialize TP send frame itsTPE->opcode = TPREADW; @@ -90,7 +95,7 @@ void ReadwCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_COMM_ERROR; } else { - itsTPackE = new TPReadwackEvent(event); + itsTPackE = new TPReadwAckEvent(event); itsBoardStatus = itsTPackE->status; itsTBBackE->wordlo = itsTPackE->wordlo; diff --git a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h index 883873c0131b8b3b1f184d8ad94a660224366860..4e918c712f24d1235781518c173583db714bf840 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ReadwCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPReadwEvent *itsTPE; - TPReadwackEvent *itsTPackE; + TPReadwAckEvent *itsTPackE; TBBReadwEvent *itsTBBE; - TBBReadwackEvent *itsTBBackE; + TBBReadwAckEvent *itsTBBackE; // variables holding data from tp cmd uint32 itsBoardStatus; diff --git a/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc b/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc index c440aaa1c2b52edb440ff86117ffab3c709c250d..1930c8927280b693e13ed6cb376e7c8788919b77 100644 --- a/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/RecordCmd.cc @@ -38,7 +38,7 @@ RecordCmd::RecordCmd(): itsTPE = new TPRecordEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBRecordackEvent(); + itsTBBackE = new TBBRecordAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -57,7 +57,7 @@ RecordCmd::~RecordCmd() // ---------------------------------------------------------------------------- bool RecordCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_RECORD)||(event.signal == TP_RECORDACK)) { + if ((event.signal == TBB_RECORD)||(event.signal == TP_RECORD_ACK)) { return(true); } return(false); @@ -67,14 +67,23 @@ bool RecordCmd::isValid(GCFEvent& event) void RecordCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBRecordEvent(event); + // convert rcu-bitmask to tbb-channelmask - int boardnr; - int channelnr; + int32 board; // board 0 .. 11 + int32 board_channel;// board_channel 0 .. 15 + int32 channel; // channel 0 .. 191 (= maxboard * max_channels_on_board) for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) { - if(itsTBBE->rcu_mask.test(rcunr)) { - TS->convertRcu2Ch(rcunr,&boardnr,&channelnr); - itsChannelMask[boardnr] |= (1 << channelnr); + TS->convertRcu2Ch(rcunr,&board,&board_channel); + channel = (board * TS->nrChannelsOnBoard()) + board_channel; + if (itsTBBE->rcu_mask.test(rcunr)) { + if ((TS->getChState(channel) == 'A') || (TS->getChState(channel) == 'S')) { + itsChannelMask[board] |= (1 << board_channel); + TS->setChSelected(channel,true); + + } else { + TS->setChStatus(channel,(uint16)(TBB_RCU_NOT_ALLOCATED >> 16)); + } } } @@ -97,7 +106,7 @@ void RecordCmd::saveTbbEvent(GCFEvent& event) setBoardMask(boardmask); // select firt channel to handle - nextChannelNr(); + nextSelectedChannelNr(); // initialize TP send frame itsTPE->opcode = TPRECORD; @@ -109,18 +118,12 @@ void RecordCmd::saveTbbEvent(GCFEvent& event) // ---------------------------------------------------------------------------- void RecordCmd::sendTpEvent() { - itsRcuStatus = 0; - itsTPE->channel = TS->getChInputNr(getChannelNr()); + itsRcuStatus = 0; - if ((TS->getChState(getChannelNr()) != 'A') && (TS->getChState(getChannelNr()) != 'S')) - itsRcuStatus |= TBB_RCU_NOT_ALLOCATED; - - if (itsTBBackE->status_mask[getBoardNr()] == 0) { - if (itsRcuStatus == 0) { - TS->boardPort(getBoardNr()).send(*itsTPE); - LOG_DEBUG_STR(formatString("Sending RecordCmd to boardnr[%d], channel[%08X]", getBoardNr(), itsTPE->channel)); - } + if ((itsTBBackE->status_mask[getBoardNr()] == 0) && (itsRcuStatus == 0)) { + TS->boardPort(getBoardNr()).send(*itsTPE); + LOG_DEBUG_STR(formatString("Sending RecordCmd to boardnr[%d], channel[%08X]", getBoardNr(), itsTPE->channel)); } TS->boardPort(getBoardNr()).setTimer(TS->timeout()); } @@ -132,9 +135,8 @@ void RecordCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask[getBoardNr()] |= TBB_RCU_COMM_ERROR; itsRcuStatus |= TBB_TIMEOUT_ETH; - } - else { - itsTPackE = new TPRecordackEvent(event); + } else { + itsTPackE = new TPRecordAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsRcuStatus |= (1 << (16 + (itsTPackE->status & 0x0F))); @@ -152,11 +154,11 @@ void RecordCmd::saveTpAckEvent(GCFEvent& event) if (itsRcuStatus || itsTBBackE->status_mask[getBoardNr()]) { int32 rcu; TS->convertCh2Rcu(getChannelNr(),&rcu); - LOG_INFO_STR(formatString("ERROR RecordCmd Rcu[%d], DriverStatus[0x%x], RcuStatus[0x%x]", + LOG_INFO_STR(formatString("ERROR RecordCmd Rcu[%d], DriverStatus[0x%08x], RcuStatus[0x%08x]", rcu, itsTBBackE->status_mask[getBoardNr()],itsRcuStatus)); } itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus; - nextChannelNr(); + nextSelectedChannelNr(); } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/RecordCmd.h b/MAC/APL/PIC/TBBDriver/src/RecordCmd.h index 97dd914c46afd56469661bda9189423186961c90..9c01bbc2b9e6ac1d47c24945df8edb17a5bf2f7c 100644 --- a/MAC/APL/PIC/TBBDriver/src/RecordCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/RecordCmd.h @@ -64,9 +64,9 @@ namespace LOFAR { uint32 itsRcuStatus; TPRecordEvent *itsTPE; - TPRecordackEvent *itsTPackE; + TPRecordAckEvent *itsTPackE; TBBRecordEvent *itsTBBE; - TBBRecordackEvent *itsTBBackE; + TBBRecordAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc index 2a1b22b6e311dc4da0fe185e5e77f32b87ab3bf4..ce01155a95227f855c22fb0c1539bc7b514c02a5 100644 --- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.cc @@ -37,7 +37,7 @@ ResetCmd::ResetCmd() itsTPE = new TPResetEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBResetackEvent(); + itsTBBackE = new TBBResetAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -55,7 +55,7 @@ ResetCmd::~ResetCmd() // ---------------------------------------------------------------------------- bool ResetCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_RESET)||(event.signal == TP_RESETACK)) { + if ((event.signal == TBB_RESET)||(event.signal == TP_RESET_ACK)) { return(true); } return(false); @@ -101,7 +101,7 @@ void ResetCmd::saveTpAckEvent(GCFEvent& event) ; } else { - itsTPackE = new TPResetackEvent(event); + itsTPackE = new TPResetAckEvent(event); delete itsTPackE; } diff --git a/MAC/APL/PIC/TBBDriver/src/ResetCmd.h b/MAC/APL/PIC/TBBDriver/src/ResetCmd.h index b25c4f183d364c051c74afb6d86ac490c67ca14c..9e5d72d0941217c6f0951dc578ef4df41ce0126f 100644 --- a/MAC/APL/PIC/TBBDriver/src/ResetCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/ResetCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPResetEvent *itsTPE; - TPResetackEvent *itsTPackE; + TPResetAckEvent *itsTPackE; TBBResetEvent *itsTBBE; - TBBResetackEvent *itsTBBackE; + TBBResetAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc index ef99c0fbca6fa975465c2bccc7e2fac91b0ad8af..60a389f5a8c277e5fe9b998fd6f88f5ec1acca4a 100644 --- a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc @@ -37,7 +37,7 @@ SizeCmd::SizeCmd() itsTPE = new TPSizeEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBSizeackEvent(); + itsTBBackE = new TBBSizeAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -55,7 +55,7 @@ SizeCmd::~SizeCmd() // ---------------------------------------------------------------------------- bool SizeCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_SIZE)||(event.signal == TP_SIZEACK)) { + if ((event.signal == TBB_SIZE)||(event.signal == TP_SIZE_ACK)) { return(true); } return(false); @@ -97,7 +97,7 @@ void SizeCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR; } else { - itsTPackE = new TPSizeackEvent(event); + itsTPackE = new TPSizeAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F))); diff --git a/MAC/APL/PIC/TBBDriver/src/SizeCmd.h b/MAC/APL/PIC/TBBDriver/src/SizeCmd.h index 26bb995ef931502638b0ffe9b10f8b92525833f7..72121c95e6bbf9028ed6d21dca4883c95f0ea1f5 100644 --- a/MAC/APL/PIC/TBBDriver/src/SizeCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/SizeCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPSizeEvent *itsTPE; - TPSizeackEvent *itsTPackE; + TPSizeAckEvent *itsTPackE; TBBSizeEvent *itsTBBE; - TBBSizeackEvent *itsTBBackE; + TBBSizeAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc index 08c2c553712381af8a90f25eef6eccf289208955..3b01d1dac3a9d0f8053e3f74f6860a3a94c199f4 100644 --- a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc @@ -36,7 +36,7 @@ StatusCmd::StatusCmd() itsTPE = new TPStatusEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBStatusackEvent(); + itsTBBackE = new TBBStatusAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -54,7 +54,7 @@ StatusCmd::~StatusCmd() // ---------------------------------------------------------------------------- bool StatusCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_STATUS)||(event.signal == TP_STATUSACK)) { + if ((event.signal == TBB_STATUS)||(event.signal == TP_STATUS_ACK)) { return(true); } return(false); @@ -96,7 +96,7 @@ void StatusCmd::saveTpAckEvent(GCFEvent& event) if (event.signal == F_TIMER) { itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR; } else { - itsTPackE = new TPStatusackEvent(event); + itsTPackE = new TPStatusAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F))); diff --git a/MAC/APL/PIC/TBBDriver/src/StatusCmd.h b/MAC/APL/PIC/TBBDriver/src/StatusCmd.h index c96b9dc7b94a6b22c4bfdebee7d87ea779234333..cb24443058ef43fdb0a2aa978dc423ec3d39a92e 100644 --- a/MAC/APL/PIC/TBBDriver/src/StatusCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/StatusCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPStatusEvent *itsTPE; - TPStatusackEvent *itsTPackE; + TPStatusAckEvent *itsTPackE; TBBStatusEvent *itsTBBE; - TBBStatusackEvent *itsTBBackE; + TBBStatusAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/StopCmd.cc b/MAC/APL/PIC/TBBDriver/src/StopCmd.cc index 571b29d92e91e03187ef6e6c82236a3a64794f5c..6519b16a049597d17a6ffd7b55689ea0a533db41 100644 --- a/MAC/APL/PIC/TBBDriver/src/StopCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/StopCmd.cc @@ -38,7 +38,7 @@ StopCmd::StopCmd(): itsTPE = new TPStopEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBStopackEvent(); + itsTBBackE = new TBBStopAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -57,7 +57,7 @@ StopCmd::~StopCmd() // ---------------------------------------------------------------------------- bool StopCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_STOP)||(event.signal == TP_STOPACK)) { + if ((event.signal == TBB_STOP)||(event.signal == TP_STOP_ACK)) { return(true); } return(false); @@ -67,14 +67,22 @@ bool StopCmd::isValid(GCFEvent& event) void StopCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBStopEvent(event); + // convert rcu-bitmask to tbb-channelmask - int boardnr; - int channelnr; + int32 board; // board 0 .. 11 + int32 board_channel;// board_channel 0 .. 15 + int32 channel; // channel 0 .. 191 (= maxboard * max_channels_on_board) for (int rcunr = 0; rcunr < TS->maxChannels(); rcunr++) { - if(itsTBBE->rcu_mask.test(rcunr)) { - TS->convertRcu2Ch(rcunr,&boardnr,&channelnr); - itsChannelMask[boardnr] |= (1 << channelnr); + TS->convertRcu2Ch(rcunr,&board,&board_channel); + channel = (board * TS->nrChannelsOnBoard()) + board_channel; + if(itsTBBE->rcu_mask.test(rcunr)) { + if (TS->getChState(channel) == 'R') { + itsChannelMask[board] |= (1 << board_channel); + TS->setChSelected(channel,true); + } else { + TS->setChStatus(channel,(uint16)(TBB_RCU_NOT_RECORDING >> 16)); + } } } @@ -99,7 +107,7 @@ void StopCmd::saveTbbEvent(GCFEvent& event) setBoardMask(boardmask); // select firt channel to handle - nextChannelNr(); + nextSelectedChannelNr(); // initialize TP send frame itsTPE->opcode = TPSTOP; @@ -111,13 +119,8 @@ void StopCmd::saveTbbEvent(GCFEvent& event) // ---------------------------------------------------------------------------- void StopCmd::sendTpEvent() { - itsRcuStatus = 0; - itsTPE->channel = TS->getChInputNr(getChannelNr()); - - if (TS->getChState(getChannelNr()) != 'R') { - itsRcuStatus |= TBB_RCU_NOT_RECORDING; - } + itsRcuStatus = 0; if ((itsTBBackE->status_mask[getBoardNr()] == 0) && (itsRcuStatus == 0)) { TS->boardPort(getBoardNr()).send(*itsTPE); @@ -135,7 +138,7 @@ void StopCmd::saveTpAckEvent(GCFEvent& event) itsRcuStatus |= TBB_TIMEOUT_ETH; } else { - itsTPackE = new TPStopackEvent(event); + itsTPackE = new TPStopAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsRcuStatus |= (1 << (16 + (itsTPackE->status & 0x0F))); @@ -158,7 +161,7 @@ void StopCmd::saveTpAckEvent(GCFEvent& event) rcu, itsTBBackE->status_mask[getBoardNr()],itsRcuStatus)); } itsTBBackE->status_mask[getBoardNr()] |= itsRcuStatus; - nextChannelNr(); + nextSelectedChannelNr(); } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/StopCmd.h b/MAC/APL/PIC/TBBDriver/src/StopCmd.h index daeed824935ffadad46367c0a098c1aae142c6af..157e0f8d298deacb6138631b5195222f345374a3 100644 --- a/MAC/APL/PIC/TBBDriver/src/StopCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/StopCmd.h @@ -64,9 +64,9 @@ namespace LOFAR { uint32 itsRcuStatus; TPStopEvent *itsTPE; - TPStopackEvent *itsTPackE; + TPStopAckEvent *itsTPackE; TBBStopEvent *itsTBBE; - TBBStopackEvent *itsTBBackE; + TBBStopAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc index f5ee675f8210e2755ab39571d9350237e5c06675..0b1835504afc0ca623b49c436ba5c10dd70ed1f4 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc @@ -36,7 +36,11 @@ #include "FreeCmd.h" #include "RecordCmd.h" #include "StopCmd.h" -#include "TrigclrCmd.h" +#include "TrigReleaseCmd.h" +#include "TrigGenCmd.h" +#include "TrigSetupCmd.h" +#include "TrigCoefCmd.h" +#include "TrigInfoCmd.h" #include "ReadCmd.h" #include "UdpCmd.h" #include "PageperiodCmd.h" @@ -120,9 +124,8 @@ TBBDriver::TBBDriver(string name) TS->getTbbSettings(); cmd = 0; - itsActiveBoards = 0x00000000; + itsActiveBoards = 0x10000000; itsAliveCheck = false; - itsSizeCheck = false; itsActiveBoardsChange = false; itsResetCount = 0; @@ -178,11 +181,6 @@ TBBDriver::TBBDriver(string name) itsAlive = new TPAliveEvent(); itsAlive->opcode = TPALIVE; itsAlive->status = 0; - - itsSize = new TPSizeEvent(); - itsSize->opcode = TPSIZE; - itsSize->status = 0; - } //----------------------------------------------------------------------------- @@ -191,7 +189,6 @@ TBBDriver::~TBBDriver() delete cmdhandler; delete msghandler; delete itsAlive; - delete itsSize; } //----------------------------------------------------------------------------- @@ -213,6 +210,7 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port) LOG_INFO_STR(formatString("CONNECTED: port '%s'", port.getName().c_str())); if (isEnabled() && !itsAcceptor.isConnected()) { + // free all inputs on all boards TPFreeEvent free; free.opcode = TPFREE; @@ -221,7 +219,8 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port) for (int32 bnr = 0; bnr < TS->maxBoards(); bnr++) { itsBoard[bnr].send(free); LOG_DEBUG(formatString("FREE -1 is send to port '%s'", itsBoard[bnr].getName().c_str())); - } + } + // // clear all boards(FPGA register are set to 0 and firmware is maintained) // TPClearEvent clear; // clear.opcode = TPCLEAR; @@ -270,9 +269,10 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) if (!itsTbbQueue->empty()) { LOG_DEBUG_STR("The queue is NOT empty"); - GCFEvent e(itsTbbQueue->front().signal); - SetTbbCommand(e.signal); - status = cmdhandler->dispatch(e,*itsTbbQueue->front().port); + GCFEvent event; + memcpy(&event, itsTbbQueue->front().event, itsTbbQueue->front().length); + SetTbbCommand(event.signal); + status = cmdhandler->dispatch(event,*itsTbbQueue->front().port); itsTbbQueue->pop_front(); TRAN(TBBDriver::busy_state); @@ -317,15 +317,15 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) } } break; - case TBB_GETCONFIG: { - TBBGetconfigackEvent ack; + case TBB_GET_CONFIG: { + TBBGetConfigAckEvent ack; ack.max_boards = TS->maxBoards(); ack.active_boards_mask = TS->activeBoardsMask(); port.send(ack); } break; - case TBB_RCUINFO: { - TBBRcuinfoackEvent ack; + case TBB_RCU_INFO: { + TBBRcuInfoAckEvent ack; int rcu; for (int32 ch = 0; ch < TS->maxChannels(); ch++) { rcu = TS->getChRcuNr(ch); @@ -345,14 +345,24 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) case TBB_SUBSCRIBE: { msghandler->addClient(port) ; + TBBSubscribeAckEvent subscribeack; + port.send(subscribeack); + } break; case TBB_UNSUBSCRIBE: { msghandler->removeClient(port); + TBBUnsubscribeAckEvent unsubscribeack; + port.send(unsubscribeack); } break; case TP_TRIGGER: { - msghandler->sendTrigger(event); + for (int boardnr = 0; boardnr < TS->maxBoards(); boardnr++) { + if (&port == &TS->boardPort(boardnr)) { + msghandler->sendTrigger(event,boardnr); + break; + } + } } break; case TP_ERROR: { @@ -381,7 +391,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) { GCFEvent::TResult status = GCFEvent::HANDLED; - //LOG_INFO_STR(formatString("event.signal = [%d]",event.signal)); + LOG_DEBUG_STR(formatString("busy_state signal = [%d]",event.signal)); switch(event.signal) { case F_INIT: { } break; @@ -397,7 +407,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) case F_TIMER: { if (itsAliveCheck) { - if (CheckAlive(event, port)) + if (CheckAlive(event, port)) // if true, then all boards are checked TRAN(TBBDriver::idle_state); } if (&port != &itsAcceptor) { @@ -406,7 +416,6 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) } break; case F_DISCONNECTED: { - LOG_DEBUG("done_0"); itsAcceptor.setTimer((long)1); TRAN(TBBDriver::idle_state); } break; @@ -418,15 +427,15 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) status = RawEvent::dispatch(*this, port); } break; - case TP_ALIVEACK: { - LOG_DEBUG("TP_ALIVEACK received"); - if (CheckAlive(event, port)) { + case TP_ALIVE_ACK: { + LOG_DEBUG("TP_ALIVE_ACK received"); + if (CheckAlive(event, port)) { // if true, then all boards are checked TRAN(TBBDriver::idle_state); } } break; - case TBB_GETCONFIG: { - TBBGetconfigackEvent ack; + case TBB_GET_CONFIG: { + TBBGetConfigAckEvent ack; ack.max_boards = TS->maxBoards(); ack.active_boards_mask = itsActiveBoards; port.send(ack); @@ -442,41 +451,52 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) } break; case TP_TRIGGER: { - msghandler->sendTrigger(event); + for (int boardnr = 0; boardnr < TS->maxBoards(); boardnr++) { + if (&port == &TS->boardPort(boardnr)) { + msghandler->sendTrigger(event,boardnr); + break; + } + } } break; case TP_ERROR: { msghandler->sendError(event); } break; - case TP_ALLOCACK: - case TP_FREEACK: - case TP_RECORDACK: - case TP_STOPACK: - case TP_TRIGCLRACK: - case TP_READACK: - case TP_UDPACK: - case TP_PAGEPERIODACK: - case TP_VERSIONACK: - case TP_STATUSACK: - case TP_CLEARACK: - case TP_SIZEACK: - case TP_RESETACK: - case TP_CONFIGACK: - case TP_ERASEFACK: - case TP_READFACK: - case TP_WRITEFACK: - case TP_READWACK: - case TP_WRITEWACK: - case TP_READRACK: - case TP_WRITERACK: - case TP_READXACK: + case TP_ALLOC_ACK: + case TP_FREE_ACK: + case TP_RECORD_ACK: + case TP_STOP_ACK: + case TP_TRIG_RELEASE_ACK: + case TP_TRIG_GENERATE_ACK: + case TP_TRIG_SETUP_ACK: + case TP_TRIG_COEF_ACK: + case TP_TRIG_INFO_ACK: + case TP_READ_ACK: + case TP_UDP_ACK: + case TP_PAGEPERIOD_ACK: + case TP_VERSION_ACK: + case TP_STATUS_ACK: + case TP_CLEAR_ACK: + case TP_SIZE_ACK: + case TP_RESET_ACK: + case TP_CONFIG_ACK: + case TP_ERASEF_ACK: + case TP_READF_ACK: + case TP_WRITEF_ACK: + case TP_READW_ACK: + case TP_WRITEW_ACK: + case TP_READR_ACK: + case TP_WRITER_ACK: + case TP_READX_ACK: { - status = cmdhandler->dispatch(event,port); // dispatch ack from boards - if (cmdhandler->tpCmdDone() == true){ - // set ALIVE timer - LOG_DEBUG("done_1"); - itsAcceptor.setTimer((long)1); + if (cmdhandler->tpCmdDone() == false) { + status = cmdhandler->dispatch(event,port); // dispatch ack from boards + } + + if (cmdhandler->tpCmdDone() == true) { + // set ALIVE timer, and check for resets + //itsAcceptor.setTimer((long)5); TRAN(TBBDriver::idle_state); } } break; @@ -484,14 +504,16 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) default: { LOG_DEBUG("DEFAULT"); if (cmdhandler->tpCmdDone() == true){ - // set ALIVE timer - LOG_DEBUG("done_2"); - itsAcceptor.setTimer((long)1); + // set ALIVE timer, and check for resets + //itsAcceptor.setTimer((long)5); TRAN(TBBDriver::idle_state); } // put event on the queue TbbEvent tbbevent; - tbbevent.signal = event.signal; + tbbevent.length = event.length; + tbbevent.event = new uint8[tbbevent.length]; + memcpy(tbbevent.event, &event, tbbevent.length); + //tbbevent.signal = event.signal; tbbevent.port = &port; itsTbbQueue->push_back(tbbevent); status = GCFEvent::NOT_HANDLED; @@ -564,9 +586,19 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port) } else { itsBoard[boardnr].cancelAllTimers(); checkmask &= ~(1 << boardnr); - if ((event.signal == TP_ALIVEACK) && (&port == &itsBoard[boardnr])){ + + if ((event.signal == TP_ALIVE_ACK) && (&port == &itsBoard[boardnr])){ + // new board, send free-cmd + if ((itsActiveBoards & (1 << boardnr)) == 0) { // is it a new board ?? + TPFreeEvent free; + free.opcode = TPFREE; + free.status = 0; + free.channel = 0xFFFFFFFF; // send channel = -1 to free all inputs + itsBoard[boardnr].send(free); + LOG_DEBUG_STR(formatString("FREE -1 is send to port '%s'", itsBoard[boardnr].getName().c_str())); + } activeboards |= (1 << boardnr); - TPAliveackEvent ack(event); + TPAliveAckEvent ack(event); if (ack.resetflag == 0){ itsResetCount[boardnr]++; TS->clearRcuSettings(boardnr); @@ -645,9 +677,33 @@ bool TBBDriver::SetTbbCommand(unsigned short signal) cmdhandler->setTpCmd(cmd); } break; - case TBB_TRIGCLR: { - TrigclrCmd *cmd; - cmd = new TrigclrCmd(); + case TBB_TRIG_RELEASE: { + TrigReleaseCmd *cmd; + cmd = new TrigReleaseCmd(); + cmdhandler->setTpCmd(cmd); + } break; + + case TBB_TRIG_GENERATE: { + TrigGenCmd *cmd; + cmd = new TrigGenCmd(); + cmdhandler->setTpCmd(cmd); + } break; + + case TBB_TRIG_SETUP: { + TrigSetupCmd *cmd; + cmd = new TrigSetupCmd(); + cmdhandler->setTpCmd(cmd); + } break; + + case TBB_TRIG_COEF: { + TrigCoefCmd *cmd; + cmd = new TrigCoefCmd(); + cmdhandler->setTpCmd(cmd); + } break; + + case TBB_TRIG_INFO: { + TrigInfoCmd *cmd; + cmd = new TrigInfoCmd(); cmdhandler->setTpCmd(cmd); } break; diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in index 4d7bd99dbb4e2299829a07e6f9f598449ec2bea8..e5a260d39c47331234074679eff58d02100cbfc4 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in @@ -12,7 +12,7 @@ TBBDriver.IF_NAME=eth1 # Communication settings for TBB boards # TBBDriver.TP_RETRIES=5 -TBBDriver.TP_TIMEOUT=0.2 +TBBDriver.TP_TIMEOUT=0.5 # # Specify the MAC addresses of all TBB boards diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h index b06fa55cbcbe2312fd81556833c0176ed5af0ed7..8355108ebc03ff97ab10774a48e987fb7077621c 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h @@ -98,7 +98,6 @@ namespace LOFAR{ // define some variables TPAliveEvent *itsAlive; - TPSizeEvent *itsSize; BoardCmdHandler *cmdhandler; MsgHandler *msghandler; Command *cmd; @@ -109,8 +108,10 @@ namespace LOFAR{ int32 *itsResetCount; struct TbbEvent{ - unsigned short signal; + //unsigned short signal; GCFPortInterface *port; + uint32 length; + uint8 *event; }; std::deque<TbbEvent> *itsTbbQueue; diff --git a/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot b/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot index 12667ecd45dc0800aba0ec66cbd5cbd1fec6dcaf..f91a50e120f0afb55abbecd66c9fef57928541e9 100644 --- a/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot +++ b/MAC/APL/PIC/TBBDriver/src/TP_Protocol.prot @@ -17,43 +17,76 @@ include = '<Common/LofarTypes.h>'; //include = '<APL/RTCCommon/Timestamp.h>'; prelude = << PRELUDE_END - //--TP Command Opcode's------------------------------------------------------- //--Data Recording---------- - static const uint32 TPALLOC = 0x00000100; // OUT allocate buffer space to a certain input channel - static const uint32 TPFREE = 0x00000101; // OUT free buffer settings and disable input channel - static const uint32 TPRECORD = 0x00000102; // OUT record channel - static const uint32 TPSTOP = 0x00000103; // OUT freeze channel - //--Triggering-------------- - static const uint32 TPTRIGGER = 0x00000200; // IN trigger detected - static const uint32 TPTRIGCLR = 0x00000201; // OUT clear trigger flag - //--Data reading------------ - static const uint32 TPREAD = 0x00000300; // OUT send recorded data to CEP - static const uint32 TPUDP = 0x00000301; // OUT configure UDP and IP header - static const uint32 TPPAGEPERIOD= 0x00000302; // OUT time in one page 30.2 format in nsec - //--Board information------- - static const uint32 TPVERSION = 0x00000700; // IN/OUT returns board version - static const uint32 TPSIZE = 0x00000701; // IN/OUT returns TBB memory size - //--Board status------------ - static const uint32 TPERROR = 0x00000702; // IN error on TBB board - static const uint32 TPSTATUS = 0x00000703; // IN status of board Voltage and Temperature - static const uint32 TPALIVE = 0x00000704; // OUT if response board exist - //--Board control----------- - static const uint32 TPCLEAR = 0x00000710; // OUT clear registers - static const uint32 TPRESET = 0x00000711; // OUT reset to facory image - static const uint32 TPCONFIG = 0x00000712; // OUT reconfigure image - //--Remote system update---- - static const uint32 TPERASEF = 0x00000720; // OUT erase flash memory - static const uint32 TPREADF = 0x00000721; // IN/OUT read flash memory - static const uint32 TPWRITEF = 0x00000722; // OUT write flash memory - //--DDR2 acces-------------- - static const uint32 TPREADW = 0x00000730; // IN/OUT read 64bit word from mp - static const uint32 TPWRITEW = 0x00000731; // OUT write 64bit wort to mp - //--Direct register acces--- - static const uint32 TPREADR = 0x00000740; // IN/OUT read register(direct access), for debug purpose - static const uint32 TPWRITER = 0x00000741; // OUT write register(direct access), for debug purpose - static const uint32 TPREADX = 0x00000742; // OUT write register(direct access), for debug purpose + static const uint32 TPALLOC = 0x00000100; // OUT allocate buffer space to a certain input channel + static const uint32 TPFREE = 0x00000101; // OUT free buffer settings and disable input channel + static const uint32 TPRECORD = 0x00000102; // OUT record channel + static const uint32 TPSTOP = 0x00000103; // OUT freeze channel + //--Triggering-------------- + static const uint32 TPTRIGGER = 0x00000200; // IN trigger detected + static const uint32 TPTRIGRELEASE = 0x00000201; // OUT clear trigger + static const uint32 TPTRIGGENERATE= 0x00000202; // OUT generate trigger + static const uint32 TPTRIGSETUP = 0x00000203; // OUT setup trigger system + static const uint32 TPTRIGCOEF = 0x00000204; // OUT set coefficients for the filters + static const uint32 TPTRIGINFO = 0x00000205; // IN/OUT get trigger info, same data as TPTRIGGER + //--Data reading------------ + static const uint32 TPREAD = 0x00000300; // OUT send recorded data to CEP + static const uint32 TPUDP = 0x00000301; // OUT configure UDP and IP header + static const uint32 TPPAGEPERIOD = 0x00000302; // OUT time in one page 30.2 format in nsec + //--Board information------- + static const uint32 TPVERSION = 0x00000700; // IN/OUT returns board version + static const uint32 TPSIZE = 0x00000701; // IN/OUT returns TBB memory size + //--Board status------------ + static const uint32 TPERROR = 0x00000702; // IN error on TBB board + static const uint32 TPSTATUS = 0x00000703; // IN status of board Voltage and Temperature + static const uint32 TPALIVE = 0x00000704; // OUT if response board exist + //--Board control----------- + static const uint32 TPCLEAR = 0x00000710; // OUT clear registers + static const uint32 TPRESET = 0x00000711; // OUT reset to facory image + static const uint32 TPCONFIG = 0x00000712; // OUT reconfigure image + //--Remote system update---- + static const uint32 TPERASEF = 0x00000720; // OUT erase flash memory + static const uint32 TPREADF = 0x00000721; // IN/OUT read flash memory + static const uint32 TPWRITEF = 0x00000722; // OUT write flash memory + //--DDR2 acces-------------- + static const uint32 TPREADW = 0x00000730; // IN/OUT read 64bit word from mp + static const uint32 TPWRITEW = 0x00000731; // OUT write 64bit wort to mp + //--Direct register acces--- + static const uint32 TPREADR = 0x00000740; // IN/OUT read register(direct access), for debug purpose + static const uint32 TPWRITER = 0x00000741; // OUT write register(direct access), for debug purpose + static const uint32 TPREADX = 0x00000742; // OUT write register(direct access), for debug purpose + + typedef struct TpTriggerInfo // trigger information + { + uint32 channel; + uint32 sequence_nr; + uint32 time; + uint32 sample_nr; + uint32 sum; + uint32 samples; + uint32 peak; + uint32 flags; + uint32 end_code; + }; + + typedef struct TpTriggerSetup // setup variables for 1 channel + { + uint32 level; + uint32 td_mode; + uint32 filter_select; + uint32 window; + uint32 dummy; + }; + + typedef struct TpFilterCoeffients // filter coeffients for 1 channel + { + uint32 c0; + uint32 c1; + uint32 c2; + uint32 c3; + }; PRELUDE_END; @@ -98,7 +131,7 @@ event = { event = { noheader; - signal = ALLOCACK; + signal = ALLOC_ACK; dir = IN; param = { name = "opcode"; @@ -130,7 +163,7 @@ event = { event = { noheader; - signal = FREEACK; + signal = FREE_ACK; dir = IN; param = { name = "opcode"; @@ -162,7 +195,7 @@ event = { event = { noheader; - signal = RECORDACK; + signal = RECORD_ACK; dir = IN; param = { name = "opcode"; @@ -194,7 +227,7 @@ event = { event = { noheader; - signal = STOPACK; + signal = STOP_ACK; dir = IN; param = { name = "opcode"; @@ -219,23 +252,51 @@ event = { name = "status"; type = "uint32"; }; + param = { + name = "trigger"; + type = "TpTriggerInfo"; + }; +}; + +event = { + noheader; + signal = TRIG_RELEASE; + dir = OUT; param = { - name = "channel"; + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; + param = { + name = "mp"; + type = "uint32"; + }; + param = { + name = "channel_mask"; // 1 mp, bit 0 .. 3 + type = "uint32"; + }; +}; + +event = { + noheader; + signal = TRIG_RELEASE_ACK; + dir = IN; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; type = "uint32"; }; - param = { - name = "time"; - type = "uint32"; - }; - param = { - name = "sample"; - type = "uint32"; - }; }; event = { noheader; - signal = TRIGCLR; + signal = TRIG_GENERATE; dir = OUT; param = { name = "opcode"; @@ -246,14 +307,54 @@ event = { type = "uint32"; }; param = { - name = "channel"; + name = "mp"; + type = "uint32"; + }; + param = { + name = "channel_mask"; // 1 mp, bit 0 .. 3 + type = "uint32"; + }; +}; + +event = { + noheader; + signal = TRIG_GENERATE_ACK; + dir = IN; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; +}; + +event = { + noheader; + signal = TRIG_SETUP; + dir = OUT; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; + param = { + name = "mp"; type = "uint32"; }; + param = { + name = "channel"; + type = "TpTriggerSetup[4]"; + }; }; event = { noheader; - signal = TRIGCLRACK; + signal = TRIG_SETUP_ACK; dir = IN; param = { name = "opcode"; @@ -265,6 +366,80 @@ event = { }; }; +event = { + noheader; + signal = TRIG_COEF; + dir = OUT; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; + param = { + name = "mp"; + type = "uint32"; + }; + param = { + name = "channel"; + type = "TpFilterCoeffients[4]"; + }; + +}; + +event = { + noheader; + signal = TRIG_COEF_ACK; + dir = IN; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; +}; + +event = { + noheader; + signal = TRIG_INFO; + dir = OUT; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; + param = { + name = "channel"; + type = "uint32"; + }; +}; + +event = { + noheader; + signal = TRIG_INFO_ACK; + dir = IN; + param = { + name = "opcode"; + type = "uint32"; + }; + param = { + name = "status"; + type = "uint32"; + }; + param = { + name = "trigger"; + type = "TpTriggerInfo"; + }; +}; + + //--Data reading-------------- event = { noheader; @@ -302,7 +477,7 @@ event = { event = { noheader; - signal = READACK; + signal = READ_ACK; dir = IN; param = { name = "opcode"; @@ -342,7 +517,7 @@ event = { event = { noheader; - signal = UDPACK; + signal = UDP_ACK; dir = IN; param = { name = "opcode"; @@ -374,7 +549,7 @@ event = { event = { noheader; - signal = PAGEPERIODACK; + signal = PAGEPERIOD_ACK; dir = IN; param = { name = "opcode"; @@ -407,7 +582,7 @@ event = { event = { noheader; - signal = VERSIONACK; + signal = VERSION_ACK; dir = IN; param = { name = "opcode"; @@ -467,7 +642,7 @@ event = { event = { noheader; - signal = SIZEACK; + signal = SIZE_ACK; dir = IN; param = { name = "opcode"; @@ -517,7 +692,7 @@ event = { event = { noheader; - signal = STATUSACK; + signal = STATUS_ACK; dir = IN; param = { name = "opcode"; @@ -581,7 +756,7 @@ event = { event = { noheader; - signal = ALIVEACK; + signal = ALIVE_ACK; dir = IN; param = { name = "opcode"; @@ -614,7 +789,7 @@ event = { event = { noheader; - signal = CLEARACK; + signal = CLEAR_ACK; dir = IN; param = { name = "opcode"; @@ -642,7 +817,7 @@ event = { event = { noheader; - signal = RESETACK; + signal = RESET_ACK; dir = IN; param = { name = "opcode"; @@ -674,7 +849,7 @@ event = { event = { noheader; - signal = CONFIGACK; + signal = CONFIG_ACK; dir = IN; param = { name = "opcode"; @@ -707,7 +882,7 @@ event = { event = { noheader; - signal = ERASEFACK; + signal = ERASEF_ACK; dir = INOUT; param = { name = "opcode"; @@ -739,7 +914,7 @@ event = { event = { noheader; - signal = READFACK; + signal = READF_ACK; dir = IN; param = { name = "opcode"; @@ -779,7 +954,7 @@ event = { event = { noheader; - signal = WRITEFACK; + signal = WRITEF_ACK; dir = IN; param = { name = "opcode"; @@ -816,7 +991,7 @@ event = { event = { noheader; - signal = READWACK; + signal = READW_ACK; dir = IN; param = { name = "opcode"; @@ -868,7 +1043,7 @@ event = { event = { noheader; - signal = WRITEWACK; + signal = WRITEW_ACK; dir = IN; param = { name = "opcode"; @@ -909,7 +1084,7 @@ event = { event = { noheader; - signal = READRACK; + signal = READR_ACK; dir = IN; param = { name = "opcode"; @@ -957,7 +1132,7 @@ event = { event = { noheader; - signal = WRITERACK; + signal = WRITER_ACK; dir = IN; param = { name = "opcode"; @@ -1005,7 +1180,7 @@ event = { event = { noheader; - signal = READXACK; + signal = READX_ACK; dir = IN; param = { name = "opcode"; diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc index de817013cd928b69557167a7c1169fa452b43d8a..43c88416239db78252df8d9232d8858dbb01c7ce 100644 --- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc @@ -164,7 +164,7 @@ UdpCmd::UdpCmd(): itsTPE = new TPUdpEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBModeackEvent(); + itsTBBackE = new TBBModeAckEvent(); itsTBBackE->status_mask = 0; setWaitAck(true); @@ -180,7 +180,7 @@ UdpCmd::~UdpCmd() // ---------------------------------------------------------------------------- bool UdpCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_MODE)||(event.signal == TP_UDPACK)) { + if ((event.signal == TBB_MODE)||(event.signal == TP_UDP_ACK)) { return(true); } return(false); @@ -234,7 +234,7 @@ void UdpCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_COMM_ERROR; } else { - itsTPackE = new TPUdpackEvent(event); + itsTPackE = new TPUdpAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsTBBackE->status_mask |= (1 << (16 + (itsTPackE->status & 0x0F))); @@ -255,8 +255,3 @@ void UdpCmd::sendTbbAckEvent(GCFPortInterface* clientport) clientport->send(*itsTBBackE); } -// ---------------------------------------------------------------------------- -bool UdpCmd::waitAck() -{ - return(true); -} diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.h b/MAC/APL/PIC/TBBDriver/src/UdpCmd.h index 2c24c2190384744bc84264f8e072674b6a04d43d..bfa6642fb563755d8267484c85252503b69960a3 100644 --- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.h @@ -58,8 +58,6 @@ namespace LOFAR { virtual void sendTbbAckEvent(GCFPortInterface* clientport); - virtual bool waitAck(); - private: //private methods @@ -83,9 +81,9 @@ namespace LOFAR { uint32 itsMode; // Transient or subbands TPUdpEvent *itsTPE; - TPUdpackEvent *itsTPackE; + TPUdpAckEvent *itsTPackE; TBBModeEvent *itsTBBE; - TBBModeackEvent *itsTBBackE; + TBBModeAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc index 4a6a06461b1856e3f029d305f03d78a50cb6527c..fa9709c69004e5561a28fe515e7c6138ba4fb132 100644 --- a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc @@ -38,7 +38,7 @@ VersionCmd::VersionCmd() itsTPE = new TPVersionEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBVersionackEvent(); + itsTBBackE = new TBBVersionAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; @@ -56,7 +56,7 @@ VersionCmd::~VersionCmd() // ---------------------------------------------------------------------------- bool VersionCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_VERSION)||(event.signal == TP_VERSIONACK)) { + if ((event.signal == TBB_VERSION)||(event.signal == TP_VERSION_ACK)) { return(true); } return(false); @@ -101,19 +101,19 @@ void VersionCmd::saveTpAckEvent(GCFEvent& event) } else { //TPVersionEvent tpe(event); - itsTPackE = new TPVersionackEvent(event); + itsTPackE = new TPVersionAckEvent(event); if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6)) itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F))); - itsTBBackE->boardid[getBoardNr()] = itsTPackE->boardid; + itsTBBackE->boardid[getBoardNr()] = itsTPackE->boardid; itsTBBackE->swversion[getBoardNr()] = itsTPackE->swversion; - itsTBBackE->boardversion[getBoardNr()] = itsTPackE->boardversion; + itsTBBackE->boardversion[getBoardNr()]= itsTPackE->boardversion; itsTBBackE->tpversion[getBoardNr()] = itsTPackE->tpversion; - itsTBBackE->mp0version[getBoardNr()] = itsTPackE->mp0version; - itsTBBackE->mp1version[getBoardNr()] = itsTPackE->mp1version; - itsTBBackE->mp2version[getBoardNr()] = itsTPackE->mp2version; - itsTBBackE->mp3version[getBoardNr()] = itsTPackE->mp3version; + itsTBBackE->mp0version[getBoardNr()] = (itsTPackE->mp0version >> 24); + itsTBBackE->mp1version[getBoardNr()] = (itsTPackE->mp1version >> 24); + itsTBBackE->mp2version[getBoardNr()] = (itsTPackE->mp2version >> 24); + itsTBBackE->mp3version[getBoardNr()] = (itsTPackE->mp3version >> 24); LOG_DEBUG_STR(formatString("VersionCmd: board[%d] %08X;%u;%u;%u;%u;%u;%u;%u;%u", getBoardNr(),itsTBBackE->status_mask[getBoardNr()],itsTPackE->boardid,itsTPackE->swversion,itsTPackE->boardversion, diff --git a/MAC/APL/PIC/TBBDriver/src/VersionCmd.h b/MAC/APL/PIC/TBBDriver/src/VersionCmd.h index 21d2ea0b543ee1465848e002ed22a3db450f6bca..e91ad31e77f4ee44be4dbac29b6193022c969dc0 100644 --- a/MAC/APL/PIC/TBBDriver/src/VersionCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/VersionCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPVersionEvent *itsTPE; - TPVersionackEvent *itsTPackE; + TPVersionAckEvent *itsTPackE; TBBVersionEvent *itsTBBE; - TBBVersionackEvent *itsTBBackE; + TBBVersionAckEvent *itsTBBackE; }; } // end TBB namespace } // end LOFAR namespace diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc index 084b2a9500a8133655d9186773108eec98f7c59c..0ff1b7aabcf63f9c82f113868c687aa8b55f96ac 100644 --- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc @@ -50,7 +50,7 @@ static const int FL_BLOCKS_IN_PAGE = FL_PAGE_SIZE / FL_BLOCK_SIZE; // 2048 block //--Constructors for a WritefCmd object.---------------------------------------- WritefCmd::WritefCmd(): - itsStage(idle),itsImage(0),itsSector(0),itsBlock(0),itsImageSize(0),itsBoardStatus(0) + itsStage(idle),itsImage(0),itsSector(0),itsBlock(0),itsImageSize(0),itsDataPtr(0),itsBoardStatus(0) { TS = TbbSettings::instance(); itsTPE = new TPWritefEvent(); @@ -58,6 +58,8 @@ WritefCmd::WritefCmd(): itsTBBE = 0; itsTBBackE = new TBBWriteImageAckEvent(); itsImageData= 0; + + itsTBBackE->status_mask = 0; setWaitAck(true); } @@ -74,9 +76,9 @@ WritefCmd::~WritefCmd() bool WritefCmd::isValid(GCFEvent& event) { if ((event.signal == TBB_WRITE_IMAGE) - || (event.signal == TP_ERASEFACK) - || (event.signal == TP_WRITEFACK) - || (event.signal == TP_READFACK)) { + || (event.signal == TP_ERASEF_ACK) + || (event.signal == TP_WRITEF_ACK) + || (event.signal == TP_READF_ACK)) { return(true); } return(false); @@ -87,7 +89,13 @@ void WritefCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBWriteImageEvent(event); - setBoardNr(itsTBBE->board); + itsTBBackE->status_mask = 0; + if (TS->isBoardActive(itsTBBE->board)) { + setBoardNr(itsTBBE->board); + } else { + itsTBBackE->status_mask |= TBB_NO_BOARD ; + setDone(true); + } memcpy(itsFileNameTp,itsTBBE->filename_tp,sizeof(char) * 64); memcpy(itsFileNameMp,itsTBBE->filename_mp,sizeof(char) * 64); @@ -99,8 +107,6 @@ void WritefCmd::saveTbbEvent(GCFEvent& event) readFiles(); - itsTBBackE->status_mask = 0; - itsImage = itsTBBE->image; itsSector = (itsImage * FL_SECTORS_IN_PAGE); itsBlock = (itsImage * FL_BLOCKS_IN_PAGE); @@ -133,12 +139,12 @@ void WritefCmd::sendTpEvent() // fill event with data and send itsTPE->addr = static_cast<uint32>(itsBlock * FL_BLOCK_SIZE); - int ptr = itsBlock - (itsImage * FL_BLOCKS_IN_PAGE); + //int ptr = itsBlock - (itsImage * FL_BLOCKS_IN_PAGE); for (int tp_an=0; tp_an < 256; tp_an++) { - itsTPE->data[tp_an] = itsImageData[ptr]; ptr++; - itsTPE->data[tp_an] |= (itsImageData[ptr] << 8); ptr++; - itsTPE->data[tp_an] |= (itsImageData[ptr] << 16); ptr++; - itsTPE->data[tp_an] |= (itsImageData[ptr] << 24); ptr++; + itsTPE->data[tp_an] = itsImageData[itsDataPtr]; itsDataPtr++; + itsTPE->data[tp_an] |= (itsImageData[itsDataPtr] << 8); itsDataPtr++; + itsTPE->data[tp_an] |= (itsImageData[itsDataPtr] << 16); itsDataPtr++; + itsTPE->data[tp_an] |= (itsImageData[itsDataPtr] << 24); itsDataPtr++; } TS->boardPort(getBoardNr()).send(*itsTPE); @@ -209,7 +215,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) switch (itsStage) { case erase_flash: { - TPErasefackEvent *erasefAckEvent = new TPErasefackEvent(event); + TPErasefAckEvent *erasefAckEvent = new TPErasefAckEvent(event); if (erasefAckEvent->status == 0) { itsSector++; @@ -224,7 +230,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) } break; case write_flash: { - itsTPackE = new TPWritefackEvent(event); + itsTPackE = new TPWritefAckEvent(event); if (itsTPackE->status == 0) { itsStage = verify_flash; @@ -239,7 +245,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) // check if write-data is read-data bool same = true; - TPReadfackEvent *readfAckEvent = new TPReadfackEvent(event); + TPReadfAckEvent *readfAckEvent = new TPReadfAckEvent(event); if (readfAckEvent->status == 0) { for (int i = 0; i < (FL_BLOCK_SIZE / 4); i++) { @@ -268,7 +274,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) } break; case write_info: { - itsTPackE = new TPWritefackEvent(event); + itsTPackE = new TPWritefAckEvent(event); if (itsTPackE->status == 0) { itsStage = verify_info; @@ -283,7 +289,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) // check if write-data is read-data bool same = true; - TPReadfackEvent *readfAckEvent = new TPReadfackEvent(event); + TPReadfAckEvent *readfAckEvent = new TPReadfAckEvent(event); if (readfAckEvent->status == 0) { for (int i = 0; i < 10; i++) { diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.h b/MAC/APL/PIC/TBBDriver/src/WritefCmd.h index cf111729317ea30f88160b8deafcf3f689e30e87..869c9c872b439bc813ed04b3b685d1e2b504ae13 100644 --- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.h @@ -72,12 +72,13 @@ namespace LOFAR { int32 itsSector; int32 itsBlock; int32 itsImageSize; + int32 itsDataPtr; char itsFileNameTp[64]; char itsFileNameMp[64]; TPWritefEvent *itsTPE; - TPWritefackEvent *itsTPackE; + TPWritefAckEvent *itsTPackE; TBBWriteImageEvent *itsTBBE; TBBWriteImageAckEvent *itsTBBackE; uint8 *itsImageData; diff --git a/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc index 90e498189a6ade7e022ef7ec2ebe57775d0e65d2..fc8346d1ab8c72301a3b594976818666d53ff06c 100644 --- a/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/WritewCmd.cc @@ -38,7 +38,9 @@ WritewCmd::WritewCmd(): itsTPE = new TPWritewEvent(); itsTPackE = 0; itsTBBE = 0; - itsTBBackE = new TBBWritewackEvent(); + itsTBBackE = new TBBWritewAckEvent(); + + itsTBBackE->status_mask = 0; setWaitAck(true); } @@ -52,7 +54,7 @@ WritewCmd::~WritewCmd() // ---------------------------------------------------------------------------- bool WritewCmd::isValid(GCFEvent& event) { - if ((event.signal == TBB_WRITEW)||(event.signal == TP_WRITEWACK)) { + if ((event.signal == TBB_WRITEW)||(event.signal == TP_WRITEW_ACK)) { return(true); } return(false); @@ -62,11 +64,15 @@ bool WritewCmd::isValid(GCFEvent& event) void WritewCmd::saveTbbEvent(GCFEvent& event) { itsTBBE = new TBBWritewEvent(event); - - setBoardNr(itsTBBE->board); itsTBBackE->status_mask = 0; - + if (TS->isBoardActive(itsTBBE->board)) { + setBoardNr(itsTBBE->board); + } else { + itsTBBackE->status_mask |= TBB_NO_BOARD ; + setDone(true); + } + // initialize TP send frame itsTPE->opcode = TPWRITEW; itsTPE->status = 0; @@ -93,7 +99,7 @@ void WritewCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_COMM_ERROR; } else { - itsTPackE = new TPWritewackEvent(event); + itsTPackE = new TPWritewAckEvent(event); itsBoardStatus = itsTPackE->status; diff --git a/MAC/APL/PIC/TBBDriver/src/WritewCmd.h b/MAC/APL/PIC/TBBDriver/src/WritewCmd.h index 82db77fb1c3c90d4440fa47196cc79ae6939cf02..b4b0d23e8a50d19bea3392c87870e404b24cfd1c 100644 --- a/MAC/APL/PIC/TBBDriver/src/WritewCmd.h +++ b/MAC/APL/PIC/TBBDriver/src/WritewCmd.h @@ -61,9 +61,9 @@ namespace LOFAR { TbbSettings *TS; TPWritewEvent *itsTPE; - TPWritewackEvent *itsTPackE; + TPWritewAckEvent *itsTPackE; TBBWritewEvent *itsTBBE; - TBBWritewackEvent *itsTBBackE; + TBBWritewAckEvent *itsTBBackE; // variables holding data from tp cmd uint32 itsBoardStatus; diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc index e82ff4c13d805644c6bf451b4f94674580beb0da..9fc800f2bd70e61e5e7ef01f32e86fabb8a48275 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc @@ -67,18 +67,19 @@ void AllocCmd::send() if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult AllocCmd::ack(GCFEvent& e) { - TBBAllocackEvent ack(e); + TBBAllocAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); int32 bnr = 0; int32 oldbnr = -1; for (int cnr=0; cnr < getMaxSelections(); cnr++) { - bnr = (int32)(cnr / 16); + bnr = static_cast<int32>(cnr / 16); if (bnr != oldbnr) { if ((ack.status_mask[bnr] & TBB_SUCCESS) || (ack.status_mask[bnr] & TBB_RCU_COMM_ERROR)) { @@ -114,19 +115,20 @@ ChannelInfoCmd::ChannelInfoCmd(GCFPortInterface& port) : Command(port) //----------------------------------------------------------------------------- void ChannelInfoCmd::send() { - TBBRcuinfoEvent event; + TBBRcuInfoEvent event; itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult ChannelInfoCmd::ack(GCFEvent& e) { - TBBRcuinfoackEvent ack(e); + TBBRcuInfoAckEvent ack(e); int32 bnr = 0; int32 oldbnr = -1; for (int rcu=0; rcu < getMaxSelections(); rcu++) { - bnr = (int32)(rcu / 16); + bnr = static_cast<int32>(rcu / 16); if (ack.rcu_state[rcu] != 'F') { if (isSelected(rcu) ) { if (bnr != oldbnr) { @@ -152,7 +154,7 @@ GCFEvent::TResult ChannelInfoCmd::ack(GCFEvent& e) //---- FREE ---------------------------------------------------------------- FreeCmd::FreeCmd(GCFPortInterface& port) : Command(port) { - logMessage(cout,"\n== TBB =================== discard buffer allocation and disable channels ====\n"); + logMessage(cout,"\n== TBB =================== discard buffer allocation and disable rcu's ====\n"); } //----------------------------------------------------------------------------- @@ -163,18 +165,19 @@ void FreeCmd::send() if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult FreeCmd::ack(GCFEvent& e) { - TBBFreeackEvent ack(e); + TBBFreeAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); int32 bnr = 0; int32 oldbnr = -1; for (int cnr=0; cnr < getMaxSelections(); cnr++) { - bnr = (int32)(cnr / 16); + bnr = static_cast<int32>(cnr / 16); if (bnr != oldbnr) { if (ack.status_mask[bnr] & TBB_SUCCESS) { @@ -203,7 +206,7 @@ GCFEvent::TResult FreeCmd::ack(GCFEvent& e) //---- RECORD ---------------------------------------------------------------- RecordCmd::RecordCmd(GCFPortInterface& port) : Command(port) { - logMessage(cout,"\n== TBB ============================= start recording on selected channels ====\n"); + logMessage(cout,"\n== TBB ============================= start recording on selected rcu's ====\n"); } //----------------------------------------------------------------------------- @@ -214,18 +217,19 @@ void RecordCmd::send() if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult RecordCmd::ack(GCFEvent& e) { - TBBRecordackEvent ack(e); + TBBRecordAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); int32 bnr = 0; int32 oldbnr = -1; for (int cnr=0; cnr < getMaxSelections(); cnr++) { - bnr = (int32)(cnr / 16); + bnr = static_cast<int32>(cnr / 16); if (bnr != oldbnr) { if (ack.status_mask[bnr] & TBB_SUCCESS) { @@ -256,7 +260,7 @@ GCFEvent::TResult RecordCmd::ack(GCFEvent& e) //---- STOP ------------------------------------------------------------------- StopCmd::StopCmd(GCFPortInterface& port) : Command(port) { - logMessage(cout,"\n== TBB ============================== stop recording on selected channels ====\n"); + logMessage(cout,"\n== TBB ============================== stop recording on selected rcu's ====\n"); } //----------------------------------------------------------------------------- @@ -264,21 +268,23 @@ void StopCmd::send() { TBBStopEvent event; - if (getSelected()) event.rcu_mask = getRcuMask(); // if select cmd is used - + if (getSelected()) { + event.rcu_mask = getRcuMask(); // if select cmd is use + } itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult StopCmd::ack(GCFEvent& e) { - TBBStopackEvent ack(e); + TBBStopAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); int32 bnr = 0; int32 oldbnr = -1; for (int cnr=0; cnr < getMaxSelections(); cnr++) { - bnr = (int32)(cnr / 16); + bnr = static_cast<int32>(cnr / 16); if (bnr != oldbnr) { if (ack.status_mask[bnr] & TBB_SUCCESS) { @@ -306,38 +312,200 @@ GCFEvent::TResult StopCmd::ack(GCFEvent& e) return(GCFEvent::HANDLED); } -//---- TRIGCLR ---------------------------------------------------------------- -TrigclrCmd::TrigclrCmd(GCFPortInterface& port) : Command(port) +//---- TRIGRELEASE ------------------------------------------------------------ +TrigReleaseCmd::TrigReleaseCmd(GCFPortInterface& port) : Command(port) { - logMessage(cout,"\n== TBB ============================ clear trigger on selected channel ====\n"); + logMessage(cout,"\n== TBB ============================ release trigger for selected rcu's ====\n"); } //----------------------------------------------------------------------------- -void TrigclrCmd::send() +void TrigReleaseCmd::send() { - TBBTrigclrEvent event; - event.channel = (uint32)getRcu(); + TBBTrigReleaseEvent event; + if (getSelected()) { + event.rcu_mask = getRcuMask(); + } + itsPort.send(event); + itsPort.setTimer((long)1); +} + +//----------------------------------------------------------------------------- +GCFEvent::TResult TrigReleaseCmd::ack(GCFEvent& e) +{ + TBBTrigReleaseAckEvent ack(e); + logMessage(cout,"TBB Info"); + logMessage(cout,"--- -------------------------------------------------------"); + for (int bnr=0; bnr < getMaxSelections(); bnr++) { + if (isSelected(bnr) ) { + if (ack.status_mask[bnr] & TBB_SUCCESS) { + logMessage(cout,formatString(" %2d trigger detection released for selected rcu's",bnr )); + } else { + logMessage(cout,formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str())); + } + } + } + setCmdDone(true); + return(GCFEvent::HANDLED); +} + +//---- TRIGGENERATE ----------------------------------------------------------- +TrigGenerateCmd::TrigGenerateCmd(GCFPortInterface& port) : Command(port) +{ + logMessage(cout,"\n== TBB ============================ generate trigger on selected rcu's ====\n"); + logMessage(cout,"RCU seq_nr time sample sum samples peak"); + logMessage(cout,"--- --------- --------- --------- --------- --------- ---------"); +} + +//----------------------------------------------------------------------------- +void TrigGenerateCmd::send() +{ + TBBTrigGenerateEvent event; + if (getSelected()) { + event.rcu_mask = getRcuMask(); + } + itsPort.send(event); + itsPort.setTimer((long)1); +} + +//----------------------------------------------------------------------------- +GCFEvent::TResult TrigGenerateCmd::ack(GCFEvent& e) +{ + if (e.signal == TBB_TRIG_GENERATE_ACK) { + TBBTrigGenerateAckEvent ack(e); + } + if (e.signal == TBB_TRIGGER) { + TBBTriggerEvent trig(e); + logMessage(cout,formatString(" %2d %8u %8u %8u %8u %8u %9u", + trig.rcu, trig.sequence_nr, trig.time, trig.sample_nr, trig.trigger_sum, trig.trigger_samples, trig.peak_value)); + } + //setCmdDone(true); + return(GCFEvent::HANDLED); +} + +//---- TRIGSETUP -------------------------------------------------------------- +TrigSetupCmd::TrigSetupCmd(GCFPortInterface& port) : Command(port), + itsLevel(0), itsMode(0), itsFilter(0), itsWindow(0), itsDummy(0) +{ + logMessage(cout,"\n== TBB ============================ trigger system setup for selected rcu's ====\n"); +} + +//----------------------------------------------------------------------------- +void TrigSetupCmd::send() +{ + TBBTrigSetupEvent event; + if (getSelected()) { + for (int cnr=0; cnr < MAX_N_RCUS; cnr++) { + event.setup[cnr].level = itsLevel; + event.setup[cnr].td_mode = itsMode; + 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); } //----------------------------------------------------------------------------- -GCFEvent::TResult TrigclrCmd::ack(GCFEvent& e) +GCFEvent::TResult TrigSetupCmd::ack(GCFEvent& e) { - TBBTrigclrackEvent ack(e); + TBBTrigSetupAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); + for (int bnr=0; bnr < getMaxSelections(); bnr++) { + if (isSelected(bnr) ) { + if (ack.status_mask[bnr] & TBB_SUCCESS) { + logMessage(cout,formatString(" %2d setup trigger system for all rcu's",bnr )); + } else { + logMessage(cout,formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str())); + } + } + } + setCmdDone(true); + return(GCFEvent::HANDLED); +} + +//---- TRIGCOEFFICIENTS ------------------------------------------------------- +TrigCoefficientCmd::TrigCoefficientCmd(GCFPortInterface& port) : Command(port), + itsC0(0), itsC1(0), itsC2(0), itsC3(0) +{ + logMessage(cout,"\n== TBB ============================ setup trigger coeffients for selected rcu's ====\n"); +} + +//----------------------------------------------------------------------------- +void TrigCoefficientCmd::send() +{ + TBBTrigCoefEvent event; + if (getSelected()) { + 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; + } + } + itsPort.send(event); + itsPort.setTimer((long)1); +} + +//----------------------------------------------------------------------------- +GCFEvent::TResult TrigCoefficientCmd::ack(GCFEvent& e) +{ + TBBTrigCoefAckEvent ack(e); + logMessage(cout,"TBB Info"); + logMessage(cout,"--- -------------------------------------------------------"); + for (int bnr=0; bnr < getMaxSelections(); bnr++) { + if (isSelected(bnr) ) { + if (ack.status_mask[bnr] & TBB_SUCCESS) { + logMessage(cout,formatString(" %2d setup trigger coeffients for selected rcu's",bnr )); + } else { + logMessage(cout,formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask[bnr]).c_str())); + } + } + } + setCmdDone(true); + return(GCFEvent::HANDLED); +} + +//---- TRIGINFO --------------------------------------------------------------- +TrigInfoCmd::TrigInfoCmd(GCFPortInterface& port) : Command(port) +{ + logMessage(cout,"\n== TBB ============================ trigger info for selected rcu's ====\n"); +} + +//----------------------------------------------------------------------------- +void TrigInfoCmd::send() +{ + TBBTrigInfoEvent event; + if (getSelected()) { + event.rcu = getRcu(); + } + itsPort.send(event); + itsPort.setTimer((long)1); +} + +//----------------------------------------------------------------------------- +GCFEvent::TResult TrigInfoCmd::ack(GCFEvent& e) +{ + TBBTrigInfoAckEvent ack(e); + logMessage(cout,"RCU Info"); + logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { if (isSelected(bnr) ) { if (ack.status_mask & TBB_SUCCESS) { - logMessage(cout,formatString(" %2d clear trigger message",bnr )); + logMessage(cout,formatString(" %2d sequence : %u",bnr,ack.sequence_nr)); + logMessage(cout,formatString(" time : %u",ack.time)); + logMessage(cout,formatString(" sample : %u",ack.sample_nr)); + logMessage(cout,formatString(" sum : %u",ack.trigger_sum)); + logMessage(cout,formatString(" samples : %u",ack.trigger_samples)); + logMessage(cout,formatString(" peak value : %u",ack.peak_value)); + logMessage(cout,formatString(" flags : %08X",ack.trigger_flags)); } else { logMessage(cout,formatString(" %2d %s",bnr, getDriverErrorStr(ack.status_mask).c_str())); } } } - setCmdDone(true); - return(GCFEvent::HANDLED); } @@ -345,7 +513,7 @@ GCFEvent::TResult TrigclrCmd::ack(GCFEvent& e) ReadCmd::ReadCmd(GCFPortInterface& port) : Command(port), itsSecondsTime(0),itsSampleTime(0),itsPrePages(0),itsPostPages(0) { - logMessage(cout,"\n== TBB ============== transfer data to CEP for all selected channels ====\n"); + logMessage(cout,"\n== TBB ============== transfer data to CEP for all selected rcu ====\n"); } //----------------------------------------------------------------------------- @@ -358,12 +526,13 @@ void ReadCmd::send() event.prepages = itsPrePages; event.postpages = itsPostPages; itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult ReadCmd::ack(GCFEvent& e) { - TBBReadackEvent ack(e); + TBBReadAckEvent ack(e); logMessage(cout,"RCU Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int cnr=0; cnr < getMaxSelections(); cnr++) { @@ -395,12 +564,13 @@ void ModeCmd::send() event.board = (uint32)getBoard(); event.rec_mode = itsRecMode; itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult ModeCmd::ack(GCFEvent& e) { - TBBModeackEvent ack(e); + TBBModeAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); if (ack.status_mask & TBB_SUCCESS) { @@ -426,15 +596,16 @@ void VersionCmd::send() TBBVersionEvent event; event.boardmask = getBoardMask(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult VersionCmd::ack(GCFEvent& e) { - TBBVersionackEvent ack(e); + TBBVersionAckEvent ack(e); logMessage(cout,formatString("TBBDriver software version %3.1f\n",(ack.driverversion / 10.))); - logMessage(cout,"TBB ID Software Board TP0 MP0 MP1 MP2 TP3"); + logMessage(cout,"TBB ID Software Board TP0 MP0 MP1 MP2 MP3"); logMessage(cout,"--- -- -------- ------- ------- ------- ------- ------- -------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { if (isSelected(bnr) ) { @@ -472,12 +643,13 @@ void SizeCmd::send() TBBSizeEvent event; event.boardmask = getBoardMask(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult SizeCmd::ack(GCFEvent& e) { - TBBSizeackEvent ack(e); + TBBSizeAckEvent ack(e); logMessage(cout,"TBB pages Total memory "); logMessage(cout,"--- -------- ------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -509,12 +681,13 @@ void StatusCmd::send() TBBStatusEvent event; event.boardmask = getBoardMask(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult StatusCmd::ack(GCFEvent& e) { - TBBStatusackEvent ack(e); + TBBStatusAckEvent ack(e); logMessage(cout,"TBB Voltage 1.2 Voltage 2.5 Voltage 3.3 Temp PCB Temp TP Temp MP0 Temp MP1 Temp MP2 Temp MP3"); logMessage(cout,"--- ----------- ----------- ----------- -------- -------- -------- -------- -------- --------"); @@ -556,12 +729,13 @@ void ClearCmd::send() TBBClearEvent event; event.boardmask = getBoardMask(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult ClearCmd::ack(GCFEvent& e) { - TBBClearackEvent ack(e); + TBBClearAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -591,12 +765,13 @@ void ResetCmd::send() TBBResetEvent event; event.boardmask = getBoardMask(); itsPort.send(event); + itsPort.setTimer((long)5); } //----------------------------------------------------------------------------- GCFEvent::TResult ResetCmd::ack(GCFEvent& e) { - TBBResetackEvent ack(e); + TBBResetAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -627,12 +802,13 @@ void ConfigCmd::send() event.boardmask = getBoardMask(); event.imagenr = itsImage; itsPort.send(event); + itsPort.setTimer((long)5); } //----------------------------------------------------------------------------- GCFEvent::TResult ConfigCmd::ack(GCFEvent& e) { - TBBConfigackEvent ack(e); + TBBConfigAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -669,6 +845,7 @@ void ErasefCmd::send() logMessage(cout,formatString(" %2d erasing flash memory of image %d\n", getBoard(), itsPage)); logMessage(cout," erasing will take about 8 seconds"); itsPort.send(event); + itsPort.setTimer((long)16); } //----------------------------------------------------------------------------- @@ -707,6 +884,7 @@ void ReadfCmd::send() logMessage(cout,formatString(" %2d reading flash memory of image %d\n", getBoard(), itsPage)); logMessage(cout," reading will take about 12 seconds"); itsPort.send(event); + itsPort.setTimer((long)24); } //----------------------------------------------------------------------------- @@ -750,6 +928,7 @@ void WritefCmd::send() logMessage(cout,formatString(" %2d writing flash memory of image %d\n", getBoard(), itsPage)); logMessage(cout," writing will take about 25 seconds"); itsPort.send(event); + itsPort.setTimer((long)60); } //----------------------------------------------------------------------------- @@ -779,6 +958,7 @@ void ImageInfoCmd::send() TBBImageInfoEvent event; event.board = getBoard(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- @@ -831,12 +1011,13 @@ void ReadwCmd::send() event.mp = itsMp; event.addr = itsAddr; itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult ReadwCmd::ack(GCFEvent& e) { - TBBReadwackEvent ack(e); + TBBReadwAckEvent ack(e); for (int bnr=0; bnr < getMaxSelections(); bnr++) { if (isSelected(bnr) ) { if (ack.status_mask & TBB_SUCCESS) { @@ -849,14 +1030,13 @@ GCFEvent::TResult ReadwCmd::ack(GCFEvent& e) } } } - if (itsAddr == (itsStopAddr - 1)) - + //if (itsAddr == (itsStopAddr - 1)) itsAddr++; if (itsAddr >= itsStopAddr) { setCmdDone(true); } else { - itsPort.setTimer(0.01); + //itsPort.setTimer((long)0); } return(GCFEvent::HANDLED); } @@ -877,12 +1057,13 @@ void WritewCmd::send() event.wordlo = itsWordLo; event.wordhi = itsWordHi; itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult WritewCmd::ack(GCFEvent& e) { - TBBWritewackEvent ack(e); + TBBWritewAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -901,6 +1082,170 @@ GCFEvent::TResult WritewCmd::ack(GCFEvent& e) return(GCFEvent::HANDLED); } +//---- TESTDDR ---------------------------------------------------------------- +TestDdrCmd::TestDdrCmd(GCFPortInterface& port) : Command(port), + itsCmdStage(0),itsMp(0), itsAddr(0), itsAddrLine(0), itsTestPatern(1), itsWordLo(0), itsWordHi(0) +{ + logMessage(cout,"\n==== TBB-board, test ddr =================================================\n"); +} + +//----------------------------------------------------------------------------- +void TestDdrCmd::send() +{ + if ((itsCmdStage == 0)&&(itsMp == 0)&&(itsAddrLine == 0)) { + logMessage(cout,formatString("Testing DDR memory address lines of board %d\n",getBoard())); + logMessage(cout,"Mp Addr Write Read "); + logMessage(cout,"Nr Line DDR DDR Info "); + logMessage(cout,"-- ----- ----- ----- -----------------------------"); + } + + if ((itsCmdStage == 2)&&(itsMp == 0)&&(itsTestPatern == 1)) { + logMessage(cout,formatString("\nTesting DDR memory data lines of board %d\n",getBoard())); + logMessage(cout,"Mp Write Read Write Read "); + logMessage(cout,"Nr WordLow WordLow WordHigh WordHigh Info "); + logMessage(cout,"-- -------- -------- -------- -------- ------------------------"); + } + switch (itsCmdStage) { + + case 0: { + TBBWritewEvent event; + event.board = getBoard(); + event.mp = itsMp; + event.addr = itsAddr; + event.wordlo = itsAddrLine; + event.wordhi = (itsMp << 8) + itsAddrLine; + itsPort.send(event); + } break; + + case 1: { + TBBReadwEvent event; + event.board = getBoard(); + event.mp = itsMp; + event.addr = itsAddr; + itsPort.send(event); + } break; + + case 2: { + TBBWritewEvent event; + event.board = getBoard(); + event.mp = itsMp; + event.addr = itsAddr; + event.wordlo = itsTestPatern; + event.wordhi = ~itsTestPatern; + itsPort.send(event); + } break; + + case 3: { + TBBReadwEvent event; + event.board = getBoard(); + event.mp = itsMp; + event.addr = itsAddr; + itsPort.send(event); + } break; + + default: break; + } + + itsPort.setTimer((long)1); +} + +//----------------------------------------------------------------------------- +GCFEvent::TResult TestDdrCmd::ack(GCFEvent& e) +{ + switch (itsCmdStage) { + case 0: { + TBBWritewAckEvent ack(e); + if (!(ack.status_mask & TBB_SUCCESS)) { + logMessage(cout,formatString(" %2d %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str())); + } + itsAddr = (1 << itsAddrLine); + itsAddrLine++; + if (itsAddrLine == 28) { + itsAddr = 0; + itsAddrLine = 0; + itsCmdStage = 1; + } + }break; + + case 1: { + TBBReadwAckEvent ack(e); + if (ack.status_mask & TBB_SUCCESS) { + if (ack.wordlo == itsAddrLine) { + logMessage(cout,formatString("%2d %5d %5d %5d SAME", + itsMp, itsAddrLine, itsAddrLine, ack.wordlo)); + } else { + logMessage(cout,formatString("%2d %5d %5d %5d FAULT", + itsMp, itsAddrLine, itsAddrLine, ack.wordlo )); + } + } else { + logMessage(cout,formatString(" %2d %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str())); + } + itsAddr = (1 << itsAddrLine); + itsAddrLine++; + if (itsAddrLine == 28) { + itsAddr = 0; + itsAddrLine = 0; + itsCmdStage = 0; + itsMp++; + if (itsMp == 4) { + itsMp = 0; + itsAddr = 0; + itsCmdStage = 2; + //setCmdDone(true); + } + } + } break; + + case 2: { + TBBWritewAckEvent ack(e); + if (!(ack.status_mask & TBB_SUCCESS)) { + logMessage(cout,formatString(" %2d %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str())); + } + itsAddr++; + itsTestPatern <<= 1; + //if (itsTestPatern == 0) itsTestPatern == 1; + + if (itsTestPatern == 0x00000000) { + itsAddr = 0; + itsTestPatern = 1; + itsCmdStage = 3; + } + }break; + + case 3: { + TBBReadwAckEvent ack(e); + if (ack.status_mask & TBB_SUCCESS) { + if ((ack.wordlo == itsTestPatern)&&(ack.wordhi == ~itsTestPatern)) { + logMessage(cout,formatString("%2d %08X %08X %08X %08X SAME", + itsMp, itsTestPatern, ack.wordlo, ~itsTestPatern, ack.wordhi)); + } else { + logMessage(cout,formatString("%2d %08X %08X %08X %08X FAULT", + itsMp, itsTestPatern, ack.wordlo, ~itsTestPatern, ack.wordhi)); + } + } else { + logMessage(cout,formatString(" %2d %s",getBoard(), getDriverErrorStr(ack.status_mask).c_str())); + } + itsAddr++; + itsTestPatern <<= 1; + //if (itsTestPatern == 0) itsTestPatern == 1; + + if (itsTestPatern == 0x00000000) { + itsAddr = 0; + itsTestPatern = 1; + itsCmdStage = 2; + itsMp++; + if (itsMp == 4) { + setCmdDone(true); + } + } + } break; + + + default: break; + } + return(GCFEvent::HANDLED); +} + //---- READR ------------------------------------------------------------------- ReadrCmd::ReadrCmd(GCFPortInterface& port) : Command(port) { @@ -913,12 +1258,13 @@ void ReadrCmd::send() TBBReadrEvent event; event.board = (uint32)getBoard(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult ReadrCmd::ack(GCFEvent& e) { - TBBReadrackEvent ack(e); + TBBReadrAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -948,12 +1294,13 @@ void WriterCmd::send() TBBWriterEvent event; event.board = (uint32)getBoard(); itsPort.send(event); + itsPort.setTimer((long)1); } //----------------------------------------------------------------------------- GCFEvent::TResult WriterCmd::ack(GCFEvent& e) { - TBBWriterackEvent ack(e); + TBBWriterAckEvent ack(e); logMessage(cout,"TBB Info"); logMessage(cout,"--- -------------------------------------------------------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -987,8 +1334,9 @@ void ReadPageCmd::send() switch (itsCmdStage) { case 0: { - TBBRcuinfoEvent send; + TBBRcuInfoEvent send; itsPort.send(send); + itsPort.setTimer((long)1); } break; case 1: { @@ -1001,6 +1349,7 @@ void ReadPageCmd::send() send.data[1] = 0; send.data[2] = 0; itsPort.send(send); + itsPort.setTimer((long)1); LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.data[0])); @@ -1016,6 +1365,7 @@ void ReadPageCmd::send() send.data[1] = 0; send.data[2] = 0; itsPort.send(send); + itsPort.setTimer((long)1); LOG_DEBUG_STR(formatString("Writer[%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.data[0])); @@ -1029,8 +1379,9 @@ void ReadPageCmd::send() send.regid = REGID2; send.pagelength = 256; send.pageaddr = 0; - itsPort.send(send); + itsPort.setTimer((long)1); + LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.pagelength,send.pageaddr)); } break; @@ -1043,8 +1394,9 @@ void ReadPageCmd::send() send.regid = REGID2; send.pagelength = 256; send.pageaddr = 256; - itsPort.send(send); + itsPort.setTimer((long)1); + LOG_DEBUG_STR(formatString("Readx[%x][%x][%x][%x][%x]", send.mp,send.pid,send.regid,send.pagelength,send.pageaddr)); } break; @@ -1063,13 +1415,13 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) case 0: { int rcu; rcu = getRcu(); - TBBRcuinfoackEvent ack(e); + TBBRcuInfoAckEvent ack(e); itsState = ack.rcu_state[rcu]; itsStartAddr = ack.rcu_start_addr[rcu]; itsSize = ack.rcu_pages[rcu]; itsBoard = ack.rcu_on_board[rcu]; - itsMp = (int32)((int32)ack.rcu_on_input[rcu] / 4); - logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",rcu,itsBoard,itsMp)); + itsMp = static_cast<int32>(ack.rcu_on_input[rcu]) / 4; + //logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",rcu,itsBoard,itsMp)); itsAddr = itsStartAddr; if (itsState == 'F') { @@ -1079,7 +1431,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } break; case 1: { - TBBWriterackEvent ack(e); + TBBWriterAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str())); itsCmdStage = 10; @@ -1087,7 +1439,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } break; case 2: { - TBBWriterackEvent ack(e); + TBBWriterAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str())); itsCmdStage = 10; @@ -1095,7 +1447,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } break; case 3: { - TBBReadxackEvent ack(e); + TBBReadxAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str())); itsCmdStage = 10; @@ -1108,7 +1460,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } break; case 4: { - TBBReadxackEvent ack(e); + TBBReadxAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str())); itsCmdStage = 10; @@ -1127,20 +1479,20 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) itsCmdStage++; if (itsCmdStage < 5) { - itsPort.setTimer(0.01); + //itsPort.setTimer(0.01); } else { if (itsPage == 0) { - itsStationId = (int)(itsData[0] & 0xFF); - itsRspId = (int)((itsData[0] >> 8) & 0xFF); - itsRcuId = (int)((itsData[0] >> 16) & 0xFF); - itsSampleFreq = (int)((itsData[0] >> 24) & 0xFF); - itsTime = (time_t)itsData[2]-1; - itsSampleNr = (int)itsData[3]; + itsStationId = static_cast<int>(itsData[0] & 0xFF); + itsRspId = static_cast<int>((itsData[0] >> 8) & 0xFF); + itsRcuId = static_cast<int>((itsData[0] >> 16) & 0xFF); + itsSampleFreq = static_cast<int>((itsData[0] >> 24) & 0xFF); + itsTime = static_cast<time_t>(itsData[2])-1; + itsSampleNr = static_cast<int>(itsData[3]); } - itsSamplesPerFrame = (int)(itsData[4] & 0xFFFF); - itsFreqBands = (int)((itsData[4] >> 16) & 0xFFFF); + itsSamplesPerFrame = static_cast<int>(itsData[4] & 0xFFFF); + itsFreqBands = static_cast<int>((itsData[4] >> 16) & 0xFFFF); int sample_cnt = 0; int val_cnt = 0; @@ -1152,12 +1504,12 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) if (itsSamplesPerFrame < 975) { itsTotalSamples += itsSamplesPerFrame; itsTotalBands += itsFreqBands; - logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands)); + //logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands)); // convert uint32 to complex int16 while (sample_cnt < itsSamplesPerFrame) { // get complex sample - val[val_cnt++] = (int16) (itsData[data_cnt] & 0xFFFF); // re part - val[val_cnt++] = (int16)((itsData[data_cnt++] >> 16) & 0xFFFF); // im part + val[val_cnt++] = static_cast<int16>(itsData[data_cnt] & 0xFFFF); // re part + val[val_cnt++] = static_cast<int16>((itsData[data_cnt++] >> 16) & 0xFFFF); // im part sample_cnt++; } } @@ -1166,7 +1518,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) if (itsSamplesPerFrame < 1299) { itsTotalSamples += itsSamplesPerFrame; itsTotalBands += itsFreqBands; - logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands)); + //logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands)); // convert uint32 to int12 uint32 data[3]; @@ -1177,14 +1529,14 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) data[2] = itsData[data_cnt++]; // extract 8 values of 12 bit - val[val_cnt++] = (int16) (data[0] & 0x00000FFF); - val[val_cnt++] = (int16) ((data[0] & 0x00FFF000) >> 12); - val[val_cnt++] = (int16)(((data[0] & 0xFF000000) >> 24) | ((data[1] & 0x0000000F) << 8)); - val[val_cnt++] = (int16) ((data[1] & 0x0000FFF0) >> 4 ); - val[val_cnt++] = (int16) ((data[1] & 0x0FFF0000) >> 16); - val[val_cnt++] = (int16)(((data[1] & 0xF0000000) >> 28) | ((data[2] & 0x000000FF) << 4)); - val[val_cnt++] = (int16) ((data[2] & 0x000FFF00) >> 8); - val[val_cnt++] = (int16) ((data[2] & 0xFFF00000) >> 20); + val[val_cnt++] = static_cast<int16>( data[0] & 0x00000FFF); + val[val_cnt++] = static_cast<int16>(( data[0] & 0x00FFF000) >> 12); + val[val_cnt++] = static_cast<int16>(((data[0] & 0xFF000000) >> 24) | ((data[1] & 0x0000000F) << 8)); + val[val_cnt++] = static_cast<int16>(( data[1] & 0x0000FFF0) >> 4 ); + val[val_cnt++] = static_cast<int16>(( data[1] & 0x0FFF0000) >> 16); + val[val_cnt++] = static_cast<int16>(((data[1] & 0xF0000000) >> 28) | ((data[2] & 0x000000FF) << 4)); + val[val_cnt++] = static_cast<int16>(( data[2] & 0x000FFF00) >> 8); + val[val_cnt++] = static_cast<int16>(( data[2] & 0xFFF00000) >> 20); sample_cnt += 8; } @@ -1204,7 +1556,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) char timestring[256]; strftime(timestring, 255, "%Y%m%d_%H%M%S", gmtime(&itsTime)); - snprintf(basefilename, PATH_MAX, "%s_%02d%02d", timestring,itsStationId,itsRcuId); + snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId); snprintf(filename, PATH_MAX, "%s.dat",basefilename); file = fopen(filename,"a"); @@ -1215,7 +1567,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) if (itsPage < itsPages) { itsCmdStage = 1; itsAddr = itsStartAddr + itsPage; - itsPort.setTimer(0.05); + //itsPort.setTimer(0.02); } else { // print page information strftime(timestring, 255, "%Y-%m-%d %H:%M:%S", gmtime(&itsTime)); @@ -1248,6 +1600,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) fprintf(file,line[lnr]); fprintf(file,"\n"); } + logMessage(cout,"\n"); fclose(file); } } else { @@ -1279,7 +1632,12 @@ void TBBCtl::help() logMessage(cout,"tbbctl --stop [--select=<set>] # stop recording on all selected rcu's"); logMessage(cout,"tbbctl --rcuinfo [--select=<set>] # list rcu info for all allocated rcu's\n"); - logMessage(cout,"tbbctl --trigclr=channel # clear tigger message for all selected channel"); + logMessage(cout,"tbbctl --release [--select=<set>] # release trigger system for all selected rcu's"); + logMessage(cout,"tbbctl --generate [--select=<set>] # generate a trigger for all selected rcu's"); + logMessage(cout,"tbbctl --setup=level,mode,filter,window,dummy [--select=<set>] # setup trigger system for all selected rcu's"); + logMessage(cout,"tbbctl --coef=c0,c1,c2,c3 [--select=<set>] # set trigger coeffients for all selected rcu's"); + logMessage(cout,"tbbctl --triginfo=rcu # get trigger info for all selected rcu's\n"); + logMessage(cout,"tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages # transfer recorded data from rcunr to CEP"); logMessage(cout,"tbbctl --mode=board,[transient | subbands] # set mode to configure UDP/IP header for CEP"); logMessage(cout,"tbbctl --version [--select=<set>] # get version information from selected boards"); @@ -1290,10 +1648,12 @@ void TBBCtl::help() logMessage(cout,"tbbctl --readimage=board,image # read image from flash to file"); logMessage(cout,"tbbctl --writeimage=boardnr,imagenr,version,tpfilename,mpfilename # write tp and mp file to imagenr on boardnr"); logMessage(cout," # version is the version of the image stored"); - logMessage(cout,"tbbctl --imageinfo=board # read info from all images on board"); + logMessage(cout,"tbbctl --imageinfo=board # read info from all images on board\n"); + logMessage(cout,"tbbctl --readddr=board,mp,addr,size # read 2 words from DDR2 memory"); logMessage(cout,"tbbctl --writeddr=board,mp,addr,wordL,wordH # write 2 words to DDR2 memory at addr"); - logMessage(cout,"tbbctl --readpage=board,mp,addr,pages # read n pages from DDR2 memory starting at addr"); + logMessage(cout,"tbbctl --testddr=board # test all adress lines from DDR2 memory"); + logMessage(cout,"tbbctl --readpage=rcunr,npages # read from rcunr, npages from DDR2 memory"); logMessage(cout,"tbbctl --clear [--select=<set>] # clear selected board"); logMessage(cout,"tbbctl --reset [--select=<set>] # reset to factory images on selected boards"); logMessage(cout,"tbbctl --config=imagenr [--select=<set>] # reconfigure TP and MP's with imagenr [0..31] on "); @@ -1342,13 +1702,13 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port) case F_CONNECTED: { if (itsServerPort.isConnected()) { itsServerPort.cancelAllTimers(); - TBBGetconfigEvent getconfig; + TBBGetConfigEvent getconfig; itsServerPort.send(getconfig); } } break; - case TBB_GETCONFIGACK: { - TBBGetconfigackEvent ack(e); + case TBB_GET_CONFIG_ACK: { + TBBGetConfigAckEvent ack(e); itsMaxBoards = ack.max_boards; itsActiveBoards = ack.active_boards_mask; itsMaxChannels = itsMaxBoards * 16; @@ -1356,9 +1716,15 @@ GCFEvent::TResult TBBCtl::initial(GCFEvent& e, GCFPortInterface& port) //logMessage(cout,formatString("Max nr of Channels = %d\n",itsMaxChannels)); //logMessage(cout,formatString("Active boards mask = 0x%03X",itsActiveBoards)); - TRAN(TBBCtl::docommand); + // send subscribe + TBBSubscribeEvent subscribe; + itsServerPort.send(subscribe); } break; - + + case TBB_SUBSCRIBE_ACK: { + TRAN(TBBCtl::docommand); + } break; + case F_DISCONNECTED: { //port.setTimer((long)1); port.close(); @@ -1410,45 +1776,71 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port) } break; case F_TIMER: { - itsCommand->send(); + //itsCommand->send(); + logMessage(cout,"Timeout, tbbctl stopped\n"); + TBBUnsubscribeEvent unsubscribe; + itsServerPort.send(unsubscribe); + GCFTask::stop(); } break; - case TBB_ALLOCACK: - case TBB_RCUINFOACK: - case TBB_FREEACK: - case TBB_RECORDACK: - case TBB_STOPACK: - case TBB_TRIGCLRACK: - case TBB_READACK: - case TBB_MODEACK: - case TBB_VERSIONACK: - case TBB_SIZEACK: - case TBB_STATUSACK: - case TBB_CLEARACK: - case TBB_RESETACK: - case TBB_CONFIGACK: + case TBB_TRIG_GENERATE_ACK: + case TBB_TRIGGER: { + itsServerPort.cancelAllTimers(); + itsServerPort.setTimer((long)5); + status = itsCommand->ack(e); // handle the acknowledgement + } break; + + + + case TBB_ALLOC_ACK: + case TBB_RCU_INFO_ACK: + case TBB_FREE_ACK: + case TBB_RECORD_ACK: + case TBB_STOP_ACK: + case TBB_TRIG_RELEASE_ACK: + case TBB_TRIG_SETUP_ACK: + case TBB_TRIG_COEF_ACK: + case TBB_TRIG_INFO_ACK: + case TBB_READ_ACK: + case TBB_MODE_ACK: + case TBB_VERSION_ACK: + case TBB_SIZE_ACK: + case TBB_STATUS_ACK: + case TBB_CLEAR_ACK: + case TBB_RESET_ACK: + case TBB_CONFIG_ACK: case TBB_ERASE_IMAGE_ACK: case TBB_READ_IMAGE_ACK: case TBB_WRITE_IMAGE_ACK: - case TBB_IMAGE_INFO_ACK: - case TBB_READWACK: - case TBB_WRITEWACK: - case TBB_READRACK: - case TBB_WRITERACK: - case TBB_READXACK: { + case TBB_IMAGE_INFO_ACK: + case TBB_READW_ACK: + case TBB_WRITEW_ACK: + case TBB_READR_ACK: + case TBB_WRITER_ACK: + case TBB_READX_ACK: { + itsServerPort.cancelAllTimers(); status = itsCommand->ack(e); // handle the acknowledgement - if (itsCommand->isCmdDone()) { - GCFTask::stop(); + if (!itsCommand->isCmdDone()) { + // not done send next command + itsCommand->send(); } } break; default: { logMessage(cerr,"Error: unhandled event."); logMessage(cerr,formatString("Error: unhandled event. %d",e.signal)); + TBBUnsubscribeEvent unsubscribe; + itsServerPort.send(unsubscribe); GCFTask::stop(); } break; } - + + if (itsCommand->isCmdDone()) { + TBBUnsubscribeEvent unsubscribe; + itsServerPort.send(unsubscribe); + GCFTask::stop(); + } + return(status); } @@ -1469,7 +1861,11 @@ Command* TBBCtl::parse_options(int argc, char** argv) { "free", no_argument, 0, 'f' }, //ok ?? { "record", no_argument, 0, 'r' }, //ok ?? { "stop", no_argument, 0, 's' }, //ok ?? - { "trigclr", required_argument, 0, 't' }, //ok ?? + { "release", no_argument, 0, 'e' }, //ok ?? + { "generate", no_argument, 0, 'g' }, //ok ?? + { "setup", required_argument, 0, 't' }, //ok ?? + { "coef", required_argument, 0, 'c' }, //ok ?? + { "triginfo", required_argument, 0, 'I' }, //ok ?? { "read", required_argument, 0, 'R' }, //ok ?? { "mode", required_argument, 0, 'm' }, //ok ?? { "version", no_argument, 0, 'v' }, //ok @@ -1485,6 +1881,7 @@ Command* TBBCtl::parse_options(int argc, char** argv) { "imageinfo", required_argument, 0, '8' }, //ok { "readddr", required_argument, 0, '4' }, //ok { "writeddr", required_argument, 0, '5' }, //ok + { "testddr", required_argument, 0, '9' }, //ok { "readreg", required_argument, 0, '6' }, //ok not in help { "writereg", required_argument, 0, '7' }, //ok not in help { "help", no_argument, 0, 'h' }, //ok ?? @@ -1493,7 +1890,7 @@ Command* TBBCtl::parse_options(int argc, char** argv) int option_index = 0; int c = getopt_long(argc, argv, - "l:afrst:R:m:vzAp:CZS:1:2:3:8:4:5:6:7:h", + "l:afrsegt:c:I:R:m:vzAp:CZS:1:2:3:8:4:5:9:6:7:h", long_options, &option_index); if (c == -1) @@ -1560,10 +1957,10 @@ Command* TBBCtl::parse_options(int argc, char** argv) command->setCmdType(RCUCMD); } break; - case 't': { // --trigclear + case 'e': { // --trigrelease if (command) delete command; - TrigclrCmd* trigclrcmd = new TrigclrCmd(itsServerPort); - command = trigclrcmd; + TrigReleaseCmd* trigreleasecmd = new TrigReleaseCmd(itsServerPort); + command = trigreleasecmd; if (optarg) { int channel = 0; int numitems = sscanf(optarg, "%d",&channel); @@ -1580,6 +1977,81 @@ Command* TBBCtl::parse_options(int argc, char** argv) command->setCmdType(RCUCMD); } break; + case 'g': { // --triggenerate + if (command) delete command; + TrigGenerateCmd* triggeneratecmd = new TrigGenerateCmd(itsServerPort); + command = triggeneratecmd; + command->setCmdType(RCUCMD); + } break; + + case 't': { // --trigsetup + if (command) delete command; + TrigSetupCmd* trigsetupcmd = new TrigSetupCmd(itsServerPort); + command = trigsetupcmd; + if (optarg) { + int level = 0; + int mode = 0; + int filter = 0; + int window = 0; + int dummy = 0; + int numitems = sscanf(optarg, "%x,%x,%x,%x,%x",&level, &mode, &filter, &window, &dummy); + if (numitems < 5 || numitems == EOF) { + logMessage(cerr,"Error: invalid number of arguments. Should be of the format " + "'--trigsetup=level,mode,filter,window,dummy' (all hex values)"); + exit(EXIT_FAILURE); + } + trigsetupcmd->setLevel(static_cast<uint32>(level)); + trigsetupcmd->setMode(static_cast<uint32>(mode)); + trigsetupcmd->setFilter(static_cast<uint32>(filter)); + trigsetupcmd->setWindow(static_cast<uint32>(window)); + trigsetupcmd->setDummy(static_cast<uint32>(dummy)); + } + command->setCmdType(BOARDCMD); + } break; + + case 'c': { // --trigcoef + if (command) delete command; + TrigCoefficientCmd* trigcoefficientcmd = new TrigCoefficientCmd(itsServerPort); + command = trigcoefficientcmd; + if (optarg) { + int c0 = 0; + int c1 = 0; + int c2 = 0; + int c3 = 0; + int numitems = sscanf(optarg, "%x,%x,%x,%x",&c0, &c1, &c2, &c3); + if (numitems < 4 || numitems == EOF) { + logMessage(cerr,"Error: invalid number of arguments. Should be of the format " + "'--trigcoef=c0,c1,c2,c3' (all hex values)"); + exit(EXIT_FAILURE); + } + trigcoefficientcmd->setC0(static_cast<int16>(c0)); + trigcoefficientcmd->setC1(static_cast<int16>(c1)); + trigcoefficientcmd->setC2(static_cast<int16>(c2)); + trigcoefficientcmd->setC3(static_cast<int16>(c3)); + } + command->setCmdType(BOARDCMD); + } break; + + case 'I': { // --triginfo + if (command) delete command; + TrigInfoCmd* triginfocmd = new TrigInfoCmd(itsServerPort); + command = triginfocmd; + if (optarg) { + int channel = 0; + int numitems = sscanf(optarg, "%d",&channel); + if (numitems < 1 || numitems == EOF) { + logMessage(cerr,"Error: invalid number of arguments. Should be of the format " + "'--triginfo=rcu' "); + exit(EXIT_FAILURE); + } + select.clear(); + select.push_back(channel); + command->setSelected(true); + } + command->setCmdType(RCUCMD); + } break; + + case 'R': { // --read if (command) delete command; ReadCmd* readcmd = new ReadCmd(itsServerPort); @@ -1882,6 +2354,31 @@ Command* TBBCtl::parse_options(int argc, char** argv) } command->setCmdType(BOARDCMD); } break; + + case '9': { // --testddr + if (command) delete command; + TestDdrCmd* testddrcmd = new TestDdrCmd(itsServerPort); + command = testddrcmd; + if (optarg) { + int32 board = 0; + + int numitems = sscanf(optarg, "%d", &board); + if (numitems < 1 || numitems == EOF || board < 0 || board > 11) { + logMessage(cerr,"Error: invalid write ddr value. Should be of the format " + "'--testddr=board' where board= 0..11"); + exit(EXIT_FAILURE); + } + select.clear(); + select.push_back(board); + command->setSelected(true); + } else { + logMessage(cerr,"Error: invalid write ddr value. Should be of the format " + "'--testddr=board' where board= 0..11"); + exit(EXIT_FAILURE); + } + command->setCmdType(BOARDCMD); + } break; + /* case '6': { // --readr if (command) delete command; @@ -1904,6 +2401,7 @@ Command* TBBCtl::parse_options(int argc, char** argv) case '?': default: { + help(); exit(EXIT_FAILURE); } break; } diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h index 98f504ce58c6d13f11af168bc8fa4a0ededce4db..da6c72e79a02a869ab06987923f03b688c24e090 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h @@ -313,11 +313,73 @@ class StopCmd : public Command }; //----------------------------------------------------------------------------- -class TrigclrCmd : public Command +class TrigReleaseCmd : public Command { public: - TrigclrCmd(GCFPortInterface& port); - virtual ~TrigclrCmd() { } + TrigReleaseCmd(GCFPortInterface& port); + virtual ~TrigReleaseCmd() { } + virtual void send(); + virtual GCFEvent::TResult ack(GCFEvent& e); + private: +}; + +//----------------------------------------------------------------------------- +class TrigGenerateCmd : public Command +{ + public: + TrigGenerateCmd(GCFPortInterface& port); + virtual ~TrigGenerateCmd() { } + virtual void send(); + virtual GCFEvent::TResult ack(GCFEvent& e); + private: +}; + +//----------------------------------------------------------------------------- +class TrigSetupCmd : public Command +{ + public: + TrigSetupCmd(GCFPortInterface& port); + 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; } + private: + uint32 itsLevel; + uint32 itsMode; + uint32 itsFilter; + uint32 itsWindow; + uint32 itsDummy; +}; + +//----------------------------------------------------------------------------- +class TrigCoefficientCmd : public Command +{ + public: + TrigCoefficientCmd(GCFPortInterface& port); + virtual ~TrigCoefficientCmd() { } + virtual void send(); + virtual GCFEvent::TResult ack(GCFEvent& e); + void setC0(int16 c0) { itsC0 = c0; } + void setC1(int16 c1) { itsC1 = c1; } + void setC2(int16 c2) { itsC2 = c2; } + void setC3(int16 c3) { itsC3 = c3; } + private: + int16 itsC0; + int16 itsC1; + int16 itsC2; + int16 itsC3; +}; + +//----------------------------------------------------------------------------- +class TrigInfoCmd : public Command +{ + public: + TrigInfoCmd(GCFPortInterface& port); + virtual ~TrigInfoCmd() { } virtual void send(); virtual GCFEvent::TResult ack(GCFEvent& e); private: @@ -516,6 +578,24 @@ class WritewCmd : public Command uint32 itsWordHi; }; +//----------------------------------------------------------------------------- +class TestDdrCmd : public Command +{ + public: + TestDdrCmd(GCFPortInterface& port); + virtual ~TestDdrCmd() { } + virtual void send(); + virtual GCFEvent::TResult ack(GCFEvent& e); + private: + int32 itsCmdStage; + uint32 itsMp; + uint32 itsAddr; + uint32 itsAddrLine; + uint32 itsTestPatern; + uint32 itsWordLo; + uint32 itsWordHi; +}; + //----------------------------------------------------------------------------- class ReadrCmd : public Command {