diff --git a/MAC/APL/PIC/TBBDriver/Makefile.am b/MAC/APL/PIC/TBBDriver/Makefile.am index b09f8718f91e6425ba850adf8f5c1bf1349fe116..df959c599b5ee7639731d18e0149004145ea40ad 100644 --- a/MAC/APL/PIC/TBBDriver/Makefile.am +++ b/MAC/APL/PIC/TBBDriver/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS=src test include +SUBDIRS= src test include pkgextdir = $(prefix)/config/$(PACKAGE) pkgext_DATA = pkgext pkgextcppflags pkgextcxxflags pkgextldflags diff --git a/MAC/APL/PIC/TBBDriver/configure.in b/MAC/APL/PIC/TBBDriver/configure.in index 6263e43c8fcc2c4d539de7c5b4df3cbd7672edee..163839e7a67115450be909aa7ada3e8c41a6a1ef 100644 --- a/MAC/APL/PIC/TBBDriver/configure.in +++ b/MAC/APL/PIC/TBBDriver/configure.in @@ -54,7 +54,10 @@ lofar_GENERAL dnl lofar_BLITZ dnl lofar_MPI lofar_INTERNAL(LCS/Common,Common,,1,Common/LofarTypedefs.h,,) -lofar_INTERNAL(APL/TBB_Protocol,TBB_Protocol,,1,APL/TBB_Protocol/TBB_Protocol.ph,,) +lofar_INTERNAL(MAC/Test/Suite, suite, , 1, Suite/test.h,,) +lofar_INTERNAL(MAC/GCF/TM, GCFTM, , 1, GCF/TM/GCF_Control.h,,) +lofar_INTERNAL(MAC/GCF/GCFCommon, GCFCommon, , 1, GCF/GCF_Defines.h,,) +lofar_INTERNAL(MAC/APL/PIC/TBB_Protocol,TBB_Protocol,,1,APL/TBB_Protocol/TBB_Protocol.ph,,) lofar_INTERNAL(LCS/ACC/APS,aps,,1,APS/ParameterSet.h) dnl diff --git a/MAC/APL/PIC/TBBDriver/src/Command.cc b/MAC/APL/PIC/TBBDriver/src/Command.cc index d8f7da8802193942473afb7ee944d102ebd8eeb5..7db70b694d6abe8e0122e263b9519cd42b41c74a 100644 --- a/MAC/APL/PIC/TBBDriver/src/Command.cc +++ b/MAC/APL/PIC/TBBDriver/src/Command.cc @@ -145,6 +145,7 @@ void Command::nextChannelNr() do { itsChannel++; + if (itsChannel == TS->maxChannels()) break; itsBoard = TS->getChBoardNr(itsChannel); if (itsBoard < TS->maxBoards()) { @@ -179,8 +180,9 @@ void Command::nextSelectedChannelNr() do { itsChannel++; + if (itsChannel == TS->maxChannels()) break; itsBoard = TS->getChBoardNr(itsChannel); - + if (itsBoard < TS->maxBoards()) { // see if board is active and channel is selected if (TS->boardPort(itsBoard).isConnected() diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc index 36587a738287b29a2f680197116b6debf491563a..5bf79045a2f67431f2cfb64289ad530e663b7647 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc @@ -25,6 +25,7 @@ #include <Common/LofarLogger.h> #include <Common/LofarLocators.h> #include <APS/ParameterSet.h> +#include <APS/Exceptions.h> #include <GCF/GCF_ServiceInfo.h> #include <DriverSettings.h> @@ -119,16 +120,16 @@ void TbbSettings::getTbbSettings() snprintf(dstmac, 64, "TBBDriver.DST_MAC_ADDR_%d", boardnr); try { itsBoardInfo[boardnr].srcIp = globalParameterSet()->getString(srcip); } - catch (...) { LOG_INFO_STR(formatString("%s not found",srcip)); configOK = false; } + catch (APSException&) { LOG_INFO_STR(formatString("%s not found",srcip)); configOK = false; } try { itsBoardInfo[boardnr].dstIp = globalParameterSet()->getString(dstip); } - catch (...) { LOG_INFO_STR(formatString("%s not found",dstip)); configOK = false; } + catch (APSException&) { LOG_INFO_STR(formatString("%s not found",dstip)); configOK = false; } try { itsBoardInfo[boardnr].srcMac = globalParameterSet()->getString(srcmac); } - catch (...) { LOG_INFO_STR(formatString("%s not found",srcmac)); } + catch (APSException&) { LOG_INFO_STR(formatString("%s not found",srcmac)); } try { itsBoardInfo[boardnr].dstMac = globalParameterSet()->getString(dstmac); } - catch (...) { LOG_INFO_STR(formatString("%s not found",dstmac)); } + catch (APSException&) { LOG_INFO_STR(formatString("%s not found",dstmac)); } LOG_INFO_STR(formatString("Board %d:",boardnr)); LOG_INFO_STR(formatString("Control port: Mac = '%s'" diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h index 51230d81e78b4aa8b73894c8dbd7c6f12b28d6df..741fc04a42c618990b9adec1a4054c0482de0cb0 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.h +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.h @@ -144,7 +144,7 @@ public: uint32 getMemorySize(int32 boardnr); void setMemorySize(int32 boardnr,uint32 pages); - friend class TBBDriver; +friend class TBBDriver; protected: // note TBBDriver must be able to set them void getTbbSettings(); @@ -161,7 +161,7 @@ private: TbbSettings(const TbbSettings& that); TbbSettings& operator=(const TbbSettings& that); - // --- Datamembers --- + // --- Datamembers --- int32 itsDriverVersion; int32 itsMaxBoards; // constants int32 itsMaxChannels; diff --git a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc index e72fde040d6b8e6fa601378354f7e8c626078d09..29b2ba652c8de49d8223878e2728fdc58b81c0bf 100644 --- a/MAC/APL/PIC/TBBDriver/src/RawEvent.cc +++ b/MAC/APL/PIC/TBBDriver/src/RawEvent.cc @@ -192,15 +192,17 @@ GCFEvent::TResult RawEvent::dispatch(GCFTask& task, GCFPortInterface& port) break; } - if (buf.event.signal) // buf.event.signal == 0 indicates unrecognised or invalid MEP message + if (buf.event.signal) // buf.event.signal == 0 indicates unrecognised or invalid TP message { // // Print debugging info // +#if 0 LOG_DEBUG(formatString("%s receives '%s' on port '%s'", task.getName().c_str(), task.evtstr(buf.event), port.getName().c_str())); +#endif // // dispatch the TP message as a GCFEvent (which it now is) diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc index 0b1835504afc0ca623b49c436ba5c10dd70ed1f4..0d10170151ae268d52b75a9e142c9f870c1e8f9b 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc @@ -124,7 +124,7 @@ TBBDriver::TBBDriver(string name) TS->getTbbSettings(); cmd = 0; - itsActiveBoards = 0x10000000; + itsActiveBoards = 0; itsAliveCheck = false; itsActiveBoardsChange = false; itsResetCount = 0; @@ -165,6 +165,8 @@ TBBDriver::TBBDriver(string name) TS->setBoardPorts(bn,&itsBoard[bn]); } + itsAliveTimer = new GCFTimerPort(*this, "AliveTimer"); + // create cmd & msg handler LOG_DEBUG_STR("initializing handlers"); cmdhandler = new BoardCmdHandler(); @@ -210,7 +212,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,21 +223,21 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port) 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; -// clear.status = 0; -// for (int32 bnr = 0; bnr < TS->maxBoards(); bnr++) { -// itsBoard[bnr].send(clear); -// LOG_DEBUG(formatString("CLEAR 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; + clear.status = 0; + for (int32 bnr = 0; bnr < TS->maxBoards(); bnr++) { + itsBoard[bnr].send(clear); + LOG_DEBUG(formatString("CLEAR is send to port '%s'", itsBoard[bnr].getName().c_str())); + } + */ itsAcceptor.open(); } if (itsAcceptor.isConnected()) { - TRAN(TBBDriver::idle_state); - itsAcceptor.setTimer((long)0); } + } break; case F_TIMER: { @@ -257,6 +259,8 @@ GCFEvent::TResult TBBDriver::init_state(GCFEvent& event, GCFPortInterface& port) // GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) { + LOG_DEBUG_STR("idle:" << evtstr(event) << "@" << port.getName()); + GCFEvent::TResult status = GCFEvent::HANDLED; undertaker(); @@ -265,6 +269,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) } break; case F_ENTRY: { + LOG_DEBUG_STR("Entering Idle State"); // look if there is an Tbb command in queue if (!itsTbbQueue->empty()) { LOG_DEBUG_STR("The queue is NOT empty"); @@ -277,6 +282,10 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) itsTbbQueue->pop_front(); TRAN(TBBDriver::busy_state); } + // if no tbb boards start check-alive + if (itsActiveBoards == 0) { + itsAliveTimer->setTimer((long)0); + } } break; case F_CONNECTED: { @@ -311,10 +320,15 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) } break; case F_TIMER: { - if (&port == &itsAcceptor) { + if (&port == itsAliveTimer) { CheckAlive(event, port); - TRAN(TBBDriver::busy_state); } + + } break; + + case TP_ALIVE_ACK: { + LOG_DEBUG("TP_ALIVE_ACK received"); + CheckAlive(event, port); } break; case TBB_GET_CONFIG: { @@ -372,7 +386,9 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) default: { // look if the event is a Tbb event if (SetTbbCommand(event.signal)) { - //itsAcceptor.cancelAllTimers(); + itsAliveTimer->cancelAllTimers(); + //itsAliveTimer->setTimer(ALIVECHECKTIME); + itsAliveTimer->setTimer((long)10); status = cmdhandler->dispatch(event,port); TRAN(TBBDriver::busy_state); } else { @@ -381,6 +397,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) } } break; } + LOG_DEBUG_STR("leaving??"); return(status); } @@ -406,13 +423,15 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) } break; case F_TIMER: { - if (itsAliveCheck) { - if (CheckAlive(event, port)) // if true, then all boards are checked - TRAN(TBBDriver::idle_state); - } - if (&port != &itsAcceptor) { - status = cmdhandler->dispatch(event,port); // dispatch time-out event + if (&port == itsAliveTimer) { + if (itsAliveCheck) { + CheckAlive(event, port);// if true, then all boards are checked + } else { + itsAliveTimer->setTimer(ALIVECHECKTIME); + } } + + status = cmdhandler->dispatch(event,port); // dispatch time-out event } break; case F_DISCONNECTED: { @@ -428,10 +447,8 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) } break; 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); - } + LOG_DEBUG_STR("TP_ALIVE_ACK received"); + CheckAlive(event, port); } break; case TBB_GET_CONFIG: { @@ -490,13 +507,11 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) case TP_WRITER_ACK: case TP_READX_ACK: { - if (cmdhandler->tpCmdDone() == false) { - status = cmdhandler->dispatch(event,port); // dispatch ack from boards - } + status = cmdhandler->dispatch(event,port); // dispatch ack from boards if (cmdhandler->tpCmdDone() == true) { - // set ALIVE timer, and check for resets - //itsAcceptor.setTimer((long)5); + itsAliveTimer->setTimer((long)2); + itsAliveCheck = false; TRAN(TBBDriver::idle_state); } } break; @@ -505,17 +520,22 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) LOG_DEBUG("DEFAULT"); if (cmdhandler->tpCmdDone() == true){ // set ALIVE timer, and check for resets - //itsAcceptor.setTimer((long)5); + //if (!itsAliveCheck) { + // itsAliveTimer->setTimer((long)1); + // itsAliveCheck = false; + //} TRAN(TBBDriver::idle_state); + } else { + + // put event on the queue + TbbEvent tbbevent; + 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); } - // put event on the queue - TbbEvent tbbevent; - 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; } break; } @@ -567,11 +587,12 @@ bool TBBDriver::isEnabled() //----------------------------------------------------------------------------- bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port) { - bool done = false; + //bool done = false; static int32 boardnr; static uint32 activeboards; static uint32 checkmask; + itsAliveTimer->cancelAllTimers(); if (!itsAliveCheck) { itsAliveCheck = true; boardnr = 0; @@ -582,21 +603,29 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port) checkmask |= (1 << nr); } itsBoard[boardnr].send(*itsAlive); - itsBoard[boardnr].setTimer(TS->timeout()); + itsAliveTimer->setTimer(TS->timeout()); } else { - itsBoard[boardnr].cancelAllTimers(); checkmask &= ~(1 << boardnr); - if ((event.signal == TP_ALIVE_ACK) && (&port == &itsBoard[boardnr])){ - // new board, send free-cmd + if (event.signal == TP_ALIVE_ACK){ + // new board, send free and clear cmd if ((itsActiveBoards & (1 << boardnr)) == 0) { // is it a new board ?? + // free all inputs on all boards 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())); + + // clear all boards(FPGA register are set to 0 and firmware is maintained) + TPClearEvent clear; + clear.opcode = TPCLEAR; + clear.status = 0; + itsBoard[boardnr].send(clear); + LOG_DEBUG(formatString("CLEAR is send to port '%s'", itsBoard[boardnr].getName().c_str())); } + activeboards |= (1 << boardnr); TPAliveAckEvent ack(event); if (ack.resetflag == 0){ @@ -608,7 +637,7 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port) boardnr++; if (boardnr < TS->maxBoards()) { itsBoard[boardnr].send(*itsAlive); - itsBoard[boardnr].setTimer(TS->timeout()); + itsAliveTimer->setTimer(TS->timeout()); } } @@ -636,12 +665,12 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port) } LOG_DEBUG_STR("Active TBB boards check"); if (itsActiveBoards == 0) { - itsAcceptor.setTimer((long)5); + itsAliveTimer->setTimer((long)5); } else { - itsAcceptor.setTimer(ALIVECHECKTIME); + itsAliveTimer->setTimer(ALIVECHECKTIME); } itsAliveCheck = false; - done = true; + //done = true; } return(!itsAliveCheck); } diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in index e5a260d39c47331234074679eff58d02100cbfc4..5b7e57f74c0966b738b1377f2d2efe2bea1ca733 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in @@ -11,25 +11,26 @@ TBBDriver.IF_NAME=eth1 # # Communication settings for TBB boards # -TBBDriver.TP_RETRIES=5 +TBBDriver.TP_RETRIES=1 TBBDriver.TP_TIMEOUT=0.5 # # Specify the MAC addresses of all TBB boards # +# 00:30:48:2D:82:F7 is used for testing with stub #TBBDriver.MAC_ADDR_0=00:30:48:2D:82:F7 TBBDriver.MAC_ADDR_0=10:FA:00:00:00:02 -TBBDriver.MAC_ADDR_1=10:FA:00:00:01:02 -TBBDriver.MAC_ADDR_2=10:FA:00:00:02:02 -TBBDriver.MAC_ADDR_3=10:FA:00:00:03:02 -TBBDriver.MAC_ADDR_4=10:FA:00:00:04:02 -TBBDriver.MAC_ADDR_5=10:FA:00:00:05:02 -TBBDriver.MAC_ADDR_6=10:FA:00:00:06:02 -TBBDriver.MAC_ADDR_7=10:FA:00:00:07:02 -TBBDriver.MAC_ADDR_8=10:FA:00:00:08:02 -TBBDriver.MAC_ADDR_9=10:FA:00:00:09:02 -TBBDriver.MAC_ADDR_10=10:FA:00:00:0A:02 -TBBDriver.MAC_ADDR_11=10:FA:00:00:0B:02 +TBBDriver.MAC_ADDR_1=10:FA:00:00:02:02 +TBBDriver.MAC_ADDR_2=10:FA:00:00:04:02 +TBBDriver.MAC_ADDR_3=10:FA:00:00:06:02 +TBBDriver.MAC_ADDR_4=10:FA:00:00:08:02 +TBBDriver.MAC_ADDR_5=10:FA:00:00:0A:02 +TBBDriver.MAC_ADDR_6=10:FA:00:00:0C:02 +TBBDriver.MAC_ADDR_7=10:FA:00:00:0E:02 +TBBDriver.MAC_ADDR_8=10:FA:00:00:10:02 +TBBDriver.MAC_ADDR_9=10:FA:00:00:12:02 +TBBDriver.MAC_ADDR_10=10:FA:00:00:14:02 +TBBDriver.MAC_ADDR_11=10:FA:00:00:16:02 # # End of TBB-board MAC address configuration @@ -66,38 +67,45 @@ TBBDriver.MAC_ADDR_11=10:FA:00:00:0B:02 #TBBDriver.DST_MAC_ADDR_3=00:E0:81:31:B2:15 # CS10: -TBBDriver.DST_MAC_ADDR_0=00:0A:5E:56:1B:A8 #TBBDriver.DST_MAC_ADDR_0=00:E0:81:34:93:3B -TBBDriver.DST_MAC_ADDR_1=00:E0:81:34:93:3B -TBBDriver.DST_MAC_ADDR_2=00:E0:81:31:B0:E1 -TBBDriver.DST_MAC_ADDR_3=00:E0:81:31:B2:F5 +#TBBDriver.DST_MAC_ADDR_1=00:E0:81:34:93:3B +#TBBDriver.DST_MAC_ADDR_2=00:E0:81:31:B0:E1 +#TBBDriver.DST_MAC_ADDR_3=00:E0:81:31:B2:F5 + +# Used for testing the CEP port. +# ASTRON46: +TBBDriver.DST_MAC_ADDR_0=00:0A:5E:56:1B:A8 +TBBDriver.DST_MAC_ADDR_1=00:0A:5E:56:1B:A8 + # # End of Destination MAC address configuration -# Source IP address in UDP header for each RSP board +# Source IP address in UDP header for each TBB board # -TBBDriver.SRC_IP_ADDR_0=10.10.0.1 -TBBDriver.SRC_IP_ADDR_1=10.10.0.2 -TBBDriver.SRC_IP_ADDR_2=10.10.0.3 -TBBDriver.SRC_IP_ADDR_3=10.10.0.4 -TBBDriver.SRC_IP_ADDR_4=10.10.0.5 -TBBDriver.SRC_IP_ADDR_5=10.10.0.6 -TBBDriver.SRC_IP_ADDR_6=10.10.0.7 -TBBDriver.SRC_IP_ADDR_7=10.10.0.8 -TBBDriver.SRC_IP_ADDR_8=10.10.0.9 -TBBDriver.SRC_IP_ADDR_9=10.10.0.10 -TBBDriver.SRC_IP_ADDR_10=10.10.0.11 -TBBDriver.SRC_IP_ADDR_11=10.10.0.12 +TBBDriver.SRC_IP_ADDR_0=10.10.0.64 +TBBDriver.SRC_IP_ADDR_1=10.10.0.65 +TBBDriver.SRC_IP_ADDR_2=10.10.0.66 +TBBDriver.SRC_IP_ADDR_3=10.10.0.67 +TBBDriver.SRC_IP_ADDR_4=10.10.0.68 +TBBDriver.SRC_IP_ADDR_5=10.10.0.69 +TBBDriver.SRC_IP_ADDR_6=10.10.0.70 +TBBDriver.SRC_IP_ADDR_7=10.10.0.71 +TBBDriver.SRC_IP_ADDR_8=10.10.0.72 +TBBDriver.SRC_IP_ADDR_9=10.10.0.73 +TBBDriver.SRC_IP_ADDR_10=10.10.0.74 +TBBDriver.SRC_IP_ADDR_11=10.10.0.75 # # End of Source IP address configuration # Destination IP adress in UDP header for each TBB board # +# for CEP port on ASTRON-46 use 0.0.0.0 TBBDriver.DST_IP_ADDR_0=0.0.0.0 +TBBDriver.DST_IP_ADDR_1=0.0.0.0 #TBBDriver.DST_IP_ADDR_0=10.170.0.1 -TBBDriver.DST_IP_ADDR_1=10.170.0.2 +#TBBDriver.DST_IP_ADDR_1=10.170.0.2 TBBDriver.DST_IP_ADDR_2=10.170.0.3 TBBDriver.DST_IP_ADDR_3=10.170.0.4 TBBDriver.DST_IP_ADDR_4=10.170.0.5 diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h index 8355108ebc03ff97ab10774a48e987fb7077621c..68a69d9ed194c4ed70cc3799ddb1528daebbc00a 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.h +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.h @@ -29,6 +29,7 @@ #include <GCF/TM/GCF_Control.h> #include <GCF/TM/GCF_ETHRawPort.h> #include <GCF/TM/GCF_DevicePort.h> +#include <GCF/TM/GCF_TimerPort.h> #include <Common/lofar_deque.h> @@ -117,8 +118,9 @@ namespace LOFAR{ std::deque<TbbEvent> *itsTbbQueue; GCFTCPPort itsAcceptor; // listen for clients on this port - GCFETHRawPort *itsBoard; // array of ports, one for each TBB board - + GCFETHRawPort* itsBoard; // array of ports, one for each TBB board + GCFTimerPort* itsAliveTimer; + std::list<GCFPortInterface*> itsClientList; // list of clients std::list<GCFPortInterface*> itsDeadClients; // list of clients to cleanup }; diff --git a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc index 43c88416239db78252df8d9232d8858dbb01c7ce..de267cdcf904baa3fec06a2d58d065a73d6491ce 100644 --- a/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/UdpCmd.cc @@ -32,7 +32,7 @@ using namespace TBB_Protocol; using namespace TP_Protocol; using namespace TBB; -static const uint16 BASEUDPPORT = 0x10FA; // (=4346) start numbering src and dst UDP ports at this number (4346) +static const uint16 BASEUDPPORT = 0x7BB0; // (=61664) start numbering src and dst UDP ports at this number (4346) static const uint16 TRANSIENT_FRAME_SIZE = 2140; // bytes, header(88) + payload(2048) + CRC(4) static const uint16 SUBBANDS_FRAME_SIZE = 2012; // bytes, header(88) + payload(1920) + CRC(4) diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc index 0ff1b7aabcf63f9c82f113868c687aa8b55f96ac..c3ec24de42982a1c063fc7d9ddb774a0ea9914d9 100644 --- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc @@ -103,9 +103,11 @@ void WritefCmd::saveTbbEvent(GCFEvent& event) LOG_DEBUG_STR(formatString("TP file: %s",itsFileNameTp)); LOG_DEBUG_STR(formatString("MP file: %s",itsFileNameMp)); - itsImageData = new uint8[1966080]; - + //itsImageData = new uint8[1966080]; + itsImageData = new uint8[2097152]; + readFiles(); + LOG_DEBUG_STR("Image files are read"); itsImage = itsTBBE->image; itsSector = (itsImage * FL_SECTORS_IN_PAGE); @@ -329,30 +331,44 @@ void WritefCmd::readFiles() int dataPtr = 0; int ch_h, ch_l; + LOG_DEBUG_STR("Opening TP file"); // load Tp hex file itsFile = fopen(itsFileNameTp,"r"); + if (itsFile == 0) { + LOG_DEBUG_STR("Error on opening TP file"); + return; + } - ch_h = getc(itsFile); - ch_l = getc(itsFile); - while (ch_l != EOF) { - itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l); - dataPtr++; + LOG_DEBUG_STR("Getting TP file"); + while (1) { ch_h = getc(itsFile); + if (ch_h == EOF) break; ch_l = getc(itsFile); + if (ch_l == EOF) break; + itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l); + dataPtr++; } + LOG_DEBUG_STR("Closing TP file"); fclose(itsFile); + LOG_DEBUG_STR("Opening MP file"); // load Mp hex file itsFile = fopen(itsFileNameMp,"r"); + if (itsFile == 0) { + LOG_DEBUG_STR("Error on opening MP file"); + return; + } - ch_h = getc(itsFile); - ch_l = getc(itsFile); - while (ch_l != EOF) { - itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l); - dataPtr++; + LOG_DEBUG_STR("Getting MP file"); + while (1) { ch_h = getc(itsFile); + if (ch_h == EOF) break; ch_l = getc(itsFile); + if (ch_l == EOF) break; + itsImageData[dataPtr] = (charToHex(ch_h) << 4) + charToHex(ch_l); + dataPtr++; } + LOG_DEBUG_STR("Closing MP file"); fclose(itsFile); itsImageSize = dataPtr; diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc index 9fc800f2bd70e61e5e7ef01f32e86fabb8a48275..1cb8916ca54c636dfbc76f7efec1cef5ab12ed5c 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc @@ -1321,7 +1321,7 @@ GCFEvent::TResult WriterCmd::ack(GCFEvent& e) //---- READPAGE ------------------------------------------------------------------ ReadPageCmd::ReadPageCmd(GCFPortInterface& port) : Command(port), - itsRcu(0),itsPages(1),itsCmdStage(0),itsPage(0),itsAddr(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0), + itsRcu(0),itsStartPage(0),itsPages(1),itsCmdStage(0),itsPage(0),itsTotalSize(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0), itsStationId(0),itsRspId(0),itsRcuId(0),itsSampleFreq(0),itsTime(0),itsSampleNr(0),itsSamplesPerFrame(0), itsFreqBands(0),itsTotalSamples(0),itsTotalBands(0) { @@ -1333,19 +1333,27 @@ void ReadPageCmd::send() { switch (itsCmdStage) { - case 0: { + + case 0: { // get info about allocated RCU's TBBRcuInfoEvent send; itsPort.send(send); itsPort.setTimer((long)1); } break; - case 1: { + case 1: { // get total memmory size + TBBSizeEvent send; + send.boardmask = (1 << itsBoard); + itsPort.send(send); + itsPort.setTimer((long)1); + } break; + + case 2: { // write page address to board TBBWriterEvent send; send.board = itsBoard; send.mp = itsMp; send.pid = PID6; send.regid = REGID1; - send.data[0] = itsAddr; + send.data[0] = (itsStartPage + itsPage); send.data[1] = 0; send.data[2] = 0; itsPort.send(send); @@ -1355,7 +1363,7 @@ void ReadPageCmd::send() send.mp,send.pid,send.regid,send.data[0])); } break; - case 2: { + case 3: { // write page-read-cmd to board TBBWriterEvent send; send.board = itsBoard; send.mp = itsMp; @@ -1371,7 +1379,7 @@ void ReadPageCmd::send() send.mp,send.pid,send.regid,send.data[0])); } break; - case 3: { + case 4: { // read first part of frame TBBReadxEvent send; send.board = itsBoard; send.mp = itsMp; @@ -1386,7 +1394,7 @@ void ReadPageCmd::send() send.mp,send.pid,send.regid,send.pagelength,send.pageaddr)); } break; - case 4: { + case 5: { // read second part of frame TBBReadxEvent send; send.board = itsBoard; send.mp = itsMp; @@ -1412,18 +1420,19 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) int16 val[1400]; switch (itsCmdStage) { + case 0: { - int rcu; - rcu = getRcu(); 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 = static_cast<int32>(ack.rcu_on_input[rcu]) / 4; - //logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",rcu,itsBoard,itsMp)); + itsRcu = getRcu(); + itsState = ack.rcu_state[itsRcu]; + itsStartAddr = ack.rcu_start_addr[itsRcu]; + itsSize = ack.rcu_pages[itsRcu]; + itsBoard = ack.rcu_on_board[itsRcu]; + itsMp = static_cast<int32>(ack.rcu_on_input[itsRcu] / 4); + logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",itsRcu,itsBoard,itsMp)); + + itsStartPage += itsStartAddr; - itsAddr = itsStartAddr; if (itsState == 'F') { logMessage(cout,"Rcu not allocated"); itsCmdStage = 10; @@ -1431,6 +1440,20 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } break; case 1: { + TBBSizeAckEvent ack(e); + if (!(ack.status_mask[itsBoard] & TBB_SUCCESS)) { + logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask[itsBoard]).c_str())); + itsCmdStage = 10; + } else { + itsTotalSize = ack.npages[itsBoard] / 4; + if ((itsStartPage < itsStartAddr) || (itsStartPage > (itsStartAddr + itsTotalSize))) { + logMessage(cout,formatString("Requested Page belongs not to rcu-%d", itsRcu)); + } + logMessage(cout,formatString("StartPage = %u ",itsStartPage)); + } + } break; + + case 2: { TBBWriterAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str())); @@ -1438,7 +1461,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } } break; - case 2: { + case 3: { TBBWriterAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s",getDriverErrorStr(ack.status_mask).c_str())); @@ -1446,7 +1469,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } } break; - case 3: { + case 4: { TBBReadxAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str())); @@ -1459,7 +1482,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } } break; - case 4: { + case 5: { TBBReadxAckEvent ack(e); if (!(ack.status_mask & TBB_SUCCESS)) { logMessage(cout,formatString("%s", getDriverErrorStr(ack.status_mask).c_str())); @@ -1478,7 +1501,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } itsCmdStage++; - if (itsCmdStage < 5) { + if (itsCmdStage < 6) { //itsPort.setTimer(0.01); } else { @@ -1547,14 +1570,14 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } } } + // write all data to file + FILE* file; + char line[10][256]; + char basefilename[PATH_MAX]; + char filename[PATH_MAX]; + char timestring[256]; + if (val_cnt > 0) { - // write all data to file - FILE* file; - char line[10][256]; - char basefilename[PATH_MAX]; - char filename[PATH_MAX]; - char timestring[256]; - strftime(timestring, 255, "%Y%m%d_%H%M%S", gmtime(&itsTime)); snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId); @@ -1562,49 +1585,53 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) file = fopen(filename,"a"); fwrite(val,sizeof(int16),val_cnt,file); fclose(file); + } + itsPage++; + if (itsPage < itsPages) { + itsCmdStage = 2; + } else { + // print page information + strftime(timestring, 255, "%Y-%m-%d %H:%M:%S", gmtime(&itsTime)); - itsPage++; - if (itsPage < itsPages) { - itsCmdStage = 1; - itsAddr = itsStartAddr + itsPage; - //itsPort.setTimer(0.02); + sprintf(line[0],"Station ID : %d",itsStationId); + sprintf(line[1],"RSP ID : %d",itsRspId); + sprintf(line[2],"RCU ID : %d",itsRcuId); + sprintf(line[3],"Sample freq : %d MHz",itsSampleFreq); + if (itsTime < 0) { + sprintf(line[4],"Time : invalid"); + } else { + sprintf(line[4],"Time : %s (%u)",timestring,(uint32)itsTime); + } + sprintf(line[5],"SampleNr : %u",itsSampleNr); + if (itsTotalBands) { + sprintf(line[6],"FreqBands : %u",itsTotalBands); + sprintf(line[7],"Data file format: binary complex(int16 Re, int16 Im)"); } else { - // print page information - strftime(timestring, 255, "%Y-%m-%d %H:%M:%S", gmtime(&itsTime)); - - sprintf(line[0],"Station ID : %d",itsStationId); - sprintf(line[1],"RSP ID : %d",itsRspId); - sprintf(line[2],"RCU ID : %d",itsRcuId); - sprintf(line[3],"Sample freq : %d MHz",itsSampleFreq); - if (itsTime < 0) { - sprintf(line[4],"Time : invalid"); - } else { - sprintf(line[4],"Time : %s (%u)",timestring,(uint32)itsTime); - } - sprintf(line[5],"SampleNr : %u",itsSampleNr); - if (itsTotalBands) { - sprintf(line[6],"FreqBands : %u",itsTotalBands); - sprintf(line[7],"Data file format: binary complex(int16 Re, int16 Im)"); - } else { - sprintf(line[6],"Samples : %u",itsTotalSamples); - sprintf(line[7],"Data file format: binary int16"); - } + sprintf(line[6],"Samples : %u",itsTotalSamples); + sprintf(line[7],"Data file format: binary int16"); + } + if (val_cnt > 0) { sprintf(line[8],"Filename : %s.nfo",basefilename); sprintf(line[9]," : %s.dat",basefilename); - + } else { + sprintf(line[8],"Filename : NO DATA IN FRAME"); + sprintf(line[9]," : "); + } + + if (val_cnt > 0) { snprintf(filename, PATH_MAX, "%s.nfo",basefilename); file = fopen(filename,"w"); - + for (int32 lnr = 0;lnr < 10; lnr++) { - logMessage(cout,line[lnr]); fprintf(file,line[lnr]); fprintf(file,"\n"); } - logMessage(cout,"\n"); - fclose(file); + fclose(file); + } + + for (int32 lnr = 0;lnr < 10; lnr++) { + logMessage(cout,line[lnr]); } - } else { - logMessage(cout,"No data in Frame"); } } if (itsPage == itsPages) { @@ -1627,7 +1654,7 @@ void TBBCtl::help() logMessage(cout,"# --command --select=<set> : only information for all selected boards or rcu's is displayed\n" "# Example: --select=0,1,4 or --select=0:6 or --select=0,1,2,8:11\n"); logMessage(cout,"tbbctl --alloc [--select=<set>] # allocate memmory locations for selected rcu's"); - logMessage(cout,"tbbctl --free [--select=<set>] # free memmory locationsfor selected rcu's"); + logMessage(cout,"tbbctl --free [--select=<set>] # free memmory locations for selected rcu's"); logMessage(cout,"tbbctl --record [--select=<set>] # start recording on selected rcu's"); 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"); @@ -1647,13 +1674,13 @@ void TBBCtl::help() logMessage(cout,"tbbctl --eraseimage=board,image # erase image from flash"); 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," # version is the sw version of the image stored"); 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 --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 --readddr=board,mp,addr,size # DDR2 read, (size x 2) words starting on addr"); + logMessage(cout,"tbbctl --writeddr=board,mp,addr,wordL,wordH # DDR2 write, 2 words to starting on addr"); + logMessage(cout,"tbbctl --testddr=board # DDR2 memory test, adress and data lines"); + logMessage(cout,"tbbctl --readpage=rcunr,startpage,npages # DDR2 read npages from rcunr, starting on startpage"); 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 "); @@ -2169,22 +2196,24 @@ Command* TBBCtl::parse_options(int argc, char** argv) if (optarg) { int32 rcu = 0; + uint32 startpage = 0; uint32 pages = 0; - int numitems = sscanf(optarg, "%d,%u", &rcu,&pages); + int numitems = sscanf(optarg, "%d,%u,%u", &rcu,&startpage,&pages); - if (numitems < 2 || numitems == EOF || rcu < 0 || rcu >= MAX_N_RCUS) { - logMessage(cerr,"Error: invalid read ddr value. Should be of the format " - "'--readw=board,mp,addr' where rcu= 0..191"); + if (numitems < 3 || numitems == EOF || rcu < 0 || rcu >= MAX_N_RCUS) { + logMessage(cerr,"Error: invalid readpage value's. Should be of the format " + "'--readpage=rcu,startpage,pages' where rcu= 0..191"); exit(EXIT_FAILURE); } + readddrcmd->setStartPage(startpage); readddrcmd->setPages(pages); select.clear(); select.push_back(rcu); command->setSelected(true); } else { - logMessage(cerr,"Error: invalid read ddr value. Should be of the format " - "'--readw=board,mp,addr' where board= 0..11, mp= 0..3 and addr= 0x.."); + logMessage(cerr,"Error: invalid readpage value's. Should be of the format " + "'--readpage=rcu,startpage,pages' where rcu= 0..191"); exit(EXIT_FAILURE); } command->setCmdType(BOARDCMD); @@ -2501,8 +2530,8 @@ void TBBCtl::mainloop() int main(int argc, char** argv) { GCFTask::init(argc, argv); - - LOG_INFO(formatString("Program %s has started", argv[0])); + + LOG_DEBUG(formatString("Program %s has started", argv[0])); TBBCtl tbbctl("tbbctl", argc, argv); @@ -2511,10 +2540,11 @@ int main(int argc, char** argv) } catch (Exception e) { cerr << "Exception: " << e.text() << endl; + cout << endl << "== abnormal termination of tbbctl ============================================" << endl; exit(EXIT_FAILURE); } - - LOG_INFO("Normal termination of program"); + cout << endl << "== normal termination of tbbctl ==============================================" << endl; + LOG_DEBUG("Normal termination of program"); return(0); } diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h index da6c72e79a02a869ab06987923f03b688c24e090..fb261114fcee21428264c9ca88f5adc02818b655 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h @@ -65,7 +65,7 @@ class Command public: virtual ~Command() { - logMessage(cout,formatString("==============================================================================")); + //logMessage(cout,formatString("==============================================================================")); } // Send the command to the TBBDriver @@ -627,7 +627,7 @@ class ReadPageCmd : public Command virtual void send(); virtual GCFEvent::TResult ack(GCFEvent& e); void setMp(int32 mp) { itsMp = mp; } - void setAddr(uint32 addr) { itsAddr = addr; } + void setStartPage(uint32 startpage) { itsStartPage = startpage; } void setPages(uint32 pages) { itsPages = pages; } static const uint32 PID6 = 6; static const uint32 REGID0 = 0; @@ -640,11 +640,12 @@ class ReadPageCmd : public Command private: // values given by user int32 itsRcu; + uint32 itsStartPage; uint32 itsPages; // values used in program int32 itsCmdStage; uint32 itsPage; - uint32 itsAddr; + uint32 itsTotalSize; // data from channelInfoCmd char itsState; uint32 itsStartAddr; diff --git a/MAC/APL/PIC/TBBDriver/test/Makefile.am b/MAC/APL/PIC/TBBDriver/test/Makefile.am index ec80547db8f5bc80cca6d03866d45aa7658cd156..6bd14e99be55fc9dc2d9e58ffb78bea05eff9c3b 100644 --- a/MAC/APL/PIC/TBBDriver/test/Makefile.am +++ b/MAC/APL/PIC/TBBDriver/test/Makefile.am @@ -1,3 +1,5 @@ +#<<<<<<< Makefile.am +#======= check_PROGRAMS = # programs to run through supplied checktools @@ -5,21 +7,91 @@ CHECKTOOLPROGS = #ENDCHECKTOOLPROGS # scripts used to run tests -TESTSCRIPTS = +#TESTSCRIPTS = # scripts and possible programs to run tests -TESTS = $(TESTSCRIPTS) +#TESTS = $(TESTSCRIPTS) XFAIL_TESTS = # all files (.run, .stdout, .in, .log_prop, etc.) needed to run tests -EXTRA_DIST = $(TESTSCRIPTS) +#EXTRA_DIST = $(TESTSCRIPTS) # Lines to build a test program testprg #testprg_SOURCES = testprg.cc #testprg_LDADD = ../src/libtbbdriver.la #testprg_DEPENDENCIES = ../src/libtbbdriver.la $(LOFAR_DEPEND) +#>>>>>>> 1.2 +AM_CPPFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_builddir)/src + +# TESTS = \ +# TBBTest \ +# TPStub + +AUTOGEN = autogen +SUFFIXES = .ph +%.cc: %.prot + $(AUTOGEN) --writable -L $(datadir)/GCF/TM $< + cp $*.ph $(top_builddir)/include/TBBDriver/TP_Protocol + +%.ph: %.prot + $(AUTOGEN) --writable -L $(datadir)/GCF/TM $< + cp $*.ph $(top_builddir)/include/TBBDriver/TP_Protocol + +BUILT_SOURCES = \ + TBBTest.conf \ + TPStub.conf + +lib_LTLIBRARIES = \ + libtbbstub.la + +EXTRA_DIST = \ + $(BUILT_SOURCES) \ + TP_Protocol.prot + +sysconf_DATA = \ + TPStub.conf \ + TBBTest.conf + + +%.properties: $(MAC_CONFIG)/%.properties + cp $< $@ + +%.conf: %.conf.in + cp $< $@ + +libtbbstub_la_SOURCES = \ + StubRawEvent.h \ + StubRawEvent.cc + +bin_PROGRAMS = \ + TPStub \ + TBBTest + +#check_PROGRAMS = \ +# TBBTest + +TBBTest_SOURCES = \ + TBBTest.h \ + TBBTest.cc + +TPStub_SOURCES = \ + TPStub.h \ + TPStub.cc + +TPStub_LDADD = \ + libtbbstub.la \ + $(top_builddir)/src/libtp_protocol.la \ + $(top_builddir)/src/libtbbdriver.la + +TPStub_DEPENDENCIES = \ + libtbbstub.la \ + $(top_builddir)/src/libtbbdriver.la \ + $(top_builddir)/src/libtp_protocol.la \ + $(LOFAR_DEPEND) include $(top_srcdir)/Makefile.common diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.cc b/MAC/APL/PIC/TBBDriver/test/TBBTest.cc index 0033edacc8a178f7a87e48c3be9c8181368d9daf..cf0576a50d98ae894a6eb910f31b6ef955c98a1c 100644 --- a/MAC/APL/PIC/TBBDriver/test/TBBTest.cc +++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.cc @@ -24,19 +24,20 @@ #include <lofar_config.h> #include <Common/LofarLogger.h> +#include <GCF/GCF_ServiceInfo.h> + #include <APL/TBB_Protocol/TBB_Protocol.ph> #include <APL/RTCCommon/TestSuite.h> -#include <TBBTest.h> +#include "TBBTest.h" #include <iostream> #include <sys/time.h> #include <string.h> -#include <blitz/array.h> + using namespace std; -using namespace blitz; using namespace LOFAR; -using namespace RTC; +//using namespace RTC; using namespace TBB_Protocol; using namespace TBB_Test; @@ -46,9 +47,9 @@ TBBTest::TBBTest(string name) { registerProtocol(TBB_PROTOCOL, TBB_PROTOCOL_signalnames); - m_server.init(*this, "server", GCFPortInterface::SAP, TBB_PROTOCOL); + itsClient.init(*this, MAC_SVCMASK_TBBDRIVER, GCFPortInterface::SAP, TBB_PROTOCOL); - m_boardmask = 0x00000001; // bitmask with boards to test bo = board1 + itsboardmask = 0x00000001; // bitmask with boards to test bo = board1 } TBBTest::~TBBTest() @@ -67,19 +68,22 @@ GCFEvent::TResult TBBTest::initial(GCFEvent& e, GCFPortInterface& port) case F_ENTRY: { - m_server.open(); + LOG_DEBUG_STR("Opening client port"); + itsClient.open(); } break; case F_CONNECTED: { - TRAN(TBBTest::test001); + LOG_DEBUG_STR("port is connected, switch to test001"); + TRAN(TBBTest::test008); } break; case F_DISCONNECTED: { - port.setTimer((long)1); + LOG_DEBUG_STR("port is disconnected, set timer, and close port"); + port.setTimer((long)2); port.close(); } break; @@ -87,11 +91,13 @@ GCFEvent::TResult TBBTest::initial(GCFEvent& e, GCFPortInterface& port) case F_TIMER: { // try again - m_server.open(); + LOG_DEBUG_STR("Try to open the port again"); + itsClient.open(); } break; default: + LOG_DEBUG_STR("unknown message"); status = GCFEvent::NOT_HANDLED; break; } @@ -112,20 +118,19 @@ GCFEvent::TResult TBBTest::test001(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBAllocEvent sw; - sw.tbbmask = boardmask; // only board 0 - sw.channel = 1; - sw.pageaddr = 1; - sw.pagelength = 1; // 1 page + sw.rcu_mask.set(); - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_ALLOCACK: + case TBB_ALLOC_ACK: { - TBBAllocackEvent ack(e); - - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + TBBAllocAckEvent ack(e); + LOG_INFO_STR(formatString ("Ack status = 0X%08X", ack.status_mask)); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Alloc test OK"); TRAN(TBBTest::test002); @@ -167,21 +172,22 @@ GCFEvent::TResult TBBTest::test002(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBFreeEvent sw; - sw.tbbmask = boardmask; // boards tot test - sw.channel = 1; + sw.rcu_mask.set(); - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_FREEACK: + case TBB_FREE_ACK: { - TBBAllocackEvent ack(e); - - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + TBBAllocAckEvent ack(e); + LOG_INFO_STR(formatString ("Ack status = 0X%08X", ack.status_mask)); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Free test OK"); - TRAN(TBBTest::test003); + TRAN(TBBTest::test008); } break; @@ -220,18 +226,19 @@ GCFEvent::TResult TBBTest::test003(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBRecordEvent sw; - sw.tbbmask = boardmask; // boards tot test - sw.channel = 1; + sw.rcu_mask.set(); - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_FREEACK: + case TBB_FREE_ACK: { - TBBRecordackEvent ack(e); + TBBRecordAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Record test OK"); TRAN(TBBTest::test004); @@ -273,18 +280,19 @@ GCFEvent::TResult TBBTest::test004(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBStopEvent sw; - sw.tbbmask = boardmask; // boards tot test - sw.channel = 1; + sw.rcu_mask.set(); - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_STOPACK: + case TBB_STOP_ACK: { - TBBStopackEvent ack(e); + TBBStopAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Stop test OK"); TRAN(TBBTest::test005); @@ -324,20 +332,19 @@ GCFEvent::TResult TBBTest::test005(GCFEvent& e, GCFPortInterface& port) START_TEST("test005", "test TRIGCLR"); /* start of the test sequence */ - TBBTrigclrEvent sw; - - sw.tbbmask = boardmask; // boards tot test - sw.channel = 1; + TBBTrigReleaseEvent sw; + + //sw.channel = 1; - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_TRIGCLRACK: + case TBB_TRIG_RELEASE_ACK: { - TBBTrigclrackEvent ack(e); + TBBTrigReleaseAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + //TESTC_ABORT(ack.status_mask == TBB_SUCCESS, TBBTest::final); LOG_INFO_STR("TrigClr test OK"); TRAN(TBBTest::test006); @@ -379,18 +386,17 @@ GCFEvent::TResult TBBTest::test006(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBReadEvent sw; - sw.tbbmask = boardmask; // boards tot test sw.channel = 1; - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_READACK: + case TBB_READ_ACK: { - TBBReadackEvent ack(e); + TBBReadAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + TESTC_ABORT(ack.status_mask == TBB_SUCCESS, TBBTest::final); LOG_INFO_STR("Read test OK"); TRAN(TBBTest::test007); @@ -429,28 +435,19 @@ GCFEvent::TResult TBBTest::test007(GCFEvent& e, GCFPortInterface& port) START_TEST("test007", "test UDP"); /* start of the test sequence */ - TBBUdpEvent sw; + TBBModeEvent sw; - sw.tbbmask = boardmask; // boards tot test - sw.udp[0] = 1; - sw.udp[1] = 1; - sw.ip[0] = 2; - sw.ip[1] = 2; - sw.ip[2] = 2; - sw.ip[3] = 2; - sw.ip[4] = 2; - sw.mac[0] = 3; - sw.mac[1] = 3; + sw.board = itsboardmask; // boards tot test - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_UDPACK: + case TBB_MODE_ACK: { - TBBUdpackEvent ack(e); + TBBModeAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + TESTC_ABORT(ack.status_mask == TBB_SUCCESS, TBBTest::final); LOG_INFO_STR("Udp test OK"); TRAN(TBBTest::test008); @@ -492,20 +489,36 @@ GCFEvent::TResult TBBTest::test008(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBVersionEvent sw; - sw.tbbmask = boardmask; // boards tot test + sw.boardmask =itsboardmask; // boards tot test - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_VERSIONACK: + case TBB_VERSION_ACK: { - TBBVersionackEvent ack(e); - - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + TBBVersionAckEvent ack(e); + + for(int cnt = 0;cnt < 12;cnt++) { + LOG_INFO_STR(formatString("boardnr = %d", cnt)); + LOG_INFO_STR(formatString("boardid = 0X%08X", ack.boardid[cnt])); + LOG_INFO_STR(formatString("swversion = 0X%08X", ack.swversion[cnt])); + LOG_INFO_STR(formatString("boardversion = 0X%08X", ack.boardversion[cnt])); + LOG_INFO_STR(formatString("tpversion = 0X%08X", ack.tpversion[cnt])); + LOG_INFO_STR(formatString("mp0version = 0X%08X", ack.mp0version[cnt])); + LOG_INFO_STR(formatString("mp1version = 0X%08X", ack.mp1version[cnt])); + LOG_INFO_STR(formatString("mp2version = 0X%08X", ack.mp2version[cnt])); + LOG_INFO_STR(formatString("mp3version = 0X%08X", ack.mp3version[cnt])); + } + LOG_INFO_STR(formatString ("Ack status = 0X%08X", ack.status_mask)); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Version test OK"); - - TRAN(TBBTest::test009); + + + TRAN(TBBTest::final); + //TRAN(TBBTest::test009); } break; @@ -544,17 +557,19 @@ GCFEvent::TResult TBBTest::test009(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBSizeEvent sw; - sw.tbbmask = boardmask; // boards tot test + sw.boardmask = itsboardmask; // boards tot test - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_SIZEACK: + case TBB_SIZE_ACK: { - TBBSizeackEvent ack(e); + TBBSizeAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Size test OK"); TRAN(TBBTest::test010); @@ -596,20 +611,22 @@ GCFEvent::TResult TBBTest::test010(GCFEvent& e, GCFPortInterface& port) /* start of the test sequence */ TBBSizeEvent sw; - sw.tbbmask = boardmask; // boards tot test + sw.boardmask =itsboardmask; // boards tot test - TESTC_ABORT(m_server.send(sw), TBBTest::final); + TESTC_ABORT(itsClient.send(sw), TBBTest::final); } break; - case TBB_SIZEACK: + case TBB_SIZE_ACK: { - TBBSizeackEvent ack(e); + TBBSizeAckEvent ack(e); - TESTC_ABORT(ack.status == SUCCESS, TBBTest::final); + for (int boardnr = 0; boardnr < MAX_N_TBBBOARDS;boardnr++) { + TESTC_ABORT(ack.status_mask[boardnr] == TBB_SUCCESS, TBBTest::final); + } LOG_INFO_STR("Size test OK"); - TRAN(TBBTest::test011); + TRAN(TBBTest::final); } break; @@ -662,6 +679,7 @@ void TBBTest::run() GCFTask::run(); } + int main(int argc, char** argv) { GCFTask::init(argc, argv); diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in b/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in index 0fe8ae60ee28ebef2cd8aae7286f5809e35faac2..7cf768403447c71f325db03f8e8ebd9665e0952e 100644 --- a/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in +++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.conf.in @@ -1,6 +1,4 @@ # # Configuration to connect TBBTest to the TBBDriver -# -mac.ns.TBBTest.server.type=TCP -mac.top.TBBTest.server.remoteservice=TBBDriver:acceptor_v2 \ No newline at end of file +# \ No newline at end of file diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTest.h b/MAC/APL/PIC/TBBDriver/test/TBBTest.h index 78da950ee48213ac1ef3a4b7d0830c183db2fa4b..8c4c8ad3dd150ccc231c728715564451cf2c7e51 100644 --- a/MAC/APL/PIC/TBBDriver/test/TBBTest.h +++ b/MAC/APL/PIC/TBBDriver/test/TBBTest.h @@ -29,8 +29,9 @@ #include <GCF/TM/GCF_Control.h> #include <GCF/TM/GCF_ETHRawPort.h> -namespace TBB_Test -{ +namespace LOFAR { + namespace TBB_Test { + class TBBTest : public GCFTask, public Test { public: @@ -55,7 +56,7 @@ namespace TBB_Test /** * The test states. This state is reached when the - * beam_server port is connected. + * beaitsClient port is connected. */ GCFEvent::TResult test001(GCFEvent& e, GCFPortInterface &p); GCFEvent::TResult test002(GCFEvent& e, GCFPortInterface &p); @@ -82,10 +83,11 @@ namespace TBB_Test private: // ports - GCFPort m_server; - uint32 m_boardmask; + GCFPort itsClient; + uint32 itsboardmask; }; - -}; + + } +} #endif /* TBBTEST_H_ */ diff --git a/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h b/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h index 16e58a9edb3a7c23029aa7ec8983e5ab2d919497..897aafe184c69c3f2eb5e979cf61220cd6d18f14 100644 --- a/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h +++ b/MAC/APL/PIC/TBBDriver/test/TBBTestSuite.h @@ -24,8 +24,8 @@ //# $Id$ //# -#ifndef RSPTESTSUITE_H_ -#define RSPTESTSUITE_H_ +#ifndef TBBTESTSUITE_H_ +#define TBBTESTSUITE_H_ #include <Suite/test.h> #include <Suite/suite.h> diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.cc b/MAC/APL/PIC/TBBDriver/test/TPStub.cc index 8ec4dee7d8293dec1dd7c52d287b2ef881b67214..ff14dced2a0944e5394c7bca089b3013bd8ab1a4 100644 --- a/MAC/APL/PIC/TBBDriver/test/TPStub.cc +++ b/MAC/APL/PIC/TBBDriver/test/TPStub.cc @@ -23,23 +23,27 @@ #include <lofar_config.h> #include <Common/LofarLogger.h> - -#include "TP_Protocol.ph" -#include <RawEvent.h> -#include <TPStub.h> -#include <APL/RTCCommon/PSAccess.h> -#include <GCF/ParameterSet.h> +#include <Common/LofarLocators.h> +#include <APS/ParameterSet.h> #include <iostream> #include <sys/time.h> #include <string.h> #include <math.h> +#include "TPStub.h" +#include "TP_Protocol.ph" +#include "StubRawEvent.h" + + using namespace std; using namespace LOFAR; +using namespace ACC::APS; +using namespace TP_Protocol; +using namespace TBB; using namespace TBB_Test; -#define ETHERTYPE_TP 0x10FA +#define ETHERTYPE_TP 0x7BB0 // TBB TPStub::TPStub(string name) : GCFTask((State)&TPStub::initial, name), Test(name) @@ -51,22 +55,23 @@ TPStub::TPStub(string name) LOG_INFO("TPStub constructor"); - m_client.init(*this, "client", GCFPortInterface::SAP, TP_PROTOCOL, true /*raw*/); - m_client.setAddr(GET_CONFIG_STRING("TPStub.IF_NAME"), - GET_CONFIG_STRING(addrstr)); - m_client.setEtherType(ETHERTYPE_TP); + itsServer.init(*this, "tp_server", GCFPortInterface::SPP, TP_PROTOCOL, true /*raw*/); + itsServer.setAddr( globalParameterSet()->getString("TPStub.IF_NAME").c_str(), + globalParameterSet()->getString(addrstr).c_str()); + itsServer.setEtherType(ETHERTYPE_TP); } + TPStub::~TPStub() { // TODO } -GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port) +GCFEvent::TResult TPStub::initial(GCFEvent &event, GCFPortInterface &port) { GCFEvent::TResult status = GCFEvent::HANDLED; - switch(e.signal) + switch(event.signal) { case F_INIT: { @@ -75,7 +80,7 @@ GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port) case F_ENTRY: { - m_client.open(); + itsServer.open(); } break; @@ -97,7 +102,7 @@ GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port) { // try again LOG_DEBUG(formatString("port '%s' retry of open...", port.getName().c_str())); - m_client.open(); + itsServer.open(); } break; @@ -109,230 +114,213 @@ GCFEvent::TResult TPStub::initial(GCFEvent& e, GCFPortInterface& port) return status; } - -GCFEvent::TResult TPStub::connected(GCFEvent& ack, GCFPortInterface& port) +GCFEvent::TResult TPStub::connected(GCFEvent &event, GCFPortInterface &port) { GCFEvent::TResult status = GCFEvent::HANDLED; - - switch (ack.signal) + LOG_DEBUG_STR("Connected and waiting."); + switch (event.signal) { case F_ENTRY: { - } - break; + } break; case F_DATAIN: { - status = RawEvent::dispatch(*this, port); - } - break; + status = RawEvent::dispatch(*this, port); //*this + } break; case TP_ALLOC: { - TPAllocEvent allocack; + TPAllocAckEvent allocack(event); allocack.opcode = TPALLOC; - allocack.channel = ack.channel; - allocack.pageaddr = ack.pageaddr; - allocack.pagelength = ack.pagelength; + allocack.status = 0; port.send(allocack); - } - break; + } break; case TP_FREE: { - TPFreeEvent freeack; + TPFreeAckEvent freeack(event); freeack.opcode = TPFREE; - freeack.channel = ack.channel; + freeack.status = 0; port.send(freeack); - } - break; + } break; case TP_RECORD: { - TPRecordEvent recordack; + TPRecordAckEvent recordack(event); recordack.opcode = TPRECORD; - recordack.channel = ack.channel; + recordack.status = 0; port.send(recordack); - } - break; + } break; case TP_STOP: { - TPStopEvent stopack; + TPStopAckEvent stopack(event); stopack.opcode = TPSTOP; - stopack.channel = ack.channel; + stopack.status = 0; port.send(stopack); - } - break; + } break; - case TP_TRIGCLR: + case TP_TRIG_RELEASE: { - TPTrigclrEvent trigclrack; - trigclrack.opcode = TPTRIGCLR; - trigclrack.channel = ack.channel; - port.send(trigclrack); - } - break; + TPTrigReleaseAckEvent trigreleaseack(event); + trigreleaseack.opcode = TPTRIGRELEASE; + trigreleaseack.status = 0; + port.send(trigreleaseack); + } break; case TP_READ: { - TPReadEvent readack; + TPReadAckEvent readack(event); readack.opcode = TPREAD; - readack.channel = ack.channel; - readack.time = ack.time; - readack.period = ack.period; + readack.status = 0; port.send(readack); - } - break; + } break; case TP_UDP: { - TPUdpEvent udpack; + TPUdpAckEvent udpack(event); udpack.opcode = TPUDP; - udpack.udp[0] = ack.udp[0]; - udpack.udp[1] = ack.udp[1]; - udpack.ip[0] = ack.ip[0]; - udpack.ip[1] = ack.ip[1]; - udpack.ip[2] = ack.ip[2]; - udpack.ip[3] = ack.ip[3]; - udpack.ip[4] = ack.ip[4]; - udpack.mac[0] = ack.mac[0]; - udpack.mac[1] = ack.mac[1]; + udpack.status = 0; port.send(udpack); - } - break; + } break; case TP_VERSION: - { - TPVersionEvent versionack; + { + TPVersionAckEvent versionack; versionack.opcode = TPVERSION; - versionack.boardid = 1; - versionack.swversion = 1; - versionack.boardversion = 1; - versionack.tp_version = 1; - versionack.mp_version[0] = 2; - versionack.mp_version[1] = 2; - versionack.mp_version[2] = 2; - versionack.mp_version[3] = 2; + versionack.status = 0x3; + versionack.boardid = 0; + versionack.swversion = 10; + versionack.boardversion = 56; + versionack.tpversion = 4; + versionack.mp0version = 0; + versionack.mp1version = 1; + versionack.mp2version = 2; + versionack.mp3version = 3; + port.send(versionack); - } - break; + } break; + case TP_STATUS: + { + TPStatusAckEvent statusack; + statusack.opcode = TPSTATUS; + statusack.status = 0; + statusack.V12 = 12; + statusack.V25 = 25; + statusack.V33 = 33; + statusack.Tpcb = 40; + statusack.Ttp = 44; + statusack.Tmp0 = 1; + statusack.Tmp1 = 2; + statusack.Tmp2 = 3; + statusack.Tmp3 = 3; + + port.send(statusack); + } break; + case TP_SIZE: { - TPSizeEvent sizeack; + TPSizeAckEvent sizeack; sizeack.opcode = TPSIZE; - sizeack.size = 8; + sizeack.status = 0; + sizeack.npages = 4000000; port.send(sizeack); - } - break; + } break; case TP_CLEAR: { - TPClearEvent clearack; + TPClearAckEvent clearack(event); clearack.opcode = TPCLEAR; + clearack.status = 0; port.send(clearack); - } - break; + } break; case TP_RESET: { - TPResetEvent resetack; + TPResetAckEvent resetack(event); resetack.opcode = TPRESET; + resetack.status = 0; port.send(resetack); - } - break; + } break; case TP_CONFIG: { - TPConfigEvent configack; + TPConfigAckEvent configack(event); configack.opcode = TPCONFIG; - configack.image = ack.image; - } - break; + configack.status = 0; + port.send(configack); + } break; case TP_ERASEF: { - TPErasefEvent erasefack; + TPErasefAckEvent erasefack(event); erasefack.opcode = TPERASEF; - erasefack.addr = ack.addr; - } - break; + erasefack.status = 0; + port.send(erasefack); + } break; case TP_READF: { - TPReadfEvent readfack; + TPReadfAckEvent readfack(event); readfack.opcode = TPREADF; - readfack.addr = ack.addr; - readfack.data = ack.data; + readfack.status = 0; port.send(readfack); - } - break; + } break; case TP_WRITEF: { - TPWritefEvent writefack; + TPWritefAckEvent writefack(event); writefack.opcode = TPWRITEF; - writefack.addr = ack.addr; - writefack.data = ack.data; + writefack.status = 0; port.send(writefack); - } - break; + } break; case TP_READW: { - TPReadwEvent readwack; + TPReadwAckEvent readwack(event); readwack.opcode = TPREADW; - readwack.mp = ack.mp; - readwack.addr = ack.addr; - readwack.wordlo = ack.wordlo; - readwack.wordhi = ack.wordhi; + readwack.status = 0; port.send(readwack); - } - break; + } break; case TP_WRITEW: { - TPWritewEvent writewack; + TPWritewAckEvent writewack(event); writewack.opcode = TPWRITEW; - writewack.mp = ack.mp; - writewack.addr = ack.addr; - writewack.wordlo = ack.wordlo; - writewack.wordhi = ack.wordhi; + writewack.status = 0; port.send(writewack); - } - break; + } break; case F_DISCONNECTED: { port.close(); TRAN(TPStub::initial); - } - break; + } break; case F_EXIT: { - } - break; + } break; - default: + default: { + LOG_DEBUG_STR("default: unknown command"); status = GCFEvent::NOT_HANDLED; - break; + } break; } return status; } -GCFEvent::TResult TPStub::final(GCFEvent& ack, GCFPortInterface& /*port*/) +GCFEvent::TResult TPStub::final(GCFEvent &event, GCFPortInterface& /*port*/) { GCFEvent::TResult status = GCFEvent::HANDLED; - switch(ack.signal) + switch(event.signal) { case F_ENTRY: { GCFTask::stop(); - } - break; + } break; case F_EXIT: break; @@ -354,8 +342,18 @@ void TPStub::run() int main(int argc, char** argv) { GCFTask::init(argc, argv); - - LOG_INFO(formatString("Program %s has started", argv[0])); + + LOG_DEBUG_STR("Reading configuration files"); + try { + ConfigLocator cl; + globalParameterSet()->adoptFile(cl.locate("TPStub.conf")); + } + catch (LOFAR::Exception e) { + LOG_ERROR_STR("Failed to load configuration files: " << e.text()); + //exit(EXIT_FAILURE); + } + + //LOG_INFO(formatString("Program %s has started", argv[0])); TPStub stub("TPStub"); stub.run(); diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in b/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in index c5fe6b0c4ea9909f1893ba8576a03389b4aa563d..42910b3a136d7c1f98a82144afdc1efbcdb58ddd 100644 --- a/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in +++ b/MAC/APL/PIC/TBBDriver/test/TPStub.conf.in @@ -3,12 +3,12 @@ # # -# MAC address of lofar27, eth2, 00:0A:5E:46:5D:ED -# This sets the destination MAC address of the EPA response events +# MAC address of rs002, eth1, 00:30:48:2D:82:F7 +# This sets the destination MAC address of the TP response events # -TPStub.MAC_ADDR_TBBDRIVER=00:50:04:32:B8:5C +TPStub.MAC_ADDR_TBBDRIVER=00:30:48:2D:82:F7 # # Interface on which to listen for TBBDriver events # -TPStub.IF_NAME=eth2 +TPStub.IF_NAME=eth1 diff --git a/MAC/APL/PIC/TBBDriver/test/TPStub.h b/MAC/APL/PIC/TBBDriver/test/TPStub.h index 59d6b572d9c7779feae8a91552ce69b2d4e53532..84bba37a8940165b3de79c2638bdefb44ce6dd50 100644 --- a/MAC/APL/PIC/TBBDriver/test/TPStub.h +++ b/MAC/APL/PIC/TBBDriver/test/TPStub.h @@ -29,8 +29,10 @@ #include <GCF/TM/GCF_Control.h> #include <GCF/TM/GCF_ETHRawPort.h> +#include "TP_Protocol.ph" + namespace LOFAR { - namespace TBB_Test { + namespace TBB_Test { class TPStub : public GCFTask, public Test { @@ -50,14 +52,14 @@ namespace LOFAR { * The initial and final state. */ /*@{*/ - GCFEvent::TResult initial(GCFEvent& e, GCFPortInterface &p); - GCFEvent::TResult final(GCFEvent& e, GCFPortInterface &p); + GCFEvent::TResult initial(GCFEvent &event, GCFPortInterface &port); + GCFEvent::TResult final(GCFEvent &event, GCFPortInterface &port); /*@}*/ /** * The stub states. */ - GCFEvent::TResult connected(GCFEvent& event, GCFPortInterface& port); + GCFEvent::TResult connected(GCFEvent &event, GCFPortInterface &port); /** @@ -70,7 +72,7 @@ namespace LOFAR { private: // ports - GCFETHRawPort m_client; + GCFETHRawPort itsServer; // // lookup for register pointers // typedef struct @@ -81,8 +83,8 @@ namespace LOFAR { // // reginfo m_reg[MEPHeader::MAX_PID + 1][MEPHeader::MAX_REGID + 1]; }; - - }; -}; + + } +} #endif /* TPSTUB_H_ */