00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include "../GeneralInclude/CompilerSwitches.h"
00011
#include "../GeneralInclude/TestConstants.h"
00012
#include "../GeneralInclude/ClassId.h"
00013
#include "../GeneralInclude/Constants.h"
00014
#include "../Base/CC_RootObject.h"
00015
#include "../Utilities/Checksum.h"
00016
#include "../Telecommand/PUSTelecommand.h"
00017
#include "../Telemetry/PUSTelemetryPacket.h"
00018
#include "../Telemetry/DC_PUSMemoryDumpOffset.h"
00019
00020
#include <string.h>
00021
00022 DC_PUSMemoryDumpOffset::DC_PUSMemoryDumpOffset(
void) {
00023 setClassId(ID_PUSMEMORYDUMPOFFSET);
00024 setSubType(
PUS_ST_TM_DMP_OFF);
00025 base = pNULL;
00026 }
00027
00028 void DC_PUSMemoryDumpOffset::setBaseAddress(TD_PUSMemData* base) {
00029 assert( base!=0 );
00030 this->base = base;
00031 }
00032
00033 TD_PUSMemData*
DC_PUSMemoryDumpOffset::getBaseAddress() {
00034
return base;
00035 }
00036
00037 void DC_PUSMemoryDumpOffset::update(
void) {
00038 assert( base!=pNULL );
00039 assert( memId!=0 );
00040 assert(
isObjectConfigured() );
00041
00042
00043
00044
unsigned int fixedLength =
sizeof(
TD_PUSMemId)+
sizeof(
TD_PUSMemData*)+
sizeof(
TD_PUSNumberMemBlocks);
00045
unsigned int blockLength = 0;
00046
00047
for (
TD_PUSNumberMemBlocks i=0; i<numberBlocks; i++) {
00048 blockLength = blockLength +
sizeof(
TD_PUSMemOffset)+
sizeof(
TD_PUSMemLength)+
sizeof(
unsigned short);
00049 blockLength = blockLength + block[i].length*
sizeof(
TD_PUSMemData);
00050 }
00051
00052 tmPacketSize = blockLength+fixedLength;
00053
if (tmPacketSize>maxNumberData) {
00054
getEventRepository()->
create(
this,EVT_PUS_TOO_MANY_MEM_DATA);
00055
return;
00056 }
00057
00058
unsigned int offset = 0;
00059 memcpy(data+offset,&memId,
sizeof(
TD_PUSMemId));
00060 offset = offset +
sizeof(
TD_PUSMemId);
00061 memcpy(data+offset,&base,
sizeof(
TD_PUSMemData*));
00062 offset = offset +
sizeof(
TD_PUSMemData*);
00063 memcpy(data+offset,&numberBlocks,
sizeof(
TD_PUSNumberMemBlocks));
00064 offset = offset +
sizeof(
TD_PUSNumberMemBlocks);
00065
00066 assert( numberBlocks<maxNumberBlocks );
00067
00068
for (
TD_PUSNumberMemBlocks i=0; i<numberBlocks; i++) {
00069
TD_PUSMemOffset moTemp = (
TD_PUSMemOffset)(block[i].startAddress-base);
00070 memcpy(data+offset,&moTemp,
sizeof(
TD_PUSMemOffset));
00071 offset = offset +
sizeof(
TD_PUSMemOffset);
00072 memcpy(data+offset,&block[i].length,
sizeof(
TD_PUSMemLength));
00073 offset = offset +
sizeof(
TD_PUSMemLength);
00074
00075
unsigned char* start = (
unsigned char*)(block[i].startAddress);
00076
unsigned int nBytes = (block[i].length)*
sizeof(
TD_PUSMemData);
00077 memcpy(data+offset,start,nBytes);
00078 offset = offset + nBytes;
00079
00080
unsigned short checksum;
00081
if (
isChecksumFlagSet() )
00082 checksum = doChecksum(start,nBytes);
00083
else
00084 checksum = 0;
00085 memcpy(data+offset,&checksum,
sizeof(
unsigned short));
00086 offset = offset+
sizeof(
unsigned short);
00087 }
00088 }