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