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:
Sandra Schmidt
Date:
Tue Nov 10 14:45:23 2020 +0100
Revision:
4:8c7cf672e009
Parent:
3:98d27fc2eed5
Add information about possible error source

Who changed what in which revision?

UserRevisionLine numberNew 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 0:6a2a480672be 7 }
Pawel Zarembski 0:6a2a480672be 8
Pawel Zarembski 2:8b0663001935 9 uint8_t BG96_GNSS::set_gps_power(bool state)
Pawel Zarembski 2:8b0663001935 10 {
Pawel Zarembski 2:8b0663001935 11 char _at_cmd[16];
Pawel Zarembski 2:8b0663001935 12 uint8_t status = SUCCESS;
Pawel Zarembski 2:8b0663001935 13
Sandra Schmidt 3:98d27fc2eed5 14 sprintf((char *)_at_cmd, "%s", state ? "AT+QGPS=1" : "AT+QGPSEND");
Sandra Schmidt 3:98d27fc2eed5 15 _bg96_at_handler->lock();
Sandra Schmidt 3:98d27fc2eed5 16 _bg96_at_handler->cmd_start(_at_cmd);
Sandra Schmidt 3:98d27fc2eed5 17 _bg96_at_handler->cmd_stop_read_resp();
Sandra Schmidt 3:98d27fc2eed5 18 if (_bg96_at_handler->get_last_error() != NSAPI_ERROR_OK) {
Sandra Schmidt 3:98d27fc2eed5 19 printf("[GPS] Failure while trying to change BG96 power.\r\n");
Pawel Zarembski 2:8b0663001935 20 status = FAILURE;
Sandra Schmidt 3:98d27fc2eed5 21 }
Sandra Schmidt 3:98d27fc2eed5 22 printf("[GPS] Powered ON the GPS module.\r\n");
Sandra Schmidt 3:98d27fc2eed5 23 _bg96_at_handler->unlock();
Sandra Schmidt 3:98d27fc2eed5 24
Pawel Zarembski 2:8b0663001935 25 return status;
Pawel Zarembski 2:8b0663001935 26 }
Pawel Zarembski 2:8b0663001935 27
Pawel Zarembski 2:8b0663001935 28 uint8_t BG96_GNSS::get_gps_data(gps_data *data)
Pawel Zarembski 0:6a2a480672be 29 {
Pawel Zarembski 2:8b0663001935 30 uint8_t status = SUCCESS;
Pawel Zarembski 2:8b0663001935 31
Sandra Schmidt 3:98d27fc2eed5 32 _bg96_at_handler->lock();
Sandra Schmidt 3:98d27fc2eed5 33 _bg96_at_handler->cmd_start("AT+QGPSLOC=2");
Sandra Schmidt 3:98d27fc2eed5 34 _bg96_at_handler->cmd_stop();
Pawel Zarembski 0:6a2a480672be 35
Sandra Schmidt 3:98d27fc2eed5 36 if (_bg96_at_handler->get_last_error() == NSAPI_ERROR_DEVICE_ERROR) {
Sandra Schmidt 3:98d27fc2eed5 37 printf("[GPS] Error while trying to get GPS data.\r\n");
Sandra Schmidt 3:98d27fc2eed5 38 status = FAILURE;
Sandra Schmidt 3:98d27fc2eed5 39 }
Sandra Schmidt 3:98d27fc2eed5 40 else {
Sandra Schmidt 3:98d27fc2eed5 41 _bg96_at_handler->set_stop_tag("OK");
Sandra Schmidt 3:98d27fc2eed5 42 _bg96_at_handler->resp_start();
Sandra Schmidt 3:98d27fc2eed5 43 if (_read_gps(data) == FAILURE) {
Sandra Schmidt 3:98d27fc2eed5 44 printf("[GPS] Error while trying to read GPS data.\r\n");
Sandra Schmidt 4:8c7cf672e009 45 printf("[GPS] Ensure that GPS antenna is plugged in.\r\n");
Pawel Zarembski 2:8b0663001935 46 status = FAILURE;
Pawel Zarembski 2:8b0663001935 47 }
Sandra Schmidt 3:98d27fc2eed5 48 _bg96_at_handler->resp_stop();
Pawel Zarembski 2:8b0663001935 49 }
Sandra Schmidt 3:98d27fc2eed5 50 _bg96_at_handler->unlock();
Sandra Schmidt 3:98d27fc2eed5 51
Pawel Zarembski 2:8b0663001935 52 return status;
Pawel Zarembski 2:8b0663001935 53 }
Pawel Zarembski 2:8b0663001935 54
Pawel Zarembski 2:8b0663001935 55 uint8_t BG96_GNSS::_read_gps(gps_data *data)
Pawel Zarembski 2:8b0663001935 56 {
Pawel Zarembski 2:8b0663001935 57 ssize_t bg96_read_size;
Pawel Zarembski 2:8b0663001935 58 uint8_t status = SUCCESS;
Pawel Zarembski 2:8b0663001935 59
Sandra Schmidt 3:98d27fc2eed5 60 bg96_read_size = _bg96_at_handler->read_string(data->utc, sizeof(data->utc)); // header
Pawel Zarembski 2:8b0663001935 61 if (bg96_read_size == -1) {
Pawel Zarembski 2:8b0663001935 62 status = FAILURE;
Pawel Zarembski 2:8b0663001935 63 }
Pawel Zarembski 2:8b0663001935 64 else {
Pawel Zarembski 2:8b0663001935 65 // bg96_read_size = _bg96_instance->read_string(data->utc, sizeof(data->utc)); // time
Sandra Schmidt 3:98d27fc2eed5 66 bg96_read_size = _bg96_at_handler->read_string(data->lat, sizeof(data->lat)); // lat
Sandra Schmidt 3:98d27fc2eed5 67 bg96_read_size = _bg96_at_handler->read_string(data->lon, sizeof(data->lon)); // lon
Sandra Schmidt 3:98d27fc2eed5 68 bg96_read_size = _bg96_at_handler->read_string(data->hdop, sizeof(data->hdop)); // hdop
Sandra Schmidt 3:98d27fc2eed5 69 bg96_read_size = _bg96_at_handler->read_string(data->altitude, sizeof(data->altitude)); // altitude
Sandra Schmidt 3:98d27fc2eed5 70 bg96_read_size = _bg96_at_handler->read_string(data->fix, sizeof(data->fix)); // fix
Sandra Schmidt 3:98d27fc2eed5 71 bg96_read_size = _bg96_at_handler->read_string(data->cog, sizeof(data->cog)); // cog
Sandra Schmidt 3:98d27fc2eed5 72 bg96_read_size = _bg96_at_handler->read_string(data->spkm, sizeof(data->spkm)); // spkm
Sandra Schmidt 3:98d27fc2eed5 73 bg96_read_size = _bg96_at_handler->read_string(data->spkn, sizeof(data->spkn)); // spkn
Sandra Schmidt 3:98d27fc2eed5 74 bg96_read_size = _bg96_at_handler->read_string(data->date, sizeof(data->date)); // date
Sandra Schmidt 3:98d27fc2eed5 75 bg96_read_size = _bg96_at_handler->read_string(data->nsat, sizeof(data->nsat)); // nsat
Pawel Zarembski 0:6a2a480672be 76 }
Pawel Zarembski 0:6a2a480672be 77
Pawel Zarembski 2:8b0663001935 78 return status;
Pawel Zarembski 1:c3a5d3a0b437 79 }
Pawel Zarembski 2:8b0663001935 80
Pawel Zarembski 2:8b0663001935 81 void BG96_GNSS::print_gps_data(gps_data *data)
Pawel Zarembski 2:8b0663001935 82 {
Pawel Zarembski 2:8b0663001935 83 printf("[GPS] Time: \tUTC:%s\r\n", data->utc);
Pawel Zarembski 2:8b0663001935 84 printf("[GPS] Latitude: \tLAT:%s\r\n", data->lat);
Pawel Zarembski 2:8b0663001935 85 printf("[GPS] Longitude: \tLON:%s\r\n", data->lon);
Pawel Zarembski 2:8b0663001935 86 printf("[GPS] Horizontal: \tHDOP:%s\r\n", data->hdop);
Pawel Zarembski 2:8b0663001935 87 printf("[GPS] Altitude: \tALT:%s\r\n", data->altitude);
Pawel Zarembski 2:8b0663001935 88 printf("[GPS] Positioning: \tFIX:%s\r\n", data->fix);
Pawel Zarembski 2:8b0663001935 89 printf("[GPS] Course over time: COG:%s\r\n", data->cog);
Pawel Zarembski 2:8b0663001935 90 printf("[GPS] Speed km: \tSPKM:%s\r\n", data->spkm);
Pawel Zarembski 2:8b0663001935 91 printf("[GPS] Speed knots: \tSPKN:%s\r\n", data->spkn);
Pawel Zarembski 2:8b0663001935 92 printf("[GPS] Date: \t\tDATE:%s\r\n", data->date);
Pawel Zarembski 2:8b0663001935 93 printf("[GPS] Satelites: \tNSAT:%s\r\n", data->nsat);
Pawel Zarembski 2:8b0663001935 94 }