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_PUSMemoryLoadOffset.h"
00015
00016
#include <string.h>
00017
00018 DC_PUSMemoryLoadOffset::DC_PUSMemoryLoadOffset(
void) {
00019 setClassId(ID_PUSMEMORYLOADOFFSET);
00020 setSubType(
PUS_ST_TC_MEM_OFF);
00021 memId = 0;
00022 }
00023
00024 void DC_PUSMemoryLoadOffset::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_PUSMemData*)+
sizeof(
TD_PUSNumberMemBlocks)) ) {
00034 setValidityCheckCode(
VC_INCONSISTENT_RAW_DATA);
00035
return;
00036 }
00037
00038
TD_PUSMemData* base;
00039
TD_PUSMemOffset offset;
00040
TD_PUSMemLength length;
00041
unsigned int counter;
00042
unsigned int dataCounter;
00043
00044 memcpy(&memId,d,
sizeof(
TD_PUSMemId));
00045 memcpy(&base,d+
sizeof(
TD_PUSMemId),
sizeof(
TD_PUSMemData*));
00046 memcpy(&numberBlocks,d+
sizeof(
TD_PUSMemId)+
sizeof(
TD_PUSMemData*),
sizeof(
TD_PUSNumberMemBlocks));
00047
00048
if (numberBlocks>maxNumberBlocks) {
00049 setValidityCheckCode(
VC_TOO_MANY_MEM_BLOCK);
00050
return;
00051 }
00052
00053 counter =
sizeof(
TD_PUSMemId)+
sizeof(
TD_PUSMemData*)+
sizeof(
TD_PUSNumberMemBlocks);
00054 dataCounter = 0;
00055
for (
unsigned int i=0; i<numberBlocks; i++) {
00056 memcpy(&offset,d+counter,
sizeof(
TD_PUSMemOffset));
00057 block[i].startAddress = base+offset;
00058 memcpy(&length,d+counter+
sizeof(
TD_PUSMemOffset),
sizeof(
TD_PUSMemLength));
00059 block[i].length = length;
00060
if (dataCounter+length>=maxNumberData) {
00061 setValidityCheckCode(
VC_TOO_MANY_MEM_DATA);
00062
return;
00063 }
00064
for (
unsigned int j=0; j<length; j++)
00065 data[dataCounter+j] = *(
TD_PUSMemData*)(d+counter+
sizeof(
TD_PUSMemOffset)+
00066
sizeof(
TD_PUSMemLength)+j*
sizeof(
TD_PUSMemData));
00067 memcpy(&block[i].checksum,d+counter+
sizeof(
TD_PUSMemOffset)+
00068
sizeof(
TD_PUSMemLength)+length*
sizeof(
TD_PUSMemData),
sizeof(
unsigned short));
00069 counter = counter+
sizeof(
TD_PUSMemOffset)+
sizeof(
TD_PUSMemLength)+
00070
sizeof(
TD_PUSMemData)*length+2;
00071 dataCounter = dataCounter+length;
00072 }
00073
00074
if (counter!=n) {
00075 setValidityCheckCode(
VC_INCONSISTENT_RAW_DATA);
00076
return;
00077 }
00078
00079
00080 }
00081
00082 TD_PUSMemId DC_PUSMemoryLoadOffset::getMemoryBlockId()
const {
00083
return memId;
00084 }