diff --git a/CMakeLists.txt b/CMakeLists.txt index 9291e0db..79017dda 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -301,12 +301,6 @@ target_include_directories(${WATCHDOG_NAME} PUBLIC #unittests add_executable(${UNITTEST_NAME} EXCLUDE_FROM_ALL) - - -if(EIVE_ADD_ETL_LIB) - add_subdirectory(${LIB_ETL_PATH}) -endif() - if(EIVE_ADD_JSON_LIB) add_subdirectory(${LIB_JSON_PATH}) endif() diff --git a/fsfw b/fsfw index 280b641c..d61fe7db 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 280b641cbc621d0c00c89851aaffbb64d5e5f40b +Subproject commit d61fe7db93b37dd6652dbfee5b7c93f400ac5a11 diff --git a/linux/devices/GPSHyperionLinuxController.cpp b/linux/devices/GPSHyperionLinuxController.cpp index 9c762842..5a7d9808 100644 --- a/linux/devices/GPSHyperionLinuxController.cpp +++ b/linux/devices/GPSHyperionLinuxController.cpp @@ -1,5 +1,7 @@ #include "GPSHyperionLinuxController.h" +#include + #include "OBSWConfig.h" #include "fsfw/FSFW.h" #include "fsfw/datapool/PoolReadGuard.h" @@ -106,10 +108,10 @@ ReturnValue_t GPSHyperionLinuxController::handleCommandMessage(CommandMessage *m #ifdef FSFW_OSAL_LINUX void GPSHyperionLinuxController::readGpsDataFromGpsd() { - gpsmm myGpsmm(GPSD_SHARED_MEMORY, nullptr); + gpsmm gpsmm("localhost", DEFAULT_GPSD_PORT); // The data from the device will generally be read all at once. Therefore, we // can set all field here - if (not myGpsmm.is_open()) { + if (not gpsmm.is_open()) { if (gpsNotOpenSwitch) { // Opening failed #if FSFW_VERBOSE_LEVEL >= 1 @@ -121,16 +123,41 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() { } return; } + // Stopwatch watch; gps_data_t *gps = nullptr; - gps = myGpsmm.read(); + gps = gpsmm.stream(WATCH_ENABLE | WATCH_JSON); if (gps == nullptr) { - if (gpsReadFailedSwitch) { - gpsReadFailedSwitch = false; - sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading GPS data failed" - << std::endl; - } - return; + sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd:: Setting GPSD watch " + "policy failed" + << std::endl; } + while (gpsmm.waiting(2000)) { + gps = gpsmm.read(); + if (gps == nullptr) { + if (gpsReadFailedSwitch) { + gpsReadFailedSwitch = false; + sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: Reading GPS data failed" + << std::endl; + } + return; + } + if (MODE_SET != (MODE_SET & gps->set)) { + if (noModeSetCntr >= 0) { + noModeSetCntr++; + } + if (noModeSetCntr == 10) { + // TODO: Trigger event here + sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: No mode could be " + "read for 10 consecutive reads" + << std::endl; + noModeSetCntr = -1; + } + return; + } else { + noModeSetCntr = 0; + } + } + gps = gpsmm.stream(WATCH_DISABLE); PoolReadGuard pg(&gpsSet); if (pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) { #if FSFW_VERBOSE_LEVEL >= 1 diff --git a/linux/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h index 42e9741b..8d0ec0cd 100644 --- a/linux/devices/GPSHyperionLinuxController.h +++ b/linux/devices/GPSHyperionLinuxController.h @@ -55,6 +55,7 @@ class GPSHyperionLinuxController : public ExtendedControllerBase { bool gpsNotOpenSwitch = true; bool gpsReadFailedSwitch = true; bool debugHyperionGps = false; + int32_t noModeSetCntr = 0; uint32_t timeIsConstantCounter = 0; Countdown timeUpdateCd = Countdown(60); diff --git a/tmtc b/tmtc index b1aaef90..76da8042 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit b1aaef90c72874f501c6524ec967827f17e8cedf +Subproject commit 76da8042a4601087e99fa856af241afe9e43695d