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

DC_PUSMemoryLoadAbsolute.cpp

00001 // 00002 // Copyright 2004 P&P Software GmbH - All Rights Reserved 00003 // 00004 // DC_PUSMemoryLoadAbsolute.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_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 }
Copyright 2003 P&P Software GmbH - All Rights Reserved