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
Diff: GPSPARSER.cpp
- Revision:
- 8:5fa40fa372e2
- Parent:
- 7:bd1013ba8afd
- Child:
- 9:a4d4ab3b0f23
--- a/GPSPARSER.cpp Mon Dec 07 11:45:56 2015 -0600 +++ b/GPSPARSER.cpp Mon Dec 14 08:58:14 2015 -0600 @@ -60,9 +60,9 @@ if (GPSPARSER::initGps() == 0) { _gps_detected = true; _getSentenceThread.signal_set(START_THREAD); - printf("Started Nema Sentence Thread\r\n"); + //printf("Started Nema Sentence Thread\r\n"); } else { - printf("No GPS detected\r\n"); + //printf("No GPS detected\r\n"); _fix_status = 0; } @@ -88,10 +88,10 @@ uint8_t ret = 0; _gps_uart->rxClear(); - printf("Starting initGPS \r\n"); + //printf("Starting initGPS \r\n"); _gps_uart->write(init_gps,16); - printf("wrote control data\r\n"); + //printf("wrote control data\r\n"); do { osDelay(10); @@ -104,38 +104,38 @@ _gps_uart->read(chk_char,20); } while ((chk_char != 0xA0) && (!_gps_uart->rxEmpty())); - printf ("found 0xA0 or rx empty\r\n"); + //printf ("found 0xA0 or rx empty\r\n"); if (chk_char == 0xA0) { _gps_uart->read(chk_char,15); if (chk_char != 0xA1) { - printf( "initGPS failed no message\r\n"); + //printf( "initGPS failed no message\r\n"); ret = 1; } else { - printf("message received\r\n"); + //printf("message received\r\n"); _gps_uart->read(chk_char); _gps_uart->read(chk_char); - printf("message size - %x\r\n",chk_char); + //printf("message size - %x\r\n",chk_char); _gps_uart->read(chk_char); if (chk_char != 0x83) { - printf("initGPS failed not ack message\r\n"); + //printf("initGPS failed not ack message\r\n"); ret = 1; } else { - printf("ACK message received\r\n"); + //printf("ACK message received\r\n"); _gps_uart->read(chk_char); - printf("config message acknowledged - ID - %x\r\n",chk_char); + //printf("config message acknowledged - ID - %x\r\n",chk_char); } } } else { - printf("rx empty \r\n"); + //printf("rx empty \r\n"); ret = 1; } } else { - printf("No readable characters\r\n"); + //printf("No readable characters\r\n"); ret = 1; } - printf("initGps done\r\n"); + //printf("initGps done\r\n"); return ret; } @@ -155,7 +155,7 @@ char cksum_str[2]; _getSentenceThread.signal_wait(START_THREAD); - printf("Got thread start\r\n"); + //printf("Got thread start\r\n"); if (_led) { _tick.attach(this, &GPSPARSER::blinker, 0.5); _tick_running = true; @@ -202,12 +202,12 @@ else if (strncmp (nema_str,"ZDA",3) == 0) parseZDA(nema_str); else - printf("Unknown NEMA String Type\r\n"); + //printf("Unknown NEMA String Type\r\n"); else - printf("NEMA String checksum error %x != %x\r\n",nema_cksum,calc_cksum); + //printf("NEMA String checksum error %x != %x\r\n",nema_cksum,calc_cksum); } } else - printf("RX empty before all data read\r\n"); + //printf("RX empty before all data read\r\n"); } if (_led) { @@ -236,6 +236,8 @@ char* token_str; uint8_t ret = 0; + _mutex.lock(); + token_str = strtok(nema_buf, ","); // skip timestamp token_str = strtok(NULL, ","); @@ -255,6 +257,8 @@ token_str = strtok(NULL, ","); _msl_altitude = atoi(token_str); + _mutex.unlock(); + return ret; } @@ -263,6 +267,8 @@ char* token_str; uint8_t ret = 0; + _mutex.lock(); + token_str = strtok(nema_buf, ","); token_str = strtok(NULL, ","); // read fix status @@ -273,6 +279,9 @@ token_str = strtok(NULL, ","); _satellite_prn[i] = atoi(token_str); } + + _mutex.unlock(); + return ret; } @@ -281,6 +290,8 @@ char* token_str; uint8_t ret = 0; + _mutex.lock(); + token_str = strtok(nema_buf, ","); // skip number of sentences and sentence number for now token_str = strtok(NULL, ","); @@ -289,6 +300,8 @@ token_str = strtok(NULL, ","); _num_satellites = atoi(token_str); // add code to read satellite specs if needed + + _mutex.unlock(); return ret; } @@ -299,6 +312,8 @@ char temp_str[6]; uint8_t ret = 0; + _mutex.lock(); + token_str = strtok(nema_buf, ","); // read timestamp token_str = strtok(NULL, ","); @@ -363,78 +378,134 @@ strncpy(temp_str,token_str+4,2); _timestamp.tm_year = atoi(temp_str) + 100; + _mutex.unlock(); + return ret; } uint8_t GPSPARSER::parseVTG(char *nema_buf) { uint8_t ret = 0; - printf("ParseVTG****\r\n"); - printf(nema_buf); - printf("\r\n"); + //printf("ParseVTG****\r\n"); + //printf(nema_buf); + //printf("\r\n"); return ret; } uint8_t GPSPARSER::parseGLL(char *nema_buf) { uint8_t ret = 0; - printf("ParseGLL*****\r\n"); - printf(nema_buf); - printf("\r\n"); + //printf("ParseGLL*****\r\n"); + //printf(nema_buf); + //printf("\r\n"); return ret; } uint8_t GPSPARSER::parseZDA(char *nema_buf) { uint8_t ret = 0; - printf("ParseZDA******\r\n"); - printf(nema_buf); - printf("\r\n"); + //printf("ParseZDA******\r\n"); + //printf(nema_buf); + //printf("\r\n"); return ret; } bool GPSPARSER::gpsDetected(void) { - return _gps_detected; + bool detected; + + _mutex.lock(); + detected = _gps_detected; + _mutex.unlock(); + + return detected; } GPSPARSER::longitude GPSPARSER::getLongitude(void) { - return _gps_longitude; + longitude lon; + + _mutex.lock(); + lon = _gps_longitude; + _mutex.unlock(); + + return lon; } GPSPARSER::latitude GPSPARSER::getLatitude(void) { - return _gps_latitude; + latitude lat; + + _mutex.lock(); + lat = _gps_latitude; + _mutex.unlock(); + + return lat; } struct tm GPSPARSER::getTimestamp(void) { - return _timestamp; + struct tm time; + + _mutex.lock(); + time = _timestamp; + _mutex.unlock(); + + return time; } bool GPSPARSER::getLockStatus(void) { - return _gps_status; + bool status; + + _mutex.lock(); + status = _gps_status; + _mutex.unlock(); + + return status; } uint8_t GPSPARSER::getFixStatus(void) { - return _fix_status; + uint8_t fix; + + _mutex.lock(); + fix = _fix_status; + _mutex.unlock(); + + return fix; } uint8_t GPSPARSER::getFixQuality(void) { - return _fix_quality; + uint8_t fix; + + _mutex.lock(); + fix = _fix_quality; + _mutex.unlock(); + + return fix; } uint8_t GPSPARSER::getNumSatellites(void) { - return _num_satellites; + uint8_t sats; + + _mutex.lock(); + sats = _num_satellites; + _mutex.unlock(); + + return sats; } int16_t GPSPARSER::getAltitude(void) { - return _msl_altitude; + int16_t alt; + + _mutex.lock(); + alt = _msl_altitude; + _mutex.unlock(); + + return alt; } void GPSPARSER::blinker() {