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)
Diff: BG96_GNSS.cpp
- Revision:
- 0:6a2a480672be
- Child:
- 1:c3a5d3a0b437
diff -r 000000000000 -r 6a2a480672be BG96_GNSS.cpp --- /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