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@0:6a2a480672be, 2020-02-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |