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:
falingtrea
Date:
Thu Sep 10 20:03:21 2015 +0000
Revision:
0:d2169fecf3fb
Child:
1:58c50bb3c60c
Initial release. Only supports SkyTraq Venus GPS chip

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 0:d2169fecf3fb 5 * @version 1.0
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 0:d2169fecf3fb 23 * TODO: Add speed, compass direction, error (DOP) data. Make init more generic
falingtrea 0:d2169fecf3fb 24 */
falingtrea 0:d2169fecf3fb 25
falingtrea 0:d2169fecf3fb 26 #include "GPSPARSER.h"
falingtrea 0:d2169fecf3fb 27
falingtrea 0:d2169fecf3fb 28 using namespace mts;
falingtrea 0:d2169fecf3fb 29
falingtrea 0:d2169fecf3fb 30 GPSPARSER::GPSPARSER(MTSSerial *uart)
falingtrea 0:d2169fecf3fb 31 : _getSentenceThread(&GPSPARSER::startSentenceThread,this)
falingtrea 0:d2169fecf3fb 32 {
falingtrea 0:d2169fecf3fb 33 _gps_uart = uart;
falingtrea 0:d2169fecf3fb 34 _gps_uart->baud(9600); //set GPS baud rate here
falingtrea 0:d2169fecf3fb 35
falingtrea 0:d2169fecf3fb 36 _gps_latitude.degrees = 0;
falingtrea 0:d2169fecf3fb 37 _gps_longitude.degrees = 0;
falingtrea 0:d2169fecf3fb 38 _timestamp.tm_sec = 0;
falingtrea 0:d2169fecf3fb 39 _timestamp.tm_min = 0;
falingtrea 0:d2169fecf3fb 40 _timestamp.tm_hour = 0;
falingtrea 0:d2169fecf3fb 41 _timestamp.tm_mday = 0;
falingtrea 0:d2169fecf3fb 42 _timestamp.tm_mon = 0;
falingtrea 0:d2169fecf3fb 43 _timestamp.tm_year = 0;
falingtrea 0:d2169fecf3fb 44 _timestamp.tm_wday = 0;
falingtrea 0:d2169fecf3fb 45 _timestamp.tm_yday = 0;
falingtrea 0:d2169fecf3fb 46 _timestamp.tm_isdst = -1; // time is UTC so no Daylight savings time
falingtrea 0:d2169fecf3fb 47
falingtrea 0:d2169fecf3fb 48 _gps_status = false;
falingtrea 0:d2169fecf3fb 49 _fix_status = 0;
falingtrea 0:d2169fecf3fb 50 _num_satellites =0;
falingtrea 0:d2169fecf3fb 51 _gps_detected = false;
falingtrea 0:d2169fecf3fb 52
falingtrea 0:d2169fecf3fb 53 if (GPSPARSER::initGps() == 0){
falingtrea 0:d2169fecf3fb 54 _gps_detected = true;
falingtrea 0:d2169fecf3fb 55 _getSentenceThread.signal_set(START_THREAD);
falingtrea 0:d2169fecf3fb 56 printf("Started Nema Sentence Thread\r\n");
falingtrea 0:d2169fecf3fb 57 }
falingtrea 0:d2169fecf3fb 58 else
falingtrea 0:d2169fecf3fb 59 printf("No GPS detected");
falingtrea 0:d2169fecf3fb 60
falingtrea 0:d2169fecf3fb 61 return;
falingtrea 0:d2169fecf3fb 62 }
falingtrea 0:d2169fecf3fb 63
falingtrea 0:d2169fecf3fb 64 GPSPARSER::~GPSPARSER(void){
falingtrea 0:d2169fecf3fb 65 if (_gps_detected)
falingtrea 0:d2169fecf3fb 66 _getSentenceThread.terminate();
falingtrea 0:d2169fecf3fb 67 }
falingtrea 0:d2169fecf3fb 68
falingtrea 0:d2169fecf3fb 69 uint8_t GPSPARSER::initGps (void){
falingtrea 0:d2169fecf3fb 70
falingtrea 0:d2169fecf3fb 71 // this code is specific to the Skytraq Venus GPS chip. This code could be re-written to detect another type of
falingtrea 0:d2169fecf3fb 72 // GPS device. Maybe read serial port for a specific time and detect $GP from NEMA string
falingtrea 0:d2169fecf3fb 73
falingtrea 0:d2169fecf3fb 74 // Sets Skytraq Venus GPS to output GGA,GSA every 240 seconds, GSV every 30 seconds, and RMC every second, no ZDA,GLL,VTG
falingtrea 0:d2169fecf3fb 75 // setup string for GPS GGA GSA GSV GLL RMC VTG ZDA cksum
falingtrea 0:d2169fecf3fb 76 char init_gps[16] = {0xA0,0xA1,0x00,0x09,0x08,0xF0,0xF0,0x1E,0x00,0x01,0x00,0x00,0x00,0x17,0x0D,0x0A};
falingtrea 0:d2169fecf3fb 77 char chk_char;
falingtrea 0:d2169fecf3fb 78 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 79
falingtrea 0:d2169fecf3fb 80 _gps_uart->rxClear();
falingtrea 0:d2169fecf3fb 81 printf("Starting initGPS \r\n");
falingtrea 0:d2169fecf3fb 82
falingtrea 0:d2169fecf3fb 83 _gps_uart->write(init_gps,16);
falingtrea 0:d2169fecf3fb 84 printf("wrote control data\r\n");
falingtrea 0:d2169fecf3fb 85
falingtrea 0:d2169fecf3fb 86 do {
falingtrea 0:d2169fecf3fb 87 osDelay(10);
falingtrea 0:d2169fecf3fb 88 } while (!_gps_uart->txEmpty());
falingtrea 0:d2169fecf3fb 89
falingtrea 0:d2169fecf3fb 90 osDelay(15);
falingtrea 0:d2169fecf3fb 91
falingtrea 0:d2169fecf3fb 92 if (_gps_uart->readable()){
falingtrea 0:d2169fecf3fb 93 do{
falingtrea 0:d2169fecf3fb 94 _gps_uart->read(chk_char,20);
falingtrea 0:d2169fecf3fb 95 } while ((chk_char != 0xA0) && (!_gps_uart->rxEmpty()));
falingtrea 0:d2169fecf3fb 96
falingtrea 0:d2169fecf3fb 97 printf ("found 0xA0 or rx empty\r\n");
falingtrea 0:d2169fecf3fb 98
falingtrea 0:d2169fecf3fb 99 if (chk_char == 0xA0){
falingtrea 0:d2169fecf3fb 100 _gps_uart->read(chk_char,15);
falingtrea 0:d2169fecf3fb 101 if (chk_char != 0xA1) {
falingtrea 0:d2169fecf3fb 102 printf( "initGPS failed no message\r\n");
falingtrea 0:d2169fecf3fb 103 ret = 1;
falingtrea 0:d2169fecf3fb 104 }
falingtrea 0:d2169fecf3fb 105 else {
falingtrea 0:d2169fecf3fb 106 printf("message received\r\n");
falingtrea 0:d2169fecf3fb 107 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 108 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 109 printf("message size - %x\r\n",chk_char);
falingtrea 0:d2169fecf3fb 110 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 111 if (chk_char != 0x83){
falingtrea 0:d2169fecf3fb 112 printf("initGPS failed not ack message\r\n");
falingtrea 0:d2169fecf3fb 113 ret = 1;
falingtrea 0:d2169fecf3fb 114 }
falingtrea 0:d2169fecf3fb 115 else {
falingtrea 0:d2169fecf3fb 116 printf("ACK message received\r\n");
falingtrea 0:d2169fecf3fb 117 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 118 printf("config message acknowledged - ID - %x\r\n",chk_char);
falingtrea 0:d2169fecf3fb 119 }
falingtrea 0:d2169fecf3fb 120 }
falingtrea 0:d2169fecf3fb 121 }
falingtrea 0:d2169fecf3fb 122 else {
falingtrea 0:d2169fecf3fb 123 printf("rx empty \r\n");
falingtrea 0:d2169fecf3fb 124 ret = 1;
falingtrea 0:d2169fecf3fb 125 }
falingtrea 0:d2169fecf3fb 126 }
falingtrea 0:d2169fecf3fb 127 else {
falingtrea 0:d2169fecf3fb 128 printf("No readable characters\r\n");
falingtrea 0:d2169fecf3fb 129 ret = 1;
falingtrea 0:d2169fecf3fb 130 }
falingtrea 0:d2169fecf3fb 131
falingtrea 0:d2169fecf3fb 132 printf("initGps done\r\n");
falingtrea 0:d2169fecf3fb 133 return ret;
falingtrea 0:d2169fecf3fb 134 }
falingtrea 0:d2169fecf3fb 135
falingtrea 0:d2169fecf3fb 136 void GPSPARSER::startSentenceThread(void const *p){
falingtrea 0:d2169fecf3fb 137 GPSPARSER *instance = (GPSPARSER*)p;
falingtrea 0:d2169fecf3fb 138 instance->readNemaSentence();
falingtrea 0:d2169fecf3fb 139 }
falingtrea 0:d2169fecf3fb 140
falingtrea 0:d2169fecf3fb 141 void GPSPARSER::readNemaSentence (void){
falingtrea 0:d2169fecf3fb 142 char chk_char;
falingtrea 0:d2169fecf3fb 143 uint8_t calc_cksum;
falingtrea 0:d2169fecf3fb 144 uint8_t nema_cksum;
falingtrea 0:d2169fecf3fb 145 char nema_id[2];
falingtrea 0:d2169fecf3fb 146 char nema_str[80];
falingtrea 0:d2169fecf3fb 147 char cksum_str[2];
falingtrea 0:d2169fecf3fb 148
falingtrea 0:d2169fecf3fb 149 _getSentenceThread.signal_wait(START_THREAD);
falingtrea 0:d2169fecf3fb 150 printf("Got thread start\r\n");
falingtrea 0:d2169fecf3fb 151
falingtrea 0:d2169fecf3fb 152 do {
falingtrea 0:d2169fecf3fb 153 if (_gps_uart->readable() > 80){
falingtrea 0:d2169fecf3fb 154 do{
falingtrea 0:d2169fecf3fb 155 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 156 } while ((chk_char != '$') && (!_gps_uart->rxEmpty()));
falingtrea 0:d2169fecf3fb 157
falingtrea 0:d2169fecf3fb 158 if (chk_char == '$') {
falingtrea 0:d2169fecf3fb 159 _gps_uart->read(nema_id,2);
falingtrea 0:d2169fecf3fb 160 if (strpbrk(nema_id,"GP") != NULL){
falingtrea 0:d2169fecf3fb 161 uint8_t i = 0;
falingtrea 0:d2169fecf3fb 162 calc_cksum = 0x17; // 8 bit XOR of G and P checksum seed
falingtrea 0:d2169fecf3fb 163 nema_cksum = 0; // initialize nema string checksum
falingtrea 0:d2169fecf3fb 164 memset(nema_str,0x00,80); // clear nema_str array
falingtrea 0:d2169fecf3fb 165 do {
falingtrea 0:d2169fecf3fb 166 _gps_uart->read(chk_char);
falingtrea 0:d2169fecf3fb 167 if ((chk_char != 0x0D) && (chk_char != '*')){
falingtrea 0:d2169fecf3fb 168 nema_str[i++] = chk_char;
falingtrea 0:d2169fecf3fb 169 calc_cksum ^= chk_char; // 8 bit XOR checksum
falingtrea 0:d2169fecf3fb 170 }
falingtrea 0:d2169fecf3fb 171 if (chk_char == '*') {
falingtrea 0:d2169fecf3fb 172 _gps_uart->read(cksum_str,2);
falingtrea 0:d2169fecf3fb 173 nema_cksum = (uint8_t)strtoul(cksum_str,NULL,16);
falingtrea 0:d2169fecf3fb 174 }
falingtrea 0:d2169fecf3fb 175 } while (( chk_char != 0x0D) && !_gps_uart->rxEmpty());
falingtrea 0:d2169fecf3fb 176
falingtrea 0:d2169fecf3fb 177 if (nema_cksum == calc_cksum)
falingtrea 0:d2169fecf3fb 178 if (strncmp (nema_str,"GGA",3) == 0)
falingtrea 0:d2169fecf3fb 179 parseGGA(nema_str);
falingtrea 0:d2169fecf3fb 180 else if (strncmp (nema_str,"GSA",3) == 0)
falingtrea 0:d2169fecf3fb 181 parseGSA(nema_str);
falingtrea 0:d2169fecf3fb 182 else if (strncmp (nema_str,"GSV",3) == 0)
falingtrea 0:d2169fecf3fb 183 parseGSV(nema_str);
falingtrea 0:d2169fecf3fb 184 else if (strncmp (nema_str,"GLL",3) == 0)
falingtrea 0:d2169fecf3fb 185 parseGLL(nema_str);
falingtrea 0:d2169fecf3fb 186 else if (strncmp (nema_str,"RMC",3) == 0)
falingtrea 0:d2169fecf3fb 187 parseRMC(nema_str);
falingtrea 0:d2169fecf3fb 188 else if (strncmp (nema_str,"VTG",3) == 0)
falingtrea 0:d2169fecf3fb 189 parseVTG(nema_str);
falingtrea 0:d2169fecf3fb 190 else if (strncmp (nema_str,"ZDA",3) == 0)
falingtrea 0:d2169fecf3fb 191 parseZDA(nema_str);
falingtrea 0:d2169fecf3fb 192 else
falingtrea 0:d2169fecf3fb 193 printf("Unknown NEMA String Type\r\n");
falingtrea 0:d2169fecf3fb 194 else
falingtrea 0:d2169fecf3fb 195 printf("NEMA String checksum error %x != %x\r\n",nema_cksum,calc_cksum);
falingtrea 0:d2169fecf3fb 196 }
falingtrea 0:d2169fecf3fb 197 }
falingtrea 0:d2169fecf3fb 198 else
falingtrea 0:d2169fecf3fb 199 printf("RX empty before all data read\r\n");
falingtrea 0:d2169fecf3fb 200 }
falingtrea 0:d2169fecf3fb 201
falingtrea 0:d2169fecf3fb 202 osDelay(100);
falingtrea 0:d2169fecf3fb 203
falingtrea 0:d2169fecf3fb 204 } while(true);
falingtrea 0:d2169fecf3fb 205
falingtrea 0:d2169fecf3fb 206 }
falingtrea 0:d2169fecf3fb 207
falingtrea 0:d2169fecf3fb 208 uint8_t GPSPARSER::parseGGA(char *nema_buf){
falingtrea 0:d2169fecf3fb 209 char* token_str;
falingtrea 0:d2169fecf3fb 210 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 211
falingtrea 0:d2169fecf3fb 212 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 213 // skip timestamp
falingtrea 0:d2169fecf3fb 214 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 215 // skip latitude degrees minutes
falingtrea 0:d2169fecf3fb 216 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 217 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 218 // skip longitude degree minutes
falingtrea 0:d2169fecf3fb 219 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 220 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 221 // read fix quality
falingtrea 0:d2169fecf3fb 222 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 223 _fix_quality = atoi(token_str);
falingtrea 0:d2169fecf3fb 224 // skip number of satellites and horizontal dilution
falingtrea 0:d2169fecf3fb 225 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 226 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 227 // read msl altitude in meters
falingtrea 0:d2169fecf3fb 228 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 229 _msl_altitude = atoi(token_str);
falingtrea 0:d2169fecf3fb 230
falingtrea 0:d2169fecf3fb 231 return ret;
falingtrea 0:d2169fecf3fb 232 }
falingtrea 0:d2169fecf3fb 233
falingtrea 0:d2169fecf3fb 234 uint8_t GPSPARSER::parseGSA(char *nema_buf){
falingtrea 0:d2169fecf3fb 235 char* token_str;
falingtrea 0:d2169fecf3fb 236 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 237
falingtrea 0:d2169fecf3fb 238 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 239 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 240 // read fix status
falingtrea 0:d2169fecf3fb 241 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 242 _fix_status = atoi(token_str);
falingtrea 0:d2169fecf3fb 243 // read satellite PRNs
falingtrea 0:d2169fecf3fb 244 for (uint8_t i=0;i<12;i++){
falingtrea 0:d2169fecf3fb 245 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 246 _satellite_prn[i] = atoi(token_str);
falingtrea 0:d2169fecf3fb 247 }
falingtrea 0:d2169fecf3fb 248 return ret;
falingtrea 0:d2169fecf3fb 249 }
falingtrea 0:d2169fecf3fb 250
falingtrea 0:d2169fecf3fb 251 uint8_t GPSPARSER::parseGSV(char *nema_buf){
falingtrea 0:d2169fecf3fb 252 char* token_str;
falingtrea 0:d2169fecf3fb 253 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 254
falingtrea 0:d2169fecf3fb 255 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 256 // skip number of sentences and sentence number for now
falingtrea 0:d2169fecf3fb 257 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 258 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 259 // read Number of satellites
falingtrea 0:d2169fecf3fb 260 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 261 _num_satellites = atoi(token_str);
falingtrea 0:d2169fecf3fb 262 // add code to read satellite specs if needed
falingtrea 0:d2169fecf3fb 263
falingtrea 0:d2169fecf3fb 264 return ret;
falingtrea 0:d2169fecf3fb 265 }
falingtrea 0:d2169fecf3fb 266
falingtrea 0:d2169fecf3fb 267 uint8_t GPSPARSER::parseRMC(char *nema_buf){
falingtrea 0:d2169fecf3fb 268 char* token_str;
falingtrea 0:d2169fecf3fb 269 char temp_str[6];
falingtrea 0:d2169fecf3fb 270 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 271
falingtrea 0:d2169fecf3fb 272 token_str = strtok(nema_buf, ",");
falingtrea 0:d2169fecf3fb 273 // read timestamp
falingtrea 0:d2169fecf3fb 274 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 275 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 276 _timestamp.tm_hour = atoi(temp_str);
falingtrea 0:d2169fecf3fb 277 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 278 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 279 _timestamp.tm_min = atoi(temp_str);
falingtrea 0:d2169fecf3fb 280 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 281 strncpy(temp_str,token_str+4,2);
falingtrea 0:d2169fecf3fb 282 _timestamp.tm_sec = atoi(temp_str);
falingtrea 0:d2169fecf3fb 283 // set gps_status true = active
falingtrea 0:d2169fecf3fb 284 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 285 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 286 strncpy(temp_str,token_str,1);
falingtrea 0:d2169fecf3fb 287 if (temp_str[0] == 'A')
falingtrea 0:d2169fecf3fb 288 _gps_status = true;
falingtrea 0:d2169fecf3fb 289 else
falingtrea 0:d2169fecf3fb 290 _gps_status = false;
falingtrea 0:d2169fecf3fb 291 // read latitude degrees minutes
falingtrea 0:d2169fecf3fb 292 token_str = strtok(NULL, ".");
falingtrea 0:d2169fecf3fb 293 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 294 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 295 _gps_latitude.degrees = atoi(temp_str);
falingtrea 0:d2169fecf3fb 296 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 297 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 298 _gps_latitude.minutes = atoi(temp_str);
falingtrea 0:d2169fecf3fb 299 // read fractional minutes
falingtrea 0:d2169fecf3fb 300 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 301 _gps_latitude.seconds = atoi(token_str);
falingtrea 0:d2169fecf3fb 302 // read latitude hemisphere change sign if 'S'
falingtrea 0:d2169fecf3fb 303 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 304 if (token_str[0] == 'S')
falingtrea 0:d2169fecf3fb 305 _gps_latitude.degrees *= -1;
falingtrea 0:d2169fecf3fb 306 // read longitude degree 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,3);
falingtrea 0:d2169fecf3fb 310 _gps_longitude.degrees = atoi(temp_str);
falingtrea 0:d2169fecf3fb 311 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 312 strncpy(temp_str,token_str+3,2);
falingtrea 0:d2169fecf3fb 313 _gps_longitude.minutes = atoi(temp_str);
falingtrea 0:d2169fecf3fb 314 // read fractional minutes
falingtrea 0:d2169fecf3fb 315 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 316 _gps_longitude.seconds = atoi(token_str);
falingtrea 0:d2169fecf3fb 317 // read longitude hemisphere change sign if 'W'
falingtrea 0:d2169fecf3fb 318 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 319 if (token_str[0] == 'W')
falingtrea 0:d2169fecf3fb 320 _gps_longitude.degrees *= -1;
falingtrea 0:d2169fecf3fb 321 // skip speed and track angle
falingtrea 0:d2169fecf3fb 322 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 323 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 324 // read date
falingtrea 0:d2169fecf3fb 325 token_str = strtok(NULL, ",");
falingtrea 0:d2169fecf3fb 326 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 327 strncpy(temp_str,token_str,2);
falingtrea 0:d2169fecf3fb 328 _timestamp.tm_mday = atoi(temp_str);
falingtrea 0:d2169fecf3fb 329 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 330 strncpy(temp_str,token_str+2,2);
falingtrea 0:d2169fecf3fb 331 _timestamp.tm_mon = atoi(temp_str) - 1;
falingtrea 0:d2169fecf3fb 332 memset(temp_str,0x00,6);
falingtrea 0:d2169fecf3fb 333 strncpy(temp_str,token_str+4,2);
falingtrea 0:d2169fecf3fb 334 _timestamp.tm_year = atoi(temp_str) + 100;
falingtrea 0:d2169fecf3fb 335
falingtrea 0:d2169fecf3fb 336 return ret;
falingtrea 0:d2169fecf3fb 337 }
falingtrea 0:d2169fecf3fb 338
falingtrea 0:d2169fecf3fb 339 uint8_t GPSPARSER::parseVTG(char *nema_buf){
falingtrea 0:d2169fecf3fb 340 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 341 printf("ParseVTG****\r\n");
falingtrea 0:d2169fecf3fb 342 printf(nema_buf);
falingtrea 0:d2169fecf3fb 343 printf("\r\n");
falingtrea 0:d2169fecf3fb 344 return ret;
falingtrea 0:d2169fecf3fb 345 }
falingtrea 0:d2169fecf3fb 346
falingtrea 0:d2169fecf3fb 347 uint8_t GPSPARSER::parseGLL(char *nema_buf){
falingtrea 0:d2169fecf3fb 348 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 349 printf("ParseGLL*****\r\n");
falingtrea 0:d2169fecf3fb 350 printf(nema_buf);
falingtrea 0:d2169fecf3fb 351 printf("\r\n");
falingtrea 0:d2169fecf3fb 352 return ret;
falingtrea 0:d2169fecf3fb 353 }
falingtrea 0:d2169fecf3fb 354
falingtrea 0:d2169fecf3fb 355 uint8_t GPSPARSER::parseZDA(char *nema_buf){
falingtrea 0:d2169fecf3fb 356 uint8_t ret = 0;
falingtrea 0:d2169fecf3fb 357 printf("ParseZDA******\r\n");
falingtrea 0:d2169fecf3fb 358 printf(nema_buf);
falingtrea 0:d2169fecf3fb 359 printf("\r\n");
falingtrea 0:d2169fecf3fb 360 return ret;
falingtrea 0:d2169fecf3fb 361 }
falingtrea 0:d2169fecf3fb 362
falingtrea 0:d2169fecf3fb 363 bool GPSPARSER::gpsDetected(void){
falingtrea 0:d2169fecf3fb 364 return _gps_detected;
falingtrea 0:d2169fecf3fb 365 }
falingtrea 0:d2169fecf3fb 366
falingtrea 0:d2169fecf3fb 367 GPSPARSER::longitude GPSPARSER::getLongitude(void){
falingtrea 0:d2169fecf3fb 368 return _gps_longitude;
falingtrea 0:d2169fecf3fb 369 }
falingtrea 0:d2169fecf3fb 370
falingtrea 0:d2169fecf3fb 371 GPSPARSER::latitude GPSPARSER::getLatitude(void){
falingtrea 0:d2169fecf3fb 372 return _gps_latitude;
falingtrea 0:d2169fecf3fb 373 }
falingtrea 0:d2169fecf3fb 374
falingtrea 0:d2169fecf3fb 375 struct tm GPSPARSER::getTimestamp(void){
falingtrea 0:d2169fecf3fb 376 return _timestamp;
falingtrea 0:d2169fecf3fb 377 }
falingtrea 0:d2169fecf3fb 378
falingtrea 0:d2169fecf3fb 379 bool GPSPARSER::getLockStatus(void){
falingtrea 0:d2169fecf3fb 380 return _gps_status;
falingtrea 0:d2169fecf3fb 381 }
falingtrea 0:d2169fecf3fb 382
falingtrea 0:d2169fecf3fb 383 uint8_t GPSPARSER::getFixStatus(void){
falingtrea 0:d2169fecf3fb 384 return _fix_status;
falingtrea 0:d2169fecf3fb 385 }
falingtrea 0:d2169fecf3fb 386
falingtrea 0:d2169fecf3fb 387 uint8_t GPSPARSER::getFixQuality(void){
falingtrea 0:d2169fecf3fb 388 return _fix_quality;
falingtrea 0:d2169fecf3fb 389 }
falingtrea 0:d2169fecf3fb 390
falingtrea 0:d2169fecf3fb 391 uint8_t GPSPARSER::getNumSatellites(void){
falingtrea 0:d2169fecf3fb 392 return _num_satellites;
falingtrea 0:d2169fecf3fb 393 }
falingtrea 0:d2169fecf3fb 394
falingtrea 0:d2169fecf3fb 395 int16_t GPSPARSER::getAltitude(void){
falingtrea 0:d2169fecf3fb 396 return _msl_altitude;
falingtrea 0:d2169fecf3fb 397 }