Skip to content
Snippets Groups Projects
Commit ad735fb1 authored by Pieter Donker's avatar Pieter Donker
Browse files

Bug 335 :further development of TBBDriver

parent 227f3541
No related branches found
No related tags found
No related merge requests found
Showing
with 1168 additions and 1142 deletions
......@@ -65,7 +65,7 @@ namespace LOFAR {
int32 itsStage;
//uint32 itsBoardMask; // mask indicates the boards to communicate with
uint32 itsRcuStatus;
uint32 itsChannelMask[MAX_N_TBBBOARDS];
uint32 itsChannelMask[MAX_N_TBBOARDS];
TPAllocEvent *itsTPE;
TPAllocAckEvent *itsTPackE;
......
......@@ -41,7 +41,7 @@ ArpCmd::ArpCmd()
itsTBBE = 0;
itsTBBackE = new TBBArpAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
}
......
......@@ -41,7 +41,7 @@ ArpModeCmd::ArpModeCmd()
itsTBBE = 0;
itsTBBackE = new TBBArpModeAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
}
......
......@@ -155,8 +155,8 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa
TS->setBoardState(itsCmd->getBoardNr(),boardError);
}
itsCmd->saveTpAckEvent(event); // max retries or done, save zero's
if (itsCmd->getSleepTime() > 0) {
itsSleepTimer->setTimer((long)itsCmd->getSleepTime());
if (itsCmd->getSleepTime() > 0.0) {
itsSleepTimer->setTimer(itsCmd->getSleepTime());
itsCmd->setSleepTime(0.0);
} else {
TRAN(BoardCmdHandler::send_state);
......@@ -178,8 +178,8 @@ GCFEvent::TResult BoardCmdHandler::waitack_state(GCFEvent& event, GCFPortInterfa
if (itsCmd->isValid(event)) {
port.cancelAllTimers();
itsCmd->saveTpAckEvent(event);
if (itsCmd->getSleepTime()) {
itsSleepTimer->setTimer((long)itsCmd->getSleepTime());
if (itsCmd->getSleepTime() > 0.0) {
itsSleepTimer->setTimer(itsCmd->getSleepTime());
itsCmd->setSleepTime(0);
} else {
TRAN(BoardCmdHandler::send_state);
......
......@@ -41,7 +41,7 @@ ClearCmd::ClearCmd()
itsTBBE = 0;
itsTBBackE = new TBBClearAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
}
setWaitAck(true);
......
......@@ -41,7 +41,7 @@ ConfigCmd::ConfigCmd()
itsTBBE = 0;
itsTBBackE = new TBBConfigAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
}
setWaitAck(true);
......@@ -104,7 +104,8 @@ void ConfigCmd::saveTpAckEvent(GCFEvent& event)
itsTBBackE->status_mask[getBoardNr()] |= TBB_COMM_ERROR;
} else {
itsTPackE = new TPConfigAckEvent(event);
TS->setImageNr(getBoardNr(), itsTPE->imagenr);
TS->setFreeToReset(getBoardNr(), false);
if ((itsTPackE->status >= 0xF0) && (itsTPackE->status <= 0xF6))
itsTBBackE->status_mask[getBoardNr()] |= (1 << (16 + (itsTPackE->status & 0x0F)));
......@@ -112,6 +113,9 @@ void ConfigCmd::saveTpAckEvent(GCFEvent& event)
delete itsTPackE;
}
nextBoardNr();
if (isDone()) {
setSleepTime(15.0);
}
}
// ----------------------------------------------------------------------------
......
......@@ -100,7 +100,7 @@ void TbbSettings::getTbbSettings()
}
// setMaxBoards() must be set 2e
setMaxBoards(MAX_N_TBBBOARDS);
setMaxBoards(MAX_N_TBBOARDS);
try { itsSaveTriggersToFile = globalParameterSet()->getInt32("TBBDriver.SAVE_TRIGGERS_TO_FILE"); }
catch (...) { LOG_INFO_STR(formatString("TBBDriver.SAVE_TRIGGERS_TO_FILE not found")); }
......@@ -219,8 +219,10 @@ void TbbSettings::setMaxBoards (int32 maxboards)
itsBoardInfo = new BoardInfo[itsMaxBoards];
for (int nr = 0;nr < itsMaxBoards; nr++) {
itsBoardInfo[nr].boardState = boardReset;
itsBoardInfo[nr].boardState = setImage1;
itsBoardInfo[nr].memorySize = 0;
itsBoardInfo[nr].imageNr = 0;
itsBoardInfo[nr].freeToReset = true;
itsBoardInfo[nr].srcIp = "";
itsBoardInfo[nr].dstIp = "";
itsBoardInfo[nr].srcMac = "";
......
......@@ -26,8 +26,6 @@
#include <APL/TBB_Protocol/TBB_Protocol.ph>
#include "TP_Protocol.ph"
#include <GCF/TM/GCF_Control.h>
//#include <GCF/TM/GCF_ETHRawPort.h>
//#include <GCF/TM/GCF_DevicePort.h>
#include <Common/LofarTypes.h>
......@@ -35,10 +33,10 @@
namespace LOFAR {
namespace TBB {
static const int DRIVER_VERSION = 200; // 2.00
static const int DRIVER_VERSION = 201; // 2.00
enum BoardStateT {noBoard, setImage1, image1Set, clearBoard, boardCleared, freeBoard, boardFreed, boardReady, boardError};
//enum BoardStateT {noBoard, newBoard, boardReset, boardCleared, boardFreed, boardReady, boardError};
enum BoardStateT {noBoard, resetBoard, boardReset, clearBoard, boardCleared, freeBoard, boardFreed, boardReady, boardError};
// info for all channels
struct ChannelInfo
{
......@@ -68,6 +66,8 @@ struct BoardInfo
GCFPortInterface* port;
BoardStateT boardState;
uint32 memorySize;
uint32 imageNr;
bool freeToReset;
string srcIp;
string dstIp;
string srcMac;
......@@ -166,6 +166,11 @@ public:
uint32 getMemorySize(int32 boardnr);
void setMemorySize(int32 boardnr,uint32 pages);
uint32 getImageNr(int32 boardnr);
void setImageNr(int32 boardnr,uint32 image);
bool getFreeToReset(int32 boardnr);
void setFreeToReset(int32 boardnr, bool reset);
friend class TBBDriver;
protected: // note TBBDriver must be able to set them
......@@ -282,6 +287,10 @@ inline void TbbSettings::setTriggerMode(int16 triggermode){ itsTriggerMode = tri
//---- inline functions for board information ------------
inline uint32 TbbSettings::getMemorySize(int32 boardnr) { return (itsBoardInfo[boardnr].memorySize); }
inline void TbbSettings::setMemorySize(int32 boardnr,uint32 pages) { itsBoardInfo[boardnr].memorySize = pages; }
inline uint32 TbbSettings::getImageNr(int32 boardnr) { return (itsBoardInfo[boardnr].imageNr); }
inline void TbbSettings::setImageNr(int32 boardnr,uint32 image) { itsBoardInfo[boardnr].imageNr = image; }
inline bool TbbSettings::getFreeToReset(int32 boardnr) { return (itsBoardInfo[boardnr].freeToReset); }
inline void TbbSettings::setFreeToReset(int32 boardnr, bool reset) { itsBoardInfo[boardnr].freeToReset = reset; }
} // namespace TBB
} // namespace LOFAR
......
......@@ -41,7 +41,7 @@ FreeCmd::FreeCmd():
itsTBBE = 0;
itsTBBackE = new TBBFreeAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
itsChannelMask[boardnr] = 0;
}
......
......@@ -61,7 +61,7 @@ namespace LOFAR {
TbbSettings *TS;
int32 itsBoardNr;
uint32 itsChannelMask[MAX_N_TBBBOARDS];
uint32 itsChannelMask[MAX_N_TBBOARDS];
bool itsBoardFreeAll;
uint32 itsRcuStatus;
......
......@@ -82,15 +82,15 @@ void ImageInfoCmd::saveTbbEvent(GCFEvent& event)
itsTBBE = new TBBImageInfoEvent(event);
setBoardNr(itsTBBE->board);
itsTBBackE->board = itsTBBE->board;
itsTBBackE->board = getBoardNr();
itsTBBackE->status_mask = 0;
itsTBBackE->active_image = TS->getImageNr(getBoardNr());
itsImage = 0;
// initialize TP send frame
itsTPE->opcode = TPREADF;
itsTPE->status = 0;
delete itsTBBE;
}
......
......@@ -41,7 +41,7 @@ RecordCmd::RecordCmd():
itsTBBE = 0;
itsTBBackE = new TBBRecordAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
itsChannelMask[boardnr] = 0;
}
......
......@@ -60,7 +60,7 @@ namespace LOFAR {
private:
TbbSettings *TS;
uint32 itsChannelMask[MAX_N_TBBBOARDS];
uint32 itsChannelMask[MAX_N_TBBOARDS];
uint32 itsRcuStatus;
TPRecordEvent *itsTPE;
......
......@@ -42,7 +42,7 @@ ResetCmd::ResetCmd():
itsTBBE = 0;
itsTBBackE = new TBBResetAckEvent();
for(int boardnr = 0; boardnr < MAX_N_TBBBOARDS; boardnr++) {
for(int boardnr = 0; boardnr < MAX_N_TBBOARDS; boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
}
setWaitAck(true);
......@@ -115,7 +115,7 @@ void ResetCmd::saveTpAckEvent(GCFEvent& event)
} else {
itsTPackE = new TPResetAckEvent(event);
if (itsTPackE->status == 0) {
TS->setBoardState(getBoardNr(),boardReset);
TS->setBoardState(getBoardNr(),setImage1);
} else {
TS->setBoardState(getBoardNr(),boardError);
}
......@@ -134,7 +134,7 @@ void ResetCmd::saveTpAckEvent(GCFEvent& event)
if (itsBoardNr < TS->maxBoards()) {
setBoardNr(itsBoardNr);
} else {
setSleepTime(3.0);
setSleepTime(20.0);
setDone(true);
}
}
......
......@@ -40,7 +40,7 @@ SizeCmd::SizeCmd()
itsTBBE = 0;
itsTBBackE = new TBBSizeAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
itsTBBackE->npages[boardnr] = 0;
}
......
......@@ -39,7 +39,7 @@ StatusCmd::StatusCmd()
itsTBBE = 0;
itsTBBackE = new TBBStatusAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
itsTBBackE->V12[boardnr] = 0;
itsTBBackE->V25[boardnr] = 0;
......
......@@ -41,7 +41,7 @@ StopCepCmd::StopCepCmd()
itsTBBE = 0;
itsTBBackE = new TBBStopCepAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
}
......
......@@ -41,7 +41,7 @@ StopCmd::StopCmd():
itsTBBE = 0;
itsTBBackE = new TBBStopAckEvent();
for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) {
for(int boardnr = 0;boardnr < MAX_N_TBBOARDS;boardnr++) {
itsTBBackE->status_mask[boardnr] = 0;
itsChannelMask[boardnr] = 0;
}
......
......@@ -60,7 +60,7 @@ namespace LOFAR {
private:
TbbSettings *TS;
uint32 itsChannelMask[MAX_N_TBBBOARDS];
uint32 itsChannelMask[MAX_N_TBBOARDS];
uint32 itsRcuStatus;
TPStopEvent *itsTPE;
......
......@@ -329,31 +329,35 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port
continue;
}
if (TS->getBoardState(board) == resetBoard) {
TPResetEvent reset;
reset.opcode = TPRESET;
reset.status = 0;
itsBoard[board].send(reset);
if (TS->getBoardState(board) == setImage1) {
TPConfigEvent config;
config.opcode = TPCONFIG;
config.status = 0;
config.imagenr = 1;
//config.imagenr = 0;
itsBoard[board].send(config);
itsBoard[board].setTimer(5.0);
LOG_INFO_STR("RESET is send to port '" << itsBoard[board].getName() << "'");
LOG_INFO_STR("CONFIG 1 is send to port '" << itsBoard[board].getName() << "'");
waitTimer[board] = 10;
setupDone = false;
continue;
}
if ((TS->getBoardState(board) == clearBoard) || (TS->getBoardState(board) == boardReset)) {
if (TS->getBoardState(board) == clearBoard) {
TPClearEvent clear;
clear.opcode = TPCLEAR;
clear.status = 0;
itsBoard[board].send(clear);
itsBoard[board].setTimer(5.0);
LOG_INFO_STR("CLEAR is send to port '" << itsBoard[board].getName() << "'");
waitTimer[board] = 10;
waitTimer[board] = 5;
setupDone = false;
continue;
}
if ((TS->getBoardState(board) == freeBoard) || (TS->getBoardState(board) == boardCleared)) {
if ((TS->getBoardState(board) == freeBoard)
|| (TS->getBoardState(board) == boardCleared)
|| (TS->getBoardState(board) == image1Set)) {
TPFreeEvent free;
free.opcode = TPFREE;
free.status = 0;
......@@ -361,7 +365,7 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port
itsBoard[board].send(free);
itsBoard[board].setTimer(5.0);
LOG_INFO_STR("FREE -1 is send to port '" << itsBoard[board].getName() << "'");
waitTimer[board] = 10;
waitTimer[board] = 5;
setupDone = false;
continue;
}
......@@ -371,9 +375,9 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port
alive.opcode = TPALIVE;
alive.status = 0;
itsBoard[board].send(alive);
itsBoard[board].setTimer(5.0);
itsBoard[board].setTimer(1.0);
LOG_INFO_STR("ALIVE is send to port '" << itsBoard[board].getName() << "'");
waitTimer[board] = 10;
waitTimer[board] = 1;
setupDone = false;
continue;
}
......@@ -385,9 +389,9 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port
} else { // no setup-timer event, must be a board time-out
int board = TS->port2Board(&port); // get board nr
if (TS->getBoardState(board) == resetBoard) {
if (TS->getBoardState(board) == setImage1) {
TS->resetActiveBoard(board);
TS->setBoardState(board,boardReset);
//TS->setBoardState(board,image1Set);
} else {
waitTimer[board] = 0;
retries[board]++;
......@@ -411,25 +415,26 @@ GCFEvent::TResult TBBDriver::setup_state(GCFEvent& event, GCFPortInterface& port
status = RawEvent::dispatch(*this, port);
} break;
case TP_RESET_ACK: {
case TP_CONFIG_ACK: {
int board = TS->port2Board(&port); // get board nr
itsBoard[board].cancelAllTimers();
TS->setBoardState(board,boardReset);
waitTimer[board] = 4;
TS->setBoardState(board,image1Set);
TS->setImageNr(board, 1);
waitTimer[board] = 15;
} break;
case TP_CLEAR_ACK: {
int board = TS->port2Board(&port); // get board nr
itsBoard[board].cancelAllTimers();
TS->setBoardState(board,boardCleared);
waitTimer[board] = 3;
waitTimer[board] = 2;
} break;
case TP_FREE_ACK: {
int board = TS->port2Board(&port); // get board nr
itsBoard[board].cancelAllTimers();
TS->setBoardState(board,boardFreed);
waitTimer[board] = 3;
waitTimer[board] = 2;
} break;
case TP_ALIVE_ACK: {
......@@ -761,7 +766,9 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
case TBB_UNSUBSCRIBE: {
msghandler->removeTriggerClient(port);
msghandler->removeHardwareClient(port);
if (cmdhandler->tpCmdDone()) {
TRAN(TBBDriver::idle_state);
}
} break;
case TP_TRIGGER: {
......@@ -862,6 +869,9 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port)
tbbevent->port = &port;
itsTbbQueue->push_back(tbbevent);
if (cmdhandler->tpCmdDone()) {
TRAN(TBBDriver::idle_state);
}
} break;
default: {
......@@ -936,21 +946,32 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port)
boardnr = TS->port2Board(&port);
if (boardnr != -1) {
activeboards |= (1 << boardnr);
LOG_INFO_STR("TP_ALIVE_ACK " << activeboards << " <== activeboards mask");
TPAliveAckEvent ack(event);
// board is reset
if (ack.resetflag == 0) {
//itsNewBoards |= (1 << boardnr); // board is reset, setup is needed
itsResetCount[boardnr]++;
TS->clearRcuSettings(boardnr);
if (TS->getFreeToReset(boardnr)) {
TS->setImageNr(boardnr, 0);
TS->setBoardState(boardnr,setImage1);
} else {
// new image loaded
TS->setFreeToReset(boardnr, true);
TS->setBoardState(boardnr,clearBoard);
}
itsResetCount[boardnr]++;
LOG_INFO_STR("=BOARD-RESET=, TBB board " << boardnr << " has been reset " << itsResetCount[boardnr] << " times");
} else if ((TS->activeBoardsMask() & (1 << boardnr)) == 0) { // new board
TS->clearRcuSettings(boardnr);
if (TS->getFreeToReset(boardnr)) {
TS->setImageNr(boardnr, 0);
TS->setBoardState(boardnr,setImage1);
} else {
// new image loaded
TS->setFreeToReset(boardnr, true);
TS->setBoardState(boardnr,clearBoard);
}
if ((TS->activeBoardsMask() & (1 << boardnr)) == 0) {
//itsNewBoards |= (1 << boardnr); // new board, setup is needed
TS->setBoardState(boardnr,resetBoard);
//TS->setBoardState(boardnr,clearBoard);
LOG_INFO_STR("=NEW_BOARD=, TBB board " << boardnr << " is new");
}
}
......@@ -1313,6 +1334,7 @@ int main(int argc, char** argv)
try {
LOFAR::ConfigLocator cl;
LOFAR::ACC::APS::globalParameterSet()->adoptFile(cl.locate("TBBDriver.conf"));
LOFAR::ACC::APS::globalParameterSet()->adoptFile(cl.locate("RemoteStation.conf"));
}
catch (LOFAR::Exception e) {
LOG_ERROR_STR("Failed to load configuration files: " << e.text());
......@@ -1336,14 +1358,3 @@ int main(int argc, char** argv)
return(0);
}
// Remove lines or remove comments for copy constructor and assignment.
///TBBDriver::TBBDriver (const TBBDriver& that)
///{}
///TBBDriver& TBBDriver::operator= (const TBBDriver& that)
///{
/// if (this != &that) {
/// ... copy members ...
/// }
/// return *this;
///}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment