From 0e960d22816eb2bff2df7f3e0386ae13f2e4c2bc Mon Sep 17 00:00:00 2001
From: Pieter Donker <donker@astron.nl>
Date: Wed, 2 Mar 2016 14:59:46 +0000
Subject: [PATCH] Task #8966: add some pvss datapoints

---
 .../src/HardwareMonitor/PVSSDatapointDefs.h   |  28 ++-
 .../src/HardwareMonitor/RSPMonitor.cc         | 226 +++++++++---------
 .../src/HardwareMonitor/TBBMonitor.cc         |  82 +++----
 3 files changed, 173 insertions(+), 163 deletions(-)

diff --git a/MAC/APL/StationCU/src/HardwareMonitor/PVSSDatapointDefs.h b/MAC/APL/StationCU/src/HardwareMonitor/PVSSDatapointDefs.h
index 037b38ce036..569824d4e48 100644
--- a/MAC/APL/StationCU/src/HardwareMonitor/PVSSDatapointDefs.h
+++ b/MAC/APL/StationCU/src/HardwareMonitor/PVSSDatapointDefs.h
@@ -1,4 +1,4 @@
-// This file was generated by create_db_files v2.0 on wo sep 17 08:34:07 UTC 2014
+// This file was generated by create_db_files v2.0 on Wed Mar  2 14:33:32 UTC 2016
 
 #ifndef LOFAR_DEPLOYMENT_PVSSDATAPOINTS_H
 #define LOFAR_DEPLOYMENT_PVSSDATAPOINTS_H
@@ -15,11 +15,6 @@
 #define	PN_OBJ_MESSAGE	"object.message"
 #define	PN_OBJ_LEAF	"object.leaf"
 
-// AARTFAAC
-#define PSN_AARTFAAC	"LOFAR_PIC_AARTFAAC"
-#define PST_AARTFAAC	"AARTFAAC"
-#define PN_AF_PIGGYBACK	"piggyback"
-
 // MACScheduler
 #define PSN_MAC_SCHEDULER	"LOFAR_PermSW_MACScheduler"
 #define PST_MAC_SCHEDULER	"MACScheduler"
@@ -138,6 +133,11 @@
 #define PN_COP_WRITTEN	"written"
 #define PN_COP_DROPPED	"dropped"
 
+// AARTFAAC
+#define PSN_AARTFAAC	"LOFAR_PIC_AARTFAAC"
+#define PST_AARTFAAC	"AARTFAAC"
+#define PN_AF_PIGGYBACK	"piggyback"
+
 // Cabinet
 #define PSN_CABINET	"LOFAR_PIC_@cabinet@"
 #define PST_CABINET	"Cabinet"
@@ -172,6 +172,7 @@
 #define	PN_SRCK_SPU_STATUS_LEAF	"SPU.status.leaf"
 #define PN_SRCK_SPU__VHBA	"SPU.Vhba"
 #define PN_SRCK_SPU__VLBA	"SPU.Vlba"
+#define PN_SRCK_SPU__VSPU	"SPU.Vspu"
 #define PN_SRCK_SPU__VDIG	"SPU.Vdig"
 #define PN_SRCK_SPU_TEMPERATURE	"SPU.temperature"
 #define	PN_SRCK_CLOCK_BOARD_STATUS_STATE	"clockBoard.status.state"
@@ -316,13 +317,13 @@
 #define PN_TBB_IMAGE_INFO_MP_FILE	"imageInfo.MPFile"
 
 // UniBoard
-#define PSN_UNI_BOARD	"LOFAR_PIC_Cabinet1_UniBoard"
+#define PSN_UNI_BOARD	"LOFAR_PIC_Cabinet1_UniBoard_@uniboard@"
 #define PST_UNI_BOARD	"UniBoard"
 #define PN_UNI_POWER	"power"
 #define PN_UNI_ETH_TEMP	"ethTemp"
 #define PN_UNI_CURRENT	"current"
 #define PN_UNI_VOLTAGE	"voltage"
-#define PN_UNI_E2C_ERROR	"e2cError"
+#define PN_UNI_I2C_ERROR	"i2cError"
 
 // FPGA
 #define PSN_FPGA	"LOFAR_PIC_Cabinet1_UniBoard_@fpga@"
@@ -333,9 +334,16 @@
 #define PN_FPGA_HIGH_TEMP	"highTemp"
 #define PN_FPGA_FPGA_TEMP	"fpgaTemp"
 
-// UriBoard
+// URIBoard
 #define PSN_URI_BOARD	"LOFAR_PIC_@uriboard@"
-#define PST_URI_BOARD	"UriBoard"
+#define PST_URI_BOARD	"URIBoard"
+#define PN_URI_FIRM_VERSION	"firmVersion"
+#define PN_URI_HW_VERSION	"hwVersion"
+#define PN_URI_HSC_STATUS	"hscStatus"
+#define PN_URI_INPUT_VOLTAGE	"inputVoltage"
+#define PN_URI_BOARD_VOLTAGE	"boardVoltage"
+#define PN_URI_BOARD_CURRENT	"boardCurrent"
+#define PN_URI_UR_ISTATUS	"URIstatus"
 
 // LBAAntenna
 #define PSN_LBA_ANTENNA	"LOFAR_PIC_@lbaantenna@"
diff --git a/MAC/APL/StationCU/src/HardwareMonitor/RSPMonitor.cc b/MAC/APL/StationCU/src/HardwareMonitor/RSPMonitor.cc
index 3d38d28ad15..1dcec725978 100644
--- a/MAC/APL/StationCU/src/HardwareMonitor/RSPMonitor.cc
+++ b/MAC/APL/StationCU/src/HardwareMonitor/RSPMonitor.cc
@@ -52,7 +52,7 @@ namespace LOFAR {
 	using namespace GCF::PVSS;
 	using namespace GCF::RTDB;
 	namespace StationCU {
-	
+
 //
 // RSPMonitor()
 //
@@ -132,13 +132,13 @@ RSPMonitor::~RSPMonitor()
 //
 // Setup connection with PVSS
 //
-GCFEvent::TResult RSPMonitor::initial_state(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::initial_state(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("initial:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
     case F_INIT:
    		break;
@@ -169,11 +169,11 @@ GCFEvent::TResult RSPMonitor::initial_state(GCFEvent& event,
 		// update PVSS.
 		LOG_TRACE_FLOW ("Updateing state to PVSS");
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION, GCFPVString("RSP:initial"));
-		
+
 		LOG_DEBUG_STR("Going to connect to the RSPDriver.");
 		TRAN (RSPMonitor::connect2RSP);
 	}
-	
+
 	case DP_SET:
 		break;
 
@@ -184,7 +184,7 @@ GCFEvent::TResult RSPMonitor::initial_state(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("initial, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -195,13 +195,13 @@ GCFEvent::TResult RSPMonitor::initial_state(GCFEvent& event,
 //
 // Setup connection with RSPdriver
 //
-GCFEvent::TResult RSPMonitor::connect2RSP(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::connect2RSP(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("connect2RSP:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 	case F_ENTRY:
 		// update PVSS
@@ -221,7 +221,7 @@ GCFEvent::TResult RSPMonitor::connect2RSP(GCFEvent& event,
 
 	case F_DISCONNECTED:
 		port.close();
-		ASSERTSTR (&port == itsRSPDriver, 
+		ASSERTSTR (&port == itsRSPDriver,
 								"F_DISCONNECTED event from port " << port.getName());
 		LOG_WARN("RSP:Connection with RSPDriver failed, retry in 10 seconds");
 		itsOwnPropertySet->setValue(PN_FSM_ERROR, GCFPVString("RSP:connection timeout"));
@@ -242,7 +242,7 @@ GCFEvent::TResult RSPMonitor::connect2RSP(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("connect2RSP, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -252,13 +252,13 @@ GCFEvent::TResult RSPMonitor::connect2RSP(GCFEvent& event,
 //
 // Ask the configuration of the station
 //
-GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("askConfiguration:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 	case F_ENTRY: {
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION,GCFPVString("RSP:asking configuration"));
@@ -274,13 +274,13 @@ GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event,
 	case RSP_GETCONFIGACK: {
 		RSPGetconfigackEvent	ack(event);
 		// TODO cheack status?
-	
+
 		// calc size of the propertyset vectors
 		itsNrRCUs	   = ack.n_rcus;
 		itsNrRSPboards = ack.n_rspboards;
-		itsNrSubracks  = (itsNrRSPboards/NR_RSPBOARDS_PER_SUBRACK) + 
+		itsNrSubracks  = (itsNrRSPboards/NR_RSPBOARDS_PER_SUBRACK) +
 						 	((itsNrRSPboards%NR_RSPBOARDS_PER_SUBRACK) ? 1 : 0);
-		itsNrCabinets  = (itsNrSubracks /NR_SUBRACKS_PER_CABINET)  + 
+		itsNrCabinets  = (itsNrSubracks /NR_SUBRACKS_PER_CABINET)  +
 						 	((itsNrSubracks%NR_SUBRACKS_PER_CABINET) ? 1 : 0);
 		// construct a mask containing all available RSPboards.
 		itsRSPmask.reset();
@@ -292,7 +292,7 @@ GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event,
 		for(uint32	rcu = 0; rcu < itsNrRCUs; rcu++) {
 			itsRCUmask.set(rcu);
 		}
-		
+
 		// Read number of Antenna's from RemoteStation.conf file.
 		ConfigLocator	CL;
 		ParameterSet	RSconf(CL.locate("RemoteStation.conf"));
@@ -311,14 +311,14 @@ GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event,
 		LOG_INFO_STR(         "RSPmask      = " << itsRSPmask);
 		LOG_INFO(formatString("has splitters= %s", (itsHasSplitters ? "yes" : "no")));
 		LOG_INFO(formatString("has aartfaac = %s", (itsHasAartfaac ? "yes" : "no")));
-	
+
 		// do some checks
 		if (itsNrRSPboards != (uint32)ack.max_rspboards) {
-			LOG_WARN_STR("RSP:RSPdriver only controls " << itsNrRSPboards << " of " << ack.max_rspboards 
+			LOG_WARN_STR("RSP:RSPdriver only controls " << itsNrRSPboards << " of " << ack.max_rspboards
 						<< " RSPboards, cannot monitor full station");
 		}
 		if (itsNrRSPboards * NR_RCUS_PER_RSPBOARD != itsNrRCUs) {
-			LOG_INFO_STR("RSP:Station not fully equiped, only " << itsNrRCUs << " of " 
+			LOG_INFO_STR("RSP:Station not fully equiped, only " << itsNrRCUs << " of "
 						<< itsNrRSPboards * NR_RCUS_PER_RSPBOARD << "RCUs");
 		}
 		if (itsNrLBAs > (itsNrRCUs / 2)) {
@@ -344,7 +344,7 @@ GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("askConfiguration, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -355,13 +355,13 @@ GCFEvent::TResult RSPMonitor::askConfiguration(GCFEvent& event,
 //
 // Create PropertySets for all hardware.
 //
-GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("createPropertySets:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -379,7 +379,7 @@ GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event,
 		string	subrackNameMask (createPropertySetName(PSN_SUB_RACK,  getName()));
 		string	rspboardNameMask(createPropertySetName(PSN_RSP_BOARD, getName()));
 		string	rcuNameMask     (createPropertySetName(PSN_RCU, 	  getName()));
-		// Note: when we are REconnected to the RSPdriver we already have the 
+		// Note: when we are REconnected to the RSPdriver we already have the
 		// propertySet allocated. So only create a PS when we don't have one yet.
 		for (uint32	rcu = 0; rcu < itsNrRCUs; rcu++) {
 			// new cabinet?
@@ -414,7 +414,7 @@ GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event,
 			if (!itsRCUs[rcu]) {
 				itsRCUs[rcu] = new RTDBPropertySet(PSname, PST_RCU, PSAT_WO | PSAT_CW, this);
 			}
-			usleep (2000); // wait 2 ms in order not to overload the system  
+			usleep (2000); // wait 2 ms in order not to overload the system
 		}
 		itsStationInfo  = new RTDBPropertySet(PSN_STATION_INFO, PST_STATION_INFO, PSAT_WO | PSAT_CW, this);
 		itsAartfaacInfo = new RTDBPropertySet(PSN_AARTFAAC, PST_AARTFAAC, PSAT_WO | PSAT_CW, this);
@@ -437,7 +437,7 @@ GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event,
 			ASSERTSTR(itsRCUs[rcu], "Allocation of PS for rcu " << rcu << " failed.");
 		}
 		ASSERTSTR(itsStationInfo, "Allocation of PS for StationInfo failed.");
-		
+
 		LOG_INFO_STR("Allocation of all propertySets successfull, going to subscribe to RCU states");
 //		itsOwnPropertySet->setValue(PN_HWM_RSP_ERROR,GCFPVString(""));
 		TRAN(RSPMonitor::subscribeToRCUs);
@@ -458,7 +458,7 @@ GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("createPropertySets, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -469,13 +469,13 @@ GCFEvent::TResult RSPMonitor::createPropertySets(GCFEvent& event,
 //
 // Get a subscription to the state of the RCU's
 //
-GCFEvent::TResult RSPMonitor::subscribeToRCUs(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::subscribeToRCUs(GCFEvent& event,
 											  GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("subscribeToRCUs:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -532,7 +532,7 @@ GCFEvent::TResult RSPMonitor::subscribeToRCUs(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("createPropertySets, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -543,16 +543,16 @@ GCFEvent::TResult RSPMonitor::subscribeToRCUs(GCFEvent& event,
 //
 // Ask the firmware version of the boards
 //
-GCFEvent::TResult RSPMonitor::askVersion(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::askVersion(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("askVersion:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
-	case F_ENTRY: 
+	case F_ENTRY:
 	case F_TIMER: {
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION,GCFPVString("RSP:getting version info"));
 //		itsOwnPropertySet->setValue(PN_HWM_RSP_ERROR,GCFPVString(""));
@@ -579,16 +579,16 @@ GCFEvent::TResult RSPMonitor::askVersion(GCFEvent& event,
 			// RSP board version
 			versionStr = formatString("%d", ack.versions.bp()(rsp).rsp_version);
 			itsRSPs[rsp]->setValue(PN_RSP_VERSION, GCFPVString(versionStr), double(ack.timestamp));
-			setObjectState(getName(), itsRSPs[rsp]->getFullScope(), (ack.versions.bp()(rsp).rsp_version) ? 
+			setObjectState(getName(), itsRSPs[rsp]->getFullScope(), (ack.versions.bp()(rsp).rsp_version) ?
 															RTDB_OBJ_STATE_OPERATIONAL : RTDB_OBJ_STATE_OFF);
-			
+
 			// BP version
 			versionStr = formatString("%d.%d", ack.versions.bp()(rsp).fpga_maj,
 											   ack.versions.bp()(rsp).fpga_min);
 			itsRSPs[rsp]->setValue(PN_RSP_BP_VERSION, GCFPVString(versionStr), double(ack.timestamp));
-			setObjectState(getName(), itsRSPs[rsp]->getFullScope()+".BP", (ack.versions.bp()(rsp).rsp_version) ? 
+			setObjectState(getName(), itsRSPs[rsp]->getFullScope()+".BP", (ack.versions.bp()(rsp).rsp_version) ?
 															RTDB_OBJ_STATE_OPERATIONAL : RTDB_OBJ_STATE_OFF);
-			
+
 			// APx versions
 			for (int ap = 0; ap < MEPHeader::N_AP; ap++) {
 				versionStr = formatString("%d.%d", ack.versions.ap()(rsp * MEPHeader::N_AP + ap).fpga_maj,
@@ -597,7 +597,7 @@ GCFEvent::TResult RSPMonitor::askVersion(GCFEvent& event,
 				itsRSPs[rsp]->setValue(DPEname, GCFPVString(versionStr), double(ack.timestamp));
 				setObjectState(getName(), formatString("%s.AP%d", itsRSPs[rsp]->getFullScope().c_str(), ap),
 										(ack.versions.ap()(rsp * MEPHeader::N_AP + ap).fpga_maj +
-										 ack.versions.ap()(rsp * MEPHeader::N_AP + ap).fpga_min) ? 
+										 ack.versions.ap()(rsp * MEPHeader::N_AP + ap).fpga_min) ?
 										RTDB_OBJ_STATE_OPERATIONAL : RTDB_OBJ_STATE_OFF);
 			}
 		}
@@ -626,7 +626,7 @@ GCFEvent::TResult RSPMonitor::askVersion(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("askVersion, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -637,13 +637,13 @@ GCFEvent::TResult RSPMonitor::askVersion(GCFEvent& event,
 //
 // Ask the information of the RSP boards
 //
-GCFEvent::TResult RSPMonitor::askSplitterInfo(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::askSplitterInfo(GCFEvent& event,
 											  GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("askSplitterInfo:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -675,7 +675,7 @@ GCFEvent::TResult RSPMonitor::askSplitterInfo(GCFEvent& event,
 	}
 	break;
 
-	case F_TIMER: 
+	case F_TIMER:
 		LOG_ERROR_STR("RSP:Timeout on getting the splitter information, trying status information");
 		itsOwnPropertySet->setValue(PN_FSM_ERROR,GCFPVString("RSP:getSplitter timeout"));
 		TRAN (RSPMonitor::askRSPinfo);
@@ -699,7 +699,7 @@ GCFEvent::TResult RSPMonitor::askSplitterInfo(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("askSplitterInfo, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -709,13 +709,13 @@ GCFEvent::TResult RSPMonitor::askSplitterInfo(GCFEvent& event,
 //
 // Ask the information of the RSP boards
 //
-GCFEvent::TResult RSPMonitor::askRSPinfo(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::askRSPinfo(GCFEvent& event,
 										 GCFPortInterface& port)
 {
 	LOG_DEBUG_STR ("askRSPinfo:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -752,70 +752,70 @@ GCFEvent::TResult RSPMonitor::askRSPinfo(GCFEvent& event,
 		for (uint32	rsp = 0; rsp < itsNrRSPboards; rsp++) {
 			BoardStatus		bStat = ack.sysstatus.board()(rsp);
 			// board voltages
-			itsRSPs[rsp]->setValue(PN_RSP_VOLTAGE12, GCFPVDouble(double(bStat.rsp.voltage_1_2)*(2.5/192.0)), 
+			itsRSPs[rsp]->setValue(PN_RSP_VOLTAGE12, GCFPVDouble(double(bStat.rsp.voltage_1_2)*(2.5/192.0)),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_VOLTAGE25, GCFPVDouble(double(bStat.rsp.voltage_2_5)*(3.3/192.0)), 
+			itsRSPs[rsp]->setValue(PN_RSP_VOLTAGE25, GCFPVDouble(double(bStat.rsp.voltage_2_5)*(3.3/192.0)),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_VOLTAGE33, GCFPVDouble(double(bStat.rsp.voltage_3_3)*(5.0/192.0)), 
+			itsRSPs[rsp]->setValue(PN_RSP_VOLTAGE33, GCFPVDouble(double(bStat.rsp.voltage_3_3)*(5.0/192.0)),
 									double(ack.timestamp), false);
-			
+
 			// Ethernet status
-			itsRSPs[rsp]->setValue(PN_RSP_ETHERNET_PACKETS_RECEIVED, GCFPVUnsigned(bStat.eth.nof_frames), 
+			itsRSPs[rsp]->setValue(PN_RSP_ETHERNET_PACKETS_RECEIVED, GCFPVUnsigned(bStat.eth.nof_frames),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_ETHERNET_PACKETS_ERROR,    GCFPVUnsigned(bStat.eth.nof_errors), 
+			itsRSPs[rsp]->setValue(PN_RSP_ETHERNET_PACKETS_ERROR,    GCFPVUnsigned(bStat.eth.nof_errors),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_ETHERNET_LAST_ERROR,       GCFPVUnsigned(bStat.eth.last_error), 
+			itsRSPs[rsp]->setValue(PN_RSP_ETHERNET_LAST_ERROR,       GCFPVUnsigned(bStat.eth.last_error),
 									double(ack.timestamp), false);
-			setObjectState(getName(), itsRSPs[rsp]->getFullScope()+".Ethernet", (bStat.eth.nof_frames != 0) ? 
+			setObjectState(getName(), itsRSPs[rsp]->getFullScope()+".Ethernet", (bStat.eth.nof_frames != 0) ?
 															RTDB_OBJ_STATE_OPERATIONAL : RTDB_OBJ_STATE_OFF);
-			
+
 			// MEP status
-			itsRSPs[rsp]->setValue(PN_RSP_MEP_SEQNR, GCFPVUnsigned(bStat.mep.seqnr), 
+			itsRSPs[rsp]->setValue(PN_RSP_MEP_SEQNR, GCFPVUnsigned(bStat.mep.seqnr),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_MEP_ERROR, GCFPVUnsigned(bStat.mep.error), 
+			itsRSPs[rsp]->setValue(PN_RSP_MEP_ERROR, GCFPVUnsigned(bStat.mep.error),
 									double(ack.timestamp), false);
 
 			// BP status
-			itsRSPs[rsp]->setValue(PN_RSP_BP_TEMPERATURE, GCFPVDouble(double(bStat.rsp.bp_temp)), 
+			itsRSPs[rsp]->setValue(PN_RSP_BP_TEMPERATURE, GCFPVDouble(double(bStat.rsp.bp_temp)),
 									double(ack.timestamp), false);
 			// AP0
-			itsRSPs[rsp]->setValue(PN_RSP_AP0_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap0_temp)), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP0_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap0_temp)),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP0_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap0_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP0_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap0_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP0_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap0_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP0_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap0_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP0_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap0_sync.ext_count), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP0_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap0_sync.ext_count),
 									double(ack.timestamp), false);
 
 			// AP1
-			itsRSPs[rsp]->setValue(PN_RSP_AP1_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap1_temp)), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP1_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap1_temp)),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP1_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap1_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP1_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap1_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP1_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap1_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP1_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap1_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP1_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap1_sync.ext_count), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP1_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap1_sync.ext_count),
 									double(ack.timestamp), false);
 
 			// AP2
-			itsRSPs[rsp]->setValue(PN_RSP_AP2_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap2_temp)), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP2_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap2_temp)),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP2_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap2_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP2_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap2_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP2_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap2_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP2_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap2_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP2_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap2_sync.ext_count), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP2_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap2_sync.ext_count),
 									double(ack.timestamp), false);
 
 			// AP3
-			itsRSPs[rsp]->setValue(PN_RSP_AP3_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap3_temp)), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP3_TEMPERATURE,		 GCFPVDouble(double(bStat.rsp.ap3_temp)),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP3_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap3_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP3_SYNC_SAMPLE_COUNT, GCFPVUnsigned(bStat.ap3_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP3_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap3_sync.sample_offset), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP3_SYNC_SYNC_COUNT,   GCFPVUnsigned(bStat.ap3_sync.sample_offset),
 									double(ack.timestamp), false);
-			itsRSPs[rsp]->setValue(PN_RSP_AP3_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap3_sync.ext_count), 
+			itsRSPs[rsp]->setValue(PN_RSP_AP3_SYNC_ERROR_COUNT,  GCFPVUnsigned(bStat.ap3_sync.ext_count),
 									double(ack.timestamp), false);
 
 			// finally set the splitter
@@ -850,7 +850,7 @@ GCFEvent::TResult RSPMonitor::askRSPinfo(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("askRSPinfo, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -865,7 +865,7 @@ GCFEvent::TResult RSPMonitor::askTDstatus(GCFEvent& event, GCFPortInterface& por
 	LOG_DEBUG_STR ("askTDstatus:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY:  {
@@ -879,7 +879,7 @@ GCFEvent::TResult RSPMonitor::askTDstatus(GCFEvent& event, GCFPortInterface& por
 		itsTimerPort->setTimer(5.0);		// in case the answer never comes
 	}
 	break;
-	
+
 	case F_TIMER:
 		LOG_ERROR_STR ("RSP:Timeout on getting information of the TD board, trying again in next run");
 		itsOwnPropertySet->setValue(PN_FSM_ERROR,GCFPVString("RSP:getClockboard timeout"));
@@ -914,7 +914,7 @@ GCFEvent::TResult RSPMonitor::askTDstatus(GCFEvent& event, GCFPortInterface& por
 			// This board controls the clockboard.
 			int	subrack = rsp/4;
 			// set state first
-			setObjectState(getName(), itsSubracks[subrack]->getFullScope()+".clockBoard", 
+			setObjectState(getName(), itsSubracks[subrack]->getFullScope()+".clockBoard",
 							(boardStatus.unknown) ?  RTDB_OBJ_STATE_OFF : RTDB_OBJ_STATE_OPERATIONAL);
 
 			if (boardStatus.unknown) {
@@ -922,17 +922,17 @@ GCFEvent::TResult RSPMonitor::askTDstatus(GCFEvent& event, GCFPortInterface& por
 				continue;
 			}
 
-			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_TEMPERATURE, 
+			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_TEMPERATURE,
 									GCFPVDouble(boardStatus.temperature), double(ack.timestamp), false);
-			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_LOCK160, 
+			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_LOCK160,
 									GCFPVBool(boardStatus.pll_160MHz_locked), double(ack.timestamp), false);
-			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_LOCK200, 
+			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_LOCK200,
 									GCFPVBool(boardStatus.pll_200MHz_locked), double(ack.timestamp), false);
-			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_FREQ, 
+			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD_FREQ,
 									GCFPVInteger(boardStatus.output_clock ? 200 : 160), double(ack.timestamp), false);
-			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD__VFSP, 
+			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD__VFSP,
 									GCFPVDouble(boardStatus.v2_5 * 3.3 / 192.0), double(ack.timestamp), false);
-			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD__VCLOCK, 
+			itsSubracks[subrack]->setValue(PN_SRCK_CLOCK_BOARD__VCLOCK,
 									GCFPVDouble(boardStatus.v3_3 * 5.0 / 192.0), double(ack.timestamp), false);
 			itsSubracks[subrack]->flush();
 			usleep(1000); // wait 1 ms
@@ -965,7 +965,7 @@ GCFEvent::TResult RSPMonitor::askTDstatus(GCFEvent& event, GCFPortInterface& por
 	default:
 		LOG_DEBUG_STR ("askVersion, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -980,7 +980,7 @@ GCFEvent::TResult RSPMonitor::askSPUstatus(GCFEvent& event, GCFPortInterface& po
 	LOG_DEBUG_STR ("askSPUstatus:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY:  {
@@ -1018,15 +1018,17 @@ GCFEvent::TResult RSPMonitor::askSPUstatus(GCFEvent& event, GCFPortInterface& po
 		for (uint32	subrack = 0; subrack < itsNrSubracks; subrack++) {
 			SPUBoardStatus&	boardStatus = ack.spustatus.subrack()(subrack);
 
-			itsSubracks[subrack]->setValue(PN_SRCK_SPU_TEMPERATURE, 
+			itsSubracks[subrack]->setValue(PN_SRCK_SPU_TEMPERATURE,
 									GCFPVDouble(boardStatus.temperature), double(ack.timestamp), false);
-			itsSubracks[subrack]->setValue(PN_SRCK_SPU__VDIG,  // RCU
+            itsSubracks[subrack]->setValue(PN_SRCK_SPU__VDIG,  // RCU
 									GCFPVDouble(boardStatus.v2_5 * 2.5 / 192.0 * 2.0), double(ack.timestamp), false);
 			itsSubracks[subrack]->setValue(PN_SRCK_SPU__VLBA,  // LBA
 									GCFPVDouble(boardStatus.v3_3 * 3.3 / 192.0 * 3.0), double(ack.timestamp), false);
 			itsSubracks[subrack]->setValue(PN_SRCK_SPU__VHBA,  // HBA
 									GCFPVDouble(boardStatus.v12 * 12.0 / 192.0 * 4.01), double(ack.timestamp), false);
-			itsSubracks[subrack]->flush();
+            itsSubracks[subrack]->setValue(PN_SRCK_SPU__VSPU,  // SPU
+									GCFPVDouble(boardStatus.vcc * 5.0 / 192.0), double(ack.timestamp), false);
+            itsSubracks[subrack]->flush();
 			usleep(1000); // wait 1 ms
 
 			setObjectState(getName(), itsSubracks[subrack]->getFullScope()+".SPU", RTDB_OBJ_STATE_OPERATIONAL);
@@ -1055,7 +1057,7 @@ GCFEvent::TResult RSPMonitor::askSPUstatus(GCFEvent& event, GCFPortInterface& po
 	default:
 		LOG_DEBUG_STR ("askVersion, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -1109,37 +1111,37 @@ GCFEvent::TResult RSPMonitor::askRCUinfo(GCFEvent& event, GCFPortInterface& port
 			uint32		rawValue = ack.settings()(rcu).getRaw();
 			LOG_DEBUG(formatString("Updating rcu %d with %08lX", rcu, rawValue));
 			// update all RCU variables
-			itsRCUs[rcu]->setValue(PN_RCU_DELAY, 
+			itsRCUs[rcu]->setValue(PN_RCU_DELAY,
 						GCFPVDouble((1000.0 / itsClock) * uint32(rawValue & DELAY_MASK)),
 						double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_INPUT_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_INPUT_ENABLE,
 						GCFPVBool(rawValue & INPUT_ENABLE_MASK),
 						double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_LBL_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_LBL_ENABLE,
 						GCFPVBool(rawValue & LBL_ANT_POWER_MASK), double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_LBH_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_LBH_ENABLE,
 						GCFPVBool(rawValue & LBH_ANT_POWER_MASK), double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_HBA_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_HBA_ENABLE,
 						GCFPVBool(rawValue & HBA_ANT_POWER_MASK), double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_BAND_SEL_LBA_HBA, 
+			itsRCUs[rcu]->setValue(PN_RCU_BAND_SEL_LBA_HBA,
 						GCFPVBool(rawValue & USE_LB_MASK),
 						double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_HBA_FILTER_SEL, 
+			itsRCUs[rcu]->setValue(PN_RCU_HBA_FILTER_SEL,
 						GCFPVUnsigned((rawValue & HB_FILTER_MASK) >> HB_FILTER_OFFSET),
 						double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_VL_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_VL_ENABLE,
 						GCFPVBool(rawValue & LB_POWER_MASK), double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_VH_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_VH_ENABLE,
 						GCFPVBool(rawValue & HB_POWER_MASK), double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_VDD_VCC_ENABLE, 
+			itsRCUs[rcu]->setValue(PN_RCU_VDD_VCC_ENABLE,
 						GCFPVBool(rawValue & ADC_POWER_MASK), double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_BAND_SEL_LBL_LBH, 
+			itsRCUs[rcu]->setValue(PN_RCU_BAND_SEL_LBL_LBH,
 						GCFPVBool(rawValue & USE_LBH_MASK),
 						double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_LBA_FILTER_SEL, 
+			itsRCUs[rcu]->setValue(PN_RCU_LBA_FILTER_SEL,
 						GCFPVUnsigned((rawValue & LB_FILTER_MASK) >> LB_FILTER_OFFSET),
 						double(ack.timestamp), false);
-			itsRCUs[rcu]->setValue(PN_RCU_ATTENUATION, 
+			itsRCUs[rcu]->setValue(PN_RCU_ATTENUATION,
 						GCFPVDouble(0.25 * uint32((rawValue & ATT_MASK) >> ATT_OFFSET)),
 						double(ack.timestamp), false);
 			itsRCUs[rcu]->flush();
@@ -1161,7 +1163,7 @@ GCFEvent::TResult RSPMonitor::askRCUinfo(GCFEvent& event, GCFPortInterface& port
                 LOG_DEBUG_STR("PN_RCU_ATTENUATION  (0xF80000):" << (uint32((rawValue & ATT_MASK) >> ATT_OFFSET)));
 			}
 #endif
-			setObjectState(getName(), itsRCUs[rcu]->getFullScope(), (rawValue & ADC_POWER_MASK) ? 
+			setObjectState(getName(), itsRCUs[rcu]->getFullScope(), (rawValue & ADC_POWER_MASK) ?
 															RTDB_OBJ_STATE_OPERATIONAL : RTDB_OBJ_STATE_OFF);
 
 			// update own RCU admin also
@@ -1177,7 +1179,7 @@ GCFEvent::TResult RSPMonitor::askRCUinfo(GCFEvent& event, GCFPortInterface& port
 		for (uint ant = 0; ant < itsNrLBAs; ant++) {
 			if (itsRCUInputStates(itsAntMapper->XRCU(ant), itsAntMapper->RCUinput(ant, AntennaMapper::AT_LBA)) ||
 				itsRCUInputStates(itsAntMapper->YRCU(ant), itsAntMapper->RCUinput(ant, AntennaMapper::AT_LBA))) {
-				setObjectState(getName(), formatString("%s:LOFAR_PIC_LBA%03d", pvssDBname.c_str(), ant), 
+				setObjectState(getName(), formatString("%s:LOFAR_PIC_LBA%03d", pvssDBname.c_str(), ant),
 								MAX2(itsRCUstates(itsAntMapper->XRCU(ant)), itsRCUstates(itsAntMapper->YRCU(ant)) ) );
 			}
 			else {
@@ -1187,7 +1189,7 @@ GCFEvent::TResult RSPMonitor::askRCUinfo(GCFEvent& event, GCFPortInterface& port
 		for (uint ant = 0; ant < itsNrHBAs; ant++) {
 			if (itsRCUInputStates(itsAntMapper->XRCU(ant), itsAntMapper->RCUinput(ant, AntennaMapper::AT_HBA)) ||
 				itsRCUInputStates(itsAntMapper->YRCU(ant), itsAntMapper->RCUinput(ant, AntennaMapper::AT_HBA))) {
-				setObjectState(getName(), formatString("%s:LOFAR_PIC_HBA%02d", pvssDBname.c_str(), ant), 
+				setObjectState(getName(), formatString("%s:LOFAR_PIC_HBA%02d", pvssDBname.c_str(), ant),
 								MAX2(itsRCUstates(itsAntMapper->XRCU(ant)), itsRCUstates(itsAntMapper->YRCU(ant)) ) );
 			}
 			else {
@@ -1257,7 +1259,7 @@ GCFEvent::TResult RSPMonitor::askDatastream(GCFEvent& event, GCFPortInterface& p
 		}
 		else {
 			TRAN(RSPMonitor::waitForNextCycle);			// go to next state.
-		}	
+		}
 		break;
 
 	case RSP_GETDATASTREAMACK: {
@@ -1271,7 +1273,7 @@ GCFEvent::TResult RSPMonitor::askDatastream(GCFEvent& event, GCFPortInterface& p
 			}
 			else {
 				TRAN(RSPMonitor::waitForNextCycle);			// go to next state.
-			}	
+			}
 			break;
 		}
 
@@ -1398,15 +1400,15 @@ GCFEvent::TResult RSPMonitor::askAartfaacState(GCFEvent& event, GCFPortInterface
 //
 // Wait for our next cycle.
 //
-GCFEvent::TResult RSPMonitor::waitForNextCycle(GCFEvent& event, 
+GCFEvent::TResult RSPMonitor::waitForNextCycle(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	if (eventName(event) != "DP_SET") {
-		LOG_DEBUG_STR ("waitForNextCycle:" << eventName(event) << "@" << port.getName());	
+		LOG_DEBUG_STR ("waitForNextCycle:" << eventName(event) << "@" << port.getName());
 	}
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 	case F_ENTRY: {
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION,GCFPVString("RSP:wait for next cycle"));
@@ -1444,7 +1446,7 @@ GCFEvent::TResult RSPMonitor::waitForNextCycle(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("waitForNextCycle, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -1528,7 +1530,7 @@ GCFEvent::TResult RSPMonitor::finish_state(GCFEvent& event, GCFPortInterface& po
 //		itsOwnPropertySet->setValue(string(PN_HWM_RSP_ERROR),GCFPVString(""));
 		break;
 	}
-  
+
 	case DP_SET:
 		break;
 
@@ -1536,7 +1538,7 @@ GCFEvent::TResult RSPMonitor::finish_state(GCFEvent& event, GCFPortInterface& po
 		LOG_DEBUG("finishing_state, DEFAULT");
 		status = GCFEvent::NOT_HANDLED;
 		break;
-	}    
+	}
 	return (status);
 }
 
diff --git a/MAC/APL/StationCU/src/HardwareMonitor/TBBMonitor.cc b/MAC/APL/StationCU/src/HardwareMonitor/TBBMonitor.cc
index 9519bc804b9..878d17eb2a7 100644
--- a/MAC/APL/StationCU/src/HardwareMonitor/TBBMonitor.cc
+++ b/MAC/APL/StationCU/src/HardwareMonitor/TBBMonitor.cc
@@ -50,7 +50,7 @@ namespace LOFAR {
 	using namespace APLCommon;
 	using namespace APL::RTDBCommon;
 	namespace StationCU {
-	
+
 //
 // TBBMonitor()
 //
@@ -107,7 +107,7 @@ GCFEvent::TResult TBBMonitor::initial_state(GCFEvent& event, GCFPortInterface& p
 	LOG_DEBUG_STR ("initial:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
     case F_INIT:
    		break;
@@ -124,7 +124,7 @@ GCFEvent::TResult TBBMonitor::initial_state(GCFEvent& event, GCFPortInterface& p
 		}
 		break;
 
-	case DP_CREATED: {		
+	case DP_CREATED: {
 		// NOTE: this function may be called DURING the construction of the PropertySet.
 		// Always exit this event in a way that GCF can end the construction.
 		DPCreatedEvent		dpEvent(event);
@@ -140,11 +140,11 @@ GCFEvent::TResult TBBMonitor::initial_state(GCFEvent& event, GCFPortInterface& p
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION, GCFPVString("TBB:initial"));
 		itsOwnPropertySet->setValue(PN_HWM_TBB_CONNECTED,GCFPVBool(false));
 //		itsOwnPropertySet->setValue(PN_FSM_ERROR,  GCFPVString(""));
-		
+
 		LOG_DEBUG_STR("Going to connect to the TBBDriver.");
 		TRAN (TBBMonitor::connect2TBB);
 	}
-	
+
 	case DP_SET:
 		break;
 
@@ -155,7 +155,7 @@ GCFEvent::TResult TBBMonitor::initial_state(GCFEvent& event, GCFPortInterface& p
 	default:
 		LOG_DEBUG_STR ("initial, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -171,7 +171,7 @@ GCFEvent::TResult TBBMonitor::connect2TBB(GCFEvent& event, GCFPortInterface& por
 	LOG_DEBUG_STR ("connect2TBB:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 	case F_ENTRY:
 		// update PVSS
@@ -190,7 +190,7 @@ GCFEvent::TResult TBBMonitor::connect2TBB(GCFEvent& event, GCFPortInterface& por
 
 	case F_DISCONNECTED:
 		port.close();
-		ASSERTSTR (&port == itsTBBDriver, 
+		ASSERTSTR (&port == itsTBBDriver,
 								"F_DISCONNECTED event from port " << port.getName());
 		LOG_WARN("Connection with TBBDriver failed, retry in 10 seconds");
 		itsOwnPropertySet->setValue(PN_FSM_ERROR, GCFPVString("TBB:connection timeout"));
@@ -211,7 +211,7 @@ GCFEvent::TResult TBBMonitor::connect2TBB(GCFEvent& event, GCFPortInterface& por
 	default:
 		LOG_DEBUG_STR ("connect2TBB, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -226,7 +226,7 @@ GCFEvent::TResult TBBMonitor::askConfiguration(GCFEvent& event, GCFPortInterface
 	LOG_DEBUG_STR ("askConfiguration:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 	case F_ENTRY: {
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION,GCFPVString("TBB:asking configuration"));
@@ -248,10 +248,10 @@ GCFEvent::TResult TBBMonitor::askConfiguration(GCFEvent& event, GCFPortInterface
 		itsTBBDriver->send(getconfig);
 	}
 	break;
-		
+
 	case TBB_GET_CONFIG_ACK: {
 		TBBGetConfigAckEvent	ack(event);
-	
+
 		// calc size of the propertyset vectors
 		itsBoardMask   = bitset<MAX_N_TBBOARDS>(ack.active_boards_mask);
 		itsNrTBboards  = ack.max_boards;
@@ -260,10 +260,10 @@ GCFEvent::TResult TBBMonitor::askConfiguration(GCFEvent& event, GCFPortInterface
 		// inform user
 		LOG_INFO_STR("Active boards = " << itsBoardMask);
 		LOG_INFO(formatString("nr TBboards = %d", itsNrTBboards));
-	
+
 		// do some checks
 		if (itsNrTBboards != itsBoardMask.count()) {
-			LOG_WARN_STR("TBB:Only " << itsBoardMask.count() << " of " << itsNrTBboards 
+			LOG_WARN_STR("TBB:Only " << itsBoardMask.count() << " of " << itsNrTBboards
 						<< " TBboards are available.");
 		}
 
@@ -283,7 +283,7 @@ GCFEvent::TResult TBBMonitor::askConfiguration(GCFEvent& event, GCFPortInterface
 	default:
 		LOG_DEBUG_STR ("askConfiguration, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -299,7 +299,7 @@ GCFEvent::TResult TBBMonitor::createPropertySets(GCFEvent& event, GCFPortInterfa
 	LOG_DEBUG_STR ("createPropertySets:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -377,7 +377,7 @@ GCFEvent::TResult TBBMonitor::createPropertySets(GCFEvent& event, GCFPortInterfa
 	default:
 		LOG_DEBUG_STR ("createPropertySets, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -393,7 +393,7 @@ GCFEvent::TResult TBBMonitor::askVersion(GCFEvent& event, GCFPortInterface& port
 	LOG_DEBUG_STR ("askVersion:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -414,7 +414,7 @@ GCFEvent::TResult TBBMonitor::askVersion(GCFEvent& event, GCFPortInterface& port
 		itsTBBDriver->send(getVersion);
 	}
 	break;
-		
+
 	case TBB_VERSION_ACK: {
 		itsTimerPort->cancelAllTimers();
 		TBBVersionAckEvent		ack(event);
@@ -429,11 +429,11 @@ GCFEvent::TResult TBBMonitor::askVersion(GCFEvent& event, GCFPortInterface& port
 				versionStr = formatString("%d.%d", ack.boardversion[tbb] / 10, ack.boardversion[tbb] % 10);
 				itsTBBs[tbb]->setValue(PN_TBB_BOARD_VERSION, GCFPVString(versionStr), 0.0, false);
 				itsTBBs[tbb]->setValue(PN_TBB_BOARDID, GCFPVUnsigned(ack.boardid[tbb]), 0.0, false);
-			
+
 				// BP version
 				versionStr = formatString("%d.%d", ack.tphwversion[tbb] / 10, ack.tphwversion[tbb] % 10);
 				itsTBBs[tbb]->setValue(PN_TBB_TP_VERSION, GCFPVString(versionStr), 0.0, false);
-			
+
 				// MPx versions
 				versionStr = formatString("%d.%d", ack.mp0version[tbb] / 10, ack.mp0version[tbb] % 10);
 				itsTBBs[tbb]->setValue(PN_TBB_MP0_VERSION, GCFPVString(versionStr), 0.0, false);
@@ -455,16 +455,16 @@ GCFEvent::TResult TBBMonitor::askVersion(GCFEvent& event, GCFPortInterface& port
 				itsTBBs[tbb]->setValue(PN_TBB_MP3_VERSION,	 GCFPVString("?.?"), 0.0, false);
 			}
 			itsTBBs[tbb]->flush();
-			
+
 			// set right color
 			//string reasonStr;
 			if (ack.status_mask[tbb] == TBB_SUCCESS) {
 				//reasonStr = formatString("%s: good", getName());
-				setObjectState("TBBMonitor: good", itsTBBs[tbb]->getFullScope(), RTDB_OBJ_STATE_OPERATIONAL);
+				setObjectState("TBBMonitor: good", itsTBBs[tbb]->getFullScope(), RTDB_OBJ_STATE_OPERATIONAL, true);
 			}
 			else {
 				//reasonStr = formatString("%s: wrong image", getName());
-				setObjectState("TBBMonitor: wrong image", itsTBBs[tbb]->getFullScope(), RTDB_OBJ_STATE_BROKEN);
+				setObjectState("TBBMonitor: unknown versions", itsTBBs[tbb]->getFullScope(), RTDB_OBJ_STATE_BROKEN);
 			}
 		}
 
@@ -488,7 +488,7 @@ GCFEvent::TResult TBBMonitor::askVersion(GCFEvent& event, GCFPortInterface& port
 	default:
 		LOG_DEBUG_STR ("askVersion, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -503,7 +503,7 @@ GCFEvent::TResult TBBMonitor::askSizeInfo(GCFEvent& event, GCFPortInterface& por
 	LOG_DEBUG_STR ("askSizeInfo:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -560,7 +560,7 @@ GCFEvent::TResult TBBMonitor::askSizeInfo(GCFEvent& event, GCFPortInterface& por
 	default:
 		LOG_DEBUG_STR ("askSizeInfo, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -577,7 +577,7 @@ GCFEvent::TResult TBBMonitor::askFlashInfo(GCFEvent& event, GCFPortInterface& po
 	LOG_DEBUG_STR ("askFlashInfo:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -600,7 +600,7 @@ GCFEvent::TResult TBBMonitor::askFlashInfo(GCFEvent& event, GCFPortInterface& po
 		nrOfRequests--;
 		// move the information to the database.
 		LOG_DEBUG_STR("ack.status_mask=" << ack.status_mask << ", board = " << ack.board);
-		
+
 		if (ack.status_mask == TBB_SUCCESS) {
 			vector<GCFPValue*>		imageVersions;
 			vector<GCFPValue*>		writeDates;
@@ -653,7 +653,7 @@ LOG_DEBUG(formatString("%d:%d:%d:%16.16s", image, ack.image_version[image], ack.
 	default:
 		LOG_DEBUG_STR ("askFlashInfo, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -669,7 +669,7 @@ GCFEvent::TResult TBBMonitor::askTBBinfo(GCFEvent& event, GCFPortInterface& port
 	LOG_DEBUG_STR ("askTBBinfo:" << eventName(event) << "@" << port.getName());
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 
 	case F_ENTRY: {
@@ -704,7 +704,7 @@ GCFEvent::TResult TBBMonitor::askTBBinfo(GCFEvent& event, GCFPortInterface& port
 				// flush to database
 				itsTBBs[tbb]->flush();
 			}
-			
+
 		} // for all boards
 
 		LOG_DEBUG_STR ("TBboard information updated, going to RCU information");
@@ -734,7 +734,7 @@ GCFEvent::TResult TBBMonitor::askTBBinfo(GCFEvent& event, GCFPortInterface& port
 	default:
 		LOG_DEBUG_STR ("askTBBinfo, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -743,7 +743,7 @@ GCFEvent::TResult TBBMonitor::askTBBinfo(GCFEvent& event, GCFPortInterface& port
 //
 // askRCUinfo(event, port)
 //
-// Normal operation state. 
+// Normal operation state.
 //
 GCFEvent::TResult TBBMonitor::askRCUinfo(GCFEvent& event, GCFPortInterface& port)
 {
@@ -908,14 +908,14 @@ GCFEvent::TResult TBBMonitor::askRCUSettings(GCFEvent& event, GCFPortInterface&
 //
 // Take subscription on clock modifications
 //
-GCFEvent::TResult TBBMonitor::waitForNextCycle(GCFEvent& event, 
+GCFEvent::TResult TBBMonitor::waitForNextCycle(GCFEvent& event,
 													GCFPortInterface& port)
 {
 	if (eventName(event) != "DP_SET") {
 		LOG_DEBUG_STR ("waitForNextCycle:" << eventName(event) << "@" << port.getName());	}
 
 	GCFEvent::TResult status = GCFEvent::HANDLED;
-  
+
 	switch (event.signal) {
 	case F_ENTRY: {
 		itsOwnPropertySet->setValue(PN_FSM_CURRENT_ACTION,GCFPVString("TBB:wait for next cycle"));
@@ -925,7 +925,7 @@ GCFEvent::TResult TBBMonitor::waitForNextCycle(GCFEvent& event,
 		}
 		itsTimerPort->cancelAllTimers();
 		itsTimerPort->setTimer(double(waitTime));
-		LOG_INFO_STR("Waiting " << waitTime << " seconds for next cycle");
+		LOG_INFO_STR("TBB:Waiting " << waitTime << " seconds for next cycle");
 	}
 	break;
 
@@ -948,7 +948,7 @@ GCFEvent::TResult TBBMonitor::waitForNextCycle(GCFEvent& event,
 	default:
 		LOG_DEBUG_STR ("waitForNextCycle, DEFAULT");
 		break;
-	}    
+	}
 
 	return (status);
 }
@@ -989,7 +989,7 @@ GCFEvent::TResult TBBMonitor::finish_state(GCFEvent& event, GCFPortInterface& po
 //		itsOwnPropertySet->setValue(PN_FSM_ERROR,GCFPVString(""));
 		break;
 	}
-  
+
 	case DP_SET:
 		break;
 
@@ -997,14 +997,14 @@ GCFEvent::TResult TBBMonitor::finish_state(GCFEvent& event, GCFPortInterface& po
 		LOG_DEBUG("finishing_state, DEFAULT");
 		status = GCFEvent::NOT_HANDLED;
 		break;
-	}    
+	}
 	return (status);
 }
 
 //
 // TBBRCUstate(char)
 //
-string	TBBMonitor::TBBRCUstate(char	stateCode) 
+string	TBBMonitor::TBBRCUstate(char	stateCode)
 {
 	switch (stateCode) {
 	case 'A':	return ("Allocated");
-- 
GitLab