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

DC_BasicPUSTmStream.cpp

00001 // 00002 // Copyright 2004 P&P Software GmbH - All Rights Reserved 00003 // 00004 // DC_BasicPUSTmStream.cpp 00005 // 00006 // Version 1.0 00007 // Date 04.02.04 (Version 1.0) 00008 // Author A. Pasetti (P&P Software) 00009 00010 #include "../GeneralInclude/CompilerSwitches.h" 00011 #include "../GeneralInclude/DebugSupport.h" 00012 #include "../GeneralInclude/ClassId.h" 00013 #include "../GeneralInclude/BasicTypes.h" 00014 #include "../GeneralInclude/Constants.h" 00015 #include "../Base/CC_RootObject.h" 00016 #include "../Event/DC_EventRepository.h" 00017 #include "../Telemetry/TelemetryPacket.h" 00018 #include "../Telemetry/PUSTelemetryPacket.h" 00019 #include "DC_BasicPUSTmStream.h" 00020 00021 #include <string.h> 00022 00023 DC_BasicPUSTmStream::DC_BasicPUSTmStream(void) { 00024 size = 0; 00025 tmData = pNULL; 00026 writeCounter = 0; 00027 packetSequenceControl = 0xC0; 00028 nAdditionalBytes = 11+sizeof(TD_ObsTime); 00029 setClassId(ID_BASICPUSTMSTREAM); 00030 } 00031 00032 void DC_BasicPUSTmStream::reset(void) { 00033 assert(size>0 && tmData!=pNULL); 00034 writeCounter = 1; 00035 tmData[0]=0; 00036 } 00037 00038 void DC_BasicPUSTmStream::flush(void) { 00039 reset(); 00040 } 00041 00042 unsigned int DC_BasicPUSTmStream::getCapacity(void) { 00043 assert( size > 0 ); 00044 return size; 00045 } 00046 00047 void DC_BasicPUSTmStream::setCapacity(unsigned int n) { 00048 assert( n > 0 ); 00049 size = n; 00050 } 00051 00052 void DC_BasicPUSTmStream::setStartAddress(unsigned char* pAddress) { 00053 assert( pAddress != pNULL ); 00054 tmData = pAddress; 00055 reset(); 00056 } 00057 00058 unsigned char* DC_BasicPUSTmStream::getStartAddress(void) const { 00059 assert( tmData != pNULL ); 00060 return tmData; 00061 } 00062 00063 unsigned int DC_BasicPUSTmStream::getPacketCounter(void) const { 00064 assert( tmData!=pNULL ); 00065 return tmData[0]; 00066 } 00067 00068 unsigned int DC_BasicPUSTmStream::getWriteCounter(void) const { 00069 return writeCounter; 00070 } 00071 00072 unsigned int DC_BasicPUSTmStream::getSequenceCounter(void) const { 00073 return (packetSequenceControl%0x40); 00074 } 00075 00076 bool DC_BasicPUSTmStream::doesPacketFit(TelemetryPacket* pItem) { 00077 assert( isObjectConfigured() ); 00078 00079 if (pItem->getNumberOfBytes()==0) 00080 return true; 00081 00082 return ( (pItem->getNumberOfBytes()+nAdditionalBytes) <= (size-writeCounter) ); 00083 } 00084 00085 void DC_BasicPUSTmStream::write(TelemetryPacket* pItem) { 00086 assert( isObjectConfigured() ); 00087 unsigned int nTmData = pItem->getNumberOfBytes(); 00088 00089 // Increment packet sequence counter 00090 if ( packetSequenceControl==0xFF ) 00091 packetSequenceControl = 0xC0; 00092 else 00093 packetSequenceControl++; 00094 00095 // Check if the packet fits in the telemetry write area 00096 if ( (writeCounter+nTmData+nAdditionalBytes)>getCapacity() ) { 00097 CC_RootObject::getEventRepository()->create(this,EVT_TM_STREAM_END); 00098 return; 00099 } 00100 00101 assert(sizeof(TD_PUSPacketId)==2); 00102 00103 // Write packet header 00104 TD_PUSPacketId t1 = PUSTelemetryPacket::getPacketId(); 00105 unsigned short t3 = (unsigned short)(nAdditionalBytes-6+nTmData); 00106 memcpy(tmData+writeCounter,&t1,2); 00107 memcpy(tmData+writeCounter+2,&packetSequenceControl,2); 00108 memcpy(tmData+writeCounter+4,&t3,2); 00109 writeCounter = writeCounter+6; 00110 00111 // Write packet data field 00112 assert(sizeof(TD_TelemetryType)==1); 00113 assert(sizeof(TD_TelemetrySubType)==1); 00114 tmData[writeCounter] = 0x10; 00115 tmData[writeCounter+1] = pItem->getType(); 00116 tmData[writeCounter+2] = pItem->getSubType(); 00117 00118 TD_ObsTime obsTimeTag = pItem->getTimeTag(); 00119 memcpy(tmData+writeCounter+3,&obsTimeTag,sizeof(TD_ObsTime)); 00120 00121 writeCounter = writeCounter+3+sizeof(TD_ObsTime); 00122 00123 if (pItem->isFastAcquisitionImplemented()) { 00124 unsigned char* s = pItem->getStartAddress(); 00125 for (unsigned int j=0; j<nTmData; j++) 00126 tmData[writeCounter+j] = s[j]; 00127 } else 00128 for (unsigned int i=0; i<nTmData; i++) { 00129 tmData[writeCounter+i] = pItem->getUnsignedByte(i); 00130 } 00131 writeCounter = writeCounter+nTmData; 00132 00133 // Write the packet error control field 00134 tmData[writeCounter] = 0; 00135 tmData[writeCounter+1] = 0; 00136 writeCounter = writeCounter+2; 00137 00138 // Update the packet counter 00139 tmData[0]++; 00140 00141 } 00142 00143 bool DC_BasicPUSTmStream::isObjectConfigured(void) { 00144 return ( TelemetryStream::isObjectConfigured() && 00145 size>0 && 00146 tmData!=pNULL ); 00147 } 00148
Copyright 2003 P&P Software GmbH - All Rights Reserved