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 16:34:28 2020 +0100
Revision:
1:c3a5d3a0b437
Parent:
0:6a2a480672be
Child:
2:8b0663001935
fix deliter, change get gps

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pawel Zarembski 0:6a2a480672be 1 #include "BG96_GNSS.h"
Pawel Zarembski 1:c3a5d3a0b437 2 #include "mbed.h"
Pawel Zarembski 1:c3a5d3a0b437 3 #include "mbed_debug.h"
Pawel Zarembski 0:6a2a480672be 4
Pawel Zarembski 1:c3a5d3a0b437 5 BG96_GNSS::BG96_GNSS()
Pawel Zarembski 0:6a2a480672be 6 {
Pawel Zarembski 1:c3a5d3a0b437 7 this->_serial = new UARTSerial(D1, D0, 115200);
Pawel Zarembski 0:6a2a480672be 8
Pawel Zarembski 1:c3a5d3a0b437 9 this->_parser = new ATCmdParser(_serial);
Pawel Zarembski 1:c3a5d3a0b437 10 this->_parser->debug_on(false);
Pawel Zarembski 1:c3a5d3a0b437 11 this->_parser->set_delimiter("\r\n");
Pawel Zarembski 1:c3a5d3a0b437 12 this->_parser->set_timeout(1000);
Pawel Zarembski 0:6a2a480672be 13 }
Pawel Zarembski 0:6a2a480672be 14
Pawel Zarembski 1:c3a5d3a0b437 15 int BG96_GNSS::check_if_ready(void)
Pawel Zarembski 0:6a2a480672be 16 {
Pawel Zarembski 0:6a2a480672be 17 int counter = 0;
Pawel Zarembski 1:c3a5d3a0b437 18 _parser->flush();
Pawel Zarembski 1:c3a5d3a0b437 19
Pawel Zarembski 0:6a2a480672be 20 while ((counter++) < 10) {
Pawel Zarembski 0:6a2a480672be 21 if (_parser->recv("RDY")) {
Pawel Zarembski 1:c3a5d3a0b437 22 printf("GPS ready\r\n");
Pawel Zarembski 1:c3a5d3a0b437 23 return SUCCESS;
Pawel Zarembski 0:6a2a480672be 24 }
Pawel Zarembski 0:6a2a480672be 25 else if (_parser->send("AT") && _parser->recv("OK")) {
Pawel Zarembski 1:c3a5d3a0b437 26 printf("GPS already available\r\n");
Pawel Zarembski 1:c3a5d3a0b437 27 return SUCCESS;
Pawel Zarembski 0:6a2a480672be 28 }
Pawel Zarembski 1:c3a5d3a0b437 29 thread_sleep_for(1);
Pawel Zarembski 0:6a2a480672be 30 }
Pawel Zarembski 1:c3a5d3a0b437 31
Pawel Zarembski 1:c3a5d3a0b437 32 printf("GPS not ready\r\n");
Pawel Zarembski 1:c3a5d3a0b437 33 return FAILURE;
Pawel Zarembski 0:6a2a480672be 34 }
Pawel Zarembski 0:6a2a480672be 35
Pawel Zarembski 0:6a2a480672be 36 int BG96_GNSS::set_gps_power(bool state)
Pawel Zarembski 0:6a2a480672be 37 {
Pawel Zarembski 0:6a2a480672be 38 char _buf[32];
Pawel Zarembski 0:6a2a480672be 39
Pawel Zarembski 0:6a2a480672be 40 sprintf((char *)_buf, "%s", state ? "AT+QGPS=1" : "AT+QGPSEND");
Pawel Zarembski 1:c3a5d3a0b437 41
Pawel Zarembski 0:6a2a480672be 42 if (_parser->send(_buf) && _parser->recv("OK")) {
Pawel Zarembski 0:6a2a480672be 43 printf("GPS Power: %s\r\n", state ? "On" : "Off");
Pawel Zarembski 0:6a2a480672be 44 return SUCCESS;
Pawel Zarembski 0:6a2a480672be 45 }
Pawel Zarembski 0:6a2a480672be 46 else {
Pawel Zarembski 1:c3a5d3a0b437 47 printf("Set GPS Power %s failed\r\n", state ? "On" : "Off");
Pawel Zarembski 0:6a2a480672be 48 return FAILURE;
Pawel Zarembski 1:c3a5d3a0b437 49 }
Pawel Zarembski 0:6a2a480672be 50 }
Pawel Zarembski 0:6a2a480672be 51
Pawel Zarembski 1:c3a5d3a0b437 52 int BG96_GNSS::get_gps_data(gps_data *data)
Pawel Zarembski 0:6a2a480672be 53 {
Pawel Zarembski 0:6a2a480672be 54 bool ok = false;
Pawel Zarembski 1:c3a5d3a0b437 55 char _buf[100];
Pawel Zarembski 1:c3a5d3a0b437 56 int error;
Pawel Zarembski 0:6a2a480672be 57
Pawel Zarembski 1:c3a5d3a0b437 58 _parser->flush();
Pawel Zarembski 1:c3a5d3a0b437 59 // first check if there is no error, possibly fixing is not done yet (error 516)
Pawel Zarembski 1:c3a5d3a0b437 60 _parser->send((char*)"AT+QGPSLOC=2");
Pawel Zarembski 1:c3a5d3a0b437 61 ok = _parser->recv("+CME ERROR: ");
Pawel Zarembski 1:c3a5d3a0b437 62 if (ok) {
Pawel Zarembski 1:c3a5d3a0b437 63 _parser->recv("%s\r\n", _buf);
Pawel Zarembski 1:c3a5d3a0b437 64 sscanf(_buf,"%d", &error);
Pawel Zarembski 1:c3a5d3a0b437 65 printf("+CME ERROR: %d\r\n", error);
Pawel Zarembski 1:c3a5d3a0b437 66 return FAILURE;
Pawel Zarembski 0:6a2a480672be 67 }
Pawel Zarembski 0:6a2a480672be 68
Pawel Zarembski 1:c3a5d3a0b437 69 _parser->flush();
Pawel Zarembski 1:c3a5d3a0b437 70 // if there is no error, repeat to save data
Pawel Zarembski 1:c3a5d3a0b437 71 _parser->send((char*)"AT+QGPSLOC=2");
Pawel Zarembski 1:c3a5d3a0b437 72 ok = _parser->recv("+QGPSLOC: ");
Pawel Zarembski 1:c3a5d3a0b437 73 if (ok) {
Pawel Zarembski 1:c3a5d3a0b437 74 _parser->recv("%s\r\n", _buf);
Pawel Zarembski 1:c3a5d3a0b437 75 sscanf(_buf,"%f,%f,%f,%f,%f,%d,%f,%f,%f,%6s,%d",
Pawel Zarembski 1:c3a5d3a0b437 76 &data->utc, &data->lat, &data->lon, &data->hdop,
Pawel Zarembski 1:c3a5d3a0b437 77 &data->altitude, &data->fix, &data->cog,
Pawel Zarembski 1:c3a5d3a0b437 78 &data->spkm, &data->spkn, data->date, &data->nsat);
Pawel Zarembski 1:c3a5d3a0b437 79 ok = _parser->recv("OK");
Pawel Zarembski 0:6a2a480672be 80 return SUCCESS;
Pawel Zarembski 0:6a2a480672be 81 }
Pawel Zarembski 1:c3a5d3a0b437 82 else {
Pawel Zarembski 1:c3a5d3a0b437 83 return FAILURE;
Pawel Zarembski 1:c3a5d3a0b437 84 }
Pawel Zarembski 1:c3a5d3a0b437 85 }