diff --git a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc index a6023941d4b531bd6359a11262e532676b8b5372..015b319b5f1a9c1b9a2a0ad1beac5a66b8e17fd5 100644 --- a/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/AllocCmd.cc @@ -52,7 +52,7 @@ AllocCmd::AllocCmd(): itsStage(0),itsRcuStatus(0) AllocCmd::~AllocCmd() { delete itsTPE; - delete itsTBBackE; + delete itsTBBackE; } // ---------------------------------------------------------------------------- @@ -275,7 +275,6 @@ void AllocCmd::sendTbbAckEvent(GCFPortInterface* clientport) } clientport->send(*itsTBBackE); - } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc index 6a34ffd101eb6c6cc8e72ce7fcf4d9081264d068..fbbe05fa2174b2d7c6bb896cc62889bff5fd4dc9 100644 --- a/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc +++ b/MAC/APL/PIC/TBBDriver/src/BoardCmdHandler.cc @@ -52,7 +52,8 @@ GCFEvent::TResult BoardCmdHandler::idle_state(GCFEvent& event, GCFPortInterface& } break; case F_ENTRY: { - itsCmd = 0; + //itsCmd = 0; + if (itsCmd) delete itsCmd; } break; case F_TIMER: { diff --git a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc index 19f3beb0c2735cd81fdfbc83b82bb0b4e6ec9aca..f348d262e1da723a5faeb0fa806d032a3ba7a51d 100644 --- a/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ClearCmd.cc @@ -49,7 +49,7 @@ ClearCmd::ClearCmd() ClearCmd::~ClearCmd() { delete itsTPE; - delete itsTBBackE; + delete itsTBBackE; } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc index 4a6c89c8f45766b5634abcdb6867066ebf62885e..2ff1a523d38b81d640d769abda791659f159eed3 100644 --- a/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ConfigCmd.cc @@ -50,7 +50,7 @@ ConfigCmd::ConfigCmd() ConfigCmd::~ConfigCmd() { delete itsTPE; - delete itsTBBackE; + delete itsTBBackE; } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc index 5bf79045a2f67431f2cfb64289ad530e663b7647..b25fcb0bcda0bbce2a23daa02d38f7da0139cfb6 100644 --- a/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc +++ b/MAC/APL/PIC/TBBDriver/src/DriverSettings.cc @@ -52,7 +52,7 @@ TbbSettings* TbbSettings::instance() // Default constructor // TbbSettings::TbbSettings() : - itsDriverVersion(19), // driver version 1.9 + itsDriverVersion(112), // set cvs version of TBBDriver.c (now 1.12) 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 @@ -82,6 +82,7 @@ TbbSettings::~TbbSettings() if (itsCh2RcuTable) delete itsCh2RcuTable; if (itsBoardInfo) delete itsBoardInfo; if (itsChannelInfo) delete itsChannelInfo; + if (theirTbbSettings) delete theirTbbSettings; } //---- get Tbb settings loaded from config file --- diff --git a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc index 93e9308c1d70b6a91569ee1cc3b5aec4cc546794..e4c66cce3b328380bbfe66a44ea76a013617b1ea 100644 --- a/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ImageInfoCmd.cc @@ -114,8 +114,21 @@ void ImageInfoCmd::saveTpAckEvent(GCFEvent& event) itsTPackE = new TPReadfAckEvent(event); if (itsTPackE->status == 0) { + char info[256]; + memset(info,0,256); + memcpy(info,&itsTPackE->data,256); + LOG_DEBUG_STR(formatString("ImageInfoCmd: %s",info)); + itsTBBackE->image_version[itsImage]= itsTPackE->data[0]; - itsTBBackE->write_date[itsImage] = itsTPackE->data[1]; + itsTBBackE->write_date[itsImage] = itsTPackE->data[1]; + + sscanf(&info[8],"%s %s", + &itsTBBackE->tp_file_name[itsImage][0], + &itsTBBackE->mp_file_name[itsImage][0]); + + + //itsTBBackE->image_version[itsImage]= itsTPackE->data[0]; + //itsTBBackE->write_date[itsImage] = itsTPackE->data[1]; itsImage++; if (itsImage == 32) { diff --git a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc index 38f6f1f4c25b8e1c199dcabb250aa1a7994e47a2..33ab1d00675d63b6e0a06948a107cbcd7b8c4c9b 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ReadfCmd.cc @@ -105,7 +105,7 @@ void ReadfCmd::sendTpEvent() { itsTPE->addr = static_cast<uint32>(itsBlock * FL_BLOCK_SIZE); TS->boardPort(getBoardNr()).send(*itsTPE); - TS->boardPort(getBoardNr()).setTimer(0.2); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc b/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc index 0cb42ac398d4779644d11fd1f65e564b45b56de9..f8dde5b124cde382a12225ed7a68c3d71b1faf6d 100644 --- a/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/ReadxCmd.cc @@ -47,7 +47,7 @@ ReadxCmd::ReadxCmd() ReadxCmd::~ReadxCmd() { delete itsTPE; - delete itsTBBackE; + delete itsTBBackE; } // ---------------------------------------------------------------------------- diff --git a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc index 60a389f5a8c277e5fe9b998fd6f88f5ec1acca4a..3d4cae6271b36288809582640e0ad7f435725af0 100644 --- a/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/SizeCmd.cc @@ -41,6 +41,7 @@ SizeCmd::SizeCmd() for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; + itsTBBackE->npages[boardnr] = 0; } setWaitAck(true); } diff --git a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc index 3b01d1dac3a9d0f8053e3f74f6860a3a94c199f4..1dd975197736c9a173c940670971f2dead3f280c 100644 --- a/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/StatusCmd.cc @@ -40,6 +40,15 @@ StatusCmd::StatusCmd() for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { itsTBBackE->status_mask[boardnr] = 0; + itsTBBackE->V12[boardnr] = 0; + itsTBBackE->V25[boardnr] = 0; + itsTBBackE->V33[boardnr] = 0; + itsTBBackE->Tpcb[boardnr] = 0; + itsTBBackE->Ttp[boardnr] = 0; + itsTBBackE->Tmp0[boardnr] = 0; + itsTBBackE->Tmp1[boardnr] = 0; + itsTBBackE->Tmp2[boardnr] = 0; + itsTBBackE->Tmp3[boardnr] = 0; } setWaitAck(true); } diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc index 0d10170151ae268d52b75a9e142c9f870c1e8f9b..2ec9d9d58e818333c5da9bb8c91d5b7b45a06bee 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.cc @@ -188,9 +188,14 @@ TBBDriver::TBBDriver(string name) //----------------------------------------------------------------------------- TBBDriver::~TBBDriver() { - delete cmdhandler; + delete [] itsBoard; + delete itsAliveTimer; + delete cmdhandler; delete msghandler; + delete [] itsResetCount; + delete itsTbbQueue; delete itsAlive; + if (cmd) delete cmd; } //----------------------------------------------------------------------------- @@ -212,27 +217,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; - free.status = 0; - free.channel = 0xFFFFFFFF; // send channel = -1 to free all inputs - 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; - 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(); + itsAcceptor.open(); } if (itsAcceptor.isConnected()) { TRAN(TBBDriver::idle_state); @@ -387,8 +372,7 @@ GCFEvent::TResult TBBDriver::idle_state(GCFEvent& event, GCFPortInterface& port) // look if the event is a Tbb event if (SetTbbCommand(event.signal)) { itsAliveTimer->cancelAllTimers(); - //itsAliveTimer->setTimer(ALIVECHECKTIME); - itsAliveTimer->setTimer((long)10); + itsAliveTimer->setTimer(ALIVECHECKTIME); status = cmdhandler->dispatch(event,port); TRAN(TBBDriver::busy_state); } else { @@ -510,6 +494,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) status = cmdhandler->dispatch(event,port); // dispatch ack from boards if (cmdhandler->tpCmdDone() == true) { + delete cmd; itsAliveTimer->setTimer((long)2); itsAliveCheck = false; TRAN(TBBDriver::idle_state); @@ -521,7 +506,7 @@ GCFEvent::TResult TBBDriver::busy_state(GCFEvent& event, GCFPortInterface& port) if (cmdhandler->tpCmdDone() == true){ // set ALIVE timer, and check for resets //if (!itsAliveCheck) { - // itsAliveTimer->setTimer((long)1); + // itsAliveTimer->setTimer((long)2); // itsAliveCheck = false; //} TRAN(TBBDriver::idle_state); @@ -678,10 +663,12 @@ bool TBBDriver::CheckAlive(GCFEvent& event, GCFPortInterface& port) //----------------------------------------------------------------------------- bool TBBDriver::SetTbbCommand(unsigned short signal) { - if (cmd) delete cmd; + if (cmd) { + //cmdhandler->setTpCmd(0); + delete cmd; + } switch(signal) { - case TBB_ALLOC: { AllocCmd *cmd; cmd = new AllocCmd(); diff --git a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in index 5b7e57f74c0966b738b1377f2d2efe2bea1ca733..7d286e5fa37e446eedb6566474f93e3515e81a47 100644 --- a/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in +++ b/MAC/APL/PIC/TBBDriver/src/TBBDriver.conf.in @@ -11,8 +11,8 @@ TBBDriver.IF_NAME=eth1 # # Communication settings for TBB boards # -TBBDriver.TP_RETRIES=1 -TBBDriver.TP_TIMEOUT=0.5 +TBBDriver.TP_RETRIES=2 +TBBDriver.TP_TIMEOUT=1.0 # # Specify the MAC addresses of all TBB boards diff --git a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc index fa9709c69004e5561a28fe515e7c6138ba4fb132..13fd9ca772ed6f7e9eb08f9ff353628e6151c60d 100644 --- a/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/VersionCmd.cc @@ -41,7 +41,15 @@ VersionCmd::VersionCmd() itsTBBackE = new TBBVersionAckEvent(); for(int boardnr = 0;boardnr < MAX_N_TBBBOARDS;boardnr++) { - itsTBBackE->status_mask[boardnr] = 0; + itsTBBackE->status_mask[boardnr] = 0; + itsTBBackE->boardid[boardnr] = 0; + itsTBBackE->swversion[boardnr] = 0; + itsTBBackE->boardversion[boardnr] = 0; + itsTBBackE->tpversion[boardnr] = 0; + itsTBBackE->mp0version[boardnr] = 0; + itsTBBackE->mp1version[boardnr] = 0; + itsTBBackE->mp2version[boardnr] = 0; + itsTBBackE->mp3version[boardnr] = 0; } setWaitAck(true); } @@ -74,7 +82,7 @@ void VersionCmd::saveTbbEvent(GCFEvent& event) itsTBBackE->status_mask[boardnr] |= TBB_NO_BOARD; } - itsTBBackE->driverversion = TS->driverVersion(); + itsTBBackE->driverversion = TS->driverVersion(); // set cvs version of TBBDriver.c // select firt board nextBoardNr(); diff --git a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc index c3ec24de42982a1c063fc7d9ddb774a0ea9914d9..811f392aa3d5e009015bf8180eabc8cc381068a7 100644 --- a/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc +++ b/MAC/APL/PIC/TBBDriver/src/WritefCmd.cc @@ -55,9 +55,9 @@ WritefCmd::WritefCmd(): TS = TbbSettings::instance(); itsTPE = new TPWritefEvent(); itsTPackE = 0; - itsTBBE = 0; + itsTBBE = 0; itsTBBackE = new TBBWriteImageAckEvent(); - itsImageData= 0; + itsImageData = new uint8[2097152]; itsTBBackE->status_mask = 0; setWaitAck(true); @@ -69,7 +69,7 @@ WritefCmd::~WritefCmd() delete itsTPE; delete itsTBBackE; if (itsTBBE) delete itsTBBE; - if (itsImageData) delete itsImageData; + delete [] itsImageData; } // ---------------------------------------------------------------------------- @@ -87,7 +87,7 @@ bool WritefCmd::isValid(GCFEvent& event) // ---------------------------------------------------------------------------- void WritefCmd::saveTbbEvent(GCFEvent& event) { - itsTBBE = new TBBWriteImageEvent(event); + itsTBBE = new TBBWriteImageEvent(event); itsTBBackE->status_mask = 0; if (TS->isBoardActive(itsTBBE->board)) { @@ -103,9 +103,6 @@ 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[2097152]; - readFiles(); LOG_DEBUG_STR("Image files are read"); @@ -150,7 +147,7 @@ void WritefCmd::sendTpEvent() } TS->boardPort(getBoardNr()).send(*itsTPE); - TS->boardPort(getBoardNr()).setTimer(0.2); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); } break; // stage 3, verify flash @@ -160,7 +157,7 @@ void WritefCmd::sendTpEvent() readfEvent->status = 0; readfEvent->addr = static_cast<uint32>(itsBlock * FL_BLOCK_SIZE); TS->boardPort(getBoardNr()).send(*readfEvent); - TS->boardPort(getBoardNr()).setTimer(0.2); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); delete readfEvent; } break; @@ -173,6 +170,25 @@ void WritefCmd::sendTpEvent() } time_t write_time; time(&write_time); + + // print write date and used TP and MP filename + char info[256]; + memset(info,0,256); + + char *tp_name = strstr(itsFileNameTp,"tp"); + char *mp_name = strstr(itsFileNameMp,"mp"); + + sprintf(info," %s %s",tp_name,mp_name); + LOG_DEBUG_STR(formatString("ImageInfo: %s",info)); + + itsTPE->data[0] = static_cast<uint32>(itsTBBE->version); + itsTPE->data[1] = static_cast<uint32>(write_time); + memcpy(&itsTPE->data[2],info,sizeof(info)); + + //memcpy(&itsTPE->data[0],write_time,sizeof(uint32)); + //memcpy(&itsTPE->data[1],itsFileNameTp,sizeof(char) * 64); + //memcpy(&itsTPE->data[1+16],itsFileNameMp,sizeof(char) * 64); + /* itsTPE->data[0] = static_cast<uint32>(itsTBBE->version); itsTPE->data[1] = static_cast<uint32>(write_time); itsTPE->data[2] = 300; @@ -183,8 +199,9 @@ void WritefCmd::sendTpEvent() itsTPE->data[7] = 800; itsTPE->data[8] = 900; itsTPE->data[9] = 1000; + */ TS->boardPort(getBoardNr()).send(*itsTPE); - TS->boardPort(getBoardNr()).setTimer(0.2); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); LOG_DEBUG_STR("Writing image info"); LOG_DEBUG_STR(formatString("%u %u",itsTPE->data[0],itsTPE->data[1])); } break; @@ -196,7 +213,7 @@ void WritefCmd::sendTpEvent() itsBlock = (itsImage * FL_BLOCKS_IN_PAGE) + (FL_BLOCKS_IN_PAGE - 1); readfEvent->addr = static_cast<uint32>(itsBlock * FL_BLOCK_SIZE); TS->boardPort(getBoardNr()).send(*readfEvent); - TS->boardPort(getBoardNr()).setTimer(0.2); + TS->boardPort(getBoardNr()).setTimer(TS->timeout()); LOG_DEBUG_STR("Verifying image info"); delete readfEvent; } break; @@ -225,6 +242,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) itsStage = write_flash; } } else { + itsTBBackE->status_mask |= TBB_FLASH_ERROR; LOG_DEBUG_STR("Received status > 0 (WritefCmd(erase_flash stage))"); setDone(true); } @@ -237,6 +255,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) if (itsTPackE->status == 0) { itsStage = verify_flash; } else { + itsTBBackE->status_mask |= TBB_FLASH_ERROR; LOG_DEBUG_STR("Received status > 0 (WritefCmd(write_flash stage))"); setDone(true); } @@ -260,6 +279,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) itsBlock++; itsStage = write_flash; } else { + itsTBBackE->status_mask |= TBB_FLASH_ERROR; setDone(true); } @@ -269,6 +289,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) itsStage = write_info; } } else { + itsTBBackE->status_mask |= TBB_FLASH_ERROR; LOG_DEBUG_STR("Received status > 0 (WritefCmd(verify_flash stage))"); setDone(true); } @@ -281,6 +302,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) if (itsTPackE->status == 0) { itsStage = verify_info; } else { + itsTBBackE->status_mask |= TBB_FLASH_ERROR; LOG_DEBUG_STR(formatString("Received status > 0 (0x%08X) (WritefCmd(write_info stage))",itsTPackE->status)); setDone(true); } @@ -294,7 +316,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) TPReadfAckEvent *readfAckEvent = new TPReadfAckEvent(event); if (readfAckEvent->status == 0) { - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 64; i++) { if (readfAckEvent->data[i] != itsTPE->data[i]) { LOG_DEBUG_STR(formatString("image info %d not same 0x%08X 0x%08X (WritefCmd(verify_info stage))",i,readfAckEvent->data[i],itsTPE->data[i])); same = false; @@ -304,6 +326,7 @@ void WritefCmd::saveTpAckEvent(GCFEvent& event) itsTBBackE->status_mask |= TBB_FLASH_ERROR; } } else { + itsTBBackE->status_mask |= TBB_FLASH_ERROR; LOG_DEBUG_STR(formatString("Received status > 0 (0x%08X) (WritefCmd(verify_info stage))",readfAckEvent->status)); } delete readfAckEvent; diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc index 1cb8916ca54c636dfbc76f7efec1cef5ab12ed5c..42fc54fc181710b7080d8037e113dd278666a7e9 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.cc +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.cc @@ -242,7 +242,7 @@ GCFEvent::TResult RecordCmd::ack(GCFEvent& e) if (isSelected(cnr) && !(ack.status_mask[bnr] & TBB_NO_BOARD) ) { if (ack.rcu_mask.test(cnr)) { if (ack.status_mask[bnr] & TBB_SUCCESS) { - logMessage(cout,formatString(" ERROR, Rcu-%d NOT in correct state\n",cnr)); + //logMessage(cout,formatString(" ERROR, Rcu-%d NOT in correct state\n",cnr)); } else { logMessage(cout,formatString(" ERROR, Rcu-%d %s\n",cnr,getDriverErrorStr(ack.status_mask[bnr]).c_str())); } @@ -297,7 +297,7 @@ GCFEvent::TResult StopCmd::ack(GCFEvent& e) if (isSelected(cnr) && !(ack.status_mask[bnr] & TBB_NO_BOARD) ) { if (ack.rcu_mask.test(cnr)) { if (ack.status_mask[bnr] & TBB_SUCCESS) { - logMessage(cout,formatString(" ERROR, Rcu-%d NOT in correct state\n",cnr)); + //logMessage(cout,formatString(" ERROR, Rcu-%d NOT in correct state\n",cnr)); } else { logMessage(cout,formatString(" ERROR, Rcu-%d %s\n",cnr,getDriverErrorStr(ack.status_mask[bnr]).c_str())); } @@ -604,7 +604,7 @@ GCFEvent::TResult VersionCmd::ack(GCFEvent& e) { TBBVersionAckEvent ack(e); - logMessage(cout,formatString("TBBDriver software version %3.1f\n",(ack.driverversion / 10.))); + logMessage(cout,formatString("TBBDriver software version %3.2f\n",(ack.driverversion / 100.))); logMessage(cout,"TBB ID Software Board TP0 MP0 MP1 MP2 MP3"); logMessage(cout,"--- -- -------- ------- ------- ------- ------- ------- -------"); for (int bnr=0; bnr < getMaxSelections(); bnr++) { @@ -966,12 +966,13 @@ GCFEvent::TResult ImageInfoCmd::ack(GCFEvent& e) { TBBImageInfoAckEvent ack(e); logMessage(cout,formatString("Reading image information from TBB %d\n", getBoard())); - logMessage(cout,"IMAGE Version Flash date"); - logMessage(cout,"----- ------- -------------------"); + logMessage(cout,"IMAGE SW Flash date_time TP file name MP file name"); + logMessage(cout,"----- ------ ------------------- -------------- --------------"); if (ack.status_mask & TBB_SUCCESS) { for (int image = 0; image < 32; image++) { - if (ack.image_version[image] > 0xF0000000) { - logMessage(cout,formatString(" %2d - - no image information",image)); + if (ack.write_date[image] == 0xFFFFFFFF) { + //logMessage(cout,formatString(" %2d no information",image)); + logMessage(cout,formatString(" %2d free",image)); } else { time_t write_time; struct tm t; @@ -980,8 +981,13 @@ GCFEvent::TResult ImageInfoCmd::ack(GCFEvent& e) write_time = static_cast<time_t>(ack.write_date[image]); t = *gmtime(&write_time); version = static_cast<double>(ack.image_version[image] / 10.); - logMessage(cout,formatString(" %2d %5.1f %d-%d-%d %d:%02d:%02d",image, version, - t.tm_mday,t.tm_mon,t.tm_year+1900,t.tm_hour,t.tm_min,t.tm_sec)); + logMessage(cout,formatString(" %2d V%5.1lf %d-%d-%d_%d:%02d:%02d %-14.14s %-14.14s", + image, + version, + t.tm_mday,t.tm_mon+1,t.tm_year+1900, + t.tm_hour,t.tm_min,t.tm_sec, + ack.tp_file_name[image], + ack.mp_file_name[image])); } } } else { @@ -1323,7 +1329,7 @@ GCFEvent::TResult WriterCmd::ack(GCFEvent& e) ReadPageCmd::ReadPageCmd(GCFPortInterface& port) : Command(port), itsRcu(0),itsStartPage(0),itsPages(1),itsCmdStage(0),itsPage(0),itsTotalSize(0),itsStartAddr(0),itsSize(0),itsBoard(0),itsMp(0), itsStationId(0),itsRspId(0),itsRcuId(0),itsSampleFreq(0),itsTime(0),itsSampleNr(0),itsSamplesPerFrame(0), - itsFreqBands(0),itsTotalSamples(0),itsTotalBands(0) + itsFreqBands(0),itsTotalSamples(0),itsTotalBands(0), itsBandNr(0), itsSliceNr(0) { for (int i = 0; i < 512; i++) itsData[i] = 0; logMessage(cout,"\n==== TBB-board, readx register ================================================\n"); @@ -1349,6 +1355,9 @@ void ReadPageCmd::send() case 2: { // write page address to board TBBWriterEvent send; + + itsMp = static_cast<int32>((itsStartPage + itsPage) / itsTotalSize); // MP of requested addr + send.board = itsBoard; send.mp = itsMp; send.pid = PID6; @@ -1417,7 +1426,15 @@ void ReadPageCmd::send() //----------------------------------------------------------------------------- GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) { + char basefilename[PATH_MAX]; + char filename[PATH_MAX]; + char timestring[256]; + int16 val[1400]; + + double bar_size = 40; + static double bar_interval = 1; + static double bar_buff = 0; switch (itsCmdStage) { @@ -1428,7 +1445,7 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) 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); + //itsMp = static_cast<int32>(ack.rcu_on_input[itsRcu] / 4); logMessage(cout,formatString("Rcu-%d Board[%d] Mp[%d]",itsRcu,itsBoard,itsMp)); itsStartPage += itsStartAddr; @@ -1446,10 +1463,12 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) itsCmdStage = 10; } else { itsTotalSize = ack.npages[itsBoard] / 4; - if ((itsStartPage < itsStartAddr) || (itsStartPage > (itsStartAddr + itsTotalSize))) { + + if ((itsStartPage < itsStartAddr) || ((itsStartPage + itsPages) > (itsStartAddr + itsSize))) { logMessage(cout,formatString("Requested Page belongs not to rcu-%d", itsRcu)); + } else { + logMessage(cout,formatString("StartPage = %u ",itsStartPage)); } - logMessage(cout,formatString("StartPage = %u ",itsStartPage)); } } break; @@ -1501,50 +1520,97 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) } itsCmdStage++; - if (itsCmdStage < 6) { - //itsPort.setTimer(0.01); - } else { - + if (itsCmdStage > 5) { // if stage > 5, received 1 frame + bar_buff += 1; if (itsPage == 0) { + 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]); + itsTime = static_cast<time_t>(itsData[2]); + itsFreqBands = static_cast<int>((itsData[4] >> 16) & 0xFFFF); + + if (itsFreqBands == 0) { + itsSampleNr = static_cast<int>(itsData[3]); + } else { + itsBandNr = static_cast<int>(itsData[3] & 0x03FF); + itsSliceNr = static_cast<int>(itsData[3] >> 10); + } + strftime(timestring, 255, "%Y%m%d_%H%M%S", gmtime(&itsTime)); + + cout << "Station ID : " << itsStationId << endl; + cout << "RSP ID : " << itsRspId << endl; + cout << "RCU ID : " << itsRcuId << endl; + cout << "Sample freq : " << itsSampleFreq << " MHz" << endl; + if (itsTime < 0) { + cout << "Time : invalid" << endl; + } else { + cout << "Time of 1e sample/slice : " << timestring << " (" << (uint32)itsTime << ")" << endl ; + } + if (itsTotalBands > 0) { + cout << "Slice number of 1e slice : " << itsSliceNr << endl; + cout << "Band number of 1e sample : " << itsBandNr << endl; + cout << "Number of bands : " << itsTotalBands << endl; + cout << "Data file format : binary complex(int16 Re, int16 Im)" << endl; + } else { + cout << "Sample number of 1e sample : " << itsSampleNr << endl; + cout << "Data file format : binary int16" << endl; + } + + // print size of progressbar on screen + bar_interval = itsPages / bar_size; + + cout << "|"; + for (int i = 0; i < bar_size; i++) { + cout << "-"; + } + cout << "|" << endl ; + cout << "|"; + + + snprintf(basefilename, PATH_MAX, "%s_%s_%02d%02d",(itsTotalBands == 0)?"rw":"sb",timestring,itsStationId,itsRcuId); } itsSamplesPerFrame = static_cast<int>(itsData[4] & 0xFFFF); - itsFreqBands = static_cast<int>((itsData[4] >> 16) & 0xFFFF); - + + // print receive progress on screen + if (bar_interval < 1.) { + int count = ceil(bar_buff / bar_interval); + for (int i = 0; i < count; i++) { + cout << "x" << flush; + } + bar_buff -= (count * bar_interval); + } else { + if (bar_buff >= bar_interval) { + cout << "x" << flush; + bar_buff -= bar_interval; + } + } + int sample_cnt = 0; int val_cnt = 0; int data_cnt = 22; // 22 = startadress of data in frame - - if (itsFreqBands > 0) { - // its SPECTRAL data + // extract payload + if (itsFreqBands > 0) { // if itsFreqBands > 0 then it's SPECTRAL data if (itsSamplesPerFrame < 975) { itsTotalSamples += itsSamplesPerFrame; - itsTotalBands += itsFreqBands; - //logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands)); + // convert uint32 to complex int16 while (sample_cnt < itsSamplesPerFrame) { - // get complex sample 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++; } } - } else { - // its RAW data + } else { // if itsFreqBands = 0, it's RAW data + if (itsSamplesPerFrame < 1299) { - itsTotalSamples += itsSamplesPerFrame; - itsTotalBands += itsFreqBands; - //logMessage(cout,formatString("Samples[%d] Bands[%d]",itsTotalSamples,itsTotalBands)); - // convert uint32 to int12 uint32 data[3]; - + itsTotalSamples += itsSamplesPerFrame; + + // 1e convert uint32 to int12 while (sample_cnt < itsSamplesPerFrame) { // get 96 bits from received data data[0] = itsData[data_cnt++]; @@ -1564,78 +1630,77 @@ GCFEvent::TResult ReadPageCmd::ack(GCFEvent& e) sample_cnt += 8; } - // convert all received samples from signed 12bit to signed 16bit + // 2e convert all received samples from signed 12bit to signed 16bit for (int cnt = 0; cnt < val_cnt; cnt++) { if (val[cnt] & 0x0800) val[cnt] |= 0xF000; } } } + // 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) { - 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); - + // save unpacked frame to file snprintf(filename, PATH_MAX, "%s.dat",basefilename); file = fopen(filename,"a"); - fwrite(val,sizeof(int16),val_cnt,file); + fwrite(&itsData[0],sizeof(uint32),22,file); // frame header 88 bytes (4 x 22) + fwrite(&val[0],sizeof(int16),val_cnt,file); // payload + fwrite(&itsData[509],sizeof(uint32),1,file); // payload CRC 4 bytes (4 x 1) fclose(file); } + itsPage++; - if (itsPage < itsPages) { - itsCmdStage = 2; + if ((itsPage < itsPages) && (itsPage < itsSize)) { + itsCmdStage = 2; } else { - // print page information + // last page received, print last info on screen + cout << "|" << endl; + cout << "Total received frames : " << itsPage << endl; + cout << "Total received samples: " << itsTotalSamples << endl; + + if (val_cnt > 0) { + cout << "Filename : " << basefilename << ".nfo" << endl; + cout << " : " << basefilename << ".dat" << endl;; + cout << "Each frame exists of:" << endl; + cout << " HEADER(88 bytes) + PAYLOAD(see header for size) + PAYLOAD_CRC(4 bytes)" << endl; + } else { + cout << "Filename : NO DATA IN FRAME" << endl; + } + + + + // save page information to file strftime(timestring, 255, "%Y-%m-%d %H:%M:%S", gmtime(&itsTime)); + + snprintf(filename, PATH_MAX, "%s.nfo",basefilename); + file = fopen(filename,"w"); - 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); + fprintf(file, "Station ID : %d",itsStationId); + fprintf(file, "RSP ID : %d",itsRspId); + fprintf(file, "RCU ID : %d",itsRcuId); + fprintf(file, "Sample freq : %d MHz",itsSampleFreq); if (itsTime < 0) { - sprintf(line[4],"Time : invalid"); + fprintf(file,"Time : invalid"); } else { - sprintf(line[4],"Time : %s (%u)",timestring,(uint32)itsTime); + fprintf(file,"Time of 1e sample/slice : %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)"); + if (itsTotalBands > 0) { + fprintf(file,"Slice number of 1e slice : %u",itsSliceNr); + fprintf(file,"Band number of 1e sample : %u",itsBandNr); + fprintf(file,"Number of bands : %u",itsTotalBands); + fprintf(file,"Data file format : binary complex(int16 Re, int16 Im)"); } else { - 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++) { - fprintf(file,line[lnr]); - fprintf(file,"\n"); - } - fclose(file); - } - - for (int32 lnr = 0;lnr < 10; lnr++) { - logMessage(cout,line[lnr]); + fprintf(file,"Sample number of 1e sample : %u",itsSampleNr); + fprintf(file,"Total number of samples : %u",itsTotalSamples); + fprintf(file,"Data file format : binary int16"); + fprintf(file," "); } + fclose(file); } } + if (itsPage == itsPages) { - setCmdDone(true); } @@ -1663,9 +1728,9 @@ void TBBCtl::help() 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 --triginfo=rcu # get trigger info for selected rcu\n"); - logMessage(cout,"tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages # transfer recorded data from rcunr to CEP"); + logMessage(cout,"tbbctl --read=rcunr,secondstime,sampletime,prepages,postpages # transfer recorded data from rcunr to CEP, use --mode first"); 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"); logMessage(cout,"tbbctl --status [--select=<set>] # get status information from selected boards"); @@ -1700,14 +1765,14 @@ TBBCtl::TBBCtl(string name, int argc, char** argv): GCFTask((State)&TBBCtl::init } registerProtocol(TBB_PROTOCOL, TBB_PROTOCOL_signalnames); itsServerPort.init(*this, MAC_SVCMASK_TBBDRIVER, GCFPortInterface::SAP, TBB_PROTOCOL); + itsCmdTimer = new GCFTimerPort(*this, "AliveTimer"); } //----------------------------------------------------------------------------- TBBCtl::~TBBCtl() { - if (itsCommand) { - delete itsCommand; - } + if (itsCommand) { delete itsCommand; } + if (itsCmdTimer) { delete itsCmdTimer; } } //----------------------------------------------------------------------------- @@ -1803,11 +1868,14 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port) } break; case F_TIMER: { - //itsCommand->send(); - logMessage(cout,"Timeout, tbbctl stopped\n"); - TBBUnsubscribeEvent unsubscribe; - itsServerPort.send(unsubscribe); - GCFTask::stop(); + if (&port == itsCmdTimer) { + itsCommand->send(); + } else { + logMessage(cout,"Timeout, tbbctl stopped\n"); + TBBUnsubscribeEvent unsubscribe; + itsServerPort.send(unsubscribe); + GCFTask::stop(); + } } break; case TBB_TRIG_GENERATE_ACK: @@ -1816,8 +1884,6 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port) itsServerPort.setTimer((long)5); status = itsCommand->ack(e); // handle the acknowledgement } break; - - case TBB_ALLOC_ACK: case TBB_RCU_INFO_ACK: @@ -1849,7 +1915,8 @@ GCFEvent::TResult TBBCtl::docommand(GCFEvent& e, GCFPortInterface& port) status = itsCommand->ack(e); // handle the acknowledgement if (!itsCommand->isCmdDone()) { // not done send next command - itsCommand->send(); + //itsCommand->send(); + itsCmdTimer->setTimer((long)0); } } break; diff --git a/MAC/APL/PIC/TBBDriver/src/tbbctl.h b/MAC/APL/PIC/TBBDriver/src/tbbctl.h index fb261114fcee21428264c9ca88f5adc02818b655..442a873e80793ff00c15df6d6cd2256b9e27d20e 100644 --- a/MAC/APL/PIC/TBBDriver/src/tbbctl.h +++ b/MAC/APL/PIC/TBBDriver/src/tbbctl.h @@ -29,6 +29,7 @@ #include <GCF/TM/GCF_Control.h> #include <GCF/TM/GCF_ETHRawPort.h> +#include <GCF/TM/GCF_TimerPort.h> #include <Common/lofar_bitset.h> #include <Common/lofar_list.h> #include <Common/lofar_string.h> @@ -665,6 +666,8 @@ class ReadPageCmd : public Command int itsFreqBands; int itsTotalSamples; int itsTotalBands; + int itsBandNr; + int itsSliceNr; }; @@ -716,8 +719,8 @@ private: void help(); private: // ports - GCFPort itsServerPort; - + GCFPort itsServerPort; + GCFTimerPort* itsCmdTimer; // the command to execute Command* itsCommand;