SkyTEM BMAG / Mbed 2 deprecated BMAGThrRev

Dependencies:   mbed WDT MODSERIAL BME280

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SPS.cpp Source File

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 };