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)

Revision:
0:6a2a480672be
Child:
1:c3a5d3a0b437
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BG96_GNSS.cpp	Wed Feb 19 11:02:17 2020 +0100
@@ -0,0 +1,87 @@
+#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;
+}
\ No newline at end of file