Merge remote-tracking branch 'origin/develop' into rework_acs_board_polling
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good

This commit is contained in:
Robin Müller 2023-02-26 18:25:13 +01:00
commit ea993ad2e9
No known key found for this signature in database
GPG Key ID: 11D4952C8CCEF814
3 changed files with 101 additions and 63 deletions

View File

@ -20,6 +20,11 @@ will consitute of a breaking change warranting a new major release:
- Move ACS board polling to separate worker thread. - Move ACS board polling to separate worker thread.
## Fixed
- Linux GPS handler now checks the individual `*_SET` flags when analysing the `gpsd` struct.
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/400
# [v1.32.0] # [v1.32.0]
eive-tmtc: v2.16.1 eive-tmtc: v2.16.1

View File

@ -172,20 +172,10 @@ bool GpsHyperionLinuxController::readGpsDataFromGpsd() {
return false; return false;
} }
oneShotSwitches.gpsReadFailedSwitch = true; oneShotSwitches.gpsReadFailedSwitch = true;
// did not event get mode, nothing to see. ReturnValue_t result = handleGpsReadData();
if (MODE_SET != (MODE_SET & gps.set)) { if (result == returnvalue::OK) {
if (mode != MODE_OFF) { return true;
if (maxTimeToReachFix.hasTimedOut() and oneShotSwitches.cantGetFixSwitch) { } else {
sif::warning
<< "GPSHyperionHandler::readGpsDataFromGpsd: No mode could be set in allowed "
<< maxTimeToReachFix.timeout / 1000 << " seconds" << std::endl;
triggerEvent(GpsHyperion::CANT_GET_FIX, maxTimeToReachFix.timeout);
oneShotSwitches.cantGetFixSwitch = false;
}
// Mode is on, so do next read immediately
return true;
}
// GPS device is off anyway, so do other handling
return false; return false;
} }
noModeSetCntr = 0; noModeSetCntr = 0;
@ -197,11 +187,26 @@ bool GpsHyperionLinuxController::readGpsDataFromGpsd() {
"SHM read not implemented" "SHM read not implemented"
<< std::endl; << std::endl;
} }
handleGpsReadData();
return true; return true;
} }
ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() { ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
bool modeIsSet = true;
if (MODE_SET != (MODE_SET & gps.set)) {
if (mode != MODE_OFF) {
if (maxTimeToReachFix.hasTimedOut() and oneShotSwitches.cantGetFixSwitch) {
sif::warning << "GpsHyperionLinuxController: No mode could be set in allowed "
<< maxTimeToReachFix.timeout / 1000 << " seconds" << std::endl;
triggerEvent(GpsHyperion::CANT_GET_FIX, maxTimeToReachFix.timeout);
oneShotSwitches.cantGetFixSwitch = false;
}
modeIsSet = false;
} else {
// GPS device is off anyway, so do other handling
return returnvalue::FAILED;
}
}
PoolReadGuard pg(&gpsSet); PoolReadGuard pg(&gpsSet);
if (pg.getReadResult() != returnvalue::OK) { if (pg.getReadResult() != returnvalue::OK) {
#if FSFW_VERBOSE_LEVEL >= 1 #if FSFW_VERBOSE_LEVEL >= 1
@ -211,66 +216,93 @@ ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
} }
bool validFix = false; bool validFix = false;
// 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix if (modeIsSet) {
if (gps.fix.mode == 2 or gps.fix.mode == 3) { // 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix
validFix = true; if (gps.fix.mode == 2 or gps.fix.mode == 3) {
} validFix = true;
if (gpsSet.fixMode.value != gps.fix.mode) { }
triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, gps.fix.mode); if (gpsSet.fixMode.value != gps.fix.mode) {
} triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, gps.fix.mode);
gpsSet.fixMode.value = gps.fix.mode; }
if (gps.fix.mode == 0 or gps.fix.mode == 1) { gpsSet.fixMode.value = gps.fix.mode;
if (modeCommanded and maxTimeToReachFix.hasTimedOut()) { if (gps.fix.mode == 0 or gps.fix.mode == 1) {
// We are supposed to be on and functioning, but no fix was found if (modeCommanded and maxTimeToReachFix.hasTimedOut()) {
if (mode == MODE_ON or mode == MODE_NORMAL) { // We are supposed to be on and functioning, but no fix was found
mode = MODE_OFF; if (mode == MODE_ON or mode == MODE_NORMAL) {
} mode = MODE_OFF;
modeCommanded = false; }
modeCommanded = false;
}
}
}
gpsSet.fixMode.setValid(modeIsSet);
// Only set on specific messages, so only set a valid flag to invalid
// if not set for more than a full message set (10 messages here)
if (SATELLITE_SET == (SATELLITE_SET & gps.set)) {
gpsSet.satInUse.value = gps.satellites_used;
gpsSet.satInView.value = gps.satellites_visible;
if (not gpsSet.satInUse.isValid()) {
gpsSet.satInUse.setValid(true);
gpsSet.satInView.setValid(true);
}
satNotSetCounter = 0;
} else {
satNotSetCounter++;
if (gpsSet.satInUse.isValid() and satNotSetCounter >= 10) {
gpsSet.satInUse.setValid(false);
gpsSet.satInView.setValid(false);
} }
gpsSet.setValidity(false, true);
} else if (gps.satellites_used > 0 && validFix && mode != MODE_OFF) {
gpsSet.setValidity(true, true);
} }
gpsSet.satInUse.value = gps.satellites_used; // LATLON is set for every message, no need for a counter
gpsSet.satInView.value = gps.satellites_visible;
bool latValid = false; bool latValid = false;
if (std::isfinite(gps.fix.latitude)) { bool longValid = false;
// Negative latitude -> South direction if (LATLON_SET == (LATLON_SET & gps.set)) {
gpsSet.latitude.value = gps.fix.latitude; if (std::isfinite(gps.fix.latitude)) {
if (gps.fix.mode >= 2) { // Negative latitude -> South direction
latValid = true; gpsSet.latitude.value = gps.fix.latitude;
// As specified in gps.h: Only valid if mode >= 2
if (gps.fix.mode >= 2) {
latValid = true;
}
}
if (std::isfinite(gps.fix.longitude)) {
// Negative longitude -> West direction
gpsSet.longitude.value = gps.fix.longitude;
// As specified in gps.h: Only valid if mode >= 2
if (gps.fix.mode >= 2) {
longValid = true;
}
} }
} }
gpsSet.latitude.setValid(latValid); gpsSet.latitude.setValid(latValid);
gpsSet.longitude.setValid(longValid);
bool longValid = false; // ALTITUDE is set for every message, no need for a counter
if (std::isfinite(gps.fix.longitude)) {
// Negative longitude -> West direction
gpsSet.longitude.value = gps.fix.longitude;
if (gps.fix.mode >= 2) {
longValid = true;
}
}
gpsSet.latitude.setValid(longValid);
bool altitudeValid = false; bool altitudeValid = false;
if (std::isfinite(gps.fix.altitude)) { if (ALTITUDE_SET == (ALTITUDE_SET & gps.set) && std::isfinite(gps.fix.altitude)) {
gpsSet.altitude.value = gps.fix.altitude; gpsSet.altitude.value = gps.fix.altitude;
// As specified in gps.h: Only valid if mode == 3
if (gps.fix.mode == 3) { if (gps.fix.mode == 3) {
altitudeValid = true; altitudeValid = true;
} }
} }
gpsSet.altitude.setValid(altitudeValid); gpsSet.altitude.setValid(altitudeValid);
if (std::isfinite(gps.fix.speed)) { // SPEED is set for every message, no need for a counter
bool speedValid = false;
if (SPEED_SET == (SPEED_SET & gps.set) && std::isfinite(gps.fix.speed)) {
gpsSet.speed.value = gps.fix.speed; gpsSet.speed.value = gps.fix.speed;
} else { speedValid = true;
gpsSet.speed.setValid(false);
} }
gpsSet.speed.setValid(speedValid);
// TIME is set for every message, no need for a counter
bool timeValid = false;
if (TIME_SET == (TIME_SET & gps.set)) { if (TIME_SET == (TIME_SET & gps.set)) {
timeValid = true;
timeval time = {}; timeval time = {};
#if LIBGPS_VERSION_MINOR <= 17 #if LIBGPS_VERSION_MINOR <= 17
gpsSet.unixSeconds.value = std::floor(gps.fix.time); gpsSet.unixSeconds.value = std::floor(gps.fix.time);
@ -294,15 +326,14 @@ ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
gpsSet.hours = timeOfDay.hour; gpsSet.hours = timeOfDay.hour;
gpsSet.minutes = timeOfDay.minute; gpsSet.minutes = timeOfDay.minute;
gpsSet.seconds = timeOfDay.second; gpsSet.seconds = timeOfDay.second;
} else {
gpsSet.unixSeconds.setValid(false);
gpsSet.year.setValid(false);
gpsSet.month.setValid(false);
gpsSet.day.setValid(false);
gpsSet.hours.setValid(false);
gpsSet.minutes.setValid(false);
gpsSet.seconds.setValid(false);
} }
gpsSet.unixSeconds.setValid(timeValid);
gpsSet.year.setValid(timeValid);
gpsSet.month.setValid(timeValid);
gpsSet.day.setValid(timeValid);
gpsSet.hours.setValid(timeValid);
gpsSet.minutes.setValid(timeValid);
gpsSet.seconds.setValid(timeValid);
if (debugHyperionGps) { if (debugHyperionGps) {
sif::info << "-- Hyperion GPS Data --" << std::endl; sif::info << "-- Hyperion GPS Data --" << std::endl;

View File

@ -61,6 +61,8 @@ class GpsHyperionLinuxController : public ExtendedControllerBase {
Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000); Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000);
bool modeCommanded = false; bool modeCommanded = false;
bool timeInit = false; bool timeInit = false;
uint8_t satNotSetCounter = 0;
#if OBSW_THREAD_TRACING == 1 #if OBSW_THREAD_TRACING == 1
uint32_t opCounter = 0; uint32_t opCounter = 0;
#endif #endif