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