diff --git a/MAC/APL/PIC/RSPDriver/src/BSWrite.cc b/MAC/APL/PIC/RSPDriver/src/BSWrite.cc index de7f32c45b8f08e55725fa24da143ef6666e2c01..346009459da0c4644a6c14af0c8d0ab327e069c9 100644 --- a/MAC/APL/PIC/RSPDriver/src/BSWrite.cc +++ b/MAC/APL/PIC/RSPDriver/src/BSWrite.cc @@ -42,6 +42,8 @@ using namespace RTC; BSWrite::BSWrite(GCFPortInterface& board_port, int board_id, int blp, const Scheduler& scheduler) : SyncAction(board_port, board_id, 1), m_blp(blp), m_scheduler(scheduler) { + m_mark.resize(StationSettings::instance()->nrRspBoards()); + m_mark = Timestamp(0,0); memset(&m_hdr, 0, sizeof(MEPHeader)); } @@ -54,12 +56,12 @@ void BSWrite::sendrequest() { // force read/write if DELAY_NEXT seconds after time mark - if (m_mark != Timestamp(0,0) && (m_mark + DELAY_NEXT <= m_scheduler.getCurrentTime())) { + if (m_mark(getBoardId()) != Timestamp(0,0) && (m_mark(getBoardId()) + DELAY_NEXT <= m_scheduler.getCurrentTime())) { Cache::getInstance().reset(); // reset all cache values to default Cache::getInstance().getState().force(); // force read/write of all register after clear - m_mark = Timestamp(0,0); // reset mark + m_mark(getBoardId()) = Timestamp(0,0); // reset mark } // skip update if the neither of the RCU's settings have been modified @@ -109,7 +111,7 @@ GCFEvent::TResult BSWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/ // change state to indicate that it has been applied in the hardware Cache::getInstance().getState().bs().write_ack((getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp); - m_mark = m_scheduler.getCurrentTime(); + m_mark(getBoardId()) = m_scheduler.getCurrentTime(); return GCFEvent::HANDLED; } diff --git a/MAC/APL/PIC/RSPDriver/src/BSWrite.h b/MAC/APL/PIC/RSPDriver/src/BSWrite.h index 44b80fecebf39144cf9ba9dab6bec70646025e27..4b42fcca78901a43c9cbcf9be8f9ba28e088a733 100644 --- a/MAC/APL/PIC/RSPDriver/src/BSWrite.h +++ b/MAC/APL/PIC/RSPDriver/src/BSWrite.h @@ -62,8 +62,8 @@ namespace LOFAR { private: EPA_Protocol::MEPHeader m_hdr; int m_blp; - const Scheduler& m_scheduler; // for getCurrentTime - RTC::Timestamp m_mark; // mark time + const Scheduler& m_scheduler; // for getCurrentTime + blitz::Array<RTC::Timestamp,1> m_mark; // mark time for each board }; }; }; diff --git a/MAC/APL/PIC/RSPDriver/src/Cache.cc b/MAC/APL/PIC/RSPDriver/src/Cache.cc index 042bfae5d3c8db88ed8771afd80e2b8caf182a01..a4bc2520609480ff95fcb39f4610f90a69398dbb 100644 --- a/MAC/APL/PIC/RSPDriver/src/Cache.cc +++ b/MAC/APL/PIC/RSPDriver/src/Cache.cc @@ -179,7 +179,7 @@ void CacheBuffer::reset(void) m_versions.ap().resize(StationSettings::instance()->nrBlps()); m_versions.ap() = versioninit; - m_clock = 0; //GET_CONFIG("RSPDriver.DEFAULT_SAMPLING_FREQUENCY", i); + m_clock = GET_CONFIG("RSPDriver.DEFAULT_SAMPLING_FREQUENCY", i); } RTC::Timestamp CacheBuffer::getTimestamp() const diff --git a/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc b/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc index 332a383b52f609e528e032a8aec74a87f6e994d3..45f9b6977c94cb2e72640d913d9f3d3c91ee3ca5 100644 --- a/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc +++ b/MAC/APL/PIC/RSPDriver/src/RSUWrite.cc @@ -52,6 +52,8 @@ static const EPA_Protocol::RSUReset g_RSU_RESET_NONE = { 0, 0, 0, 0 }; // No a RSUWrite::RSUWrite(GCFPortInterface& board_port, int board_id, const Scheduler& scheduler) : SyncAction(board_port, board_id, 1), m_scheduler(scheduler) { + m_mark.resize(StationSettings::instance()->nrRspBoards()); + m_mark = Timestamp(0,0); memset(&m_hdr, 0, sizeof(MEPHeader)); } @@ -66,14 +68,14 @@ void RSUWrite::sendrequest() reset.hdr.set(MEPHeader::RSU_RESET_HDR); // force read/write if WAIT_AFTER seconds after time mark - if (m_mark != Timestamp(0,0) && (m_mark + WAIT_AFTER <= m_scheduler.getCurrentTime())) { + if (m_mark(getBoardId()) != Timestamp(0,0) && (m_mark(getBoardId()) + WAIT_AFTER <= m_scheduler.getCurrentTime())) { // next write all BS registers on all AP's of this board for (int blp = 0; blp < StationSettings::instance()->nrBlpsPerBoard(); blp++) { Cache::getInstance().getState().bs().reset((getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + blp); Cache::getInstance().getState().bs().write_force((getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + blp); } - m_mark = Timestamp(0,0); // reset mark + m_mark(getBoardId()) = Timestamp(0,0); // reset mark } // cache modified? @@ -131,7 +133,7 @@ GCFEvent::TResult RSUWrite::handleack(GCFEvent& event, GCFPortInterface& /*port* // mark time if needed RSUSettings& s = Cache::getInstance().getBack().getRSUSettings(); if (s()(getBoardId()).getClear() || s()(getBoardId()).getReset()) { - m_mark = m_scheduler.getCurrentTime(); + m_mark(getBoardId()) = m_scheduler.getCurrentTime(); } Cache::getInstance().getBack().getRSUSettings()()(getBoardId()).setRaw(0); // clear the flags diff --git a/MAC/APL/PIC/RSPDriver/src/RSUWrite.h b/MAC/APL/PIC/RSPDriver/src/RSUWrite.h index 6c3ebefb3de18f46d0c0da8b7ce430cb9b8e4ccb..7b20138ed0c4ae93f60aa1dbbee201b4199e8ce0 100644 --- a/MAC/APL/PIC/RSPDriver/src/RSUWrite.h +++ b/MAC/APL/PIC/RSPDriver/src/RSUWrite.h @@ -62,9 +62,9 @@ namespace LOFAR { virtual GCFEvent::TResult handleack(GCFEvent& event, GCFPortInterface& port); private: - EPA_Protocol::MEPHeader m_hdr; - const Scheduler& m_scheduler; // for getCurrentTime - RTC::Timestamp m_mark; // mark time + EPA_Protocol::MEPHeader m_hdr; + const Scheduler& m_scheduler; // for getCurrentTime + blitz::Array<RTC::Timestamp, 1> m_mark; // mark time for all boards }; }; }; diff --git a/MAC/APL/PIC/RSPDriver/src/StatusRead.cc b/MAC/APL/PIC/RSPDriver/src/StatusRead.cc index 9dace3ec56dc1bebc23bad1b81d619e7d57acc10..1c447d2a782a9a15e480a605e2f6cf000cf61998 100644 --- a/MAC/APL/PIC/RSPDriver/src/StatusRead.cc +++ b/MAC/APL/PIC/RSPDriver/src/StatusRead.cc @@ -119,10 +119,12 @@ GCFEvent::TResult StatusRead::handleack(GCFEvent& event, GCFPortInterface& /*por case 200: if (0 == getBoardId()) { if (0 == Cache::getInstance().getBack().getClock()) { +#if 0 LOG_INFO_STR(formatString("Receiving initial clock setting from RSP board: %d MHz. Adjusting cache value.", ack.board.rsp.bp_clock)); Cache::getInstance().getFront().getClock() = ack.board.rsp.bp_clock; Cache::getInstance().getBack().getClock() = ack.board.rsp.bp_clock; +#endif } else if (ack.board.rsp.bp_clock != Cache::getInstance().getBack().getClock()) { LOG_WARN_STR(formatString("Reported clock (%d MHz) is different from cache settings (%d MHz)", ack.board.rsp.bp_clock, Cache::getInstance().getBack().getClock())); diff --git a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc index d4100a691a34142e2a6142d527996d25eb42a649..ff569754b51193636020b0f0daad75d1ccf311cd 100644 --- a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc +++ b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc @@ -47,6 +47,8 @@ using namespace RTC; TDSResultRead::TDSResultRead(GCFPortInterface& board_port, int board_id, const Scheduler& scheduler) : SyncAction(board_port, board_id, 1), m_delay(0), m_scheduler(scheduler) { + m_mark.resize(StationSettings::instance()->nrRspBoards()); + m_mark = Timestamp(0,0); memset(&m_hdr, 0, sizeof(MEPHeader)); } @@ -58,7 +60,7 @@ TDSResultRead::~TDSResultRead() void TDSResultRead::sendrequest() { // force read/write if WAIT_AFTER seconds after time mark - if (m_mark != Timestamp(0,0) && (m_mark + DELAY_NEXT <= m_scheduler.getCurrentTime())) { + if (m_mark(getBoardId()) != Timestamp(0,0) && (m_mark(getBoardId()) + DELAY_NEXT <= m_scheduler.getCurrentTime())) { // After changing the clock an RSP clear is required. @@ -71,7 +73,7 @@ void TDSResultRead::sendrequest() Cache::getInstance().getState().rsuclear().reset(getBoardId()); Cache::getInstance().getState().rsuclear().write_force(getBoardId()); - m_mark = Timestamp(0,0); // reset mark + m_mark(getBoardId()) = Timestamp(0,0); // reset mark } // skip update if the Clocks settings have not been modified @@ -160,7 +162,7 @@ GCFEvent::TResult TDSResultRead::handleack(GCFEvent& event, GCFPortInterface& /* Cache::getInstance().getState().tds().read_ack(getBoardId()); // mark completion of clock change - m_mark = m_scheduler.getCurrentTime(); + m_mark(getBoardId()) = m_scheduler.getCurrentTime(); } else { LOG_ERROR(formatString("TDSResultRead::handleack (160MHz): unexpected I2C result response, first mismatch @ %d", idiff)); @@ -178,7 +180,7 @@ GCFEvent::TResult TDSResultRead::handleack(GCFEvent& event, GCFPortInterface& /* Cache::getInstance().getState().tds().read_ack(getBoardId()); // mark completion of clock change - m_mark = m_scheduler.getCurrentTime(); + m_mark(getBoardId()) = m_scheduler.getCurrentTime(); } else { LOG_ERROR(formatString("TDSResultRead::handleack (200MHz): unexpected I2C result response, first mismatch @ %d", idiff)); @@ -196,7 +198,7 @@ GCFEvent::TResult TDSResultRead::handleack(GCFEvent& event, GCFPortInterface& /* Cache::getInstance().getState().tds().read_ack(getBoardId()); // mark completion of clock change - m_mark = m_scheduler.getCurrentTime(); + m_mark(getBoardId()) = m_scheduler.getCurrentTime(); } else { LOG_ERROR(formatString("TDSResultRead::handleack (OFF): unexpected I2C result response, first mismatch @ %d", idiff)); diff --git a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.h b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.h index 3dc155bd5f6b1e949819ce4eeb35df0999b98755..f4f3544ba6079d75bcc114cf6c7c0744ddbf526c 100644 --- a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.h +++ b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.h @@ -63,8 +63,8 @@ namespace LOFAR { EPA_Protocol::MEPHeader m_hdr; int m_delay; // used to delay reading back results - const Scheduler& m_scheduler; // for getCurrentTime - RTC::Timestamp m_mark; // mark time + const Scheduler& m_scheduler; // for getCurrentTime + blitz::Array<RTC::Timestamp, 1> m_mark; // mark time }; }; };