00001 #ifndef MD_TELEMETRY
00002 #define MD_TELEMETRY
00003 #define MAX_FRAMESIZE 100 // Capacity if data elements of both kinds.
00004 #define nameOffsetIdx (frame + (sizeof(unsigned short) * (1 + *nNames)))
00005
00006 class mdTelemetryFrame {
00007 public:
00008
00009 char *frame,*frameData,*nameCursor;
00010 int frameSize,i,nameOffset;
00011 unsigned short *nameOffsets,*nNames;
00012 std::string manifest[MAX_FRAMESIZE];
00013
00014 mdTelemetryFrame(const char *buffer,int size) : frameSize(size)
00015 {frame = (char *)buffer;
00016 frameData = frame + frameSize;
00017 nNames = (unsigned short *)frame;
00018 nameOffsets = ((unsigned short *)frame) + 1;
00019 nameCursor = frame + ((MAX_FRAMESIZE + 1) * sizeof(unsigned short));
00020 nameOffsets[0] = nameCursor - frame;
00021 nameOffset = 0;
00022 }
00023
00024 char *nameIdx(int j) {return frame + ((MAX_FRAMESIZE+1) * sizeof(unsigned short)) + nameOffsets[j];}
00025
00026 void newOut() { memset(frame,0,frameSize); }
00027 void newIn() { for (i=0;i< *nNames;i++) manifest[i] = std::string(nameIdx(i)); }
00028
00029 void pack(mdObservable *obs, std::string &next) {
00030 frameData -= obs->pack(frameData);
00031 strcpy(nameCursor,next.c_str());
00032 *((unsigned short *)nameOffsetIdx) = nameOffset;
00033 nameOffset += (unsigned short)next.length() + 1;
00034 *nNames++;
00035 }
00036
00037 void pack(mdOperationalDataElement *ode, std::string &next) {
00038 frameData -= ode->pack(frameData);
00039 strcpy(nameCursor,next.c_str());
00040 *((unsigned short *)nameOffsetIdx) = nameOffset;
00041 nameOffset += (unsigned short)next.length() + 1;
00042 *nNames++;
00043 }
00044
00045 };
00046
00047
00048 #endif