CHENGQI YANG / SmartLab_MuRata
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Payload.cpp Source File

Payload.cpp

00001 #include "Payload.h"
00002 
00003 using namespace SmartLabMuRata;
00004 
00005 Payload::Payload()
00006 {
00007     max = EXPANDSIZE;
00008     data = new char[EXPANDSIZE];
00009     position = 0;
00010 }
00011 
00012 Payload::Payload(Payload * payload)
00013 {
00014     position = 0;
00015     max = 0;
00016     SetPayload(payload);
00017 }
00018 
00019 void Payload::SetPayload(Payload * payload)
00020 {
00021     if (payload == NULL)
00022         return;
00023 
00024     this->data = payload->data;
00025     this->position = payload->position;
00026     this->max = payload->max;
00027 }
00028 
00029 char * Payload::GetData()
00030 {
00031     return data;
00032 }
00033 
00034 ResponseFlag Payload::GetResponseFlag()
00035 {
00036     if ((data[0] >> 7) == 0x01)
00037         return Response_Confirmation;
00038     else return Request_Indication;
00039 }
00040 
00041 void Payload::SetResponseFlag(const ResponseFlag flag)
00042 {
00043     if (flag == Request_Indication)
00044         data[0] &= 0x7F;
00045     else data[0] |= 0x80;
00046 }
00047 
00048 SubCommandID Payload::GetSubCommandID()
00049 {
00050     return (SubCommandID)(data[0] & 0x7F);
00051 }
00052 
00053 void Payload::SetSubCommandID(const SubCommandID id)
00054 {
00055     SetSubCommandID((int)id);
00056 }
00057 
00058 void Payload::SetSubCommandID(const int value)
00059 {
00060     data[0] = (data[0] & 0x80) | (value & 0x7F);
00061     position = 1;
00062 }
00063 
00064 char Payload::GetFrameID()
00065 {
00066     return data[1];
00067 }
00068 
00069 void Payload::SetFrameID(const char frameID)
00070 {
00071     data[1] = frameID;
00072     position = 2;
00073 }
00074 
00075 int Payload::GetPosition()
00076 {
00077     return position;
00078 }
00079 
00080 void Payload::SetPosition(const int position)
00081 {
00082     if (this->position > max)
00083         this->position = max;
00084     else this->position = position;
00085 }
00086 
00087 void Payload::Allocate(const int length)
00088 {
00089     if (length <= 0)
00090         return;
00091 
00092     if (length > max) {
00093         delete[] data;
00094         data = new char[length];
00095     }
00096 
00097     Rewind();
00098 }
00099 
00100 void Payload::Rewind()
00101 {
00102     position = 0;
00103 }
00104 
00105 void Payload::SetContent(const char value)
00106 {
00107     if (position >= max) {
00108         max += EXPANDSIZE;
00109         char * temp = new char[max];
00110         memcpy(temp, data, position);
00111         delete[] data;
00112         data = temp;
00113     }
00114 
00115     data[position++] = value;
00116 }
00117 
00118 void Payload::SetContent(const char * value, const int offset, const int length)
00119 {
00120     if (length <= 0)
00121         return;
00122 
00123     if (position + length >= max) {
00124         max += EXPANDSIZE * (1 + length / EXPANDSIZE);
00125         char * temp = new char[max];
00126         memcpy(temp, data, position);
00127         delete[] data;
00128         data = temp;
00129     }
00130 
00131     memcpy(data + position, value + offset, length);
00132     position += length;
00133 }