Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

DC_PUSDefineDataReporting.cpp

00001 // 00002 // Copyright 2004 P&P Software GmbH - All Rights Reserved 00003 // 00004 // DC_PUSDefineDataReporting.cpp 00005 // 00006 // Version 1.0 00007 // Date 4.01.04 00008 // Author A. Pasetti (P&P Software) 00009 00010 #include "../GeneralInclude/CompilerSwitches.h" 00011 #include "../GeneralInclude/DebugSupport.h" 00012 #include "../GeneralInclude/ClassId.h" 00013 #include "../GeneralInclude/Constants.h" 00014 #include "DC_PUSDefineDataReporting.h" 00015 #include "../Telemetry/CC_TelemetryPacketFactory.h" 00016 #include "../Telemetry/DC_PUSTelemetryModeManager.h" 00017 #include "../Data/DataPool.h" 00018 00019 DC_PUSDefineDataReporting::DC_PUSDefineDataReporting(void) { 00020 setClassId(ID_PUSDEFINEDATAREPORTING); 00021 setType(PUS_TYPE_DATA_REP); 00022 00023 data = pNULL; 00024 maxNumberData = 0; 00025 numberData = 0; 00026 } 00027 00028 TD_ActionOutcome DC_PUSDefineDataReporting::doAction(void) { 00029 assert( (getSubType()==PUS_ST_DATA_REP_NEW_HK) || 00030 (getSubType()==PUS_ST_DATA_REP_NEW_DG) ); 00031 assert( isObjectConfigured() ); 00032 00033 CC_TelemetryPacketFactory* pFct = CC_TelemetryPacketFactory::getInstance(); 00034 00035 // Retrieve the number of parameters that are sampled only once per cycle 00036 unsigned short pos = sizeof(TD_SID)+sizeof(TD_PUSCollectionInterval); 00037 TD_PUSNumberOfParameters NPAR1 = *(TD_PUSNumberOfParameters*)(data+pos); 00038 pos += sizeof(TD_PUSNumberOfParameters); // position of first parameter 00039 00040 00041 // Define variable to hold the length of the packet value buffer 00042 unsigned short val = 0; 00043 00044 // Process the parameters that are sampled once per interval 00045 TD_DataPoolId id; 00046 while ( pos<NPAR1*sizeof(TD_PUSNumberOfParameters) ) { 00047 id = *(TD_PUSNumberOfParameters*)(data+pos); 00048 if (getDataPool()->isFloat(id) ) 00049 val += sizeof(TD_Float); 00050 else 00051 val += sizeof(TD_Integer); 00052 } 00053 00054 // Retrieve the number of fixed-length arrays 00055 pos += NPAR1*sizeof(TD_DataPoolId); 00056 TD_PUSNumberOfParameters NFA = *(TD_PUSNumberOfParameters*)(data+pos); 00057 pos += sizeof(TD_PUSNumberOfParameters); 00058 00059 // Process the fixed-length arrays 00060 TD_PUSNumberOfParameters NPAR = 0; 00061 for (unsigned int i=0; i<NFA; i++) { 00062 pos += sizeof(unsigned short); 00063 NPAR = *(TD_PUSNumberOfParameters*)(data+pos); 00064 pos += sizeof(TD_PUSNumberOfParameters); 00065 00066 // Process the i-th fixed-length array 00067 for (unsigned int i=0; i<NPAR; i++) { 00068 id = *(TD_PUSNumberOfParameters*)(data+pos); 00069 if (getDataPool()->isFloat(id) ) 00070 val += sizeof(TD_Float); 00071 else 00072 val += sizeof(TD_Integer); 00073 } 00074 } 00075 00076 // Retrieve the telemetry packet from the dynamic factory 00077 DC_PUSDataReportingPacket* pPck = pFct->allocatePUSDataReportingPacket(numberData,val,NFA); 00078 if ( pPck==pNULL ) 00079 return PACKET_NOT_FOUND; 00080 00081 // Check consistency: the value of pos must be the same as the total number of application data 00082 if ( pos!=numberData ) 00083 return APP_DATA_INCONSISTENT; 00084 00085 // Load the application data in the telemetry packet 00086 for (unsigned int i=0; i<numberData; i++) 00087 pPck->setDefinitionBuffer(i,data[i]); 00088 00089 // Load the telemetry packet in the telemetry mode manager 00090 if ( pTmModeManager->isFull() ) { 00091 pPck->setInUse(NOT_IN_USE); 00092 return PUS_MODE_MAN_FULL; 00093 } else 00094 pTmModeManager->loadPacket(pPck); 00095 00096 return ACTION_SUCCESS; 00097 } 00098 00099 void DC_PUSDefineDataReporting::setNumberOfRawData(unsigned int max) { 00100 assert( max>0 ); 00101 assert( data==pNULL ); 00102 00103 maxNumberData = max; 00104 data = new unsigned char[maxNumberData]; 00105 for (unsigned int i=0; i<maxNumberData; i++) 00106 data[i] = 0; 00107 } 00108 00109 unsigned int DC_PUSDefineDataReporting::getNumberOfRawData() { 00110 return maxNumberData; 00111 } 00112 00113 void DC_PUSDefineDataReporting::setRawData(unsigned char* d, unsigned int n) { 00114 assert( data!=pNULL ); 00115 00116 if ( n>maxNumberData ) { 00117 setValidityCheckCode(VC_TOO_MANY_RAW_DATA); 00118 return; 00119 } 00120 00121 numberData = n; 00122 for (unsigned int i=0; i<numberData; i++) 00123 data[i] = d[i]; 00124 00125 setValidityCheckCode(0); 00126 return; 00127 } 00128 00129 unsigned int DC_PUSDefineDataReporting::getNumberOfApplicationData(void) const { 00130 return numberData; 00131 } 00132 00133 void DC_PUSDefineDataReporting::setPUSTelemetryModeManager(DC_PUSTelemetryModeManager* pTmModeManager) { 00134 assert( pTmModeManager!=pNULL ); 00135 this->pTmModeManager = pTmModeManager; 00136 } 00137 00138 00139 DC_PUSTelemetryModeManager* DC_PUSDefineDataReporting::getPUSTelemetryModeManager() const { 00140 return pTmModeManager; 00141 } 00142 00143 bool DC_PUSDefineDataReporting::isObjectConfigured(void) { 00144 return (PUSTelecommand::isObjectConfigured() && data!=pNULL && 00145 pTmModeManager!=pNULL); 00146 }
Copyright 2003 P&P Software GmbH - All Rights Reserved