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@2:8b0663001935, 2020-03-03 (annotated)
- Committer:
- Pawel Zarembski
- Date:
- Tue Mar 03 14:27:09 2020 +0100
- Revision:
- 2:8b0663001935
- Parent:
- 1:c3a5d3a0b437
- Child:
- 3:98d27fc2eed5
redo for interfacing with cellular device, without blocking
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 |
1:c3a5d3a0b437 | 3 | BG96_GNSS::BG96_GNSS() |
Pawel Zarembski |
0:6a2a480672be | 4 | { |
Pawel Zarembski |
2:8b0663001935 | 5 | _bg96_at_handler = CellularContext::get_default_instance()->get_device()->get_at_handler(); |
Pawel Zarembski |
2:8b0663001935 | 6 | printf("[GPS] Created BG96 Object with AT HANDLER ADDR[%p].\r\n", _bg96_at_handler); |
Pawel Zarembski |
2:8b0663001935 | 7 | _bg96_instance = NULL; |
Pawel Zarembski |
0:6a2a480672be | 8 | } |
Pawel Zarembski |
0:6a2a480672be | 9 | |
Pawel Zarembski |
2:8b0663001935 | 10 | uint8_t BG96_GNSS::_get_instance() |
Pawel Zarembski |
2:8b0663001935 | 11 | { |
Pawel Zarembski |
2:8b0663001935 | 12 | if (_bg96_instance == NULL) { |
Pawel Zarembski |
2:8b0663001935 | 13 | _bg96_instance = _bg96_at_handler->get_instance(_bg96_at_handler->get_file_handle(), |
Pawel Zarembski |
2:8b0663001935 | 14 | *_dummy_eventqueue, 1000, "\r\n", 100, false); |
Pawel Zarembski |
2:8b0663001935 | 15 | return SUCCESS; |
Pawel Zarembski |
0:6a2a480672be | 16 | } |
Pawel Zarembski |
2:8b0663001935 | 17 | else { |
Pawel Zarembski |
2:8b0663001935 | 18 | printf("[GPS] Failed while creating BG96 instance.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 19 | return FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 20 | } |
Pawel Zarembski |
0:6a2a480672be | 21 | } |
Pawel Zarembski |
0:6a2a480672be | 22 | |
Pawel Zarembski |
2:8b0663001935 | 23 | uint8_t BG96_GNSS::_close_instance() |
Pawel Zarembski |
0:6a2a480672be | 24 | { |
Pawel Zarembski |
2:8b0663001935 | 25 | if (_bg96_instance != NULL) { |
Pawel Zarembski |
2:8b0663001935 | 26 | _bg96_instance->close(); |
Pawel Zarembski |
2:8b0663001935 | 27 | _bg96_instance = NULL; |
Pawel Zarembski |
2:8b0663001935 | 28 | printf("[GPS] Closed BG96 instance.\r\n"); |
Pawel Zarembski |
0:6a2a480672be | 29 | return SUCCESS; |
Pawel Zarembski |
2:8b0663001935 | 30 | } |
Pawel Zarembski |
0:6a2a480672be | 31 | else { |
Pawel Zarembski |
2:8b0663001935 | 32 | printf("[GPS] Failed while closing BG96 instance.\r\n"); |
Pawel Zarembski |
0:6a2a480672be | 33 | return FAILURE; |
Pawel Zarembski |
1:c3a5d3a0b437 | 34 | } |
Pawel Zarembski |
0:6a2a480672be | 35 | } |
Pawel Zarembski |
0:6a2a480672be | 36 | |
Pawel Zarembski |
2:8b0663001935 | 37 | uint8_t BG96_GNSS::set_gps_power(bool state) |
Pawel Zarembski |
2:8b0663001935 | 38 | { |
Pawel Zarembski |
2:8b0663001935 | 39 | char _at_cmd[16]; |
Pawel Zarembski |
2:8b0663001935 | 40 | uint8_t status = SUCCESS; |
Pawel Zarembski |
2:8b0663001935 | 41 | |
Pawel Zarembski |
2:8b0663001935 | 42 | if (_get_instance() == SUCCESS) { |
Pawel Zarembski |
2:8b0663001935 | 43 | sprintf((char *)_at_cmd, "%s", state ? "AT+QGPS=1" : "AT+QGPSEND"); |
Pawel Zarembski |
2:8b0663001935 | 44 | _bg96_instance->lock(); |
Pawel Zarembski |
2:8b0663001935 | 45 | _bg96_instance->cmd_start(_at_cmd); |
Pawel Zarembski |
2:8b0663001935 | 46 | _bg96_instance->cmd_stop_read_resp(); |
Pawel Zarembski |
2:8b0663001935 | 47 | if (_bg96_instance->get_last_error() != NSAPI_ERROR_OK) { |
Pawel Zarembski |
2:8b0663001935 | 48 | printf("[GPS] Failure while trying to change BG96 power.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 49 | status = FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 50 | } |
Pawel Zarembski |
2:8b0663001935 | 51 | printf("[GPS] Powered ON the GPS module.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 52 | _bg96_instance->unlock(); |
Pawel Zarembski |
2:8b0663001935 | 53 | _close_instance(); |
Pawel Zarembski |
2:8b0663001935 | 54 | } |
Pawel Zarembski |
2:8b0663001935 | 55 | else { |
Pawel Zarembski |
2:8b0663001935 | 56 | printf("[GPS] Failure while trying to get BG96 AT instance.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 57 | status = FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 58 | } |
Pawel Zarembski |
2:8b0663001935 | 59 | return status; |
Pawel Zarembski |
2:8b0663001935 | 60 | } |
Pawel Zarembski |
2:8b0663001935 | 61 | |
Pawel Zarembski |
2:8b0663001935 | 62 | uint8_t BG96_GNSS::get_gps_data(gps_data *data) |
Pawel Zarembski |
0:6a2a480672be | 63 | { |
Pawel Zarembski |
2:8b0663001935 | 64 | uint8_t status = SUCCESS; |
Pawel Zarembski |
2:8b0663001935 | 65 | |
Pawel Zarembski |
2:8b0663001935 | 66 | if (_get_instance() == SUCCESS) { |
Pawel Zarembski |
2:8b0663001935 | 67 | _bg96_instance->lock(); |
Pawel Zarembski |
2:8b0663001935 | 68 | _bg96_instance->cmd_start("AT+QGPSLOC=2"); |
Pawel Zarembski |
2:8b0663001935 | 69 | _bg96_instance->cmd_stop(); |
Pawel Zarembski |
0:6a2a480672be | 70 | |
Pawel Zarembski |
2:8b0663001935 | 71 | if (_bg96_instance->get_last_error() == NSAPI_ERROR_DEVICE_ERROR) { |
Pawel Zarembski |
2:8b0663001935 | 72 | printf("[GPS] Error while trying to get GPS data.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 73 | status = FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 74 | } |
Pawel Zarembski |
2:8b0663001935 | 75 | else { |
Pawel Zarembski |
2:8b0663001935 | 76 | _bg96_instance->set_stop_tag("OK"); |
Pawel Zarembski |
2:8b0663001935 | 77 | _bg96_instance->resp_start(); |
Pawel Zarembski |
2:8b0663001935 | 78 | if (_read_gps(data) == FAILURE) { |
Pawel Zarembski |
2:8b0663001935 | 79 | printf("[GPS] Error while trying to read GPS data.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 80 | status = FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 81 | } |
Pawel Zarembski |
2:8b0663001935 | 82 | _bg96_instance->resp_stop(); |
Pawel Zarembski |
2:8b0663001935 | 83 | } |
Pawel Zarembski |
2:8b0663001935 | 84 | _bg96_instance->unlock(); |
Pawel Zarembski |
2:8b0663001935 | 85 | _close_instance(); |
Pawel Zarembski |
2:8b0663001935 | 86 | } |
Pawel Zarembski |
2:8b0663001935 | 87 | else { |
Pawel Zarembski |
2:8b0663001935 | 88 | printf("[GPS] Failure while trying to get BG96 AT instance.\r\n"); |
Pawel Zarembski |
2:8b0663001935 | 89 | status = FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 90 | } |
Pawel Zarembski |
2:8b0663001935 | 91 | return status; |
Pawel Zarembski |
2:8b0663001935 | 92 | } |
Pawel Zarembski |
2:8b0663001935 | 93 | |
Pawel Zarembski |
2:8b0663001935 | 94 | uint8_t BG96_GNSS::_read_gps(gps_data *data) |
Pawel Zarembski |
2:8b0663001935 | 95 | { |
Pawel Zarembski |
2:8b0663001935 | 96 | ssize_t bg96_read_size; |
Pawel Zarembski |
2:8b0663001935 | 97 | uint8_t status = SUCCESS; |
Pawel Zarembski |
2:8b0663001935 | 98 | |
Pawel Zarembski |
2:8b0663001935 | 99 | bg96_read_size = _bg96_instance->read_string(data->utc, sizeof(data->utc)); // header |
Pawel Zarembski |
2:8b0663001935 | 100 | if (bg96_read_size == -1) { |
Pawel Zarembski |
2:8b0663001935 | 101 | status = FAILURE; |
Pawel Zarembski |
2:8b0663001935 | 102 | } |
Pawel Zarembski |
2:8b0663001935 | 103 | else { |
Pawel Zarembski |
2:8b0663001935 | 104 | // bg96_read_size = _bg96_instance->read_string(data->utc, sizeof(data->utc)); // time |
Pawel Zarembski |
2:8b0663001935 | 105 | bg96_read_size = _bg96_instance->read_string(data->lat, sizeof(data->lat)); // lat |
Pawel Zarembski |
2:8b0663001935 | 106 | bg96_read_size = _bg96_instance->read_string(data->lon, sizeof(data->lon)); // lon |
Pawel Zarembski |
2:8b0663001935 | 107 | bg96_read_size = _bg96_instance->read_string(data->hdop, sizeof(data->hdop)); // hdop |
Pawel Zarembski |
2:8b0663001935 | 108 | bg96_read_size = _bg96_instance->read_string(data->altitude, sizeof(data->altitude)); // altitude |
Pawel Zarembski |
2:8b0663001935 | 109 | bg96_read_size = _bg96_instance->read_string(data->fix, sizeof(data->fix)); // fix |
Pawel Zarembski |
2:8b0663001935 | 110 | bg96_read_size = _bg96_instance->read_string(data->cog, sizeof(data->cog)); // cog |
Pawel Zarembski |
2:8b0663001935 | 111 | bg96_read_size = _bg96_instance->read_string(data->spkm, sizeof(data->spkm)); // spkm |
Pawel Zarembski |
2:8b0663001935 | 112 | bg96_read_size = _bg96_instance->read_string(data->spkn, sizeof(data->spkn)); // spkn |
Pawel Zarembski |
2:8b0663001935 | 113 | bg96_read_size = _bg96_instance->read_string(data->date, sizeof(data->date)); // date |
Pawel Zarembski |
2:8b0663001935 | 114 | bg96_read_size = _bg96_instance->read_string(data->nsat, sizeof(data->nsat)); // nsat |
Pawel Zarembski |
0:6a2a480672be | 115 | } |
Pawel Zarembski |
0:6a2a480672be | 116 | |
Pawel Zarembski |
2:8b0663001935 | 117 | return status; |
Pawel Zarembski |
1:c3a5d3a0b437 | 118 | } |
Pawel Zarembski |
2:8b0663001935 | 119 | |
Pawel Zarembski |
2:8b0663001935 | 120 | void BG96_GNSS::print_gps_data(gps_data *data) |
Pawel Zarembski |
2:8b0663001935 | 121 | { |
Pawel Zarembski |
2:8b0663001935 | 122 | printf("[GPS] Time: \tUTC:%s\r\n", data->utc); |
Pawel Zarembski |
2:8b0663001935 | 123 | printf("[GPS] Latitude: \tLAT:%s\r\n", data->lat); |
Pawel Zarembski |
2:8b0663001935 | 124 | printf("[GPS] Longitude: \tLON:%s\r\n", data->lon); |
Pawel Zarembski |
2:8b0663001935 | 125 | printf("[GPS] Horizontal: \tHDOP:%s\r\n", data->hdop); |
Pawel Zarembski |
2:8b0663001935 | 126 | printf("[GPS] Altitude: \tALT:%s\r\n", data->altitude); |
Pawel Zarembski |
2:8b0663001935 | 127 | printf("[GPS] Positioning: \tFIX:%s\r\n", data->fix); |
Pawel Zarembski |
2:8b0663001935 | 128 | printf("[GPS] Course over time: COG:%s\r\n", data->cog); |
Pawel Zarembski |
2:8b0663001935 | 129 | printf("[GPS] Speed km: \tSPKM:%s\r\n", data->spkm); |
Pawel Zarembski |
2:8b0663001935 | 130 | printf("[GPS] Speed knots: \tSPKN:%s\r\n", data->spkn); |
Pawel Zarembski |
2:8b0663001935 | 131 | printf("[GPS] Date: \t\tDATE:%s\r\n", data->date); |
Pawel Zarembski |
2:8b0663001935 | 132 | printf("[GPS] Satelites: \tNSAT:%s\r\n", data->nsat); |
Pawel Zarembski |
2:8b0663001935 | 133 | } |