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)

Committer:
Pawel Zarembski
Date:
Wed Feb 19 11:02:17 2020 +0100
Revision:
0:6a2a480672be
Child:
1:c3a5d3a0b437
init: simple version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:6a2a480672be 1 #include "BG96_GNSS.h"
Pawel Zarembski 0:6a2a480672be 2
Pawel Zarembski 0:6a2a480672be 3 BG96_GNSS::BG96_GNSS(bool debug)
Pawel Zarembski 0:6a2a480672be 4 {
Pawel Zarembski 0:6a2a480672be 5 const int baudrate = 115200;
Pawel Zarembski 0:6a2a480672be 6 const char delimiter[] = "\r\n";
Pawel Zarembski 0:6a2a480672be 7
Pawel Zarembski 0:6a2a480672be 8 _serial = new UARTSerial(MBED_CONF_QUECTEL_BG96_TX, MBED_CONF_QUECTEL_BG96_RX, baudrate);
Pawel Zarembski 0:6a2a480672be 9 serial_at_parser_init(delimiter, debug);
Pawel Zarembski 0:6a2a480672be 10 }
Pawel Zarembski 0:6a2a480672be 11
Pawel Zarembski 0:6a2a480672be 12 void BG96_GNSS::serial_at_parser_init(const char *delimiter, bool debug)
Pawel Zarembski 0:6a2a480672be 13 {
Pawel Zarembski 0:6a2a480672be 14 _parser = new ATCmdParser(_serial);
Pawel Zarembski 0:6a2a480672be 15 _parser->debug_on(debug);
Pawel Zarembski 0:6a2a480672be 16 _parser->set_delimiter(delimiter);
Pawel Zarembski 0:6a2a480672be 17 _parser->set_timeout(BG96_AT_TIMEOUT);
Pawel Zarembski 0:6a2a480672be 18 }
Pawel Zarembski 0:6a2a480672be 19
Pawel Zarembski 0:6a2a480672be 20 void BG96_GNSS::check_if_ready(void)
Pawel Zarembski 0:6a2a480672be 21 {
Pawel Zarembski 0:6a2a480672be 22 int counter = 0;
Pawel Zarembski 0:6a2a480672be 23 while ((counter++) < 10) {
Pawel Zarembski 0:6a2a480672be 24 if (_parser->recv("RDY")) {
Pawel Zarembski 0:6a2a480672be 25 printf("BG96 ready\r\n");
Pawel Zarembski 0:6a2a480672be 26 }
Pawel Zarembski 0:6a2a480672be 27 else if (_parser->send("AT") && _parser->recv("OK")) {
Pawel Zarembski 0:6a2a480672be 28 printf("BG96 already available\r\n");
Pawel Zarembski 0:6a2a480672be 29 }
Pawel Zarembski 0:6a2a480672be 30 thread_sleep_for(10);
Pawel Zarembski 0:6a2a480672be 31 }
Pawel Zarembski 0:6a2a480672be 32 }
Pawel Zarembski 0:6a2a480672be 33
Pawel Zarembski 0:6a2a480672be 34 int BG96_GNSS::set_gps_power(bool state)
Pawel Zarembski 0:6a2a480672be 35 {
Pawel Zarembski 0:6a2a480672be 36 char _buf[32];
Pawel Zarembski 0:6a2a480672be 37
Pawel Zarembski 0:6a2a480672be 38 sprintf((char *)_buf, "%s", state ? "AT+QGPS=1" : "AT+QGPSEND");
Pawel Zarembski 0:6a2a480672be 39 if (_parser->send(_buf) && _parser->recv("OK")) {
Pawel Zarembski 0:6a2a480672be 40 printf("GPS Power: %s\r\n", state ? "On" : "Off");
Pawel Zarembski 0:6a2a480672be 41 return SUCCESS;
Pawel Zarembski 0:6a2a480672be 42 }
Pawel Zarembski 0:6a2a480672be 43 else {
Pawel Zarembski 0:6a2a480672be 44 printf("Set GPS Power %s failed\r\n", state ? "On" : "Off");
Pawel Zarembski 0:6a2a480672be 45 return FAILURE;
Pawel Zarembski 0:6a2a480672be 46 }
Pawel Zarembski 0:6a2a480672be 47 }
Pawel Zarembski 0:6a2a480672be 48
Pawel Zarembski 0:6a2a480672be 49 int get_gps_data(gps_data *data)
Pawel Zarembski 0:6a2a480672be 50 {
Pawel Zarembski 0:6a2a480672be 51 char _buf[100];
Pawel Zarembski 0:6a2a480672be 52
Pawel Zarembski 0:6a2a480672be 53 bool ok = false;
Pawel Zarembski 0:6a2a480672be 54 Timer t;
Pawel Zarembski 0:6a2a480672be 55
Pawel Zarembski 0:6a2a480672be 56 // Structure init: GPS info
Pawel Zarembski 0:6a2a480672be 57 // todo external fucntion or delete
Pawel Zarembski 0:6a2a480672be 58 data->utc = data->lat = data->lon = data->hdop= data->altitude = data->cog = data->spkm = data->spkn = data->nsat=0.0;
Pawel Zarembski 0:6a2a480672be 59 data->fix=0;
Pawel Zarembski 0:6a2a480672be 60 memset(&data->date, 0x00, 7);
Pawel Zarembski 0:6a2a480672be 61
Pawel Zarembski 0:6a2a480672be 62 // timer start
Pawel Zarembski 0:6a2a480672be 63 t.start();
Pawel Zarembski 0:6a2a480672be 64
Pawel Zarembski 0:6a2a480672be 65 while(!ok && (t.read_ms() < 15000) ) {
Pawel Zarembski 0:6a2a480672be 66 _parser->flush();
Pawel Zarembski 0:6a2a480672be 67
Pawel Zarembski 0:6a2a480672be 68 /* todo: error handler
Pawel Zarembski 0:6a2a480672be 69 first check if no error, flush, ask about */
Pawel Zarembski 0:6a2a480672be 70 _parser->send((char*)"AT+QGPSLOC=2"); // MS-based mode
Pawel Zarembski 0:6a2a480672be 71 ok = _parser->recv("+QGPSLOC: ");
Pawel Zarembski 0:6a2a480672be 72 if (ok) {
Pawel Zarembski 0:6a2a480672be 73 _parser->recv("%s\r\n", _buf);
Pawel Zarembski 0:6a2a480672be 74 sscanf(_buf,"%f,%f,%f,%f,%f,%d,%f,%f,%f,%6s,%d",
Pawel Zarembski 0:6a2a480672be 75 &data->utc, &data->lat, &data->lon, &data->hdop,
Pawel Zarembski 0:6a2a480672be 76 &data->altitude, &data->fix, &data->cog,
Pawel Zarembski 0:6a2a480672be 77 &data->spkm, &data->spkn, data->date, &data->nsat);
Pawel Zarembski 0:6a2a480672be 78 ok = _parser->recv("OK");
Pawel Zarembski 0:6a2a480672be 79 }
Pawel Zarembski 0:6a2a480672be 80 }
Pawel Zarembski 0:6a2a480672be 81
Pawel Zarembski 0:6a2a480672be 82 if(ok == true) {
Pawel Zarembski 0:6a2a480672be 83 return SUCCESS;
Pawel Zarembski 0:6a2a480672be 84 }
Pawel Zarembski 0:6a2a480672be 85
Pawel Zarembski 0:6a2a480672be 86 return FAILURE;
Pawel Zarembski 0:6a2a480672be 87 }