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