From 7da299d6fbf3fface1528b22e0a8ce5222edf11d Mon Sep 17 00:00:00 2001
From: wierenga <sdos@astron.nl>
Date: Wed, 8 Nov 2006 15:00:10 +0000
Subject: [PATCH] BugID: 781 Use new namespace for constants that were moved to
 MEPHeader.h.

Use new register state flags for each write to a hardware register.
Replace write_force() calls by write() calls.
---
 MAC/APL/PIC/RSPDriver/src/BWRead.cc           |  2 +-
 MAC/APL/PIC/RSPDriver/src/BWWrite.cc          | 31 +++++++++++++++---
 MAC/APL/PIC/RSPDriver/src/CDOWrite.cc         | 13 ++++----
 MAC/APL/PIC/RSPDriver/src/RSPDriver.cc        |  2 +-
 MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in   | 25 +++++++++------
 .../PIC/RSPDriver/src/RemoteStation.conf.in   |  8 +----
 MAC/APL/PIC/RSPDriver/src/SSWrite.cc          | 21 ++++++++++++
 MAC/APL/PIC/RSPDriver/src/Sequencer.cc        | 32 +++++++++++--------
 MAC/APL/PIC/RSPDriver/src/SetHBACmd.cc        |  1 +
 MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc         |  3 +-
 MAC/APL/PIC/RSPDriver/src/SstRead.cc          | 23 +++++++------
 MAC/APL/PIC/RSPDriver/src/StationSettings.h   |  4 +--
 MAC/APL/PIC/RSPDriver/src/SyncAction.cc       |  5 ---
 MAC/APL/PIC/RSPDriver/src/SyncAction.h        |  3 +-
 MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc    |  2 +-
 MAC/APL/PIC/RSPDriver/src/WGRead.cc           |  2 +-
 MAC/APL/PIC/RSPDriver/src/WGWrite.cc          | 24 +++++++-------
 MAC/APL/PIC/RSPDriver/src/XWWrite.cc          | 24 ++++----------
 MAC/APL/PIC/RSPDriver/src/XstRead.cc          | 10 +++---
 19 files changed, 132 insertions(+), 103 deletions(-)

diff --git a/MAC/APL/PIC/RSPDriver/src/BWRead.cc b/MAC/APL/PIC/RSPDriver/src/BWRead.cc
index c404990383a..a67edf751fc 100644
--- a/MAC/APL/PIC/RSPDriver/src/BWRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/BWRead.cc
@@ -42,7 +42,7 @@ using namespace RSP;
 using namespace EPA_Protocol;
 
 BWRead::BWRead(GCFPortInterface& board_port, int board_id, int blp, int regid)
-  : SyncAction(board_port, board_id, BF_N_FRAGMENTS),
+  : SyncAction(board_port, board_id, MEPHeader::BF_N_FRAGMENTS),
     m_blp(blp), m_regid(regid), m_remaining(0), m_offset(0)
 {
   memset(&m_hdr, 0, sizeof(MEPHeader));
diff --git a/MAC/APL/PIC/RSPDriver/src/BWWrite.cc b/MAC/APL/PIC/RSPDriver/src/BWWrite.cc
index 05f0a6d739b..f8cfa60777e 100644
--- a/MAC/APL/PIC/RSPDriver/src/BWWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/BWWrite.cc
@@ -44,7 +44,7 @@ using namespace RSP;
 using namespace EPA_Protocol;
 
 BWWrite::BWWrite(GCFPortInterface& board_port, int board_id, int blp, int regid)
-  : SyncAction(board_port, board_id, BF_N_FRAGMENTS),
+  : SyncAction(board_port, board_id, MEPHeader::BF_N_FRAGMENTS),
     m_blp(blp), m_regid(regid), m_remaining(0), m_offset(0)
 {
   memset(&m_hdr, 0, sizeof(MEPHeader));
@@ -79,7 +79,7 @@ void BWWrite::sendrequest()
   // send next BF configure message
   EPABfCoefsWriteEvent bfcoefs;
 
-  size_t size = (MEPHeader::N_BEAMLETS * MEPHeader::WEIGHT_SIZE) / BF_N_FRAGMENTS;
+  size_t size = (MEPHeader::N_BEAMLETS * MEPHeader::WEIGHT_SIZE) / MEPHeader::BF_N_FRAGMENTS;
   LOG_DEBUG_STR("size=" << size);
 
   // this code is only guaranteed to work under the following conditions
@@ -106,13 +106,25 @@ void BWWrite::sendrequest()
   }
 
   // create blitz view om the weights in the bfcoefs message to be sent to the RSP hardware
-  int nbeamlets_per_fragment = MEPHeader::N_BEAMLETS / BF_N_FRAGMENTS;
+  int nbeamlets_per_fragment = MEPHeader::N_BEAMLETS / MEPHeader::BF_N_FRAGMENTS;
   Array<complex<int16>, 2> weights(nbeamlets_per_fragment, MEPHeader::N_POL);
   bfcoefs.coef.setBuffer(weights.data(), weights.size() * sizeof(complex<uint16>));
 
+#if 0
+  Array<int, 2> index(MEPHeader::N_BEAMLETS, MEPHeader::N_POL);
+  Array<int, 2> mapped_index(nbeamlets_per_fragment, MEPHeader::N_POL);
+
+  for (int beamlet = 0; beamlet < MEPHeader::N_BEAMLETS; beamlet++) {
+    for (int pol = 0; pol < MEPHeader::N_POL; pol++) {
+      index(beamlet, pol) = beamlet * MEPHeader::N_POL + pol;
+    }
+  }
+  mapped_index = 0;
+#endif
+
   LOG_DEBUG_STR("weights shape=" << weights.shape());
 
-  ASSERT(MEPHeader::N_BEAMLETS % BF_N_FRAGMENTS == 0);
+  ASSERT(MEPHeader::N_BEAMLETS % MEPHeader::BF_N_FRAGMENTS == 0);
   for (int lane = 0; lane < MEPHeader::N_SERDES_LANES; lane++) {
 
     int hw_offset = lane;
@@ -130,8 +142,17 @@ void BWWrite::sendrequest()
 
     // Y
     weights(hw_range, 1) = Cache::getInstance().getBack().getBeamletWeights()()(0, global_blp * 2 + 1, cache_range);
+
+#if 0
+    mapped_index(hw_range, 0) = index(cache_range, 0);
+    mapped_index(hw_range, 1) = index(cache_range, 1);
+#endif
   }
 
+#if 0
+  LOG_DEBUG_STR("mapped_index=" << mapped_index);
+#endif
+
   // update m_remaining and m_offset for next write
   m_remaining -= size;
   m_offset    += size;
@@ -214,7 +235,7 @@ GCFEvent::TResult BWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
     //
     // Last fragment signals completion
     //
-    if (BF_N_FRAGMENTS - 1 == getCurrentIndex()) {
+    if (MEPHeader::MEPHeader::BF_N_FRAGMENTS - 1 == getCurrentIndex()) {
       Cache::getInstance().getState().bf().write_ack(global_blp * MEPHeader::N_PHASEPOL + m_regid);
     }
 
diff --git a/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc b/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
index bed9abf4115..0a1bf60a505 100644
--- a/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/CDOWrite.cc
@@ -33,7 +33,6 @@
 #include "CDOWrite.h"
 #include "Cache.h"
 
-#define N_CDO_REGISTERS 2
 #define BASEUDPPORT 0x10FA // (=4346) start numbering src and dst UDP ports at this number (4346)
 #define EPA_CEP_OUTPUT_HEADER_SIZE 16 // bytes
 #define EPA_CEP_BEAMLET_SIZE sizeof(uint16)
@@ -112,7 +111,7 @@ void CDOWrite::setup_udpip_header()
 }
 
 CDOWrite::CDOWrite(GCFPortInterface& board_port, int board_id)
-  : SyncAction(board_port, board_id, N_CDO_REGISTERS)
+  : SyncAction(board_port, board_id, MEPHeader::N_CDO_REGISTERS)
 {
   memset(&m_hdr, 0, sizeof(MEPHeader));
 }
@@ -151,13 +150,13 @@ void CDOWrite::sendrequest()
 {
   // write register (with same setting) every second if WRITE_CDO_ONCE == 0
   if (0 == GET_CONFIG("RSPDriver.WRITE_CDO_ONCE", i)) {
-    Cache::getInstance().getState().cdo().write(getBoardId());
+    Cache::getInstance().getState().cdo().write(getBoardId() * getNumIndices() + getCurrentIndex());
   }
 
   // skip update if the CDO settings have not been modified
-  if (RTC::RegisterState::WRITE != Cache::getInstance().getState().cdo().get(getBoardId()))
+  if (RTC::RegisterState::WRITE != Cache::getInstance().getState().cdo().get(getBoardId() * getNumIndices() + getCurrentIndex()))
   {
-    Cache::getInstance().getState().cdo().unmodified(getBoardId());
+    Cache::getInstance().getState().cdo().unmodified(getBoardId() * getNumIndices() + getCurrentIndex());
     setContinue(true);
     return;
   }
@@ -252,12 +251,12 @@ GCFEvent::TResult CDOWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*
   if (!ack.hdr.isValidAck(m_hdr))
   {
     LOG_ERROR("CDOWrite::handleack: invalid ack");
-    Cache::getInstance().getState().cdo().write_error(getBoardId());
+    Cache::getInstance().getState().cdo().write_error(getBoardId() * getNumIndices() + getCurrentIndex());
     return GCFEvent::NOT_HANDLED;
   }
 
   if (1 == getCurrentIndex()) {
-    Cache::getInstance().getState().cdo().write_ack(getBoardId());
+    Cache::getInstance().getState().cdo().write_ack(getBoardId() * getNumIndices() + getCurrentIndex());
   }
   
   return GCFEvent::HANDLED;
diff --git a/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc b/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc
index d98b8f49953..23f3a7ffef4 100644
--- a/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc
+++ b/MAC/APL/PIC/RSPDriver/src/RSPDriver.cc
@@ -194,7 +194,7 @@ RSPDriver::RSPDriver(string name)
   StationSettings*      ssp = StationSettings::instance();
   ssp->setMaxRspBoards  (GET_CONFIG("RS.N_RSPBOARDS", i));
   ssp->setNrRspBoards   (GET_CONFIG("RS.N_RSPBOARDS", i));
-  ssp->setNrBlpsPerBoard(GET_CONFIG("RS.N_BLPS", i));
+  ssp->setNrBlpsPerBoard(MEPHeader::N_BLPS);
   if (GET_CONFIG("RSPDriver.OPERATION_MODE", i) == MODE_SUBSTATION) {
     ssp->setNrRspBoards(1);
   };
diff --git a/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in b/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in
index 7b788833779..e4a3e9b58c6 100644
--- a/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in
+++ b/MAC/APL/PIC/RSPDriver/src/RSPDriver.conf.in
@@ -40,7 +40,7 @@ RSPDriver.PPS_TRIGGER=1
 #
 # Specify MAC addresses of the RSP boards explicitly
 #
-RSPDriver.MAC_ADDR_0=10:FA:00:00:03:00
+RSPDriver.MAC_ADDR_0=10:FA:00:00:00:00
 RSPDriver.MAC_ADDR_1=10:FA:00:00:01:00
 RSPDriver.MAC_ADDR_2=10:FA:00:00:02:00
 RSPDriver.MAC_ADDR_3=10:FA:00:00:03:00
@@ -91,15 +91,15 @@ RSPDriver.MAC_ADDR_23=10:FA:00:00:17:00
 # for difference between operation with data from SERDES
 # ring and without.
 #
-RSPDriver.LANE_0_BLET_OUT=11
-RSPDriver.LANE_1_BLET_OUT=11
-RSPDriver.LANE_2_BLET_OUT=11
-RSPDriver.LANE_3_BLET_OUT=11
-RSPDriver.LANE_0_XLET_OUT=11
-RSPDriver.LANE_1_XLET_OUT=11
-RSPDriver.LANE_2_XLET_OUT=11
-RSPDriver.LANE_3_XLET_OUT=11
-RSPDriver.IGNORE_REMOTE_DATA=1
+RSPDriver.LANE_0_BLET_OUT=0
+RSPDriver.LANE_1_BLET_OUT=0
+RSPDriver.LANE_2_BLET_OUT=0
+RSPDriver.LANE_3_BLET_OUT=0
+RSPDriver.LANE_0_XLET_OUT=0
+RSPDriver.LANE_1_XLET_OUT=0
+RSPDriver.LANE_2_XLET_OUT=0
+RSPDriver.LANE_3_XLET_OUT=0
+RSPDriver.IGNORE_REMOTE_DATA=0
 
 #
 # CDO Control
@@ -278,3 +278,8 @@ RSPDriver.XC_GAIN=8000
 # across the diagonal if a value equals zero.
 #
 RSPDriver.XC_FILL=1
+
+#
+# Disable initialization to enable testing on a system without hardware
+#
+RSPDriver.DISABLE_INIT=0
diff --git a/MAC/APL/PIC/RSPDriver/src/RemoteStation.conf.in b/MAC/APL/PIC/RSPDriver/src/RemoteStation.conf.in
index da1a82f14c7..785f8370ba2 100644
--- a/MAC/APL/PIC/RSPDriver/src/RemoteStation.conf.in
+++ b/MAC/APL/PIC/RSPDriver/src/RemoteStation.conf.in
@@ -5,15 +5,9 @@
 #
 # Number of RSP boards
 #
-RS.N_RSPBOARDS=1
+RS.N_RSPBOARDS=12
 
 #
 # Specify the station id (0 <= StationId < 256)
 #
 RS.STATION_ID=11
-
-#
-# Number of BLP's per RSP board
-#
-RS.N_BLPS=4
-
diff --git a/MAC/APL/PIC/RSPDriver/src/SSWrite.cc b/MAC/APL/PIC/RSPDriver/src/SSWrite.cc
index feec52fd431..a059fd35095 100644
--- a/MAC/APL/PIC/RSPDriver/src/SSWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SSWrite.cc
@@ -69,6 +69,18 @@ void SSWrite::sendrequest()
 			    shape(MEPHeader::N_LOCAL_XLETS + MEPHeader::N_BEAMLETS, MEPHeader::N_POL),
 			    neverDeleteData);
 
+#if 0
+  Array<int, 2> index(MEPHeader::N_LOCAL_XLETS + MEPHeader::N_BEAMLETS, MEPHeader::N_POL);
+  Array<int, 2> mapped_index(MEPHeader::N_LOCAL_XLETS + MEPHeader::N_BEAMLETS, MEPHeader::N_POL);
+
+  for (int beamlet = MEPHeader::N_LOCAL_XLETS; beamlet < MEPHeader::N_LOCAL_XLETS + MEPHeader::N_BEAMLETS; beamlet++) {
+    for (int pol = 0; pol < MEPHeader::N_POL; pol++) {
+      index(beamlet, pol) = beamlet * MEPHeader::N_POL + pol;
+    }
+  }
+  mapped_index = 0;
+#endif
+
   // copy crosslet selection
   Range xlet_range(0, MEPHeader::N_LOCAL_XLETS-1);
   subbands(xlet_range, 0) = Cache::getInstance().getBack().getSubbandSelection()()(global_blp * 2,     xlet_range); // x
@@ -92,8 +104,17 @@ void SSWrite::sendrequest()
 
     subbands(hw_range, 0) = Cache::getInstance().getBack().getSubbandSelection()()(global_blp * 2,     cache_range); // x
     subbands(hw_range, 1) = Cache::getInstance().getBack().getSubbandSelection()()(global_blp * 2 + 1, cache_range); // y
+
+#if 0
+    mapped_index(hw_range, 0) = index(cache_range, 0);
+    mapped_index(hw_range, 1) = index(cache_range, 1);
+#endif
   }
 
+#if 0
+  LOG_DEBUG_STR("mapped_index=" << mapped_index);
+#endif
+
   m_hdr = ss.hdr;
   getBoardPort().send(ss);
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/Sequencer.cc b/MAC/APL/PIC/RSPDriver/src/Sequencer.cc
index dbd265cdff1..c57b9d60428 100644
--- a/MAC/APL/PIC/RSPDriver/src/Sequencer.cc
+++ b/MAC/APL/PIC/RSPDriver/src/Sequencer.cc
@@ -24,6 +24,8 @@
 #include <Common/LofarLogger.h>
 #include <APL/RSP_Protocol/EPA_Protocol.ph>
 
+#include <APL/RTCCommon/PSAccess.h>
+
 #include "Sequencer.h"
 #include "Cache.h"
 #include "StationSettings.h"
@@ -91,11 +93,13 @@ GCFEvent::TResult Sequencer::idle_state(GCFEvent& event, GCFPortInterface& /*por
     
     case F_TIMER:
     {
-      if (SETCLOCK == m_sequence) {
-	Cache::getInstance().reset();
-	TRAN(Sequencer::clearclock_state);
-      } else if (RSPCLEAR == m_sequence) {
-	TRAN(Sequencer::rsuclear_state);
+      if (!GET_CONFIG("RSPDriver.DISABLE_INIT", i)) {
+	if (SETCLOCK == m_sequence) {
+	  Cache::getInstance().reset();
+	  TRAN(Sequencer::clearclock_state);
+	} else if (RSPCLEAR == m_sequence) {
+	  TRAN(Sequencer::rsuclear_state);
+	}
       }
     }
     break;
@@ -125,7 +129,7 @@ GCFEvent::TResult Sequencer::clearclock_state(GCFEvent& event, GCFPortInterface&
     {
       LOG_DEBUG("Entering Sequencer::clearclock_state");
       Cache::getInstance().getState().tdclear().reset();
-      Cache::getInstance().getState().tdclear().write_force();
+      Cache::getInstance().getState().tdclear().write();
 
     }
     break;
@@ -162,7 +166,7 @@ GCFEvent::TResult Sequencer::writeclock_state(GCFEvent& event, GCFPortInterface&
     {
       LOG_DEBUG("Entering Sequencer::writeclock_state");
       Cache::getInstance().getState().tdwrite().reset();
-      Cache::getInstance().getState().tdwrite().write_force();
+      Cache::getInstance().getState().tdwrite().write();
     }
     break;
     
@@ -215,7 +219,7 @@ GCFEvent::TResult Sequencer::readclock_state(GCFEvent& event, GCFPortInterface&
 	  Cache::getInstance().getState().tdread().reset();
 	  Cache::getInstance().getState().tdread().read();
 	}
-      } else if (Cache::getInstance().getState().tdread().isMatchAll(RegisterState::CHECK)) {
+      } else if (Cache::getInstance().getState().tdread().isMatchAll(RegisterState::IDLE)) {
 	TRAN(Sequencer::rcudisable_state);
       }
     }
@@ -252,7 +256,7 @@ GCFEvent::TResult Sequencer::rcudisable_state(GCFEvent& event, GCFPortInterface&
       Cache::getInstance().getBack().getRCUSettings()() = control;
 
       Cache::getInstance().getState().rcusettings().reset();
-      Cache::getInstance().getState().rcusettings().write_force();
+      Cache::getInstance().getState().rcusettings().write();
 
       m_timer = 0;
     }
@@ -303,7 +307,7 @@ GCFEvent::TResult Sequencer::rsuclear_state(GCFEvent& event, GCFPortInterface& /
 
       // signal that the register has changed
       Cache::getInstance().getState().rsuclear().reset();
-      Cache::getInstance().getState().rsuclear().write_force();
+      Cache::getInstance().getState().rsuclear().write();
 
       m_timer = 0;
     }
@@ -341,7 +345,7 @@ GCFEvent::TResult Sequencer::setblocksync_state(GCFEvent& event, GCFPortInterfac
     {
       LOG_DEBUG("Entering Sequencer::setblocksync_state");
       Cache::getInstance().getState().bs().reset();
-      Cache::getInstance().getState().bs().write_force();
+      Cache::getInstance().getState().bs().write();
       m_timer = 0;
     }
     break;
@@ -383,7 +387,7 @@ GCFEvent::TResult Sequencer::radwrite_state(GCFEvent& event, GCFPortInterface& /
     {
       LOG_DEBUG("Entering Sequencer::radwrit_state");
       Cache::getInstance().getState().rad().reset();
-      Cache::getInstance().getState().rad().write_force();
+      Cache::getInstance().getState().rad().write();
 
       m_timer = 0;
     }
@@ -395,7 +399,7 @@ GCFEvent::TResult Sequencer::radwrite_state(GCFEvent& event, GCFPortInterface& /
 	  && Cache::getInstance().getState().rad().getMatchCount(Range::all(), RegisterState::WRITE) > 0) {
 	LOG_WARN("Failed to write RAD settings register. Retrying...");
 	Cache::getInstance().getState().rad().reset();
-	Cache::getInstance().getState().rad().write_force();
+	Cache::getInstance().getState().rad().write();
       } else if (Cache::getInstance().getState().rad().isMatchAll(RegisterState::IDLE)) {
 	TRAN(Sequencer::rcuenable_state);
       }
@@ -433,7 +437,7 @@ GCFEvent::TResult Sequencer::rcuenable_state(GCFEvent& event, GCFPortInterface&
       Cache::getInstance().getBack().getRCUSettings()() = control;
 
       Cache::getInstance().getState().rcusettings().reset();
-      Cache::getInstance().getState().rcusettings().write_force();
+      Cache::getInstance().getState().rcusettings().write();
     }
     break;
     
diff --git a/MAC/APL/PIC/RSPDriver/src/SetHBACmd.cc b/MAC/APL/PIC/RSPDriver/src/SetHBACmd.cc
index 5b53f45380e..97f47116111 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetHBACmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetHBACmd.cc
@@ -68,6 +68,7 @@ void SetHBACmd::apply(CacheBuffer& cache, bool setModFlag)
       cache.getHBASettings()()(cache_rcu, Range::all()) = m_event->settings()(0, Range::all());
       if (setModFlag) {
         cache.getCache().getState().hbaprotocol().write(cache_rcu);
+	cache.getCache().getState().hbaprotocol().write(cache_rcu);
       }
     }
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc b/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc
index 6e6bdf1e2e6..63902501bc9 100644
--- a/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SetWGCmd.cc
@@ -68,7 +68,8 @@ void SetWGCmd::apply(CacheBuffer& cache, bool setModFlag)
       cache.getWGSettings()()(cache_rcu) = m_event->settings()(0);
 
       if (setModFlag) {
-	cache.getCache().getState().diagwgsettings().write(cache_rcu);
+	LOG_INFO_STR("scheduling write for " << cache_rcu);
+	cache.getCache().getState().diagwgsettings().write(cache_rcu * MEPHeader::N_DIAG_WG_REGISTERS);
       }
     }
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/SstRead.cc b/MAC/APL/PIC/RSPDriver/src/SstRead.cc
index 237cf95afa4..4ca24a515c5 100644
--- a/MAC/APL/PIC/RSPDriver/src/SstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SstRead.cc
@@ -40,7 +40,7 @@ using namespace RSP_Protocol;
 using namespace RTC;
 
 SstRead::SstRead(GCFPortInterface& board_port, int board_id)
-  : SyncAction(board_port, board_id, StationSettings::instance()->nrBlpsPerBoard() * SST_N_FRAGMENTS)
+  : SyncAction(board_port, board_id, StationSettings::instance()->nrBlpsPerBoard() * MEPHeader::SST_N_FRAGMENTS)
 {
   memset(&m_hdr, 0, sizeof(MEPHeader));
 }
@@ -53,13 +53,12 @@ void SstRead::sendrequest()
 {
   EPAReadEvent sstread;
 
-  uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + (getCurrentIndex() / SST_N_FRAGMENTS);
-  Cache::getInstance().getState().sst().read(global_blp);
+  Cache::getInstance().getState().sst().read(getBoardId() * getNumIndices() + getCurrentIndex());
 
-  uint16 byteoffset = (getCurrentIndex() % SST_N_FRAGMENTS) * MEPHeader::FRAGMENT_SIZE;
+  uint16 byteoffset = (getCurrentIndex() % MEPHeader::SST_N_FRAGMENTS) * MEPHeader::FRAGMENT_SIZE;
 
-  sstread.hdr.set(MEPHeader::SST_POWER_HDR, 1 << (getCurrentIndex() / SST_N_FRAGMENTS),
-		  MEPHeader::READ, N_SST_STATS * sizeof(uint32), byteoffset);
+  sstread.hdr.set(MEPHeader::SST_POWER_HDR, 1 << (getCurrentIndex() / MEPHeader::SST_N_FRAGMENTS),
+		  MEPHeader::READ, MEPHeader::N_SST_STATS * sizeof(uint32), byteoffset);
 
   m_hdr = sstread.hdr;
   getBoardPort().send(sstread);
@@ -103,11 +102,11 @@ GCFEvent::TResult SstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   EPASstStatsEvent ack(event);
 
-  uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + (getCurrentIndex() / SST_N_FRAGMENTS);
+  uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + (getCurrentIndex() / MEPHeader::SST_N_FRAGMENTS);
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getState().sst().read_error(global_blp);
+    Cache::getInstance().getState().sst().read_error(getBoardId() * getNumIndices() + getCurrentIndex());
     LOG_ERROR("SstRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
@@ -118,19 +117,19 @@ GCFEvent::TResult SstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 			 global_blp, offset));
 
   Range fragment_range(offset / MEPHeader::N_POL,
-		       (offset / MEPHeader::N_POL) + (N_SST_STATS / MEPHeader::N_POL) - 1);
+		       (offset / MEPHeader::N_POL) + (MEPHeader::N_SST_STATS / MEPHeader::N_POL) - 1);
 
   LOG_DEBUG_STR("fragment_range=" << fragment_range);
   
   if (MEPHeader::SST_POWER != ack.hdr.m_fields.addr.regid)
   {
-    Cache::getInstance().getState().sst().read_error(global_blp);
+    Cache::getInstance().getState().sst().read_error(getBoardId() * getNumIndices() + getCurrentIndex());
     LOG_ERROR("invalid sst ack");
     return GCFEvent::HANDLED;
   }
 
   Array<uint32, 2> stats((uint32*)&ack.stat,
-			 shape(N_SST_STATS / MEPHeader::N_POL,
+			 shape(MEPHeader::N_SST_STATS / MEPHeader::N_POL,
 			       MEPHeader::N_POL),
 			 neverDeleteData);
 
@@ -142,7 +141,7 @@ GCFEvent::TResult SstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   // y-pol subband statistics: copy and convert to double
   cache(global_blp * 2 + 1, fragment_range) = convert_uint32_to_double(stats(Range::all(), 1));
   
-  Cache::getInstance().getState().sst().read_ack(global_blp);
+  Cache::getInstance().getState().sst().read_ack(getBoardId() * getNumIndices() + getCurrentIndex());
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/StationSettings.h b/MAC/APL/PIC/RSPDriver/src/StationSettings.h
index d292c88cec8..1aacbd76aba 100644
--- a/MAC/APL/PIC/RSPDriver/src/StationSettings.h
+++ b/MAC/APL/PIC/RSPDriver/src/StationSettings.h
@@ -52,8 +52,8 @@ public:
 	static StationSettings* instance();
 
 	int32 maxRspBoards();	// RS.N_RSPBOARDS
-	int32 nrBlpsPerBoard();	// RS.N_BLPS
-	int32 nrRcusPerBoard();	// RS.N_BLPS * N_POL
+	int32 nrBlpsPerBoard();	// MEPHeader::N_BLPS
+	int32 nrRcusPerBoard();	// MEPHeader::N_BLPS * N_POL
 
 	int32 nrRspBoards();	// 1 | RS.N_RSPBOARDS depending on OPERATION_MODE
 	int32 nrBlps();			// nrRspBoards * nrBlpsPerBoard
diff --git a/MAC/APL/PIC/RSPDriver/src/SyncAction.cc b/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
index c228cb777c7..67717833b88 100644
--- a/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
+++ b/MAC/APL/PIC/RSPDriver/src/SyncAction.cc
@@ -252,11 +252,6 @@ bool SyncAction::hasCompleted() const
   return m_completed;
 }
 
-int SyncAction::getCurrentIndex() const
-{
-  return m_current_index;
-}
-
 /**
  * Force completion by resetting to idle state
  * and resetting various state variables.
diff --git a/MAC/APL/PIC/RSPDriver/src/SyncAction.h b/MAC/APL/PIC/RSPDriver/src/SyncAction.h
index 1bd2b29a25e..6aa00543ca7 100644
--- a/MAC/APL/PIC/RSPDriver/src/SyncAction.h
+++ b/MAC/APL/PIC/RSPDriver/src/SyncAction.h
@@ -84,7 +84,8 @@ namespace LOFAR {
       /**
        * Get index of current local index
        */
-      int getCurrentIndex() const;
+      int getCurrentIndex() const { return m_current_index; }
+      int getNumIndices() const { return m_n_indices; }
 
       /**
        * Reset the statemachine to the initial state.
diff --git a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc
index 802facb9413..12d59971ecb 100644
--- a/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/TDSResultRead.cc
@@ -58,7 +58,7 @@ TDSResultRead::~TDSResultRead()
 void TDSResultRead::sendrequest()
 {
    if (RTC::RegisterState::READ != Cache::getInstance().getState().tdread().get(getBoardId())) {
-     Cache::getInstance().getState().tdread().read_ack(getBoardId());
+     Cache::getInstance().getState().tdread().unmodified(getBoardId());
      setContinue(true);
 
      return;
diff --git a/MAC/APL/PIC/RSPDriver/src/WGRead.cc b/MAC/APL/PIC/RSPDriver/src/WGRead.cc
index 4ce4bb9d026..f765057e41e 100644
--- a/MAC/APL/PIC/RSPDriver/src/WGRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/WGRead.cc
@@ -165,7 +165,7 @@ GCFEvent::TResult WGRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/)
     WGSettings& w = Cache::getInstance().getBack().getWGSettings();
 
     Array<int32, 1> wave((int32*)&wgwave.samples,
-			 shape(N_WAVE_SAMPLES),
+			 shape(MEPHeader::N_WAVE_SAMPLES),
 			 neverDeleteData);
     w.waveforms()(global_rcu, Range::all()) = wave;
   }
diff --git a/MAC/APL/PIC/RSPDriver/src/WGWrite.cc b/MAC/APL/PIC/RSPDriver/src/WGWrite.cc
index 7449bdbb21f..2636f76a643 100644
--- a/MAC/APL/PIC/RSPDriver/src/WGWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/WGWrite.cc
@@ -38,11 +38,9 @@ using namespace EPA_Protocol;
 using namespace RSP_Protocol;
 using namespace RTC;
 
-#define N_REGISTERS 2 // the number of registers to write (DiagWg and DiagWgwave)
-
 WGWrite::WGWrite(GCFPortInterface& board_port, int board_id)
   : SyncAction(board_port, board_id,
-	       StationSettings::instance()->nrRcusPerBoard() * N_REGISTERS)
+	       StationSettings::instance()->nrRcusPerBoard() * MEPHeader::N_DIAG_WG_REGISTERS)
 {
   memset(&m_hdr, 0, sizeof(MEPHeader));
 }
@@ -55,16 +53,16 @@ WGWrite::~WGWrite()
 void WGWrite::sendrequest()
 {
   uint8 global_rcu = (getBoardId() * StationSettings::instance()->nrRcusPerBoard()) 
-    + (getCurrentIndex() / N_REGISTERS);
-  uint8 blpid = 1 << (getCurrentIndex() / N_REGISTERS / MEPHeader::N_POL);
+    + (getCurrentIndex() / MEPHeader::N_DIAG_WG_REGISTERS);
+  uint8 blpid = 1 << (getCurrentIndex() / MEPHeader::N_DIAG_WG_REGISTERS / MEPHeader::N_POL);
 
-  if (RTC::RegisterState::WRITE != Cache::getInstance().getState().diagwgsettings().get(global_rcu)) {
-    Cache::getInstance().getState().diagwgsettings().unmodified(global_rcu);
+  if (RTC::RegisterState::WRITE != Cache::getInstance().getState().diagwgsettings().get(getBoardId() * getNumIndices() + getCurrentIndex())) {
+    Cache::getInstance().getState().diagwgsettings().unmodified(getBoardId() * getNumIndices() + getCurrentIndex());
     setContinue(true);
     return;
   }
 
-  switch (getCurrentIndex() % N_REGISTERS) {
+  switch (getCurrentIndex() % MEPHeader::N_DIAG_WG_REGISTERS) {
 
   case 0:
     {
@@ -112,7 +110,7 @@ void WGWrite::sendrequest()
 
       // copy waveform to event to be sent
       Array<int32, 1> wave((int32*)&wgwave.samples,
-			   shape(N_WAVE_SAMPLES),
+			   shape(MEPHeader::N_WAVE_SAMPLES),
 			   neverDeleteData);
 
       wave = WGSettings::preset(w()(global_rcu).preset);
@@ -140,17 +138,19 @@ GCFEvent::TResult WGWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   EPAWriteackEvent ack(event);
 
   uint8 global_rcu = (getBoardId() * StationSettings::instance()->nrRcusPerBoard()) 
-    + (getCurrentIndex() / N_REGISTERS);
+    + (getCurrentIndex() / MEPHeader::N_DIAG_WG_REGISTERS);
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
     LOG_ERROR("WGWrite::handleack: invalid ack");
-    Cache::getInstance().getState().diagwgsettings().write_error(global_rcu);
+    Cache::getInstance().getState().diagwgsettings().write_error(getBoardId() * getNumIndices() + getCurrentIndex());
     return GCFEvent::NOT_HANDLED;
   }
+
+  LOG_INFO_STR("wrote " << (int)global_rcu);
   
   // change state to indicate that it has been applied in the hardware
-  Cache::getInstance().getState().diagwgsettings().write_ack(global_rcu);
+  Cache::getInstance().getState().diagwgsettings().write_ack(getBoardId() * getNumIndices() + getCurrentIndex());
 
   return GCFEvent::HANDLED;
 }
diff --git a/MAC/APL/PIC/RSPDriver/src/XWWrite.cc b/MAC/APL/PIC/RSPDriver/src/XWWrite.cc
index 2760eaa0c97..4127c4ff944 100644
--- a/MAC/APL/PIC/RSPDriver/src/XWWrite.cc
+++ b/MAC/APL/PIC/RSPDriver/src/XWWrite.cc
@@ -97,6 +97,8 @@ void XWWrite::sendrequest()
   Array<complex<int16>, 2> weights(MEPHeader::N_LOCAL_XLETS, MEPHeader::N_POL);
   bfcoefs.coef.setBuffer(weights.data(), weights.size() * sizeof(complex<uint16>));
 
+  weights = complex<int16>(0, 0);
+
   int xc_gain = GET_CONFIG("RSPDriver.XC_GAIN", i);
 
   switch (m_regid)
@@ -106,9 +108,6 @@ void XWWrite::sendrequest()
       // weights for x-real part
       // no added conversions needed
 
-      // y weights should be 0
-      weights(Range::all(), 1) = 0;
-
       // overwrite first weights for cross correlation
       weights(m_blp, 0) = complex<int16>(xc_gain, 0);
     }
@@ -116,12 +115,6 @@ void XWWrite::sendrequest()
 
     case MEPHeader::BF_XIOUT:
     {
-      // weights for x-imaginary part
-      weights *= complex<int16>(0,1);
-
-      // y weights should be 0
-      weights(Range::all(), 1) = 0;
-
       // overwrite first weights for cross correlation
       weights(m_blp, 0) = complex<int16>(0, xc_gain);
     }
@@ -132,9 +125,6 @@ void XWWrite::sendrequest()
       // weights for y-real part
       // no added conversions needed
 
-      // x weights should be 0
-      weights(Range::all(), 0) = 0;
-
       // overwrite first weights for cross correlation
       weights(m_blp, 1) = complex<int16>(xc_gain, 0);
     }
@@ -142,12 +132,6 @@ void XWWrite::sendrequest()
     
     case MEPHeader::BF_YIOUT:
     {
-      // weights for y-imaginary part
-      weights *= complex<int16>(0,1);
-
-      // x weights should be 0
-      weights(Range::all(), 0) = 0;
-
       // overwrite first weights for cross correlation
       weights(m_blp, 1) = complex<int16>(0, xc_gain);
     }
@@ -173,11 +157,15 @@ GCFEvent::TResult XWWrite::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   
   EPAWriteackEvent ack(event);
 
+#if 0
   uint8 global_blp = (getBoardId() * StationSettings::instance()->nrBlpsPerBoard()) + m_blp;
+#endif
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
+#if 0
     Cache::getInstance().getState().bf().write_error(global_blp * MEPHeader::N_PHASEPOL + m_regid);
+#endif
 
     LOG_ERROR("XWWrite::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
diff --git a/MAC/APL/PIC/RSPDriver/src/XstRead.cc b/MAC/APL/PIC/RSPDriver/src/XstRead.cc
index 29fe6f1a662..fe8074e9ff3 100644
--- a/MAC/APL/PIC/RSPDriver/src/XstRead.cc
+++ b/MAC/APL/PIC/RSPDriver/src/XstRead.cc
@@ -64,14 +64,14 @@ void XstRead::sendrequest()
   LOG_DEBUG_STR("first_rsp_board = " << first_rsp_board);
   uint16 offset = first_rsp_board * MEPHeader::XLET_SIZE;
 
-  Cache::getInstance().getState().xst().read(getBoardId());
-
   if (m_regid < MEPHeader::XST_STATS || m_regid >= MEPHeader::XST_NR_STATS)
   {
     LOG_FATAL("invalid regid");
     exit(EXIT_FAILURE);
   }
 
+  Cache::getInstance().getState().xst().read(getBoardId() * MEPHeader::XST_NR_STATS + (m_regid - MEPHeader::XST_STATS));
+
   EPAReadEvent xstread;
 
   xstread.hdr.set(MEPHeader::XST_STATS_HDR,
@@ -159,14 +159,14 @@ GCFEvent::TResult XstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
 
   if (!ack.hdr.isValidAck(m_hdr))
   {
-    Cache::getInstance().getState().xst().read_error(getBoardId());
+    Cache::getInstance().getState().xst().read_error(getBoardId() * MEPHeader::XST_NR_STATS + (m_regid - MEPHeader::XST_STATS));
     LOG_ERROR("XstRead::handleack: invalid ack");
     return GCFEvent::NOT_HANDLED;
   }
 
   if (ack.hdr.m_fields.addr.regid >= MEPHeader::XST_NR_STATS)
   {
-    Cache::getInstance().getState().xst().read_error(getBoardId());
+    Cache::getInstance().getState().xst().read_error(getBoardId() * MEPHeader::XST_NR_STATS + (m_regid - MEPHeader::XST_STATS));
     LOG_ERROR("invalid xst ack");
     return GCFEvent::HANDLED;
   }
@@ -198,7 +198,7 @@ GCFEvent::TResult XstRead::handleack(GCFEvent& event, GCFPortInterface& /*port*/
   cache(rcu % MEPHeader::N_POL, 0, rcu / MEPHeader::N_POL, dst_range) = convert_cuint32_to_cdouble(xststats(Range::all(), 0));
   cache(rcu % MEPHeader::N_POL, 1, rcu / MEPHeader::N_POL, dst_range) = convert_cuint32_to_cdouble(xststats(Range::all(), 1));
 
-  Cache::getInstance().getState().xst().read_ack(getBoardId());
+  Cache::getInstance().getState().xst().read_ack(getBoardId() * MEPHeader::XST_NR_STATS + (m_regid - MEPHeader::XST_STATS));
 
   return GCFEvent::HANDLED;
 }
-- 
GitLab