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

DC_PUSMemoryLoadOffset.cpp

00001 // 00002 // Copyright 2004 P&P Software GmbH - All Rights Reserved 00003 // 00004 // DC_PUSMemoryLoadOffset.cpp 00005 // 00006 // Version 1.0 00007 // Date 4.12.03 00008 // Author A. Pasetti (P&P Software) 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 }
Copyright 2003 P&P Software GmbH - All Rights Reserved