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