00001
00002
00003
00004
00005
00006
00007
00008
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
00151
if ( !
TelecommandLoader::isObjectConfigured() ||
00152 (tcArea==pNULL) ||
00153 (maxTcDataPacketLength==0) ||
00154 (maxNumberOfTc==0) )
00155
return NOT_CONFIGURED;
00156
00157
return CONFIGURED;
00158 }