Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: XYZ_sensor_Platform_SPI mbed
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
Generated on Wed Jul 20 2022 15:13:47 by
1.7.2