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:
rklaassen
Date:
Thu Aug 10 12:04:29 2017 -0500
Revision:
11:73e776e41d23
Parent:
10:465f9db415ea
Child:
12:179474537b42
Fixed GPS not detected bug

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
Mike Fiore 10:465f9db415ea 60 _getSentenceThread.signal_set(START_THREAD);
mfiore 4:ae35903cd8d2 61
falingtrea 0:d2169fecf3fb 62 return;
falingtrea 0:d2169fecf3fb 63 }
falingtrea 0:d2169fecf3fb 64
mfiore 4:ae35903cd8d2 65 GPSPARSER::~GPSPARSER(void)
mfiore 4:ae35903cd8d2 66 {
falingtrea 0:d2169fecf3fb 67 if (_gps_detected)
falingtrea 0:d2169fecf3fb 68 _getSentenceThread.terminate();
falingtrea 0:d2169fecf3fb 69 }
falingtrea 0:d2169fecf3fb 70
mfiore 4:ae35903cd8d2 71 void GPSPARSER::startSentenceThread(void const *p)
mfiore 4:ae35903cd8d2 72 {
mfiore 4:ae35903cd8d2 73 GPSPARSER *instance = (GPSPARSER*)p;
mfiore 4:ae35903cd8d2 74 instance->readNemaSentence();
falingtrea 0:d2169fecf3fb 75 }
falingtrea 0:d2169fecf3fb 76
mfiore 4:ae35903cd8d2 77 void GPSPARSER::readNemaSentence (void)
mfiore 4:ae35903cd8d2 78 {
Mike Fiore 10:465f9db415ea 79 // this code is specific to the Skytraq Venus GPS chip. This code could be re-written to detect another type of
Mike Fiore 10:465f9db415ea 80 // GPS device. Maybe read serial port for a specific time and detect $GP from NEMA string
Mike Fiore 10:465f9db415ea 81
Mike Fiore 10:465f9db415ea 82 // Sets Skytraq Venus GPS to output GGA,GSA,GSV every 10 seconds, and RMC every second, no ZDA,GLL,VTG
Mike Fiore 10:465f9db415ea 83 // setup string for GPS GGA GSA GSV GLL RMC VTG ZDA cksum
Mike Fiore 10:465f9db415ea 84 char init_gps[16] = {0xA0,0xA1,0x00,0x09,0x08,0x0A,0x0A,0x0A,0x00,0x01,0x00,0x00,0x00,0x03,0x0D,0x0A};
falingtrea 0:d2169fecf3fb 85 char chk_char;
mfiore 4:ae35903cd8d2 86 uint8_t calc_cksum;
falingtrea 0:d2169fecf3fb 87 uint8_t nema_cksum;
falingtrea 0:d2169fecf3fb 88 char nema_id[2];
falingtrea 0:d2169fecf3fb 89 char nema_str[80];
falingtrea 0:d2169fecf3fb 90 char cksum_str[2];
mfiore 4:ae35903cd8d2 91
falingtrea 0:d2169fecf3fb 92 _getSentenceThread.signal_wait(START_THREAD);
Mike Fiore 10:465f9db415ea 93 //printf("GPS starting\r\n");
rklaassen 11:73e776e41d23 94 for(int i = 0; i < 10; i++){
Mike Fiore 10:465f9db415ea 95 _gps_uart->rxClear();
Mike Fiore 10:465f9db415ea 96 _gps_uart->write(init_gps, sizeof(init_gps));
Mike Fiore 10:465f9db415ea 97 while (! _gps_uart->readable())
Mike Fiore 10:465f9db415ea 98 osDelay(100);
Mike Fiore 10:465f9db415ea 99 do {
Mike Fiore 10:465f9db415ea 100 _gps_uart->read(chk_char);
Mike Fiore 10:465f9db415ea 101 //printf("read char %#X\r\n", chk_char);
Mike Fiore 10:465f9db415ea 102 } while ((chk_char != 0xA0) && (!_gps_uart->rxEmpty()));
Mike Fiore 10:465f9db415ea 103 if (chk_char == 0xA0) {
Mike Fiore 10:465f9db415ea 104 _gps_uart->read(chk_char);
Mike Fiore 10:465f9db415ea 105 //printf("read char %#X\r\n", chk_char);
Mike Fiore 10:465f9db415ea 106 if (chk_char == 0xA1) {
Mike Fiore 10:465f9db415ea 107 _gps_uart->read(chk_char);
Mike Fiore 10:465f9db415ea 108 //printf("read char %#X\r\n", chk_char);
Mike Fiore 10:465f9db415ea 109 _gps_uart->read(chk_char);
Mike Fiore 10:465f9db415ea 110 //printf("read char %#X\r\n", chk_char);
Mike Fiore 10:465f9db415ea 111 _gps_uart->read(chk_char);
Mike Fiore 10:465f9db415ea 112 //printf("read char %#X\r\n", chk_char);
Mike Fiore 10:465f9db415ea 113 if (chk_char == 0x83) {
Mike Fiore 10:465f9db415ea 114 _gps_detected = true;
rklaassen 11:73e776e41d23 115 break;
Mike Fiore 10:465f9db415ea 116 }
Mike Fiore 10:465f9db415ea 117 }
Mike Fiore 10:465f9db415ea 118 }
rklaassen 11:73e776e41d23 119 osDelay(50);
rklaassen 11:73e776e41d23 120 }
Mike Fiore 10:465f9db415ea 121 //printf("GPS detected %s\r\n", _gps_detected ? "true" : "false");
Mike Fiore 10:465f9db415ea 122
Mike Fiore 10:465f9db415ea 123 if (! _gps_detected) {
Mike Fiore 10:465f9db415ea 124 _fix_status = 0;
Mike Fiore 10:465f9db415ea 125 return;
Mike Fiore 10:465f9db415ea 126 }
Mike Fiore 10:465f9db415ea 127
Mike Fiore 7:bd1013ba8afd 128 if (_led) {
Mike Fiore 7:bd1013ba8afd 129 _tick.attach(this, &GPSPARSER::blinker, 0.5);
Mike Fiore 7:bd1013ba8afd 130 _tick_running = true;
Mike Fiore 7:bd1013ba8afd 131 }
mfiore 4:ae35903cd8d2 132
falingtrea 0:d2169fecf3fb 133 do {
mfiore 4:ae35903cd8d2 134 if (_gps_uart->readable() > 80) {
mfiore 4:ae35903cd8d2 135 do {
falingtrea 0:d2169fecf3fb 136 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 137 } while ((chk_char != '$') && (!_gps_uart->rxEmpty()));
mfiore 4:ae35903cd8d2 138
falingtrea 0:d2169fecf3fb 139 if (chk_char == '$') {
falingtrea 0:d2169fecf3fb 140 _gps_uart->read(nema_id,2);
mfiore 4:ae35903cd8d2 141 if (strpbrk(nema_id,"GP") != NULL) {
falingtrea 0:d2169fecf3fb 142 uint8_t i = 0;
falingtrea 0:d2169fecf3fb 143 calc_cksum = 0x17; // 8 bit XOR of G and P checksum seed
falingtrea 0:d2169fecf3fb 144 nema_cksum = 0; // initialize nema string checksum
falingtrea 0:d2169fecf3fb 145 memset(nema_str,0x00,80); // clear nema_str array
falingtrea 0:d2169fecf3fb 146 do {
falingtrea 0:d2169fecf3fb 147 _gps_uart->read(chk_char);
mfiore 4:ae35903cd8d2 148 if ((chk_char != 0x0D) && (chk_char != '*')) {
falingtrea 0:d2169fecf3fb 149 nema_str[i++] = chk_char;
falingtrea 0:d2169fecf3fb 150 calc_cksum ^= chk_char; // 8 bit XOR checksum
falingtrea 0:d2169fecf3fb 151 }
falingtrea 0:d2169fecf3fb 152 if (chk_char == '*') {
mfiore 4:ae35903cd8d2 153 _gps_uart->read(cksum_str,2);
falingtrea 0:d2169fecf3fb 154 nema_cksum = (uint8_t)strtoul(cksum_str,NULL,16);
falingtrea 0:d2169fecf3fb 155 }
falingtrea 0:d2169fecf3fb 156 } while (( chk_char != 0x0D) && !_gps_uart->rxEmpty());
mfiore 4:ae35903cd8d2 157
Mike Fiore 9:a4d4ab3b0f23 158 if (nema_cksum == calc_cksum) {
falingtrea 0:d2169fecf3fb 159 if (strncmp (nema_str,"GGA",3) == 0)
falingtrea 0:d2169fecf3fb 160 parseGGA(nema_str);
falingtrea 0:d2169fecf3fb 161 else if (strncmp (nema_str,"GSA",3) == 0)
mfiore 4:ae35903cd8d2 162 parseGSA(nema_str);
mfiore 4:ae35903cd8d2 163 else if (strncmp (nema_str,"GSV",3) == 0)
mfiore 4:ae35903cd8d2 164 parseGSV(nema_str);
mfiore 4:ae35903cd8d2 165 else if (strncmp (nema_str,"GLL",3) == 0)
mfiore 4:ae35903cd8d2 166 parseGLL(nema_str);
mfiore 4:ae35903cd8d2 167 else if (strncmp (nema_str,"RMC",3) == 0)
mfiore 4:ae35903cd8d2 168 parseRMC(nema_str);
mfiore 4:ae35903cd8d2 169 else if (strncmp (nema_str,"VTG",3) == 0)
mfiore 4:ae35903cd8d2 170 parseVTG(nema_str);
mfiore 4:ae35903cd8d2 171 else if (strncmp (nema_str,"ZDA",3) == 0)
mfiore 4:ae35903cd8d2 172 parseZDA(nema_str);
mfiore 4:ae35903cd8d2 173 else
Mike Fiore 9:a4d4ab3b0f23 174 printf("Unknown NEMA String Type\r\n");
Mike Fiore 9:a4d4ab3b0f23 175 } else {
Mike Fiore 9:a4d4ab3b0f23 176 printf("NEMA String checksum error %x != %x\r\n",nema_cksum,calc_cksum);
Mike Fiore 9:a4d4ab3b0f23 177 }
falingtrea 0:d2169fecf3fb 178 }
mfiore 4:ae35903cd8d2 179 } else
Mike Fiore 9:a4d4ab3b0f23 180 printf("RX empty before all data read\r\n");
falingtrea 0:d2169fecf3fb 181 }
falingtrea 0:d2169fecf3fb 182
Mike Fiore 6:2050b4795b66 183 if (_led) {
Mike Fiore 6:2050b4795b66 184 if (_fix_status >= 2) {
Mike Fiore 7:bd1013ba8afd 185 if (_tick_running) {
Mike Fiore 7:bd1013ba8afd 186 _tick.detach();
Mike Fiore 7:bd1013ba8afd 187 _tick_running = false;
Mike Fiore 7:bd1013ba8afd 188 }
Mike Fiore 6:2050b4795b66 189 _led->setPWM(NCP5623B::LED_3, 8);
Mike Fiore 7:bd1013ba8afd 190 } else {
Mike Fiore 7:bd1013ba8afd 191 if (! _tick_running) {
Mike Fiore 7:bd1013ba8afd 192 _tick.attach(this, &GPSPARSER::blinker, 0.5);
Mike Fiore 7:bd1013ba8afd 193 _tick_running = true;
Mike Fiore 7:bd1013ba8afd 194 }
Mike Fiore 6:2050b4795b66 195 }
Mike Fiore 6:2050b4795b66 196 }
Mike Fiore 6:2050b4795b66 197
falingtrea 0:d2169fecf3fb 198 osDelay(100);
falingtrea 0:d2169fecf3fb 199
falingtrea 0:d2169fecf3fb 200 } while(true);
falingtrea 0:d2169fecf3fb 201
falingtrea 0:d2169fecf3fb 202 }
falingtrea 0:d2169fecf3fb 203
mfiore 4:ae35903cd8d2 204 uint8_t GPSPARSER::parseGGA(char *nema_buf)
mfiore 4:ae35903cd8d2 205 {
falingtrea 0:d2169fecf3fb 206 char* token_str;
falingtrea 0:d2169fecf3fb 207 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 208
Mike Fiore 8:5fa40fa372e2 209 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 210
falingtrea 0:d2169fecf3fb 211 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 212 // skip timestamp
falingtrea 0:d2169fecf3fb 213 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 214 // skip latitude degrees minutes
falingtrea 0:d2169fecf3fb 215 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 216 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 217 // skip longitude degree minutes
falingtrea 0:d2169fecf3fb 218 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 219 token_str = strtok(NULL, ",");
mfiore 4:ae35903cd8d2 220 // read fix quality
falingtrea 0:d2169fecf3fb 221 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 222 _fix_quality = atoi(token_str);
falingtrea 0:d2169fecf3fb 223 // skip number of satellites and horizontal dilution
falingtrea 0:d2169fecf3fb 224 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 225 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 226 // read msl altitude in meters
falingtrea 0:d2169fecf3fb 227 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 228 _msl_altitude = atoi(token_str);
falingtrea 0:d2169fecf3fb 229
Mike Fiore 8:5fa40fa372e2 230 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 231
falingtrea 0:d2169fecf3fb 232 return ret;
falingtrea 0:d2169fecf3fb 233 }
mfiore 4:ae35903cd8d2 234
mfiore 4:ae35903cd8d2 235 uint8_t GPSPARSER::parseGSA(char *nema_buf)
mfiore 4:ae35903cd8d2 236 {
falingtrea 0:d2169fecf3fb 237 char* token_str;
falingtrea 0:d2169fecf3fb 238 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 239
Mike Fiore 8:5fa40fa372e2 240 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 241
falingtrea 0:d2169fecf3fb 242 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 243 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 244 // read fix status
falingtrea 0:d2169fecf3fb 245 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 246 _fix_status = atoi(token_str);
falingtrea 0:d2169fecf3fb 247 // read satellite PRNs
mfiore 4:ae35903cd8d2 248 for (uint8_t i=0; i<12; i++) {
falingtrea 0:d2169fecf3fb 249 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 250 _satellite_prn[i] = atoi(token_str);
falingtrea 0:d2169fecf3fb 251 }
Mike Fiore 8:5fa40fa372e2 252
Mike Fiore 8:5fa40fa372e2 253 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 254
falingtrea 0:d2169fecf3fb 255 return ret;
falingtrea 0:d2169fecf3fb 256 }
falingtrea 0:d2169fecf3fb 257
mfiore 4:ae35903cd8d2 258 uint8_t GPSPARSER::parseGSV(char *nema_buf)
mfiore 4:ae35903cd8d2 259 {
falingtrea 0:d2169fecf3fb 260 char* token_str;
falingtrea 0:d2169fecf3fb 261 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 262
Mike Fiore 8:5fa40fa372e2 263 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 264
falingtrea 0:d2169fecf3fb 265 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 266 // skip number of sentences and sentence number for now
falingtrea 0:d2169fecf3fb 267 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 268 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 269 // read Number of satellites
falingtrea 0:d2169fecf3fb 270 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 271 _num_satellites = atoi(token_str);
falingtrea 0:d2169fecf3fb 272 // add code to read satellite specs if needed
Mike Fiore 8:5fa40fa372e2 273
Mike Fiore 8:5fa40fa372e2 274 _mutex.unlock();
falingtrea 0:d2169fecf3fb 275
falingtrea 0:d2169fecf3fb 276 return ret;
falingtrea 0:d2169fecf3fb 277 }
falingtrea 0:d2169fecf3fb 278
mfiore 4:ae35903cd8d2 279 uint8_t GPSPARSER::parseRMC(char *nema_buf)
mfiore 4:ae35903cd8d2 280 {
falingtrea 0:d2169fecf3fb 281 char* token_str;
falingtrea 0:d2169fecf3fb 282 char temp_str[6];
falingtrea 0:d2169fecf3fb 283 uint8_t ret = 0;
mfiore 4:ae35903cd8d2 284
Mike Fiore 8:5fa40fa372e2 285 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 286
falingtrea 0:d2169fecf3fb 287 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 288 // read timestamp
falingtrea 0:d2169fecf3fb 289 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 290 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 291 _timestamp.tm_hour = atoi(temp_str);
falingtrea 0:d2169fecf3fb 292 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 293 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 294 _timestamp.tm_min = atoi(temp_str);
falingtrea 0:d2169fecf3fb 295 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 296 strncpy(temp_str,token_str+4,2);
falingtrea 0:d2169fecf3fb 297 _timestamp.tm_sec = atoi(temp_str);
falingtrea 0:d2169fecf3fb 298 // set gps_status true = active
falingtrea 0:d2169fecf3fb 299 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 300 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 301 strncpy(temp_str,token_str,1);
falingtrea 0:d2169fecf3fb 302 if (temp_str[0] == 'A')
falingtrea 0:d2169fecf3fb 303 _gps_status = true;
falingtrea 0:d2169fecf3fb 304 else
falingtrea 0:d2169fecf3fb 305 _gps_status = false;
falingtrea 0:d2169fecf3fb 306 // read latitude degrees minutes
falingtrea 0:d2169fecf3fb 307 token_str = strtok(NULL, ".");
falingtrea 0:d2169fecf3fb 308 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 309 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 310 _gps_latitude.degrees = atoi(temp_str);
falingtrea 0:d2169fecf3fb 311 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 312 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 313 _gps_latitude.minutes = atoi(temp_str);
falingtrea 0:d2169fecf3fb 314 // read fractional minutes
falingtrea 0:d2169fecf3fb 315 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 316 _gps_latitude.seconds = atoi(token_str);
falingtrea 0:d2169fecf3fb 317 // read latitude hemisphere change sign if 'S'
falingtrea 0:d2169fecf3fb 318 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 319 if (token_str[0] == 'S')
falingtrea 0:d2169fecf3fb 320 _gps_latitude.degrees *= -1;
falingtrea 0:d2169fecf3fb 321 // read longitude degree minutes
falingtrea 0:d2169fecf3fb 322 token_str = strtok(NULL, ".");
falingtrea 0:d2169fecf3fb 323 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 324 strncpy(temp_str,token_str,3);
falingtrea 0:d2169fecf3fb 325 _gps_longitude.degrees = atoi(temp_str);
falingtrea 0:d2169fecf3fb 326 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 327 strncpy(temp_str,token_str+3,2);
falingtrea 0:d2169fecf3fb 328 _gps_longitude.minutes = atoi(temp_str);
falingtrea 0:d2169fecf3fb 329 // read fractional minutes
falingtrea 0:d2169fecf3fb 330 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 331 _gps_longitude.seconds = atoi(token_str);
falingtrea 0:d2169fecf3fb 332 // read longitude hemisphere change sign if 'W'
falingtrea 0:d2169fecf3fb 333 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 334 if (token_str[0] == 'W')
falingtrea 0:d2169fecf3fb 335 _gps_longitude.degrees *= -1;
falingtrea 0:d2169fecf3fb 336 // skip speed and track angle
falingtrea 0:d2169fecf3fb 337 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 338 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 339 // read date
falingtrea 0:d2169fecf3fb 340 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 341 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 342 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 343 _timestamp.tm_mday = atoi(temp_str);
falingtrea 0:d2169fecf3fb 344 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 345 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 346 _timestamp.tm_mon = atoi(temp_str) - 1;
falingtrea 0:d2169fecf3fb 347 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 348 strncpy(temp_str,token_str+4,2);
falingtrea 0:d2169fecf3fb 349 _timestamp.tm_year = atoi(temp_str) + 100;
falingtrea 0:d2169fecf3fb 350
Mike Fiore 8:5fa40fa372e2 351 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 352
falingtrea 0:d2169fecf3fb 353 return ret;
falingtrea 0:d2169fecf3fb 354 }
falingtrea 0:d2169fecf3fb 355
mfiore 4:ae35903cd8d2 356 uint8_t GPSPARSER::parseVTG(char *nema_buf)
mfiore 4:ae35903cd8d2 357 {
falingtrea 0:d2169fecf3fb 358 uint8_t ret = 0;
Mike Fiore 8:5fa40fa372e2 359 //printf("ParseVTG****\r\n");
Mike Fiore 8:5fa40fa372e2 360 //printf(nema_buf);
Mike Fiore 8:5fa40fa372e2 361 //printf("\r\n");
falingtrea 0:d2169fecf3fb 362 return ret;
falingtrea 0:d2169fecf3fb 363 }
falingtrea 0:d2169fecf3fb 364
mfiore 4:ae35903cd8d2 365 uint8_t GPSPARSER::parseGLL(char *nema_buf)
mfiore 4:ae35903cd8d2 366 {
falingtrea 0:d2169fecf3fb 367 uint8_t ret = 0;
Mike Fiore 8:5fa40fa372e2 368 //printf("ParseGLL*****\r\n");
Mike Fiore 8:5fa40fa372e2 369 //printf(nema_buf);
Mike Fiore 8:5fa40fa372e2 370 //printf("\r\n");
falingtrea 0:d2169fecf3fb 371 return ret;
falingtrea 0:d2169fecf3fb 372 }
falingtrea 0:d2169fecf3fb 373
mfiore 4:ae35903cd8d2 374 uint8_t GPSPARSER::parseZDA(char *nema_buf)
mfiore 4:ae35903cd8d2 375 {
falingtrea 0:d2169fecf3fb 376 uint8_t ret = 0;
Mike Fiore 8:5fa40fa372e2 377 //printf("ParseZDA******\r\n");
Mike Fiore 8:5fa40fa372e2 378 //printf(nema_buf);
Mike Fiore 8:5fa40fa372e2 379 //printf("\r\n");
falingtrea 0:d2169fecf3fb 380 return ret;
falingtrea 0:d2169fecf3fb 381 }
falingtrea 0:d2169fecf3fb 382
mfiore 4:ae35903cd8d2 383 bool GPSPARSER::gpsDetected(void)
mfiore 4:ae35903cd8d2 384 {
Mike Fiore 8:5fa40fa372e2 385 bool detected;
Mike Fiore 8:5fa40fa372e2 386
Mike Fiore 8:5fa40fa372e2 387 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 388 detected = _gps_detected;
Mike Fiore 8:5fa40fa372e2 389 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 390
Mike Fiore 8:5fa40fa372e2 391 return detected;
falingtrea 0:d2169fecf3fb 392 }
falingtrea 0:d2169fecf3fb 393
mfiore 4:ae35903cd8d2 394 GPSPARSER::longitude GPSPARSER::getLongitude(void)
mfiore 4:ae35903cd8d2 395 {
Mike Fiore 8:5fa40fa372e2 396 longitude lon;
Mike Fiore 8:5fa40fa372e2 397
Mike Fiore 8:5fa40fa372e2 398 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 399 lon = _gps_longitude;
Mike Fiore 8:5fa40fa372e2 400 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 401
Mike Fiore 8:5fa40fa372e2 402 return lon;
falingtrea 0:d2169fecf3fb 403 }
falingtrea 0:d2169fecf3fb 404
mfiore 4:ae35903cd8d2 405 GPSPARSER::latitude GPSPARSER::getLatitude(void)
mfiore 4:ae35903cd8d2 406 {
Mike Fiore 8:5fa40fa372e2 407 latitude lat;
Mike Fiore 8:5fa40fa372e2 408
Mike Fiore 8:5fa40fa372e2 409 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 410 lat = _gps_latitude;
Mike Fiore 8:5fa40fa372e2 411 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 412
Mike Fiore 8:5fa40fa372e2 413 return lat;
falingtrea 0:d2169fecf3fb 414 }
falingtrea 0:d2169fecf3fb 415
mfiore 4:ae35903cd8d2 416 struct tm GPSPARSER::getTimestamp(void) {
Mike Fiore 8:5fa40fa372e2 417 struct tm time;
Mike Fiore 8:5fa40fa372e2 418
Mike Fiore 8:5fa40fa372e2 419 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 420 time = _timestamp;
Mike Fiore 8:5fa40fa372e2 421 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 422
Mike Fiore 8:5fa40fa372e2 423 return time;
falingtrea 0:d2169fecf3fb 424 }
falingtrea 0:d2169fecf3fb 425
mfiore 4:ae35903cd8d2 426 bool GPSPARSER::getLockStatus(void)
mfiore 4:ae35903cd8d2 427 {
Mike Fiore 8:5fa40fa372e2 428 bool status;
Mike Fiore 8:5fa40fa372e2 429
Mike Fiore 8:5fa40fa372e2 430 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 431 status = _gps_status;
Mike Fiore 8:5fa40fa372e2 432 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 433
Mike Fiore 8:5fa40fa372e2 434 return status;
falingtrea 0:d2169fecf3fb 435 }
falingtrea 0:d2169fecf3fb 436
mfiore 4:ae35903cd8d2 437 uint8_t GPSPARSER::getFixStatus(void)
mfiore 4:ae35903cd8d2 438 {
Mike Fiore 8:5fa40fa372e2 439 uint8_t fix;
Mike Fiore 8:5fa40fa372e2 440
Mike Fiore 8:5fa40fa372e2 441 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 442 fix = _fix_status;
Mike Fiore 8:5fa40fa372e2 443 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 444
Mike Fiore 8:5fa40fa372e2 445 return fix;
falingtrea 0:d2169fecf3fb 446 }
falingtrea 0:d2169fecf3fb 447
mfiore 4:ae35903cd8d2 448 uint8_t GPSPARSER::getFixQuality(void)
mfiore 4:ae35903cd8d2 449 {
Mike Fiore 8:5fa40fa372e2 450 uint8_t fix;
Mike Fiore 8:5fa40fa372e2 451
Mike Fiore 8:5fa40fa372e2 452 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 453 fix = _fix_quality;
Mike Fiore 8:5fa40fa372e2 454 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 455
Mike Fiore 8:5fa40fa372e2 456 return fix;
falingtrea 0:d2169fecf3fb 457 }
falingtrea 0:d2169fecf3fb 458
mfiore 4:ae35903cd8d2 459 uint8_t GPSPARSER::getNumSatellites(void)
mfiore 4:ae35903cd8d2 460 {
Mike Fiore 8:5fa40fa372e2 461 uint8_t sats;
Mike Fiore 8:5fa40fa372e2 462
Mike Fiore 8:5fa40fa372e2 463 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 464 sats = _num_satellites;
Mike Fiore 8:5fa40fa372e2 465 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 466
Mike Fiore 8:5fa40fa372e2 467 return sats;
falingtrea 0:d2169fecf3fb 468 }
falingtrea 0:d2169fecf3fb 469
mfiore 4:ae35903cd8d2 470 int16_t GPSPARSER::getAltitude(void)
mfiore 4:ae35903cd8d2 471 {
Mike Fiore 8:5fa40fa372e2 472 int16_t alt;
Mike Fiore 8:5fa40fa372e2 473
Mike Fiore 8:5fa40fa372e2 474 _mutex.lock();
Mike Fiore 8:5fa40fa372e2 475 alt = _msl_altitude;
Mike Fiore 8:5fa40fa372e2 476 _mutex.unlock();
Mike Fiore 8:5fa40fa372e2 477
Mike Fiore 8:5fa40fa372e2 478 return alt;
falingtrea 0:d2169fecf3fb 479 }
Mike Fiore 6:2050b4795b66 480
Mike Fiore 7:bd1013ba8afd 481 void GPSPARSER::blinker() {
Mike Fiore 7:bd1013ba8afd 482 _led_state = (_led_state == 0) ? 8 : 0;
Mike Fiore 7:bd1013ba8afd 483 _led->setPWM(NCP5623B::LED_3, _led_state);
Mike Fiore 7:bd1013ba8afd 484 }
Mike Fiore 7:bd1013ba8afd 485