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:
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?

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 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 }