Skip to content
Snippets Groups Projects
Commit e57f8a2e authored by wierenga's avatar wierenga
Browse files

BugID: 778

m_mark must be kept separately for each RSP board.
parent ae4fcb77
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
......@@ -63,7 +63,7 @@ namespace LOFAR {
EPA_Protocol::MEPHeader m_hdr;
int m_blp;
const Scheduler& m_scheduler; // for getCurrentTime
RTC::Timestamp m_mark; // mark time
blitz::Array<RTC::Timestamp,1> m_mark; // mark time for each board
};
};
};
......
......@@ -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
......
......@@ -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
......
......@@ -64,7 +64,7 @@ namespace LOFAR {
private:
EPA_Protocol::MEPHeader m_hdr;
const Scheduler& m_scheduler; // for getCurrentTime
RTC::Timestamp m_mark; // mark time
blitz::Array<RTC::Timestamp, 1> m_mark; // mark time for all boards
};
};
};
......
......@@ -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()));
......
......@@ -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));
......
......@@ -64,7 +64,7 @@ namespace LOFAR {
int m_delay; // used to delay reading back results
const Scheduler& m_scheduler; // for getCurrentTime
RTC::Timestamp m_mark; // mark time
blitz::Array<RTC::Timestamp, 1> m_mark; // mark time
};
};
};
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment