Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

SPS/SPS.cpp

Committer:
MAA
Date:
2017-05-31
Revision:
24:099df3fa2b13
Parent:
23:2e914b705b99
Child:
25:57f9e3273979

File content as of revision 24:099df3fa2b13:

#include "SPS.h"

//! SPS, class default constructor
/*! 
    Initializing different class member values, creating a header string.       
*/
SPS::SPS(){

    fileNameString = "";
    currentString = "";
    currentErrString = "";
    lastString = "";
    headerString = "";
    crc_tab16_init = 0;
    errStatus = true;
           
};


//! UpdateCurrentString, sps string creation method, taking data and info as parameters.
/*! 

    Generates an sps string containing everything needed in a BMAG sps string including crc, brackets etc.

    \param tag: string containing the tag for the sps logging unit eg. "BMAG"
    \param identifier_id: string containing the identifier id of the unit.
    \param group_id: string containing the group id of the unit.
    \param date: string containing the date in the format "YYYY/MM/DD"  
    \param time: string containing the current time in format "HH:MM:SS.FFF"
    \param ZZZ: string containing "ZZZ" :)
    \param encoding: string containing encoding as described in the *.sps documentation
    \param source_id: string containing the source id of the unit eg. "0000"
    \param interpreter_id: string containing the interpreter id of the unit eg. "00"
    \param data_line_version: string containing data line version as described in the *.sps documentation, eg. "01" 
    \param source_firmware_version: string containing the firmware version of the unit eg. "1.2"
    \param barcode: string containing the barcode of the unit, eg. "12345" 
    \param latitude: string containing the latitude of the unit in decimal degrees. For further info read the *.sps documentation.
    \param longitude: string containing the longitude of the unit in decimal degrees. For further info read the *.sps documentation.
    \param gpsFixFlag: bool containing the gps fix status, 1 if gps fix is present, else 0.
    \param batteryvoltage: string containing the battery voltage of the units battery pack, eg. "14.2"
    \param mag_time: string containing the last timestamp received from GSM-19 device eg. "000048.0"
    \param mag_nt: string containing the last mag measurement in nT eg. "036418.77"
    \param mag_sq: string containing info about the measurement quality of the last mag measurement eg. "99"
              
*/
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 mag_time, string mag_nt, string mag_sq, Serial * dbg){

    this->currentString = "";
    this->currentString.resize(256);
    
    int strLength = 0;
    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(source_id);
    addToCurrentString(SPACE);
    addToCurrentString(interpreter_id);
    addToCurrentString(SPACE);
    addToCurrentString(data_line_version);
    addToCurrentString(SPACE);
    addToCurrentString(encoding);
    addToCurrentString(SPACE);
    addToCurrentString(source_firmware_version);
    addToCurrentString(SPACE);
    addToCurrentString(interpreter_firmware_version);
    addToCurrentString(SPACE);
    addToCurrentString(HEADEREND);
    addToCurrentString(SPACE);
    addToCurrentString(barcode);
    addToCurrentString(SPACE);
    if(gpsFixFlag){
        addToCurrentString(latitude);    
    }
    if(!gpsFixFlag){
        addToCurrentString("NaN");    
    }  
    addToCurrentString(SPACE);
    if(gpsFixFlag){
        addToCurrentString(longitude);    
    }
    if(!gpsFixFlag){
        addToCurrentString("NaN");    
    } 
    addToCurrentString(SPACE); 
    if(gpsFixFlag){
        addToCurrentString('1');    
    }
    if(!gpsFixFlag){
        addToCurrentString('0');
    }
    addToCurrentString(SPACE);
    addToCurrentString(batteryvoltage);
    addToCurrentString(SPACE);
    addToCurrentString(mag_time);
    addToCurrentString(SPACE);
    addToCurrentString(mag_nt);
    addToCurrentString(SPACE);
    addToCurrentString(mag_sq);
    
    
    strLength = strlen(this->currentString.c_str());
    
    //calculate checksum
    for(int i = 0; i < strLength; i++){
        if(this->currentString[i] != '>'){
            
            chkSum = update_crc_16(chkSum, this->currentString[i]);
            
        }         
    }
    
    sprintf(checkSum, "%04X", chkSum);
      
    //append rest of string
    addToCurrentString(SPACE);
    addToCurrentString(checkSum);
    addToCurrentString(LINESTOP); 
};

//Updates current header string
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){

    this->headerString = "";
    this->headerString.resize(256);

    int strLength = 0;
    char checkSum[5];
    memset(checkSum,'\0',5);
    unsigned short chkSum = 0;
    
    addToCurrentHeaderString(LINESTART);
    addToCurrentHeaderString("RMRK");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(identifier_id);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(group_id);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("0000/00/00");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("00:00:00.000");
    addToCurrentHeaderString(SPACE); 
    addToCurrentHeaderString("ZZZ");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(HEADEREND);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(source_id);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(interpreter_id);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("01");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(encoding);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(source_firmware_version);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(interpreter_firmware_version);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(HEADEREND);
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("Barcode");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("Latitude");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("Longitude");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("gpsFixFlag");   
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("batteryVoltage");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("mag_time");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("mag_value");
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString("mag_quality");
    
    
    strLength = strlen(this->headerString.c_str());
    
    //calculate checksum
    for(int i = 0; i < strLength; i++){
        if(this->headerString[i] != '>'){
            
            chkSum = update_crc_16(chkSum, this->headerString[i]);
            
        }         
    }
    
    sprintf(checkSum, "%04X", chkSum);
      
    //append rest of string
    addToCurrentHeaderString(SPACE);
    addToCurrentHeaderString(checkSum);
    addToCurrentHeaderString(LINESTOP);             
}

//! UpdateCurrentErrString, sps ERR string creation method, taking data and info as parameters.
/*! 

    Generates the current sps ERR string containing everything needed in a BMAG sps string including crc, brackets etc.

    \param tag: string containing the tag for the sps logging unit eg. "BMAG"
    \param identifier_id: string containing the identifier id of the unit.
    \param group_id: string containing the group id of the unit.
    \param date: string containing the date in the format "YYYY/MM/DD"  
    \param time: string containing the current time in format "HH:MM:SS.FFF"
    \param ZZZ: string containing "ZZZ" :)
    \param encoding: string containing encoding as described in the *.sps documentation
    \param source_id: string containing the source id of the unit eg. "0000"
    \param interpreter_id: string containing the interpreter id of the unit eg. "00"
    \param data_line_version: string containing data line version as described in the *.sps documentation, eg. "01" 
    \param source_firmware_version: string containing the firmware version of the unit eg. "1.2"
    \param barcode: string containing the barcode of the unit, eg. "12345" 
    \param latitude: string containing the latitude of the unit in decimal degrees. For further info read the *.sps documentation.
    \param longitude: string containing the longitude of the unit in decimal degrees. For further info read the *.sps documentation.
    \param gpsFixFlag: bool containing the gps fix status, 1 if gps fix is present, else 0.
    \param mag_time: string containing the last timestamp received from GSM-19 device eg. "000048.0"
    \param mag_nt: string containing the last mag measurement in nT eg. "036418.77"
    \param mag_sq: string containing info about the measurement quality of the last mag measurement eg. "99"
              
*/ 
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){

    this->currentErrString = "";
    this->currentErrString.resize(256);
    char checkSum[5];
    memset(checkSum,'\0',5);
    unsigned short chkSum = 0;
    int strLength = 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("NOC");
    addToCurrentErrString(SPACE);
    addToCurrentErrString(HEADEREND);
    addToCurrentErrString(source_id);
    addToCurrentErrString(SPACE);
    addToCurrentErrString(interpreter_id);
    addToCurrentErrString(SPACE);
    addToCurrentErrString("01");
    addToCurrentErrString(SPACE);
    addToCurrentErrString(encoding);
    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");
    
    strLength = strlen(this->currentErrString.c_str());
    
    //calculate checksum
    for(int i = 0; i < strLength; i++){
        if(this->currentErrString[i] != '>'){
            
            chkSum = update_crc_16(chkSum, this->currentErrString[i]);
            
        }         
    }
        
    sprintf(checkSum, "%04X", chkSum);
    
    //append rest of string
    addToCurrentErrString(SPACE);
    addToCurrentErrString(checkSum);
    addToCurrentErrString(LINESTOP);   
};

//! init_crc16_tab, creates a crc tab.
/*! 
    Populates a crc array for later use           
*/ 
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;
};



//! update_crc_16, updates crc tab.
/*! 
    \param crc: the crc currently getting calculated  
    \param c: next character to be part of crc
    \return returns crc value           
*/ 
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;
};



//! getCurrentString, returns the current sps data string
/*! 
    \return returns current sps data string          
*/ 
string SPS::getCurrentString(void){
    return this->currentString; 
};


//! getErrStatus, returns the current error status flag
/*! 
    \return returns the current error status flag (bool)         
*/ 
bool SPS::getErrStatus(void){
    return this->errStatus;    
}; 
  
//! setErrStatus, sets error status flag
/*! 
    \param status: boolean value assigned to errorStatus        
*/ 
void SPS::setErrStatus(bool status){
    this->errStatus = status;
};

//! getHeaderString, getter method, returning header string for *.sps file
/*! 
    \return returns the header string for the *.sps file       
*/ 
string SPS::getHeaderString(void){
    return this->headerString;    
};

//add data to current string
//! addToCurrentString, appends string of data to the sps string currently being manipulated.
/*! 
    \param data: string containing data   
*/ 
void SPS::addToCurrentString(string data){
    int currentStartIndex = strlen(this->currentString.c_str());
    char dataStrLen = 0;
    int index = 0;
    
    dataStrLen = strlen(data.c_str());
    
    for(int i = 0; i < dataStrLen; i++){
        
        if((this->currentString[currentStartIndex+i] != '\r') || (this->currentString[currentStartIndex+i] != '\n')){
            
            this->currentString[currentStartIndex+i] = data[index];
            index += 1;
                  
        }
                     
    }                
}

//! addToCurrentString, appends char to the sps string currently being manipulated.
/*! 
    \param data: data character 
*/ 
void SPS::addToCurrentString(char data){
    int currentStartIndex = strlen(this->currentString.c_str());
    this->currentString[currentStartIndex] = data;          
};


void SPS::addToCurrentHeaderString(string data){
    int currentStartIndex = strlen(this->headerString.c_str());
    char dataStrLen = 0;
    int index = 0;
    
    dataStrLen = strlen(data.c_str());
    
    for(int i = 0; i < dataStrLen; i++){
        
        if((this->headerString[currentStartIndex+i] != '\r') || (this->headerString[currentStartIndex+i] != '\n')){
            
            this->headerString[currentStartIndex+i] = data[index];
            index += 1;
                  
        }
                     
    }                
};


void SPS::addToCurrentHeaderString(char data){
    int currentStartIndex = strlen(this->headerString.c_str());
    this->headerString[currentStartIndex] = data;          
};

//! addToCurrentErrString, appends string to the sps err_string currently being manipulated.
/*! 
    \param data: data string 
*/ 
void SPS::addToCurrentErrString(string data){
    int currentStartIndex = strlen(this->currentErrString.c_str());
    char dataStrLen = 0;
    dataStrLen = strlen(data.c_str());
    
    for(int i = 0; i < dataStrLen; i++){
        this->currentErrString[currentStartIndex+i] = data[i];               
    }      
    
};

//! addToCurrentErrString, appends a character to the sps err_string currently being manipulated.
/*! 
    \param data: data char 
*/ 
void SPS::addToCurrentErrString(char data){
    int currentStartIndex = strlen(currentErrString.c_str());
    currentErrString[currentStartIndex] = data;      
        
};

//! generateSpsFilename, generates a sps file name, including file postfix, using the current date as input.
/*! 
    \param formattedDate: Date string using a formatted date witht he format: "YYYY/MM/DD" 
*/ 
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';   

};

//! getSpsFileName, getter method, returning a *.sps filename based on the formatted date generated using generateSpsFilename(string formattedDate) method.
/*! 
    \return fileNameString returns file name including postfix. 
*/ 
string SPS::getSpsFileName(void){
    
    return this->fileNameString;   
    
};

//! getCurrentErrString, getter method returning current sps error string
/*! 
    \return currentErrString: returns the current sps error string.
*/ 
string SPS::getCurrentErrString(void){
    return this->currentErrString;    
};