From e57f8a2e22be049eb5b49b422f8c88b7e234bb6c Mon Sep 17 00:00:00 2001 From: wierenga <sdos@astron.nl> Date: Thu, 6 Jul 2006 14:17:38 +0000 Subject: [PATCH] BugID: 778 m_mark must be kept separately for each RSP board. --- MAC/APL/PIC/RSPDriver/src/BSWrite.cc | 8 +++++--- MAC/APL/PIC/RSPDriver/src/BSWrite.h | 4 ++-- MAC/APL/PIC/RSPDriver/src/Cache.cc | 2 +- MAC/APL/PIC/RSPDriver/src/RSUWrite.cc | 8 +++++--- MAC/APL/PIC/RSPDriver/src/RSUWrite.h | 6 +++--- MAC/APL/PIC/RSPDriver/src/StatusRead.cc | 2 ++ MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc | 12 +++++++----- MAC/APL/PIC/RSPDriver/src/TDSResultRead.h | 4 ++-- 8 files changed, 27 insertions(+), 19 deletions(-) diff --git a/MAC/APL/PIC/RSPDriver/src/BSWrite.cc b/MAC/APL/PIC/RSPDriver/src/BSWrite.cc index de7f32c45b8..346009459da 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 44b80fecebf..4b42fcca789 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 042bfae5d3c..a4bc2520609 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 332a383b52f..45f9b6977c9 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 6c3ebefb3de..7b20138ed0c 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 9dace3ec56d..1c447d2a782 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 d4100a691a3..ff569754b51 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 3dc155bd5f6..f4f3544ba60 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 }; }; }; -- GitLab