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

DC_BasicPUSTcLoader.cpp

00001 // 00002 // Copyright 2004 P&P Software GmbH - All Rights Reserved 00003 // 00004 // DC_BasicPUSTcLoader.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/Constants.h" 00013 #include "../GeneralInclude/ClassId.h" 00014 #include "../Event/DC_EventRepository.h" 00015 #include "CC_TelecommandFactory.h" 00016 #include "CC_TelecommandManager.h" 00017 #include "DC_BasicPUSTcLoader.h" 00018 #include "DC_PUSControlDataReporting.h" 00019 #include "DC_PUSDefineDataReporting.h" 00020 00021 #include <string.h> 00022 00023 DC_BasicPUSTcLoader::DC_BasicPUSTcLoader(void) { 00024 setClassId(ID_BASICPUSTCLOADER); 00025 tcArea = pNULL; 00026 maxTcDataPacketLength = 0; 00027 maxNumberOfTc = 0; 00028 } 00029 00030 void DC_BasicPUSTcLoader::activate(void) { 00031 assert( tcArea!=pNULL ); 00032 assert( maxTcDataPacketLength>0 ); 00033 assert( maxNumberOfTc>0 ); 00034 00035 CC_TelecommandFactory* pFct = CC_TelecommandFactory::getInstance(); 00036 00037 unsigned char* startTcPacket = tcArea+1; 00038 unsigned char numberOfTc = *(unsigned char*)tcArea; 00039 if (numberOfTc>maxNumberOfTc) { 00040 getEventRepository()->create(this,EVT_TOO_MANY_TC_PCKT); 00041 return; 00042 } 00043 00044 for (unsigned char j=0; j<numberOfTc; j++) { 00045 00046 assert(sizeof(TD_TelecommandType)==1); 00047 assert(sizeof(TD_TelecommandSubType)==1); 00048 00049 unsigned short tcPacketID; 00050 unsigned short tcPacketSeqControl; 00051 unsigned short tcDataPacketLength; 00052 TD_TelecommandSource tcSource; 00053 00054 memcpy(&tcPacketID,startTcPacket,2); 00055 memcpy(&tcPacketSeqControl,startTcPacket+2,2); 00056 memcpy(&tcDataPacketLength,startTcPacket+4,2); 00057 unsigned char tcAcknowledge = *(startTcPacket+6); 00058 TD_TelecommandType tcType = *(TD_TelecommandType*)(startTcPacket+7); 00059 TD_TelecommandSubType tcSubType = *(TD_TelecommandType*)(startTcPacket+8); 00060 memcpy(&tcSource,startTcPacket+9,sizeof(TD_TelecommandSource)); 00061 00062 unsigned short appDataLength = tcDataPacketLength-5-sizeof(TD_TelecommandSource); 00063 unsigned char* applicationDataStart = (startTcPacket+9+sizeof(TD_TelecommandSource)); 00064 bool fastRawDataLoad = false; 00065 00066 if (tcPacketID!=PUSTelecommand::getPacketId()) { 00067 startTcPacket = startTcPacket + tcDataPacketLength + 6; 00068 continue; 00069 } 00070 00071 if (tcDataPacketLength>maxTcDataPacketLength) { 00072 getEventRepository()->create(this,EVT_TC_TOO_LONG); 00073 return; 00074 } 00075 00076 PUSTelecommand* pTC = pNULL; 00077 00078 if ( (tcType==PUS_TYPE_DATA_REP) && 00079 ((tcSubType==PUS_ST_DATA_REP_NEW_HK)||(tcSubType==PUS_ST_DATA_REP_NEW_HK)) ) { 00080 pTC = pFct->allocatePUSDefineDataReporting(appDataLength); 00081 } else if ( (tcType==PUS_TYPE_DATA_REP) && 00082 ((tcSubType==PUS_ST_DATA_REP_ENB_HK)||(tcSubType==PUS_ST_DATA_REP_ENB_DG)|| 00083 (tcSubType==PUS_ST_DATA_REP_DIS_HK)||(tcSubType==PUS_ST_DATA_REP_DIS_HK)) ){ 00084 unsigned char nsid = applicationDataStart[0]; 00085 pTC = pFct->allocatePUSControlDataReporting(nsid); 00086 fastRawDataLoad = true; 00087 } else if ( tcType==PUS_TYPE_TEST ){ 00088 pTC = pFct->allocateTestPUSTelecommand(); 00089 } else { 00090 getEventRepository()->create(this,EVT_UNKNOWN_TC_TYPE); 00091 startTcPacket = startTcPacket + tcDataPacketLength + 6; 00092 continue; 00093 } 00094 00095 if ( pTC==pNULL) { 00096 getEventRepository()->create(this,EVT_NO_TC_AVAIL); 00097 startTcPacket = startTcPacket + tcDataPacketLength + 6; 00098 continue; 00099 } 00100 00101 pTC->setTelecommandId(tcPacketSeqControl); 00102 pTC->setType(tcType); 00103 pTC->setSubType(tcSubType); 00104 pTC->setSource(tcSource); 00105 pTC->setAcknowledgeLevel(tcAcknowledge); 00106 00107 if (fastRawDataLoad) 00108 pTC->setRawData(applicationDataStart,appDataLength); 00109 else 00110 for (unsigned int i=0; i<appDataLength; i++) 00111 pTC->setRawData(i,*(applicationDataStart+i)); 00112 00113 getTelecommandManager()->load(pTC); 00114 startTcPacket = startTcPacket + tcDataPacketLength + 6; 00115 } 00116 } 00117 00118 void DC_BasicPUSTcLoader::release(Telecommand* pTc) { 00119 assert( tcArea!=pNULL ); 00120 assert( maxTcDataPacketLength>0 ); 00121 assert( maxNumberOfTc>0 ); 00122 assert( pTc!=pNULL ); 00123 pTc->setInUse(NOT_IN_USE); 00124 } 00125 00126 void DC_BasicPUSTcLoader::setTcLoadAreaStart(unsigned char* startAddress) { 00127 assert( startAddress!=pNULL ); 00128 tcArea = startAddress; 00129 } 00130 00131 void DC_BasicPUSTcLoader::setMaxTcLength(unsigned int maxTcLength) { 00132 assert( maxTcLength>6); 00133 maxTcDataPacketLength = maxTcLength-6; 00134 } 00135 00136 unsigned int DC_BasicPUSTcLoader::getMaxTcLength(void) const { 00137 return (maxTcDataPacketLength+6); 00138 } 00139 00140 void DC_BasicPUSTcLoader::setMaxNumberOfTc(unsigned int max) { 00141 assert( max>0); 00142 maxNumberOfTc = max; 00143 } 00144 00145 unsigned int DC_BasicPUSTcLoader::getMaxNumberOfTc(void) const { 00146 return maxNumberOfTc; 00147 } 00148 00149 bool DC_BasicPUSTcLoader::isObjectConfigured(void) { 00150 // Check configuration of super object 00151 if ( !TelecommandLoader::isObjectConfigured() || 00152 (tcArea==pNULL) || 00153 (maxTcDataPacketLength==0) || 00154 (maxNumberOfTc==0) ) 00155 return NOT_CONFIGURED; 00156 00157 return CONFIGURED; 00158 }
Copyright 2003 P&P Software GmbH - All Rights Reserved