![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Bmag incl gps rettelse
Dependencies: mbed WDT MODSERIAL BME280
SPS/SPS.cpp
- Committer:
- MAA
- Date:
- 2017-03-15
- Revision:
- 7:872984a67d5b
- Parent:
- 6:6d1683c8b26b
- Child:
- 8:d6287c33b54a
File content as of revision 7:872984a67d5b:
#include "SPS.h" SPS::SPS(){ fileNameString = ""; currentString = ""; currentErrString = ""; lastString = ""; headerString = "/tag identifier_id group_id date time zzz | s1 source_id interpreter_id data_line_version encoding source_firmware_version interpreter_firmware_version | latitude longitude gpsFixFlag mag_time mag_nt mag_sq checksum"; crc_tab16_init = 0; errStatus = true; }; void SPS::UpdateCurrentString(string tag, string identifier_id, string group_id, string date, string time, string ZZZ,string s1, 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){ currentString = ""; currentString.resize(256); char checkSum[5]; memset(checkSum,'\0',5); unsigned short chkSum = 0; addToCurrentString(LINESTART); addToCurrentString(tag); addToCurrentString(SPACE); addToCurrentString(identifier_id); addToCurrentString(SPACE); addToCurrentString(group_id); addToCurrentString(SPACE); addToCurrentString(date); addToCurrentString(SPACE); addToCurrentString(time); addToCurrentString(SPACE); addToCurrentString("ZZZ"); addToCurrentString(SPACE); addToCurrentString(HEADEREND); addToCurrentString(SPACE); addToCurrentString(s1); addToCurrentString(SPACE); addToCurrentString(source_id); addToCurrentString(SPACE); addToCurrentString(interpreter_id); addToCurrentString(SPACE); addToCurrentString(data_line_version); addToCurrentString(SPACE); addToCurrentString(source_firmware_version); addToCurrentString(SPACE); addToCurrentString(interpreter_firmware_version); addToCurrentString(SPACE); addToCurrentString(HEADEREND); addToCurrentString(SPACE); addToCurrentString(latitude); addToCurrentString(SPACE); addToCurrentString(longitude); addToCurrentString(SPACE); if(gpsFixFlag){ addToCurrentString('1'); } if(!gpsFixFlag){ addToCurrentString('0'); } addToCurrentString(SPACE); addToCurrentString(mag_time); addToCurrentString(SPACE); addToCurrentString(mag_nt); addToCurrentString(SPACE); addToCurrentString(mag_sq); //dbg->printf("CurrentStringBeforeChecksumCalc: "); //dbg->printf(currentString.c_str()); //dbg->printf("\r\n"); //calculate checksum for(int i = 0; i < strlen(currentString.c_str()); i++){ if(currentString[i] != '>' || currentString[i] != '<'){ chkSum = update_crc_16(chkSum, currentString[i]); } } sprintf(checkSum, "%04X", chkSum); //append rest of string addToCurrentString(SPACE); addToCurrentString(checkSum); addToCurrentString(LINESTOP); }; //Updates current ERR string void SPS::UpdateCurrentErrString(string tag, string identifier_id, string group_id, string date, string time, string ZZZ,string s1, 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){ currentErrString = ""; currentErrString.resize(256); char checkSum[5]; memset(checkSum,'\0',5); unsigned short chkSum = 0; addToCurrentErrString(LINESTART); addToCurrentErrString(tag); addToCurrentErrString(SPACE); addToCurrentErrString(identifier_id); addToCurrentErrString(SPACE); addToCurrentErrString(group_id); addToCurrentErrString(SPACE); addToCurrentErrString(date); addToCurrentErrString(SPACE); addToCurrentErrString(time); addToCurrentErrString(SPACE); addToCurrentErrString("ZZZ"); addToCurrentErrString(SPACE); addToCurrentErrString(HEADEREND); addToCurrentErrString(SPACE); addToCurrentErrString(s1); addToCurrentErrString(SPACE); addToCurrentErrString(source_id); addToCurrentErrString(SPACE); addToCurrentErrString(interpreter_id); addToCurrentErrString(SPACE); addToCurrentErrString(data_line_version); addToCurrentErrString(SPACE); addToCurrentErrString(source_firmware_version); addToCurrentErrString(SPACE); addToCurrentErrString(interpreter_firmware_version); addToCurrentErrString(SPACE); addToCurrentErrString(HEADEREND); addToCurrentErrString(SPACE); addToCurrentErrString("BMAG"); addToCurrentErrString(SPACE); addToCurrentErrString("C02"); addToCurrentErrString(SPACE); addToCurrentErrString("C03"); //calculate checksum for(int i = 0; i < strlen(currentString.c_str()); i++){ if(currentString[i] != '>' || currentString[i] != '<'){ chkSum = update_crc_16(chkSum, currentErrString[i]); } } sprintf(checkSum, "%04X", chkSum); //append rest of string addToCurrentErrString(SPACE); addToCurrentErrString(checkSum); addToCurrentErrString(LINESTOP); }; //Fills the array for calculation of the CRC-16 with values void SPS::init_crc16_tab() { int i, j; unsigned short crc, c; for (i = 0; i < 256; i++) { crc = 0; c = (unsigned short) i; for (j = 0; j < 8; j++) { if ((crc ^ c) & 0x0001) crc = (crc >> 1) ^ P_16; else crc = crc >> 1; c = c >> 1; } crc_tab16[i] = crc; } crc_tab16_init = 1; }; // The function update_crc_16 calculates a new CRC-16 value based on the // previous value of the CRC and the next byte of the data to be checked. unsigned short SPS::update_crc_16(unsigned short crc, char c) { unsigned short tmp, short_c; short_c = 0x00ff & (unsigned short) c; if (!crc_tab16_init) init_crc16_tab(); tmp = crc ^ short_c; crc = (crc >> 8) ^ crc_tab16[tmp & 0xff]; return crc; }; //Gets / returns current sps data string string SPS::getCurrentString(void){ return this->currentString; }; //Get error status bool SPS::getErrStatus(void){ return this->errStatus; }; //Set err status void SPS::setErrStatus(bool status){ this->errStatus = status; }; //get headerstring string SPS::getHeaderString(void){ return this->headerString; }; //add data to current string void SPS::addToCurrentString(string data){ int currentStartIndex = strlen(currentString.c_str()); char dataStrLen = 0; dataStrLen = strlen(data.c_str()); for(int i = 0; i < dataStrLen; i++){ currentString[currentStartIndex+i] = data[i]; } } void SPS::addToCurrentString(char data){ int currentStartIndex = strlen(currentString.c_str()); currentString[currentStartIndex] = data; }; //add data to current Errstring void SPS::addToCurrentErrString(string data){ int currentStartIndex = strlen(currentErrString.c_str()); char dataStrLen = 0; dataStrLen = strlen(data.c_str()); for(int i = 0; i < dataStrLen; i++){ currentErrString[currentStartIndex+i] = data[i]; } }; void SPS::addToCurrentErrString(char data){ int currentStartIndex = strlen(currentErrString.c_str()); currentErrString[currentStartIndex] = data; }; void SPS::generateSpsFilename(string formattedDate){ fileNameString.resize(25); fileNameString.replace(0, 10, "/usb/BMAG_"); fileNameString[10] = formattedDate[0]; fileNameString[11] = formattedDate[1]; fileNameString[12] = formattedDate[2]; fileNameString[13] = formattedDate[3]; fileNameString[14] = '-'; fileNameString[15] = formattedDate[5]; fileNameString[16] = formattedDate[6]; fileNameString[17] = '-'; fileNameString[18] = formattedDate[8]; fileNameString[19] = formattedDate[9]; fileNameString[20] = '.'; fileNameString[21] = 's'; fileNameString[22] = 'p'; fileNameString[23] = 's'; }; string SPS::getSpsFileName(void){ return this->fileNameString; }; //Gets / returns current sps err string string SPS::getCurrentErrString(void){ return this->currentErrString; };