Simple driver for GNSS functions on BG96 module.

Dependents:   mbed-os-example-cellular-gps-bg96

Note: this is early version

BG96 module needs to be already running to use this. Configuration only inside of this class. (hardcoded values)

BG96_GNSS.cpp

Committer:
Pawel Zarembski
Date:
2020-02-19
Revision:
0:6a2a480672be
Child:
1:c3a5d3a0b437

File content as of revision 0:6a2a480672be:

#include "BG96_GNSS.h"

BG96_GNSS::BG96_GNSS(bool debug) 
{
    const int baudrate = 115200;
    const char delimiter[] = "\r\n";

    _serial = new UARTSerial(MBED_CONF_QUECTEL_BG96_TX, MBED_CONF_QUECTEL_BG96_RX, baudrate); 
    serial_at_parser_init(delimiter, debug);
}

void BG96_GNSS::serial_at_parser_init(const char *delimiter, bool debug)
{
    _parser = new ATCmdParser(_serial);    
    _parser->debug_on(debug);
    _parser->set_delimiter(delimiter);    
    _parser->set_timeout(BG96_AT_TIMEOUT);
}

void BG96_GNSS::check_if_ready(void)
{
    int counter = 0;
    while ((counter++) < 10) {
        if (_parser->recv("RDY")) {
            printf("BG96 ready\r\n");
        }
        else if (_parser->send("AT") && _parser->recv("OK")) {
            printf("BG96 already available\r\n");
        }
        thread_sleep_for(10);
    }
}

int BG96_GNSS::set_gps_power(bool state)
{
    char _buf[32];

    sprintf((char *)_buf, "%s", state ? "AT+QGPS=1" : "AT+QGPSEND");
    if (_parser->send(_buf) && _parser->recv("OK")) {
        printf("GPS Power: %s\r\n", state ? "On" : "Off");
        return SUCCESS;
    } 
    else {
        printf("Set GPS Power %s failed\r\n", state ? "On" : "Off");
        return FAILURE;
    } 
}

int get_gps_data(gps_data *data)
{ 
    char _buf[100];

    bool ok = false;
    Timer t;

    // Structure init: GPS info
    // todo external fucntion or delete
    data->utc = data->lat = data->lon = data->hdop= data->altitude = data->cog = data->spkm = data->spkn = data->nsat=0.0;
    data->fix=0;
    memset(&data->date, 0x00, 7);

    // timer start
    t.start();

    while(!ok && (t.read_ms() < 15000) ) {
        _parser->flush();

        /* todo: error handler
        first check if no error, flush, ask about */
        _parser->send((char*)"AT+QGPSLOC=2"); // MS-based mode
        ok = _parser->recv("+QGPSLOC: ");
        if (ok) {
            _parser->recv("%s\r\n", _buf);
            sscanf(_buf,"%f,%f,%f,%f,%f,%d,%f,%f,%f,%6s,%d",
                    &data->utc, &data->lat, &data->lon, &data->hdop,
                    &data->altitude, &data->fix, &data->cog,
                    &data->spkm, &data->spkn, data->date, &data->nsat);            
            ok = _parser->recv("OK");
        }         
    }

    if(ok == true) {
        return SUCCESS;
    }

    return FAILURE;
}