summaryrefslogtreecommitdiff
path: root/enhanced-position-service/src/enhanced-position.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'enhanced-position-service/src/enhanced-position.cpp')
-rw-r--r--enhanced-position-service/src/enhanced-position.cpp406
1 files changed, 227 insertions, 179 deletions
diff --git a/enhanced-position-service/src/enhanced-position.cpp b/enhanced-position-service/src/enhanced-position.cpp
index a934883..3895909 100644
--- a/enhanced-position-service/src/enhanced-position.cpp
+++ b/enhanced-position-service/src/enhanced-position.cpp
@@ -84,8 +84,7 @@ std::map< uint16_t, ::DBus::Variant > EnhancedPosition::GetData(const std::vecto
{
std::map< uint16_t, ::DBus::Variant > Data;
- TGNSSPosition pos;
- TGNSSCourse course;
+ TGNSSSpatial spatial;
bool isPosRequested = false;
bool isCourseRequested = false;
@@ -96,7 +95,6 @@ std::map< uint16_t, ::DBus::Variant > EnhancedPosition::GetData(const std::vecto
(valuesToReturn[i] == POS_LONGITUDE) ||
(valuesToReturn[i] == POS_ALTITUDE))
{
- //if any of the three IDs above is set, then gnssSimpleGetPosition will have to be called
isPosRequested = true;
}
@@ -104,49 +102,48 @@ std::map< uint16_t, ::DBus::Variant > EnhancedPosition::GetData(const std::vecto
(valuesToReturn[i] == POS_SPEED) ||
(valuesToReturn[i] == POS_CLIMB ))
{
- //if any of the three IDs above is set, then gnssSimpleGetCourse will have to be called
isCourseRequested = true;
}
}
if(isPosRequested)
{
- if(gnssSimpleGetPosition(&pos))
+ if(gnssExtendedGetSpatial(&spatial))
{
- if (pos.validityBits && GNSS_POSITION_LATITUDE_VALID)
+ if (spatial.validityBits & GNSS_SPATIAL_LATITUDE_VALID)
{
- Data[POS_LATITUDE] = variant_double(pos.latitude);
+ Data[POS_LATITUDE] = variant_double(spatial.latitude);
}
- if (pos.validityBits && GNSS_POSITION_LONGITUDE_VALID)
+ if (spatial.validityBits & GNSS_SPATIAL_LONGITUDE_VALID)
{
- Data[POS_LONGITUDE] = variant_double(pos.longitude);
+ Data[POS_LONGITUDE] = variant_double(spatial.longitude);
}
- if (pos.validityBits && GNSS_POSITION_ALTITUDE_VALID)
+ if (spatial.validityBits & GNSS_SPATIAL_ALTITUDEMSL_VALID)
{
- Data[POS_ALTITUDE] = variant_double(pos.altitude);
+ Data[POS_ALTITUDE] = variant_double(spatial.altitudeMSL);
}
}
}
if(isCourseRequested)
{
- if(gnssSimpleGetCourse(&course))
+ if(gnssExtendedGetSpatial(&spatial))
{
- if (course.validityBits && GNSS_COURSE_SPEED_VALID)
+ if (spatial.validityBits & GNSS_SPATIAL_HEADING_VALID)
{
- Data[POS_HEADING] = variant_double(course.heading);
+ Data[POS_HEADING] = variant_double(spatial.heading);
}
- if (course.validityBits && GNSS_COURSE_CLIMB_VALID)
+ if (spatial.validityBits & GNSS_SPATIAL_HSPEED_VALID)
{
- Data[POS_SPEED] = variant_double(course.speed);
+ Data[POS_SPEED] = variant_double(spatial.hSpeed);
}
- if (course.validityBits && GNSS_COURSE_HEADING_VALID)
+ if (spatial.validityBits & GNSS_SPATIAL_VSPEED_VALID)
{
- Data[POS_CLIMB] = variant_double(course.climb);
+ Data[POS_CLIMB] = variant_double(spatial.vSpeed);
}
}
}
@@ -157,44 +154,40 @@ std::map< uint16_t, ::DBus::Variant > EnhancedPosition::GetData(const std::vecto
std::map< uint16_t, ::DBus::Variant > EnhancedPosition::GetPosition()
{
std::map< uint16_t, ::DBus::Variant > Position;
- TGNSSPosition pos;
- TGNSSCourse course;
+ TGNSSSpatial spatial;
- if (gnssSimpleGetPosition(&pos))
- {
- if (pos.validityBits && GNSS_POSITION_LATITUDE_VALID)
+ if(gnssExtendedGetSpatial(&spatial))
{
- Position[POS_LATITUDE] = variant_double(pos.latitude);
- }
+ if (spatial.validityBits & GNSS_SPATIAL_LATITUDE_VALID)
+ {
+ Position[POS_LATITUDE] = variant_double(spatial.latitude);
+ }
- if (pos.validityBits && GNSS_POSITION_LONGITUDE_VALID)
- {
- Position[POS_LONGITUDE] = variant_double(pos.longitude);
- }
+ if (spatial.validityBits & GNSS_SPATIAL_LONGITUDE_VALID)
+ {
+ Position[POS_LONGITUDE] = variant_double(spatial.longitude);
+ }
- if (pos.validityBits && GNSS_POSITION_ALTITUDE_VALID)
- {
- Position[POS_ALTITUDE] = variant_double(pos.altitude);
- }
- }
+ if (spatial.validityBits & GNSS_SPATIAL_ALTITUDEMSL_VALID)
+ {
+ Position[POS_ALTITUDE] = variant_double(spatial.altitudeMSL);
+ }
- if(gnssSimpleGetCourse(&course))
- {
- if (pos.validityBits && GNSS_COURSE_SPEED_VALID)
- {
- Position[POS_HEADING] = variant_double(course.heading);
- }
+ if (spatial.validityBits & GNSS_SPATIAL_HEADING_VALID)
+ {
+ Position[POS_HEADING] = variant_double(spatial.heading);
+ }
- if (pos.validityBits && GNSS_COURSE_CLIMB_VALID)
- {
- Position[POS_SPEED] = variant_double(course.speed);
- }
+ if (spatial.validityBits & GNSS_SPATIAL_HSPEED_VALID)
+ {
+ Position[POS_SPEED] = variant_double(spatial.hSpeed);
+ }
- if (pos.validityBits && GNSS_COURSE_HEADING_VALID)
- {
- Position[POS_CLIMB] = variant_double(course.climb);
+ if (spatial.validityBits & GNSS_SPATIAL_VSPEED_VALID)
+ {
+ Position[POS_CLIMB] = variant_double(spatial.vSpeed);
+ }
}
- }
return Position;
}
@@ -244,17 +237,20 @@ std::map< uint16_t, ::DBus::Variant > EnhancedPosition::GetTime()
return Time;
}
-void EnhancedPosition::cbPosition(const TGNSSPosition pos[], uint16_t numElements)
+void EnhancedPosition::sigPositionUpdate(const TGNSSSpatial spatial[], uint16_t numElements)
{
bool latChanged = false;
bool lonChanged = false;
bool altChanged = false;
-
+ bool speedChanged = false;
+ bool headingChanged = false;
+ bool climbChanged = false;
+
std::vector< uint16_t > position;
- if (pos == NULL || numElements < 1)
+ if (spatial == NULL || numElements < 1)
{
- LOG_ERROR_MSG(gCtx,"cbPosition failed!");
+ LOG_ERROR_MSG(gCtx,"sigPositionUpdate failed!");
return;
}
@@ -263,23 +259,38 @@ void EnhancedPosition::cbPosition(const TGNSSPosition pos[], uint16_t numElement
LOG_INFO(gCtx,"Position Update[%d/%d]: lat=%f lon=%f alt=%f",
i+1,
numElements,
- pos[i].latitude,
- pos[i].longitude,
- pos[i].altitude);
+ spatial[i].latitude,
+ spatial[i].longitude,
+ spatial[i].altitudeMSL);
if (latChanged == false)
{
- latChanged = (pos[i].validityBits && GNSS_POSITION_LATITUDE_VALID);
+ latChanged = (spatial[i].validityBits & GNSS_SPATIAL_LATITUDE_VALID);
}
if (lonChanged == false)
{
- lonChanged = (pos[i].validityBits && GNSS_POSITION_LONGITUDE_VALID);
+ lonChanged = (spatial[i].validityBits & GNSS_SPATIAL_LONGITUDE_VALID);
}
if (altChanged == false)
{
- altChanged = (pos[i].validityBits && GNSS_POSITION_ALTITUDE_VALID);
+ altChanged = (spatial[i].validityBits & GNSS_SPATIAL_ALTITUDEMSL_VALID);
+ }
+
+ if (speedChanged == false)
+ {
+ speedChanged = (spatial[i].validityBits & GNSS_SPATIAL_HSPEED_VALID);
+ }
+
+ if (headingChanged == false)
+ {
+ headingChanged = (spatial[i].validityBits & GNSS_SPATIAL_HEADING_VALID);
+ }
+
+ if (climbChanged == false)
+ {
+ climbChanged = (spatial[i].validityBits & GNSS_SPATIAL_VSPEED_VALID);
}
}
@@ -306,6 +317,21 @@ void EnhancedPosition::cbPosition(const TGNSSPosition pos[], uint16_t numElement
it = changedValues.insert(it,POS_ALTITUDE);
}
+ if (speedChanged)
+ {
+ it = changedValues.insert(it,POS_SPEED);
+ }
+
+ if (headingChanged)
+ {
+ it = changedValues.insert(it,POS_HEADING);
+ }
+
+ if (climbChanged)
+ {
+ it = changedValues.insert(it,POS_CLIMB);
+ }
+
if (!mpSelf)
{
LOG_ERROR_MSG(gCtx,"Null pointer!");
@@ -314,182 +340,202 @@ void EnhancedPosition::cbPosition(const TGNSSPosition pos[], uint16_t numElement
//notify clients
mpSelf->PositionUpdate(changedValues);
+
+
}
-void EnhancedPosition::cbCourse(const TGNSSCourse course[], uint16_t numElements)
-{
- bool speedChanged = false;
- bool headingChanged = false;
- bool climbChanged = false;
-
- if (course == NULL || numElements < 1)
+void EnhancedPosition::sigAccuracyUpdate(const TGNSSSpatial spatial[], uint16_t numElements)
+{
+ bool pdopChanged = false;
+ bool hdopChanged = false;
+ bool vdopChanged = false;
+ bool sigmaHPosChanged = false;
+ bool sigmaAltitudeChanged = false;
+
+ if (spatial == NULL || numElements < 1)
{
- LOG_ERROR_MSG(gCtx,"cbCourse failed!");
- return;
+ LOG_ERROR_MSG(gCtx,"sigAccuracyUpdate failed!");
+ return;
}
- for (int i = 0; i < numElements; i++)
+ for (int i = 0; i< numElements; i++)
{
- LOG_INFO(gCtx,"Course Update[%d/%d]: speed=%f heading=%f climb=%f",
- i+1,
- numElements,
- course[i].speed,
- course[i].heading,
- course[i].climb);
+ LOG_INFO(gCtx,"Accuracy Update[%d/%d]: pdop=%f hdop=%f vdop=%f \
+ sigmaHPosition=%f sigmaAltitude=%f",
+ i+1,
+ numElements,
+ spatial[i].pdop,
+ spatial[i].hdop,
+ spatial[i].vdop,
+ spatial[i].sigmaHPosition,
+ spatial[i].sigmaAltitude);
- if (speedChanged == false)
+ if (pdopChanged == false)
{
- speedChanged = (course[i].validityBits && GNSS_COURSE_SPEED_VALID);
+ pdopChanged = (spatial[i].validityBits & GNSS_SPATIAL_PDOP_VALID);
}
- if (headingChanged == false)
+ if (hdopChanged == false)
{
- headingChanged = (course[i].validityBits && GNSS_COURSE_HEADING_VALID);
+ hdopChanged = (spatial[i].validityBits & GNSS_SPATIAL_HDOP_VALID);
}
- if (climbChanged == false)
+ if (vdopChanged == false)
+ {
+ vdopChanged = (spatial[i].validityBits & GNSS_SPATIAL_VDOP_VALID);
+ }
+
+ if (sigmaHPosChanged == false)
{
- climbChanged = (course[i].validityBits && GNSS_COURSE_CLIMB_VALID);
+ sigmaHPosChanged = (spatial[i].validityBits & GNSS_SPATIAL_SHPOS_VALID);
+ }
+
+ if (sigmaAltitudeChanged == false)
+ {
+ sigmaAltitudeChanged = (spatial[i].validityBits & GNSS_SPATIAL_SALT_VALID);
}
}
- //in a real product, the course would be used for dead-reckoning.
+ //in a real product, the accuracy would be used for dead-reckoning.
//in this proof of concept, the client application is simply notified
- //about changes of speed, heading and/or climb
- std::vector< uint16_t > changedValues;
+ //about accuracy changes
std::vector<uint16_t>::iterator it;
- it = changedValues.begin();
-
- if (speedChanged)
+
+ std::vector< uint16_t > changedAccuracyValues;
+ it = changedAccuracyValues.begin();
+
+ if (pdopChanged)
{
- it = changedValues.insert(it,POS_SPEED);
+ it = changedAccuracyValues.insert(it,POS_PDOP);
}
- if (headingChanged)
+ if (hdopChanged)
{
- it = changedValues.insert(it,POS_HEADING);
+ it = changedAccuracyValues.insert(it,POS_HDOP);
}
+
+ if (vdopChanged)
+ {
+ it = changedAccuracyValues.insert(it,POS_VDOP);
+ }
- if (climbChanged)
+ if (sigmaHPosChanged)
{
- it = changedValues.insert(it,POS_CLIMB);
+ it = changedAccuracyValues.insert(it,POS_SIGMA_LATITUDE);
+ it = changedAccuracyValues.insert(it,POS_SIGMA_LONGITUDE);
}
+ if (sigmaAltitudeChanged)
+ {
+ it = changedAccuracyValues.insert(it,POS_VISIBLE_SATELLITES);
+ }
+
+ //todo: handle other field-changes here (accuracy and status)
+
if (!mpSelf)
{
LOG_ERROR_MSG(gCtx,"Null pointer!");
return;
}
-
- //notify clients
- mpSelf->PositionUpdate(changedValues);
+
+ mpSelf->AccuracyUpdate(changedAccuracyValues);
}
-void EnhancedPosition::cbAccuracy(const TGNSSAccuracy accuracy[], uint16_t numElements)
+void EnhancedPosition::sigStatusUpdate(const TGNSSSpatial spatial[], uint16_t numElements)
{
- //satellite info
- bool usedSatellitesChanged = false;
- bool trackedSatellitesChanged = false;
- bool visibleSatellitesChanged = false;
-
- //status
+
bool fixStatusChanged = false;
bool fixTypeBitsChanged = false;
-
- //accuracy
- bool pdopChanged = false;
- bool hdopChanged = false;
- bool vdopChanged = false;
- bool sigmaLatitudeChanged = false;
- bool sigmaLongitudeChanged = false;
- bool sigmaAltitudeChanged = false;
- if (accuracy == NULL || numElements < 1)
+ if (spatial == NULL || numElements < 1)
{
- LOG_ERROR_MSG(gCtx,"cbAccuracy failed!");
+ LOG_ERROR_MSG(gCtx,"sigStatusUpdate failed!");
return;
}
for (int i = 0; i< numElements; i++)
{
- LOG_INFO(gCtx,"Accuracy Update[%d/%d]: usedSatellites=%d trackedSatellites=%d visibleSatellites=%d",
+ LOG_INFO(gCtx,"Status Update[%d/%d]: fixStatus=%d fixTypeBits=0x%08X",
i+1,
numElements,
- accuracy[i].usedSatellites,
- accuracy[i].trackedSatellites,
- accuracy[i].visibleSatellites);
-
- LOG_INFO(gCtx,"Accuracy Update[%d/%d]: fixStatus=%d fixTypeBits=0x%08X",
- i+1,
- numElements,
- accuracy[i].fixStatus,
- accuracy[i].fixTypeBits);
-
- LOG_INFO(gCtx,"Accuracy Update[%d/%d]: pdop=%f hdop=%f vdop=%f \
- sigmaLatitude=%f sigmaLongitude=%f sigmaAltitude=%f",
- i+1,
- numElements,
- accuracy[i].pdop,
- accuracy[i].hdop,
- accuracy[i].vdop,
- accuracy[i].sigmaLatitude,
- accuracy[i].sigmaLongitude,
- accuracy[i].sigmaAltitude);
-
- if (usedSatellitesChanged == false)
+ spatial[i].fixStatus,
+ spatial[i].fixTypeBits);
+
+ if (fixStatusChanged == false)
{
- usedSatellitesChanged = (accuracy[i].validityBits && GNSS_ACCURACY_USAT_VALID);
+ fixStatusChanged = (spatial[i].validityBits & GNSS_SPATIAL_STAT_VALID);
}
- if (trackedSatellitesChanged == false)
+ if (fixTypeBitsChanged == false)
{
- trackedSatellitesChanged = (accuracy[i].validityBits && GNSS_ACCURACY_TSAT_VALID);
+ fixTypeBitsChanged = (spatial[i].validityBits & GNSS_SPATIAL_TYPE_VALID);
}
- if (visibleSatellitesChanged == false)
- {
- visibleSatellitesChanged = (accuracy[i].validityBits && GNSS_ACCURACY_VSAT_VALID);
- }
+ }
- if (fixStatusChanged == false)
- {
- fixStatusChanged = (accuracy[i].validityBits && GNSS_ACCURACY_STAT_VALID);
- }
-
- if (fixTypeBitsChanged == false)
- {
- fixTypeBitsChanged = (accuracy[i].validityBits && GNSS_ACCURACY_TYPE_VALID);
- }
+ //in a real product, the accuracy would be used for dead-reckoning.
+ //in this proof of concept, the client application is simply notified
+ //about status changes
+ std::vector<uint16_t>::iterator it;
+
+ std::vector< uint16_t > changedStatusValues;
+ it = changedStatusValues.begin();
- if (pdopChanged == false)
- {
- pdopChanged = (accuracy[i].validityBits && GNSS_ACCURACY_PDOP_VALID);
- }
+ if (fixStatusChanged)
+ {
+ it = changedStatusValues.insert(it,POS_GNSS_FIX_STATUS);
+ }
- if (hdopChanged == false)
- {
- hdopChanged = (accuracy[i].validityBits && GNSS_ACCURACY_HDOP_VALID);
- }
+ if (!mpSelf)
+ {
+ LOG_ERROR_MSG(gCtx,"Null pointer!");
+ return;
+ }
+
+ mpSelf->StatusUpdate(changedStatusValues);
+}
- if (vdopChanged == false)
- {
- vdopChanged = (accuracy[i].validityBits && GNSS_ACCURACY_VDOP_VALID);
- }
- if (sigmaLatitudeChanged == false)
+
+void EnhancedPosition::sigSatelliteInfoUpdate(const TGNSSSpatial spatial[], uint16_t numElements)
+{
+ //satellite info
+ bool usedSatellitesChanged = false;
+ bool trackedSatellitesChanged = false;
+ bool visibleSatellitesChanged = false;
+
+
+
+ if (spatial == NULL || numElements < 1)
+ {
+ LOG_ERROR_MSG(gCtx,"sigSatelliteInfoUpdate failed!");
+ return;
+ }
+
+ for (int i = 0; i< numElements; i++)
+ {
+ LOG_INFO(gCtx,"SatelliteInfo Update[%d/%d]: usedSatellites=%d trackedSatellites=%d visibleSatellites=%d",
+ i+1,
+ numElements,
+ spatial[i].usedSatellites,
+ spatial[i].trackedSatellites,
+ spatial[i].visibleSatellites);
+
+ if (usedSatellitesChanged == false)
{
- sigmaLatitudeChanged = (accuracy[i].validityBits && GNSS_ACCURACY_SLAT_VALID);
+ usedSatellitesChanged = (spatial[i].validityBits & GNSS_SPATIAL_USAT_VALID);
}
- if (sigmaLongitudeChanged == false)
+ if (trackedSatellitesChanged == false)
{
- sigmaLongitudeChanged = (accuracy[i].validityBits && GNSS_ACCURACY_SLON_VALID);
+ trackedSatellitesChanged = (spatial[i].validityBits & GNSS_SPATIAL_TSAT_VALID);
}
- if (sigmaAltitudeChanged == false)
+ if (visibleSatellitesChanged == false)
{
- sigmaAltitudeChanged = (accuracy[i].validityBits && GNSS_ACCURACY_SALT_VALID);
+ visibleSatellitesChanged = (spatial[i].validityBits & GNSS_SPATIAL_VSAT_VALID);
}
+
}
//in a real product, the accuracy would be used for dead-reckoning.
@@ -525,11 +571,17 @@ void EnhancedPosition::cbAccuracy(const TGNSSAccuracy accuracy[], uint16_t numEl
mpSelf->SatelliteInfoUpdate(changedSatelliteInfoValues);
- //todo: send other notifications
- //mpSelf->AccuracyUpdate(changedAccuracyValues);
- //mpSelf->StatusUpdate(changedStatusValues);
}
+void EnhancedPosition::cbSpatial(const TGNSSSpatial spatial[], uint16_t numElements)
+{
+ sigPositionUpdate(spatial, numElements);
+ sigAccuracyUpdate(spatial, numElements);
+ sigStatusUpdate(spatial, numElements);
+ sigSatelliteInfoUpdate(spatial, numElements);
+}
+
+
void EnhancedPosition::cbSatelliteDetail(const TGNSSSatelliteDetail satelliteDetail[], uint16_t numElements)
{
if (satelliteDetail == NULL || numElements < 1)
@@ -589,16 +641,14 @@ void EnhancedPosition::run()
exit(EXIT_FAILURE);
}
- if(!gnssSimpleInit())
+ if(!gnssExtendedInit())
{
exit(EXIT_FAILURE);
}
LOG_INFO_MSG(gCtx,"Starting EnhancedPosition dispatcher...");
- gnssSimpleRegisterPositionCallback(&cbPosition);
- gnssSimpleRegisterCourseCallback(&cbCourse);
- gnssExtendedRegisterAccuracyCallback(&cbAccuracy);
+ gnssExtendedRegisterSpatialCallback(&cbSpatial);
gnssExtendedRegisterSatelliteDetailCallback(&cbSatelliteDetail);
}
@@ -606,11 +656,9 @@ void EnhancedPosition::shutdown()
{
LOG_INFO_MSG(gCtx,"Shutting down EnhancedPosition dispatcher...");
- gnssSimpleDeregisterPositionCallback(&cbPosition);
- gnssSimpleDeregisterCourseCallback(&cbCourse);
- gnssExtendedDeregisterAccuracyCallback(&cbAccuracy);
+ gnssExtendedDeregisterSpatialCallback(&cbSpatial);
gnssExtendedDeregisterSatelliteDetailCallback(&cbSatelliteDetail);
- gnssSimpleDestroy();
+ gnssExtendedDestroy();
gnssDestroy();
}