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

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() {