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 "DC_PUSMemoryLoadAbsolute.h"
00015
00016
#include <string.h>
00017
00018 DC_PUSMemoryLoadAbsolute::DC_PUSMemoryLoadAbsolute(
void) {
00019 setClassId(ID_PUSMEMORYLOADABSOLUTE);
00020 setSubType(
PUS_ST_TC_MEM_ABS);
00021 memId = 0;
00022 }
00023
00024 void DC_PUSMemoryLoadAbsolute::setRawData(
unsigned char* d,
unsigned int n) {
00025 assert( d!=pNULL );
00026 assert( n>0 );
00027 assert(
isObjectConfigured() );
00028
00029 assert(
sizeof(
TD_PUSMemData)==1 );
00030
00031 setValidityCheckCode(0);
00032
00033
if ( n<=(
sizeof(
TD_PUSMemId)+
sizeof(
TD_PUSNumberMemBlocks)) ) {
00034 setValidityCheckCode(
VC_INCONSISTENT_RAW_DATA);
00035
return;
00036 }
00037
00038
TD_PUSMemLength length;
00039
unsigned int counter;
00040
unsigned int dataCounter;
00041
00042 memcpy(&memId,d,
sizeof(
TD_PUSMemId));
00043 memcpy(&numberBlocks,d+
sizeof(
TD_PUSMemId),
sizeof(
TD_PUSNumberMemBlocks));
00044
00045
if (numberBlocks>maxNumberBlocks) {
00046 setValidityCheckCode(
VC_TOO_MANY_MEM_BLOCK);
00047
return;
00048 }
00049
00050 counter =
sizeof(
TD_PUSMemId)+
sizeof(
TD_PUSNumberMemBlocks);
00051 dataCounter = 0;
00052
for (
unsigned int i=0; i<numberBlocks; i++) {
00053 memcpy(&block[i].startAddress,d+counter,
sizeof(
TD_PUSMemData*));
00054 memcpy(&block[i].length,d+counter+
sizeof(
TD_PUSMemData*),
sizeof(
TD_PUSMemLength));
00055 length = block[i].length;
00056
if (dataCounter+length>=maxNumberData) {
00057 setValidityCheckCode(
VC_TOO_MANY_MEM_DATA);
00058
return;
00059 }
00060
for (
unsigned int j=0; j<length; j++)
00061 data[dataCounter+j] = *(
TD_PUSMemData*)(d+counter+
sizeof(
TD_PUSMemData*)+
00062
sizeof(
TD_PUSMemLength)+j*
sizeof(
TD_PUSMemData));
00063 memcpy(&block[i].checksum,d+counter+
sizeof(
TD_PUSMemData*)+
00064
sizeof(
TD_PUSMemLength)+length*
sizeof(
TD_PUSMemData),
sizeof(
unsigned short));
00065 counter = counter+
sizeof(
TD_PUSMemData*)+
sizeof(
TD_PUSMemLength)+
sizeof(
TD_PUSMemData)*length+2;
00066 dataCounter = dataCounter+length;
00067 }
00068
00069
if (counter!=n) {
00070 setValidityCheckCode(
VC_INCONSISTENT_RAW_DATA);
00071
return;
00072 }
00073 }
00074
00075 TD_PUSMemId DC_PUSMemoryLoadAbsolute::getMemoryBlockId()
const {
00076
return memId;
00077 }