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

DC_PUSMemoryDumpOffset.cpp

00001 // 00002 // Copyright 2004 P&P Software GmbH - All Rights Reserved 00003 // 00004 // DC_PUSMemoryDumpOffset.cpp 00005 // 00006 // Version 1.0 00007 // Date 04.04.03 00008 // Author A. Pasetti (P&P Software) 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 // compute the number of bytes in the packet. Compute first the size of the 00043 // fixed part of the packet and then the size of each block. 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 }
Copyright 2003 P&P Software GmbH - All Rights Reserved