diff --git a/MAC/APL/PIC/_RegisterAccess/src/ARAPropertyDefines.h b/MAC/APL/PIC/_RegisterAccess/src/ARAPropertyDefines.h index 99d2c9ecc10c0fcc9aee46ed82c9d4ddce350a3d..5464276b7db4dcff955abbb1507d3d30d139095e 100644 --- a/MAC/APL/PIC/_RegisterAccess/src/ARAPropertyDefines.h +++ b/MAC/APL/PIC/_RegisterAccess/src/ARAPropertyDefines.h @@ -178,6 +178,7 @@ const GCF::Common::TPSCategory PSCAT_LCU_PIC_Command = GCF::Common::PS_CAT #define PROPNAME_SYNCCOUNT "syncCount" #define PROPNAME_ERRORCOUNT "errorCount" #define PROPNAME_NOFOVERFLOW "nofOverflow" +#define PROPNAME_FUNCTIONALITY "functionality" const string commandGetID("getID"); const string commandTestRegisterReadWrite("testRegisterReadWrite"); @@ -228,6 +229,7 @@ typedef enum PROPERTYCONFIG_BEGIN(PROPS_Station) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_ITEM(PROPNAME_STATISTICSSUBBANDPOWER, GCF_READABLE_PROP, "") PROPERTYCONFIG_ITEM(PROPNAME_STATISTICSBEAMLETPOWER, GCF_READABLE_PROP, "") PROPERTYCONFIG_ITEM(PROPNAME_XCSTATISTICS, GCF_READABLE_PROP, "") @@ -237,14 +239,17 @@ PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_Rack) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READWRITE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_SubRack) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_Board) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_ITEM(PROPNAME_VOLTAGE15, GCF_READABLE_PROP, "0") PROPERTYCONFIG_ITEM(PROPNAME_VOLTAGE33, GCF_READABLE_PROP, "0") PROPERTYCONFIG_ITEM(PROPNAME_FFI0, GCF_READABLE_PROP, "0") @@ -254,6 +259,7 @@ PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_Ethernet) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_ITEM(PROPNAME_FRAMESRECEIVED, GCF_READABLE_PROP, "0") PROPERTYCONFIG_ITEM(PROPNAME_FRAMESERROR, GCF_READABLE_PROP, "0") PROPERTYCONFIG_ITEM(PROPNAME_LASTERROR, GCF_READABLE_PROP, "0") @@ -264,12 +270,14 @@ PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_FPGA) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_ITEM(PROPNAME_TEMPERATURE, GCF_READABLE_PROP, "0.0") PROPERTYCONFIG_ITEM(PROPNAME_VERSION, GCF_READABLE_PROP, "") PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_RCU) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_ITEM(PROPNAME_VDDVCCEN, GCF_READWRITE_PROP, "false") PROPERTYCONFIG_ITEM(PROPNAME_VHENABLE, GCF_READWRITE_PROP, "false") PROPERTYCONFIG_ITEM(PROPNAME_VLENABLE, GCF_READWRITE_PROP, "false") @@ -289,10 +297,12 @@ PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_LFA) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_HFA) PROPERTYCONFIG_ITEM(PROPNAME_STATUS, GCF_READABLE_PROP, "0") +PROPERTYCONFIG_ITEM(PROPNAME_FUNCTIONALITY, GCF_READABLE_PROP, "true") PROPERTYCONFIG_END PROPERTYCONFIG_BEGIN(PROPS_ADCStatistics) diff --git a/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.cc b/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.cc index 2aa88c1de54c5e3bdcef36ffc3b6122beb2dfe97..4baf750cf05c378bff23fe2a9b4a717d7a28813c 100644 --- a/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.cc +++ b/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.cc @@ -48,6 +48,7 @@ #include <GCF/GCF_PVDouble.h> #include <GCF/GCF_PVString.h> #include <GCF/GCF_PVDynArr.h> +#include <APLCommon/APL_Defines.h> #include "ARAPropertyDefines.h" #include "ARAPhysicalModel.h" @@ -384,17 +385,36 @@ GCFEvent::TResult RegisterAccessTask::APCsLoaded(GCFEvent& e, GCFPortInterface& break; } - case F_VCHANGEMSG: + case F_VGETRESP: { - // check which property changed - GCFPropValueEvent* pPropAnswer = static_cast<GCFPropValueEvent*>(&e); - assert(pPropAnswer); - - if(strstr(pPropAnswer->pPropName,"Maintenance") != 0) + GCFPropValueEvent* pPropAnswer=static_cast<GCFPropValueEvent*>(&e); + + if(strstr(pPropAnswer->pPropName,"Maintenance.status") != 0) { handleMaintenance(string(pPropAnswer->pPropName),*pPropAnswer->pValue); } + else if(strstr(pPropAnswer->pPropName, "status") != 0) + { + LOG_DEBUG("status property changed"); + + _refreshFunctionality(); + } + break; + } + case F_VCHANGEMSG: + { + GCFPropValueEvent* pPropAnswer=static_cast<GCFPropValueEvent*>(&e); + if(strstr(pPropAnswer->pPropName,"Maintenance.status") != 0) + { + handleMaintenance(string(pPropAnswer->pPropName),*pPropAnswer->pValue); + } + else if(strstr(pPropAnswer->pPropName, "status") != 0) + { + LOG_DEBUG("status property changed"); + + _refreshFunctionality(); + } break; } @@ -1380,19 +1400,6 @@ void RegisterAccessTask::updateRCUproperties(string scope,uint8 status, double t { it->second->setValueTimed(string(PROPNAME_LBAENABLE),pvBoolLBAEnable, timestamp); } - - if(!pvBoolVddVccEn.getValue() || - (!pvBoolVhEnable.getValue() && !pvBoolVlEnable.getValue()) || - (!pvBoolHBAEnable.getValue() && !pvBoolLBAEnable.getValue())) - { - GCFPVInteger pvStatus(STATUS_ERROR); - it->second->setValueTimed(string(PROPNAME_STATUS),pvStatus, timestamp); - } - else - { - GCFPVInteger pvStatus(STATUS_OK); - it->second->setValueTimed(string(PROPNAME_STATUS),pvStatus, timestamp); - } } } @@ -2319,6 +2326,252 @@ void RegisterAccessTask::_writeXcStatistics(TXcStatistics& statistics, uint32 st } } +void RegisterAccessTask::_refreshFunctionality() +{ + int rack, subrack, board, ap, rcu; + char scopeString[300]; + + int racksDefect(0); + for(rack=0;rack<m_n_racks;rack++) + { + int subracksDefect(0); + for(subrack=0;subrack<m_n_subracks_per_rack;subrack++) + { + int boardsDefect(0); + for(board=0;board<m_n_boards_per_subrack;board++) + { + int apsDefect(0); + int ethDefect(0); + int bpDefect(0); + for(ap=0;ap<m_n_aps_per_board;ap++) + { + int rcusDefect(0); + for(rcu=0;rcu<m_n_rcus_per_ap;rcu++) + { + int lfasDefect(0); + int hfasDefect(0); + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN_RCUN_LFA,rack,subrack,board,ap,rcu); + lfasDefect+=_isDefect(scopeString); + _setFunctionality(scopeString, (lfasDefect == 0)); + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN_RCUN_HFA,rack,subrack,board,ap,rcu); + hfasDefect+=_isDefect(scopeString); + _setFunctionality(scopeString, (hfasDefect == 0)); + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN_RCUN,rack,subrack,board,ap,rcu); + int isDefect = _isDefect(scopeString); + + if(isDefect==1 || (lfasDefect>0&&hfasDefect>0)) + { + rcusDefect++; + _setFunctionalityRCU(rack,subrack,board,ap,rcu, false); + } + else + { + _setFunctionality(scopeString, true); + } + } + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN,rack,subrack,board,ap); + int isDefect = _isDefect(scopeString); + + if(isDefect==1 || rcusDefect >= m_n_rcus_per_ap) + { + apsDefect++; + _setFunctionalityAP(rack,subrack,board,ap, false); + } + else + { + _setFunctionality(scopeString, true); + } + } + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_BP,rack,subrack,board); + bpDefect+=_isDefect(scopeString); + _setFunctionality(scopeString, (bpDefect == 0)); + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_ETH,rack,subrack,board); + ethDefect+=_isDefect(scopeString); + _setFunctionality(scopeString, (ethDefect == 0)); + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN,rack,subrack,board); + int isDefect = _isDefect(scopeString); + + if(isDefect==1 || bpDefect>0 || ethDefect>0 || apsDefect >= m_n_aps_per_board) + { + boardsDefect++; + _setFunctionalityBoard(rack,subrack,board,false); + } + else + { + _setFunctionality(scopeString, true); + } + } + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN,rack,subrack); + int isDefect = _isDefect(scopeString); + + if(isDefect==1 || boardsDefect >= m_n_boards_per_subrack) + { + subracksDefect++; + _setFunctionalitySubRack(rack,subrack,false); + } + else + { + _setFunctionality(scopeString, true); + } + } + sprintf(scopeString,SCOPE_PIC_RackN,rack); + int isDefect = _isDefect(scopeString); + + if(isDefect==1 || subracksDefect >= m_n_subracks_per_rack) + { + racksDefect++; + _setFunctionalityRack(rack,false); + } + else + { + _setFunctionality(scopeString, true); + } + } + sprintf(scopeString,SCOPE_PIC); + int isDefect = _isDefect(scopeString); + + if(isDefect==1 || racksDefect >= m_n_racks) + { + _setFunctionalityStation(false); + } + else + { + _setFunctionality(scopeString, true); + } +} + +int RegisterAccessTask::_isDefect(char* scopeString) +{ + int isDefect(1); + TMyPropertySetMap::iterator it=m_myPropertySetMap.find(string(scopeString)); + if(it == m_myPropertySetMap.end()) + { + LOG_FATAL(formatString("PropertySet not found: %s",scopeString)); + } + else + { + boost::shared_ptr<GCFPVInteger> pvStatus(static_cast<GCFPVInteger*>(it->second->getValue(PROPNAME_STATUS))); + if(!pvStatus) + { + LOG_FATAL(formatString("PropertySet not found: %s",scopeString)); + } + else + { + if(pvStatus->getValue()==RS_DEFECT) + { + isDefect=1; + } + else + { + isDefect=0; + } + } + } + return isDefect; +} + +void RegisterAccessTask::_setFunctionality(char* scopeString, bool functional) +{ + TMyPropertySetMap::iterator it=m_myPropertySetMap.find(string(scopeString)); + if(it == m_myPropertySetMap.end()) + { + LOG_FATAL(formatString("PropertySet not found: %s",scopeString)); + } + else + { + GCFPVBool pvBool(functional); + it->second->setValue(PROPNAME_FUNCTIONALITY,pvBool); + } +} + +void RegisterAccessTask::_setFunctionalityRCU(int rack,int subrack,int board,int ap,int rcu, bool functional) +{ + char scopeString[300]; + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN_RCUN,rack,subrack,board,ap,rcu); + _setFunctionality(scopeString, functional); + // also set functionality of underlying resources to false + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN_RCUN_LFA,rack,subrack,board,ap,rcu); + _setFunctionality(scopeString, functional); + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN_RCUN_HFA,rack,subrack,board,ap,rcu); + _setFunctionality(scopeString, functional); +} + +void RegisterAccessTask::_setFunctionalityAP(int rack,int subrack,int board,int ap,bool functional) +{ + char scopeString[300]; + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_APN,rack,subrack,board,ap); + _setFunctionality(scopeString, functional); + // also set functionality of underlying resources to false + for(int r=0;r<m_n_rcus_per_ap;r++) + { + _setFunctionalityRCU(rack,subrack,board,ap,r, false); + } +} + +void RegisterAccessTask::_setFunctionalityBoard(int rack,int subrack,int board,bool functional) +{ + char scopeString[300]; + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN,rack,subrack,board); + _setFunctionality(scopeString, functional); + // also set functionality of underlying resources to false + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_ETH,rack,subrack,board); + _setFunctionality(scopeString, functional); + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN_BoardN_BP,rack,subrack,board); + _setFunctionality(scopeString, functional); + for(int a=0;a<m_n_aps_per_board;a++) + { + _setFunctionalityAP(rack,subrack,board,a,false); + } +} + +void RegisterAccessTask::_setFunctionalitySubRack(int rack,int subrack,bool functional) +{ + char scopeString[300]; + + sprintf(scopeString,SCOPE_PIC_RackN_SubRackN,rack,subrack); + _setFunctionality(scopeString, functional); + // also set functionality of underlying resources to false + for(int b=0;b<m_n_boards_per_subrack;b++) + { + _setFunctionalityBoard(rack,subrack,b,false); + } +} + +void RegisterAccessTask::_setFunctionalityRack(int rack,bool functional) +{ + char scopeString[300]; + + sprintf(scopeString,SCOPE_PIC_RackN,rack); + _setFunctionality(scopeString, functional); + // also set functionality of underlying resources to false + for(int s=0;s<m_n_subracks_per_rack;s++) + { + _setFunctionalitySubRack(rack,s,false); + } +} + +void RegisterAccessTask::_setFunctionalityStation(bool functional) +{ + char scopeString[300]; + + sprintf(scopeString,SCOPE_PIC); + _setFunctionality(scopeString, functional); + // also set functionality of underlying resources to false + for(int r=0;r<m_n_racks;r++) + { + _setFunctionalityRack(r,false); + } +} + } // namespace ARA diff --git a/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.h b/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.h index 604b27394879dd29636b731435c271c426ab2b19..61d881c7f8c8176ca4d54e99d1988a501a9a8883 100644 --- a/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.h +++ b/MAC/APL/PIC/_RegisterAccess/src/ARARegisterAccessTask.h @@ -217,6 +217,15 @@ namespace ARA void _writeStatistics(TStatistics& statistics, uint32 statsHandle); void _addXcStatistics(TXcStatistics& statistics, uint32 statsHandle); void _writeXcStatistics(TXcStatistics& statistics, uint32 statsHandle); + void _refreshFunctionality(); + int _isDefect(char* scopeString); + void _setFunctionality(char* scopeString, bool functional); + void _setFunctionalityRCU(int rack,int subrack,int board,int ap,int rcu, bool functional); + void _setFunctionalityAP(int rack,int subrack,int board,int ap,bool functional); + void _setFunctionalityBoard(int rack,int subrack,int board,bool functional); + void _setFunctionalitySubRack(int rack,int subrack,bool functional); + void _setFunctionalityRack(int rack,bool functional); + void _setFunctionalityStation(bool functional); // member variables ARAAnswer m_answer;