Shih-Ho Hsieh / Mbed 2 deprecated Motor_XYZ_UI_SPI_8mag

Dependencies:   XYZ_sensor_Platform_SPI mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers envelope.cpp Source File

envelope.cpp

00001 #include "envelope.h"
00002 //#include "mbed.h"
00003 
00004 Envelope::Envelope()
00005 {
00006     hasCheckXOR = false;
00007     hasCRC = false;
00008     hasFooter = false;
00009     hasHeader = false;
00010     payload = NULL;
00011     //header
00012     hasHeader = false;
00013     headerIndex = 0;
00014     headerValue = NULL;
00015     headerLength = 0;
00016 
00017     // Footer
00018     hasFooter = false;
00019     footerIndex = 0;
00020     footerValue = NULL;
00021     footerLength = 0;
00022 
00023     // check
00024     // CRC
00025     hasCRC = false;
00026     checkCRCIndex = 0;
00027     checkCRCLength = 0;
00028     // check xor
00029     hasCheckXOR = false;
00030     checkXORIndex = 0;
00031 
00032     payload = NULL;
00033     payloadLength = 0;
00034     checkSumStart=0;
00035     envelopeArray = NULL;
00036 }
00037 
00038 Envelope::Envelope(const Envelope &en)
00039 {
00040     *this = en;
00041 }
00042 
00043 Envelope& Envelope::setEnvelopeData(const char *buf, int bufLength, int checkSumStart)
00044 {
00045     if(payload == NULL) payload = new char [payloadLength];
00046     for(int i = 0; i < payloadLength; i++) {
00047         if(i < bufLength) payload[i] = buf[i];
00048         else payload[i] = 0;
00049     }
00050     this->checkSumStart=checkSumStart;
00051     return *this;
00052 }
00053 
00054 Envelope& Envelope::setEnvelopeDataAdjustFooterIndex(const char *buf, int bufLength, int checkSumStart)
00055 {
00056     if(payload) delete payload;
00057     payload = new char [bufLength];
00058     for(int i = 0; i < bufLength; i++) payload[i] = buf[i];
00059     this->checkSumStart=checkSumStart;
00060     return *this;
00061 }
00062 
00063 void Envelope::enableHeader(std::string headervalue, int headerindex)
00064 {
00065     hasHeader = true;
00066     headerIndex = headerindex;
00067     headerLength = headervalue.length();
00068     if(headerValue) delete headerValue;
00069     headerValue = new char [headerLength];
00070     for(int i = 0; i < headerLength; i++) headerValue[i] = headervalue[i];
00071 }
00072 
00073 void Envelope::enableFooter(std::string footervalue, int footerindex)
00074 {
00075     hasFooter = true;
00076     footerIndex = footerindex;
00077     footerLength = footervalue.length();
00078     if(footerValue) delete footerValue;
00079     footerValue = new char [footerLength];
00080     for(int i = 0; i < footerLength; i++) footerValue[i] = footervalue[i];
00081     payloadLength = footerindex - headerLength;
00082     envelopeArray = new char[length()];
00083 }
00084 
00085 void Envelope::enableCheckXOR(int xorIndex)
00086 {
00087     hasCheckXOR = true;
00088     checkXORIndex = xorIndex;
00089 }
00090 
00091 char * Envelope::getEnvelopeArray()
00092 {
00093     int envelopeLength = length();
00094     int i = 0;
00095     if(hasHeader) i = appendData(envelopeArray, i, headerValue, headerLength);
00096     i = appendData(envelopeArray, i, payload, payloadLength);
00097     if(hasFooter) i = appendData(envelopeArray, i, footerValue, footerLength);
00098     if(hasCheckXOR) envelopeArray[i] = generateXor(envelopeArray, envelopeLength-1);
00099     return envelopeArray;
00100 }
00101 
00102 char Envelope::generateXor(char *input, int length)
00103 {
00104     Xor = 0;
00105     for(int i = checkSumStart; i < length; i++) Xor ^= input[i];
00106     return Xor;
00107 }
00108 
00109 int Envelope::appendData(char *toAppend, int startIndex, char *data, int dataLength)
00110 {
00111     if(toAppend == NULL || data == NULL) return -1; // error
00112     for(int i = 0; i < dataLength; i++) toAppend[ i + startIndex ] = data[i];
00113     return startIndex + dataLength;
00114 }
00115 
00116 bool Envelope::getHasFooter() const
00117 {
00118     return hasFooter;
00119 }
00120 
00121 Envelope::~Envelope()
00122 {
00123     if(headerValue) delete headerValue;
00124     if(footerValue) delete footerValue;
00125     if(payload) delete payload;
00126     if(envelopeArray) delete envelopeArray;
00127 }
00128 
00129 bool Envelope::getHasHeader() const
00130 {
00131     return hasHeader;
00132 }
00133 
00134 int Envelope::getFooterLength() const
00135 {
00136     return footerLength;
00137 }
00138 
00139 Envelope &Envelope::operator=(const Envelope & en)
00140 {
00141     hasHeader = en.hasHeader;
00142     headerLength = en.headerLength;
00143     headerIndex = en.headerIndex;
00144     if(headerValue) delete headerValue;
00145     headerValue = new char[headerLength];
00146     appendData(headerValue, 0, en.headerValue, headerLength);
00147 //    printf("header replication pass\n");
00148 
00149     hasFooter = en.hasFooter;
00150     footerLength = en.footerLength;
00151     footerIndex = en.footerIndex;
00152     if(footerValue) delete footerValue;
00153     footerValue = new char[footerLength];
00154     appendData(footerValue, 0, en.footerValue, footerLength);
00155 //    printf("Footer replication pass\n");
00156 
00157     hasCheckXOR = en.hasCheckXOR;
00158     checkCRCIndex = en.checkXORIndex;
00159     Xor = en.Xor;
00160 
00161     payloadLength = en.payloadLength;
00162     if(payload) delete payload;
00163     payload = new char[payloadLength];
00164     appendData(payload, 0, en.payload, payloadLength);
00165 //    printf("payload replication pass\n");
00166 
00167     checkSumStart = en.checkSumStart;
00168     return *this;
00169 }
00170 
00171 int Envelope::getHeaderLength() const
00172 {
00173     return headerLength;
00174 }
00175 
00176 int Envelope::getPayloadLength() const
00177 {
00178     return payloadLength;
00179 }
00180 
00181 char * Envelope::getPayload() const
00182 {
00183     return payload;
00184 }
00185 
00186 int Envelope::length() const
00187 {
00188     int envelopeLength = payloadLength;
00189     if(hasHeader) envelopeLength += headerLength;
00190     if(hasFooter) envelopeLength += footerLength;
00191     if(hasCheckXOR) envelopeLength++;
00192     return envelopeLength;
00193 }
00194 
00195 bool Envelope::checkXOR() const
00196 {
00197     return hasCheckXOR;
00198 }
00199 
00200 int Envelope::getFooterIndex() const
00201 {
00202     return footerIndex;
00203 }
00204 
00205 int Envelope::getHeaderIndex() const
00206 {
00207     return headerIndex;
00208 }
00209 
00210 char * Envelope::getFooter() const
00211 {
00212     return footerValue;
00213 }
00214 
00215 char * Envelope::getHeader() const
00216 {
00217     return headerValue;
00218 }
00219