diff --git a/MAC/APL/StationCU/src/StationControl/ActiveObs.cc b/MAC/APL/StationCU/src/StationControl/ActiveObs.cc index 030356be9837723363760fab61d57c10a1c8cfec..524673d378e04ad939d05e874b3863e973fcf496 100644 --- a/MAC/APL/StationCU/src/StationControl/ActiveObs.cc +++ b/MAC/APL/StationCU/src/StationControl/ActiveObs.cc @@ -55,6 +55,8 @@ namespace LOFAR { ActiveObs::ActiveObs(const string& name, State initial, ParameterSet* thePS, + const string& LBAbitmapString, + const string& HBAbitmapString, bool hasSplitters, GCFTask& task) : GCFTask (initial, string("ActiveObs:") + name), @@ -77,7 +79,9 @@ ActiveObs::ActiveObs(const string& name, itsInstanceNr, itsObsPar.obsID)), itsReadyFlag (false), itsReqState (CTState::NOSTATE), - itsCurState (CTState::NOSTATE) + itsCurState (CTState::NOSTATE), + itsLBAs (LBAbitmapString), + itsHBAs (HBAbitmapString) { if (thePS->isDefined("Observation.TBB.TBBsetting[0].filter0_coeff0")) { LOG_INFO("Observation also uses the TB boards"); @@ -171,12 +175,12 @@ GCFEvent::TResult ActiveObs::starting(GCFEvent& event, GCFPortInterface& port) switch (event.signal) { case F_ENTRY: { - // first make a mapping of the receivers that are used. - // the StationController already modified the set to reflect the available receivers - // So askfor this 'core' set by passed zeros. - // the receiver bitmap can be derived from the RCUset. + // First make a mapping of the receivers that are used. + // The StationController already modified the set to reflect the available receivers + // So askfor this 'core' set by passing zeros in the getRCUbitset function. StationConfig config; bitset<MAX_RCUS> theRCUs(itsObsPar.getRCUbitset(0, 0, "")); + // The receiver bitmap can be derived from the RCUset. string rbm; rbm.resize(MAX_RCUS, '0'); for (int i = 0; i < MAX_RCUS; i++) { @@ -186,6 +190,8 @@ GCFEvent::TResult ActiveObs::starting(GCFEvent& event, GCFPortInterface& port) } LOG_INFO_STR("Setting receiverBitMap of DP:" << itsObsPar.realPVSSdatapoint << "." << PN_OBS_RECEIVER_BITMAP << "to " << theRCUs); itsPropertySet->setValue(PN_OBS_RECEIVER_BITMAP,GCFPVString (rbm)); + itsPropertySet->setValue(PN_OBS_LBA_BITMAP,GCFPVString (itsLBAs)); + itsPropertySet->setValue(PN_OBS_HBA_BITMAP,GCFPVString (itsHBAs)); itsPropertySet->setValue(PN_OBS_CLAIM_NAME, GCFPVString(formatString("LOFAR_ObsSW_Observation%d", itsObsPar.obsID))); diff --git a/MAC/APL/StationCU/src/StationControl/ActiveObs.h b/MAC/APL/StationCU/src/StationControl/ActiveObs.h index 596d9cd097cda77a472e9f1ab9913d55cd95335d..3363d6c49e9ecba35f3bcdfa501c0e813e863d5b 100644 --- a/MAC/APL/StationCU/src/StationControl/ActiveObs.h +++ b/MAC/APL/StationCU/src/StationControl/ActiveObs.h @@ -63,6 +63,8 @@ public: ActiveObs (const string& name, State initial, ParameterSet* aPS, + const string& LBAbitmap, + const string& HBAbitmap, bool hasSplitters, GCFTask& task); virtual ~ActiveObs(); @@ -111,6 +113,8 @@ private: bool itsReadyFlag; CTState::CTstateNr itsReqState; CTState::CTstateNr itsCurState; + string itsLBAs; + string itsHBAs; }; //# diff --git a/MAC/APL/StationCU/src/StationControl/PVSSDatapointDefs.h b/MAC/APL/StationCU/src/StationControl/PVSSDatapointDefs.h index 8e46aba4d486f06c85a41c0b1ff06d530cfeb610..8834630bd6a0fd5f3fe4f735857ad5d87fddea9f 100644 --- a/MAC/APL/StationCU/src/StationControl/PVSSDatapointDefs.h +++ b/MAC/APL/StationCU/src/StationControl/PVSSDatapointDefs.h @@ -1,4 +1,4 @@ -// This file was generated by create_db_files v1.0 on Thu Mar 19 14:56:58 UTC 2009 +// This file was generated by create_db_files v2.0 on Thu Jan 5 11:01:56 UTC 2012 #ifndef LOFAR_DEPLOYMENT_PVSSDATAPOINTS_H #define LOFAR_DEPLOYMENT_PVSSDATAPOINTS_H @@ -42,7 +42,6 @@ #define PST_OBSERVATION "Observation" #define PN_OBS_CLAIM_CLAIM_DATE "claim.claimDate" #define PN_OBS_CLAIM_NAME "claim.name" -#define PN_OBS_RECEIVER_BITMAP "receiverBitmap" #define PN_OBS_CLAIM_PERIOD "claimPeriod" #define PN_OBS_PREPARE_PERIOD "preparePeriod" #define PN_OBS_START_TIME "startTime" @@ -68,17 +67,74 @@ #define PSN_OBSERVATION_CONTROL "LOFAR_ObsSW_@observation@_ObservationControl" #define PST_OBSERVATION_CONTROL "ObservationControl" -// OnlineControl -#define PSN_ONLINE_CONTROL "LOFAR_ObsSW_@observation@_OnlineControl" -#define PST_ONLINE_CONTROL "OnlineControl" +// InputBuffer +#define PSN_INPUT_BUFFER "LOFAR_PermSW_@psionode@_InputBuffer" +#define PST_INPUT_BUFFER "InputBuffer" +#define PN_IPB_STATION_NAME "stationName" +#define PN_IPB_OBSERVATION_NAME "observationName" +#define PN_IPB_STREAM0_BLOCKS_IN "stream0.blocksIn" +#define PN_IPB_STREAM0_PERC_BAD "stream0.percBad" +#define PN_IPB_STREAM0_REJECTED "stream0.rejected" +#define PN_IPB_STREAM1_BLOCKS_IN "stream1.blocksIn" +#define PN_IPB_STREAM1_PERC_BAD "stream1.percBad" +#define PN_IPB_STREAM1_REJECTED "stream1.rejected" +#define PN_IPB_STREAM2_BLOCKS_IN "stream2.blocksIn" +#define PN_IPB_STREAM2_PERC_BAD "stream2.percBad" +#define PN_IPB_STREAM2_REJECTED "stream2.rejected" +#define PN_IPB_STREAM3_BLOCKS_IN "stream3.blocksIn" +#define PN_IPB_STREAM3_PERC_BAD "stream3.percBad" +#define PN_IPB_STREAM3_REJECTED "stream3.rejected" +#define PN_IPB_LATE "late" +#define PN_IPB_IO_TIME "IOTime" + +// Adder +#define PSN_ADDER "LOFAR_ObsSW_@osionode@_@adder@" +#define PST_ADDER "Adder" +#define PN_ADD_DROPPING "dropping" +#define PN_ADD_DROPPED "dropped" +#define PN_ADD_DATA_PRODUCT_TYPE "dataProductType" +#define PN_ADD_FILE_NAME "fileName" +#define PN_ADD_LOCUS_NODE "locusNode" +#define PN_ADD_DIRECTORY "directory" +#define PN_ADD_OBSERVATION_NAME "observationName" + +// Writer +#define PSN_WRITER "LOFAR_ObsSW_@oslocusnode@_@writer@" +#define PST_WRITER "Writer" +#define PN_WTR_TIME "time" +#define PN_WTR_COUNT "count" +#define PN_WTR_DROPPED "dropped" +#define PN_WTR_FILE_NAME "fileName" +#define PN_WTR_DATA_RATE "dataRate" +#define PN_WTR_DATA_PRODUKT_TYPE "dataProduktType" +#define PN_WTR_OBSERVATION_NAME "observationName" + +// IONode +#define PSN_IO_NODE "LOFAR_PIC_BGP_@midplane@_@ionode@" +#define PST_IO_NODE "IONode" +#define PN_ION_STATION0 "station0" +#define PN_ION_IP0 "IP0" +#define PN_ION_MAC0 "MAC0" +#define PN_ION_STATION1 "station1" +#define PN_ION_IP1 "IP1" +#define PN_ION_MAC1 "MAC1" +#define PN_ION_USE2ND_STATION "use2ndStation" +#define PN_ION_USED_STATION "usedStation" +#define PN_ION_USEDIP "usedIP" +#define PN_ION_USEDMAC "usedMAC" -// Correlator -#define PSN_CORRELATOR "LOFAR_ObsSW_@observation@_OnlineControl_Correlator" -#define PST_CORRELATOR "Correlator" +// LocusNode +#define PSN_LOCUS_NODE "LOFAR_PIC_@osrack@_@locusnode@" +#define PST_LOCUS_NODE "LocusNode" +#define PN_LCN_FREE "free" +#define PN_LCN_TOTAL "total" +#define PN_LCN_CLAIMED "claimed" -// StorageAppl -#define PSN_STORAGE_APPL "LOFAR_ObsSW_@observation@_OnlineControl_StorageAppl" -#define PST_STORAGE_APPL "StorageAppl" +// CEPHardwareMonitor +#define PSN_CEP_HARDWARE_MONITOR "LOFAR_PermSW_HardwareMonitor" +#define PST_CEP_HARDWARE_MONITOR "CEPHardwareMonitor" +#define PN_CHM_BGP_CONNECTED "BGP.connected" +#define PN_CHM_CLUSTER_CONNECTED "Cluster.connected" // Cabinet #define PSN_CABINET "LOFAR_PIC_@cabinet@" @@ -217,10 +273,15 @@ #define PN_RCU_TRIGGER_FILTER "Trigger.filter" #define PN_RCU_TRIGGER_WINDOW "Trigger.window" #define PN_RCU_TRIGGER_OPERATING_MODE "Trigger.operatingMode" -#define PN_RCU_TRIGGER_COEFF0 "Trigger.coeff0" -#define PN_RCU_TRIGGER_COEFF1 "Trigger.coeff1" -#define PN_RCU_TRIGGER_COEFF2 "Trigger.coeff2" -#define PN_RCU_TRIGGER_COEFF3 "Trigger.coeff3" +#define PN_RCU_TRIGGER_TRIGGER_MODE "Trigger.triggerMode" +#define PN_RCU_TRIGGER_FILTER0_COEFF0 "Trigger.filter0.coeff0" +#define PN_RCU_TRIGGER_FILTER0_COEFF1 "Trigger.filter0.coeff1" +#define PN_RCU_TRIGGER_FILTER0_COEFF2 "Trigger.filter0.coeff2" +#define PN_RCU_TRIGGER_FILTER0_COEFF3 "Trigger.filter0.coeff3" +#define PN_RCU_TRIGGER_FILTER1_COEFF0 "Trigger.filter1.coeff0" +#define PN_RCU_TRIGGER_FILTER1_COEFF1 "Trigger.filter1.coeff1" +#define PN_RCU_TRIGGER_FILTER1_COEFF2 "Trigger.filter1.coeff2" +#define PN_RCU_TRIGGER_FILTER1_COEFF3 "Trigger.filter1.coeff3" // TBBoard #define PSN_TB_BOARD "LOFAR_PIC_@cabinet@_@subrack@_@TBBoard@" @@ -248,6 +309,88 @@ #define PN_TBB_IMAGE_INFO_TP_FILE "imageInfo.TPFile" #define PN_TBB_IMAGE_INFO_MP_FILE "imageInfo.MPFile" +// LBAAntenna +#define PSN_LBA_ANTENNA "LOFAR_PIC_@lbaantenna@" +#define PST_LBA_ANTENNA "LBAAntenna" +#define PN_LBA_COMMON_RCUX "common.RCUX" +#define PN_LBA_COMMON_RCUY "common.RCUY" +#define PN_LBA_COMMON_DELTAX "common.deltaX" +#define PN_LBA_COMMON_DELTAY "common.deltaY" +#define PN_LBA_COMMON_DELTAZ "common.deltaZ" + +// HBAAntenna +#define PSN_HBA_ANTENNA "LOFAR_PIC_@hbaantenna@" +#define PST_HBA_ANTENNA "HBAAntenna" +#define PN_HBA_COMMON_RCUX "common.RCUX" +#define PN_HBA_COMMON_RCUY "common.RCUY" +#define PN_HBA_COMMON_DELTAX "common.deltaX" +#define PN_HBA_COMMON_DELTAY "common.deltaY" +#define PN_HBA_COMMON_DELTAZ "common.deltaZ" +#define PN_HBA_ELEMENT00_STATUS_STATE "element00.status.state" +#define PN_HBA_ELEMENT00_STATUS_CHILD_STATE "element00.status.childState" +#define PN_HBA_ELEMENT00_STATUS_MESSAGE "element00.status.message" +#define PN_HBA_ELEMENT00_STATUS_LEAF "element00.status.leaf" +#define PN_HBA_ELEMENT01_STATUS_STATE "element01.status.state" +#define PN_HBA_ELEMENT01_STATUS_CHILD_STATE "element01.status.childState" +#define PN_HBA_ELEMENT01_STATUS_MESSAGE "element01.status.message" +#define PN_HBA_ELEMENT01_STATUS_LEAF "element01.status.leaf" +#define PN_HBA_ELEMENT02_STATUS_STATE "element02.status.state" +#define PN_HBA_ELEMENT02_STATUS_CHILD_STATE "element02.status.childState" +#define PN_HBA_ELEMENT02_STATUS_MESSAGE "element02.status.message" +#define PN_HBA_ELEMENT02_STATUS_LEAF "element02.status.leaf" +#define PN_HBA_ELEMENT03_STATUS_STATE "element03.status.state" +#define PN_HBA_ELEMENT03_STATUS_CHILD_STATE "element03.status.childState" +#define PN_HBA_ELEMENT03_STATUS_MESSAGE "element03.status.message" +#define PN_HBA_ELEMENT03_STATUS_LEAF "element03.status.leaf" +#define PN_HBA_ELEMENT04_STATUS_STATE "element04.status.state" +#define PN_HBA_ELEMENT04_STATUS_CHILD_STATE "element04.status.childState" +#define PN_HBA_ELEMENT04_STATUS_MESSAGE "element04.status.message" +#define PN_HBA_ELEMENT04_STATUS_LEAF "element04.status.leaf" +#define PN_HBA_ELEMENT05_STATUS_STATE "element05.status.state" +#define PN_HBA_ELEMENT05_STATUS_CHILD_STATE "element05.status.childState" +#define PN_HBA_ELEMENT05_STATUS_MESSAGE "element05.status.message" +#define PN_HBA_ELEMENT05_STATUS_LEAF "element05.status.leaf" +#define PN_HBA_ELEMENT06_STATUS_STATE "element06.status.state" +#define PN_HBA_ELEMENT06_STATUS_CHILD_STATE "element06.status.childState" +#define PN_HBA_ELEMENT06_STATUS_MESSAGE "element06.status.message" +#define PN_HBA_ELEMENT06_STATUS_LEAF "element06.status.leaf" +#define PN_HBA_ELEMENT07_STATUS_STATE "element07.status.state" +#define PN_HBA_ELEMENT07_STATUS_CHILD_STATE "element07.status.childState" +#define PN_HBA_ELEMENT07_STATUS_MESSAGE "element07.status.message" +#define PN_HBA_ELEMENT07_STATUS_LEAF "element07.status.leaf" +#define PN_HBA_ELEMENT08_STATUS_STATE "element08.status.state" +#define PN_HBA_ELEMENT08_STATUS_CHILD_STATE "element08.status.childState" +#define PN_HBA_ELEMENT08_STATUS_MESSAGE "element08.status.message" +#define PN_HBA_ELEMENT08_STATUS_LEAF "element08.status.leaf" +#define PN_HBA_ELEMENT09_STATUS_STATE "element09.status.state" +#define PN_HBA_ELEMENT09_STATUS_CHILD_STATE "element09.status.childState" +#define PN_HBA_ELEMENT09_STATUS_MESSAGE "element09.status.message" +#define PN_HBA_ELEMENT09_STATUS_LEAF "element09.status.leaf" +#define PN_HBA_ELEMENT10_STATUS_STATE "element10.status.state" +#define PN_HBA_ELEMENT10_STATUS_CHILD_STATE "element10.status.childState" +#define PN_HBA_ELEMENT10_STATUS_MESSAGE "element10.status.message" +#define PN_HBA_ELEMENT10_STATUS_LEAF "element10.status.leaf" +#define PN_HBA_ELEMENT11_STATUS_STATE "element11.status.state" +#define PN_HBA_ELEMENT11_STATUS_CHILD_STATE "element11.status.childState" +#define PN_HBA_ELEMENT11_STATUS_MESSAGE "element11.status.message" +#define PN_HBA_ELEMENT11_STATUS_LEAF "element11.status.leaf" +#define PN_HBA_ELEMENT12_STATUS_STATE "element12.status.state" +#define PN_HBA_ELEMENT12_STATUS_CHILD_STATE "element12.status.childState" +#define PN_HBA_ELEMENT12_STATUS_MESSAGE "element12.status.message" +#define PN_HBA_ELEMENT12_STATUS_LEAF "element12.status.leaf" +#define PN_HBA_ELEMENT13_STATUS_STATE "element13.status.state" +#define PN_HBA_ELEMENT13_STATUS_CHILD_STATE "element13.status.childState" +#define PN_HBA_ELEMENT13_STATUS_MESSAGE "element13.status.message" +#define PN_HBA_ELEMENT13_STATUS_LEAF "element13.status.leaf" +#define PN_HBA_ELEMENT14_STATUS_STATE "element14.status.state" +#define PN_HBA_ELEMENT14_STATUS_CHILD_STATE "element14.status.childState" +#define PN_HBA_ELEMENT14_STATUS_MESSAGE "element14.status.message" +#define PN_HBA_ELEMENT14_STATUS_LEAF "element14.status.leaf" +#define PN_HBA_ELEMENT15_STATUS_STATE "element15.status.state" +#define PN_HBA_ELEMENT15_STATUS_CHILD_STATE "element15.status.childState" +#define PN_HBA_ELEMENT15_STATUS_MESSAGE "element15.status.message" +#define PN_HBA_ELEMENT15_STATUS_LEAF "element15.status.leaf" + // LogProcessor #define PSN_LOG_PROCESSOR "LOFAR_PermSW_Daemons_LogProcessor" #define PST_LOG_PROCESSOR "LogProcessor" @@ -285,25 +428,15 @@ #define PN_CLC_REQUESTED_BITMODE "requestedBitmode" #define PN_CLC_ACTUAL_BITMODE "actualBitmode" -// Antenna -#define PSN_ANTENNA "@antenna@" -#define PST_ANTENNA "Antenna" -#define PN_ANT_STATUS_STATE "status.state" -#define PN_ANT_STATUS_CHILD_STATE "status.childState" -#define PN_ANT_STATUS_MESSAGE "status.message" -#define PN_ANT_STATUS_LEAF "status.leaf" -#define PN_ANT_RCUX "RCUX" -#define PN_ANT_RCUY "RCUY" -#define PN_ANT_DELTAX "deltaX" -#define PN_ANT_DELTAY "deltaY" -#define PN_ANT_DELTAH "deltaH" - // StnObservation #define PSN_STN_OBSERVATION "LOFAR_ObsSW_@observation@" #define PST_STN_OBSERVATION "StnObservation" #define PN_OBS_NAME "name" #define PN_OBS_CLAIM_CLAIM_DATE "claim.claimDate" #define PN_OBS_CLAIM_NAME "claim.name" +#define PN_OBS_RECEIVER_BITMAP "receiverBitmap" +#define PN_OBS_LBA_BITMAP "LBAbitmap" +#define PN_OBS_HBA_BITMAP "HBAbitmap" // BeamControl #define PSN_BEAM_CONTROL "LOFAR_ObsSW_@observation@_BeamControl" @@ -340,5 +473,6 @@ #define PN_TBC_TRIGGER_PEAK_VALUE "trigger.peakValue" #define PN_TBC_TRIGGER_FLAGS "trigger.flags" #define PN_TBC_TRIGGER_TABLE "trigger.table" +#define PN_TBC_TRIGGER_MISSED "trigger.missed" #endif diff --git a/MAC/APL/StationCU/src/StationControl/StationControl.cc b/MAC/APL/StationCU/src/StationControl/StationControl.cc index d1e82693d38aa9c5ff3f9ccae3a0c0fb77325aa6..253c9e06d70aa7ab1ea502a6f3845ee4ad46a6ef 100644 --- a/MAC/APL/StationCU/src/StationControl/StationControl.cc +++ b/MAC/APL/StationCU/src/StationControl/StationControl.cc @@ -27,11 +27,13 @@ #include <Common/LofarLogger.h> #include <Common/LofarLocators.h> #include <Common/LofarConstants.h> +#include <Common/StreamUtil.h> #include <Common/SystemUtil.h> #include <Common/Version.h> #include <ApplCommon/LofarDirs.h> #include <ApplCommon/StationConfig.h> #include <ApplCommon/StationInfo.h> +#include <ApplCommon/AntennaSets.h> #include <Common/ParameterSet.h> #include <GCF/PVSS/GCF_PVTypes.h> @@ -124,8 +126,8 @@ StationControl::StationControl(const string& cntlrName) : itsRCUmask.reset(); itsTBmask.reset(); - LOG_DEBUG_STR("sizeof itsLBArcumask: " << itsLBArcumask.size()); - LOG_DEBUG_STR("sizeof itsHBArcumask: " << itsHBArcumask.size()); + LOG_DEBUG_STR("sizeof itsLBAmask: " << itsLBAmask.size()); + LOG_DEBUG_STR("sizeof itsHBAmask: " << itsHBAmask.size()); LOG_DEBUG_STR("sizeof itsRCUmask: " << itsRCUmask.size()); LOG_DEBUG_STR("sizeof itsTBmask: " << itsTBmask.size()); } @@ -1033,6 +1035,7 @@ void StationControl::_handleQueryEvent(GCFEvent& event) { LOG_TRACE_FLOW_STR ("_handleQueryEvent:" << eventName(event)); + // Check for errors DPQueryChangedEvent DPevent(event); if (DPevent.result != SA_NO_ERROR) { LOG_ERROR_STR("PVSS reported error " << DPevent.result << " for a query " << @@ -1040,6 +1043,7 @@ void StationControl::_handleQueryEvent(GCFEvent& event) return; } + // Remember Query ID if not done before. if (!itsStateQryID) { itsStateQryID = DPevent.QryID; } @@ -1047,6 +1051,7 @@ void StationControl::_handleQueryEvent(GCFEvent& event) // The selected datapoints are delivered with full PVSS names, like: // CS001:LOFAR_PIC_Cabinet0_Subrack0_RSPBoard0_RCU5.status.state // CS001:LOFAR_PIC_Cabinet0_Subrack0_RSPBoard0.splitterOn + // CS001:LOFAR_PIC_LBA000.status.state // Each event may contain more than one DP. int nrDPs = ((GCFPVDynArr*)(DPevent.DPnames._pValue))->getValue().size(); GCFPVDynArr* DPnames = (GCFPVDynArr*)(DPevent.DPnames._pValue); @@ -1063,14 +1068,65 @@ void StationControl::_handleQueryEvent(GCFEvent& event) LOG_DEBUG_STR("QryUpdate: DP=" << nameStr << ", value=" << newState); + // test for LBA + if ((pos = nameStr.find("PIC_LBA")) != string::npos) { + uint antNr; + if (sscanf(nameStr.substr(pos).c_str(), "PIC_LBA%u.status.state", &antNr) != 1) { + LOG_ERROR_STR("Cannot determine address of " << nameStr << + ". AVAILABILITY OF ANTENNA'S MIGHT NOT BE UP TO DATE ANYMORE"); + continue; + } + if (antNr >= itsNrLBAs) { + LOG_ERROR_STR("LBA antenna number " << antNr << " is out of range!!!"); + continue; + } + + LOG_INFO_STR("New state of LBA " << antNr << " is " << newState); + // LBA's in de mode OFF and OPERATIONAL may be used in observations. + if (newState == modeOff || newState == modeOperational) { + itsLBAmask.set(antNr); + } + else { // all other modes + itsLBAmask.reset(antNr); + } + } // PIC_LBA + + // test for HBA + if ((pos = nameStr.find("PIC_HBA")) != string::npos) { + uint antNr; + if (sscanf(nameStr.substr(pos).c_str(), "PIC_HBA%u.status.state", &antNr) != 1) { + LOG_ERROR_STR("Cannot determine address of " << nameStr << + ". AVAILABILITY OF ANTENNA'S MIGHT NOT BE UP TO DATE ANYMORE"); + continue; + } + if (antNr >= itsNrHBAs) { + LOG_ERROR_STR("HBA antenna number " << antNr << " is out of range!!!"); + continue; + } + + LOG_INFO_STR("New state of HBA " << antNr << " is " << newState); + // HBA's in de mode OFF and OPERATIONAL may be used in observations. + if (newState == modeOff || newState == modeOperational) { + itsHBAmask.set(antNr); + } + else { // all other modes + itsHBAmask.reset(antNr); + } + } // PIC_HBA + // test for RCU if ((pos = nameStr.find("_RCU")) != string::npos) { - int rcu; - if (sscanf(nameStr.substr(pos).c_str(), "_RCU%d.status.state", &rcu) != 1) { + uint rcu; + if (sscanf(nameStr.substr(pos).c_str(), "_RCU%u.status.state", &rcu) != 1) { LOG_ERROR_STR("Cannot determine address of " << nameStr << ". AVAILABILITY OF ANTENNA'S MIGHT NOT BE UP TO DATE ANYMORE"); continue; } + if (rcu >= itsNrRCUs) { + LOG_ERROR_STR("RCU number " << rcu << " is out of range!!!"); + continue; + } + LOG_INFO_STR("New state of RCU " << rcu << " is " << newState); // RCU's in de mode OFF and OPERATIONAL may be used in observations. if (newState == modeOff || newState == modeOperational) { @@ -1079,13 +1135,17 @@ void StationControl::_handleQueryEvent(GCFEvent& event) else { // all other modes itsRCUmask.reset(rcu); } - } + } // _RCU // test for RSPBoard else if ((pos = nameStr.find("_RSPBoard")) != string::npos) { - int rsp; + uint rsp; if (nameStr.find(".status.state") != string::npos) { - if (sscanf(nameStr.substr(pos).c_str(), "_RSPBoard%d.status.state", &rsp) == 1) { + if (sscanf(nameStr.substr(pos).c_str(), "_RSPBoard%u.status.state", &rsp) == 1) { + if (rsp >= itsNrRSPs) { + LOG_ERROR_STR("RSP board number " << rsp << " is out of range!!!"); + continue; + } LOG_INFO_STR("New state of RSPBoard " << rsp << " is " << newState); int rcubase = rsp * NR_RCUS_PER_RSPBOARD; for (int i = 0; i < NR_RCUS_PER_RSPBOARD; i++) { @@ -1104,7 +1164,11 @@ void StationControl::_handleQueryEvent(GCFEvent& event) itsSplitterQryID = DPevent.QryID; } - if (sscanf(nameStr.substr(pos).c_str(), "_RSPBoard%d.splitterOn", &rsp) == 1) { + if (sscanf(nameStr.substr(pos).c_str(), "_RSPBoard%u.splitterOn", &rsp) == 1) { + if (rsp >= itsNrRSPs) { + LOG_ERROR_STR("RSP boardnumber " << rsp << " is out of range!!!"); + continue; + } if (itsSplitters[rsp] != (newState ? true : false)) { LOG_INFO_STR("New setting of splitter " << rsp << " is " << (newState ? "on" : "off")); if (newState) { @@ -1121,16 +1185,20 @@ void StationControl::_handleQueryEvent(GCFEvent& event) ". STATE OF ANTENNA'S OR SPLITTERS MIGHT NOT BE UP TO DATE ANYMORE"); continue; } - } + } // _RSPBoard // test for TBBoard else if ((pos = nameStr.find("_TBBoard")) != string::npos) { - int tbb; - if (sscanf(nameStr.substr(pos).c_str(), "_TBBoard%d.status.state", &tbb) != 1) { + uint tbb; + if (sscanf(nameStr.substr(pos).c_str(), "_TBBoard%u.status.state", &tbb) != 1) { LOG_ERROR_STR("Cannot determine address of " << nameStr << ". AVAILABILITY OF TBBOARD'S MIGHT NOT BE UP TO DATE ANYMORE"); continue; } + if (tbb >= itsNrTBBs) { + LOG_ERROR_STR("TB boardnumber " << tbb << " is out of range!!!"); + continue; + } LOG_INFO_STR("New state of TBBoard " << tbb << " is " << newState); if (newState != RTDB_OBJ_STATE_OPERATIONAL) { itsTBmask.reset(tbb); @@ -1138,14 +1206,17 @@ void StationControl::_handleQueryEvent(GCFEvent& event) else { itsTBmask.set(tbb); } - } + } // _TBBoard else { LOG_DEBUG_STR("State of unknown component received: " << nameStr); } } // for - _updateAntennaMasks(); // translate new RCU mask to the LBA and HBA masks. + if (itsHasSplitters && itsSplitters.count() != 0 && itsSplitters.count() != itsNrRSPs) { + LOG_WARN_STR("Not all splitters have the same state! " << itsSplitters); + // TODO: ring some bells in the Navigator? + } } @@ -1191,16 +1262,49 @@ uint16 StationControl::_addObservation(const string& name) // As base we use the definition of the AntennaSetsfile which we limit to the // receivers specified by the user (if any). Finally we can optionally correct // this set with the 'realtime' availability of the receivers. - StationConfig config; - Observation::RCUset_t definedReceivers = itsAntSet->RCUallocation(theObs.antennaSet); - Observation::RCUset_t userReceivers = theObs.getRCUbitset(config.nrLBAs, config.nrHBAs, theObs.antennaSet); - Observation::RCUset_t realReceivers = definedReceivers & userReceivers; + StationConfig config; + bool onLBAField(itsAntSet->usesLBAfield(theObs.antennaSet)); + RCUmask_t definedReceivers = (onLBAField ? itsAntSet->LBAallocation(theObs.antennaSet) + : itsAntSet->HBAallocation(theObs.antennaSet)); + RCUmask_t userReceivers = theObs.getRCUbitset(config.nrLBAs, config.nrHBAs, theObs.antennaSet); + RCUmask_t realReceivers = definedReceivers & userReceivers; LOG_DEBUG_STR("definedReceivers =" << definedReceivers); LOG_DEBUG_STR("userReceivers =" << userReceivers); LOG_DEBUG_STR("def&userReceivers=" << realReceivers); + // Before optionally applying the current hardware status make bitmap strings for PVSS. + string LBAbitmap; + string HBAbitmap; + LBAbitmap.resize(config.nrLBAs,'0'); + HBAbitmap.resize(config.nrHBAs,'0'); + if (onLBAField) { + for (int i(0); i < config.nrLBAs; i++) { + if (realReceivers[2*i] || realReceivers[2*i+1]) { + LBAbitmap[i] ='1'; + } + } + } + else { + for (int i(0); i < config.nrHBAs; i++) { + if (realReceivers[2*i] || realReceivers[2*i+1]) { + HBAbitmap[i] ='1'; + } + } + } + // apply the current state of the hardware to the desired selection when user likes that. if (itsUseHWinfo) { - realReceivers &= itsRCUmask; + vector<int> *mappingPtr = onLBAField ? &itsLBAmapping : &itsHBAmapping; + AntennaMask_t antBitSet = onLBAField ? itsLBAmask : itsHBAmask; + for (int rcu = 0; rcu < MAX_RCUS; rcu++) { + int idx((*mappingPtr)[rcu]); + if (!realReceivers[rcu] || idx<0 || !antBitSet[idx]) { + realReceivers.reset(rcu); + if (idx >= 0 && !antBitSet[idx]) { + LOG_INFO_STR("Rejecting RCU " << rcu << " because Antenna is out of order"); + } + } + } +LOG_DEBUG_STR("final receivers =" << realReceivers); // Write the corrected set back into the ParameterSetfile. string prefix = theObsPS.locateModule("Observation") + "Observation."; // save original under different name (using 'replace' is 'add' w. simplified testing) @@ -1216,7 +1320,7 @@ LOG_DEBUG_STR("def&userReceivers=" << realReceivers); // create an activeObservation object that will manage the child controllers. - ActiveObs* theNewObs = new ActiveObs(name, (State)&ActiveObs::initial, &theObsPS, itsHasSplitters, *this); + ActiveObs* theNewObs = new ActiveObs(name, (State)&ActiveObs::initial, &theObsPS, LBAbitmap, HBAbitmap, itsHasSplitters, *this); if (!theNewObs) { LOG_FATAL_STR("Unable to create the Observation '" << name << "'"); return (CT_RESULT_UNSPECIFIED); @@ -1300,27 +1404,48 @@ void StationControl::_abortObsWithWrongBitmode() void StationControl::_initAntennaMasks() { // reset all variables - itsLBArcumask.reset(); - itsHBArcumask.reset(); + itsLBAmask.reset(); + itsHBAmask.reset(); // Adopt values from RemoteStation.conf StationConfig SC; - itsNrRSPboards = SC.nrRSPs; - itsNrLBAs = SC.nrLBAs; - itsNrHBAs = SC.nrHBAs; + itsNrRSPs = SC.nrRSPs; + itsNrTBBs = SC.nrRSPs; + itsNrLBAs = SC.nrLBAs; + itsNrHBAs = SC.nrHBAs; + itsNrRCUs = SC.nrRSPs * NR_RCUS_PER_RSPBOARD; itsHasSplitters= SC.hasSplitters; - ASSERTSTR (2*itsNrLBAs <= itsLBArcumask.size() && - 2*itsNrHBAs <= itsHBArcumask.size(), "Number of antennas exceed expected count"); - - // set the right bits. - for (uint i = 0; i < itsNrLBAs; i++) { - itsLBArcumask.set(2*i); - itsLBArcumask.set(2*i+1); - } - for (uint i = 0; i < itsNrHBAs; i++) { - itsHBArcumask.set(2*i); - itsHBArcumask.set(2*i+1); + ASSERTSTR (itsNrLBAs <= itsLBAmask.size() && + itsNrHBAs <= itsHBAmask.size(), "Number of antennas exceed expected count"); + + // Setup mapping from LBA antennas and HBA antennas to RCU numbers. + // itsxBAmapping(antNr,*) contains the + itsLBAmapping.resize(MAX_RCUS, -1); // 192 + itsHBAmapping.resize(MAX_RCUS, -1); + for (int ant = 0; ant < (int)MAX_ANTENNAS; ant++) { + if (ant < (int)itsNrHBAs) { + itsHBAmapping[N_POL*ant] = ant; + itsHBAmapping[N_POL*ant+1] = ant; + } + if (ant < (int)itsNrLBAs) { + if (ant > (int)itsNrRSPs * (int)NR_ANTENNAS_PER_RSPBOARD) { + itsLBAmapping[N_POL*ant+1 - (NR_RCUS_PER_RSPBOARD*itsNrRSPs)] = ant; + itsLBAmapping[N_POL*ant - (NR_RCUS_PER_RSPBOARD*itsNrRSPs)] = ant; + } + else { + itsLBAmapping[N_POL*ant] = ant; + itsLBAmapping[N_POL*ant+1] = ant; + } + } + } + { stringstream oss; + writeVector(oss, itsLBAmapping); + LOG_DEBUG_STR("LBAmap: " << oss.str()); + } + { stringstream oss; + writeVector(oss, itsHBAmapping); + LOG_DEBUG_STR("HBAmap: " << oss.str()); } // The masks are now initialized with the static information. The _handleQueryEvent routine @@ -1328,51 +1453,6 @@ void StationControl::_initAntennaMasks() // correct and latest state. } -// -// _updateAntennaMasks() -// -// Translates the RCU mask to the LBA and HBA masks. -// This routine is familiar with mapping of the antennas on the RCU's. -// -void StationControl::_updateAntennaMasks() -{ - // setup constants - bool doubleMappedLBA (itsNrLBAs > (itsNrRSPboards * NR_ANTENNAS_PER_RSPBOARD)); - int doubleMapRCUoffset (itsNrRSPboards * NR_RCUS_PER_RSPBOARD); - - // Note: the definition in StationControl.h and the ASSERT in _initAntennaMasks assure - // that we never exceed the boundaries of the bitmaps here. - for (int rcu = 0; rcu < MAX_RCUS/2 ; rcu+=2) { - if (itsRCUmask[rcu] && itsRCUmask[rcu+1]) { // X and Y - itsLBArcumask.set(rcu); - itsLBArcumask.set(rcu+1); - if (doubleMappedLBA) { - itsLBArcumask.set(doubleMapRCUoffset+rcu); - itsLBArcumask.set(doubleMapRCUoffset+rcu+1); - } - itsHBArcumask.set(rcu); - itsHBArcumask.set(rcu+1); - } - else { - itsLBArcumask.reset(rcu); - itsLBArcumask.reset(rcu+1); - if (doubleMappedLBA) { - itsLBArcumask.reset(doubleMapRCUoffset+rcu); - itsLBArcumask.reset(doubleMapRCUoffset+rcu+1); - } - itsHBArcumask.reset(rcu); - itsHBArcumask.reset(rcu+1); - } - } - LOG_DEBUG_STR("itsRCU:" << string(itsRCUmask.to_string<char,char_traits<char>,allocator<char> >())); - LOG_DEBUG_STR("itsLBA:" << string(itsLBArcumask.to_string<char,char_traits<char>,allocator<char> >())); - LOG_DEBUG_STR("itsHBA:" << string(itsHBArcumask.to_string<char,char_traits<char>,allocator<char> >())); - - if (itsHasSplitters && itsSplitters.count() != 0 && itsSplitters.count() != itsNrRSPboards) { - LOG_WARN_STR("Not all splitters have the same state! " << itsSplitters); - // TODO: ring some bells in the Navigator? - } -} // // _searchObsByTimerID(timerID) diff --git a/MAC/APL/StationCU/src/StationControl/StationControl.h b/MAC/APL/StationCU/src/StationControl/StationControl.h index ffa9cf29e57443bbaa518ccfade818eb45d3467f..b5eef6b10eed442e898b91757fcae7d167783df7 100644 --- a/MAC/APL/StationCU/src/StationControl/StationControl.h +++ b/MAC/APL/StationCU/src/StationControl/StationControl.h @@ -31,6 +31,7 @@ #include <Common/LofarConstants.h> #include <ApplCommon/Observation.h> #include <ApplCommon/AntennaSets.h> +#include <ApplCommon/StationDatatypes.h> //# ACC Includes #include <Common/ParameterSet.h> @@ -96,7 +97,6 @@ private: // helper methods void _initAntennaMasks (); - void _updateAntennaMasks (); void _updateObsListInPVSS (); uint16 _addObservation (const string& name); void _abortObservation (ObsIter theObs); @@ -145,16 +145,19 @@ private: // Availability information of Antenna's and circuit boards. bool itsUseHWinfo; - bitset<MAX_RCUS> itsLBArcumask; - bitset<MAX_RCUS> itsHBArcumask; - bitset<MAX_RCUS> itsRCUmask; + RCUmask_t itsRCUmask; + AntennaMask_t itsLBAmask; + AntennaMask_t itsHBAmask; bitset<MAX_RCUS / NR_RCUS_PER_TBBOARD> itsTBmask; uint32 itsNrLBAs; uint32 itsNrHBAs; - uint32 itsNrRSPboards; + uint32 itsNrRCUs; + uint32 itsNrRSPs; + uint32 itsNrTBBs; bool itsHasSplitters; bitset<MAX_RSPBOARDS> itsSplitters; // On or Off. - + vector<int> itsLBAmapping; + vector<int> itsHBAmapping; unsigned itsSetupSequence; }; diff --git a/MAC/APL/StationCU/src/StationControl/StationControlMain.cc b/MAC/APL/StationCU/src/StationControl/StationControlMain.cc index 9773aeab40014c879ed669504914f30d1c0996ac..38ff113ea9e627c501b9ae2e5eaa6a946e4f8969 100644 --- a/MAC/APL/StationCU/src/StationControl/StationControlMain.cc +++ b/MAC/APL/StationCU/src/StationControl/StationControlMain.cc @@ -22,7 +22,6 @@ //# #include <lofar_config.h> #include <Common/LofarLogger.h> -#include <Common/Exception.h> #include <Common/SystemUtil.h> #include <APL/APLCommon/ChildControl.h> #include <APL/APLCommon/ParentControl.h> @@ -34,9 +33,6 @@ using namespace LOFAR::GCF::TM; using namespace LOFAR::APLCommon; using namespace LOFAR::StationCU; -// Use a terminate handler that can produce a backtrace. -Exception::TerminateHandler t(Exception::terminate); - int main(int argc, char* argv[]) { using LOFAR::basename;