Bmag incl gps rettelse

Dependencies:   mbed WDT MODSERIAL BME280

SPS/SPS.cpp

Committer:
MAA
Date:
2017-03-02
Revision:
4:c70ef089a3fd
Parent:
2:39c4a85dc2a4
Child:
5:11782a2008c2

File content as of revision 4:c70ef089a3fd:

#include "SPS.h"

SPS::SPS(){

    currentString = "";
    currentErrString = "";
    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";
           
};

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 encoding, string source_firmware_version, string interpreter_firmware_version, string latitude, string longitude, char gpsFixFlag, string mag_time, string mag_nt, string mag_sq){

    currentString = "";
    string checkSum = "";
    
    //create current string
    currentString.push_back(LINESTART);
    currentString.append(tag);
    currentString.push_back(SPACE);
    currentString.append(identifier_id);
    currentString.push_back(SPACE);
    currentString.append(group_id);
    currentString.push_back(SPACE);
    currentString.append(date);
    currentString.push_back(SPACE);
    currentString.append(time);
    currentString.push_back(SPACE); 
    currentString.append("ZZZ");
    currentString.push_back(SPACE);
    currentString.push_back(HEADEREND);
    currentString.push_back(SPACE);
    currentString.append(s1);
    currentString.push_back(SPACE);
    currentString.append(source_id);
    currentString.push_back(SPACE);
    currentString.append(interpreter_id);
    currentString.push_back(SPACE);
    currentString.append(data_line_version);
    currentString.push_back(SPACE);
    currentString.append(encoding);
    currentString.push_back(SPACE);
    currentString.append(source_firmware_version);
    currentString.push_back(SPACE);
    currentString.append(interpreter_firmware_version);
    currentString.push_back(SPACE);
    currentString.push_back(HEADEREND);
    currentString.push_back(SPACE);
    currentString.append(latitude);
    currentString.push_back(SPACE);
    currentString.append(longitude);
    currentString.push_back(SPACE);
    currentString.push_back(gpsFixFlag);
    currentString.push_back(SPACE);
    currentString.append(mag_time);
    currentString.push_back(SPACE);
    currentString.append(mag_nt);
    currentString.push_back(SPACE);
    currentString.append(mag_sq);
    
    //calculate checksum
    checkSum = this->checkSumCalc();
    
    //append rest of string
    currentString.push_back(SPACE);
    currentString.append(checkSum);
    currentString.push_back(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;
};
//***************************************************************************