GPS NEMA String parser library. Only supports SkyTraq Venus chip at this time.

Dependents:   MTDOT-EVB-LinkCheck-AL MTDOT-BOX-EVB-Factory-Firmware-LIB-108 TelitSensorToCloud mDot_sensor_to_cloud ... more

Committer:
Mike Fiore
Date:
Mon Dec 14 08:58:14 2015 -0600
Revision:
8:5fa40fa372e2
Parent:
7:bd1013ba8afd
Child:
9:a4d4ab3b0f23
comment out log messages

Who changed what in which revision?

UserRevisionLine numberNew contents of line
falingtrea 0:d2169fecf3fb 1 /**
falingtrea 0:d2169fecf3fb 2 * @file NemaParser.cpp
falingtrea 0:d2169fecf3fb 3 * @brief NEMA String to Packet Parser - NEMA strings to compact packet data
falingtrea 0:d2169fecf3fb 4 * @author Tim Barr
falingtrea 1:58c50bb3c60c 5 * @version 1.01
falingtrea 0:d2169fecf3fb 6 * @see http://www.kh-gps.de/nmea.faq
falingtrea 0:d2169fecf3fb 7 * @see http://www.catb.org/gpsd/NMEA.html
falingtrea 0:d2169fecf3fb 8 *
falingtrea 0:d2169fecf3fb 9 * Copyright (c) 2015
falingtrea 0:d2169fecf3fb 10 *
falingtrea 0:d2169fecf3fb 11 * Licensed under the Apache License, Version 2.0 (the "License");
falingtrea 0:d2169fecf3fb 12 * you may not use this file except in compliance with the License.
falingtrea 0:d2169fecf3fb 13 * You may obtain a copy of the License at
falingtrea 0:d2169fecf3fb 14 *
falingtrea 0:d2169fecf3fb 15 * http://www.apache.org/licenses/LICENSE-2.0
falingtrea 0:d2169fecf3fb 16 *
falingtrea 0:d2169fecf3fb 17 * Unless required by applicable law or agreed to in writing, software
falingtrea 0:d2169fecf3fb 18 * distributed under the License is distributed on an "AS IS" BASIS,
falingtrea 0:d2169fecf3fb 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
falingtrea 0:d2169fecf3fb 20 * See the License for the specific language governing permissions and
falingtrea 0:d2169fecf3fb 21 * limitations under the License.
falingtrea 0:d2169fecf3fb 22 *
falingtrea 1:58c50bb3c60c 23 * 09/16/15 TAB V1.01 Changed report rate of GGA and GSA NEMA sentences
falingtrea 3:662aa99c5266 24 * 09/22/15 TAB V1.02 Fixed status value for no GPS detected. Increased report rate
falingtrea 3:662aa99c5266 25 * of GSV, GGA, and GSA NEMA Sentences
falingtrea 1:58c50bb3c60c 26 *
falingtrea 0:d2169fecf3fb 27 * TODO: Add speed, compass direction, error (DOP) data. Make init more generic
falingtrea 0:d2169fecf3fb 28 */
falingtrea 0:d2169fecf3fb 29
falingtrea 0:d2169fecf3fb 30 #include "GPSPARSER.h"
falingtrea 0:d2169fecf3fb 31
falingtrea 0:d2169fecf3fb 32 using namespace mts;
falingtrea 0:d2169fecf3fb 33
Mike Fiore 6:2050b4795b66 34 GPSPARSER::GPSPARSER(MTSSerial *uart, NCP5623B* led)
Mike Fiore 6:2050b4795b66 35 : _getSentenceThread(&GPSPARSER::startSentenceThread,this),
Mike Fiore 6:2050b4795b66 36 _led(led),
Mike Fiore 7:bd1013ba8afd 37 _led_state(0),
Mike Fiore 7:bd1013ba8afd 38 _tick_running(false)
falingtrea 0:d2169fecf3fb 39 {
falingtrea 0:d2169fecf3fb 40 _gps_uart = uart;
falingtrea 0:d2169fecf3fb 41 _gps_uart->baud(9600); //set GPS baud rate here
mfiore 4:ae35903cd8d2 42
falingtrea 0:d2169fecf3fb 43 _gps_latitude.degrees = 0;
falingtrea 0:d2169fecf3fb 44 _gps_longitude.degrees = 0;
falingtrea 0:d2169fecf3fb 45 _timestamp.tm_sec = 0;
falingtrea 0:d2169fecf3fb 46 _timestamp.tm_min = 0;
falingtrea 0:d2169fecf3fb 47 _timestamp.tm_hour = 0;
falingtrea 0:d2169fecf3fb 48 _timestamp.tm_mday = 0;
falingtrea 0:d2169fecf3fb 49 _timestamp.tm_mon = 0;
falingtrea 0:d2169fecf3fb 50 _timestamp.tm_year = 0;
falingtrea 0:d2169fecf3fb 51 _timestamp.tm_wday = 0;
falingtrea 0:d2169fecf3fb 52 _timestamp.tm_yday = 0;
falingtrea 0:d2169fecf3fb 53 _timestamp.tm_isdst = -1; // time is UTC so no Daylight savings time
mfiore 4:ae35903cd8d2 54
falingtrea 0:d2169fecf3fb 55 _gps_status = false;
falingtrea 2:fbc098f1e7c0 56 _fix_status = 1;
falingtrea 0:d2169fecf3fb 57 _num_satellites =0;
falingtrea 0:d2169fecf3fb 58 _gps_detected = false;
falingtrea 0:d2169fecf3fb 59
mfiore 4:ae35903cd8d2 60 if (GPSPARSER::initGps() == 0) {
falingtrea 0:d2169fecf3fb 61 _gps_detected = true;
falingtrea 0:d2169fecf3fb 62 _getSentenceThread.signal_set(START_THREAD);
Mike Fiore 8:5fa40fa372e2 63 //printf("Started Nema Sentence Thread\r\n");
mfiore 4:ae35903cd8d2 64 } else {
Mike Fiore 8:5fa40fa372e2 65 //printf("No GPS detected\r\n");
falingtrea 3:662aa99c5266 66 _fix_status = 0;
falingtrea 2:fbc098f1e7c0 67 }
mfiore 4:ae35903cd8d2 68
falingtrea 0:d2169fecf3fb 69 return;
falingtrea 0:d2169fecf3fb 70 }
falingtrea 0:d2169fecf3fb 71
mfiore 4:ae35903cd8d2 72 GPSPARSER::~GPSPARSER(void)
mfiore 4:ae35903cd8d2 73 {
falingtrea 0:d2169fecf3fb 74 if (_gps_detected)
falingtrea 0:d2169fecf3fb 75 _getSentenceThread.terminate();
falingtrea 0:d2169fecf3fb 76 }
falingtrea 0:d2169fecf3fb 77
mfiore 4:ae35903cd8d2 78 uint8_t GPSPARSER::initGps (void)
mfiore 4:ae35903cd8d2 79 {
mfiore 4:ae35903cd8d2 80
falingtrea 0:d2169fecf3fb 81 // this code is specific to the Skytraq Venus GPS chip. This code could be re-written to detect another type of
falingtrea 0:d2169fecf3fb 82 // GPS device. Maybe read serial port for a specific time and detect $GP from NEMA string
mfiore 4:ae35903cd8d2 83
falingtrea 3:662aa99c5266 84 // Sets Skytraq Venus GPS to output GGA,GSA,GSV every 10 seconds, and RMC every second, no ZDA,GLL,VTG
falingtrea 0:d2169fecf3fb 85 // setup string for GPS GGA GSA GSV GLL RMC VTG ZDA cksum
falingtrea 3:662aa99c5266 86 char init_gps[16] = {0xA0,0xA1,0x00,0x09,0x08,0x0A,0x0A,0x0A,0x00,0x01,0x00,0x00,0x00,0x03,0x0D,0x0A};
falingtrea 0:d2169fecf3fb 87 char chk_char;
falingtrea 0:d2169fecf3fb 88 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 89
falingtrea 0:d2169fecf3fb 90 _gps_uart->rxClear();
Mike Fiore 8:5fa40fa372e2 91 //printf("Starting initGPS \r\n");
mfiore 4:ae35903cd8d2 92
falingtrea 0:d2169fecf3fb 93 _gps_uart->write(init_gps,16);
Mike Fiore 8:5fa40fa372e2 94 //printf("wrote control data\r\n");
mfiore 4:ae35903cd8d2 95
falingtrea 0:d2169fecf3fb 96 do {
falingtrea 0:d2169fecf3fb 97 osDelay(10);
falingtrea 0:d2169fecf3fb 98 } while (!_gps_uart->txEmpty());
mfiore 4:ae35903cd8d2 99
falingtrea 0:d2169fecf3fb 100 osDelay(15);
mfiore 4:ae35903cd8d2 101
mfiore 4:ae35903cd8d2 102 if (_gps_uart->readable()) {
mfiore 4:ae35903cd8d2 103 do {
falingtrea 0:d2169fecf3fb 104 _gps_uart->read(chk_char,20);
falingtrea 0:d2169fecf3fb 105 } while ((chk_char != 0xA0) && (!_gps_uart->rxEmpty()));
mfiore 4:ae35903cd8d2 106
Mike Fiore 8:5fa40fa372e2 107 //printf ("found 0xA0 or rx empty\r\n");
mfiore 4:ae35903cd8d2 108
mfiore 4:ae35903cd8d2 109 if (chk_char == 0xA0) {
falingtrea 0:d2169fecf3fb 110 _gps_uart->read(chk_char,15);
falingtrea 0:d2169fecf3fb 111 if (chk_char != 0xA1) {
Mike Fiore 8:5fa40fa372e2 112 //printf( "initGPS failed no message\r\n");
falingtrea 0:d2169fecf3fb 113 ret = 1;
mfiore 4:ae35903cd8d2 114 } else {
Mike Fiore 8:5fa40fa372e2 115 //printf("message received\r\n");
falingtrea 0:d2169fecf3fb 116 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 117 _gps_uart->read(chk_char);
Mike Fiore 8:5fa40fa372e2 118 //printf("message size - %x\r\n",chk_char);
falingtrea 0:d2169fecf3fb 119 _gps_uart->read(chk_char);
mfiore 4:ae35903cd8d2 120 if (chk_char != 0x83) {
Mike Fiore 8:5fa40fa372e2 121 //printf("initGPS failed not ack message\r\n");
falingtrea 0:d2169fecf3fb 122 ret = 1;
mfiore 4:ae35903cd8d2 123 } else {
Mike Fiore 8:5fa40fa372e2 124 //printf("ACK message received\r\n");
falingtrea 0:d2169fecf3fb 125 _gps_uart->read(chk_char);
Mike Fiore 8:5fa40fa372e2 126 //printf("config message acknowledged - ID - %x\r\n",chk_char);
falingtrea 0:d2169fecf3fb 127 }
falingtrea 0:d2169fecf3fb 128 }
mfiore 4:ae35903cd8d2 129 } else {
Mike Fiore 8:5fa40fa372e2 130 //printf("rx empty \r\n");
falingtrea 0:d2169fecf3fb 131 ret = 1;
falingtrea 0:d2169fecf3fb 132 }
mfiore 4:ae35903cd8d2 133 } else {
Mike Fiore 8:5fa40fa372e2 134 //printf("No readable characters\r\n");
falingtrea 0:d2169fecf3fb 135 ret = 1;
falingtrea 0:d2169fecf3fb 136 }
falingtrea 0:d2169fecf3fb 137
Mike Fiore 8:5fa40fa372e2 138 //printf("initGps done\r\n");
falingtrea 0:d2169fecf3fb 139 return ret;
falingtrea 0:d2169fecf3fb 140 }
falingtrea 0:d2169fecf3fb 141
mfiore 4:ae35903cd8d2 142 void GPSPARSER::startSentenceThread(void const *p)
mfiore 4:ae35903cd8d2 143 {
mfiore 4:ae35903cd8d2 144 GPSPARSER *instance = (GPSPARSER*)p;
mfiore 4:ae35903cd8d2 145 instance->readNemaSentence();
falingtrea 0:d2169fecf3fb 146 }
falingtrea 0:d2169fecf3fb 147
mfiore 4:ae35903cd8d2 148 void GPSPARSER::readNemaSentence (void)
mfiore 4:ae35903cd8d2 149 {
falingtrea 0:d2169fecf3fb 150 char chk_char;
mfiore 4:ae35903cd8d2 151 uint8_t calc_cksum;
falingtrea 0:d2169fecf3fb 152 uint8_t nema_cksum;
falingtrea 0:d2169fecf3fb 153 char nema_id[2];
falingtrea 0:d2169fecf3fb 154 char nema_str[80];
falingtrea 0:d2169fecf3fb 155 char cksum_str[2];
mfiore 4:ae35903cd8d2 156
falingtrea 0:d2169fecf3fb 157 _getSentenceThread.signal_wait(START_THREAD);
Mike Fiore 8:5fa40fa372e2 158 //printf("Got thread start\r\n");
Mike Fiore 7:bd1013ba8afd 159 if (_led) {
Mike Fiore 7:bd1013ba8afd 160 _tick.attach(this, &GPSPARSER::blinker, 0.5);
Mike Fiore 7:bd1013ba8afd 161 _tick_running = true;
Mike Fiore 7:bd1013ba8afd 162 }
mfiore 4:ae35903cd8d2 163
falingtrea 0:d2169fecf3fb 164 do {
mfiore 4:ae35903cd8d2 165 if (_gps_uart->readable() > 80) {
mfiore 4:ae35903cd8d2 166 do {
falingtrea 0:d2169fecf3fb 167 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 168 } while ((chk_char != '$') && (!_gps_uart->rxEmpty()));
mfiore 4:ae35903cd8d2 169
falingtrea 0:d2169fecf3fb 170 if (chk_char == '$') {
falingtrea 0:d2169fecf3fb 171 _gps_uart->read(nema_id,2);
mfiore 4:ae35903cd8d2 172 if (strpbrk(nema_id,"GP") != NULL) {
falingtrea 0:d2169fecf3fb 173 uint8_t i = 0;
falingtrea 0:d2169fecf3fb 174 calc_cksum = 0x17; // 8 bit XOR of G and P checksum seed
falingtrea 0:d2169fecf3fb 175 nema_cksum = 0; // initialize nema string checksum
falingtrea 0:d2169fecf3fb 176 memset(nema_str,0x00,80); // clear nema_str array
falingtrea 0:d2169fecf3fb 177 do {
falingtrea 0:d2169fecf3fb 178 _gps_uart->read(chk_char);
mfiore 4:ae35903cd8d2 179 if ((chk_char != 0x0D) && (chk_char != '*')) {
falingtrea 0:d2169fecf3fb 180 nema_str[i++] = chk_char;
falingtrea 0:d2169fecf3fb 181 calc_cksum ^= chk_char; // 8 bit XOR checksum
falingtrea 0:d2169fecf3fb 182 }
falingtrea 0:d2169fecf3fb 183 if (chk_char == '*') {
mfiore 4:ae35903cd8d2 184 _gps_uart->read(cksum_str,2);
falingtrea 0:d2169fecf3fb 185 nema_cksum = (uint8_t)strtoul(cksum_str,NULL,16);
falingtrea 0:d2169fecf3fb 186 }
falingtrea 0:d2169fecf3fb 187 } while (( chk_char != 0x0D) && !_gps_uart->rxEmpty());
mfiore 4:ae35903cd8d2 188
falingtrea 0:d2169fecf3fb 189 if (nema_cksum == calc_cksum)
falingtrea 0:d2169fecf3fb 190 if (strncmp (nema_str,"GGA",3) == 0)
falingtrea 0:d2169fecf3fb 191 parseGGA(nema_str);
falingtrea 0:d2169fecf3fb 192 else if (strncmp (nema_str,"GSA",3) == 0)
mfiore 4:ae35903cd8d2 193 parseGSA(nema_str);
mfiore 4:ae35903cd8d2 194 else if (strncmp (nema_str,"GSV",3) == 0)
mfiore 4:ae35903cd8d2 195 parseGSV(nema_str);
mfiore 4:ae35903cd8d2 196 else if (strncmp (nema_str,"GLL",3) == 0)
mfiore 4:ae35903cd8d2 197 parseGLL(nema_str);
mfiore 4:ae35903cd8d2 198 else if (strncmp (nema_str,"RMC",3) == 0)
mfiore 4:ae35903cd8d2 199 parseRMC(nema_str);
mfiore 4:ae35903cd8d2 200 else if (strncmp (nema_str,"VTG",3) == 0)
mfiore 4:ae35903cd8d2 201 parseVTG(nema_str);
mfiore 4:ae35903cd8d2 202 else if (strncmp (nema_str,"ZDA",3) == 0)
mfiore 4:ae35903cd8d2 203 parseZDA(nema_str);
mfiore 4:ae35903cd8d2 204 else
Mike Fiore 8:5fa40fa372e2 205 //printf("Unknown NEMA String Type\r\n");
falingtrea 0:d2169fecf3fb 206 else
Mike Fiore 8:5fa40fa372e2 207 //printf("NEMA String checksum error %x != %x\r\n",nema_cksum,calc_cksum);
falingtrea 0:d2169fecf3fb 208 }
mfiore 4:ae35903cd8d2 209 } else
Mike Fiore 8:5fa40fa372e2 210 //printf("RX empty before all data read\r\n");
falingtrea 0:d2169fecf3fb 211 }
falingtrea 0:d2169fecf3fb 212
Mike Fiore 6:2050b4795b66 213 if (_led) {
Mike Fiore 6:2050b4795b66 214 if (_fix_status >= 2) {
Mike Fiore 7:bd1013ba8afd 215 if (_tick_running) {
Mike Fiore 7:bd1013ba8afd 216 _tick.detach();
Mike Fiore 7:bd1013ba8afd 217 _tick_running = false;
Mike Fiore 7:bd1013ba8afd 218 }
Mike Fiore 6:2050b4795b66 219 _led->setPWM(NCP5623B::LED_3, 8);
Mike Fiore 7:bd1013ba8afd 220 } else {
Mike Fiore 7:bd1013ba8afd 221 if (! _tick_running) {
Mike Fiore 7:bd1013ba8afd 222 _tick.attach(this, &GPSPARSER::blinker, 0.5);
Mike Fiore 7:bd1013ba8afd 223 _tick_running = true;
Mike Fiore 7:bd1013ba8afd 224 }
Mike Fiore 6:2050b4795b66 225 }
Mike Fiore 6:2050b4795b66 226 }
Mike Fiore 6:2050b4795b66 227
falingtrea 0:d2169fecf3fb 228 osDelay(100);
falingtrea 0:d2169fecf3fb 229
falingtrea 0:d2169fecf3fb 230 } while(true);
falingtrea 0:d2169fecf3fb 231
falingtrea 0:d2169fecf3fb 232 }
falingtrea 0:d2169fecf3fb 233
mfiore 4:ae35903cd8d2 234 uint8_t GPSPARSER::parseGGA(char *nema_buf)
mfiore 4:ae35903cd8d2 235 {
falingtrea 0:d2169fecf3fb 236 char* token_str;
falingtrea 0:d2169fecf3fb 237 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 238
Mike Fiore 8:5fa40fa372e2 239 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 240
falingtrea 0:d2169fecf3fb 241 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 242 // skip timestamp
falingtrea 0:d2169fecf3fb 243 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 244 // skip latitude degrees minutes
falingtrea 0:d2169fecf3fb 245 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 246 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 247 // skip longitude degree minutes
falingtrea 0:d2169fecf3fb 248 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 249 token_str = strtok(NULL, ",");
mfiore 4:ae35903cd8d2 250 // read fix quality
falingtrea 0:d2169fecf3fb 251 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 252 _fix_quality = atoi(token_str);
falingtrea 0:d2169fecf3fb 253 // skip number of satellites and horizontal dilution
falingtrea 0:d2169fecf3fb 254 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 255 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 256 // read msl altitude in meters
falingtrea 0:d2169fecf3fb 257 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 258 _msl_altitude = atoi(token_str);
falingtrea 0:d2169fecf3fb 259
Mike Fiore 8:5fa40fa372e2 260 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 261
falingtrea 0:d2169fecf3fb 262 return ret;
falingtrea 0:d2169fecf3fb 263 }
mfiore 4:ae35903cd8d2 264
mfiore 4:ae35903cd8d2 265 uint8_t GPSPARSER::parseGSA(char *nema_buf)
mfiore 4:ae35903cd8d2 266 {
falingtrea 0:d2169fecf3fb 267 char* token_str;
falingtrea 0:d2169fecf3fb 268 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 269
Mike Fiore 8:5fa40fa372e2 270 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 271
falingtrea 0:d2169fecf3fb 272 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 273 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 274 // read fix status
falingtrea 0:d2169fecf3fb 275 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 276 _fix_status = atoi(token_str);
falingtrea 0:d2169fecf3fb 277 // read satellite PRNs
mfiore 4:ae35903cd8d2 278 for (uint8_t i=0; i<12; i++) {
falingtrea 0:d2169fecf3fb 279 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 280 _satellite_prn[i] = atoi(token_str);
falingtrea 0:d2169fecf3fb 281 }
Mike Fiore 8:5fa40fa372e2 282
Mike Fiore 8:5fa40fa372e2 283 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 284
falingtrea 0:d2169fecf3fb 285 return ret;
falingtrea 0:d2169fecf3fb 286 }
falingtrea 0:d2169fecf3fb 287
mfiore 4:ae35903cd8d2 288 uint8_t GPSPARSER::parseGSV(char *nema_buf)
mfiore 4:ae35903cd8d2 289 {
falingtrea 0:d2169fecf3fb 290 char* token_str;
falingtrea 0:d2169fecf3fb 291 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 292
Mike Fiore 8:5fa40fa372e2 293 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 294
falingtrea 0:d2169fecf3fb 295 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 296 // skip number of sentences and sentence number for now
falingtrea 0:d2169fecf3fb 297 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 298 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 299 // read Number of satellites
falingtrea 0:d2169fecf3fb 300 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 301 _num_satellites = atoi(token_str);
falingtrea 0:d2169fecf3fb 302 // add code to read satellite specs if needed
Mike Fiore 8:5fa40fa372e2 303
Mike Fiore 8:5fa40fa372e2 304 _mutex.unlock();
falingtrea 0:d2169fecf3fb 305
falingtrea 0:d2169fecf3fb 306 return ret;
falingtrea 0:d2169fecf3fb 307 }
falingtrea 0:d2169fecf3fb 308
mfiore 4:ae35903cd8d2 309 uint8_t GPSPARSER::parseRMC(char *nema_buf)
mfiore 4:ae35903cd8d2 310 {
falingtrea 0:d2169fecf3fb 311 char* token_str;
falingtrea 0:d2169fecf3fb 312 char temp_str[6];
falingtrea 0:d2169fecf3fb 313 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 314
Mike Fiore 8:5fa40fa372e2 315 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 316
falingtrea 0:d2169fecf3fb 317 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 318 // read timestamp
falingtrea 0:d2169fecf3fb 319 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 320 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 321 _timestamp.tm_hour = atoi(temp_str);
falingtrea 0:d2169fecf3fb 322 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 323 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 324 _timestamp.tm_min = atoi(temp_str);
falingtrea 0:d2169fecf3fb 325 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 326 strncpy(temp_str,token_str+4,2);
falingtrea 0:d2169fecf3fb 327 _timestamp.tm_sec = atoi(temp_str);
falingtrea 0:d2169fecf3fb 328 // set gps_status true = active
falingtrea 0:d2169fecf3fb 329 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 330 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 331 strncpy(temp_str,token_str,1);
falingtrea 0:d2169fecf3fb 332 if (temp_str[0] == 'A')
falingtrea 0:d2169fecf3fb 333 _gps_status = true;
falingtrea 0:d2169fecf3fb 334 else
falingtrea 0:d2169fecf3fb 335 _gps_status = false;
falingtrea 0:d2169fecf3fb 336 // read latitude degrees minutes
falingtrea 0:d2169fecf3fb 337 token_str = strtok(NULL, ".");
falingtrea 0:d2169fecf3fb 338 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 339 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 340 _gps_latitude.degrees = atoi(temp_str);
falingtrea 0:d2169fecf3fb 341 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 342 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 343 _gps_latitude.minutes = atoi(temp_str);
falingtrea 0:d2169fecf3fb 344 // read fractional minutes
falingtrea 0:d2169fecf3fb 345 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 346 _gps_latitude.seconds = atoi(token_str);
falingtrea 0:d2169fecf3fb 347 // read latitude hemisphere change sign if 'S'
falingtrea 0:d2169fecf3fb 348 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 349 if (token_str[0] == 'S')
falingtrea 0:d2169fecf3fb 350 _gps_latitude.degrees *= -1;
falingtrea 0:d2169fecf3fb 351 // read longitude degree minutes
falingtrea 0:d2169fecf3fb 352 token_str = strtok(NULL, ".");
falingtrea 0:d2169fecf3fb 353 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 354 strncpy(temp_str,token_str,3);
falingtrea 0:d2169fecf3fb 355 _gps_longitude.degrees = atoi(temp_str);
falingtrea 0:d2169fecf3fb 356 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 357 strncpy(temp_str,token_str+3,2);
falingtrea 0:d2169fecf3fb 358 _gps_longitude.minutes = atoi(temp_str);
falingtrea 0:d2169fecf3fb 359 // read fractional minutes
falingtrea 0:d2169fecf3fb 360 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 361 _gps_longitude.seconds = atoi(token_str);
falingtrea 0:d2169fecf3fb 362 // read longitude hemisphere change sign if 'W'
falingtrea 0:d2169fecf3fb 363 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 364 if (token_str[0] == 'W')
falingtrea 0:d2169fecf3fb 365 _gps_longitude.degrees *= -1;
falingtrea 0:d2169fecf3fb 366 // skip speed and track angle
falingtrea 0:d2169fecf3fb 367 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 368 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 369 // read date
falingtrea 0:d2169fecf3fb 370 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 371 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 372 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 373 _timestamp.tm_mday = atoi(temp_str);
falingtrea 0:d2169fecf3fb 374 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 375 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 376 _timestamp.tm_mon = atoi(temp_str) - 1;
falingtrea 0:d2169fecf3fb 377 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 378 strncpy(temp_str,token_str+4,2);
falingtrea 0:d2169fecf3fb 379 _timestamp.tm_year = atoi(temp_str) + 100;
falingtrea 0:d2169fecf3fb 380
Mike Fiore 8:5fa40fa372e2 381 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 382
falingtrea 0:d2169fecf3fb 383 return ret;
falingtrea 0:d2169fecf3fb 384 }
falingtrea 0:d2169fecf3fb 385
mfiore 4:ae35903cd8d2 386 uint8_t GPSPARSER::parseVTG(char *nema_buf)
mfiore 4:ae35903cd8d2 387 {
falingtrea 0:d2169fecf3fb 388 uint8_t ret = 0;
Mike Fiore 8:5fa40fa372e2 389 //printf("ParseVTG****\r\n");
Mike Fiore 8:5fa40fa372e2 390 //printf(nema_buf);
Mike Fiore 8:5fa40fa372e2 391 //printf("\r\n");
falingtrea 0:d2169fecf3fb 392 return ret;
falingtrea 0:d2169fecf3fb 393 }
falingtrea 0:d2169fecf3fb 394
mfiore 4:ae35903cd8d2 395 uint8_t GPSPARSER::parseGLL(char *nema_buf)
mfiore 4:ae35903cd8d2 396 {
falingtrea 0:d2169fecf3fb 397 uint8_t ret = 0;
Mike Fiore 8:5fa40fa372e2 398 //printf("ParseGLL*****\r\n");
Mike Fiore 8:5fa40fa372e2 399 //printf(nema_buf);
Mike Fiore 8:5fa40fa372e2 400 //printf("\r\n");
falingtrea 0:d2169fecf3fb 401 return ret;
falingtrea 0:d2169fecf3fb 402 }
falingtrea 0:d2169fecf3fb 403
mfiore 4:ae35903cd8d2 404 uint8_t GPSPARSER::parseZDA(char *nema_buf)
mfiore 4:ae35903cd8d2 405 {
falingtrea 0:d2169fecf3fb 406 uint8_t ret = 0;
Mike Fiore 8:5fa40fa372e2 407 //printf("ParseZDA******\r\n");
Mike Fiore 8:5fa40fa372e2 408 //printf(nema_buf);
Mike Fiore 8:5fa40fa372e2 409 //printf("\r\n");
falingtrea 0:d2169fecf3fb 410 return ret;
falingtrea 0:d2169fecf3fb 411 }
falingtrea 0:d2169fecf3fb 412
mfiore 4:ae35903cd8d2 413 bool GPSPARSER::gpsDetected(void)
mfiore 4:ae35903cd8d2 414 {
Mike Fiore 8:5fa40fa372e2 415 bool detected;
Mike Fiore 8:5fa40fa372e2 416
Mike Fiore 8:5fa40fa372e2 417 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 418 detected = _gps_detected;
Mike Fiore 8:5fa40fa372e2 419 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 420
Mike Fiore 8:5fa40fa372e2 421 return detected;
falingtrea 0:d2169fecf3fb 422 }
falingtrea 0:d2169fecf3fb 423
mfiore 4:ae35903cd8d2 424 GPSPARSER::longitude GPSPARSER::getLongitude(void)
mfiore 4:ae35903cd8d2 425 {
Mike Fiore 8:5fa40fa372e2 426 longitude lon;
Mike Fiore 8:5fa40fa372e2 427
Mike Fiore 8:5fa40fa372e2 428 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 429 lon = _gps_longitude;
Mike Fiore 8:5fa40fa372e2 430 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 431
Mike Fiore 8:5fa40fa372e2 432 return lon;
falingtrea 0:d2169fecf3fb 433 }
falingtrea 0:d2169fecf3fb 434
mfiore 4:ae35903cd8d2 435 GPSPARSER::latitude GPSPARSER::getLatitude(void)
mfiore 4:ae35903cd8d2 436 {
Mike Fiore 8:5fa40fa372e2 437 latitude lat;
Mike Fiore 8:5fa40fa372e2 438
Mike Fiore 8:5fa40fa372e2 439 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 440 lat = _gps_latitude;
Mike Fiore 8:5fa40fa372e2 441 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 442
Mike Fiore 8:5fa40fa372e2 443 return lat;
falingtrea 0:d2169fecf3fb 444 }
falingtrea 0:d2169fecf3fb 445
mfiore 4:ae35903cd8d2 446 struct tm GPSPARSER::getTimestamp(void) {
Mike Fiore 8:5fa40fa372e2 447 struct tm time;
Mike Fiore 8:5fa40fa372e2 448
Mike Fiore 8:5fa40fa372e2 449 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 450 time = _timestamp;
Mike Fiore 8:5fa40fa372e2 451 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 452
Mike Fiore 8:5fa40fa372e2 453 return time;
falingtrea 0:d2169fecf3fb 454 }
falingtrea 0:d2169fecf3fb 455
mfiore 4:ae35903cd8d2 456 bool GPSPARSER::getLockStatus(void)
mfiore 4:ae35903cd8d2 457 {
Mike Fiore 8:5fa40fa372e2 458 bool status;
Mike Fiore 8:5fa40fa372e2 459
Mike Fiore 8:5fa40fa372e2 460 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 461 status = _gps_status;
Mike Fiore 8:5fa40fa372e2 462 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 463
Mike Fiore 8:5fa40fa372e2 464 return status;
falingtrea 0:d2169fecf3fb 465 }
falingtrea 0:d2169fecf3fb 466
mfiore 4:ae35903cd8d2 467 uint8_t GPSPARSER::getFixStatus(void)
mfiore 4:ae35903cd8d2 468 {
Mike Fiore 8:5fa40fa372e2 469 uint8_t fix;
Mike Fiore 8:5fa40fa372e2 470
Mike Fiore 8:5fa40fa372e2 471 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 472 fix = _fix_status;
Mike Fiore 8:5fa40fa372e2 473 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 474
Mike Fiore 8:5fa40fa372e2 475 return fix;
falingtrea 0:d2169fecf3fb 476 }
falingtrea 0:d2169fecf3fb 477
mfiore 4:ae35903cd8d2 478 uint8_t GPSPARSER::getFixQuality(void)
mfiore 4:ae35903cd8d2 479 {
Mike Fiore 8:5fa40fa372e2 480 uint8_t fix;
Mike Fiore 8:5fa40fa372e2 481
Mike Fiore 8:5fa40fa372e2 482 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 483 fix = _fix_quality;
Mike Fiore 8:5fa40fa372e2 484 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 485
Mike Fiore 8:5fa40fa372e2 486 return fix;
falingtrea 0:d2169fecf3fb 487 }
falingtrea 0:d2169fecf3fb 488
mfiore 4:ae35903cd8d2 489 uint8_t GPSPARSER::getNumSatellites(void)
mfiore 4:ae35903cd8d2 490 {
Mike Fiore 8:5fa40fa372e2 491 uint8_t sats;
Mike Fiore 8:5fa40fa372e2 492
Mike Fiore 8:5fa40fa372e2 493 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 494 sats = _num_satellites;
Mike Fiore 8:5fa40fa372e2 495 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 496
Mike Fiore 8:5fa40fa372e2 497 return sats;
falingtrea 0:d2169fecf3fb 498 }
falingtrea 0:d2169fecf3fb 499
mfiore 4:ae35903cd8d2 500 int16_t GPSPARSER::getAltitude(void)
mfiore 4:ae35903cd8d2 501 {
Mike Fiore 8:5fa40fa372e2 502 int16_t alt;
Mike Fiore 8:5fa40fa372e2 503
Mike Fiore 8:5fa40fa372e2 504 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 505 alt = _msl_altitude;
Mike Fiore 8:5fa40fa372e2 506 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 507
Mike Fiore 8:5fa40fa372e2 508 return alt;
falingtrea 0:d2169fecf3fb 509 }
Mike Fiore 6:2050b4795b66 510
Mike Fiore 7:bd1013ba8afd 511 void GPSPARSER::blinker() {
Mike Fiore 7:bd1013ba8afd 512 _led_state = (_led_state == 0) ? 8 : 0;
Mike Fiore 7:bd1013ba8afd 513 _led->setPWM(NCP5623B::LED_3, _led_state);
Mike Fiore 7:bd1013ba8afd 514 }
Mike Fiore 7:bd1013ba8afd 515