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: mbed WDT MODSERIAL BME280
SPS.cpp
00001 #include "SPS.h" 00002 00003 //! SPS, class default constructor 00004 /*! 00005 Initializing different class member values, creating a header string. 00006 */ 00007 SPS::SPS(){ 00008 00009 fileNameString = ""; 00010 currentString = ""; 00011 currentErrString = ""; 00012 lastString = ""; 00013 headerString = ""; 00014 crc_tab16_init = 0; 00015 errStatus = true; 00016 00017 }; 00018 00019 00020 //! UpdateCurrentString, sps string creation method, taking data and info as parameters. 00021 /*! 00022 00023 Generates an sps string containing everything needed in a BMAG sps string including crc, brackets etc. 00024 00025 \param tag: string containing the tag for the sps logging unit eg. "BMAG" 00026 \param identifier_id: string containing the identifier id of the unit. 00027 \param group_id: string containing the group id of the unit. 00028 \param date: string containing the date in the format "YYYY/MM/DD" 00029 \param time: string containing the current time in format "HH:MM:SS.FFF" 00030 \param ZZZ: string containing "ZZZ" :) 00031 \param encoding: string containing encoding as described in the *.sps documentation 00032 \param source_id: string containing the source id of the unit eg. "0000" 00033 \param interpreter_id: string containing the interpreter id of the unit eg. "00" 00034 \param data_line_version: string containing data line version as described in the *.sps documentation, eg. "01" 00035 \param source_firmware_version: string containing the firmware version of the unit eg. "1.2" 00036 \param barcode: string containing the barcode of the unit, eg. "12345" 00037 \param latitude: string containing the latitude of the unit in decimal degrees. For further info read the *.sps documentation. 00038 \param longitude: string containing the longitude of the unit in decimal degrees. For further info read the *.sps documentation. 00039 \param gpsFixFlag: bool containing the gps fix status, 1 if gps fix is present, else 0. 00040 \param batteryvoltage: string containing the battery voltage of the units battery pack, eg. "14.2" 00041 \param preassure: string containing preassure measurement in hPa 00042 \param temperature: string containing temperature measured in deg C 00043 \param humidity: string containing air humidity percentage 00044 \param mag_time: string containing the last timestamp received from GSM-19 device eg. "000048.0" 00045 \param mag_nt: string containing the last mag measurement in nT eg. "036418.77" 00046 \param mag_sq: string containing info about the measurement quality of the last mag measurement eg. "99" 00047 00048 */ 00049 void SPS::UpdateCurrentString(string tag, string identifier_id, string group_id, string date, string time, string ZZZ,string encoding, string source_id, string interpreter_id, string data_line_version, string source_firmware_version, string interpreter_firmware_version, string barcode, string latitude, string longitude, bool gpsFixFlag, string batteryvoltage, string preassure, string temperature, string humidity, string altitude,string mag_time, string mag_nt, string mag_sq, Serial * dbg){ 00050 00051 this->currentString = ""; 00052 this->currentString.resize(256); 00053 00054 int strLength = 0; 00055 char checkSum[5]; 00056 memset(checkSum,'\0',5); 00057 unsigned short chkSum = 0; 00058 00059 addToCurrentString(LINESTART); 00060 addToCurrentString(tag); 00061 addToCurrentString(SPACE); 00062 addToCurrentString(identifier_id); 00063 addToCurrentString(SPACE); 00064 addToCurrentString(group_id); 00065 addToCurrentString(SPACE); 00066 addToCurrentString(date); 00067 addToCurrentString(SPACE); 00068 addToCurrentString(time); 00069 addToCurrentString(SPACE); 00070 if(!gpsFixFlag){ 00071 addToCurrentString("NOC"); 00072 } 00073 if(gpsFixFlag){ 00074 addToCurrentString("ZZZ"); 00075 } 00076 addToCurrentString(SPACE); 00077 addToCurrentString(HEADEREND); 00078 addToCurrentString(SPACE); 00079 addToCurrentString(source_id); 00080 addToCurrentString(SPACE); 00081 addToCurrentString(interpreter_id); 00082 addToCurrentString(SPACE); 00083 addToCurrentString(data_line_version); 00084 addToCurrentString(SPACE); 00085 addToCurrentString(encoding); 00086 addToCurrentString(SPACE); 00087 addToCurrentString(source_firmware_version); 00088 addToCurrentString(SPACE); 00089 addToCurrentString(interpreter_firmware_version); 00090 addToCurrentString(SPACE); 00091 addToCurrentString(HEADEREND); 00092 addToCurrentString(SPACE); 00093 addToCurrentString(barcode); 00094 addToCurrentString(SPACE); 00095 if(gpsFixFlag){ 00096 addToCurrentString(latitude); 00097 } 00098 if(!gpsFixFlag || (strlen(latitude.c_str()) < 5)){ 00099 addToCurrentString("NaN"); 00100 } 00101 addToCurrentString(SPACE); 00102 if(gpsFixFlag && (strlen(longitude.c_str()) > 5)){ 00103 addToCurrentString(longitude); 00104 } 00105 if(!gpsFixFlag || (strlen(longitude.c_str()) < 5)){ 00106 addToCurrentString("NaN"); 00107 } 00108 addToCurrentString(SPACE); 00109 00110 if(gpsFixFlag){ 00111 addToCurrentString('1'); 00112 } 00113 if(!gpsFixFlag){ 00114 addToCurrentString('0'); 00115 } 00116 addToCurrentString(SPACE); 00117 addToCurrentString(batteryvoltage); 00118 addToCurrentString(SPACE); 00119 addToCurrentString(preassure); 00120 addToCurrentString(SPACE); 00121 addToCurrentString(temperature); 00122 addToCurrentString(SPACE); 00123 addToCurrentString(humidity); 00124 addToCurrentString(SPACE); 00125 addToCurrentString(altitude); 00126 addToCurrentString(SPACE); 00127 addToCurrentString(mag_time); 00128 addToCurrentString(SPACE); 00129 addToCurrentString(mag_nt); 00130 addToCurrentString(SPACE); 00131 addToCurrentString(mag_sq); 00132 00133 00134 strLength = strlen(this->currentString.c_str()); 00135 00136 //calculate checksum 00137 for(int i = 0; i < strLength; i++){ 00138 if(this->currentString[i] != '>'){ 00139 00140 chkSum = update_crc_16(chkSum, this->currentString[i]); 00141 00142 } 00143 } 00144 00145 sprintf(checkSum, "%04X", chkSum); 00146 00147 //append rest of string 00148 addToCurrentString(SPACE); 00149 addToCurrentString(checkSum); 00150 addToCurrentString(LINESTOP); 00151 }; 00152 00153 //! UpdateHeaderString, header / RMRK update method 00154 /*! 00155 00156 Updates header / RMRK string 00157 00158 \param identifier_id: string containing the identifier id of the unit. 00159 \param group_id: string containing the group id of the unit. 00160 \param ZZZ: string containing "ZZZ" :) 00161 \param encoding: string containing encoding as described in the *.sps documentation 00162 \param source_id: string containing the source id of the unit eg. "0000" 00163 \param interpreter_id: string containing the interpreter id of the unit eg. "00" 00164 \param data_line_version: string containing data line version as described in the *.sps documentation, eg. "01" 00165 \param source_firmware_version: string containing the firmware version of the unit eg. "1.2" 00166 \param barcode: string containing the barcode of the unit, eg. "12345" 00167 \param interpreter_firmware_version: string containing interpreter firmware version 00168 00169 */ 00170 void SPS::UpdateHeaderString(string barcode, string identifier_id, string group_id, string ZZZ, string encoding,string source_id, string interpreter_id, string data_line_version, string source_firmware_version, string interpreter_firmware_version){ 00171 00172 this->headerString = ""; 00173 this->headerString.resize(256); 00174 00175 int strLength = 0; 00176 char checkSum[5]; 00177 memset(checkSum,'\0',5); 00178 unsigned short chkSum = 0; 00179 00180 addToCurrentHeaderString(LINESTART); 00181 addToCurrentHeaderString("RMRK"); 00182 addToCurrentHeaderString(SPACE); 00183 addToCurrentHeaderString(identifier_id); 00184 addToCurrentHeaderString(SPACE); 00185 addToCurrentHeaderString(group_id); 00186 addToCurrentHeaderString(SPACE); 00187 addToCurrentHeaderString("0000/00/00"); 00188 addToCurrentHeaderString(SPACE); 00189 addToCurrentHeaderString("00:00:00.000"); 00190 addToCurrentHeaderString(SPACE); 00191 addToCurrentHeaderString("ZZZ"); 00192 addToCurrentHeaderString(SPACE); 00193 addToCurrentHeaderString(HEADEREND); 00194 addToCurrentHeaderString(SPACE); 00195 addToCurrentHeaderString(source_id); 00196 addToCurrentHeaderString(SPACE); 00197 addToCurrentHeaderString(interpreter_id); 00198 addToCurrentHeaderString(SPACE); 00199 addToCurrentHeaderString("01"); 00200 addToCurrentHeaderString(SPACE); 00201 addToCurrentHeaderString(encoding); 00202 addToCurrentHeaderString(SPACE); 00203 addToCurrentHeaderString(source_firmware_version); 00204 addToCurrentHeaderString(SPACE); 00205 addToCurrentHeaderString(interpreter_firmware_version); 00206 addToCurrentHeaderString(SPACE); 00207 addToCurrentHeaderString(HEADEREND); 00208 addToCurrentHeaderString(SPACE); 00209 addToCurrentHeaderString("Barcode"); 00210 addToCurrentHeaderString(SPACE); 00211 addToCurrentHeaderString("Latitude"); 00212 addToCurrentHeaderString(SPACE); 00213 addToCurrentHeaderString("Longitude"); 00214 addToCurrentHeaderString(SPACE); 00215 addToCurrentHeaderString("gpsFixFlag"); 00216 addToCurrentHeaderString(SPACE); 00217 addToCurrentHeaderString("batteryVoltage"); 00218 addToCurrentHeaderString(SPACE); 00219 addToCurrentHeaderString("preassure"); 00220 addToCurrentHeaderString(SPACE); 00221 addToCurrentHeaderString("temperature"); 00222 addToCurrentHeaderString(SPACE); 00223 addToCurrentHeaderString("humidity"); 00224 addToCurrentHeaderString(SPACE); 00225 addToCurrentHeaderString("altitude"); 00226 addToCurrentHeaderString(SPACE); 00227 addToCurrentHeaderString("mag_time"); 00228 addToCurrentHeaderString(SPACE); 00229 addToCurrentHeaderString("mag_value"); 00230 addToCurrentHeaderString(SPACE); 00231 addToCurrentHeaderString("mag_quality"); 00232 00233 00234 strLength = strlen(this->headerString.c_str()); 00235 00236 //calculate checksum 00237 for(int i = 0; i < strLength; i++){ 00238 if(this->headerString[i] != '>'){ 00239 00240 chkSum = update_crc_16(chkSum, this->headerString[i]); 00241 00242 } 00243 } 00244 00245 sprintf(checkSum, "%04X", chkSum); 00246 00247 //append rest of string 00248 addToCurrentHeaderString(SPACE); 00249 addToCurrentHeaderString(checkSum); 00250 addToCurrentHeaderString(LINESTOP); 00251 } 00252 00253 //! UpdateCurrentErrString, sps ERR string creation method, taking data and info as parameters. 00254 /*! 00255 00256 Generates the current sps ERR string containing everything needed in a BMAG sps string including crc, brackets etc. 00257 00258 \param tag: string containing the tag for the sps logging unit eg. "BMAG" 00259 \param identifier_id: string containing the identifier id of the unit. 00260 \param group_id: string containing the group id of the unit. 00261 \param date: string containing the date in the format "YYYY/MM/DD" 00262 \param time: string containing the current time in format "HH:MM:SS.FFF" 00263 \param ZZZ: string containing "ZZZ" :) 00264 \param encoding: string containing encoding as described in the *.sps documentation 00265 \param source_id: string containing the source id of the unit eg. "0000" 00266 \param interpreter_id: string containing the interpreter id of the unit eg. "00" 00267 \param data_line_version: string containing data line version as described in the *.sps documentation, eg. "01" 00268 \param source_firmware_version: string containing the firmware version of the unit eg. "1.2" 00269 \param barcode: string containing the barcode of the unit, eg. "12345" 00270 \param latitude: string containing the latitude of the unit in decimal degrees. For further info read the *.sps documentation. 00271 \param longitude: string containing the longitude of the unit in decimal degrees. For further info read the *.sps documentation. 00272 \param gpsFixFlag: bool containing the gps fix status, 1 if gps fix is present, else 0. 00273 \param mag_time: string containing the last timestamp received from GSM-19 device eg. "000048.0" 00274 \param mag_nt: string containing the last mag measurement in nT eg. "036418.77" 00275 \param mag_sq: string containing info about the measurement quality of the last mag measurement eg. "99" 00276 00277 */ 00278 void SPS::UpdateCurrentErrString(string tag, string identifier_id, string group_id, string date, string time, string ZZZ,string encoding, string source_id, string interpreter_id, string data_line_version, string source_firmware_version, string interpreter_firmware_version, string latitude, string longitude, bool gpsFixFlag, string mag_time, string mag_nt, string mag_sq, Serial * dbg){ 00279 00280 this->currentErrString = ""; 00281 this->currentErrString.resize(256); 00282 char checkSum[5]; 00283 memset(checkSum,'\0',5); 00284 unsigned short chkSum = 0; 00285 int strLength = 0; 00286 00287 addToCurrentErrString(LINESTART); 00288 addToCurrentErrString(tag); 00289 addToCurrentErrString(SPACE); 00290 addToCurrentErrString(identifier_id); 00291 addToCurrentErrString(SPACE); 00292 addToCurrentErrString(group_id); 00293 addToCurrentErrString(SPACE); 00294 addToCurrentErrString(date); 00295 addToCurrentErrString(SPACE); 00296 addToCurrentErrString(time); 00297 addToCurrentErrString(SPACE); 00298 addToCurrentErrString("ZZZ"); 00299 addToCurrentErrString(SPACE); 00300 addToCurrentErrString(HEADEREND); 00301 addToCurrentErrString(SPACE); 00302 addToCurrentErrString(source_id); 00303 addToCurrentErrString(SPACE); 00304 addToCurrentErrString(interpreter_id); 00305 addToCurrentErrString(SPACE); 00306 addToCurrentErrString("02"); 00307 addToCurrentErrString(SPACE); 00308 addToCurrentErrString(encoding); 00309 addToCurrentErrString(SPACE); 00310 addToCurrentErrString(source_firmware_version); 00311 addToCurrentErrString(SPACE); 00312 addToCurrentErrString(interpreter_firmware_version); 00313 addToCurrentErrString(SPACE); 00314 addToCurrentErrString(HEADEREND); 00315 addToCurrentErrString(SPACE); 00316 addToCurrentErrString("BMAG"); 00317 if(!gpsFixFlag){ 00318 addToCurrentErrString(SPACE); 00319 addToCurrentErrString("RTC"); 00320 } 00321 addToCurrentErrString(SPACE); 00322 addToCurrentErrString("C02"); 00323 addToCurrentErrString(SPACE); 00324 addToCurrentErrString("C03"); 00325 00326 strLength = strlen(this->currentErrString.c_str()); 00327 00328 //calculate checksum 00329 for(int i = 0; i < strLength; i++){ 00330 if(this->currentErrString[i] != '>'){ 00331 00332 chkSum = update_crc_16(chkSum, this->currentErrString[i]); 00333 00334 } 00335 } 00336 00337 sprintf(checkSum, "%04X", chkSum); 00338 00339 //append rest of string 00340 addToCurrentErrString(SPACE); 00341 addToCurrentErrString(checkSum); 00342 addToCurrentErrString(LINESTOP); 00343 }; 00344 00345 //! init_crc16_tab, creates a crc tab. 00346 /*! 00347 Populates a crc array for later use 00348 */ 00349 void SPS::init_crc16_tab() 00350 { 00351 int i, j; 00352 unsigned short crc, c; 00353 00354 for (i = 0; i < 256; i++) 00355 { 00356 crc = 0; 00357 c = (unsigned short) i; 00358 00359 for (j = 0; j < 8; j++) 00360 { 00361 if ((crc ^ c) & 0x0001) 00362 crc = (crc >> 1) ^ P_16; 00363 else 00364 crc = crc >> 1; 00365 00366 c = c >> 1; 00367 } 00368 crc_tab16[i] = crc; 00369 } 00370 crc_tab16_init = 1; 00371 }; 00372 00373 00374 00375 //! update_crc_16, updates crc tab. 00376 /*! 00377 \param crc: the crc currently getting calculated 00378 \param c: next character to be part of crc 00379 \return returns crc value 00380 */ 00381 unsigned short SPS::update_crc_16(unsigned short crc, char c) 00382 { 00383 unsigned short tmp, short_c; 00384 00385 short_c = 0x00ff & (unsigned short) c; 00386 00387 if (!crc_tab16_init) 00388 init_crc16_tab(); 00389 00390 00391 tmp = crc ^ short_c; 00392 crc = (crc >> 8) ^ crc_tab16[tmp & 0xff]; 00393 00394 return crc; 00395 }; 00396 00397 00398 00399 //! getCurrentString, returns the current sps data string 00400 /*! 00401 \return returns current sps data string 00402 */ 00403 string SPS::getCurrentString(void){ 00404 return this->currentString; 00405 }; 00406 00407 00408 //! getErrStatus, returns the current error status flag 00409 /*! 00410 \return returns the current error status flag (bool) 00411 */ 00412 bool SPS::getErrStatus(void){ 00413 return this->errStatus; 00414 }; 00415 00416 //! setErrStatus, sets error status flag 00417 /*! 00418 \param status: boolean value assigned to errorStatus 00419 */ 00420 void SPS::setErrStatus(bool status){ 00421 this->errStatus = status; 00422 }; 00423 00424 //! getHeaderString, getter method, returning header string for *.sps file 00425 /*! 00426 \return returns the header string for the *.sps file 00427 */ 00428 string SPS::getHeaderString(void){ 00429 return this->headerString; 00430 }; 00431 00432 //add data to current string 00433 //! addToCurrentString, appends string of data to the sps string currently being manipulated. 00434 /*! 00435 \param data: string containing data 00436 */ 00437 void SPS::addToCurrentString(string data){ 00438 int currentStartIndex = strlen(this->currentString.c_str()); 00439 char dataStrLen = 0; 00440 int index = 0; 00441 00442 dataStrLen = strlen(data.c_str()); 00443 00444 for(int i = 0; i < dataStrLen; i++){ 00445 00446 if((this->currentString[currentStartIndex+i] != '\r') || (this->currentString[currentStartIndex+i] != '\n')){ 00447 00448 this->currentString[currentStartIndex+i] = data[index]; 00449 index += 1; 00450 00451 } 00452 00453 } 00454 } 00455 00456 //! addToCurrentString, appends char to the sps string currently being manipulated. 00457 /*! 00458 \param data: data character 00459 */ 00460 void SPS::addToCurrentString(char data){ 00461 int currentStartIndex = strlen(this->currentString.c_str()); 00462 this->currentString[currentStartIndex] = data; 00463 }; 00464 00465 00466 00467 //! addToCurrentHeaderString, appends string to the current header string 00468 /*! 00469 \param data: data string 00470 */ 00471 void SPS::addToCurrentHeaderString(string data){ 00472 int currentStartIndex = strlen(this->headerString.c_str()); 00473 char dataStrLen = 0; 00474 int index = 0; 00475 00476 dataStrLen = strlen(data.c_str()); 00477 00478 for(int i = 0; i < dataStrLen; i++){ 00479 00480 if((this->headerString[currentStartIndex+i] != '\r') || (this->headerString[currentStartIndex+i] != '\n')){ 00481 00482 this->headerString[currentStartIndex+i] = data[index]; 00483 index += 1; 00484 00485 } 00486 00487 } 00488 }; 00489 00490 00491 //! addToCurrentHeaderString, appends char to the current header string 00492 /*! 00493 \param data: data char 00494 */ 00495 void SPS::addToCurrentHeaderString(char data){ 00496 int currentStartIndex = strlen(this->headerString.c_str()); 00497 this->headerString[currentStartIndex] = data; 00498 }; 00499 00500 //! addToCurrentErrString, appends string to the sps err_string currently being manipulated. 00501 /*! 00502 \param data: data string 00503 */ 00504 void SPS::addToCurrentErrString(string data){ 00505 int currentStartIndex = strlen(this->currentErrString.c_str()); 00506 char dataStrLen = 0; 00507 dataStrLen = strlen(data.c_str()); 00508 00509 for(int i = 0; i < dataStrLen; i++){ 00510 this->currentErrString[currentStartIndex+i] = data[i]; 00511 } 00512 00513 }; 00514 00515 //! addToCurrentErrString, appends a character to the sps err_string currently being manipulated. 00516 /*! 00517 \param data: data char 00518 */ 00519 void SPS::addToCurrentErrString(char data){ 00520 int currentStartIndex = strlen(currentErrString.c_str()); 00521 currentErrString[currentStartIndex] = data; 00522 00523 }; 00524 00525 //! generateSpsFilename, generates a sps file name, including file postfix, using the current date as input. 00526 /*! 00527 \param formattedDate: Date string using a formatted date with format: "YYYY/MM/DD" 00528 \param barcode: Char array with barcode serial number in ASCII 00529 \param time: String containing a timestamp formatted "HH:MM:SS.FFF" 00530 */ 00531 void SPS::generateSpsFilename(string formattedDate, string barcode, string time){ 00532 00533 fileNameString.resize(40); 00534 00535 fileNameString.replace(0, 5, "/usb/"); 00536 00537 fileNameString[5] = formattedDate[0]; 00538 fileNameString[6] = formattedDate[1]; 00539 fileNameString[7] = formattedDate[2]; 00540 fileNameString[8] = formattedDate[3]; 00541 fileNameString[9] = formattedDate[5]; 00542 fileNameString[10] = formattedDate[6]; 00543 fileNameString[11] = formattedDate[8]; 00544 fileNameString[12] = formattedDate[9]; 00545 fileNameString[13] = '_'; 00546 fileNameString[14] = time[0]; 00547 fileNameString[15] = time[1]; 00548 fileNameString[16] = time[3]; 00549 fileNameString[17] = time[4]; 00550 fileNameString[18] = time[6]; 00551 fileNameString[19] = time[7]; 00552 fileNameString[20] = '_'; 00553 fileNameString[21] = 'B'; 00554 fileNameString[22] = 'M'; 00555 fileNameString[23] = 'A'; 00556 fileNameString[24] = 'G'; 00557 fileNameString[25] = '_'; 00558 fileNameString[26] = barcode[0]; 00559 fileNameString[27] = barcode[1]; 00560 fileNameString[28] = barcode[2]; 00561 fileNameString[29] = barcode[3]; 00562 fileNameString[30] = barcode[4]; 00563 fileNameString[31] = '.'; 00564 fileNameString[32] = 's'; 00565 fileNameString[33] = 'p'; 00566 fileNameString[34] = 's'; 00567 00568 }; 00569 00570 //! getSpsFileName, getter method, returning a *.sps filename based on the formatted date generated using generateSpsFilename(string formattedDate) method. 00571 /*! 00572 \return fileNameString returns file name including postfix. 00573 */ 00574 string SPS::getSpsFileName(void){ 00575 00576 return this->fileNameString; 00577 00578 }; 00579 00580 //! getCurrentErrString, getter method returning current sps error string 00581 /*! 00582 \return currentErrString: returns the current sps error string. 00583 */ 00584 string SPS::getCurrentErrString(void){ 00585 return this->currentErrString; 00586 };
Generated on Wed Jul 13 2022 08:04:14 by
