diff --git a/CHANGELOG.md b/CHANGELOG.md index a79f1cf9..d58be5b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,10 +16,40 @@ will consitute of a breaking change warranting a new major release: # [unreleased] +# [v7.8.1] 2024-04-11 + +- Reverted fix for wrong order in quaternion multiplication for computation of the error quaternion. + +# [v7.8.0] 2024-04-10 + ## Changed - Reverted lower OP limit of `PLOC` to -10°C. - All pointing laws are now allowed to use the `MEKF` per default. +- Changed limits in `PWR Controller`. +- PUS time service: Now dumps the time before and after relative timeshift or setting absolute time +- The `GPS Controller` does not set itself to `OFF` anymore, if it has not detected a valid fix for + some time. Instead it attempts to reset both GNSS devices once. +- The maximum time to reach a fix is shortened from 30min to 15min. +- The time the reset pin of the GNSS devices is pulled is prolonged from 5ms to 10s. +- A `GPS FIX HAS CHANGED` is now only triggered if no fix change has been detected within the past + 2min. This means, this event might be thrown with a 2min delay. It is instantly thrown, if the mode + of the controller is changed. As arguments it now displays the new fix and the numer of fix changes + missed. +- The number of satellites seen and used is reset to 0, in case they are set to invalid. +- Altitude, latitude and longitude messages are not checked anymore, in case the mode message was + already invalid. + +## Added + +- PUS timeservice relative timeshift. + +## Fixed + +- Fixed wrong order in quaternion multiplication for computation of the error quaternion. +- Re-worked some FDIR logic in the FSFW. The former logic prevented events with a severity + higher than INFO if the device was in EXTERNAL CONTROL. The new logic will allow to trigger + events but still inhibit FDIR reactions if the device is in EXTERNAL CONTROL. # [v7.7.4] 2024-03-21 @@ -27,16 +57,11 @@ will consitute of a breaking change warranting a new major release: - Rotational rate limit for the GS target pointing is now seperated from controller limit. It is also reduced to 0.75°/s now. -- PUS time service: Now dumps the time before and after relative timeshift or setting absolute time ## Fixed - Fixed wrong sign in calculation of total current within the `PWR Controller`. -## Added - -- PUS timeservice relative timeshift. - # [v7.7.3] 2024-03-18 - Bumped `eive-fsfw` diff --git a/CMakeLists.txt b/CMakeLists.txt index b4314754..3132f5ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ cmake_minimum_required(VERSION 3.13) set(OBSW_VERSION_MAJOR 7) -set(OBSW_VERSION_MINOR 7) -set(OBSW_VERSION_REVISION 4) +set(OBSW_VERSION_MINOR 8) +set(OBSW_VERSION_REVISION 1) # set(CMAKE_VERBOSE TRUE) diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index a787b609..0e05842a 100644 --- a/bsp_hosted/fsfwconfig/events/translateEvents.cpp +++ b/bsp_hosted/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 321 translations. + * @brief Auto-generated event translation file. Contains 324 translations. * @details - * Generated on: 2024-04-08 13:37:59 + * Generated on: 2024-04-10 11:49:35 */ #include "translateEvents.h" @@ -85,6 +85,8 @@ const char *CLOCK_SET_STRING = "CLOCK_SET"; const char *CLOCK_DUMP_LEGACY_STRING = "CLOCK_DUMP_LEGACY"; const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE"; const char *CLOCK_DUMP_STRING = "CLOCK_DUMP"; +const char *CLOCK_DUMP_BEFORE_SETTING_TIME_STRING = "CLOCK_DUMP_BEFORE_SETTING_TIME"; +const char *CLOCK_DUMP_AFTER_SETTING_TIME_STRING = "CLOCK_DUMP_AFTER_SETTING_TIME"; const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED"; const char *TEST_STRING = "TEST"; const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER"; @@ -242,6 +244,7 @@ const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANS const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE"; const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE"; const char *CANT_GET_FIX_STRING = "CANT_GET_FIX"; +const char *RESET_FAIL_STRING = "RESET_FAIL"; const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT"; const char *BATT_MODE_STRING = "BATT_MODE"; const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED"; @@ -489,6 +492,10 @@ const char *translateEvents(Event event) { return CLOCK_SET_FAILURE_STRING; case (8903): return CLOCK_DUMP_STRING; + case (8904): + return CLOCK_DUMP_BEFORE_SETTING_TIME_STRING; + case (8905): + return CLOCK_DUMP_AFTER_SETTING_TIME_STRING; case (9100): return TC_DELETION_FAILED_STRING; case (9700): @@ -803,6 +810,8 @@ const char *translateEvents(Event event) { return GPS_FIX_CHANGE_STRING; case (13101): return CANT_GET_FIX_STRING; + case (13102): + return RESET_FAIL_STRING; case (13200): return P60_BOOT_COUNT_STRING; case (13201): diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 3af7f2d3..37068dd1 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2024-04-08 13:37:59 + * Generated on: 2024-04-10 11:49:35 */ #include "translateObjects.h" diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 1f6fdec6..30eff4ec 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -2150,8 +2150,7 @@ ReturnValue_t CoreController::initClockFromTimeFile() { std::string fileName = currMntPrefix + BACKUP_TIME_FILE; std::error_code e; if (sdcMan->isSdCardUsable(std::nullopt) and std::filesystem::exists(fileName, e) and - ((gpsFix == FixMode::UNKNOWN or gpsFix == FixMode::NOT_SEEN) or - not utility::timeSanityCheck())) { + ((gpsFix == FixMode::NOT_SEEN) or not utility::timeSanityCheck())) { ifstream timeFile(fileName); string nextWord; getline(timeFile, nextWord); diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index 1b1f9853..6827a392 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include @@ -211,7 +211,7 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe static constexpr MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING; static constexpr uint32_t MUTEX_TIMEOUT = 20; bool enableHkSet = false; - GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::UNKNOWN; + GpsHyperion::FixMode gpsFix = GpsHyperion::FixMode::NOT_SEEN; // States for SD state machine, which is used in non-blocking mode enum class SdStates { diff --git a/bsp_q7s/objectFactory.cpp b/bsp_q7s/objectFactory.cpp index 3926743a..ccd52bd2 100644 --- a/bsp_q7s/objectFactory.cpp +++ b/bsp_q7s/objectFactory.cpp @@ -510,7 +510,7 @@ void ObjectFactory::createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* debugGps = true; #endif RESET_ARGS_GNSS.gpioComIF = gpioComIF; - RESET_ARGS_GNSS.waitPeriodMs = 5; + RESET_ARGS_GNSS.waitPeriodMs = 10 * 1e3; auto gpsCtrl = new GpsHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, enableHkSets, debugGps); gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS); diff --git a/dummies/GpsCtrlDummy.h b/dummies/GpsCtrlDummy.h index 18b990fb..b64647b1 100644 --- a/dummies/GpsCtrlDummy.h +++ b/dummies/GpsCtrlDummy.h @@ -2,7 +2,7 @@ #define DUMMIES_GPSCTRLDUMMY_H_ #include -#include +#include class GpsCtrlDummy : public ExtendedControllerBase { public: diff --git a/dummies/GpsDhbDummy.cpp b/dummies/GpsDhbDummy.cpp index 4e385ec5..73addb3c 100644 --- a/dummies/GpsDhbDummy.cpp +++ b/dummies/GpsDhbDummy.cpp @@ -1,5 +1,5 @@ #include -#include +#include GpsDhbDummy::GpsDhbDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index 34aa9343..3c05a3c2 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -79,6 +79,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h 8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h 8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h +8904;0x22c8;CLOCK_DUMP_BEFORE_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h +8905;0x22c9;CLOCK_DUMP_AFTER_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h 9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h 10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h @@ -234,8 +236,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h 12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h 13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h -13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/acs/archive/GPSDefinitions.h -13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h +13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: New fix. P2: Missed fix changes 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;linux/acs/GPSDefinitions.h +13101;0x332d;CANT_GET_FIX;MEDIUM;Could not get fix in maximum allowed time. Trying to reset both GNSS devices. P1: Maximum allowed time to get a fix after the GPS was switched on.;linux/acs/GPSDefinitions.h +13102;0x332e;RESET_FAIL;HIGH;Failed to reset an GNNS Device. P1: Board-Side.;linux/acs/GPSDefinitions.h 13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h 13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h 13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 34aa9343..3c05a3c2 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -79,6 +79,8 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 8901;0x22c5;CLOCK_DUMP_LEGACY;INFO;Clock dump event. P1: timeval seconds P2: timeval milliseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h 8902;0x22c6;CLOCK_SET_FAILURE;LOW;Clock could not be set. P1: Returncode.;fsfw/src/fsfw/pus/Service9TimeManagement.h 8903;0x22c7;CLOCK_DUMP;INFO;Clock dump event. P1: timeval seconds P2: timeval microseconds.;fsfw/src/fsfw/pus/Service9TimeManagement.h +8904;0x22c8;CLOCK_DUMP_BEFORE_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h +8905;0x22c9;CLOCK_DUMP_AFTER_SETTING_TIME;INFO;No description;fsfw/src/fsfw/pus/Service9TimeManagement.h 9100;0x238c;TC_DELETION_FAILED;MEDIUM;Deletion of a TC from the map failed. P1: First 32 bit of request ID, P2. Last 32 bit of Request ID;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 9700;0x25e4;TEST;INFO;No description;fsfw/src/fsfw/pus/Service17Test.h 10600;0x2968;CHANGE_OF_SETUP_PARAMETER;LOW;No description;fsfw/src/fsfw_hal/devicehandlers/MgmLIS3MDLHandler.h @@ -234,8 +236,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/SusAssembly.h 12903;0x3267;SIDE_SWITCH_TRANSITION_NOT_ALLOWED;LOW;Not implemented, would increase already high complexity. Operator should instead command the assembly off first and then command the assembly on into the desired mode/submode combination;mission/system/acs/SusAssembly.h 13000;0x32c8;CHILDREN_LOST_MODE;MEDIUM;No description;mission/system/tcs/TcsBoardAssembly.h -13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: Old fix. P2: New fix 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;mission/acs/archive/GPSDefinitions.h -13101;0x332d;CANT_GET_FIX;LOW;Could not get fix in maximum allowed time. P1: Maximum allowed time to get a fix after the GPS was switched on.;mission/acs/archive/GPSDefinitions.h +13100;0x332c;GPS_FIX_CHANGE;INFO;Fix has changed. P1: New fix. P2: Missed fix changes 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix;linux/acs/GPSDefinitions.h +13101;0x332d;CANT_GET_FIX;MEDIUM;Could not get fix in maximum allowed time. Trying to reset both GNSS devices. P1: Maximum allowed time to get a fix after the GPS was switched on.;linux/acs/GPSDefinitions.h +13102;0x332e;RESET_FAIL;HIGH;Failed to reset an GNNS Device. P1: Board-Side.;linux/acs/GPSDefinitions.h 13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/power/P60DockHandler.h 13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/power/P60DockHandler.h 13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/power/P60DockHandler.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index a787b609..0e05842a 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 321 translations. + * @brief Auto-generated event translation file. Contains 324 translations. * @details - * Generated on: 2024-04-08 13:37:59 + * Generated on: 2024-04-10 11:49:35 */ #include "translateEvents.h" @@ -85,6 +85,8 @@ const char *CLOCK_SET_STRING = "CLOCK_SET"; const char *CLOCK_DUMP_LEGACY_STRING = "CLOCK_DUMP_LEGACY"; const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE"; const char *CLOCK_DUMP_STRING = "CLOCK_DUMP"; +const char *CLOCK_DUMP_BEFORE_SETTING_TIME_STRING = "CLOCK_DUMP_BEFORE_SETTING_TIME"; +const char *CLOCK_DUMP_AFTER_SETTING_TIME_STRING = "CLOCK_DUMP_AFTER_SETTING_TIME"; const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED"; const char *TEST_STRING = "TEST"; const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER"; @@ -242,6 +244,7 @@ const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANS const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE"; const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE"; const char *CANT_GET_FIX_STRING = "CANT_GET_FIX"; +const char *RESET_FAIL_STRING = "RESET_FAIL"; const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT"; const char *BATT_MODE_STRING = "BATT_MODE"; const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED"; @@ -489,6 +492,10 @@ const char *translateEvents(Event event) { return CLOCK_SET_FAILURE_STRING; case (8903): return CLOCK_DUMP_STRING; + case (8904): + return CLOCK_DUMP_BEFORE_SETTING_TIME_STRING; + case (8905): + return CLOCK_DUMP_AFTER_SETTING_TIME_STRING; case (9100): return TC_DELETION_FAILED_STRING; case (9700): @@ -803,6 +810,8 @@ const char *translateEvents(Event event) { return GPS_FIX_CHANGE_STRING; case (13101): return CANT_GET_FIX_STRING; + case (13102): + return RESET_FAIL_STRING; case (13200): return P60_BOOT_COUNT_STRING; case (13201): diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 110c5c62..7632605f 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 179 translations. - * Generated on: 2024-04-08 13:37:59 + * Generated on: 2024-04-10 11:49:35 */ #include "translateObjects.h" diff --git a/mission/acs/archive/GPSDefinitions.h b/linux/acs/GPSDefinitions.h similarity index 89% rename from mission/acs/archive/GPSDefinitions.h rename to linux/acs/GPSDefinitions.h index 67169cbc..82025a22 100644 --- a/mission/acs/archive/GPSDefinitions.h +++ b/linux/acs/GPSDefinitions.h @@ -7,15 +7,19 @@ namespace GpsHyperion { -enum class FixMode : uint8_t { NOT_SEEN = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3, UNKNOWN = 4 }; +enum FixMode : uint8_t { NOT_SEEN = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 }; + +enum GnssChip : uint8_t { A_SIDE = 0, B_SIDE = 1 }; static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::GPS_HANDLER; -//! [EXPORT] : [COMMENT] Fix has changed. P1: Old fix. P2: New fix +//! [EXPORT] : [COMMENT] Fix has changed. P1: New fix. P2: Missed fix changes //! 0: Not seen, 1: No Fix, 2: 2D-Fix, 3: 3D-Fix static constexpr Event GPS_FIX_CHANGE = event::makeEvent(SUBSYSTEM_ID, 0, severity::INFO); -//! [EXPORT] : [COMMENT] Could not get fix in maximum allowed time. P1: Maximum allowed time -//! to get a fix after the GPS was switched on. -static constexpr Event CANT_GET_FIX = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW); +//! [EXPORT] : [COMMENT] Could not get fix in maximum allowed time. Trying to reset both GNSS +//! devices. P1: Maximum allowed time to get a fix after the GPS was switched on. +static constexpr Event CANT_GET_FIX = event::makeEvent(SUBSYSTEM_ID, 1, severity::MEDIUM); +//! [EXPORT] : [COMMENT] Failed to reset an GNNS Device. P1: Board-Side. +static constexpr Event RESET_FAIL = event::makeEvent(SUBSYSTEM_ID, 2, severity::HIGH); static constexpr DeviceCommandId_t GPS_REPLY = 0; static constexpr DeviceCommandId_t TRIGGER_RESET_PIN_GNSS = 5; @@ -53,8 +57,6 @@ static constexpr uint8_t SKYVIEW_ENTRIES = 6; static constexpr uint8_t MAX_SATELLITES = 30; -enum GpsFixModes : uint8_t { INVALID = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 }; - } // namespace GpsHyperion class GpsPrimaryDataset : public StaticLocalDataSet { diff --git a/linux/acs/GpsHyperionLinuxController.cpp b/linux/acs/GpsHyperionLinuxController.cpp index a2dbd81b..54198ca9 100644 --- a/linux/acs/GpsHyperionLinuxController.cpp +++ b/linux/acs/GpsHyperionLinuxController.cpp @@ -44,24 +44,21 @@ LocalPoolDataSetBase *GpsHyperionLinuxController::getDataSetHandle(sid_t sid) { ReturnValue_t GpsHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode, uint32_t *msToReachTheMode) { - if (not modeCommanded) { - if (mode == MODE_ON or mode == MODE_OFF) { - // 5h time to reach fix - *msToReachTheMode = MAX_SECONDS_TO_REACH_FIX; - maxTimeToReachFix.resetTimer(); - modeCommanded = true; - } else if (mode == MODE_NORMAL) { - return HasModesIF::INVALID_MODE; - } + if (mode == MODE_ON) { + maxTimeToReachFix.resetTimer(); + gainedNewFix.timeOut(); + } else if (mode == MODE_NORMAL) { + return HasModesIF::INVALID_MODE; } if (mode == MODE_OFF) { + maxTimeToReachFix.timeOut(); + gainedNewFix.timeOut(); PoolReadGuard pg(&gpsSet); gpsSet.setValidity(false, true); - // There can't be a fix with a device that is off. - triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, 0); - gpsSet.fixMode.value = 0; + // The ctrl is off, so it cannot detect the data from the devices. + handleFixChangedEvent(GpsHyperion::FixMode::NOT_SEEN); + gpsSet.fixMode.value = GpsHyperion::FixMode::NOT_SEEN; oneShotSwitches.reset(); - modeCommanded = false; } return returnvalue::OK; } @@ -75,13 +72,16 @@ ReturnValue_t GpsHyperionLinuxController::executeAction(ActionId_t actionId, PoolReadGuard pg(&gpsSet); // Set HK entries invalid gpsSet.setValidity(false, true); - resetCallback(data, size, resetCallbackArgs); + ReturnValue_t result = resetCallback(data, size, resetCallbackArgs); + if (result != returnvalue::OK) { + return result; + } return HasActionsIF::EXECUTION_FINISHED; } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; } } - return returnvalue::OK; + return HasActionsIF::INVALID_ACTION_ID; } ReturnValue_t GpsHyperionLinuxController::initializeLocalDataPool( @@ -216,15 +216,9 @@ 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.getTimeoutMs() / 1000 << " seconds" << std::endl; - triggerEvent(GpsHyperion::CANT_GET_FIX, maxTimeToReachFix.getTimeoutMs()); - oneShotSwitches.cantGetFixSwitch = false; - } modeIsSet = false; } else { - // GPS device is off anyway, so do other handling + // GPS ctrl is off anyway, so do other handling return returnvalue::FAILED; } } @@ -249,27 +243,44 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) { uint8_t newFix = 0; if (modeIsSet) { // 0: Not seen, 1: No fix, 2: 2D-Fix, 3: 3D-Fix - if (gps.fix.mode == 2 or gps.fix.mode == 3) { + if (gps.fix.mode == GpsHyperion::FixMode::FIX_2D or + gps.fix.mode == GpsHyperion::FixMode::FIX_3D) { validFix = true; + maxTimeToReachFix.resetTimer(); } newFix = gps.fix.mode; - if (newFix == 0 or newFix == 1) { - if (modeCommanded and maxTimeToReachFix.hasTimedOut()) { - // We are supposed to be on and functioning, but no fix was found - if (mode == MODE_ON or mode == MODE_NORMAL) { - mode = MODE_OFF; - } - modeCommanded = false; - } - } } if (gpsSet.fixMode.value != newFix) { -#if OBSW_Q7S_EM != 1 - triggerEvent(GpsHyperion::GPS_FIX_CHANGE, gpsSet.fixMode.value, newFix); -#endif + handleFixChangedEvent(newFix); } gpsSet.fixMode = newFix; gpsSet.fixMode.setValid(modeIsSet); + // We are supposed to be on and functioning, but no fix was found + if (not validFix) { + if (maxTimeToReachFix.hasTimedOut()) { + // Set HK entries invalid + gpsSet.setValidity(false, true); + if (oneShotSwitches.cantGetFixSwitch) { + sif::warning << "GpsHyperionLinuxController: No fix detected in allowed " + << maxTimeToReachFix.getTimeoutMs() / 1000 << " seconds" << std::endl; + triggerEvent(GpsHyperion::CANT_GET_FIX, maxTimeToReachFix.getTimeoutMs()); + oneShotSwitches.cantGetFixSwitch = false; + // Try resetting the devices + if (resetCallback != nullptr) { + uint8_t chip = GpsHyperion::GnssChip::A_SIDE; + ReturnValue_t result = resetCallback(&chip, 1, resetCallbackArgs); + if (result != returnvalue::OK) { + triggerEvent(GpsHyperion::RESET_FAIL, chip); + } + chip = GpsHyperion::GnssChip::B_SIDE; + result = resetCallback(&chip, 1, resetCallbackArgs); + if (result != returnvalue::OK) { + triggerEvent(GpsHyperion::RESET_FAIL, chip); + } + } + } + } + } // 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) @@ -282,9 +293,12 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) { } satNotSetCounter = 0; } else { - satNotSetCounter++; - if (gpsSet.satInUse.isValid() and satNotSetCounter >= 10) { + if (satNotSetCounter < 10) { + satNotSetCounter++; + } else { + gpsSet.satInUse.value = 0; gpsSet.satInUse.setValid(false); + gpsSet.satInView.value = 0; gpsSet.satInView.setValid(false); } } @@ -292,22 +306,24 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) { // LATLON is set for every message, no need for a counter bool latValid = false; bool longValid = false; - if (LATLON_SET == (LATLON_SET & gps.set)) { - if (std::isfinite(gps.fix.latitude)) { - // Negative latitude -> South direction - gpsSet.latitude.value = gps.fix.latitude; - // As specified in gps.h: Only valid if mode >= 2 - if (gps.fix.mode >= 2) { - latValid = true; + if (modeIsSet) { + if (LATLON_SET == (LATLON_SET & gps.set)) { + if (std::isfinite(gps.fix.latitude)) { + // Negative latitude -> South direction + gpsSet.latitude.value = gps.fix.latitude; + // As specified in gps.h: Only valid if mode >= 2 + if (gps.fix.mode >= GpsHyperion::FixMode::FIX_2D) { + 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; + 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 >= GpsHyperion::FixMode::FIX_2D) { + longValid = true; + } } } } @@ -316,20 +332,24 @@ ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) { // ALTITUDE is set for every message, no need for a counter bool altitudeValid = false; - if (ALTITUDE_SET == (ALTITUDE_SET & gps.set) && std::isfinite(gps.fix.altitude)) { - gpsSet.altitude.value = gps.fix.altitude; - // As specified in gps.h: Only valid if mode == 3 - if (gps.fix.mode == 3) { - altitudeValid = true; + if (modeIsSet) { + if (ALTITUDE_SET == (ALTITUDE_SET & gps.set) && std::isfinite(gps.fix.altitude)) { + gpsSet.altitude.value = gps.fix.altitude; + // As specified in gps.h: Only valid if mode == 3 + if (gps.fix.mode == GpsHyperion::FixMode::FIX_3D) { + altitudeValid = true; + } } } gpsSet.altitude.setValid(altitudeValid); // 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; - speedValid = true; + if (modeIsSet) { + if (SPEED_SET == (SPEED_SET & gps.set) && std::isfinite(gps.fix.speed)) { + gpsSet.speed.value = gps.fix.speed; + speedValid = true; + } } gpsSet.speed.setValid(speedValid); @@ -430,3 +450,14 @@ void GpsHyperionLinuxController::overwriteTimeIfNotSane(timeval time, bool valid timeInit = true; } } + +void GpsHyperionLinuxController::handleFixChangedEvent(uint8_t newFix) { + if (gainedNewFix.hasTimedOut()) { + triggerEvent(GpsHyperion::GPS_FIX_CHANGE, newFix, fixChangeCounter); + fixChangeCounter = 0; + gainedNewFix.resetTimer(); + return; + } + fixChangeCounter++; + gainedNewFix.resetTimer(); +} diff --git a/linux/acs/GpsHyperionLinuxController.h b/linux/acs/GpsHyperionLinuxController.h index 3378ac55..b8c3ed7a 100644 --- a/linux/acs/GpsHyperionLinuxController.h +++ b/linux/acs/GpsHyperionLinuxController.h @@ -1,14 +1,13 @@ #ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_ #define MISSION_DEVICES_GPSHYPERIONHANDLER_H_ -#include +#include +#include +#include +#include +#include #include -#include "eive/eventSubsystemIds.h" -#include "fsfw/FSFW.h" -#include "fsfw/controller/ExtendedControllerBase.h" -#include "fsfw/devicehandlers/DeviceHandlerBase.h" - #ifdef FSFW_OSAL_LINUX #include #include @@ -24,8 +23,8 @@ */ class GpsHyperionLinuxController : public ExtendedControllerBase { public: - // 30 minutes - static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 30; + // 15 minutes + static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 15; enum ReadModes { SHM = 0, SOCKET = 1 }; @@ -65,7 +64,8 @@ class GpsHyperionLinuxController : public ExtendedControllerBase { const char* currentClientBuf = nullptr; ReadModes readMode = ReadModes::SOCKET; Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000); - bool modeCommanded = false; + Countdown gainedNewFix = Countdown(60 * 2 * 1000); + uint32_t fixChangeCounter = 0; bool timeInit = false; uint8_t satNotSetCounter = 0; @@ -92,6 +92,8 @@ class GpsHyperionLinuxController : public ExtendedControllerBase { // we set it with the roughly valid time from the GPS. For some reason, NTP might only work // if the time difference between sys time and current time is not too large void overwriteTimeIfNotSane(timeval time, bool validFix); + + void handleFixChangedEvent(uint8_t newFix); }; #endif /* MISSION_DEVICES_GPSHYPERIONHANDLER_H_ */ diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index a787b609..0e05842a 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 321 translations. + * @brief Auto-generated event translation file. Contains 324 translations. * @details - * Generated on: 2024-04-08 13:37:59 + * Generated on: 2024-04-10 11:49:35 */ #include "translateEvents.h" @@ -85,6 +85,8 @@ const char *CLOCK_SET_STRING = "CLOCK_SET"; const char *CLOCK_DUMP_LEGACY_STRING = "CLOCK_DUMP_LEGACY"; const char *CLOCK_SET_FAILURE_STRING = "CLOCK_SET_FAILURE"; const char *CLOCK_DUMP_STRING = "CLOCK_DUMP"; +const char *CLOCK_DUMP_BEFORE_SETTING_TIME_STRING = "CLOCK_DUMP_BEFORE_SETTING_TIME"; +const char *CLOCK_DUMP_AFTER_SETTING_TIME_STRING = "CLOCK_DUMP_AFTER_SETTING_TIME"; const char *TC_DELETION_FAILED_STRING = "TC_DELETION_FAILED"; const char *TEST_STRING = "TEST"; const char *CHANGE_OF_SETUP_PARAMETER_STRING = "CHANGE_OF_SETUP_PARAMETER"; @@ -242,6 +244,7 @@ const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANS const char *CHILDREN_LOST_MODE_STRING = "CHILDREN_LOST_MODE"; const char *GPS_FIX_CHANGE_STRING = "GPS_FIX_CHANGE"; const char *CANT_GET_FIX_STRING = "CANT_GET_FIX"; +const char *RESET_FAIL_STRING = "RESET_FAIL"; const char *P60_BOOT_COUNT_STRING = "P60_BOOT_COUNT"; const char *BATT_MODE_STRING = "BATT_MODE"; const char *BATT_MODE_CHANGED_STRING = "BATT_MODE_CHANGED"; @@ -489,6 +492,10 @@ const char *translateEvents(Event event) { return CLOCK_SET_FAILURE_STRING; case (8903): return CLOCK_DUMP_STRING; + case (8904): + return CLOCK_DUMP_BEFORE_SETTING_TIME_STRING; + case (8905): + return CLOCK_DUMP_AFTER_SETTING_TIME_STRING; case (9100): return TC_DELETION_FAILED_STRING; case (9700): @@ -803,6 +810,8 @@ const char *translateEvents(Event event) { return GPS_FIX_CHANGE_STRING; case (13101): return CANT_GET_FIX_STRING; + case (13102): + return RESET_FAIL_STRING; case (13200): return P60_BOOT_COUNT_STRING; case (13201): diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 110c5c62..7632605f 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 179 translations. - * Generated on: 2024-04-08 13:37:59 + * Generated on: 2024-04-10 11:49:35 */ #include "translateObjects.h" diff --git a/mission/controller/PowerController.h b/mission/controller/PowerController.h index 6df60732..db3fcedf 100644 --- a/mission/controller/PowerController.h +++ b/mission/controller/PowerController.h @@ -57,9 +57,9 @@ class PowerController : public ExtendedControllerBase, public ReceivesParameterM float batteryMaximumCapacity = 2.6 * 2; // [Ah] float coulombCounterVoltageUpperThreshold = 16.2; // [V] double maxAllowedTimeDiff = 1.5; // [s] - float payloadOpLimitOn = 0.90; // [%] - float payloadOpLimitLow = 0.75; // [%] - float higherModesLimit = 0.6; // [%] + float payloadOpLimitOn = 0.80; // [%] + float payloadOpLimitLow = 0.65; // [%] + float higherModesLimit = 0.60; // [%] // OCV Look-up-Table {[Ah],[V]} static constexpr uint8_t LOOK_UP_TABLE_MAX_IDX = 99; diff --git a/mission/controller/acs/SensorValues.h b/mission/controller/acs/SensorValues.h index d7da66c0..69761666 100644 --- a/mission/controller/acs/SensorValues.h +++ b/mission/controller/acs/SensorValues.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/tmtc b/tmtc index 102821fc..a8d0143b 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 102821fc718fb70b01ef949bd54da3d438f0d455 +Subproject commit a8d0143b1ed9a14f7e071ee3344dc4e8f1937c55