summaryrefslogtreecommitdiff
path: root/gnss-service/src/gnss-use-gpsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnss-service/src/gnss-use-gpsd.c')
-rw-r--r--gnss-service/src/gnss-use-gpsd.c271
1 files changed, 151 insertions, 120 deletions
diff --git a/gnss-service/src/gnss-use-gpsd.c b/gnss-service/src/gnss-use-gpsd.c
index dbbcaeb..bd80e57 100644
--- a/gnss-service/src/gnss-use-gpsd.c
+++ b/gnss-service/src/gnss-use-gpsd.c
@@ -23,10 +23,10 @@
#include <errno.h>
#include <pthread.h>
#include <assert.h>
+#include <math.h>
#include "globals.h"
-#include "gnss.h"
-#include "gnss-simple.h"
+#include "gnss-init.h"
#include "log.h"
#include "gps.h"
@@ -113,22 +113,87 @@ static EGNSSFixStatus convertToFixStatus(int fixMode)
return status;
}
-bool extractAccuracy(struct gps_data_t* pGpsData, TGNSSAccuracy* pAccuracy)
+bool extractPosition(struct gps_data_t* pGpsData, TGNSSPosition* pPosition)
{
+ static float oldHSpeed = 0;
+ static float oldVSpeed = 0;
+ static float oldHeading = 0;
static EGNSSFixStatus oldFixStatus = GNSS_FIX_STATUS_NO;
static uint16_t oldUsedSatellites = 0;
static uint16_t oldVisibleSatellites = 0;
+
+ bool positionAvailable = false;
+ bool velocityAvailable = false;
bool fixStatusChanged = false;
bool satellitesChanged = false;
- if(!pGpsData || !pAccuracy)
+ if(!pGpsData || !pPosition)
{
return false;
}
- pAccuracy->validityBits = 0;
+ pPosition->validityBits = 0;
- pAccuracy->timestamp = pGpsData->fix.time;
+ pPosition->timestamp = pGpsData->fix.time;
+
+ if( ((pGpsData->set & LATLON_SET) || (pGpsData->set & ALTITUDE_SET)) &&
+ (pGpsData->set & MODE_SET) &&
+ ((pGpsData->fix.mode == MODE_2D) || (pGpsData->fix.mode == MODE_3D)) )
+ {
+ positionAvailable = true;
+
+ if(pGpsData->set & LATLON_SET)
+ {
+ pPosition->validityBits |= GNSS_POSITION_LATITUDE_VALID;
+ pPosition->latitude = pGpsData->fix.latitude;
+
+ pPosition->validityBits |= GNSS_POSITION_LONGITUDE_VALID;
+ pPosition->longitude = pGpsData->fix.longitude;
+
+ LOG_DEBUG(gContext,"Latitude: %lf", pPosition->latitude);
+ LOG_DEBUG(gContext,"Longitude: %lf", pPosition->longitude);
+ }
+
+ if((pGpsData->set & ALTITUDE_SET) && (pGpsData->fix.mode == MODE_3D))
+ {
+ pPosition->validityBits |= GNSS_POSITION_ALTITUDEMSL_VALID;
+ pPosition->altitudeMSL = (float)pGpsData->fix.altitude;
+
+ LOG_DEBUG(gContext,"Altitude: %lf", pPosition->altitudeMSL);
+ }
+ }
+
+ if( ((pGpsData->set & SPEED_SET) && (oldHSpeed != (float)pGpsData->fix.speed)) ||
+ ((pGpsData->set & CLIMB_SET) && (oldVSpeed != (float)pGpsData->fix.climb)) ||
+ ((pGpsData->set & TRACK_SET) && (oldHeading != (float)pGpsData->fix.track)) )
+ {
+
+ velocityAvailable = true;
+
+ if(pGpsData->set & SPEED_SET)
+ {
+ oldHSpeed = pPosition->hSpeed;
+ pPosition->hSpeed = (float)pGpsData->fix.speed;
+ pPosition->validityBits |= GNSS_POSITION_HSPEED_VALID;
+ LOG_DEBUG(gContext,"Speed: %lf", pPosition->hSpeed);
+ }
+
+ if(pGpsData->set & CLIMB_SET)
+ {
+ oldVSpeed = pPosition->vSpeed;
+ pPosition->vSpeed = (float)pGpsData->fix.climb;
+ pPosition->validityBits |= GNSS_POSITION_VSPEED_VALID;
+ LOG_DEBUG(gContext,"Climb: %lf", pPosition->vSpeed);
+ }
+
+ if(pGpsData->set & TRACK_SET)
+ {
+ oldHeading = pPosition->heading;
+ pPosition->heading = (float)pGpsData->fix.track;
+ pPosition->validityBits |= GNSS_POSITION_HEADING_VALID;
+ LOG_DEBUG(gContext,"Heading: %lf", pPosition->heading);
+ }
+ }
fixStatusChanged = (oldFixStatus != convertToFixStatus(pGpsData->fix.mode));
@@ -139,139 +204,108 @@ bool extractAccuracy(struct gps_data_t* pGpsData, TGNSSAccuracy* pAccuracy)
(pGpsData->set & DOP_SET) ||
((pGpsData->set & SATELLITE_SET) && satellitesChanged))
{
- oldFixStatus = pAccuracy->fixStatus;
- pAccuracy->fixStatus = convertToFixStatus(pGpsData->fix.mode);
- pAccuracy->validityBits |= GNSS_ACCURACY_STAT_VALID;
- LOG_DEBUG(gContext,"FixStatus: %d", (int)pAccuracy->fixStatus);
+ oldFixStatus = pPosition->fixStatus;
+ pPosition->fixStatus = convertToFixStatus(pGpsData->fix.mode);
+ pPosition->validityBits |= GNSS_POSITION_STAT_VALID;
+ LOG_DEBUG(gContext,"FixStatus: %d", (int)pPosition->fixStatus);
+
+ //fixTypeBits: hardcoded
+ pPosition->fixTypeBits |= GNSS_FIX_TYPE_SINGLE_FREQUENCY;
+ pPosition->validityBits |= GNSS_POSITION_TYPE_VALID;
+
+ pPosition->pdop = (float)pGpsData->dop.pdop;
+ pPosition->validityBits |= GNSS_POSITION_PDOP_VALID;
+ LOG_DEBUG(gContext,"pdop: %lf", pPosition->pdop);
+
+ pPosition->hdop = (float)pGpsData->dop.hdop;
+ pPosition->validityBits |= GNSS_POSITION_HDOP_VALID;
+ LOG_DEBUG(gContext,"hdop: %lf", pPosition->hdop);
- pAccuracy->pdop = (float)pGpsData->dop.pdop;
- pAccuracy->validityBits |= GNSS_ACCURACY_PDOP_VALID;
- LOG_DEBUG(gContext,"pdop: %lf", pAccuracy->pdop);
+ pPosition->vdop = (float)pGpsData->dop.vdop;
+ pPosition->validityBits |= GNSS_POSITION_VDOP_VALID;
+ LOG_DEBUG(gContext,"vdop: %lf", pPosition->vdop);
- pAccuracy->hdop = (float)pGpsData->dop.hdop;
- pAccuracy->validityBits |= GNSS_ACCURACY_HDOP_VALID;
- LOG_DEBUG(gContext,"hdop: %lf", pAccuracy->hdop);
+ pPosition->sigmaHPosition = (float)pGpsData->fix.epx;
+ pPosition->validityBits |= GNSS_POSITION_SHPOS_VALID;
+ LOG_DEBUG(gContext,"sigmaHorPosition: %lf", pPosition->sigmaHPosition);
- pAccuracy->vdop = (float)pGpsData->dop.vdop;
- pAccuracy->validityBits |= GNSS_ACCURACY_VDOP_VALID;
- LOG_DEBUG(gContext,"vdop: %lf", pAccuracy->vdop);
+ pPosition->sigmaHSpeed = (float)pGpsData->fix.eps;
+ pPosition->validityBits |= GNSS_POSITION_SHSPEED_VALID;
+ LOG_DEBUG(gContext,"sigmaHorSpeed: %lf", pPosition->sigmaHSpeed);
+
+ pPosition->sigmaHeading = (float)pGpsData->fix.epd;
+ pPosition->validityBits |= GNSS_POSITION_SHEADING_VALID;
+ LOG_DEBUG(gContext,"sigmaHeading: %lf", pPosition->sigmaHeading);
if(pGpsData->satellites_used >= 0)
{
- oldUsedSatellites = pAccuracy->usedSatellites;
- pAccuracy->usedSatellites = (uint16_t)pGpsData->satellites_used;
- pAccuracy->validityBits |= GNSS_ACCURACY_USAT_VALID;
- LOG_DEBUG(gContext,"Used Satellites: %d", pAccuracy->usedSatellites);
+ oldUsedSatellites = pPosition->usedSatellites;
+ pPosition->usedSatellites = (uint16_t)pGpsData->satellites_used;
+ pPosition->validityBits |= GNSS_POSITION_USAT_VALID;
+ LOG_DEBUG(gContext,"Used Satellites: %d", pPosition->usedSatellites);
}
if(pGpsData->satellites_visible >= 0)
{
- oldVisibleSatellites = pAccuracy->visibleSatellites;
- pAccuracy->visibleSatellites = (uint16_t)pGpsData->satellites_visible;
- pAccuracy->validityBits |= GNSS_ACCURACY_VSAT_VALID;
- LOG_DEBUG(gContext,"Visible Satellites: %d", pAccuracy->visibleSatellites);
+ oldVisibleSatellites = pPosition->visibleSatellites;
+ pPosition->visibleSatellites = (uint16_t)pGpsData->satellites_visible;
+ pPosition->validityBits |= GNSS_POSITION_VSAT_VALID;
+ LOG_DEBUG(gContext,"Visible Satellites: %d", pPosition->visibleSatellites);
}
-
- if(cbAccuracy != 0)
+ }
+
+ if (positionAvailable || velocityAvailable || fixStatusChanged || satellitesChanged)
+ {
+ if(cbPosition != 0)
{
- cbAccuracy(pAccuracy,1);
+ cbPosition(pPosition,1);
}
}
+
return true;
}
-bool extractPosition(struct gps_data_t* pGpsData, TGNSSPosition* pPosition)
+bool extractTime(struct gps_data_t* pGpsData, TGNSSTime* pTime)
{
- if(!pGpsData || !pPosition)
- {
- return false;
- }
+ static timestamp_t oldTime = 0;
- if( ((pGpsData->set & LATLON_SET) || (pGpsData->set & ALTITUDE_SET)) &&
- (pGpsData->set & MODE_SET) &&
- ((pGpsData->fix.mode == MODE_2D) || (pGpsData->fix.mode == MODE_3D)) )
- {
- pPosition->validityBits = 0;
-
- pPosition->timestamp = pGpsData->fix.time;
-
- if(pGpsData->set & LATLON_SET)
- {
- pPosition->validityBits |= GNSS_ACCURACY_SLAT_VALID;
- pPosition->latitude = pGpsData->fix.latitude;
-
- pPosition->validityBits |= GNSS_ACCURACY_SLON_VALID;
- pPosition->longitude = pGpsData->fix.longitude;
-
- LOG_DEBUG(gContext,"Latitude: %lf", pPosition->latitude);
- LOG_DEBUG(gContext,"Longitude: %lf", pPosition->longitude);
- }
-
- if((pGpsData->set & ALTITUDE_SET) && (pGpsData->fix.mode == MODE_3D))
- {
- pPosition->validityBits |= GNSS_ACCURACY_SALT_VALID;
- pPosition->altitude = (float)pGpsData->fix.altitude;
-
- LOG_DEBUG(gContext,"Altitude: %lf", pPosition->altitude);
- }
-
- if (cbPosition != 0)
- {
- cbPosition(pPosition,1);
- }
- }
- return true;
-}
-
-bool extractCourse(struct gps_data_t* pGpsData, TGNSSCourse* pCourse)
-{
- static float oldSpeed = 0;
- static float oldClimb = 0;
- static float oldHeading = 0;
-
- if(!pGpsData || !pCourse)
- {
+ if(!pGpsData || !pTime)
+ {
return false;
- }
+ }
- pCourse->validityBits = 0;
-
- if( ((pGpsData->set & SPEED_SET) && (oldSpeed != (float)pGpsData->fix.speed)) ||
- ((pGpsData->set & CLIMB_SET) && (oldClimb != (float)pGpsData->fix.climb)) ||
- ((pGpsData->set & TRACK_SET) && (oldHeading != (float)pGpsData->fix.track)) )
+ if ((pGpsData->set & TIME_SET) && (oldTime != pGpsData->fix.time))
{
- if(pGpsData->set & SPEED_SET)
- {
- oldSpeed = pCourse->speed;
- pCourse->speed = (float)pGpsData->fix.speed;
- pCourse->validityBits |= GNSS_COURSE_SPEED_VALID;
- LOG_DEBUG(gContext,"Speed: %lf", pCourse->speed);
- }
+ char month [12] [4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+ pTime->validityBits = 0;
+ pTime->timestamp = pGpsData->fix.time;
- if(pGpsData->set & CLIMB_SET)
- {
- oldClimb = pCourse->climb;
- pCourse->climb = (float)pGpsData->fix.climb;
- pCourse->validityBits |= GNSS_COURSE_CLIMB_VALID;
- LOG_DEBUG(gContext,"Climb: %lf", pCourse->climb);
- }
-
- if(pGpsData->set & TRACK_SET)
- {
- oldHeading = pCourse->heading;
- pCourse->heading = (float)pGpsData->fix.track;
- pCourse->validityBits |= GNSS_COURSE_HEADING_VALID;
- LOG_DEBUG(gContext,"Heading: %lf", pCourse->heading);
- }
-
- if(cbCourse != 0)
- {
- cbCourse(pCourse,1);
- }
+ if(pGpsData->set & TIME_SET)
+ {
+ oldTime = pGpsData->fix.time;
+ time_t unix_sec = pGpsData->fix.time;
+ struct tm * ptm = gmtime (&unix_sec);
+ pTime->year = ptm->tm_year+1900;
+ pTime->month = ptm->tm_mon;
+ pTime->day = ptm->tm_mday;
+ pTime->hour = ptm->tm_hour;
+ pTime->minute = ptm->tm_min;
+ pTime->second = ptm->tm_sec;
+ pTime->ms = 1000*fmod(pGpsData->fix.time, 1.0);
+ pTime->validityBits |= GNSS_TIME_TIME_VALID | GNSS_TIME_DATE_VALID;
+ LOG_DEBUG(gContext,"UTC: %04d-%s-%02d %02d:%02d:%02d", pTime->year, month[pTime->month%12], pTime->day, pTime->hour, pTime->minute, pTime->second);
+ }
+
+ if(cbTime != 0)
+ {
+ cbTime(pTime,1);
+ }
}
return true;
}
+
void *listen( void *ptr )
{
char* server = "localhost";
@@ -317,21 +351,18 @@ void *listen( void *ptr )
{
pthread_mutex_lock(&mutexData);
+
if(!extractPosition(&gpsdata,&gPosition))
{
- LOG_ERROR_MSG(gContext,"error extracting position");
+ LOG_ERROR_MSG(gContext,"error extracting position data");
}
- if(!extractCourse(&gpsdata,&gCourse))
+ if(!extractTime(&gpsdata,&gTime))
{
- LOG_ERROR_MSG(gContext,"error extracting course");
- }
-
- if(!extractAccuracy(&gpsdata,&gAccuracy))
- {
- LOG_ERROR_MSG(gContext,"error extracting accuracy");
+ LOG_ERROR_MSG(gContext,"error extracting Time");
}
+
pthread_mutex_unlock(&mutexData);
}
}