GPSProvider wrapper library for STMicroelectronics' X-NUCLEO-GNSS1A1 Expansion Board.

Dependents:   TeseoLocation

X_NUCLEO_GNSS1A1 Library

GPS_Provider wrapper library for STMicroelectronics' X-NUCLEO-GNSS1A1 component.

Overview

This library includes drivers for ST’s Teseo-LIV3F Global Navigation Satellite System (GNSS) device and middleware for the NMEA protocol support. This firmware package implements the port of the GPS_Provider to STMicroelectronics' X-NUCLEO-GNSS1A1 GNSS Expansion Board.

The key features of the library are:

  • Complete software to build applications using Teseo-LIV3F GNSS device
  • Middleware for the NMEA protocol support

Furthermore the library provides the following advanced features:

  • Geofencing - allows the Teseo-LIV3F receiver to raise a NMEA message when the resolved GNSS position is close to or entering or exiting from a specific circle
  • Odometer - provides information on the traveled distance using only the resolved GNSS position
  • Data Logging - allows the Teseo-LIV3F receiver to save locally on the flash the resolved GNSS position to be retrieved on demand from the Host

Hardware description

The X-NUCLEO-GNSS1A1 is a Global Navigation Satellite System Expansion Board usable with the STM32 Nucleo system and other Arduino compatible platforms. It is designed around the STMicroelectronics Teseo-LIV3F GNSS receiver IC working on multiple constellations (GPS/Galileo/Glonass/BeiDou/QZSS).

The Teseo-LIV3F module is designed for top performance in a minimal space. Within its 10x10mm compact size, Teseo-LIV3F offers superior accuracy thanks to the on board 26MHz Temperature Compensated Crystal Oscillator (TCXO) and a reduced Time To First Fix (TTFF) relying to its dedicated 32KHz Real Time Clock (RTC) oscillator.

The X-NUCLEO-GNSS1A1, hosting the Teseo-LIV3F, is compatible with Arduino UNO R3 connector layout and interfaces with the MCU via the UART channel. To connect by serial port the GNSS receiver and the host the following parameters must be used:

  • 8 data bits
  • No parity
  • 1 stop bit
  • 9600 bauds

A GPS/GLONASS/Beidou antenna, distributed along with the X-NUCLEO-GNSS1A1 Expansion Board, must be connected to the antenna connector present on the Expansion Board. For the X-NUCLEO-GNSS1A1 proper operations, the following jumper settings must be used:

  • J2 open
  • J3 closed
  • J4 closed
  • J5 open
  • J6 closed
  • J7 closed
  • J8 open
  • J9 closed
  • J10 open
  • J11 closed
  • J12 closed
  • J13 closed
  • J14 closed
  • J15 closed

Tested platforms

This firmware has been tested on STM32 NUCLEO-F401RE

Example Application

To run GNSS example applications using X-NUCLEO-GNSS1A1 Expansion Board based on mbed OS, please refer to TeseoLocation page.

Committer:
apalmieri
Date:
Thu Jan 14 09:29:14 2021 +0000
Revision:
5:1fe1ba1f0013
Parent:
3:2d568ec8da14
Get GNSS library aligned with mbed-os-6.6.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
apalmieri 0:a77f1f1f8318 1 /**
apalmieri 0:a77f1f1f8318 2 *******************************************************************************
apalmieri 0:a77f1f1f8318 3 * @file Teseo.h
apalmieri 0:a77f1f1f8318 4 * @author AST / Central Lab
apalmieri 0:a77f1f1f8318 5 * @version V1.0.0
apalmieri 0:a77f1f1f8318 6 * @date May-2017
apalmieri 0:a77f1f1f8318 7 * @brief Teseo Location Class
apalmieri 0:a77f1f1f8318 8 *
apalmieri 0:a77f1f1f8318 9 *******************************************************************************
apalmieri 0:a77f1f1f8318 10 * @attention
apalmieri 0:a77f1f1f8318 11 *
apalmieri 0:a77f1f1f8318 12 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
apalmieri 0:a77f1f1f8318 13 *
apalmieri 0:a77f1f1f8318 14 * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
apalmieri 0:a77f1f1f8318 15 * You may not use this file except in compliance with the License.
apalmieri 0:a77f1f1f8318 16 * You may obtain a copy of the License at:
apalmieri 0:a77f1f1f8318 17 *
apalmieri 0:a77f1f1f8318 18 * http://www.st.com/software_license_agreement_liberty_v2
apalmieri 0:a77f1f1f8318 19 *
apalmieri 0:a77f1f1f8318 20 * Redistribution and use in source and binary forms, with or without modification,
apalmieri 0:a77f1f1f8318 21 * are permitted provided that the following conditions are met:
apalmieri 0:a77f1f1f8318 22 * 1. Redistributions of source code must retain the above copyright notice,
apalmieri 0:a77f1f1f8318 23 * this list of conditions and the following disclaimer.
apalmieri 0:a77f1f1f8318 24 * 2. Redistributions in binary form must reproduce the above copyright notice,
apalmieri 0:a77f1f1f8318 25 * this list of conditions and the following disclaimer in the documentation
apalmieri 0:a77f1f1f8318 26 * and/or other materials provided with the distribution.
apalmieri 0:a77f1f1f8318 27 * 3. Neither the name of STMicroelectronics nor the names of its contributors
apalmieri 0:a77f1f1f8318 28 * may be used to endorse or promote products derived from this software
apalmieri 0:a77f1f1f8318 29 * without specific prior written permission.
apalmieri 0:a77f1f1f8318 30 *
apalmieri 0:a77f1f1f8318 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
apalmieri 0:a77f1f1f8318 32 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
apalmieri 0:a77f1f1f8318 33 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
apalmieri 0:a77f1f1f8318 34 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
apalmieri 0:a77f1f1f8318 35 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
apalmieri 0:a77f1f1f8318 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
apalmieri 0:a77f1f1f8318 37 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
apalmieri 0:a77f1f1f8318 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
apalmieri 0:a77f1f1f8318 39 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
apalmieri 0:a77f1f1f8318 40 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
apalmieri 0:a77f1f1f8318 41 *
apalmieri 0:a77f1f1f8318 42 ********************************************************************************
apalmieri 0:a77f1f1f8318 43 */
apalmieri 0:a77f1f1f8318 44
apalmieri 0:a77f1f1f8318 45 #include "Teseo.h"
apalmieri 0:a77f1f1f8318 46
apalmieri 5:1fe1ba1f0013 47 #if MBED_CONF_TESEO_TRACE_ENABLED == 1
apalmieri 5:1fe1ba1f0013 48 #define TESEO_LOG_INFO(...) printf(__VA_ARGS__)
apalmieri 5:1fe1ba1f0013 49 #endif
apalmieri 5:1fe1ba1f0013 50
apalmieri 0:a77f1f1f8318 51 static char TESEO_NAME[] = "Teseo-LIV3F";
apalmieri 0:a77f1f1f8318 52 /*
apalmieri 0:a77f1f1f8318 53 static char _OK[] = "OK";
apalmieri 0:a77f1f1f8318 54 static char _Failed[] = "Failed";
apalmieri 0:a77f1f1f8318 55 */
apalmieri 0:a77f1f1f8318 56
apalmieri 0:a77f1f1f8318 57 struct teseoCmd {
apalmieri 0:a77f1f1f8318 58 char *cmd;
apalmieri 0:a77f1f1f8318 59 };
apalmieri 0:a77f1f1f8318 60
apalmieri 0:a77f1f1f8318 61 static struct teseoCmd teseoCmds[] = {
apalmieri 0:a77f1f1f8318 62 [Teseo::TEST] = {
apalmieri 0:a77f1f1f8318 63 .cmd = (char*)"$\n\r",
apalmieri 0:a77f1f1f8318 64 },
apalmieri 0:a77f1f1f8318 65 [Teseo::GETSWVER] = {
apalmieri 0:a77f1f1f8318 66 .cmd = (char*)"$PSTMGETSWVER,6\n\r",
apalmieri 0:a77f1f1f8318 67 },
apalmieri 0:a77f1f1f8318 68 [Teseo::FORCESTANDBY] = {
apalmieri 0:a77f1f1f8318 69 .cmd = (char*)"$PSTMFORCESTANDBY,00010\n\r",
apalmieri 0:a77f1f1f8318 70 },
apalmieri 0:a77f1f1f8318 71 [Teseo::RFTESTON] = {
apalmieri 0:a77f1f1f8318 72 .cmd = (char*)"$PSTMRFTESTON,16\n\r",
apalmieri 0:a77f1f1f8318 73 },
apalmieri 0:a77f1f1f8318 74 [Teseo::RFTESTOFF] = {
apalmieri 0:a77f1f1f8318 75 .cmd = (char*)"$PSTMRFTESTOFF\n\r",
apalmieri 0:a77f1f1f8318 76 },
apalmieri 0:a77f1f1f8318 77 [Teseo::LOWPOWER] = {
apalmieri 0:a77f1f1f8318 78 .cmd = (char*)"$PSTMLOWPOWERONOFF,1,0,000,05,0,1,000,1,00010,01,0,0,1,01\n\r",
apalmieri 0:a77f1f1f8318 79 },
apalmieri 0:a77f1f1f8318 80 [Teseo::FWUPDATE] = {
apalmieri 0:a77f1f1f8318 81 .cmd = (char*)"$PSTMFWUPGRADE\n\r",
apalmieri 0:a77f1f1f8318 82 }
apalmieri 0:a77f1f1f8318 83 };
apalmieri 0:a77f1f1f8318 84
apalmieri 0:a77f1f1f8318 85 Teseo::Teseo(PinName resetPin,
apalmieri 0:a77f1f1f8318 86 PinName wakeupPin,
apalmieri 0:a77f1f1f8318 87 PinName ppsPin,
apalmieri 0:a77f1f1f8318 88 PinName uartTxPin,
apalmieri 5:1fe1ba1f0013 89 PinName uartRxPin):
apalmieri 0:a77f1f1f8318 90 _loc_led2(LOC_LED2),
apalmieri 0:a77f1f1f8318 91 _reset(resetPin, 1),
apalmieri 0:a77f1f1f8318 92 _pps(ppsPin),
apalmieri 0:a77f1f1f8318 93 _wakeup(wakeupPin, 0),
apalmieri 0:a77f1f1f8318 94 _uartRx(uartRxPin),
apalmieri 5:1fe1ba1f0013 95 _uartTx(uartTxPin)
apalmieri 0:a77f1f1f8318 96 {
apalmieri 5:1fe1ba1f0013 97 wait_us(POWERON_STABLE_SIGNAL_DELAY_MS*1000);
apalmieri 0:a77f1f1f8318 98 _uart = NULL;
apalmieri 0:a77f1f1f8318 99 _i2c = NULL;
apalmieri 0:a77f1f1f8318 100
apalmieri 0:a77f1f1f8318 101 _locState = TESEO_LOC_STATE_IDLE;
apalmieri 0:a77f1f1f8318 102
apalmieri 0:a77f1f1f8318 103 deviceInfo = TESEO_NAME;
apalmieri 0:a77f1f1f8318 104 }
apalmieri 0:a77f1f1f8318 105
apalmieri 0:a77f1f1f8318 106 Teseo::Teseo(PinName resetPin,
apalmieri 0:a77f1f1f8318 107 PinName wakeupPin,
apalmieri 0:a77f1f1f8318 108 PinName ppsPin,
apalmieri 0:a77f1f1f8318 109 PinName uartTxPin,
apalmieri 0:a77f1f1f8318 110 PinName uartRxPin,
apalmieri 5:1fe1ba1f0013 111 I2C *i2cBus):
apalmieri 0:a77f1f1f8318 112 _loc_led2(LOC_LED2),
apalmieri 0:a77f1f1f8318 113 _reset(resetPin, 1),
apalmieri 0:a77f1f1f8318 114 _pps(ppsPin),
apalmieri 0:a77f1f1f8318 115 _wakeup(wakeupPin, 0),
apalmieri 0:a77f1f1f8318 116 _uartRx(uartRxPin),
apalmieri 0:a77f1f1f8318 117 _uartTx(uartTxPin),
apalmieri 0:a77f1f1f8318 118 _i2c(i2cBus)
apalmieri 0:a77f1f1f8318 119 {
apalmieri 5:1fe1ba1f0013 120 wait_us(POWERON_STABLE_SIGNAL_DELAY_MS*1000);
apalmieri 0:a77f1f1f8318 121 _uart = NULL;
apalmieri 0:a77f1f1f8318 122
apalmieri 0:a77f1f1f8318 123 _locState = TESEO_LOC_STATE_IDLE;
apalmieri 0:a77f1f1f8318 124
apalmieri 0:a77f1f1f8318 125 deviceInfo = TESEO_NAME;
apalmieri 0:a77f1f1f8318 126 }
apalmieri 0:a77f1f1f8318 127
apalmieri 0:a77f1f1f8318 128 void
apalmieri 0:a77f1f1f8318 129 Teseo::TeseoLocRegOutput(teseo_app_output_callback app_output_cb, teseo_app_event_callback app_event_cb)
apalmieri 0:a77f1f1f8318 130 {
apalmieri 0:a77f1f1f8318 131 appOutCb = app_output_cb;
apalmieri 0:a77f1f1f8318 132 appEventCb = app_event_cb;
apalmieri 0:a77f1f1f8318 133 }
apalmieri 0:a77f1f1f8318 134
apalmieri 0:a77f1f1f8318 135 int
apalmieri 0:a77f1f1f8318 136 Teseo::EnableLowPower()
apalmieri 0:a77f1f1f8318 137 {
apalmieri 0:a77f1f1f8318 138 SendCommand(LOWPOWER);
apalmieri 0:a77f1f1f8318 139 return 0;
apalmieri 0:a77f1f1f8318 140 }
apalmieri 0:a77f1f1f8318 141
apalmieri 0:a77f1f1f8318 142 void
apalmieri 5:1fe1ba1f0013 143 Teseo::_ResetFast(void)
apalmieri 0:a77f1f1f8318 144 {
apalmieri 5:1fe1ba1f0013 145 TESEO_LOG_INFO("%s: Resetting...", TESEO_NAME);
apalmieri 3:2d568ec8da14 146
apalmieri 0:a77f1f1f8318 147 _reset.write(0);
apalmieri 5:1fe1ba1f0013 148
apalmieri 5:1fe1ba1f0013 149 wait_us(5000);
apalmieri 0:a77f1f1f8318 150
apalmieri 0:a77f1f1f8318 151 _reset.write(1);
apalmieri 5:1fe1ba1f0013 152
apalmieri 5:1fe1ba1f0013 153 wait_us(70000);
apalmieri 5:1fe1ba1f0013 154
apalmieri 5:1fe1ba1f0013 155 TESEO_LOG_INFO("Done...\n\r");
apalmieri 0:a77f1f1f8318 156 }
apalmieri 0:a77f1f1f8318 157
apalmieri 0:a77f1f1f8318 158 void
apalmieri 5:1fe1ba1f0013 159 Teseo::_Reset(void)
apalmieri 0:a77f1f1f8318 160 {
apalmieri 5:1fe1ba1f0013 161 TESEO_LOG_INFO("%s: Resetting...", TESEO_NAME);
apalmieri 0:a77f1f1f8318 162
apalmieri 0:a77f1f1f8318 163 //_pps.output();
apalmieri 0:a77f1f1f8318 164 //_pps.write(0);
apalmieri 0:a77f1f1f8318 165
apalmieri 0:a77f1f1f8318 166 _reset.write(1);
apalmieri 0:a77f1f1f8318 167
apalmieri 5:1fe1ba1f0013 168 wait_us(500000); //500ms
apalmieri 0:a77f1f1f8318 169
apalmieri 0:a77f1f1f8318 170 _reset.write(0);
apalmieri 0:a77f1f1f8318 171 //_pps.write(0);
apalmieri 0:a77f1f1f8318 172
apalmieri 5:1fe1ba1f0013 173 wait_us(500000); //500ms
apalmieri 0:a77f1f1f8318 174
apalmieri 0:a77f1f1f8318 175 _reset.write(1);
apalmieri 5:1fe1ba1f0013 176
apalmieri 5:1fe1ba1f0013 177 TESEO_LOG_INFO("Done...\n\r");
apalmieri 5:1fe1ba1f0013 178
apalmieri 0:a77f1f1f8318 179 //_pps.write(1);
apalmieri 0:a77f1f1f8318 180
apalmieri 0:a77f1f1f8318 181 //wait_ms(1000);
apalmieri 0:a77f1f1f8318 182
apalmieri 0:a77f1f1f8318 183 //_pps.input();
apalmieri 0:a77f1f1f8318 184 }
apalmieri 0:a77f1f1f8318 185
apalmieri 0:a77f1f1f8318 186 void
apalmieri 0:a77f1f1f8318 187 Teseo::_SendString(char *buf, int len)
apalmieri 0:a77f1f1f8318 188 {
apalmieri 0:a77f1f1f8318 189 for (int i = 0; i < len; ++i) {
apalmieri 5:1fe1ba1f0013 190 while (!_uart->writable());
apalmieri 5:1fe1ba1f0013 191 _uart->write((const void *)&buf[i], 1);
apalmieri 0:a77f1f1f8318 192 }
apalmieri 0:a77f1f1f8318 193 }
apalmieri 0:a77f1f1f8318 194
apalmieri 0:a77f1f1f8318 195 int
apalmieri 0:a77f1f1f8318 196 Teseo::_WakeUp()
apalmieri 0:a77f1f1f8318 197 {
apalmieri 5:1fe1ba1f0013 198 wait_us(100000); //100ms
apalmieri 0:a77f1f1f8318 199
apalmieri 0:a77f1f1f8318 200 _wakeup.write(1);
apalmieri 0:a77f1f1f8318 201
apalmieri 5:1fe1ba1f0013 202 wait_us(500000); //500ms
apalmieri 0:a77f1f1f8318 203
apalmieri 0:a77f1f1f8318 204 _wakeup.write(0);
apalmieri 0:a77f1f1f8318 205
apalmieri 0:a77f1f1f8318 206 return 0;
apalmieri 0:a77f1f1f8318 207 }
apalmieri 0:a77f1f1f8318 208
apalmieri 0:a77f1f1f8318 209 int
apalmieri 0:a77f1f1f8318 210 Teseo::_CRC(char *buf, int size)
apalmieri 0:a77f1f1f8318 211 {
apalmieri 0:a77f1f1f8318 212 int i = 0, ch = 0;
apalmieri 0:a77f1f1f8318 213
apalmieri 0:a77f1f1f8318 214 if (buf[0] == '$') {
apalmieri 0:a77f1f1f8318 215 ++i;
apalmieri 0:a77f1f1f8318 216 }
apalmieri 0:a77f1f1f8318 217
apalmieri 0:a77f1f1f8318 218 if (size) {
apalmieri 0:a77f1f1f8318 219 for (; i < size; ++i) {
apalmieri 0:a77f1f1f8318 220 ch ^= buf[i];
apalmieri 0:a77f1f1f8318 221 }
apalmieri 0:a77f1f1f8318 222 } else {
apalmieri 0:a77f1f1f8318 223 for (; buf[i] != 0; ++i) {
apalmieri 0:a77f1f1f8318 224 ch ^= buf[i];
apalmieri 0:a77f1f1f8318 225 }
apalmieri 0:a77f1f1f8318 226 }
apalmieri 0:a77f1f1f8318 227
apalmieri 0:a77f1f1f8318 228 return ch;
apalmieri 0:a77f1f1f8318 229 }
apalmieri 0:a77f1f1f8318 230
apalmieri 0:a77f1f1f8318 231 void
apalmieri 0:a77f1f1f8318 232 Teseo::SendCommand(Teseo::eCmd c)
apalmieri 0:a77f1f1f8318 233 {
apalmieri 0:a77f1f1f8318 234 char crc[3];
apalmieri 0:a77f1f1f8318 235
apalmieri 5:1fe1ba1f0013 236 snprintf(crc, 3, "*%02X", _CRC(teseoCmds[c].cmd, -1));
apalmieri 0:a77f1f1f8318 237
apalmieri 0:a77f1f1f8318 238 _SendString(teseoCmds[c].cmd, strlen(teseoCmds[c].cmd));
apalmieri 0:a77f1f1f8318 239 _SendString(crc, 3);
apalmieri 0:a77f1f1f8318 240 }
apalmieri 0:a77f1f1f8318 241
apalmieri 0:a77f1f1f8318 242 void
apalmieri 0:a77f1f1f8318 243 Teseo::SendCommand(char *cmd)
apalmieri 0:a77f1f1f8318 244 {
apalmieri 0:a77f1f1f8318 245 char crc[5];
apalmieri 0:a77f1f1f8318 246
apalmieri 5:1fe1ba1f0013 247 snprintf(crc, 5, "*%02X\n\r", _CRC(cmd, strlen(cmd)));
apalmieri 0:a77f1f1f8318 248 //printf("CRC=%s\n\r", crc);
apalmieri 0:a77f1f1f8318 249
apalmieri 0:a77f1f1f8318 250 _SendString(cmd, strlen(cmd));
apalmieri 0:a77f1f1f8318 251 _SendString(crc, 5);
apalmieri 0:a77f1f1f8318 252 }
apalmieri 0:a77f1f1f8318 253
apalmieri 0:a77f1f1f8318 254 void
apalmieri 0:a77f1f1f8318 255 Teseo::ReadSentence(Teseo::eMsg msg)
apalmieri 0:a77f1f1f8318 256 {
apalmieri 5:1fe1ba1f0013 257 struct _teseoMsg *message;
apalmieri 0:a77f1f1f8318 258 eStatus status = TESEO_STATUS_FAILURE;
apalmieri 0:a77f1f1f8318 259
apalmieri 0:a77f1f1f8318 260 do {
apalmieri 5:1fe1ba1f0013 261 bool stat = queue.try_get_for(Kernel::wait_for_u32_forever, &message);
apalmieri 5:1fe1ba1f0013 262 if (stat == true) {
apalmieri 0:a77f1f1f8318 263 if (message->len > 0) {
apalmieri 0:a77f1f1f8318 264 status = _GetMsg(msg, message->buf);
apalmieri 0:a77f1f1f8318 265 }
apalmieri 0:a77f1f1f8318 266
apalmieri 0:a77f1f1f8318 267 mpool.free(message);
apalmieri 0:a77f1f1f8318 268 }
apalmieri 0:a77f1f1f8318 269 } while (status != TESEO_STATUS_SUCCESS);
apalmieri 0:a77f1f1f8318 270 }
apalmieri 0:a77f1f1f8318 271
apalmieri 0:a77f1f1f8318 272 void
apalmieri 0:a77f1f1f8318 273 Teseo::_InitUART(int br)
apalmieri 0:a77f1f1f8318 274 {
apalmieri 5:1fe1ba1f0013 275 _uart = new (std::nothrow) BufferedSerial(_uartRx, _uartTx);
apalmieri 5:1fe1ba1f0013 276 if(_uart == NULL) {
apalmieri 0:a77f1f1f8318 277 TESEO_LOG_INFO("Error allocating UART.\r\n");
apalmieri 0:a77f1f1f8318 278 }
apalmieri 0:a77f1f1f8318 279 }
apalmieri 0:a77f1f1f8318 280
apalmieri 0:a77f1f1f8318 281 bool
apalmieri 0:a77f1f1f8318 282 Teseo::setPowerMode(GPSProvider::PowerMode_t pwrMode)
apalmieri 0:a77f1f1f8318 283 {
apalmieri 5:1fe1ba1f0013 284 //TBI
apalmieri 0:a77f1f1f8318 285 return false;
apalmieri 0:a77f1f1f8318 286 }
apalmieri 0:a77f1f1f8318 287
apalmieri 0:a77f1f1f8318 288 void
apalmieri 0:a77f1f1f8318 289 Teseo::eventHandler(eTeseoLocEventType event, uint32_t data)
apalmieri 0:a77f1f1f8318 290 {
apalmieri 0:a77f1f1f8318 291 if (appEventCb) {
apalmieri 0:a77f1f1f8318 292 appEventCb(event, data);
apalmieri 0:a77f1f1f8318 293 }
apalmieri 0:a77f1f1f8318 294 }
apalmieri 0:a77f1f1f8318 295
apalmieri 0:a77f1f1f8318 296 void
apalmieri 0:a77f1f1f8318 297 Teseo::ReadProcess(void)
apalmieri 0:a77f1f1f8318 298 {
apalmieri 0:a77f1f1f8318 299 char c;
apalmieri 0:a77f1f1f8318 300
apalmieri 5:1fe1ba1f0013 301 struct _teseoMsg *msg = mpool.try_alloc();
apalmieri 0:a77f1f1f8318 302 msg->len = 0;
apalmieri 0:a77f1f1f8318 303
apalmieri 0:a77f1f1f8318 304 while(true) {
apalmieri 0:a77f1f1f8318 305 if (_uart->readable()) {
apalmieri 5:1fe1ba1f0013 306 _uart->read(&c, 1);
apalmieri 0:a77f1f1f8318 307
apalmieri 0:a77f1f1f8318 308 if (c == '$') {
apalmieri 5:1fe1ba1f0013 309 queue.try_put(msg);
apalmieri 5:1fe1ba1f0013 310 msg = mpool.try_alloc();
apalmieri 0:a77f1f1f8318 311 msg->len = 0;
apalmieri 0:a77f1f1f8318 312 }
apalmieri 0:a77f1f1f8318 313 msg->buf[msg->len++] = c;
apalmieri 0:a77f1f1f8318 314
apalmieri 0:a77f1f1f8318 315 } else {
apalmieri 5:1fe1ba1f0013 316 ThisThread::yield(); //wait_us(100); Allow other threads to run
apalmieri 0:a77f1f1f8318 317 }
apalmieri 0:a77f1f1f8318 318 }
apalmieri 0:a77f1f1f8318 319 }
apalmieri 0:a77f1f1f8318 320
apalmieri 0:a77f1f1f8318 321 static void
apalmieri 0:a77f1f1f8318 322 _UARTStreamProcess(Teseo *gnss)
apalmieri 0:a77f1f1f8318 323 {
apalmieri 0:a77f1f1f8318 324 gnss->ReadProcess();
apalmieri 0:a77f1f1f8318 325 }
apalmieri 0:a77f1f1f8318 326
apalmieri 0:a77f1f1f8318 327 void
apalmieri 0:a77f1f1f8318 328 Teseo::start(void)
apalmieri 0:a77f1f1f8318 329 {
apalmieri 0:a77f1f1f8318 330 if(_locState == TESEO_LOC_STATE_IDLE) {
apalmieri 0:a77f1f1f8318 331
apalmieri 0:a77f1f1f8318 332 _InitUART();
apalmieri 0:a77f1f1f8318 333 _locState = TESEO_LOC_STATE_RUN;
apalmieri 0:a77f1f1f8318 334
apalmieri 0:a77f1f1f8318 335 // Start thread for UART listener and set the highest priority
apalmieri 0:a77f1f1f8318 336 serialStreamThread = new (std::nothrow) Thread();
apalmieri 0:a77f1f1f8318 337 if(serialStreamThread != NULL) {
apalmieri 0:a77f1f1f8318 338 serialStreamThread->start(callback(_UARTStreamProcess, this));
apalmieri 0:a77f1f1f8318 339 } else {
apalmieri 0:a77f1f1f8318 340 TESEO_LOG_INFO("Error allocating serialStreamThread\r\n");
apalmieri 0:a77f1f1f8318 341 }
apalmieri 0:a77f1f1f8318 342
apalmieri 0:a77f1f1f8318 343 eventHandler(TESEO_LOC_EVENT_START_RESULT, 0);
apalmieri 0:a77f1f1f8318 344 } else {
apalmieri 0:a77f1f1f8318 345 TESEO_LOG_INFO("Already started\r\n");
apalmieri 0:a77f1f1f8318 346 }
apalmieri 0:a77f1f1f8318 347 }
apalmieri 0:a77f1f1f8318 348
apalmieri 0:a77f1f1f8318 349 void
apalmieri 0:a77f1f1f8318 350 Teseo::stop(void)
apalmieri 0:a77f1f1f8318 351 {
apalmieri 0:a77f1f1f8318 352 if(_locState == TESEO_LOC_STATE_IDLE) {
apalmieri 0:a77f1f1f8318 353 return;
apalmieri 0:a77f1f1f8318 354 }
apalmieri 0:a77f1f1f8318 355 // Stop thread for UART listener
apalmieri 0:a77f1f1f8318 356 if(serialStreamThread != NULL) {
apalmieri 0:a77f1f1f8318 357 serialStreamThread->terminate();
apalmieri 0:a77f1f1f8318 358 delete serialStreamThread;
apalmieri 0:a77f1f1f8318 359 }
apalmieri 0:a77f1f1f8318 360
apalmieri 0:a77f1f1f8318 361 if(_uart != NULL) {
apalmieri 0:a77f1f1f8318 362 delete _uart;
apalmieri 0:a77f1f1f8318 363 _uart = NULL;
apalmieri 0:a77f1f1f8318 364 }
apalmieri 0:a77f1f1f8318 365
apalmieri 0:a77f1f1f8318 366 _locState = TESEO_LOC_STATE_IDLE;
apalmieri 0:a77f1f1f8318 367 eventHandler(TESEO_LOC_EVENT_STOP_RESULT, 0);
apalmieri 0:a77f1f1f8318 368 }
apalmieri 0:a77f1f1f8318 369
apalmieri 0:a77f1f1f8318 370 void
apalmieri 0:a77f1f1f8318 371 Teseo::outputHandler(uint32_t msgId, uint32_t msgType, tTeseoData *pData)
apalmieri 0:a77f1f1f8318 372 {
apalmieri 0:a77f1f1f8318 373 switch(msgId) {
apalmieri 0:a77f1f1f8318 374 case LOC_OUTPUT_LOCATION:
apalmieri 0:a77f1f1f8318 375
apalmieri 0:a77f1f1f8318 376 if(pData->gpgga_data.valid == VALID) {
apalmieri 0:a77f1f1f8318 377 lastLocation.valid = true;
apalmieri 0:a77f1f1f8318 378 lastLocation.lat = pData->gpgga_data.xyz.lat;
apalmieri 0:a77f1f1f8318 379 lastLocation.lon = pData->gpgga_data.xyz.lon;
apalmieri 0:a77f1f1f8318 380 lastLocation.altitude = pData->gpgga_data.xyz.alt;
apalmieri 0:a77f1f1f8318 381 lastLocation.numGPSSVs = pData->gpgga_data.sats;
apalmieri 0:a77f1f1f8318 382 lastLocation.utcTime = pData->gpgga_data.utc.utc;
apalmieri 0:a77f1f1f8318 383 } else {
apalmieri 0:a77f1f1f8318 384 lastLocation.valid = false;
apalmieri 0:a77f1f1f8318 385 }
apalmieri 0:a77f1f1f8318 386
apalmieri 0:a77f1f1f8318 387 if (locationCallback) {
apalmieri 0:a77f1f1f8318 388 locationCallback(&lastLocation);
apalmieri 0:a77f1f1f8318 389 }
apalmieri 0:a77f1f1f8318 390
apalmieri 0:a77f1f1f8318 391 break;
apalmieri 0:a77f1f1f8318 392
apalmieri 0:a77f1f1f8318 393 case LOC_OUTPUT_PSTM: {
apalmieri 0:a77f1f1f8318 394 Teseo::ePSTMsg msg = (Teseo::ePSTMsg)msgType;
apalmieri 0:a77f1f1f8318 395 int code;
apalmieri 0:a77f1f1f8318 396
apalmieri 0:a77f1f1f8318 397 switch(msg) {
apalmieri 0:a77f1f1f8318 398 case PSTMGEOFENCE: {
apalmieri 0:a77f1f1f8318 399
apalmieri 0:a77f1f1f8318 400 /* Geofence enabling */
apalmieri 0:a77f1f1f8318 401 if(pData->geofence_data.op == GNSS_FEATURE_EN_MSG) {
apalmieri 0:a77f1f1f8318 402 code = pData->geofence_data.result ?
apalmieri 0:a77f1f1f8318 403 GPS_ERROR_FEATURE_ENABLING : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 404
apalmieri 0:a77f1f1f8318 405 if (code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 406 saveConfigParams();
apalmieri 0:a77f1f1f8318 407 }
apalmieri 0:a77f1f1f8318 408 }
apalmieri 0:a77f1f1f8318 409
apalmieri 0:a77f1f1f8318 410 /* Geofence configuration */
apalmieri 0:a77f1f1f8318 411 if(pData->geofence_data.op == GNSS_GEOFENCE_CFG_MSG) {
apalmieri 0:a77f1f1f8318 412 code = pData->geofence_data.result ?
apalmieri 0:a77f1f1f8318 413 GPS_ERROR_GEOFENCE_CFG : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 414 if (geofenceCfgMessageCallback) {
apalmieri 0:a77f1f1f8318 415 geofenceCfgMessageCallback(code);
apalmieri 0:a77f1f1f8318 416 }
apalmieri 0:a77f1f1f8318 417 }
apalmieri 0:a77f1f1f8318 418
apalmieri 0:a77f1f1f8318 419 /* Geofence Status */
apalmieri 0:a77f1f1f8318 420 if(pData->geofence_data.op == GNSS_GEOFENCE_STATUS_MSG) {
apalmieri 0:a77f1f1f8318 421 code = pData->geofence_data.result ? GPS_ERROR_GEOFENCE_STATUS : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 422 if(code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 423 geofenceStatus.timestamp.hh = pData->geofence_data.timestamp.hh;
apalmieri 0:a77f1f1f8318 424 geofenceStatus.timestamp.mm = pData->geofence_data.timestamp.mm;
apalmieri 0:a77f1f1f8318 425 geofenceStatus.timestamp.ss = pData->geofence_data.timestamp.ss;
apalmieri 0:a77f1f1f8318 426 geofenceStatus.timestamp.day = pData->geofence_data.timestamp.day;
apalmieri 0:a77f1f1f8318 427 geofenceStatus.timestamp.month = pData->geofence_data.timestamp.month;
apalmieri 0:a77f1f1f8318 428 geofenceStatus.timestamp.year = pData->geofence_data.timestamp.year;
apalmieri 0:a77f1f1f8318 429 geofenceStatus.currentStatus = pData->geofence_data.status;
apalmieri 0:a77f1f1f8318 430 geofenceStatus.numGeofences = MAX_GEOFENCES_NUM;
apalmieri 0:a77f1f1f8318 431 }
apalmieri 0:a77f1f1f8318 432 if (geofenceStatusMessageCallback) {
apalmieri 0:a77f1f1f8318 433 geofenceStatusMessageCallback(&geofenceStatus, code);
apalmieri 0:a77f1f1f8318 434 }
apalmieri 0:a77f1f1f8318 435 }
apalmieri 0:a77f1f1f8318 436
apalmieri 0:a77f1f1f8318 437 /* Geofence Alarm */
apalmieri 0:a77f1f1f8318 438 if(pData->geofence_data.op == GNSS_GEOFENCE_ALARM_MSG) {
apalmieri 0:a77f1f1f8318 439 code = pData->geofence_data.result ? GPS_ERROR_GEOFENCE_STATUS : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 440 if(code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 441 geofenceStatus.timestamp.hh = pData->geofence_data.timestamp.hh;
apalmieri 0:a77f1f1f8318 442 geofenceStatus.timestamp.mm = pData->geofence_data.timestamp.mm;
apalmieri 0:a77f1f1f8318 443 geofenceStatus.timestamp.ss = pData->geofence_data.timestamp.ss;
apalmieri 0:a77f1f1f8318 444 geofenceStatus.currentStatus = pData->geofence_data.status;
apalmieri 0:a77f1f1f8318 445 geofenceStatus.idAlarm = pData->geofence_data.idAlarm;
apalmieri 0:a77f1f1f8318 446 }
apalmieri 0:a77f1f1f8318 447 if (geofenceStatusMessageCallback) {
apalmieri 0:a77f1f1f8318 448 geofenceStatusMessageCallback(&geofenceStatus, code);
apalmieri 0:a77f1f1f8318 449 }
apalmieri 0:a77f1f1f8318 450 }
apalmieri 0:a77f1f1f8318 451 }
apalmieri 0:a77f1f1f8318 452 break;
apalmieri 0:a77f1f1f8318 453
apalmieri 0:a77f1f1f8318 454 case PSTMODO: {
apalmieri 0:a77f1f1f8318 455 /* Odometer enabling */
apalmieri 0:a77f1f1f8318 456 if(pData->odo_data.op == GNSS_FEATURE_EN_MSG) {
apalmieri 0:a77f1f1f8318 457
apalmieri 0:a77f1f1f8318 458 code = pData->odo_data.result ?
apalmieri 0:a77f1f1f8318 459 GPS_ERROR_FEATURE_ENABLING : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 460
apalmieri 0:a77f1f1f8318 461 if (code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 462 saveConfigParams();
apalmieri 0:a77f1f1f8318 463 }
apalmieri 0:a77f1f1f8318 464 }
apalmieri 0:a77f1f1f8318 465
apalmieri 0:a77f1f1f8318 466 /* Odometer start */
apalmieri 0:a77f1f1f8318 467 if(pData->odo_data.op == GNSS_ODO_START_MSG) {
apalmieri 0:a77f1f1f8318 468 code = pData->odo_data.result ?
apalmieri 0:a77f1f1f8318 469 GPS_ERROR_ODO_START : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 470 }
apalmieri 0:a77f1f1f8318 471 /* Odometer stop */
apalmieri 0:a77f1f1f8318 472 if(pData->odo_data.op == GNSS_ODO_STOP_MSG) {
apalmieri 0:a77f1f1f8318 473 code = pData->odo_data.result ?
apalmieri 0:a77f1f1f8318 474 GPS_ERROR_ODO_STOP : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 475 }
apalmieri 0:a77f1f1f8318 476 }
apalmieri 0:a77f1f1f8318 477 break;
apalmieri 0:a77f1f1f8318 478
apalmieri 0:a77f1f1f8318 479 case PSTMDATALOG: {
apalmieri 0:a77f1f1f8318 480 /* Datalog enabling */
apalmieri 0:a77f1f1f8318 481 if(pData->datalog_data.op == GNSS_FEATURE_EN_MSG) {
apalmieri 0:a77f1f1f8318 482
apalmieri 0:a77f1f1f8318 483 code = pData->datalog_data.result ?
apalmieri 0:a77f1f1f8318 484 GPS_ERROR_FEATURE_ENABLING : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 485
apalmieri 0:a77f1f1f8318 486 if (code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 487 saveConfigParams();
apalmieri 0:a77f1f1f8318 488 }
apalmieri 0:a77f1f1f8318 489 }
apalmieri 0:a77f1f1f8318 490 /* Datalog create */
apalmieri 0:a77f1f1f8318 491 if(pData->datalog_data.op == GNSS_DATALOG_CFG_MSG) {
apalmieri 0:a77f1f1f8318 492 code = pData->datalog_data.result ?
apalmieri 0:a77f1f1f8318 493 GPS_ERROR_DATALOG_CFG : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 494 }
apalmieri 0:a77f1f1f8318 495 /* Datalog start */
apalmieri 0:a77f1f1f8318 496 if(pData->datalog_data.op == GNSS_DATALOG_START_MSG) {
apalmieri 0:a77f1f1f8318 497 code = pData->datalog_data.result ?
apalmieri 0:a77f1f1f8318 498 GPS_ERROR_DATALOG_START : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 499 }
apalmieri 0:a77f1f1f8318 500 /* Datalog stop */
apalmieri 0:a77f1f1f8318 501 if(pData->datalog_data.op == GNSS_DATALOG_STOP_MSG) {
apalmieri 0:a77f1f1f8318 502 code = pData->datalog_data.result ?
apalmieri 0:a77f1f1f8318 503 GPS_ERROR_DATALOG_STOP : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 504 }
apalmieri 0:a77f1f1f8318 505 /* Datalog erase */
apalmieri 0:a77f1f1f8318 506 if(pData->datalog_data.op == GNSS_DATALOG_ERASE_MSG) {
apalmieri 0:a77f1f1f8318 507 code = pData->datalog_data.result ?
apalmieri 0:a77f1f1f8318 508 GPS_ERROR_DATALOG_ERASE : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 509 }
apalmieri 0:a77f1f1f8318 510 }
apalmieri 0:a77f1f1f8318 511 break;
apalmieri 0:a77f1f1f8318 512
apalmieri 0:a77f1f1f8318 513 case PSTMSGL: {
apalmieri 0:a77f1f1f8318 514 /* Msg List cfg */
apalmieri 0:a77f1f1f8318 515 code = pData->ack ?
apalmieri 0:a77f1f1f8318 516 GPS_ERROR_MSGLIST_CFG : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 517
apalmieri 0:a77f1f1f8318 518 if (code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 519 saveConfigParams();
apalmieri 0:a77f1f1f8318 520 }
apalmieri 0:a77f1f1f8318 521 }
apalmieri 0:a77f1f1f8318 522 break;
apalmieri 0:a77f1f1f8318 523
apalmieri 0:a77f1f1f8318 524 case PSTMSAVEPAR: {
apalmieri 0:a77f1f1f8318 525 code = pData->ack ?
apalmieri 0:a77f1f1f8318 526 GPS_ERROR_SAVEPAR : GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 527
apalmieri 0:a77f1f1f8318 528 if (code == GPS_ERROR_NONE) {
apalmieri 0:a77f1f1f8318 529 reset();
apalmieri 0:a77f1f1f8318 530 }
apalmieri 0:a77f1f1f8318 531 }
apalmieri 0:a77f1f1f8318 532 break;
apalmieri 0:a77f1f1f8318 533
apalmieri 0:a77f1f1f8318 534 } /* end switch */
apalmieri 0:a77f1f1f8318 535 } /* end case LOC_OUTPUT_PSTM */
apalmieri 0:a77f1f1f8318 536
apalmieri 0:a77f1f1f8318 537 break;
apalmieri 0:a77f1f1f8318 538
apalmieri 0:a77f1f1f8318 539 default:
apalmieri 0:a77f1f1f8318 540 break;
apalmieri 0:a77f1f1f8318 541 }
apalmieri 0:a77f1f1f8318 542
apalmieri 0:a77f1f1f8318 543 if (appOutCb) {
apalmieri 0:a77f1f1f8318 544 appOutCb(msgId, msgType, pData);
apalmieri 0:a77f1f1f8318 545 }
apalmieri 0:a77f1f1f8318 546
apalmieri 0:a77f1f1f8318 547 }
apalmieri 0:a77f1f1f8318 548
apalmieri 0:a77f1f1f8318 549
apalmieri 0:a77f1f1f8318 550 eStatus
apalmieri 0:a77f1f1f8318 551 Teseo::_GetMsg(Teseo::eMsg msg, uint8_t *buffer)
apalmieri 0:a77f1f1f8318 552 {
apalmieri 0:a77f1f1f8318 553 eStatus status = TESEO_STATUS_FAILURE;
apalmieri 0:a77f1f1f8318 554
apalmieri 0:a77f1f1f8318 555 switch(msg) {
apalmieri 0:a77f1f1f8318 556
apalmieri 0:a77f1f1f8318 557 case GPGGA:
apalmieri 0:a77f1f1f8318 558 status = (eStatus)parse_gpgga(&pData.gpgga_data, buffer);
apalmieri 0:a77f1f1f8318 559 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 560 outputHandler(LOC_OUTPUT_LOCATION, msg, &pData);
apalmieri 0:a77f1f1f8318 561 }
apalmieri 0:a77f1f1f8318 562 break;
apalmieri 0:a77f1f1f8318 563
apalmieri 0:a77f1f1f8318 564 case GNS:
apalmieri 0:a77f1f1f8318 565 status = (eStatus)parse_gnsmsg(&pData.gns_data, buffer);
apalmieri 0:a77f1f1f8318 566 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 567 outputHandler(LOC_OUTPUT_NMEA, msg, &pData);
apalmieri 0:a77f1f1f8318 568 }
apalmieri 0:a77f1f1f8318 569 break;
apalmieri 0:a77f1f1f8318 570
apalmieri 0:a77f1f1f8318 571 case GPGST:
apalmieri 0:a77f1f1f8318 572 status = (eStatus)parse_gpgst(&pData.gpgst_data, buffer);
apalmieri 0:a77f1f1f8318 573 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 574 outputHandler(LOC_OUTPUT_NMEA, msg, &pData);
apalmieri 0:a77f1f1f8318 575 }
apalmieri 0:a77f1f1f8318 576 break;
apalmieri 0:a77f1f1f8318 577
apalmieri 0:a77f1f1f8318 578 case GPRMC:
apalmieri 0:a77f1f1f8318 579 status = (eStatus)parse_gprmc(&pData.gprmc_data, buffer);
apalmieri 0:a77f1f1f8318 580 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 581 outputHandler(LOC_OUTPUT_NMEA, msg, &pData);
apalmieri 0:a77f1f1f8318 582 }
apalmieri 0:a77f1f1f8318 583 break;
apalmieri 0:a77f1f1f8318 584
apalmieri 0:a77f1f1f8318 585 case GSA:
apalmieri 0:a77f1f1f8318 586 status = (eStatus)parse_gsamsg(&pData.gsa_data, buffer);
apalmieri 0:a77f1f1f8318 587 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 588 outputHandler(LOC_OUTPUT_NMEA, msg, &pData);
apalmieri 0:a77f1f1f8318 589 }
apalmieri 0:a77f1f1f8318 590 break;
apalmieri 0:a77f1f1f8318 591
apalmieri 0:a77f1f1f8318 592 case GSV:
apalmieri 0:a77f1f1f8318 593 status = (eStatus)parse_gsvmsg(&pData.gsv_data, buffer);
apalmieri 0:a77f1f1f8318 594 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 595 outputHandler(LOC_OUTPUT_NMEA, msg, &pData);
apalmieri 0:a77f1f1f8318 596 }
apalmieri 0:a77f1f1f8318 597 break;
apalmieri 0:a77f1f1f8318 598
apalmieri 0:a77f1f1f8318 599 default:
apalmieri 0:a77f1f1f8318 600 break;
apalmieri 0:a77f1f1f8318 601
apalmieri 0:a77f1f1f8318 602 }
apalmieri 0:a77f1f1f8318 603
apalmieri 0:a77f1f1f8318 604 return status;
apalmieri 0:a77f1f1f8318 605 }
apalmieri 0:a77f1f1f8318 606
apalmieri 0:a77f1f1f8318 607 void
apalmieri 0:a77f1f1f8318 608 Teseo::setVerboseMode(int level)
apalmieri 0:a77f1f1f8318 609 {
apalmieri 0:a77f1f1f8318 610 cfgMessageList(level);
apalmieri 0:a77f1f1f8318 611 }
apalmieri 0:a77f1f1f8318 612
apalmieri 0:a77f1f1f8318 613 void
apalmieri 0:a77f1f1f8318 614 Teseo::_GetLocationMsg(Teseo::eMsg msg, uint8_t *buffer)
apalmieri 0:a77f1f1f8318 615 {
apalmieri 0:a77f1f1f8318 616 eStatus status;
apalmieri 0:a77f1f1f8318 617
apalmieri 0:a77f1f1f8318 618 status = (eStatus)parse_gpgga(&pData.gpgga_data, buffer);
apalmieri 0:a77f1f1f8318 619 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 620 outputHandler(LOC_OUTPUT_LOCATION, msg, &pData);
apalmieri 0:a77f1f1f8318 621 }
apalmieri 0:a77f1f1f8318 622 }
apalmieri 0:a77f1f1f8318 623
apalmieri 0:a77f1f1f8318 624 void
apalmieri 0:a77f1f1f8318 625 Teseo::_GetPSTMsg(Teseo::ePSTMsg msg, uint8_t *buffer)
apalmieri 0:a77f1f1f8318 626 {
apalmieri 0:a77f1f1f8318 627 eStatus status;
apalmieri 0:a77f1f1f8318 628
apalmieri 0:a77f1f1f8318 629 switch(msg) {
apalmieri 0:a77f1f1f8318 630
apalmieri 0:a77f1f1f8318 631 case PSTMGEOFENCE:
apalmieri 0:a77f1f1f8318 632 status = (eStatus)parse_pstmgeofence(&pData.geofence_data, buffer);
apalmieri 0:a77f1f1f8318 633 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 634 outputHandler(LOC_OUTPUT_PSTM, msg, &pData);
apalmieri 0:a77f1f1f8318 635 }
apalmieri 0:a77f1f1f8318 636 break;
apalmieri 0:a77f1f1f8318 637 case PSTMODO:
apalmieri 0:a77f1f1f8318 638 status = (eStatus)parse_pstmodo(&pData.odo_data, buffer);
apalmieri 0:a77f1f1f8318 639 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 640 outputHandler(LOC_OUTPUT_PSTM, msg, &pData);
apalmieri 0:a77f1f1f8318 641 }
apalmieri 0:a77f1f1f8318 642 break;
apalmieri 0:a77f1f1f8318 643 case PSTMDATALOG:
apalmieri 0:a77f1f1f8318 644 status = (eStatus)parse_pstmdatalog(&pData.datalog_data, buffer);
apalmieri 0:a77f1f1f8318 645 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 646 outputHandler(LOC_OUTPUT_PSTM, msg, &pData);
apalmieri 0:a77f1f1f8318 647 }
apalmieri 0:a77f1f1f8318 648 break;
apalmieri 0:a77f1f1f8318 649 case PSTMSGL:
apalmieri 0:a77f1f1f8318 650 status = (eStatus)parse_pstmsgl(&pData.ack, buffer);
apalmieri 0:a77f1f1f8318 651 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 652 outputHandler(LOC_OUTPUT_PSTM, msg, &pData);
apalmieri 0:a77f1f1f8318 653 }
apalmieri 0:a77f1f1f8318 654 break;
apalmieri 0:a77f1f1f8318 655 case PSTMSAVEPAR:
apalmieri 0:a77f1f1f8318 656 status = (eStatus)parse_pstmsavepar(&pData.ack, buffer);
apalmieri 0:a77f1f1f8318 657 if(status == TESEO_STATUS_SUCCESS) {
apalmieri 0:a77f1f1f8318 658 outputHandler(LOC_OUTPUT_PSTM, msg, &pData);
apalmieri 0:a77f1f1f8318 659 }
apalmieri 0:a77f1f1f8318 660 break;
apalmieri 0:a77f1f1f8318 661
apalmieri 0:a77f1f1f8318 662 default:
apalmieri 0:a77f1f1f8318 663 break;
apalmieri 0:a77f1f1f8318 664 }
apalmieri 0:a77f1f1f8318 665 /* Recover the normal state */
apalmieri 0:a77f1f1f8318 666
apalmieri 0:a77f1f1f8318 667 }
apalmieri 0:a77f1f1f8318 668
apalmieri 0:a77f1f1f8318 669 void
apalmieri 0:a77f1f1f8318 670 Teseo::process(void)
apalmieri 0:a77f1f1f8318 671 {
apalmieri 5:1fe1ba1f0013 672 struct _teseoMsg *message;
apalmieri 5:1fe1ba1f0013 673
apalmieri 5:1fe1ba1f0013 674 bool stat = queue.try_get_for(Kernel::wait_for_u32_forever, &message);
apalmieri 5:1fe1ba1f0013 675
apalmieri 5:1fe1ba1f0013 676 if (stat == true) {
apalmieri 0:a77f1f1f8318 677 if (message->len > 0) {
apalmieri 0:a77f1f1f8318 678
apalmieri 0:a77f1f1f8318 679 for(int m = 0; m < PSTM_NMEA_MSGS_NUM; m++) {
apalmieri 0:a77f1f1f8318 680 _GetPSTMsg((ePSTMsg)m, message->buf);
apalmieri 0:a77f1f1f8318 681 }
apalmieri 0:a77f1f1f8318 682 for(int m = 0; m < NMEA_MSGS_NUM; m++) {
apalmieri 0:a77f1f1f8318 683 _GetMsg((eMsg)m, message->buf);
apalmieri 0:a77f1f1f8318 684 }
apalmieri 0:a77f1f1f8318 685 }
apalmieri 0:a77f1f1f8318 686
apalmieri 0:a77f1f1f8318 687 mpool.free(message);
apalmieri 0:a77f1f1f8318 688 }
apalmieri 0:a77f1f1f8318 689 }
apalmieri 0:a77f1f1f8318 690
apalmieri 0:a77f1f1f8318 691 const GPSProvider::LocationUpdateParams_t *
apalmieri 0:a77f1f1f8318 692 Teseo::getLastLocation(void) const
apalmieri 0:a77f1f1f8318 693 {
apalmieri 0:a77f1f1f8318 694 return &lastLocation;
apalmieri 0:a77f1f1f8318 695 }
apalmieri 0:a77f1f1f8318 696
apalmieri 0:a77f1f1f8318 697 void
apalmieri 0:a77f1f1f8318 698 Teseo::reset(void)
apalmieri 0:a77f1f1f8318 699 {
apalmieri 5:1fe1ba1f0013 700 _ResetFast();
apalmieri 0:a77f1f1f8318 701 }
apalmieri 0:a77f1f1f8318 702
apalmieri 0:a77f1f1f8318 703 gps_provider_error_t
apalmieri 0:a77f1f1f8318 704 Teseo::cfgMessageList(int level)
apalmieri 0:a77f1f1f8318 705 {
apalmieri 0:a77f1f1f8318 706 int lowMask = 0x2;
apalmieri 0:a77f1f1f8318 707 int highMask = 0x80000;
apalmieri 0:a77f1f1f8318 708
apalmieri 0:a77f1f1f8318 709 if(level == 2) {
apalmieri 0:a77f1f1f8318 710 lowMask = 0x18004F;
apalmieri 0:a77f1f1f8318 711 }
apalmieri 0:a77f1f1f8318 712
apalmieri 0:a77f1f1f8318 713 sprintf(_teseoCmd, "$PSTMCFGMSGL,%d,%d,%x,%x",
apalmieri 0:a77f1f1f8318 714 0, /*NMEA 0*/
apalmieri 0:a77f1f1f8318 715 1, /*Rate*/
apalmieri 0:a77f1f1f8318 716 lowMask,
apalmieri 0:a77f1f1f8318 717 highMask);
apalmieri 0:a77f1f1f8318 718
apalmieri 0:a77f1f1f8318 719 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 720
apalmieri 0:a77f1f1f8318 721 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 722 }
apalmieri 0:a77f1f1f8318 723
apalmieri 0:a77f1f1f8318 724 gps_provider_error_t
apalmieri 0:a77f1f1f8318 725 Teseo::saveConfigParams(void)
apalmieri 0:a77f1f1f8318 726 {
apalmieri 0:a77f1f1f8318 727 sprintf(_teseoCmd, "$PSTMSAVEPAR");
apalmieri 0:a77f1f1f8318 728 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 729
apalmieri 0:a77f1f1f8318 730 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 731 }
apalmieri 0:a77f1f1f8318 732
apalmieri 0:a77f1f1f8318 733 bool
apalmieri 0:a77f1f1f8318 734 Teseo::isGeofencingSupported(void)
apalmieri 0:a77f1f1f8318 735 {
apalmieri 0:a77f1f1f8318 736 return true;
apalmieri 0:a77f1f1f8318 737 }
apalmieri 0:a77f1f1f8318 738
apalmieri 0:a77f1f1f8318 739 gps_provider_error_t
apalmieri 0:a77f1f1f8318 740 Teseo::enableGeofence(void)
apalmieri 0:a77f1f1f8318 741 {
apalmieri 0:a77f1f1f8318 742 //$PSTMCFGGEOFENCE,<en>,<tol>*<checksum><cr><lf>
apalmieri 0:a77f1f1f8318 743 sprintf(_teseoCmd, "$PSTMCFGGEOFENCE,%d,%d",1,1);
apalmieri 0:a77f1f1f8318 744 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 745
apalmieri 0:a77f1f1f8318 746 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 747 }
apalmieri 0:a77f1f1f8318 748
apalmieri 0:a77f1f1f8318 749 gps_provider_error_t
apalmieri 0:a77f1f1f8318 750 Teseo::cfgGeofenceCircle(void)
apalmieri 0:a77f1f1f8318 751 {
apalmieri 0:a77f1f1f8318 752 GPSGeofence::GeofenceCircle_t circle = {
apalmieri 0:a77f1f1f8318 753 .id = 0,
apalmieri 0:a77f1f1f8318 754 .enabled = 1,
apalmieri 0:a77f1f1f8318 755 .tolerance = 1,
apalmieri 0:a77f1f1f8318 756 .lat = 40.336055,
apalmieri 0:a77f1f1f8318 757 .lon = 18.120611,
apalmieri 0:a77f1f1f8318 758 .radius = 200
apalmieri 0:a77f1f1f8318 759 };
apalmieri 0:a77f1f1f8318 760
apalmieri 0:a77f1f1f8318 761 sprintf(_teseoCmd, "$PSTMCFGGEOCIR,%d,%d,%lf,%lf,%lf",
apalmieri 0:a77f1f1f8318 762 circle.id,
apalmieri 0:a77f1f1f8318 763 circle.enabled,
apalmieri 0:a77f1f1f8318 764 circle.lat,
apalmieri 0:a77f1f1f8318 765 circle.lon,
apalmieri 0:a77f1f1f8318 766 circle.radius);
apalmieri 0:a77f1f1f8318 767 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 768
apalmieri 0:a77f1f1f8318 769 sprintf(_teseoCmd, "$PSTMSAVEPAR");
apalmieri 0:a77f1f1f8318 770 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 771
apalmieri 0:a77f1f1f8318 772 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 773 }
apalmieri 0:a77f1f1f8318 774
apalmieri 0:a77f1f1f8318 775
apalmieri 0:a77f1f1f8318 776 gps_provider_error_t
apalmieri 0:a77f1f1f8318 777 Teseo::configGeofences(GPSGeofence *geofences[], unsigned geofenceCount)
apalmieri 0:a77f1f1f8318 778 {
apalmieri 0:a77f1f1f8318 779 uint8_t trials;
apalmieri 0:a77f1f1f8318 780
apalmieri 0:a77f1f1f8318 781 if(geofenceCount > MAX_GEOFENCES_NUM) {
apalmieri 0:a77f1f1f8318 782 return GPS_ERROR_GEOFENCE_MAX_EXCEEDED;
apalmieri 0:a77f1f1f8318 783 }
apalmieri 0:a77f1f1f8318 784
apalmieri 0:a77f1f1f8318 785 for(uint8_t i = 0; i < geofenceCount; i++) {
apalmieri 0:a77f1f1f8318 786 trials = 1;
apalmieri 0:a77f1f1f8318 787 //printf("Teseo::configGeofences id=%d\r\n", (geofences[i]->getGeofenceCircle()).id);
apalmieri 0:a77f1f1f8318 788 /*
apalmieri 0:a77f1f1f8318 789 printf("Teseo::configGeofences en=%d\r\n", en);
apalmieri 0:a77f1f1f8318 790 printf("Teseo::configGeofences tol=%d\r\n", (geofences[i]->getGeofenceCircle()).tolerance);
apalmieri 0:a77f1f1f8318 791 printf("Teseo::configGeofences lat=%02f\r\n", (geofences[i]->getGeofenceCircle()).lat);
apalmieri 0:a77f1f1f8318 792 printf("Teseo::configGeofences lon=%02f\r\n", (geofences[i]->getGeofenceCircle()).lon);
apalmieri 0:a77f1f1f8318 793 printf("Teseo::configGeofences radius=%02f\r\n", (geofences[i]->getGeofenceCircle()).radius);
apalmieri 0:a77f1f1f8318 794 */
apalmieri 0:a77f1f1f8318 795 sprintf(_teseoCmd, "$PSTMGEOFENCECFG,%d,%d,%d,%lf,%lf,%lf",
apalmieri 0:a77f1f1f8318 796 (geofences[i]->getGeofenceCircle()).id,
apalmieri 0:a77f1f1f8318 797 (geofences[i]->getGeofenceCircle()).enabled,
apalmieri 0:a77f1f1f8318 798 (geofences[i]->getGeofenceCircle()).tolerance,
apalmieri 0:a77f1f1f8318 799 (geofences[i]->getGeofenceCircle()).lat,
apalmieri 0:a77f1f1f8318 800 (geofences[i]->getGeofenceCircle()).lon,
apalmieri 0:a77f1f1f8318 801 (geofences[i]->getGeofenceCircle()).radius);
apalmieri 0:a77f1f1f8318 802
apalmieri 0:a77f1f1f8318 803 do{
apalmieri 0:a77f1f1f8318 804 trials--;
apalmieri 0:a77f1f1f8318 805
apalmieri 0:a77f1f1f8318 806 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 807 /*
apalmieri 0:a77f1f1f8318 808 sprintf(_teseoCmd, "$PSTMCFGGEOFENCE,%d,%d\n\r",1,1);
apalmieri 0:a77f1f1f8318 809
apalmieri 0:a77f1f1f8318 810 //sprintf(_teseoCmd, "$PSTMGETSWVER,6");
apalmieri 0:a77f1f1f8318 811 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 812
apalmieri 0:a77f1f1f8318 813 sprintf(_teseoCmd, "$PSTMSAVEPAR\n\r");
apalmieri 0:a77f1f1f8318 814 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 815 */
apalmieri 0:a77f1f1f8318 816 //printf("Teseo::configGeofences _teseoCmd=%s\r\n", _teseoCmd);
apalmieri 0:a77f1f1f8318 817 } while (trials > 0);
apalmieri 0:a77f1f1f8318 818 }
apalmieri 0:a77f1f1f8318 819 //printf("Teseo::configGeofences sizeof(geofences)=%d numGeofences=%d strlen(_teseoCmd)=%d\r\n", sizeof(geofences), numGeofences, strlen(_teseoCmd));
apalmieri 0:a77f1f1f8318 820
apalmieri 0:a77f1f1f8318 821 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 822 }
apalmieri 0:a77f1f1f8318 823
apalmieri 0:a77f1f1f8318 824 gps_provider_error_t
apalmieri 0:a77f1f1f8318 825 Teseo::geofenceReq(void)
apalmieri 0:a77f1f1f8318 826 {
apalmieri 0:a77f1f1f8318 827 sprintf(_teseoCmd, "$PSTMGEOFENCEREQ");
apalmieri 0:a77f1f1f8318 828 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 829
apalmieri 0:a77f1f1f8318 830 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 831 }
apalmieri 0:a77f1f1f8318 832
apalmieri 0:a77f1f1f8318 833 bool
apalmieri 0:a77f1f1f8318 834 Teseo::isDataloggingSupported(void)
apalmieri 0:a77f1f1f8318 835 {
apalmieri 0:a77f1f1f8318 836 return true;
apalmieri 0:a77f1f1f8318 837 }
apalmieri 0:a77f1f1f8318 838
apalmieri 0:a77f1f1f8318 839 gps_provider_error_t
apalmieri 0:a77f1f1f8318 840 Teseo::enableDatalog(void)
apalmieri 0:a77f1f1f8318 841 {
apalmieri 0:a77f1f1f8318 842 //$PSTMCFGLOG,<en>,<circ>,<rectype>,<oneshot>,<rate>,<speed>,<dist>*<checksum><cr><lf>
apalmieri 0:a77f1f1f8318 843 sprintf(_teseoCmd, "$PSTMCFGLOG,%d,%d,%d,%d,%u,%u,%u",
apalmieri 0:a77f1f1f8318 844 1, //Enable/Disable the log
apalmieri 0:a77f1f1f8318 845 1, //Enable/Disable circular mode
apalmieri 0:a77f1f1f8318 846 1, //Record type
apalmieri 0:a77f1f1f8318 847 0, //Enable/Disable one shot mode
apalmieri 0:a77f1f1f8318 848 5, //time interval in seconds between two consecutive logged records
apalmieri 0:a77f1f1f8318 849 0, //minimum speed threshold
apalmieri 0:a77f1f1f8318 850 0 //distance threshold
apalmieri 0:a77f1f1f8318 851 );
apalmieri 0:a77f1f1f8318 852 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 853
apalmieri 0:a77f1f1f8318 854 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 855 }
apalmieri 0:a77f1f1f8318 856
apalmieri 0:a77f1f1f8318 857 gps_provider_error_t
apalmieri 0:a77f1f1f8318 858 Teseo::configDatalog(GPSDatalog *datalog)
apalmieri 0:a77f1f1f8318 859 {
apalmieri 0:a77f1f1f8318 860 //printf("Teseo::configDatalog 0x%03x\r\n", (datalog->getEnableBufferFullAlarm())<<1|(datalog->getEnableCircularBuffer()));
apalmieri 0:a77f1f1f8318 861 //$PSTMLOGCREATE,<cfg>,<min-rate>,<min-speed>,<min-position>,<logmask>*<checksum><cr><lf>
apalmieri 0:a77f1f1f8318 862 sprintf(_teseoCmd, "$PSTMLOGCREATE,%03x,%u,%u,%u,%d",
apalmieri 0:a77f1f1f8318 863 (datalog->getEnableBufferFullAlarm())<<1|(datalog->getEnableCircularBuffer()),
apalmieri 0:a77f1f1f8318 864 datalog->getMinRate(),
apalmieri 0:a77f1f1f8318 865 datalog->getMinSpeed(),
apalmieri 0:a77f1f1f8318 866 datalog->getMinPosition(),
apalmieri 0:a77f1f1f8318 867 datalog->getLogMask()
apalmieri 0:a77f1f1f8318 868 );
apalmieri 0:a77f1f1f8318 869 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 870
apalmieri 0:a77f1f1f8318 871 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 872 }
apalmieri 0:a77f1f1f8318 873
apalmieri 0:a77f1f1f8318 874 gps_provider_error_t
apalmieri 0:a77f1f1f8318 875 Teseo::startDatalog(void)
apalmieri 0:a77f1f1f8318 876 {
apalmieri 0:a77f1f1f8318 877 sprintf(_teseoCmd, "$PSTMLOGSTART");
apalmieri 0:a77f1f1f8318 878 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 879
apalmieri 0:a77f1f1f8318 880 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 881 }
apalmieri 0:a77f1f1f8318 882
apalmieri 0:a77f1f1f8318 883 gps_provider_error_t
apalmieri 0:a77f1f1f8318 884 Teseo::stopDatalog(void)
apalmieri 0:a77f1f1f8318 885 {
apalmieri 0:a77f1f1f8318 886 sprintf(_teseoCmd, "$PSTMLOGSTOP");
apalmieri 0:a77f1f1f8318 887 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 888
apalmieri 0:a77f1f1f8318 889 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 890 }
apalmieri 0:a77f1f1f8318 891
apalmieri 0:a77f1f1f8318 892 gps_provider_error_t
apalmieri 0:a77f1f1f8318 893 Teseo::eraseDatalog(void)
apalmieri 0:a77f1f1f8318 894 {
apalmieri 0:a77f1f1f8318 895 sprintf(_teseoCmd, "$PSTMLOGERASE");
apalmieri 0:a77f1f1f8318 896 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 897
apalmieri 0:a77f1f1f8318 898 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 899 }
apalmieri 0:a77f1f1f8318 900
apalmieri 0:a77f1f1f8318 901 gps_provider_error_t
apalmieri 0:a77f1f1f8318 902 Teseo::logReqStatus(void)
apalmieri 0:a77f1f1f8318 903 {
apalmieri 0:a77f1f1f8318 904 /* TBI */
apalmieri 0:a77f1f1f8318 905 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 906 }
apalmieri 0:a77f1f1f8318 907
apalmieri 0:a77f1f1f8318 908 gps_provider_error_t
apalmieri 0:a77f1f1f8318 909 Teseo::logReqQuery(GPSProvider::LogQueryParams_t &logReqQuery)
apalmieri 0:a77f1f1f8318 910 {
apalmieri 0:a77f1f1f8318 911 /* TBI */
apalmieri 0:a77f1f1f8318 912 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 913 }
apalmieri 0:a77f1f1f8318 914
apalmieri 0:a77f1f1f8318 915 bool
apalmieri 0:a77f1f1f8318 916 Teseo::isOdometerSupported(void)
apalmieri 0:a77f1f1f8318 917 {
apalmieri 0:a77f1f1f8318 918 return true;
apalmieri 0:a77f1f1f8318 919 }
apalmieri 0:a77f1f1f8318 920
apalmieri 0:a77f1f1f8318 921 gps_provider_error_t
apalmieri 0:a77f1f1f8318 922 Teseo::enableOdo(void)
apalmieri 0:a77f1f1f8318 923 {
apalmieri 0:a77f1f1f8318 924 //$PSTMCFGODO,<en>,<enmsg>,<alarm>*<checksum><cr><lf>
apalmieri 0:a77f1f1f8318 925 sprintf(_teseoCmd, "$PSTMCFGODO,1,1,1");
apalmieri 0:a77f1f1f8318 926 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 927
apalmieri 0:a77f1f1f8318 928 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 929 }
apalmieri 0:a77f1f1f8318 930
apalmieri 0:a77f1f1f8318 931 gps_provider_error_t
apalmieri 0:a77f1f1f8318 932 Teseo::startOdo(unsigned alarmDistance)
apalmieri 0:a77f1f1f8318 933 {
apalmieri 0:a77f1f1f8318 934 sprintf(_teseoCmd, "$PSTMODOSTART,%08x", alarmDistance);
apalmieri 0:a77f1f1f8318 935 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 936
apalmieri 0:a77f1f1f8318 937 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 938 }
apalmieri 0:a77f1f1f8318 939
apalmieri 0:a77f1f1f8318 940 gps_provider_error_t
apalmieri 0:a77f1f1f8318 941 Teseo::stopOdo(void)
apalmieri 0:a77f1f1f8318 942 {
apalmieri 0:a77f1f1f8318 943 sprintf(_teseoCmd, "$PSTMODOSTOP");
apalmieri 0:a77f1f1f8318 944 SendCommand(_teseoCmd);
apalmieri 0:a77f1f1f8318 945
apalmieri 0:a77f1f1f8318 946 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 947 }
apalmieri 0:a77f1f1f8318 948 gps_provider_error_t
apalmieri 0:a77f1f1f8318 949 Teseo::resetOdo(void)
apalmieri 0:a77f1f1f8318 950 {
apalmieri 0:a77f1f1f8318 951 /* TBI */
apalmieri 0:a77f1f1f8318 952 return GPS_ERROR_NONE;
apalmieri 0:a77f1f1f8318 953 }