diff --git a/.idea/cmake.xml b/.idea/cmake.xml index e8d9d9dd..3be3a2b0 100644 --- a/.idea/cmake.xml +++ b/.idea/cmake.xml @@ -2,7 +2,6 @@ - diff --git a/CHANGELOG.md b/CHANGELOG.md index 0404791f..2e678fff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,118 @@ will consitute of a breaking change warranting a new major release: # [unreleased] +## Changed + +- Adapted HK data rates to new table for LEOP SAFE mode. +- GPS controller HK is now generated periodically as well. + +# [v1.43.1] 2023-04-04 + +## Fixed + +- Generic HK handling: Bug where HKs were generated a lot more often than required. This is the case + if a device handler `PERFORM_OPERATION` step is performed more than once per PST cycle. +- Syrlinks now goes to `_MODE_TO_ON` when finishing the `doStartUp` transition. + +## Changed + +- Doubled GS PST interval instead of scheduling everything twice. +- Syrlinks now only has one `PERFORM_OPERATION` step, but still has two communication steps. +- PCDU components only allow setting `NEEDS_RECOVERY`, `HEALTHY` and `EXTERNAL_CONTROL` health + states now. TMP sensor components only allow `HEALTHY` , `EXTERNAL_CONTROL`, `FAULTY` and + `PERMANENT_FAULTY`. +- TCS controller now does a sanity check on the temperature values: Values below -80 C or above + 160 C are ignored. + +# [v1.43.0] 2023-04-04 + +- q7s-package: v2.4.0 +- eive-tmtc: v2.21.0 + +## Added + +- Version of thermal controller which performs basic control tasks. +- PCDU handler can now command switch of the 3V3 stack (switch ID 19) +- Set STR dev to OFF in assembly when it is faulty. +- STR: Reset data link layer and flush RX for regular commands and before performing special + commands to ensure consistent start state + +## Fixed + +- PTME was not reset after configuration changes. +- GPS health devices: ACS board assembly not reacts to health changes. +- STR COM helper: Reset reply size after returning a reply + +## Changed + +- Poll threshold configuration of the PTME IP core is now configurable via a parameter command + and is set to 0b010 (4 polls) instead of 0b001 (1 poll) per default. +- EIVE system fallback and COM system fallback: Perform general subsystem handling first, then + event reception, and finally any new transition handling. +- IMTQ MGM integration time lowered to 6 ms. This relaxes scheduling requirements a bit. +- PCDU handler switcher HK set now has additional 3V3 switcher state HK. + +# [v1.42.0] 2023-04-01 + +- eive-tmtc: v2.20.1 +- q7s-package: v2.3.0 + +## Changed + +- SCEX filename updates. Also use T as the file ID / date separator between date and time. +- COM TM store and dump handling: Introduce modes for all 4 TM VC/store tasks. The OFF mode can be + used to disable ongoing dumps or to prevent writes to the PTME VC. This allows cleaner reset + handling of the PTME. All 4 VC/store tasks were attached to the COM mode tree and are commanded + as part of the COM sequence as well to ensure consistent state with the CCSDS IP core handler. +- Added `PTME_LOCKED` boolean lock which is used to lock the PTME so it is not used by the VC tasks + anymore. This lock will be controlled by the CCSDS IP core handler and is locked when the PTME + needs to be reset. Examples for this are datarate changes. +- Simulate real PCDU in PCDU dummy by remembering commandes switch change and triggering appropriate + events. Switch feedback is still immediate. +- GomSpace devices are polled with a doubled frequency. This speeds up power switch commanding. + +## Fixed + +- Bugfix for side lane transitions of the dual lane assemblies, which only worked when the + assembly was directly commanded. +- Syrlinks Handler: Bugfix so transition command is only sent once. +- SCEX file name bug: Create file name time stamp with `strftime` similarly to how it's done + for the persistent TM store. + +## Added + +- Added GPS0 and GPS1 health device which are used by the ACS board assembly when deciding whether + to change to the other side or to go to dual side directly. Setting the health devices to faulty + should also trigger a side switch or a switch to dual mode. + +# [v1.41.0] 2023-03-28 + +- eive-tmtc: v2.20.0 +- q7s-package: v2.2.0 + +## Fixed + +- Proper Faulty/External Control handling for the dual lane assemblies. +- ACS board devices: Go to ON mode instead of going to NORMAL mode directly. +- SUS device handlers: Go to ON mode on startup instead of NORMAL mode. +- Tweaks for the delay handling for the persistent TM stores. This allows pushing the full + high datarate when dumping telemetry. The most important and interesting fix is that + there needs to be a small delay between the polling of the GPIO. Polling the GPIO + without any delay consecutively can lead to scheduling issues. +- Bump FSFW for fix of `ControllerBase` class `startTransition` implementation. +- Bump FSFW for possible fix of `PowerSwitcherComponent`: Initial mode `MODE_UNDEFINED`. + +## Changed + +- Enabled periodic hosuekeeping generation for release images. +- Project structure (linux and mission folder) is subsystem centric now. + +# [v1.40.0] 2023-03-24 + +- eive-tmtc: v2.19.4 +- q7s-packasge: v2.1.0 +- Bumped fsfwgen for bugfix: Event translation can deal with duplicate event names now. + ## Fixed - PAPB busy polling now implemented properly with an upper bound of how often the PAPB is allowed @@ -23,6 +135,8 @@ will consitute of a breaking change warranting a new major release: Ideally, this will never be an issue and the PAPB VC interface should never block for a longer period. - The `mekfInvalidCounter` now resets on setting the STR to faulty. +- Improve the SD lock handling. The file handling does not need to be locked as it + is only handled by one thread. ## Added @@ -33,6 +147,7 @@ will consitute of a breaking change warranting a new major release: - STR: Fix weird issues on datalink layer data reception which sometimes occur. - Syrlinks FDIR: Fully allow FDIR to do more recoveries. Assembly should take care of preventing the switch to go off. +- Allow dual lane assembly side switches. ## Changed @@ -50,6 +165,7 @@ will consitute of a breaking change warranting a new major release: - Fine-tuning of various task priorities. - The CSP router now is scheduled with the `SCHED_RR` policy and the same priority as the PCDU handlers as well. +- Change project structure to be more subsystem centric for ACS and COM. # [v1.39.1] 2023-03-22 diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a966ea9..f51561be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ cmake_minimum_required(VERSION 3.13) set(OBSW_VERSION_MAJOR 1) -set(OBSW_VERSION_MINOR 39) +set(OBSW_VERSION_MINOR 43) set(OBSW_VERSION_REVISION 1) # set(CMAKE_VERBOSE TRUE) @@ -113,7 +113,7 @@ set(OBSW_ADD_TCS_CTRL 1 CACHE STRING "Add TCS controllers") set(OBSW_ADD_HEATERS - ${INIT_VAL} + 1 CACHE STRING "Add TCS heaters") set(OBSW_ADD_PLOC_SUPERVISOR ${INIT_VAL} @@ -297,9 +297,11 @@ include(BuildType) set_build_type() set(FSFW_DEBUG_INFO 0) +set(OBSW_ENABLE_PERIODIC_HK 1) set(Q7S_CHECK_FOR_ALREADY_RUNNING_IMG 0) if(RELEASE_BUILD MATCHES 0) set(FSFW_DEBUG_INFO 1) + set(OBSW_ENABLE_PERIODIC_HK 0) set(Q7S_CHECK_FOR_ALREADY_RUNNING_IMG 1) endif() @@ -407,7 +409,6 @@ add_subdirectory(thirdparty) if(EIVE_ADD_LINUX_FILES) if(TGT_BSP MATCHES "arm/q7s") add_subdirectory(${LIB_GOMSPACE_PATH}) - add_subdirectory(${LIB_ARCSEC_PATH}) endif() add_subdirectory(${LINUX_PATH}) endif() @@ -485,7 +486,8 @@ endif() target_link_libraries(${LIB_EIVE_MISSION} PUBLIC ${LIB_FSFW_NAME} ${LIB_OS_NAME}) -target_link_libraries(${LIB_DUMMIES} PUBLIC ${LIB_FSFW_NAME} ${LIB_JSON_NAME}) +target_link_libraries(${LIB_DUMMIES} PUBLIC ${LIB_EIVE_MISSION} + ${LIB_FSFW_NAME} ${LIB_JSON_NAME}) target_link_libraries(${OBSW_NAME} PRIVATE ${LIB_EIVE_MISSION} ${LIB_DUMMIES}) diff --git a/bsp_hosted/ObjectFactory.cpp b/bsp_hosted/ObjectFactory.cpp index eb633339..3d618cdb 100644 --- a/bsp_hosted/ObjectFactory.cpp +++ b/bsp_hosted/ObjectFactory.cpp @@ -4,13 +4,14 @@ #include #include #include -#include +#include #include #include #include "../mission/utility/DummySdCardManager.h" #include "OBSWConfig.h" #include "fsfw/platform.h" +#include "fsfw/power/PowerSwitchIF.h" #include "fsfw_tests/integration/task/TestTask.h" #if OBSW_ADD_TMTC_UDP_SERVER == 1 @@ -29,7 +30,7 @@ #include #include -#include "dummies/helpers.h" +#include "dummies/helperFactory.h" #ifdef PLATFORM_UNIX #include @@ -37,10 +38,10 @@ #include "devices/gpioIds.h" #include "fsfw_hal/linux/gpio/Gpio.h" -#include "linux/devices/ploc/PlocMPSoCHandler.h" -#include "linux/devices/ploc/PlocMPSoCHelper.h" -#include "linux/devices/ploc/PlocSupervisorHandler.h" -#include "linux/devices/ploc/PlocSupvUartMan.h" +#include "linux/payload/PlocMpsocHandler.h" +#include "linux/payload/PlocMpsocHelper.h" +#include "linux/payload/PlocSupervisorHandler.h" +#include "linux/payload/PlocSupvUartMan.h" #include "test/gpio/DummyGpioIF.h" #endif @@ -67,6 +68,12 @@ void ObjectFactory::produce(void* args) { auto* dummyGpioIF = new DummyGpioIF(); auto* dummySwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0); + std::vector switcherList; + auto initVal = PowerSwitchIF::SWITCH_OFF; + for (unsigned i = 0; i < 18; i++) { + switcherList.emplace_back(initVal); + } + dummySwitcher->setInitialSwitcherList(switcherList); #ifdef PLATFORM_UNIX new SerialComIF(objects::UART_COM_IF); #if OBSW_ADD_PLOC_MPSOC == 1 diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index ce30734a..25c6c39d 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 280 translations. + * @brief Auto-generated event translation file. Contains 284 translations. * @details - * Generated on: 2023-03-24 15:19:38 + * Generated on: 2023-04-04 13:59:07 */ #include "translateEvents.h" @@ -97,7 +97,6 @@ const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY"; const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID"; const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO"; const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY"; -const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET"; const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION"; const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE"; const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT"; @@ -210,6 +209,11 @@ const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED" const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE"; const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT"; const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED"; +const char *DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING = "DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY"; +const char *TRANSITION_OTHER_SIDE_FAILED_12900_STRING = "TRANSITION_OTHER_SIDE_FAILED_12900"; +const char *NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE_12901"; +const char *POWER_STATE_MACHINE_TIMEOUT_12902_STRING = "POWER_STATE_MACHINE_TIMEOUT_12902"; +const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903"; 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"; @@ -266,21 +270,25 @@ const char *I2C_UNAVAILABLE_REBOOT_STRING = "I2C_UNAVAILABLE_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING"; -const char *PLOC_OVERHEATING_STRING = "PLOC_OVERHEATING"; const char *OBC_OVERHEATING_STRING = "OBC_OVERHEATING"; -const char *HPA_OVERHEATING_STRING = "HPA_OVERHEATING"; -const char *PLPCDU_OVERHEATING_STRING = "PLPCDU_OVERHEATING"; +const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING"; +const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_OVERHEATING"; +const char *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE"; const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED"; const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON"; const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION"; const char *FILE_TOO_LARGE_STRING = "FILE_TOO_LARGE"; const char *BUSY_DUMPING_EVENT_STRING = "BUSY_DUMPING_EVENT"; -const char *DUMP_WAS_CANCELLED_STRING = "DUMP_WAS_CANCELLED"; const char *DUMP_OK_STORE_DONE_STRING = "DUMP_OK_STORE_DONE"; const char *DUMP_NOK_STORE_DONE_STRING = "DUMP_NOK_STORE_DONE"; const char *DUMP_MISC_STORE_DONE_STRING = "DUMP_MISC_STORE_DONE"; const char *DUMP_HK_STORE_DONE_STRING = "DUMP_HK_STORE_DONE"; const char *DUMP_CFDP_STORE_DONE_STRING = "DUMP_CFDP_STORE_DONE"; +const char *DUMP_OK_CANCELLED_STRING = "DUMP_OK_CANCELLED"; +const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED"; +const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED"; +const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED"; +const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -469,10 +477,8 @@ const char *translateEvents(Event event) { case (11204): return MEKF_RECOVERY_STRING; case (11205): - return MEKF_AUTOMATIC_RESET_STRING; - case (11206): return MEKF_INVALID_MODE_VIOLATION_STRING; - case (11207): + case (11206): return SAFE_MODE_CONTROLLER_FAILURE_STRING; case (11300): return SWITCH_CMD_SENT_STRING; @@ -694,6 +700,16 @@ const char *translateEvents(Event event) { return POWER_STATE_MACHINE_TIMEOUT_STRING; case (12803): return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING; + case (12804): + return DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING; + case (12900): + return TRANSITION_OTHER_SIDE_FAILED_12900_STRING; + case (12901): + return NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING; + case (12902): + return POWER_STATE_MACHINE_TIMEOUT_12902_STRING; + case (12903): + return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING; case (13000): return CHILDREN_LOST_MODE_STRING; case (13100): @@ -806,14 +822,14 @@ const char *translateEvents(Event event) { return NO_HEALTHY_HEATER_AVAILABLE_STRING; case (14102): return SYRLINKS_OVERHEATING_STRING; - case (14103): - return PLOC_OVERHEATING_STRING; case (14104): return OBC_OVERHEATING_STRING; case (14105): - return HPA_OVERHEATING_STRING; + return CAMERA_OVERHEATING_STRING; case (14106): - return PLPCDU_OVERHEATING_STRING; + return PCDU_SYSTEM_OVERHEATING_STRING; + case (14107): + return HEATER_NOT_OFF_FOR_OFF_MODE_STRING; case (14201): return TX_TIMER_EXPIRED_STRING; case (14202): @@ -824,8 +840,6 @@ const char *translateEvents(Event event) { return FILE_TOO_LARGE_STRING; case (14302): return BUSY_DUMPING_EVENT_STRING; - case (14303): - return DUMP_WAS_CANCELLED_STRING; case (14305): return DUMP_OK_STORE_DONE_STRING; case (14306): @@ -836,6 +850,16 @@ const char *translateEvents(Event event) { return DUMP_HK_STORE_DONE_STRING; case (14309): return DUMP_CFDP_STORE_DONE_STRING; + case (14310): + return DUMP_OK_CANCELLED_STRING; + case (14311): + return DUMP_NOK_CANCELLED_STRING; + case (14312): + return DUMP_MISC_CANCELLED_STRING; + case (14313): + return DUMP_HK_CANCELLED_STRING; + case (14314): + return DUMP_CFDP_CANCELLED_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 22df82ad..8962edfc 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 169 translations. - * Generated on: 2023-03-24 15:19:38 + * Contains 171 translations. + * Generated on: 2023-04-04 13:59:07 */ #include "translateObjects.h" @@ -38,6 +38,8 @@ const char *GYRO_3_L3G_HANDLER_STRING = "GYRO_3_L3G_HANDLER"; const char *RW4_STRING = "RW4"; const char *STAR_TRACKER_STRING = "STAR_TRACKER"; const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER"; +const char *GPS_0_HEALTH_DEV_STRING = "GPS_0_HEALTH_DEV"; +const char *GPS_1_HEALTH_DEV_STRING = "GPS_1_HEALTH_DEV"; const char *IMTQ_POLLING_STRING = "IMTQ_POLLING"; const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER"; const char *PCDU_HANDLER_STRING = "PCDU_HANDLER"; @@ -242,6 +244,10 @@ const char *translateObject(object_id_t object) { return STAR_TRACKER_STRING; case 0x44130045: return GPS_CONTROLLER_STRING; + case 0x44130046: + return GPS_0_HEALTH_DEV_STRING; + case 0x44130047: + return GPS_1_HEALTH_DEV_STRING; case 0x44140013: return IMTQ_POLLING_STRING; case 0x44140014: diff --git a/bsp_hosted/scheduling.cpp b/bsp_hosted/scheduling.cpp index 9f859b6c..600a94e1 100644 --- a/bsp_hosted/scheduling.cpp +++ b/bsp_hosted/scheduling.cpp @@ -14,7 +14,7 @@ #include "OBSWConfig.h" #include "ObjectFactory.h" -#include "mission/core/scheduling.h" +#include "mission/scheduling.h" #include "scheduling.h" #ifdef LINUX @@ -156,6 +156,10 @@ void scheduling::initTasks() { if (result != returnvalue::OK) { scheduling::printAddObjectError("THERMAL_CONTROLLER", objects::THERMAL_CONTROLLER); } + result = thermalTask->addComponent(objects::HEATER_HANDLER); + if (result != returnvalue::OK) { + scheduling::printAddObjectError("HEATER_HANDLER", objects::HEATER_HANDLER); + } FixedTimeslotTaskIF* pstTask = factory->createFixedTimeslotTask( "DUMMY_PST", 75, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc); @@ -193,7 +197,8 @@ void scheduling::initTasks() { #endif /* OBSW_ADD_TEST_CODE == 1 */ PeriodicTaskIF* dummyTask = factory->createPeriodicTask( - "DUMMY_TASK", 30, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc); + "DUMMY_TASK", 35, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc); + dummyTask->addComponent(objects::THERMAL_TEMP_INSERTER); scheduling::scheduleTmpTempSensors(dummyTask); scheduling::scheduleRtdSensors(dummyTask); dummyTask->addComponent(objects::SUS_0_N_LOC_XFYFZM_PT_XF); diff --git a/bsp_q7s/OBSWConfig.h.in b/bsp_q7s/OBSWConfig.h.in index 6f4e82e3..272467b5 100644 --- a/bsp_q7s/OBSWConfig.h.in +++ b/bsp_q7s/OBSWConfig.h.in @@ -13,9 +13,12 @@ /** All of the following flags should be enabled for mission code */ /*******************************************************************/ -#define OBSW_ENABLE_PERIODIC_HK 0 +// This enables a lot of periodically generated telemetry, so it can make sense to +// disable this for debugging purposes. +#define OBSW_ENABLE_PERIODIC_HK @OBSW_ENABLE_PERIODIC_HK@ + // This switch will cause the SW to command the EIVE system object to safe mode. This will -// trigger a lot of events, so it can make sense to disable this for debugging purposes +// trigger a lot of events, so it can make sense to disable this for debugging purposes. #define OBSW_COMMAND_SAFE_MODE_AT_STARTUP 1 #define OBSW_ADD_GOMSPACE_PCDU @OBSW_ADD_GOMSPACE_PCDU@ @@ -28,8 +31,8 @@ #define OBSW_ADD_SUS_BOARD_ASS @OBSW_ADD_SUS_BOARD_ASS@ #define OBSW_ADD_ACS_BOARD @OBSW_ADD_ACS_BOARD@ #define OBSW_ADD_ACS_CTRL 1 +#define OBSW_ADD_TCS_CTRL 1 #define OBSW_ADD_GPS_CTRL @OBSW_ADD_GPS_CTRL@ -#define OBSW_ADD_TCS_CTRL @OBSW_ADD_TCS_CTRL@ #define OBSW_ADD_RW @OBSW_ADD_RW@ #define OBSW_ADD_RTD_DEVICES @OBSW_ADD_RTD_DEVICES@ #define OBSW_ADD_SA_DEPL @OBSW_ADD_SA_DEPL@ diff --git a/bsp_q7s/callbacks/pcduSwitchCb.h b/bsp_q7s/callbacks/pcduSwitchCb.h index d0f2b748..4c006978 100644 --- a/bsp_q7s/callbacks/pcduSwitchCb.h +++ b/bsp_q7s/callbacks/pcduSwitchCb.h @@ -1,9 +1,9 @@ #ifndef BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_ #define BSP_Q7S_CALLBACKS_PCDUSWITCHCB_H_ -#include +#include -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" +#include namespace pcdu { diff --git a/bsp_q7s/callbacks/rwSpiCallback.cpp b/bsp_q7s/callbacks/rwSpiCallback.cpp index fa36744e..311b843e 100644 --- a/bsp_q7s/callbacks/rwSpiCallback.cpp +++ b/bsp_q7s/callbacks/rwSpiCallback.cpp @@ -6,7 +6,7 @@ #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw_hal/linux/UnixFileGuard.h" #include "fsfw_hal/linux/spi/SpiCookie.h" -#include "mission/devices/RwHandler.h" +#include "mission/acs/RwHandler.h" namespace rwSpiCallback { diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 9d772a86..c895106b 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -31,8 +31,10 @@ xsc::Chip CoreController::CURRENT_CHIP = xsc::Chip::NO_CHIP; xsc::Copy CoreController::CURRENT_COPY = xsc::Copy::NO_COPY; -CoreController::CoreController(object_id_t objectId, const std::atomic_uint16_t &i2cErrors) +CoreController::CoreController(object_id_t objectId, const std::atomic_uint16_t &i2cErrors, + bool enableHkSet) : ExtendedControllerBase(objectId, 5), + enableHkSet(enableHkSet), cmdExecutor(4096), cmdReplyBuf(4096, true), cmdRepliesSizes(128), @@ -136,7 +138,7 @@ ReturnValue_t CoreController::initializeLocalDataPool(localpool::DataPool &local localDataPoolMap.emplace(core::TEMPERATURE, &tempPoolEntry); localDataPoolMap.emplace(core::PS_VOLTAGE, &psVoltageEntry); localDataPoolMap.emplace(core::PL_VOLTAGE, &plVoltageEntry); - poolManager.subscribeForRegularPeriodicPacket({hkSet.getSid(), false, 10.0}); + poolManager.subscribeForRegularPeriodicPacket({hkSet.getSid(), enableHkSet, 60.0}); return returnvalue::OK; } diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index aaaba8ac..72d63b15 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include @@ -14,8 +16,6 @@ #include "bsp_q7s/fs/SdCardManager.h" #include "events/subsystemIdRanges.h" #include "fsfw/controller/ExtendedControllerBase.h" -#include "mission/devices/devicedefinitions/GPSDefinitions.h" -#include "mission/trace.h" class Timer; class SdCardManager; @@ -135,7 +135,7 @@ class CoreController : public ExtendedControllerBase { static constexpr Event I2C_UNAVAILABLE_REBOOT = event::makeEvent(SUBSYSTEM_ID, 10, severity::MEDIUM); - CoreController(object_id_t objectId, const std::atomic_uint16_t& i2cErrors); + CoreController(object_id_t objectId, const std::atomic_uint16_t& i2cErrors, bool enableHkSet); virtual ~CoreController(); ReturnValue_t initialize() override; @@ -179,6 +179,7 @@ class CoreController : public ExtendedControllerBase { static constexpr uint32_t BOOT_OFFSET_SECONDS = 15; 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; // States for SD state machine, which is used in non-blocking mode diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 03d5f36f..72c042c1 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -1,22 +1,34 @@ #include "ObjectFactory.h" +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include -#include #include -#include -#include -#include #include "OBSWConfig.h" #include "bsp_q7s/boardtest/Q7STestTask.h" @@ -37,33 +49,22 @@ #include "linux/boardtest/SpiTestClass.h" #include "linux/boardtest/UartTestClass.h" #include "linux/callbacks/gpioCallbacks.h" -#include "linux/csp/CspComIF.h" -#include "linux/devices/GpsHyperionLinuxController.h" -#include "linux/devices/ScexUartReader.h" -#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h" -#include "linux/devices/ploc/PlocMPSoCHandler.h" -#include "linux/devices/ploc/PlocMPSoCHelper.h" -#include "linux/devices/ploc/PlocMemoryDumper.h" -#include "linux/devices/ploc/PlocSupervisorHandler.h" -#include "linux/devices/startracker/StarTrackerHandler.h" #include "linux/ipcore/AxiPtmeConfig.h" #include "linux/ipcore/PapbVcInterface.h" #include "linux/ipcore/PdecHandler.h" #include "linux/ipcore/Ptme.h" #include "linux/ipcore/PtmeConfig.h" #include "mission/config/configfile.h" -#include "mission/csp/CspCookie.h" -#include "mission/system/fdir/AcsBoardFdir.h" -#include "mission/system/fdir/GomspacePowerFdir.h" +#include "mission/system/acs/AcsBoardFdir.h" +#include "mission/system/acs/AcsSubsystem.h" +#include "mission/system/acs/RwAssembly.h" +#include "mission/system/acs/SusFdir.h" +#include "mission/system/acs/acsModeTree.h" +#include "mission/system/com/SyrlinksFdir.h" +#include "mission/system/com/comModeTree.h" #include "mission/system/fdir/RtdFdir.h" -#include "mission/system/fdir/SusFdir.h" -#include "mission/system/fdir/SyrlinksFdir.h" -#include "mission/system/objects/AcsSubsystem.h" -#include "mission/system/objects/RwAssembly.h" #include "mission/system/objects/TcsBoardAssembly.h" -#include "mission/system/tree/acsModeTree.h" -#include "mission/system/tree/comModeTree.h" +#include "mission/system/power/GomspacePowerFdir.h" #include "mission/system/tree/payloadModeTree.h" #include "mission/system/tree/tcsModeTree.h" #include "mission/tmtc/tmFilters.h" @@ -75,14 +76,27 @@ using gpio::Levels; #if OBSW_TEST_LIBGPIOD == 1 #include "linux/boardtest/LibgpiodTest.h" #endif -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include @@ -102,28 +116,16 @@ using gpio::Levels; #include "fsfw_hal/linux/serial/SerialCookie.h" #include "fsfw_hal/linux/spi/SpiComIF.h" #include "fsfw_hal/linux/spi/SpiCookie.h" -#include "mission/core/GenericFactory.h" -#include "mission/devices/ACUHandler.h" -#include "mission/devices/BpxBatteryHandler.h" -#include "mission/devices/HeaterHandler.h" -#include "mission/devices/Max31865PT1000Handler.h" -#include "mission/devices/P60DockHandler.h" -#include "mission/devices/PayloadPcduHandler.h" -#include "mission/devices/RadiationSensorHandler.h" -#include "mission/devices/RwHandler.h" -#include "mission/devices/SolarArrayDeploymentHandler.h" -#include "mission/devices/Tmp1075Handler.h" -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" -#include "mission/devices/devicedefinitions/RadSensorDefinitions.h" -#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" -#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h" -#include "mission/system/objects/AcsBoardAssembly.h" -#include "mission/tmtc/CcsdsIpCoreHandler.h" +#include "mission/acs/RwHandler.h" +#include "mission/com/CcsdsIpCoreHandler.h" +#include "mission/com/syrlinksDefs.h" +#include "mission/genericFactory.h" +#include "mission/system/acs/AcsBoardAssembly.h" #include "mission/tmtc/TmFunnelHandler.h" ResetArgs RESET_ARGS_GNSS; std::atomic_bool LINK_STATE = CcsdsIpCoreHandler::LINK_DOWN; +std::atomic_bool PTME_LOCKED = false; std::atomic_uint16_t I2C_FATAL_ERRORS = 0; void Factory::setStaticFrameworkObjectIds() { @@ -187,27 +189,28 @@ void ObjectFactory::createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, //*spiRWComIF = new SpiComIF(objects::SPI_RW_COM_IF, q7s::SPI_RW_DEV, **gpioComIF); } -void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher) { +void ObjectFactory::createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher, + bool enableHkSets) { CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_SIZE, addresses::P60DOCK, 500); CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_SIZE, addresses::PDU1, 500); CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_SIZE, addresses::PDU2, 500); CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_SIZE, addresses::ACU, 500); auto p60Fdir = new GomspacePowerFdir(objects::P60DOCK_HANDLER); - P60DockHandler* p60dockhandler = - new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, p60DockCspCookie, p60Fdir); + P60DockHandler* p60dockhandler = new P60DockHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF, + p60DockCspCookie, p60Fdir, enableHkSets); auto pdu1Fdir = new GomspacePowerFdir(objects::PDU1_HANDLER); - Pdu1Handler* pdu1handler = - new Pdu1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, pdu1CspCookie, pdu1Fdir); + Pdu1Handler* pdu1handler = new Pdu1Handler(objects::PDU1_HANDLER, objects::CSP_COM_IF, + pdu1CspCookie, pdu1Fdir, enableHkSets); auto pdu2Fdir = new GomspacePowerFdir(objects::PDU2_HANDLER); - Pdu2Handler* pdu2handler = - new Pdu2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, pdu2CspCookie, pdu2Fdir); + Pdu2Handler* pdu2handler = new Pdu2Handler(objects::PDU2_HANDLER, objects::CSP_COM_IF, + pdu2CspCookie, pdu2Fdir, enableHkSets); auto acuFdir = new GomspacePowerFdir(objects::ACU_HANDLER); - ACUHandler* acuhandler = - new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie, acuFdir); + ACUHandler* acuhandler = new ACUHandler(objects::ACU_HANDLER, objects::CSP_COM_IF, acuCspCookie, + acuFdir, enableHkSets); auto pcduHandler = new PcduHandler(objects::PCDU_HANDLER, 50); /** @@ -357,7 +360,8 @@ void ObjectFactory::createAcsBoardGpios(GpioCookie& cookie) { } void ObjectFactory::createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* gpioComIF, - SerialComIF* uartComIF, PowerSwitchIF& pwrSwitcher) { + SerialComIF* uartComIF, PowerSwitchIF& pwrSwitcher, + bool enableHkSets) { using namespace gpio; GpioCookie* gpioCookieAcsBoard = new GpioCookie(); createAcsBoardGpios(*gpioCookieAcsBoard); @@ -511,8 +515,8 @@ void ObjectFactory::createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* #endif RESET_ARGS_GNSS.gpioComIF = gpioComIF; RESET_ARGS_GNSS.waitPeriodMs = 100; - auto gpsCtrl = - new GpsHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); + auto gpsCtrl = new GpsHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, + enableHkSets, debugGps); gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS); ObjectFactory::createAcsBoardAssy(pwrSwitcher, assemblyChildren, gpsCtrl, gpioComIF); @@ -587,7 +591,7 @@ void ObjectFactory::createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitc } new SolarArrayDeploymentHandler(objects::SOLAR_ARRAY_DEPL_HANDLER, gpioIF, pwrSwitcher, - pcdu::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V, + power::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V, gpioIds::DEPLSA1, gpioIds::DEPLSA2, *SdCardManager::instance()); } @@ -603,7 +607,7 @@ void ObjectFactory::createSyrlinksComponents(PowerSwitchIF* pwrSwitcher) { auto syrlinksFdir = new SyrlinksFdir(objects::SYRLINKS_HANDLER); auto syrlinksHandler = new SyrlinksHandler(objects::SYRLINKS_HANDLER, objects::SYRLINKS_COM_HANDLER, - syrlinksUartCookie, pcdu::PDU1_CH1_SYRLINKS_12V, syrlinksFdir); + syrlinksUartCookie, power::PDU1_CH1_SYRLINKS_12V, syrlinksFdir); syrlinksHandler->setPowerSwitcher(pwrSwitcher); syrlinksHandler->connectModeTreeParent(*syrlinksAssy); #if OBSW_DEBUG_SYRLINKS == 1 @@ -615,7 +619,7 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit using namespace gpio; std::stringstream consumer; auto* camSwitcher = - new CamSwitcher(objects::CAM_SWITCHER, pwrSwitch, pcdu::PDU2_CH8_PAYLOAD_CAMERA); + new CamSwitcher(objects::CAM_SWITCHER, pwrSwitch, power::PDU2_CH8_PAYLOAD_CAMERA); camSwitcher->connectModeTreeParent(satsystem::payload::SUBSYSTEM); #if OBSW_ADD_PLOC_MPSOC == 1 consumer << "0x" << std::hex << objects::PLOC_MPSOC_HANDLER; @@ -648,7 +652,7 @@ void ObjectFactory::createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwit auto supvHelper = new PlocSupvUartManager(objects::PLOC_SUPERVISOR_HELPER); auto* supvHandler = new PlocSupervisorHandler(objects::PLOC_SUPERVISOR_HANDLER, supervisorCookie, Gpio(gpioIds::ENABLE_SUPV_UART, gpioComIF), - pcdu::PDU1_CH6_PLOC_12V, *supvHelper); + power::PDU1_CH6_PLOC_12V, *supvHelper); supvHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM); #endif /* OBSW_ADD_PLOC_SUPERVISOR == 1 */ static_cast(consumer); @@ -725,7 +729,7 @@ void ObjectFactory::createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, rws[idx] = rwHandler; } - createRwAssy(*pwrSwitcher, pcdu::Switches::PDU2_CH2_RW_5V, rws, rwIds); + createRwAssy(*pwrSwitcher, power::Switches::PDU2_CH2_RW_5V, rws, rwIds); #endif /* OBSW_ADD_RW == 1 */ } @@ -750,10 +754,8 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(CcsdsComponentArgs& args) { gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_BUSY, gpio); gpio = new GpiodRegularByLineName(q7s::gpioNames::PAPB_EMPTY_SIGNAL_VC3, "PAPB VC3"); gpioCookiePtmeIp->addGpio(gpioIds::VC3_PAPB_EMPTY, gpio); - // Initialise to low and then pull high to do a PTME reset, which puts the PTME in reset - // state. It will be put out of reset in the CCSDS handler initialize function. gpio = new GpiodRegularByLineName(q7s::gpioNames::PTME_RESETN, "PTME RESETN", - gpio::Direction::OUT, gpio::Levels::LOW); + gpio::Direction::OUT, gpio::Levels::HIGH); gpioCookiePtmeIp->addGpio(gpioIds::PTME_RESETN, gpio); gpioChecker(args.gpioComIF.addGpios(gpioCookiePtmeIp), "PTME PAPB VCs"); @@ -787,34 +789,42 @@ ReturnValue_t ObjectFactory::createCcsdsComponents(CcsdsComponentArgs& args) { *args.ipCoreHandler = new CcsdsIpCoreHandler(objects::CCSDS_HANDLER, objects::CCSDS_PACKET_DISTRIBUTOR, *ptmeConfig, - LINK_STATE, &args.gpioComIF, gpios); + LINK_STATE, &args.gpioComIF, gpios, PTME_LOCKED); // This VC will receive all live TM auto* vcWithQueue = new VirtualChannelWithQueue(objects::PTME_VC0_LIVE_TM, ccsds::VC0, "PTME VC0 LIVE TM", *ptme, LINK_STATE, args.tmStore, 500); args.liveDestination = vcWithQueue; - new LiveTmTask(objects::LIVE_TM_TASK, args.pusFunnel, args.cfdpFunnel, *vcWithQueue); + auto* liveTask = new LiveTmTask(objects::LIVE_TM_TASK, args.pusFunnel, args.cfdpFunnel, + *vcWithQueue, PTME_LOCKED); + liveTask->connectModeTreeParent(satsystem::com::SUBSYSTEM); // Set up log store. auto* vc = new VirtualChannel(objects::PTME_VC1_LOG_TM, ccsds::VC1, "PTME VC1 LOG TM", *ptme, LINK_STATE); LogStores logStores(args.stores); // Core task which handles the LOG store and takes care of dumping it as TM using a VC directly - new PersistentLogTmStoreTask(objects::LOG_STORE_AND_TM_TASK, args.ipcStore, logStores, *vc, - *SdCardManager::instance()); + auto* logStore = + new PersistentLogTmStoreTask(objects::LOG_STORE_AND_TM_TASK, args.ipcStore, logStores, *vc, + *SdCardManager::instance(), PTME_LOCKED); + logStore->connectModeTreeParent(satsystem::com::SUBSYSTEM); vc = new VirtualChannel(objects::PTME_VC2_HK_TM, ccsds::VC2, "PTME VC2 HK TM", *ptme, LINK_STATE); // Core task which handles the HK store and takes care of dumping it as TM using a VC directly - new PersistentSingleTmStoreTask(objects::HK_STORE_AND_TM_TASK, args.ipcStore, - *args.stores.hkStore, *vc, persTmStore::DUMP_HK_STORE_DONE, - *SdCardManager::instance()); + auto* hkStore = new PersistentSingleTmStoreTask( + objects::HK_STORE_AND_TM_TASK, args.ipcStore, *args.stores.hkStore, *vc, + persTmStore::DUMP_HK_STORE_DONE, persTmStore::DUMP_HK_STORE_DONE, *SdCardManager::instance(), + PTME_LOCKED); + hkStore->connectModeTreeParent(satsystem::com::SUBSYSTEM); vc = new VirtualChannel(objects::PTME_VC3_CFDP_TM, ccsds::VC3, "PTME VC3 CFDP TM", *ptme, LINK_STATE); // Core task which handles the CFDP store and takes care of dumping it as TM using a VC directly - new PersistentSingleTmStoreTask(objects::CFDP_STORE_AND_TM_TASK, args.ipcStore, - *args.stores.cfdpStore, *vc, persTmStore::DUMP_CFDP_STORE_DONE, - *SdCardManager::instance()); + auto* cfdpTask = new PersistentSingleTmStoreTask( + objects::CFDP_STORE_AND_TM_TASK, args.ipcStore, *args.stores.cfdpStore, *vc, + persTmStore::DUMP_CFDP_STORE_DONE, persTmStore::DUMP_CFDP_CANCELLED, + *SdCardManager::instance(), PTME_LOCKED); + cfdpTask->connectModeTreeParent(satsystem::com::SUBSYSTEM); ReturnValue_t result = (*args.ipCoreHandler)->connectModeTreeParent(satsystem::com::SUBSYSTEM); if (result != returnvalue::OK) { @@ -957,20 +967,20 @@ void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) { auto strFdir = new StrFdir(objects::STAR_TRACKER); auto starTracker = new StarTrackerHandler(objects::STAR_TRACKER, objects::STR_COM_IF, starTrackerCookie, - paramJsonFile, strComIF, pcdu::PDU1_CH2_STAR_TRACKER_5V); + paramJsonFile, strComIF, power::PDU1_CH2_STAR_TRACKER_5V); starTracker->setPowerSwitcher(pwrSwitcher); starTracker->connectModeTreeParent(*strAssy); starTracker->setCustomFdir(strFdir); } -void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher) { +void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets) { auto* imtqAssy = new ImtqAssembly(objects::IMTQ_ASSY); imtqAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM); new ImtqPollingTask(objects::IMTQ_POLLING, I2C_FATAL_ERRORS); I2cCookie* imtqI2cCookie = new I2cCookie(addresses::IMTQ, imtq::MAX_REPLY_SIZE, q7s::I2C_PL_EIVE); auto imtqHandler = new ImtqHandler(objects::IMTQ_HANDLER, objects::IMTQ_POLLING, imtqI2cCookie, - pcdu::Switches::PDU1_CH3_MGT_5V); + power::Switches::PDU1_CH3_MGT_5V, enableHkSets); imtqHandler->enableThermalModule(ThermalStateCfg()); imtqHandler->setPowerSwitcher(pwrSwitcher); imtqHandler->connectModeTreeParent(*imtqAssy); @@ -984,10 +994,10 @@ void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher) { #endif } -void ObjectFactory::createBpxBatteryComponent() { +void ObjectFactory::createBpxBatteryComponent(bool enableHkSets) { I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_PL_EIVE); - BpxBatteryHandler* bpxHandler = - new BpxBatteryHandler(objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie); + BpxBatteryHandler* bpxHandler = new BpxBatteryHandler( + objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie, enableHkSets); bpxHandler->setStartUpImmediately(); bpxHandler->setToGoToNormalMode(true); #if OBSW_DEBUG_BPX_BATT == 1 diff --git a/bsp_q7s/core/ObjectFactory.h b/bsp_q7s/core/ObjectFactory.h index 68c64450..9daa4d01 100644 --- a/bsp_q7s/core/ObjectFactory.h +++ b/bsp_q7s/core/ObjectFactory.h @@ -3,12 +3,12 @@ #include #include -#include -#include +#include +#include +#include #include -#include +#include #include -#include #include #include @@ -24,6 +24,7 @@ class AcsBoardAssembly; class GpioIF; extern std::atomic_uint16_t I2C_FATAL_ERRORS; +extern std::atomic_bool PTME_LOCKED; namespace ObjectFactory { @@ -53,18 +54,19 @@ void produce(void* args); void createCommunicationInterfaces(LinuxLibgpioIF** gpioComIF, SerialComIF** uartComIF, SpiComIF** spiMainComIF, I2cComIF** i2cComIF); -void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher); +void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher, + bool enableHkSets); void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF* pwrSwitcher, Stack5VHandler& stackHandler); void createTmpComponents(); ReturnValue_t createRadSensorComponent(LinuxLibgpioIF* gpioComIF, Stack5VHandler& handler); void createAcsBoardGpios(GpioCookie& cookie); void createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* gpioComIF, SerialComIF* uartComIF, - PowerSwitchIF& pwrSwitcher); + PowerSwitchIF& pwrSwitcher, bool enableHkSets); void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTableIF* healthTable, HeaterHandler*& heaterHandler); -void createImtqComponents(PowerSwitchIF* pwrSwitcher); -void createBpxBatteryComponent(); +void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets); +void createBpxBatteryComponent(bool enableHkSets); void createStrComponents(PowerSwitchIF* pwrSwitcher); void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF); void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher); diff --git a/bsp_q7s/core/scheduling.cpp b/bsp_q7s/core/scheduling.cpp index 828579ff..e248938a 100644 --- a/bsp_q7s/core/scheduling.cpp +++ b/bsp_q7s/core/scheduling.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -17,9 +18,8 @@ #include "fsfw/tasks/FixedTimeslotTaskIF.h" #include "fsfw/tasks/PeriodicTaskIF.h" #include "fsfw/tasks/TaskFactory.h" -#include "mission/core/pollingSeqTables.h" -#include "mission/core/scheduling.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" +#include "mission/pollingSeqTables.h" +#include "mission/scheduling.h" #include "mission/utility/InitMission.h" /* This is configured for linux without CR */ @@ -193,8 +193,8 @@ void scheduling::initTasks() { if (result != returnvalue::OK) { scheduling::printAddObjectError("LOG_STORE_AND_TM", objects::LOG_STORE_AND_TM_TASK); } - PeriodicTaskIF* hkTmTask = factory->createPeriodicTask( - "HK_PSTORE", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr); + PeriodicTaskIF* hkTmTask = + factory->createPeriodicTask("HK_PSTORE", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, nullptr); result = hkTmTask->addComponent(objects::HK_STORE_AND_TM_TASK); if (result != returnvalue::OK) { scheduling::printAddObjectError("HK_STORE_AND_TM", objects::HK_STORE_AND_TM_TASK); @@ -291,6 +291,14 @@ void scheduling::initTasks() { if (result != returnvalue::OK) { scheduling::printAddObjectError("STR_ASSY", objects::STR_ASSY); } + result = acsSysTask->addComponent(objects::GPS_0_HEALTH_DEV); + if (result != returnvalue::OK) { + scheduling::printAddObjectError("GPS_0_HEALTH_DEV", objects::GPS_0_HEALTH_DEV); + } + result = acsSysTask->addComponent(objects::GPS_1_HEALTH_DEV); + if (result != returnvalue::OK) { + scheduling::printAddObjectError("GPS_1_HEALTH_DEV", objects::GPS_1_HEALTH_DEV); + } PeriodicTaskIF* tcsSystemTask = factory->createPeriodicTask( "TCS_TASK", 50, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.5, missedDeadlineFunc, &RR_SCHEDULING); @@ -338,9 +346,8 @@ void scheduling::initTasks() { // TODO: Use regular scheduler for this task #if OBSW_ADD_PLOC_MPSOC == 1 - PeriodicTaskIF* mpsocHelperTask = - factory->createPeriodicTask("PLOC_MPSOC_HELPER", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, - missedDeadlineFunc); + PeriodicTaskIF* mpsocHelperTask = factory->createPeriodicTask( + "PLOC_MPSOC_HELPER", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.2, missedDeadlineFunc); result = mpsocHelperTask->addComponent(objects::PLOC_MPSOC_HELPER); if (result != returnvalue::OK) { scheduling::printAddObjectError("PLOC_MPSOC_HELPER", objects::PLOC_MPSOC_HELPER); @@ -349,9 +356,8 @@ void scheduling::initTasks() { // TODO: Use regular scheduler for this task #if OBSW_ADD_PLOC_SUPERVISOR == 1 - PeriodicTaskIF* supvHelperTask = - factory->createPeriodicTask("PLOC_SUPV_HELPER", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, - missedDeadlineFunc); + PeriodicTaskIF* supvHelperTask = factory->createPeriodicTask( + "PLOC_SUPV_HELPER", 0, PeriodicTaskIF::MINIMUM_STACK_SIZE, 1.0, missedDeadlineFunc); result = supvHelperTask->addComponent(objects::PLOC_SUPERVISOR_HELPER); if (result != returnvalue::OK) { scheduling::printAddObjectError("PLOC_SUPV_HELPER", objects::PLOC_SUPERVISOR_HELPER); @@ -499,8 +505,9 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction /* Polling Sequence Table Default */ #if OBSW_ADD_SPI_TEST_CODE == 0 - FixedTimeslotTaskIF* syrlinksPst = factory.createFixedTimeslotTask( - "SYRLINKS", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, missedDeadlineFunc, &RR_SCHEDULING); + FixedTimeslotTaskIF* syrlinksPst = + factory.createFixedTimeslotTask("SYRLINKS", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.5, + missedDeadlineFunc, &RR_SCHEDULING); result = pst::pstSyrlinks(syrlinksPst); if (result != returnvalue::OK) { if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) { @@ -531,7 +538,7 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction FixedTimeslotTaskIF* gomSpacePstTask = factory.createFixedTimeslotTask("GS_PST_TASK", 65, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, - 0.5, missedDeadlineFunc, &RR_SCHEDULING); + 0.25, missedDeadlineFunc, &RR_SCHEDULING); result = pst::pstGompaceCan(gomSpacePstTask); if (result != returnvalue::OK) { if (result != FixedTimeslotTaskIF::SLOT_LIST_EMPTY) { diff --git a/bsp_q7s/core/scheduling.h b/bsp_q7s/core/scheduling.h index e49ce036..4a493749 100644 --- a/bsp_q7s/core/scheduling.h +++ b/bsp_q7s/core/scheduling.h @@ -4,7 +4,7 @@ #include #include "fsfw/tasks/definitions.h" -#include "mission/core/pollingSeqTables.h" +#include "mission/pollingSeqTables.h" using pst::AcsPstCfg; diff --git a/bsp_q7s/em/emObjectFactory.cpp b/bsp_q7s/em/emObjectFactory.cpp index e3f1f0cf..ad520441 100644 --- a/bsp_q7s/em/emObjectFactory.cpp +++ b/bsp_q7s/em/emObjectFactory.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include @@ -13,13 +13,13 @@ #include "bsp_q7s/core/ObjectFactory.h" #include "busConf.h" #include "devConf.h" -#include "dummies/helpers.h" +#include "dummies/helperFactory.h" #include "eive/objects.h" #include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h" #include "linux/ObjectFactory.h" #include "linux/callbacks/gpioCallbacks.h" -#include "mission/core/GenericFactory.h" -#include "mission/system/tree/comModeTree.h" +#include "mission/genericFactory.h" +#include "mission/system/com/comModeTree.h" void ObjectFactory::produce(void* args) { ObjectFactory::setStatics(); @@ -29,6 +29,11 @@ void ObjectFactory::produce(void* args) { StorageManagerIF* ipcStore = nullptr; StorageManagerIF* tmStore = nullptr; + bool enableHkSets = false; +#if OBSW_ENABLE_PERIODIC_HK == 1 + enableHkSets = true; +#endif + PersistentTmStores stores; ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel, *SdCardManager::instance(), &ipcStore, &tmStore, stores); @@ -61,12 +66,12 @@ void ObjectFactory::produce(void* args) { auto* comCookieDummy = new ComCookieDummy(); pwrSwitcher = new PcduHandlerDummy(objects::PCDU_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); #else - createPcduComponents(gpioComIF, &pwrSwitcher); + createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets); #endif dummy::createDummies(dummyCfg, *pwrSwitcher, gpioComIF); - new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS); + new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS, enableHkSets); // Regular FM code, does not work for EM if the hardware is not connected // createPcduComponents(gpioComIF, &pwrSwitcher); @@ -84,7 +89,7 @@ void ObjectFactory::produce(void* args) { // createRadSensorComponent(gpioComIF); #if OBSW_ADD_ACS_BOARD == 1 - createAcsBoardComponents(gpioComIF, uartComIF, *pwrSwitcher); + createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher); #else // Still add all GPIOs for EM. GpioCookie* acsBoardGpios = new GpioCookie(); @@ -93,7 +98,7 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_MGT == 1 - createImtqComponents(pwrSwitcher); + createImtqComponents(pwrSwitcher, enableHkSets); #endif #if OBSW_ADD_SYRLINKS == 1 @@ -105,7 +110,7 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_BPX_BATTERY_HANDLER == 1 - createBpxBatteryComponent(); + createBpxBatteryComponent(enableHkSets); #endif #if OBSW_ADD_STAR_TRACKER == 1 @@ -131,9 +136,9 @@ void ObjectFactory::produce(void* args) { createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false, pcdu::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V); #endif - createAcsController(true); - HeaterHandler* heaterHandler = nullptr; - ObjectFactory::createGenericHeaterComponents(*gpioComIF, *pwrSwitcher, heaterHandler); + createAcsController(true, enableHkSets); + HeaterHandler* heaterHandler; + createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler); createThermalController(*heaterHandler); satsystem::init(); } diff --git a/bsp_q7s/fmObjectFactory.cpp b/bsp_q7s/fmObjectFactory.cpp index f3ce12e1..963c897b 100644 --- a/bsp_q7s/fmObjectFactory.cpp +++ b/bsp_q7s/fmObjectFactory.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include "OBSWConfig.h" #include "bsp_q7s/core/CoreController.h" @@ -12,7 +12,7 @@ #include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h" #include "linux/ObjectFactory.h" #include "linux/callbacks/gpioCallbacks.h" -#include "mission/core/GenericFactory.h" +#include "mission/genericFactory.h" #include "mission/system/tree/system.h" #include "mission/tmtc/tmFilters.h" @@ -24,6 +24,11 @@ void ObjectFactory::produce(void* args) { StorageManagerIF* ipcStore = nullptr; StorageManagerIF* tmStore = nullptr; + bool enableHkSets = false; +#if OBSW_ENABLE_PERIODIC_HK == 1 + enableHkSets = true; +#endif + PersistentTmStores stores; ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel, *SdCardManager::instance(), &ipcStore, &tmStore, stores); @@ -38,8 +43,8 @@ void ObjectFactory::produce(void* args) { q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF); gpioCallbacks::disableAllDecoder(gpioComIF); - new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS); - createPcduComponents(gpioComIF, &pwrSwitcher); + new CoreController(objects::CORE_CONTROLLER, I2C_FATAL_ERRORS, enableHkSets); + createPcduComponents(gpioComIF, &pwrSwitcher, enableHkSets); auto* stackHandler = new Stack5VHandler(*pwrSwitcher); #if OBSW_ADD_RAD_SENSORS == 1 @@ -50,7 +55,7 @@ void ObjectFactory::produce(void* args) { #endif #if OBSW_ADD_ACS_BOARD == 1 - createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher); + createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher, true); #endif HeaterHandler* heaterHandler; createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler); @@ -66,12 +71,12 @@ void ObjectFactory::produce(void* args) { createPayloadComponents(gpioComIF, *pwrSwitcher); #if OBSW_ADD_MGT == 1 - createImtqComponents(pwrSwitcher); + createImtqComponents(pwrSwitcher, enableHkSets); #endif createReactionWheelComponents(gpioComIF, pwrSwitcher); #if OBSW_ADD_BPX_BATTERY_HANDLER == 1 - createBpxBatteryComponent(); + createBpxBatteryComponent(enableHkSets); #endif #if OBSW_ADD_STAR_TRACKER == 1 @@ -92,7 +97,7 @@ void ObjectFactory::produce(void* args) { #if OBSW_ADD_SCEX_DEVICE == 1 createScexComponents(q7s::UART_SCEX_DEV, pwrSwitcher, *SdCardManager::instance(), false, - pcdu::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V); + power::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V); #endif /* Test Task */ #if OBSW_ADD_TEST_CODE == 1 @@ -101,6 +106,6 @@ void ObjectFactory::produce(void* args) { createMiscComponents(); createThermalController(*heaterHandler); - createAcsController(true); + createAcsController(true, enableHkSets); satsystem::init(); } diff --git a/bsp_q7s/fs/SdCardManager.cpp b/bsp_q7s/fs/SdCardManager.cpp index 29225899..89d3aaff 100644 --- a/bsp_q7s/fs/SdCardManager.cpp +++ b/bsp_q7s/fs/SdCardManager.cpp @@ -312,7 +312,6 @@ void SdCardManager::resetState() { ReturnValue_t SdCardManager::updateSdStatePair() { using namespace std; - MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX); std::error_code e; if (not filesystem::exists(SD_STATE_FILE, e)) { return STATUS_FILE_NEXISTS; @@ -362,6 +361,7 @@ void SdCardManager::processSdStatusLine(std::string& line, uint8_t& idx, sd::SdC sdStates.second = sd::SdState::ON; } } else if (word == "off") { + MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX); if (currentSd == sd::SdCard::SLOT_0) { sdStates.first = sd::SdState::OFF; } else { @@ -371,6 +371,7 @@ void SdCardManager::processSdStatusLine(std::string& line, uint8_t& idx, sd::SdC } if (mountLine) { + MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX); if (currentSd == sd::SdCard::SLOT_0) { sdStates.first = sd::SdState::MOUNTED; } else { @@ -409,7 +410,6 @@ ReturnValue_t SdCardManager::updateSdCardStateFile() { if (cmdExecutor.getCurrentState() == CommandExecutor::States::PENDING) { return CommandExecutor::COMMAND_PENDING; } - MutexGuard mg(sdLock, LOCK_TYPE, SD_LOCK_TIMEOUT, LOCK_CTX); // Use q7hw utility and pipe the command output into the state file std::string updateCmd = "q7hw sd info all > " + std::string(SD_STATE_FILE); cmdExecutor.load(updateCmd, true, printCmdOutput); diff --git a/bsp_q7s/fs/SdCardManager.h b/bsp_q7s/fs/SdCardManager.h index cee06894..b7e2a09f 100644 --- a/bsp_q7s/fs/SdCardManager.h +++ b/bsp_q7s/fs/SdCardManager.h @@ -228,7 +228,7 @@ class SdCardManager : public SystemObject, public SdCardMountedIF { MutexIF* prefLock = nullptr; MutexIF* defaultLock = nullptr; static constexpr MutexIF::TimeoutType LOCK_TYPE = MutexIF::TimeoutType::WAITING; - static constexpr uint32_t SD_LOCK_TIMEOUT = 250; + static constexpr uint32_t SD_LOCK_TIMEOUT = 100; static constexpr uint32_t OTHER_TIMEOUT = 20; static constexpr char LOCK_CTX[] = "SdCardManager"; diff --git a/bsp_q7s/obsw.cpp b/bsp_q7s/obsw.cpp index e8af57a9..d2d640f3 100644 --- a/bsp_q7s/obsw.cpp +++ b/bsp_q7s/obsw.cpp @@ -14,8 +14,8 @@ #include "core/scheduling.h" #include "fsfw/tasks/TaskFactory.h" #include "fsfw/version.h" -#include "mission/acsDefs.h" -#include "mission/comDefs.h" +#include "mission/acs/defs.h" +#include "mission/com/defs.h" #include "mission/system/tree/system.h" #include "q7sConfig.h" #include "watchdog/definitions.h" diff --git a/common/config/devices/powerSwitcherList.h b/common/config/devices/powerSwitcherList.h index d032428b..940d5581 100644 --- a/common/config/devices/powerSwitcherList.h +++ b/common/config/devices/powerSwitcherList.h @@ -1,6 +1,6 @@ #ifndef FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ #define FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" +#include #endif /* FSFWCONFIG_DEVICES_POWERSWITCHERLIST_H_ */ diff --git a/common/config/eive/definitions.h b/common/config/eive/definitions.h index 74208e25..8c460f53 100644 --- a/common/config/eive/definitions.h +++ b/common/config/eive/definitions.h @@ -15,6 +15,9 @@ static constexpr char OBSW_VERSION_FILE_NAME[] = "obsw_version.txt"; static constexpr char OBSW_PATH[] = "/usr/bin/eive-obsw"; static constexpr char OBSW_VERSION_FILE_PATH[] = "/usr/share/eive-obsw/obsw_version.txt"; +// ISO8601 timestamp. +static constexpr char FILE_DATE_FORMAT[] = "%FT%H%M%SZ"; + static constexpr uint16_t EIVE_PUS_APID = 0x65; static constexpr uint16_t EIVE_CFDP_APID = 0x66; static constexpr uint16_t EIVE_LOCAL_CFDP_ENTITY_ID = EIVE_CFDP_APID; @@ -55,6 +58,7 @@ static constexpr uint32_t CFDP_STORE_QUEUE_SIZE = 300; static constexpr uint32_t MAX_PUS_FUNNEL_QUEUE_DEPTH = 100; static constexpr uint32_t MAX_CFDP_FUNNEL_QUEUE_DEPTH = 80; +static constexpr uint32_t HK_SERVICE_QUEUE_DEPTH = 60; static constexpr uint32_t MAX_STORED_CMDS_UDP = 150; static constexpr uint32_t MAX_STORED_CMDS_TCP = 180; diff --git a/common/config/eive/objects.h b/common/config/eive/objects.h index 667067bb..0cc4b9d9 100644 --- a/common/config/eive/objects.h +++ b/common/config/eive/objects.h @@ -43,6 +43,8 @@ enum commonObjects : uint32_t { RW4 = 0x44120350, STAR_TRACKER = 0x44130001, GPS_CONTROLLER = 0x44130045, + GPS_0_HEALTH_DEV = 0x44130046, + GPS_1_HEALTH_DEV = 0x44130047, IMTQ_POLLING = 0x44140013, IMTQ_HANDLER = 0x44140014, diff --git a/dummies/AcuDummy.cpp b/dummies/AcuDummy.cpp index aa33a068..7c18f6bf 100644 --- a/dummies/AcuDummy.cpp +++ b/dummies/AcuDummy.cpp @@ -1,6 +1,6 @@ #include "AcuDummy.h" -#include +#include AcuDummy::AcuDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/dummies/BpxDummy.cpp b/dummies/BpxDummy.cpp index 0770e9fc..ca546285 100644 --- a/dummies/BpxDummy.cpp +++ b/dummies/BpxDummy.cpp @@ -1,6 +1,6 @@ #include "BpxDummy.h" -#include +#include BpxDummy::BpxDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/dummies/CMakeLists.txt b/dummies/CMakeLists.txt index 75dd1364..6a49fcc6 100644 --- a/dummies/CMakeLists.txt +++ b/dummies/CMakeLists.txt @@ -26,6 +26,6 @@ target_sources( CoreControllerDummy.cpp PlocMpsocDummy.cpp PlocSupervisorDummy.cpp - helpers.cpp + helperFactory.cpp MgmRm3100Dummy.cpp Tmp1075Dummy.cpp) diff --git a/dummies/CoreControllerDummy.h b/dummies/CoreControllerDummy.h index 37d88081..8fd5076b 100644 --- a/dummies/CoreControllerDummy.h +++ b/dummies/CoreControllerDummy.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include class CoreControllerDummy : public ExtendedControllerBase { public: diff --git a/dummies/GpsCtrlDummy.h b/dummies/GpsCtrlDummy.h index 4b7fc1bf..18b990fb 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 d46e6265..4e385ec5 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/dummies/GyroAdisDummy.cpp b/dummies/GyroAdisDummy.cpp index c7c40a1a..6f2e8e7f 100644 --- a/dummies/GyroAdisDummy.cpp +++ b/dummies/GyroAdisDummy.cpp @@ -1,6 +1,6 @@ #include "GyroAdisDummy.h" -#include +#include GyroAdisDummy::GyroAdisDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie), dataset(this) {} @@ -46,7 +46,7 @@ ReturnValue_t GyroAdisDummy::initializeLocalDataPool(localpool::DataPool &localD localDataPoolMap.emplace(adis1650x::ACCELERATION_X, new PoolEntry({0.0})); localDataPoolMap.emplace(adis1650x::ACCELERATION_Y, new PoolEntry({0.0})); localDataPoolMap.emplace(adis1650x::ACCELERATION_Z, new PoolEntry({0.0})); - localDataPoolMap.emplace(adis1650x::TEMPERATURE, new PoolEntry({0.0})); + localDataPoolMap.emplace(adis1650x::TEMPERATURE, new PoolEntry({10.0}, true)); return returnvalue::OK; } diff --git a/dummies/GyroAdisDummy.h b/dummies/GyroAdisDummy.h index 21de1eeb..03c69baa 100644 --- a/dummies/GyroAdisDummy.h +++ b/dummies/GyroAdisDummy.h @@ -2,7 +2,7 @@ #define DUMMIES_GYROADISDUMMY_H_ #include -#include +#include class GyroAdisDummy : public DeviceHandlerBase { public: diff --git a/dummies/ImtqDummy.cpp b/dummies/ImtqDummy.cpp index 01ec6457..fc99d321 100644 --- a/dummies/ImtqDummy.cpp +++ b/dummies/ImtqDummy.cpp @@ -1,6 +1,6 @@ #include "ImtqDummy.h" -#include +#include ImtqDummy::ImtqDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/dummies/Max31865Dummy.cpp b/dummies/Max31865Dummy.cpp index 43198bba..6ec1a716 100644 --- a/dummies/Max31865Dummy.cpp +++ b/dummies/Max31865Dummy.cpp @@ -1,5 +1,7 @@ #include "Max31865Dummy.h" +#include "fsfw/datapool/PoolReadGuard.h" + using namespace returnvalue; Max31865Dummy::Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) @@ -28,15 +30,20 @@ ReturnValue_t Max31865Dummy::initializeLocalDataPool(localpool::DataPool &localD LocalDataPoolManager &poolManager) { using namespace MAX31865; localDataPoolMap.emplace(static_cast(PoolIds::RTD_VALUE), new PoolEntry({0})); - localDataPoolMap.emplace(static_cast(PoolIds::TEMPERATURE_C), new PoolEntry({0})); + localDataPoolMap.emplace(static_cast(PoolIds::TEMPERATURE_C), + new PoolEntry({10.0}, true)); localDataPoolMap.emplace(static_cast(PoolIds::LAST_FAULT_BYTE), new PoolEntry({0})); localDataPoolMap.emplace(static_cast(PoolIds::FAULT_BYTE), new PoolEntry({0})); return OK; } -void Max31865Dummy::setTemperature(float temperature) { - set.temperatureCelcius.value = temperature; +void Max31865Dummy::setTemperature(float temperature, bool valid) { + PoolReadGuard pg(&set); + if (pg.getReadResult() == returnvalue::OK) { + set.temperatureCelcius.value = temperature; + set.setValidity(valid, true); + } } LocalPoolDataSetBase *Max31865Dummy::getDataSetHandle(sid_t sid) { return &set; } diff --git a/dummies/Max31865Dummy.h b/dummies/Max31865Dummy.h index 79f4ddb4..56b13a4b 100644 --- a/dummies/Max31865Dummy.h +++ b/dummies/Max31865Dummy.h @@ -1,15 +1,16 @@ #ifndef EIVE_OBSW_MAX31865DUMMY_H #define EIVE_OBSW_MAX31865DUMMY_H +#include + #include "fsfw/devicehandlers/DeviceHandlerBase.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" class Max31865Dummy : public DeviceHandlerBase { public: Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie); Max31865Dummy(object_id_t objectId, CookieIF *comCookie); - void setTemperature(float temperature); + void setTemperature(float temperature, bool setValid); private: MAX31865::PrimarySet set; diff --git a/dummies/MgmLIS3MDLDummy.cpp b/dummies/MgmLIS3MDLDummy.cpp index 0ce9a520..03b163fc 100644 --- a/dummies/MgmLIS3MDLDummy.cpp +++ b/dummies/MgmLIS3MDLDummy.cpp @@ -40,7 +40,7 @@ uint32_t MgmLIS3MDLDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { ReturnValue_t MgmLIS3MDLDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { - localDataPoolMap.emplace(mgmLis3::TEMPERATURE_CELCIUS, new PoolEntry({0.0})); + localDataPoolMap.emplace(mgmLis3::TEMPERATURE_CELCIUS, new PoolEntry({10.0}, true)); localDataPoolMap.emplace(mgmLis3::FIELD_STRENGTHS, new PoolEntry({1.02, 0.56, -0.78}, true)); return returnvalue::OK; diff --git a/dummies/P60DockDummy.cpp b/dummies/P60DockDummy.cpp index f4e4f9bb..79ad8cae 100644 --- a/dummies/P60DockDummy.cpp +++ b/dummies/P60DockDummy.cpp @@ -1,6 +1,8 @@ #include "P60DockDummy.h" -#include +#include + +#include "fsfw/datapool/PoolReadGuard.h" P60DockDummy::P60DockDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/dummies/P60DockDummy.h b/dummies/P60DockDummy.h index 9b67b155..46e6303e 100644 --- a/dummies/P60DockDummy.h +++ b/dummies/P60DockDummy.h @@ -3,6 +3,8 @@ #include +#include "mission/power/gsDefs.h" + class P60DockDummy : public DeviceHandlerBase { public: static const DeviceCommandId_t SIMPLE_COMMAND = 1; @@ -15,6 +17,8 @@ class P60DockDummy : public DeviceHandlerBase { virtual ~P60DockDummy(); protected: + lp_var_t temp1 = lp_var_t(this, P60Dock::pool::P60DOCK_TEMPERATURE_1); + lp_var_t temp2 = lp_var_t(this, P60Dock::pool::P60DOCK_TEMPERATURE_2); void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; diff --git a/dummies/PcduHandlerDummy.cpp b/dummies/PcduHandlerDummy.cpp index 15529fcf..0b1dec69 100644 --- a/dummies/PcduHandlerDummy.cpp +++ b/dummies/PcduHandlerDummy.cpp @@ -1,9 +1,13 @@ #include "PcduHandlerDummy.h" -#include +#include + +#include "mission/power/defs.h" PcduHandlerDummy::PcduHandlerDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) - : DeviceHandlerBase(objectId, comif, comCookie), dummySwitcher(objectId, 18, 18, false) {} + : DeviceHandlerBase(objectId, comif, comCookie), dummySwitcher(objectId, 18, 18, false) { + switcherLock = MutexFactory::instance()->createMutex(); +} PcduHandlerDummy::~PcduHandlerDummy() {} @@ -44,6 +48,17 @@ ReturnValue_t PcduHandlerDummy::initializeLocalDataPool(localpool::DataPool &loc } ReturnValue_t PcduHandlerDummy::sendSwitchCommand(power::Switch_t switchNr, ReturnValue_t onOff) { + if (onOff == SWITCH_ON) { + triggerEvent(power::SWITCH_CMD_SENT, true, switchNr); + } else { + triggerEvent(power::SWITCH_CMD_SENT, false, switchNr); + } + { + MutexGuard mg(switcherLock); + // To simulate a real PCDU, remember the switch change to trigger a SWITCH_HAS_CHANGED event + // at a later stage. + switchChangeArray[switchNr] = true; + } return dummySwitcher.sendSwitchCommand(switchNr, onOff); } @@ -60,3 +75,22 @@ ReturnValue_t PcduHandlerDummy::getFuseState(uint8_t fuseNr) const { } uint32_t PcduHandlerDummy::getSwitchDelayMs(void) const { return dummySwitcher.getSwitchDelayMs(); } + +void PcduHandlerDummy::performOperationHook() { + SwitcherBoolArray switcherChangeCopy{}; + { + MutexGuard mg(switcherLock); + std::memcpy(switcherChangeCopy.data(), switchChangeArray.data(), switchChangeArray.size()); + } + for (uint8_t idx = 0; idx < switcherChangeCopy.size(); idx++) { + if (switcherChangeCopy[idx]) { + if (dummySwitcher.getSwitchState(idx) == PowerSwitchIF::SWITCH_ON) { + triggerEvent(power::SWITCH_HAS_CHANGED, true, idx); + } else { + triggerEvent(power::SWITCH_HAS_CHANGED, false, idx); + } + MutexGuard mg(switcherLock); + switchChangeArray[idx] = false; + } + } +} diff --git a/dummies/PcduHandlerDummy.h b/dummies/PcduHandlerDummy.h index 2f4c167a..7980629b 100644 --- a/dummies/PcduHandlerDummy.h +++ b/dummies/PcduHandlerDummy.h @@ -15,8 +15,12 @@ class PcduHandlerDummy : public DeviceHandlerBase, public PowerSwitchIF { virtual ~PcduHandlerDummy(); protected: + MutexIF *switcherLock; DummyPowerSwitcher dummySwitcher; + using SwitcherBoolArray = std::array; + SwitcherBoolArray switchChangeArray{}; + void performOperationHook() override; void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; diff --git a/dummies/PduDummy.cpp b/dummies/PduDummy.cpp index 4b1efff8..2e3079ef 100644 --- a/dummies/PduDummy.cpp +++ b/dummies/PduDummy.cpp @@ -1,6 +1,6 @@ #include "PduDummy.h" -#include +#include PduDummy::PduDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie), diff --git a/dummies/PduDummy.h b/dummies/PduDummy.h index 751896cd..5d62978c 100644 --- a/dummies/PduDummy.h +++ b/dummies/PduDummy.h @@ -2,8 +2,7 @@ #define DUMMIES_PDUDUMMY_H_ #include - -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" +#include class PduDummy : public DeviceHandlerBase { public: diff --git a/dummies/PlPcduDummy.cpp b/dummies/PlPcduDummy.cpp index 1366f63e..6bfc271f 100644 --- a/dummies/PlPcduDummy.cpp +++ b/dummies/PlPcduDummy.cpp @@ -1,6 +1,6 @@ #include "PlPcduDummy.h" -#include +#include PlPcduDummy::PlPcduDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/dummies/PlPcduDummy.h b/dummies/PlPcduDummy.h index 227eedf8..8bf7f0c2 100644 --- a/dummies/PlPcduDummy.h +++ b/dummies/PlPcduDummy.h @@ -2,7 +2,7 @@ #define DUMMIES_PLPCDUDUMMY_H_ #include -#include +#include class PlPcduDummy : public DeviceHandlerBase { public: diff --git a/dummies/PlocMpsocDummy.h b/dummies/PlocMpsocDummy.h index 7beaa76b..cc09e45e 100644 --- a/dummies/PlocMpsocDummy.h +++ b/dummies/PlocMpsocDummy.h @@ -2,6 +2,8 @@ #include +#include "mission/power/defs.h" + class PlocMpsocDummy : public DeviceHandlerBase { public: static const DeviceCommandId_t SIMPLE_COMMAND = 1; diff --git a/dummies/PlocSupervisorDummy.cpp b/dummies/PlocSupervisorDummy.cpp index c3eea5b0..b9b1948f 100644 --- a/dummies/PlocSupervisorDummy.cpp +++ b/dummies/PlocSupervisorDummy.cpp @@ -1,8 +1,10 @@ #include "PlocSupervisorDummy.h" PlocSupervisorDummy::PlocSupervisorDummy(object_id_t objectId, object_id_t comif, - CookieIF *comCookie) - : DeviceHandlerBase(objectId, comif, comCookie) {} + CookieIF *comCookie, PowerSwitchIF &pwrSwitcher) + : DeviceHandlerBase(objectId, comif, comCookie) { + setPowerSwitcher(&pwrSwitcher); +} PlocSupervisorDummy::~PlocSupervisorDummy() {} @@ -42,3 +44,10 @@ ReturnValue_t PlocSupervisorDummy::initializeLocalDataPool(localpool::DataPool & LocalDataPoolManager &poolManager) { return returnvalue::OK; } + +ReturnValue_t PlocSupervisorDummy::getSwitches(const uint8_t **switches, + uint8_t *numberOfSwitches) { + *numberOfSwitches = 1; + *switches = reinterpret_cast(&switchId); + return returnvalue::OK; +} diff --git a/dummies/PlocSupervisorDummy.h b/dummies/PlocSupervisorDummy.h index 4118c893..33951cb7 100644 --- a/dummies/PlocSupervisorDummy.h +++ b/dummies/PlocSupervisorDummy.h @@ -1,6 +1,7 @@ #pragma once #include +#include class PlocSupervisorDummy : public DeviceHandlerBase { public: @@ -10,10 +11,13 @@ class PlocSupervisorDummy : public DeviceHandlerBase { static const uint8_t SIMPLE_COMMAND_DATA = 1; static const uint8_t PERIODIC_REPLY_DATA = 2; - PlocSupervisorDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie); + PlocSupervisorDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie, + PowerSwitchIF &pwrSwitcher); virtual ~PlocSupervisorDummy(); protected: + const power::Switches switchId = power::Switches::PDU1_CH6_PLOC_12V; + void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; @@ -27,4 +31,5 @@ class PlocSupervisorDummy : public DeviceHandlerBase { uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; + ReturnValue_t getSwitches(const uint8_t **switches, uint8_t *numberOfSwitches) override; }; diff --git a/dummies/RwDummy.cpp b/dummies/RwDummy.cpp index d90f3f7c..afc3a54f 100644 --- a/dummies/RwDummy.cpp +++ b/dummies/RwDummy.cpp @@ -1,6 +1,6 @@ #include "RwDummy.h" -#include +#include RwDummy::RwDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} diff --git a/dummies/StarTrackerDummy.cpp b/dummies/StarTrackerDummy.cpp index 71f0030c..937b3422 100644 --- a/dummies/StarTrackerDummy.cpp +++ b/dummies/StarTrackerDummy.cpp @@ -1,6 +1,6 @@ #include "StarTrackerDummy.h" -#include +#include StarTrackerDummy::StarTrackerDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} @@ -40,7 +40,7 @@ uint32_t StarTrackerDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) ReturnValue_t StarTrackerDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { - localDataPoolMap.emplace(startracker::MCU_TEMPERATURE, new PoolEntry({0})); + localDataPoolMap.emplace(startracker::MCU_TEMPERATURE, new PoolEntry({10.0}, true)); localDataPoolMap.emplace(startracker::TICKS_SOLUTION_SET, new PoolEntry({0})); localDataPoolMap.emplace(startracker::TIME_SOLUTION_SET, new PoolEntry({0})); diff --git a/dummies/SusDummy.h b/dummies/SusDummy.h index 9a49a591..0df35f8a 100644 --- a/dummies/SusDummy.h +++ b/dummies/SusDummy.h @@ -2,7 +2,7 @@ #define DUMMIES_SUSDUMMY_H_ #include -#include +#include class SusDummy : public DeviceHandlerBase { public: diff --git a/dummies/SyrlinksDummy.cpp b/dummies/SyrlinksDummy.cpp index 49c1319f..9ae3c2f0 100644 --- a/dummies/SyrlinksDummy.cpp +++ b/dummies/SyrlinksDummy.cpp @@ -1,6 +1,6 @@ #include "SyrlinksDummy.h" -#include +#include SyrlinksDummy::SyrlinksDummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie) : DeviceHandlerBase(objectId, comif, comCookie) {} @@ -40,7 +40,7 @@ uint32_t SyrlinksDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { r ReturnValue_t SyrlinksDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { - localDataPoolMap.emplace(syrlinks::TEMP_BASEBAND_BOARD, new PoolEntry({0})); - localDataPoolMap.emplace(syrlinks::TEMP_POWER_AMPLIFIER, new PoolEntry({0})); + localDataPoolMap.emplace(syrlinks::TEMP_BASEBAND_BOARD, new PoolEntry({10}, true)); + localDataPoolMap.emplace(syrlinks::TEMP_POWER_AMPLIFIER, new PoolEntry({10}, true)); return returnvalue::OK; } diff --git a/dummies/TemperatureSensorInserter.cpp b/dummies/TemperatureSensorInserter.cpp index c75b008c..3d268953 100644 --- a/dummies/TemperatureSensorInserter.cpp +++ b/dummies/TemperatureSensorInserter.cpp @@ -9,7 +9,7 @@ TemperatureSensorInserter::TemperatureSensorInserter(object_id_t objectId, Max31865DummyMap tempSensorDummies_, Tmp1075DummyMap tempTmpSensorDummies_) - : SystemObject(objects::THERMAL_TEMP_INSERTER), + : SystemObject(objectId), max31865DummyMap(std::move(tempSensorDummies_)), tmp1075DummyMap(std::move(tempTmpSensorDummies_)) {} @@ -22,6 +22,32 @@ ReturnValue_t TemperatureSensorInserter::initialize() { } ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) { + // TODO: deviceSensors + if (not tempsWereInitialized) { + for (auto& rtdDummy : max31865DummyMap) { + rtdDummy.second->setTemperature(10, true); + } + for (auto& tmpDummy : tmp1075DummyMap) { + tmpDummy.second->setTemperature(10, true); + } + tempsWereInitialized = true; + } + + if (cycles == 10) { + max31865DummyMap[objects::RTD_9_IC12_HPA]->setTemperature(-100, true); + max31865DummyMap[objects::RTD_11_IC14_MPA]->setTemperature(-100, true); + } + + if (cycles == 35) { + max31865DummyMap[objects::RTD_9_IC12_HPA]->setTemperature(0, true); + max31865DummyMap[objects::RTD_11_IC14_MPA]->setTemperature(0, true); + max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(-100, true); + } + if (cycles == 60) { + max31865DummyMap[objects::RTD_9_IC12_HPA]->setTemperature(-100, true); + max31865DummyMap[objects::RTD_11_IC14_MPA]->setTemperature(0, true); + } + /* ReturnValue_t result = max31865PlocHeatspreaderSet.read(); if (result != returnvalue::OK) { @@ -36,5 +62,7 @@ ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) { } max31865PlocHeatspreaderSet.commit(); */ + cycles++; return returnvalue::OK; } +ReturnValue_t TemperatureSensorInserter::initializeAfterTaskCreation() { return returnvalue::OK; } diff --git a/dummies/TemperatureSensorInserter.h b/dummies/TemperatureSensorInserter.h index 33d61443..0c05cf34 100644 --- a/dummies/TemperatureSensorInserter.h +++ b/dummies/TemperatureSensorInserter.h @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include "Max31865Dummy.h" #include "Tmp1075Dummy.h" @@ -14,6 +14,7 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject Tmp1075DummyMap tempTmpSensorDummies_); ReturnValue_t initialize() override; + ReturnValue_t initializeAfterTaskCreation() override; protected: ReturnValue_t performOperation(uint8_t opCode) override; @@ -23,6 +24,8 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject Tmp1075DummyMap tmp1075DummyMap; enum TestCase { NONE = 0, COOL_SYRLINKS = 1 }; int iteration = 0; + uint32_t cycles = 0; + bool tempsWereInitialized = false; bool performTest = false; TestCase testCase = TestCase::NONE; diff --git a/dummies/Tmp1075Dummy.cpp b/dummies/Tmp1075Dummy.cpp index 8cfede50..91a50774 100644 --- a/dummies/Tmp1075Dummy.cpp +++ b/dummies/Tmp1075Dummy.cpp @@ -1,6 +1,7 @@ #include "Tmp1075Dummy.h" -#include "mission/devices/devicedefinitions/Tmp1075Definitions.h" +#include +#include using namespace returnvalue; @@ -26,11 +27,16 @@ ReturnValue_t Tmp1075Dummy::scanForReply(const uint8_t *start, size_t len, ReturnValue_t Tmp1075Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) { return 0; } +void Tmp1075Dummy::setTemperature(float temperature, bool valid) { + PoolReadGuard pg(&set); + set.temperatureCelcius.value = temperature; + set.setValidity(valid, true); +} void Tmp1075Dummy::fillCommandAndReplyMap() {} uint32_t Tmp1075Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; } ReturnValue_t Tmp1075Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { - localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry({0.0})); + localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry({10.0}, true)); return OK; } LocalPoolDataSetBase *Tmp1075Dummy::getDataSetHandle(sid_t sid) { return &set; } diff --git a/dummies/Tmp1075Dummy.h b/dummies/Tmp1075Dummy.h index e43ca8e2..570fcd42 100644 --- a/dummies/Tmp1075Dummy.h +++ b/dummies/Tmp1075Dummy.h @@ -1,12 +1,14 @@ #ifndef EIVE_OBSW_TMP1075DUMMY_H #define EIVE_OBSW_TMP1075DUMMY_H +#include + #include "fsfw/devicehandlers/DeviceHandlerBase.h" -#include "mission/devices/devicedefinitions/Tmp1075Definitions.h" class Tmp1075Dummy : public DeviceHandlerBase { public: Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie); + void setTemperature(float temperature, bool setValid); private: TMP1075::Tmp1075Dataset set; diff --git a/dummies/helpers.cpp b/dummies/helperFactory.cpp similarity index 94% rename from dummies/helpers.cpp rename to dummies/helperFactory.cpp index 2210e1bb..404b640c 100644 --- a/dummies/helpers.cpp +++ b/dummies/helperFactory.cpp @@ -1,4 +1,4 @@ -#include "helpers.h" +#include "helperFactory.h" #include #include @@ -24,19 +24,20 @@ #include #include #include +#include #include +#include +#include +#include #include -#include -#include #include #include "TemperatureSensorInserter.h" #include "dummies/Max31865Dummy.h" #include "dummies/Tmp1075Dummy.h" -#include "mission/core/GenericFactory.h" -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" -#include "mission/system/tree/acsModeTree.h" -#include "mission/system/tree/comModeTree.h" +#include "mission/genericFactory.h" +#include "mission/system/acs/acsModeTree.h" +#include "mission/system/com/comModeTree.h" #include "mission/system/tree/payloadModeTree.h" #include "mission/system/tree/tcsModeTree.h" @@ -56,7 +57,7 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio rws[1] = new RwDummy(objects::RW2, objects::DUMMY_COM_IF, comCookieDummy); rws[2] = new RwDummy(objects::RW3, objects::DUMMY_COM_IF, comCookieDummy); rws[3] = new RwDummy(objects::RW4, objects::DUMMY_COM_IF, comCookieDummy); - ObjectFactory::createRwAssy(pwrSwitcher, pcdu::Switches::PDU2_CH2_RW_5V, rws, rwIds); + ObjectFactory::createRwAssy(pwrSwitcher, power::Switches::PDU2_CH2_RW_5V, rws, rwIds); new SaDeplDummy(objects::SOLAR_ARRAY_DEPL_HANDLER); auto* strAssy = new StrAssembly(objects::STR_ASSY); strAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM); @@ -210,7 +211,7 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio } } auto* camSwitcher = - new CamSwitcher(objects::CAM_SWITCHER, pwrSwitcher, pcdu::Switches::PDU2_CH8_PAYLOAD_CAMERA); + new CamSwitcher(objects::CAM_SWITCHER, pwrSwitcher, power::Switches::PDU2_CH8_PAYLOAD_CAMERA); camSwitcher->connectModeTreeParent(satsystem::payload::SUBSYSTEM); auto* scexDummy = new ScexDummy(objects::SCEX, objects::DUMMY_COM_IF, comCookieDummy); scexDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM); @@ -221,8 +222,8 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio auto* plocMpsocDummy = new PlocMpsocDummy(objects::PLOC_MPSOC_HANDLER, objects::DUMMY_COM_IF, comCookieDummy); plocMpsocDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM); - auto* plocSupervisorDummy = new PlocSupervisorDummy(objects::PLOC_SUPERVISOR_HANDLER, - objects::DUMMY_COM_IF, comCookieDummy); + auto* plocSupervisorDummy = new PlocSupervisorDummy( + objects::PLOC_SUPERVISOR_HANDLER, objects::DUMMY_COM_IF, comCookieDummy, pwrSwitcher); plocSupervisorDummy->connectModeTreeParent(satsystem::payload::SUBSYSTEM); } } diff --git a/dummies/helpers.h b/dummies/helperFactory.h similarity index 100% rename from dummies/helpers.h rename to dummies/helperFactory.h diff --git a/fsfw b/fsfw index b814e719..6650c293 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit b814e7198f720cad0fb063f54644d5dbc92c165c +Subproject commit 6650c293da09d8851c2bd6c4d6e6c5a8390d003e diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index d7a27fae..d7265738 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -86,66 +86,65 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 10802;0x2a32;SERIALIZATION_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h 10803;0x2a33;FILESTORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h 10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h -11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acsDefs.h -11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acsDefs.h -11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acsDefs.h -11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acsDefs.h -11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acsDefs.h -11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acsDefs.h -11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acsDefs.h -11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acsDefs.h -11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h -11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h -11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h -11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h -11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;No description;mission/devices/HeaterHandler.h -11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/devices/HeaterHandler.h -11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/devices/HeaterHandler.h -11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/devices/HeaterHandler.h -11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/devices/HeaterHandler.h -11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/devices/HeaterHandler.h -11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/devices/HeaterHandler.h -11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/devices/HeaterHandler.h -11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/devices/SolarArrayDeploymentHandler.h -11501;0x2ced;BURN_PHASE_DONE;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/devices/SolarArrayDeploymentHandler.h -11502;0x2cee;MAIN_SWITCH_ON_TIMEOUT;LOW;No description;mission/devices/SolarArrayDeploymentHandler.h -11503;0x2cef;MAIN_SWITCH_OFF_TIMEOUT;LOW;No description;mission/devices/SolarArrayDeploymentHandler.h -11504;0x2cf0;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/devices/SolarArrayDeploymentHandler.h -11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h -11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h -11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h -11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/PlocMPSoCHandler.h -11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHandler.h -11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/devices/ploc/PlocMPSoCHandler.h -11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/ImtqHandler.h -11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/rwHelpers.h -11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/devices/devicedefinitions/rwHelpers.h -11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h -11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h -12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h -12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/devices/ploc/PlocSupervisorHandler.h -12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/devices/ploc/PlocSupervisorHandler.h -12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h -12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/devices/ploc/PlocSupervisorHandler.h -12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h -12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/devices/ploc/PlocSupervisorHandler.h -12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/devices/ploc/PlocSupervisorHandler.h +11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acs/defs.h +11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acs/defs.h +11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acs/defs.h +11203;0x2bc3;MEKF_INVALID_INFO;INFO;No description;mission/acs/defs.h +11204;0x2bc4;MEKF_RECOVERY;INFO;No description;mission/acs/defs.h +11205;0x2bc5;MEKF_INVALID_MODE_VIOLATION;HIGH;No description;mission/acs/defs.h +11206;0x2bc6;SAFE_MODE_CONTROLLER_FAILURE;HIGH;No description;mission/acs/defs.h +11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/power/defs.h +11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/power/defs.h +11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h +11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;No description;mission/power/defs.h +11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;No description;mission/tcs/HeaterHandler.h +11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/tcs/HeaterHandler.h +11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/tcs/HeaterHandler.h +11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/tcs/HeaterHandler.h +11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/tcs/HeaterHandler.h +11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/tcs/HeaterHandler.h +11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/tcs/HeaterHandler.h +11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/tcs/HeaterHandler.h +11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h +11501;0x2ced;BURN_PHASE_DONE;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h +11502;0x2cee;MAIN_SWITCH_ON_TIMEOUT;LOW;No description;mission/SolarArrayDeploymentHandler.h +11503;0x2cef;MAIN_SWITCH_OFF_TIMEOUT;LOW;No description;mission/SolarArrayDeploymentHandler.h +11504;0x2cf0;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h +11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/PlocMpsocHandler.h +11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h +11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h +11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/PlocMpsocHandler.h +11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHandler.h +11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/PlocMpsocHandler.h +11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/acs/ImtqHandler.h +11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/acs/rwHelpers.h +11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/acs/rwHelpers.h +11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h +11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h +12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h +12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h +12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h +12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/PlocSupervisorHandler.h +12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/PlocSupervisorHandler.h +12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/PlocSupervisorHandler.h +12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/PlocSupervisorHandler.h +12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/PlocSupervisorHandler.h 12100;0x2f44;SANITIZATION_FAILED;LOW;No description;bsp_q7s/fs/SdCardManager.h 12101;0x2f45;MOUNTED_SD_CARD;INFO;No description;bsp_q7s/fs/SdCardManager.h -12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h -12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h -12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h +12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/payload/PlocMemoryDumper.h +12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/payload/PlocMemoryDumper.h +12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/payload/PlocMemoryDumper.h 12401;0x3071;INVALID_TC_FRAME;HIGH;No description;linux/ipcore/PdecHandler.h 12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/ipcore/PdecHandler.h 12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/ipcore/PdecHandler.h @@ -157,95 +156,96 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;HIGH;No description;linux/ipcore/PdecHandler.h 12410;0x307a;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/PdecHandler.h 12411;0x307b;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/PdecHandler.h -12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrComHandler.h -12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrComHandler.h -12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrComHandler.h -12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrComHandler.h -12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrComHandler.h -12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrComHandler.h -12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrComHandler.h -12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrComHandler.h -12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrComHandler.h -12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrComHandler.h -12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrComHandler.h -12511;0x30df;STR_COM_REPLY_TIMEOUT;LOW;Star tracker did not send a valid reply for a certain timeout. P1: Position of upload or download packet for which the packet wa sent. P2: Timeout;linux/devices/startracker/StrComHandler.h -12513;0x30e1;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrComHandler.h -12514;0x30e2;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrComHandler.h -12515;0x30e3;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrComHandler.h -12516;0x30e4;STR_HELPER_SENDING_PACKET_FAILED;LOW;No description;linux/devices/startracker/StrComHandler.h -12517;0x30e5;STR_HELPER_REQUESTING_MSG_FAILED;LOW;No description;linux/devices/startracker/StrComHandler.h -12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h -12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h -12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;No description;linux/devices/ploc/PlocMPSoCHelper.h -12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHelper.h -12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;No description;linux/devices/ploc/PlocMPSoCHelper.h -12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;No description;linux/devices/ploc/PlocMPSoCHelper.h -12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/devices/PayloadPcduHandler.h -12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/objects/AcsBoardAssembly.h -12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/objects/AcsBoardAssembly.h -12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/objects/AcsBoardAssembly.h -12803;0x3203;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/objects/AcsBoardAssembly.h -12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/objects/SusAssembly.h -12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/objects/SusAssembly.h -12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/objects/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/objects/SusAssembly.h +12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/acs/StrComHandler.h +12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/acs/StrComHandler.h +12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h +12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/acs/StrComHandler.h +12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/acs/StrComHandler.h +12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/acs/StrComHandler.h +12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/acs/StrComHandler.h +12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/acs/StrComHandler.h +12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/acs/StrComHandler.h +12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/acs/StrComHandler.h +12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/acs/StrComHandler.h +12511;0x30df;STR_COM_REPLY_TIMEOUT;LOW;Star tracker did not send a valid reply for a certain timeout. P1: Position of upload or download packet for which the packet wa sent. P2: Timeout;linux/acs/StrComHandler.h +12513;0x30e1;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/acs/StrComHandler.h +12514;0x30e2;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/acs/StrComHandler.h +12515;0x30e3;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/acs/StrComHandler.h +12516;0x30e4;STR_HELPER_SENDING_PACKET_FAILED;LOW;No description;linux/acs/StrComHandler.h +12517;0x30e5;STR_HELPER_REQUESTING_MSG_FAILED;LOW;No description;linux/acs/StrComHandler.h +12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/payload/PlocMpsocHelper.h +12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/payload/PlocMpsocHelper.h +12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocMpsocHelper.h +12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHelper.h +12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;No description;linux/payload/PlocMpsocHelper.h +12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;No description;linux/payload/PlocMpsocHelper.h +12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/payload/PayloadPcduHandler.h +12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/acs/AcsBoardAssembly.h +12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/AcsBoardAssembly.h +12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/AcsBoardAssembly.h +12803;0x3203;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/AcsBoardAssembly.h +12804;0x3204;DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY;MEDIUM;This is triggered when the assembly would have normally switched the board side, but the GPS device of the other side was marked faulty. P1: Current submode.;mission/system/acs/AcsBoardAssembly.h +12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/acs/SusAssembly.h +12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/SusAssembly.h +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/objects/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/devices/devicedefinitions/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/devices/devicedefinitions/GPSDefinitions.h -13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/devices/P60DockHandler.h -13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/devices/P60DockHandler.h -13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/devices/P60DockHandler.h -13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/devices/ploc/PlocSupvUartMan.h -13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/devices/ploc/PlocSupvUartMan.h -13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux/devices/ploc/PlocSupvUartMan.h -13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux/devices/ploc/PlocSupvUartMan.h -13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/devices/ploc/PlocSupvUartMan.h -13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/devices/ploc/PlocSupvUartMan.h -13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/devices/ploc/PlocSupvUartMan.h -13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/devices/ploc/PlocSupvUartMan.h -13608;0x3528;SUPV_MEM_CHECK_OK;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13609;0x3529;SUPV_MEM_CHECK_FAIL;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13616;0x3530;SUPV_SENDING_COMMAND_FAILED;LOW;No description;linux/devices/ploc/PlocSupvUartMan.h -13617;0x3531;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13618;0x3532;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13619;0x3533;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocSupvUartMan.h -13620;0x3534;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13621;0x3535;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13622;0x3536;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/devices/ploc/PlocSupvUartMan.h -13623;0x3537;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13624;0x3538;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13625;0x3539;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/devices/ploc/PlocSupvUartMan.h -13626;0x353a;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/devices/ploc/PlocSupvUartMan.h -13627;0x353b;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/devices/ploc/PlocSupvUartMan.h -13628;0x353c;SUPV_REPLY_SIZE_MISSMATCH;LOW;No description;linux/devices/ploc/PlocSupvUartMan.h -13629;0x353d;SUPV_REPLY_CRC_MISSMATCH;LOW;No description;linux/devices/ploc/PlocSupvUartMan.h -13630;0x353e;SUPV_UPDATE_PROGRESS;INFO;Will be triggered every 5 percent of the update progress. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/devices/ploc/PlocSupvUartMan.h -13631;0x353f;HDLC_FRAME_REMOVAL_ERROR;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13632;0x3540;HDLC_CRC_ERROR;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13701;0x3585;TX_ON;INFO;Transmitter is on now. P1: Submode, P2: Current default datarate.;mission/devices/devicedefinitions/SyrlinksDefinitions.h -13702;0x3586;TX_OFF;INFO;Transmitter is off now.;mission/devices/devicedefinitions/SyrlinksDefinitions.h -13800;0x35e8;MISSING_PACKET;LOW;No description;mission/devices/devicedefinitions/ScexDefinitions.h -13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/devices/devicedefinitions/ScexDefinitions.h -13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/devices/devicedefinitions/ScexDefinitions.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 +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 +13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/payload/PlocSupvUartMan.h +13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/payload/PlocSupvUartMan.h +13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux/payload/PlocSupvUartMan.h +13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux/payload/PlocSupvUartMan.h +13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/payload/PlocSupvUartMan.h +13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/payload/PlocSupvUartMan.h +13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/payload/PlocSupvUartMan.h +13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/payload/PlocSupvUartMan.h +13608;0x3528;SUPV_MEM_CHECK_OK;INFO;No description;linux/payload/PlocSupvUartMan.h +13609;0x3529;SUPV_MEM_CHECK_FAIL;INFO;No description;linux/payload/PlocSupvUartMan.h +13616;0x3530;SUPV_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocSupvUartMan.h +13617;0x3531;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13618;0x3532;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13619;0x3533;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocSupvUartMan.h +13620;0x3534;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13621;0x3535;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13622;0x3536;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/payload/PlocSupvUartMan.h +13623;0x3537;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13624;0x3538;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13625;0x3539;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/payload/PlocSupvUartMan.h +13626;0x353a;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/payload/PlocSupvUartMan.h +13627;0x353b;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/payload/PlocSupvUartMan.h +13628;0x353c;SUPV_REPLY_SIZE_MISSMATCH;LOW;No description;linux/payload/PlocSupvUartMan.h +13629;0x353d;SUPV_REPLY_CRC_MISSMATCH;LOW;No description;linux/payload/PlocSupvUartMan.h +13630;0x353e;SUPV_UPDATE_PROGRESS;INFO;Will be triggered every 5 percent of the update progress. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/payload/PlocSupvUartMan.h +13631;0x353f;HDLC_FRAME_REMOVAL_ERROR;INFO;No description;linux/payload/PlocSupvUartMan.h +13632;0x3540;HDLC_CRC_ERROR;INFO;No description;linux/payload/PlocSupvUartMan.h +13701;0x3585;TX_ON;INFO;Transmitter is on now. P1: Submode, P2: Current default datarate.;mission/com/syrlinksDefs.h +13702;0x3586;TX_OFF;INFO;Transmitter is off now.;mission/com/syrlinksDefs.h +13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h +13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h +13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h 13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h @@ -261,21 +261,25 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;bsp_q7s/core/CoreController.h 14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;bsp_q7s/core/CoreController.h 14010;0x36ba;I2C_UNAVAILABLE_REBOOT;MEDIUM;No description;bsp_q7s/core/CoreController.h -14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/ThermalController.h -14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/ThermalController.h -14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14103;0x3717;PLOC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14105;0x3719;HPA_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14106;0x371a;PLPCDU_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/objects/ComSubsystem.h -14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/objects/ComSubsystem.h +14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h +14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h +14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14105;0x3719;CAMERA_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14106;0x371a;PCDU_SYSTEM_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h +14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/com/ComSubsystem.h +14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/com/ComSubsystem.h 14300;0x37dc;POSSIBLE_FILE_CORRUPTION;LOW;P1: Result code of TM packet parser. P2: Timestamp of possibly corrupt file as a unix timestamp.;mission/persistentTmStoreDefs.h 14301;0x37dd;FILE_TOO_LARGE;LOW;File in store too large. P1: Detected file size P2: Allowed file size;mission/persistentTmStoreDefs.h 14302;0x37de;BUSY_DUMPING_EVENT;INFO;No description;mission/persistentTmStoreDefs.h -14303;0x37df;DUMP_WAS_CANCELLED;LOW;Dump was cancelled. P1: Object ID of store.;mission/persistentTmStoreDefs.h 14305;0x37e1;DUMP_OK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14306;0x37e2;DUMP_NOK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14307;0x37e3;DUMP_MISC_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14308;0x37e4;DUMP_HK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14309;0x37e5;DUMP_CFDP_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14310;0x37e6;DUMP_OK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14311;0x37e7;DUMP_NOK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h diff --git a/generators/bsp_hosted_objects.csv b/generators/bsp_hosted_objects.csv index a30fc9d8..3faac37c 100644 --- a/generators/bsp_hosted_objects.csv +++ b/generators/bsp_hosted_objects.csv @@ -30,6 +30,8 @@ 0x44120350;RW4 0x44130001;STAR_TRACKER 0x44130045;GPS_CONTROLLER +0x44130046;GPS_0_HEALTH_DEV +0x44130047;GPS_1_HEALTH_DEV 0x44140013;IMTQ_POLLING 0x44140014;IMTQ_HANDLER 0x442000A1;PCDU_HANDLER diff --git a/generators/bsp_hosted_returnvalues.csv b/generators/bsp_hosted_returnvalues.csv index 2a867f00..0b20221c 100644 --- a/generators/bsp_hosted_returnvalues.csv +++ b/generators/bsp_hosted_returnvalues.csv @@ -357,6 +357,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3a02;MQI_Full;No space left for more messages;2;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a03;MQI_NoReplyPartner;Returned if a reply method was called without partner;3;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a04;MQI_DestinationInvalid;Returned if the target destination is invalid.;4;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h +0x3b00;SPH_ConnBroken;No description;0;SEMAPHORE_IF;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x3b01;SPH_SemaphoreTimeout;No description;1;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b02;SPH_SemaphoreNotOwned;No description;2;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b03;SPH_SemaphoreInvalid;No description;3;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h @@ -372,7 +373,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3f01;DLEE_NoPacketFound;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h 0x3f02;DLEE_PossiblePacketLoss;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h -0x4100;PUS9_ConnBroken;No description;0;PUS_SERVICE_9;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -417,54 +417,86 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4807;HGIO_GpioGetValueFailed;No description;7;HAL_GPIO;fsfw/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h 0x4c00;SPPA_NoPacketFound;No description;0;SPACE_PACKET_PARSER;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h 0x4c01;SPPA_SplitPacket;No description;1;SPACE_PACKET_PARSER;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h -0x4fa0;HEATER_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa1;HEATER_InvalidRampTime;Action Message with invalid ramp time was received.;161;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa2;HEATER_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa3;HEATER_ExecutionFailed;Command execution failed;163;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa4;HEATER_CrcError;Reaction wheel reply has invalid crc;164;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa5;HEATER_ValueNotRead;No description;165;HEATER_HANDLER;mission/devices/RwHandler.h -0x50a0;SYRLINKS_CrcFailure;No description;160;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a1;SYRLINKS_UartFraminOrParityErrorAck;No description;161;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a2;SYRLINKS_BadCharacterAck;No description;162;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a3;SYRLINKS_BadParameterValueAck;No description;163;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a4;SYRLINKS_BadEndOfFrameAck;No description;164;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a5;SYRLINKS_UnknownCommandIdAck;No description;165;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a6;SYRLINKS_BadCrcAck;No description;166;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a7;SYRLINKS_ReplyWrongSize;No description;167;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a8;SYRLINKS_MissingStartFrameCharacter;No description;168;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x5100;IMTQ_InvalidCommandCode;No description;0;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5101;IMTQ_MgmMeasurementLowLevelError;No description;1;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5102;IMTQ_ActuateCmdLowLevelError;No description;2;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5103;IMTQ_ParameterMissing;No description;3;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5104;IMTQ_ParameterInvalid;No description;4;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5105;IMTQ_CcUnavailable;No description;5;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5106;IMTQ_InternalProcessingError;No description;6;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5107;IMTQ_RejectedWithoutReason;No description;7;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5108;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x51a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;167;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x52b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b7;RWHA_SpiReadTimeout;Timeout when reading reply;183;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x58a0;SUSS_ErrorUnlockMutex;No description;160;SUS_HANDLER;mission/devices/LegacySusHandler.h -0x58a1;SUSS_ErrorLockMutex;No description;161;SUS_HANDLER;mission/devices/LegacySusHandler.h -0x5d00;GOMS_PacketTooLong;No description;0;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d01;GOMS_InvalidTableId;No description;1;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d02;GOMS_InvalidAddress;No description;2;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d03;GOMS_InvalidParamSize;No description;3;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d04;GOMS_InvalidPayloadSize;No description;4;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d05;GOMS_UnknownReplyId;No description;5;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/tmtc/CcsdsIpCoreHandler.h +0x4fa1;HEATER_CommandNotSupported;No description;161;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa2;HEATER_InitFailed;No description;162;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa3;HEATER_InvalidSwitchNr;No description;163;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa4;HEATER_MainSwitchSetTimeout;No description;164;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa5;HEATER_CommandAlreadyWaiting;No description;165;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x50a0;SYRLINKS_CrcFailure;No description;160;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a1;SYRLINKS_UartFraminOrParityErrorAck;No description;161;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a2;SYRLINKS_BadCharacterAck;No description;162;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a3;SYRLINKS_BadParameterValueAck;No description;163;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a4;SYRLINKS_BadEndOfFrameAck;No description;164;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a5;SYRLINKS_UnknownCommandIdAck;No description;165;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a6;SYRLINKS_BadCrcAck;No description;166;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a7;SYRLINKS_ReplyWrongSize;No description;167;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a8;SYRLINKS_MissingStartFrameCharacter;No description;168;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x5100;IMTQ_InvalidCommandCode;No description;0;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5101;IMTQ_MgmMeasurementLowLevelError;No description;1;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5102;IMTQ_ActuateCmdLowLevelError;No description;2;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5103;IMTQ_ParameterMissing;No description;3;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5104;IMTQ_ParameterInvalid;No description;4;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5105;IMTQ_CcUnavailable;No description;5;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5106;IMTQ_InternalProcessingError;No description;6;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5107;IMTQ_RejectedWithoutReason;No description;7;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5108;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5109;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x510a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x52b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h +0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h +0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h +0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/acs/rwHelpers.h +0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/acs/rwHelpers.h +0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/acs/rwHelpers.h +0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/acs/rwHelpers.h +0x52b7;RWHA_SpiReadTimeout;Timeout when reading reply;183;RW_HANDLER;mission/acs/rwHelpers.h +0x53a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;160;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a1;STRH_PingFailed;Ping command failed;161;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a2;STRH_VersionReqFailed;Status in version reply signals error;162;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a3;STRH_InterfaceReqFailed;Status in interface reply signals error;163;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a4;STRH_PowerReqFailed;Status in power reply signals error;164;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;165;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a6;STRH_ActionFailed;Status of reply to action command signals error;166;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;167;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a8;STRH_FilenameTooLong;Name of file received with command is too long;168;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a9;STRH_InvalidProgram;Received version reply with invalid program ID;169;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53aa;STRH_ReplyError;Status field reply signals error;170;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);171;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);172;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ad;STRH_RegionMismatch;Region mismatch between send and received data;173;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ae;STRH_AddressMismatch;Address mismatch between send and received data;174;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53af;STRH_LengthMismatch;Length field mismatch between send and received data;175;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b0;STRH_FileNotExists;Specified file does not exist;176;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b1;STRH_InvalidType;Download blob pixel command has invalid type field;177;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b2;STRH_InvalidId;Received FPGA action command with invalid ID;178;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b3;STRH_ReplyTooShort;Received reply is too short;179;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b4;STRH_CrcFailure;Received reply with invalid CRC;180;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;181;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;182;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b7;STRH_StartrackerNotRunningFirmware;Star tracker must be in firmware mode to run this command;183;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b8;STRH_StartrackerNotRunningBootloader;Star tracker must be in bootloader mode to run this command;184;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x58a0;SUSS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;SUS_HANDLER;mission/acs/RwHandler.h +0x58a1;SUSS_InvalidRampTime;Action Message with invalid ramp time was received.;161;SUS_HANDLER;mission/acs/RwHandler.h +0x58a2;SUSS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;SUS_HANDLER;mission/acs/RwHandler.h +0x58a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h +0x58a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h +0x58a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h +0x5d00;GOMS_PacketTooLong;No description;0;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d01;GOMS_InvalidTableId;No description;1;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d02;GOMS_InvalidAddress;No description;2;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d03;GOMS_InvalidParamSize;No description;3;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d04;GOMS_InvalidPayloadSize;No description;4;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d05;GOMS_UnknownReplyId;No description;5;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/com/CcsdsIpCoreHandler.h +0x6201;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;ARCSEC_JSON_BASE;mission/acs/str/ArcsecJsonParamBase.h +0x6202;JSONBASE_SetNotExists;Requested set does not exist in json file;2;ARCSEC_JSON_BASE;mission/acs/str/ArcsecJsonParamBase.h +0x6203;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;ARCSEC_JSON_BASE;mission/acs/str/ArcsecJsonParamBase.h 0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NvmParameterBase.h -0x66a0;SADPL_CommandNotSupported;No description;160;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a1;SADPL_DeploymentAlreadyExecuting;No description;161;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h +0x66a0;SADPL_CommandNotSupported;No description;160;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a1;SADPL_DeploymentAlreadyExecuting;No description;161;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h 0x6900;ACSCTRL_FileDeletionFailed;No description;0;ACS_CTRL;mission/controller/AcsController.h 0x6a02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h 0x6a03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h @@ -474,11 +506,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x6a07;ACSMEKF_MekfNotFinite;No description;7;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h 0x6a08;ACSMEKF_MekfInitialized;No description;8;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h 0x6a09;ACSMEKF_MekfRunning;No description;9;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h -0x6b02;ACSSAF_SafectrlNoMagFieldForControl;No description;2;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b03;ACSSAF_SafectrlUseMekf;No description;3;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b04;ACSSAF_SafectrlUseNonmekf;No description;4;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b05;ACSSAF_SafectrlUseDamping;No description;5;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b06;ACSSAF_SafectrlNoSensorsForControl;No description;6;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h +0x6b01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h 0x6c01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h 0x6d01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h 0x7000;PTM_DumpDone;No description;0;PERSISTENT_TM_STORE;mission/tmtc/PersistentTmStore.h diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index d7a27fae..d7265738 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -86,66 +86,65 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 10802;0x2a32;SERIALIZATION_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h 10803;0x2a33;FILESTORE_ERROR;LOW;No description;fsfw/src/fsfw/cfdp/handler/defs.h 10804;0x2a34;FILENAME_TOO_LARGE_ERROR;LOW;P1: Transaction step ID, P2: 0 for source file name, 1 for dest file name;fsfw/src/fsfw/cfdp/handler/defs.h -11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;The limits for the rotation in safe mode were violated.;mission/acsDefs.h -11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;The system has recovered from a safe rate rotation violation.;mission/acsDefs.h -11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;Multiple RWs are invalid, uncommandable and therefore higher ACS modes cannot be maintained.;mission/acsDefs.h -11203;0x2bc3;MEKF_INVALID_INFO;INFO;MEKF was not able to compute a solution. P1: MEKF state on exit;mission/acsDefs.h -11204;0x2bc4;MEKF_RECOVERY;INFO;MEKF is able to compute a solution again.;mission/acsDefs.h -11205;0x2bc5;MEKF_AUTOMATIC_RESET;INFO;MEKF performed an automatic reset after detection of nonfinite values.;mission/acsDefs.h -11206;0x2bc6;MEKF_INVALID_MODE_VIOLATION;HIGH;MEKF was not able to compute a solution during any pointing ACS mode for a prolonged time.;mission/acsDefs.h -11207;0x2bc7;SAFE_MODE_CONTROLLER_FAILURE;HIGH;The ACS safe mode controller was not able to compute a solution and has failed. P1: Missing information about magnetic field, P2: Missing information about rotational rate;mission/acsDefs.h -11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h -11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/devices/devicedefinitions/powerDefinitions.h -11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h -11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;No description;mission/devices/devicedefinitions/powerDefinitions.h -11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;No description;mission/devices/HeaterHandler.h -11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/devices/HeaterHandler.h -11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/devices/HeaterHandler.h -11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/devices/HeaterHandler.h -11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/devices/HeaterHandler.h -11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/devices/HeaterHandler.h -11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/devices/HeaterHandler.h -11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/devices/HeaterHandler.h -11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/devices/SolarArrayDeploymentHandler.h -11501;0x2ced;BURN_PHASE_DONE;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/devices/SolarArrayDeploymentHandler.h -11502;0x2cee;MAIN_SWITCH_ON_TIMEOUT;LOW;No description;mission/devices/SolarArrayDeploymentHandler.h -11503;0x2cef;MAIN_SWITCH_OFF_TIMEOUT;LOW;No description;mission/devices/SolarArrayDeploymentHandler.h -11504;0x2cf0;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/devices/SolarArrayDeploymentHandler.h -11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/devices/SolarArrayDeploymentHandler.h -11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/devices/ploc/PlocMPSoCHandler.h -11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h -11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/devices/ploc/PlocMPSoCHandler.h -11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/devices/ploc/PlocMPSoCHandler.h -11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHandler.h -11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/devices/ploc/PlocMPSoCHandler.h -11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/devices/ImtqHandler.h -11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/devices/ImtqHandler.h -11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/devices/devicedefinitions/rwHelpers.h -11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/devices/devicedefinitions/rwHelpers.h -11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;linux/devices/startracker/StarTrackerHandler.h -11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;linux/devices/startracker/StarTrackerHandler.h -12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/devices/ploc/PlocSupervisorHandler.h -12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/devices/ploc/PlocSupervisorHandler.h -12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/devices/ploc/PlocSupervisorHandler.h -12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/devices/ploc/PlocSupervisorHandler.h -12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/devices/ploc/PlocSupervisorHandler.h -12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/devices/ploc/PlocSupervisorHandler.h -12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/devices/ploc/PlocSupervisorHandler.h -12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/devices/ploc/PlocSupervisorHandler.h +11200;0x2bc0;SAFE_RATE_VIOLATION;MEDIUM;No description;mission/acs/defs.h +11201;0x2bc1;SAFE_RATE_RECOVERY;MEDIUM;No description;mission/acs/defs.h +11202;0x2bc2;MULTIPLE_RW_INVALID;HIGH;No description;mission/acs/defs.h +11203;0x2bc3;MEKF_INVALID_INFO;INFO;No description;mission/acs/defs.h +11204;0x2bc4;MEKF_RECOVERY;INFO;No description;mission/acs/defs.h +11205;0x2bc5;MEKF_INVALID_MODE_VIOLATION;HIGH;No description;mission/acs/defs.h +11206;0x2bc6;SAFE_MODE_CONTROLLER_FAILURE;HIGH;No description;mission/acs/defs.h +11300;0x2c24;SWITCH_CMD_SENT;INFO;Indicates that a FSFW object requested setting a switch P1: 1 if on was requested, 0 for off | P2: Switch Index;mission/power/defs.h +11301;0x2c25;SWITCH_HAS_CHANGED;INFO;Indicated that a switch state has changed P1: New switch state, 1 for on, 0 for off | P2: Switch Index;mission/power/defs.h +11302;0x2c26;SWITCHING_Q7S_DENIED;MEDIUM;No description;mission/power/defs.h +11303;0x2c27;FDIR_REACTION_IGNORED;MEDIUM;No description;mission/power/defs.h +11400;0x2c88;GPIO_PULL_HIGH_FAILED;LOW;No description;mission/tcs/HeaterHandler.h +11401;0x2c89;GPIO_PULL_LOW_FAILED;LOW;No description;mission/tcs/HeaterHandler.h +11402;0x2c8a;HEATER_WENT_ON;INFO;No description;mission/tcs/HeaterHandler.h +11403;0x2c8b;HEATER_WENT_OFF;INFO;No description;mission/tcs/HeaterHandler.h +11404;0x2c8c;SWITCH_ALREADY_ON;LOW;No description;mission/tcs/HeaterHandler.h +11405;0x2c8d;SWITCH_ALREADY_OFF;LOW;No description;mission/tcs/HeaterHandler.h +11406;0x2c8e;MAIN_SWITCH_TIMEOUT;MEDIUM;No description;mission/tcs/HeaterHandler.h +11407;0x2c8f;FAULTY_HEATER_WAS_ON;LOW;No description;mission/tcs/HeaterHandler.h +11500;0x2cec;BURN_PHASE_START;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h +11501;0x2ced;BURN_PHASE_DONE;INFO;P1: Burn duration in milliseconds, P2: Dry run flag;mission/SolarArrayDeploymentHandler.h +11502;0x2cee;MAIN_SWITCH_ON_TIMEOUT;LOW;No description;mission/SolarArrayDeploymentHandler.h +11503;0x2cef;MAIN_SWITCH_OFF_TIMEOUT;LOW;No description;mission/SolarArrayDeploymentHandler.h +11504;0x2cf0;DEPL_SA1_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11505;0x2cf1;DEPL_SA2_GPIO_SWTICH_ON_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11506;0x2cf2;DEPL_SA1_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11507;0x2cf3;DEPL_SA2_GPIO_SWTICH_OFF_FAILED;HIGH;No description;mission/SolarArrayDeploymentHandler.h +11508;0x2cf4;AUTONOMOUS_DEPLOYMENT_COMPLETED;INFO;No description;mission/SolarArrayDeploymentHandler.h +11601;0x2d51;MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC crc failure in telemetry packet;linux/payload/PlocMpsocHandler.h +11602;0x2d52;ACK_FAILURE;LOW;PLOC receive acknowledgment failure report P1: Command Id which leads the acknowledgment failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h +11603;0x2d53;EXE_FAILURE;LOW;PLOC receive execution failure report P1: Command Id which leads the execution failure report P2: The status field inserted by the MPSoC into the data field;linux/payload/PlocMpsocHandler.h +11604;0x2d54;MPSOC_HANDLER_CRC_FAILURE;LOW;PLOC reply has invalid crc;linux/payload/PlocMpsocHandler.h +11605;0x2d55;MPSOC_HANDLER_SEQUENCE_COUNT_MISMATCH;LOW;Packet sequence count in received space packet does not match expected count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHandler.h +11606;0x2d56;MPSOC_SHUTDOWN_FAILED;HIGH;Supervisor fails to shutdown MPSoC. Requires to power off the PLOC and thus also to shutdown the supervisor.;linux/payload/PlocMpsocHandler.h +11701;0x2db5;SELF_TEST_I2C_FAILURE;LOW;Get self test result returns I2C failure P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11702;0x2db6;SELF_TEST_SPI_FAILURE;LOW;Get self test result returns SPI failure. This concerns the MTM connectivity. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11703;0x2db7;SELF_TEST_ADC_FAILURE;LOW;Get self test result returns failure in measurement of current and temperature. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11704;0x2db8;SELF_TEST_PWM_FAILURE;LOW;Get self test result returns PWM failure which concerns the coil actuation. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11705;0x2db9;SELF_TEST_TC_FAILURE;LOW;Get self test result returns TC failure (system failure) P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11706;0x2dba;SELF_TEST_MTM_RANGE_FAILURE;LOW;Get self test result returns failure that MTM values were outside of the expected range. P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11707;0x2dbb;SELF_TEST_COIL_CURRENT_FAILURE;LOW;Get self test result returns failure indicating that the coil current was outside of the expected range P1: Indicates on which axis the failure occurred. 0 -> INIT, 1 -> +X, 2 -> -X, 3 -> +Y, 4 -> -Y, 5 -> +Z, 6 -> -Z, 7 -> FINA;mission/acs/ImtqHandler.h +11708;0x2dbc;INVALID_ERROR_BYTE;LOW;Received invalid error byte. This indicates an error of the communication link between IMTQ and OBC.;mission/acs/ImtqHandler.h +11801;0x2e19;ERROR_STATE;HIGH;Reaction wheel signals an error state;mission/acs/rwHelpers.h +11802;0x2e1a;RESET_OCCURED;LOW;No description;mission/acs/rwHelpers.h +11901;0x2e7d;BOOTING_FIRMWARE_FAILED_EVENT;LOW;Failed to boot firmware;mission/acs/str/StarTrackerHandler.h +11902;0x2e7e;BOOTING_BOOTLOADER_FAILED_EVENT;LOW;Failed to boot star tracker into bootloader mode;mission/acs/str/StarTrackerHandler.h +12001;0x2ee1;SUPV_MEMORY_READ_RPT_CRC_FAILURE;LOW;PLOC supervisor crc failure in telemetry packet;linux/payload/PlocSupervisorHandler.h +12002;0x2ee2;SUPV_UNKNOWN_TM;LOW;Unhandled event. P1: APID, P2: Service ID;linux/payload/PlocSupervisorHandler.h +12003;0x2ee3;SUPV_UNINIMPLEMENTED_TM;LOW;No description;linux/payload/PlocSupervisorHandler.h +12004;0x2ee4;SUPV_ACK_FAILURE;LOW;PLOC supervisor received acknowledgment failure report;linux/payload/PlocSupervisorHandler.h +12005;0x2ee5;SUPV_EXE_FAILURE;LOW;PLOC received execution failure report P1: ID of command for which the execution failed P2: Status code sent by the supervisor handler;linux/payload/PlocSupervisorHandler.h +12006;0x2ee6;SUPV_CRC_FAILURE_EVENT;LOW;PLOC supervisor reply has invalid crc;linux/payload/PlocSupervisorHandler.h +12007;0x2ee7;SUPV_HELPER_EXECUTING;LOW;Supervisor helper currently executing a command;linux/payload/PlocSupervisorHandler.h +12008;0x2ee8;SUPV_MPSOC_SHUTDOWN_BUILD_FAILED;LOW;Failed to build the command to shutdown the MPSoC;linux/payload/PlocSupervisorHandler.h 12100;0x2f44;SANITIZATION_FAILED;LOW;No description;bsp_q7s/fs/SdCardManager.h 12101;0x2f45;MOUNTED_SD_CARD;INFO;No description;bsp_q7s/fs/SdCardManager.h -12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/devices/ploc/PlocMemoryDumper.h -12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/devices/ploc/PlocMemoryDumper.h -12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/devices/ploc/PlocMemoryDumper.h +12300;0x300c;SEND_MRAM_DUMP_FAILED;LOW;Failed to send mram dump command to supervisor handler P1: Return value of commandAction function P2: Start address of MRAM to dump with this command;linux/payload/PlocMemoryDumper.h +12301;0x300d;MRAM_DUMP_FAILED;LOW;Received completion failure report form PLOC supervisor handler P1: MRAM start address of failing dump command;linux/payload/PlocMemoryDumper.h +12302;0x300e;MRAM_DUMP_FINISHED;LOW;MRAM dump finished successfully;linux/payload/PlocMemoryDumper.h 12401;0x3071;INVALID_TC_FRAME;HIGH;No description;linux/ipcore/PdecHandler.h 12402;0x3072;INVALID_FAR;HIGH;Read invalid FAR from PDEC after startup;linux/ipcore/PdecHandler.h 12403;0x3073;CARRIER_LOCK;INFO;Carrier lock detected;linux/ipcore/PdecHandler.h @@ -157,95 +156,96 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 12409;0x3079;WRITE_SYSCALL_ERROR_PDEC;HIGH;No description;linux/ipcore/PdecHandler.h 12410;0x307a;PDEC_RESET_FAILED;HIGH;Failed to pull PDEC reset to low;linux/ipcore/PdecHandler.h 12411;0x307b;OPEN_IRQ_FILE_FAILED;HIGH;Failed to open the IRQ uio file;linux/ipcore/PdecHandler.h -12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/devices/startracker/StrComHandler.h -12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/devices/startracker/StrComHandler.h -12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/devices/startracker/StrComHandler.h -12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/devices/startracker/StrComHandler.h -12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/devices/startracker/StrComHandler.h -12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/devices/startracker/StrComHandler.h -12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/devices/startracker/StrComHandler.h -12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/devices/startracker/StrComHandler.h -12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/devices/startracker/StrComHandler.h -12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrComHandler.h -12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/devices/startracker/StrComHandler.h -12511;0x30df;STR_COM_REPLY_TIMEOUT;LOW;Star tracker did not send a valid reply for a certain timeout. P1: Position of upload or download packet for which the packet wa sent. P2: Timeout;linux/devices/startracker/StrComHandler.h -12513;0x30e1;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/devices/startracker/StrComHandler.h -12514;0x30e2;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/devices/startracker/StrComHandler.h -12515;0x30e3;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/devices/startracker/StrComHandler.h -12516;0x30e4;STR_HELPER_SENDING_PACKET_FAILED;LOW;No description;linux/devices/startracker/StrComHandler.h -12517;0x30e5;STR_HELPER_REQUESTING_MSG_FAILED;LOW;No description;linux/devices/startracker/StrComHandler.h -12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/devices/ploc/PlocMPSoCHelper.h -12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/devices/ploc/PlocMPSoCHelper.h -12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;No description;linux/devices/ploc/PlocMPSoCHelper.h -12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocMPSoCHelper.h -12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/devices/ploc/PlocMPSoCHelper.h -12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/devices/ploc/PlocMPSoCHelper.h -12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;No description;linux/devices/ploc/PlocMPSoCHelper.h -12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;No description;linux/devices/ploc/PlocMPSoCHelper.h -12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/devices/PayloadPcduHandler.h -12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/devices/PayloadPcduHandler.h -12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/objects/AcsBoardAssembly.h -12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/objects/AcsBoardAssembly.h -12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/objects/AcsBoardAssembly.h -12803;0x3203;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/objects/AcsBoardAssembly.h -12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/objects/SusAssembly.h -12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/objects/SusAssembly.h -12902;0x3266;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/objects/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/objects/SusAssembly.h +12500;0x30d4;IMAGE_UPLOAD_FAILED;LOW;Image upload failed;linux/acs/StrComHandler.h +12501;0x30d5;IMAGE_DOWNLOAD_FAILED;LOW;Image download failed;linux/acs/StrComHandler.h +12502;0x30d6;IMAGE_UPLOAD_SUCCESSFUL;LOW;Uploading image to star tracker was successfulop;linux/acs/StrComHandler.h +12503;0x30d7;IMAGE_DOWNLOAD_SUCCESSFUL;LOW;Image download was successful;linux/acs/StrComHandler.h +12504;0x30d8;FLASH_WRITE_SUCCESSFUL;LOW;Finished flash write procedure successfully;linux/acs/StrComHandler.h +12505;0x30d9;FLASH_READ_SUCCESSFUL;LOW;Finished flash read procedure successfully;linux/acs/StrComHandler.h +12506;0x30da;FLASH_READ_FAILED;LOW;Flash read procedure failed;linux/acs/StrComHandler.h +12507;0x30db;FIRMWARE_UPDATE_SUCCESSFUL;LOW;Firmware update was successful;linux/acs/StrComHandler.h +12508;0x30dc;FIRMWARE_UPDATE_FAILED;LOW;Firmware update failed;linux/acs/StrComHandler.h +12509;0x30dd;STR_HELPER_READING_REPLY_FAILED;LOW;Failed to read communication interface reply data P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/acs/StrComHandler.h +12510;0x30de;STR_HELPER_COM_ERROR;LOW;Unexpected stop of decoding sequence P1: Return code of failed communication interface read call P1: Upload/download position for which the read call failed;linux/acs/StrComHandler.h +12511;0x30df;STR_COM_REPLY_TIMEOUT;LOW;Star tracker did not send a valid reply for a certain timeout. P1: Position of upload or download packet for which the packet wa sent. P2: Timeout;linux/acs/StrComHandler.h +12513;0x30e1;STR_HELPER_DEC_ERROR;LOW;Error during decoding of received reply occurred P1: Return value of decoding function P2: Position of upload/download packet, or address of flash write/read request;linux/acs/StrComHandler.h +12514;0x30e2;POSITION_MISMATCH;LOW;Position mismatch P1: The expected position and thus the position for which the image upload/download failed;linux/acs/StrComHandler.h +12515;0x30e3;STR_HELPER_FILE_NOT_EXISTS;LOW;Specified file does not exist P1: Internal state of str helper;linux/acs/StrComHandler.h +12516;0x30e4;STR_HELPER_SENDING_PACKET_FAILED;LOW;No description;linux/acs/StrComHandler.h +12517;0x30e5;STR_HELPER_REQUESTING_MSG_FAILED;LOW;No description;linux/acs/StrComHandler.h +12600;0x3138;MPSOC_FLASH_WRITE_FAILED;LOW;Flash write fails;linux/payload/PlocMpsocHelper.h +12601;0x3139;MPSOC_FLASH_WRITE_SUCCESSFUL;LOW;Flash write successful;linux/payload/PlocMpsocHelper.h +12602;0x313a;MPSOC_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocMpsocHelper.h +12603;0x313b;MPSOC_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12604;0x313c;MPSOC_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12605;0x313d;MPSOC_MISSING_ACK;LOW;Did not receive acknowledgment report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12606;0x313e;MPSOC_MISSING_EXE;LOW;Did not receive execution report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocMpsocHelper.h +12607;0x313f;MPSOC_ACK_FAILURE_REPORT;LOW;Received acknowledgment failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12608;0x3140;MPSOC_EXE_FAILURE_REPORT;LOW;Received execution failure report P1: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12609;0x3141;MPSOC_ACK_INVALID_APID;LOW;Expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12610;0x3142;MPSOC_EXE_INVALID_APID;LOW;Expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of MPSoC;linux/payload/PlocMpsocHelper.h +12611;0x3143;MPSOC_HELPER_SEQ_CNT_MISMATCH;LOW;Received sequence count does not match expected sequence count P1: Expected sequence count P2: Received sequence count;linux/payload/PlocMpsocHelper.h +12612;0x3144;MPSOC_TM_SIZE_ERROR;LOW;No description;linux/payload/PlocMpsocHelper.h +12613;0x3145;MPSOC_TM_CRC_MISSMATCH;LOW;No description;linux/payload/PlocMpsocHelper.h +12700;0x319c;TRANSITION_BACK_TO_OFF;MEDIUM;Could not transition properly and went back to ALL OFF;mission/payload/PayloadPcduHandler.h +12701;0x319d;NEG_V_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12702;0x319e;U_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12703;0x319f;I_DRO_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12704;0x31a0;U_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12705;0x31a1;I_X8_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12706;0x31a2;U_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12707;0x31a3;I_TX_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12708;0x31a4;U_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12709;0x31a5;I_MPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12710;0x31a6;U_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12711;0x31a7;I_HPA_OUT_OF_BOUNDS;MEDIUM;P1: 0 -> too low, 1 -> too high P2: Float value;mission/payload/PayloadPcduHandler.h +12800;0x3200;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/acs/AcsBoardAssembly.h +12801;0x3201;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/AcsBoardAssembly.h +12802;0x3202;POWER_STATE_MACHINE_TIMEOUT;MEDIUM;No description;mission/system/acs/AcsBoardAssembly.h +12803;0x3203;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/AcsBoardAssembly.h +12804;0x3204;DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY;MEDIUM;This is triggered when the assembly would have normally switched the board side, but the GPS device of the other side was marked faulty. P1: Current submode.;mission/system/acs/AcsBoardAssembly.h +12900;0x3264;TRANSITION_OTHER_SIDE_FAILED;HIGH;No description;mission/system/acs/SusAssembly.h +12901;0x3265;NOT_ENOUGH_DEVICES_DUAL_MODE;HIGH;No description;mission/system/acs/SusAssembly.h +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/objects/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/devices/devicedefinitions/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/devices/devicedefinitions/GPSDefinitions.h -13200;0x3390;P60_BOOT_COUNT;INFO;P60 boot count is broadcasted once at SW startup. P1: Boot count;mission/devices/P60DockHandler.h -13201;0x3391;BATT_MODE;INFO;Battery mode is broadcasted at startup. P1: Mode;mission/devices/P60DockHandler.h -13202;0x3392;BATT_MODE_CHANGED;MEDIUM;Battery mode has changed. P1: Old mode. P2: New mode;mission/devices/P60DockHandler.h -13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/devices/ploc/PlocSupvUartMan.h -13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/devices/ploc/PlocSupvUartMan.h -13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux/devices/ploc/PlocSupvUartMan.h -13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux/devices/ploc/PlocSupvUartMan.h -13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/devices/ploc/PlocSupvUartMan.h -13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/devices/ploc/PlocSupvUartMan.h -13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/devices/ploc/PlocSupvUartMan.h -13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/devices/ploc/PlocSupvUartMan.h -13608;0x3528;SUPV_MEM_CHECK_OK;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13609;0x3529;SUPV_MEM_CHECK_FAIL;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13616;0x3530;SUPV_SENDING_COMMAND_FAILED;LOW;No description;linux/devices/ploc/PlocSupvUartMan.h -13617;0x3531;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13618;0x3532;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13619;0x3533;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/devices/ploc/PlocSupvUartMan.h -13620;0x3534;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13621;0x3535;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13622;0x3536;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/devices/ploc/PlocSupvUartMan.h -13623;0x3537;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13624;0x3538;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/devices/ploc/PlocSupvUartMan.h -13625;0x3539;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/devices/ploc/PlocSupvUartMan.h -13626;0x353a;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/devices/ploc/PlocSupvUartMan.h -13627;0x353b;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/devices/ploc/PlocSupvUartMan.h -13628;0x353c;SUPV_REPLY_SIZE_MISSMATCH;LOW;No description;linux/devices/ploc/PlocSupvUartMan.h -13629;0x353d;SUPV_REPLY_CRC_MISSMATCH;LOW;No description;linux/devices/ploc/PlocSupvUartMan.h -13630;0x353e;SUPV_UPDATE_PROGRESS;INFO;Will be triggered every 5 percent of the update progress. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/devices/ploc/PlocSupvUartMan.h -13631;0x353f;HDLC_FRAME_REMOVAL_ERROR;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13632;0x3540;HDLC_CRC_ERROR;INFO;No description;linux/devices/ploc/PlocSupvUartMan.h -13701;0x3585;TX_ON;INFO;Transmitter is on now. P1: Submode, P2: Current default datarate.;mission/devices/devicedefinitions/SyrlinksDefinitions.h -13702;0x3586;TX_OFF;INFO;Transmitter is off now.;mission/devices/devicedefinitions/SyrlinksDefinitions.h -13800;0x35e8;MISSING_PACKET;LOW;No description;mission/devices/devicedefinitions/ScexDefinitions.h -13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/devices/devicedefinitions/ScexDefinitions.h -13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/devices/devicedefinitions/ScexDefinitions.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 +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 +13600;0x3520;SUPV_UPDATE_FAILED;LOW;update failed;linux/payload/PlocSupvUartMan.h +13601;0x3521;SUPV_UPDATE_SUCCESSFUL;LOW;update successful;linux/payload/PlocSupvUartMan.h +13602;0x3522;SUPV_CONTINUE_UPDATE_FAILED;LOW;Continue update command failed;linux/payload/PlocSupvUartMan.h +13603;0x3523;SUPV_CONTINUE_UPDATE_SUCCESSFUL;LOW;Continue update command successful;linux/payload/PlocSupvUartMan.h +13604;0x3524;TERMINATED_UPDATE_PROCEDURE;LOW;Terminated update procedure by command;linux/payload/PlocSupvUartMan.h +13605;0x3525;SUPV_EVENT_BUFFER_REQUEST_SUCCESSFUL;LOW;Requesting event buffer was successful;linux/payload/PlocSupvUartMan.h +13606;0x3526;SUPV_EVENT_BUFFER_REQUEST_FAILED;LOW;Requesting event buffer failed;linux/payload/PlocSupvUartMan.h +13607;0x3527;SUPV_EVENT_BUFFER_REQUEST_TERMINATED;LOW;Terminated event buffer request by command P1: Number of packets read before process was terminated;linux/payload/PlocSupvUartMan.h +13608;0x3528;SUPV_MEM_CHECK_OK;INFO;No description;linux/payload/PlocSupvUartMan.h +13609;0x3529;SUPV_MEM_CHECK_FAIL;INFO;No description;linux/payload/PlocSupvUartMan.h +13616;0x3530;SUPV_SENDING_COMMAND_FAILED;LOW;No description;linux/payload/PlocSupvUartMan.h +13617;0x3531;SUPV_HELPER_REQUESTING_REPLY_FAILED;LOW;Request receive message of communication interface failed P1: Return value returned by the communication interface requestReceiveMessage function P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13618;0x3532;SUPV_HELPER_READING_REPLY_FAILED;LOW;Reading receive message of communication interface failed P1: Return value returned by the communication interface readingReceivedMessage function P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13619;0x3533;SUPV_MISSING_ACK;LOW;Did not receive acknowledgement report P1: Number of bytes missing P2: Internal state of MPSoC helper;linux/payload/PlocSupvUartMan.h +13620;0x3534;SUPV_MISSING_EXE;LOW;Supervisor did not receive execution report P1: Number of bytes missing P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13621;0x3535;SUPV_ACK_FAILURE_REPORT;LOW;Supervisor received acknowledgment failure report P1: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13622;0x3536;SUPV_EXE_FAILURE_REPORT;LOW;Execution report failure P1:;linux/payload/PlocSupvUartMan.h +13623;0x3537;SUPV_ACK_INVALID_APID;LOW;Supervisor expected acknowledgment report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13624;0x3538;SUPV_EXE_INVALID_APID;LOW;Supervisor helper expected execution report but received space packet with other apid P1: Apid of received space packet P2: Internal state of supervisor helper;linux/payload/PlocSupvUartMan.h +13625;0x3539;ACK_RECEPTION_FAILURE;LOW;Failed to receive acknowledgment report P1: Return value P2: Apid of command for which the reception of the acknowledgment report failed;linux/payload/PlocSupvUartMan.h +13626;0x353a;EXE_RECEPTION_FAILURE;LOW;Failed to receive execution report P1: Return value P2: Apid of command for which the reception of the execution report failed;linux/payload/PlocSupvUartMan.h +13627;0x353b;WRITE_MEMORY_FAILED;LOW;Update procedure failed when sending packet. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/payload/PlocSupvUartMan.h +13628;0x353c;SUPV_REPLY_SIZE_MISSMATCH;LOW;No description;linux/payload/PlocSupvUartMan.h +13629;0x353d;SUPV_REPLY_CRC_MISSMATCH;LOW;No description;linux/payload/PlocSupvUartMan.h +13630;0x353e;SUPV_UPDATE_PROGRESS;INFO;Will be triggered every 5 percent of the update progress. P1: First byte percent, third and fourth byte Sequence Count, P2: Bytes written;linux/payload/PlocSupvUartMan.h +13631;0x353f;HDLC_FRAME_REMOVAL_ERROR;INFO;No description;linux/payload/PlocSupvUartMan.h +13632;0x3540;HDLC_CRC_ERROR;INFO;No description;linux/payload/PlocSupvUartMan.h +13701;0x3585;TX_ON;INFO;Transmitter is on now. P1: Submode, P2: Current default datarate.;mission/com/syrlinksDefs.h +13702;0x3586;TX_OFF;INFO;Transmitter is off now.;mission/com/syrlinksDefs.h +13800;0x35e8;MISSING_PACKET;LOW;No description;mission/payload/scexHelpers.h +13801;0x35e9;EXPERIMENT_TIMEDOUT;LOW;No description;mission/payload/scexHelpers.h +13802;0x35ea;MULTI_PACKET_COMMAND_DONE;INFO;No description;mission/payload/scexHelpers.h 13901;0x364d;SET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13902;0x364e;GET_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h 13903;0x364f;INSERT_CONFIGFILEVALUE_FAILED;MEDIUM;No description;mission/utility/GlobalConfigHandler.h @@ -261,21 +261,25 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14007;0x36b7;REBOOT_COUNTER;INFO;Total reboot counter, which is the sum of the boot count of all individual images.;bsp_q7s/core/CoreController.h 14008;0x36b8;INDIVIDUAL_BOOT_COUNTS;INFO;Get the boot count of the individual images. P1: First 16 bits boot count of image 0 0, last 16 bits boot count of image 0 1. P2: First 16 bits boot count of image 1 0, last 16 bits boot count of image 1 1.;bsp_q7s/core/CoreController.h 14010;0x36ba;I2C_UNAVAILABLE_REBOOT;MEDIUM;No description;bsp_q7s/core/CoreController.h -14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/ThermalController.h -14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/ThermalController.h -14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14103;0x3717;PLOC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14105;0x3719;HPA_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14106;0x371a;PLPCDU_OVERHEATING;HIGH;No description;mission/controller/ThermalController.h -14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/objects/ComSubsystem.h -14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/objects/ComSubsystem.h +14100;0x3714;NO_VALID_SENSOR_TEMPERATURE;MEDIUM;No description;mission/controller/tcsDefs.h +14101;0x3715;NO_HEALTHY_HEATER_AVAILABLE;MEDIUM;No description;mission/controller/tcsDefs.h +14102;0x3716;SYRLINKS_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14104;0x3718;OBC_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14105;0x3719;CAMERA_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14106;0x371a;PCDU_SYSTEM_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h +14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h +14201;0x3779;TX_TIMER_EXPIRED;INFO;The transmit timer to protect the Syrlinks expired P1: The current timer value;mission/system/com/ComSubsystem.h +14202;0x377a;BIT_LOCK_TX_ON;INFO;Transmitter will be turned on due to detection of bitlock;mission/system/com/ComSubsystem.h 14300;0x37dc;POSSIBLE_FILE_CORRUPTION;LOW;P1: Result code of TM packet parser. P2: Timestamp of possibly corrupt file as a unix timestamp.;mission/persistentTmStoreDefs.h 14301;0x37dd;FILE_TOO_LARGE;LOW;File in store too large. P1: Detected file size P2: Allowed file size;mission/persistentTmStoreDefs.h 14302;0x37de;BUSY_DUMPING_EVENT;INFO;No description;mission/persistentTmStoreDefs.h -14303;0x37df;DUMP_WAS_CANCELLED;LOW;Dump was cancelled. P1: Object ID of store.;mission/persistentTmStoreDefs.h 14305;0x37e1;DUMP_OK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14306;0x37e2;DUMP_NOK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14307;0x37e3;DUMP_MISC_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14308;0x37e4;DUMP_HK_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h 14309;0x37e5;DUMP_CFDP_STORE_DONE;INFO;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14310;0x37e6;DUMP_OK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14311;0x37e7;DUMP_NOK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14312;0x37e8;DUMP_MISC_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14313;0x37e9;DUMP_HK_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h +14314;0x37ea;DUMP_CFDP_CANCELLED;LOW;P1: Number of dumped packets. P2: Total dumped bytes.;mission/persistentTmStoreDefs.h diff --git a/generators/bsp_q7s_objects.csv b/generators/bsp_q7s_objects.csv index 68be8ef2..eedafc52 100644 --- a/generators/bsp_q7s_objects.csv +++ b/generators/bsp_q7s_objects.csv @@ -29,6 +29,8 @@ 0x44120350;RW4 0x44130001;STAR_TRACKER 0x44130045;GPS_CONTROLLER +0x44130046;GPS_0_HEALTH_DEV +0x44130047;GPS_1_HEALTH_DEV 0x44140013;IMTQ_POLLING 0x44140014;IMTQ_HANDLER 0x442000A1;PCDU_HANDLER diff --git a/generators/bsp_q7s_returnvalues.csv b/generators/bsp_q7s_returnvalues.csv index a3938699..0f87fdbe 100644 --- a/generators/bsp_q7s_returnvalues.csv +++ b/generators/bsp_q7s_returnvalues.csv @@ -357,6 +357,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3a02;MQI_Full;No space left for more messages;2;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a03;MQI_NoReplyPartner;Returned if a reply method was called without partner;3;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h 0x3a04;MQI_DestinationInvalid;Returned if the target destination is invalid.;4;MESSAGE_QUEUE_IF;fsfw/src/fsfw/ipc/MessageQueueIF.h +0x3b00;SPH_ConnBroken;No description;0;SEMAPHORE_IF;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x3b01;SPH_SemaphoreTimeout;No description;1;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b02;SPH_SemaphoreNotOwned;No description;2;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h 0x3b03;SPH_SemaphoreInvalid;No description;3;SEMAPHORE_IF;fsfw/src/fsfw/tasks/SemaphoreIF.h @@ -372,7 +373,6 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x3e05;HKM_DatasetNotFound;No description;5;HOUSEKEEPING_MANAGER;fsfw/src/fsfw/datapoollocal/LocalDataPoolManager.h 0x3f01;DLEE_NoPacketFound;No description;1;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h 0x3f02;DLEE_PossiblePacketLoss;No description;2;DLE_ENCODER;fsfw/src/fsfw/globalfunctions/DleParser.h -0x4100;PUS9_ConnBroken;No description;0;PUS_SERVICE_9;fsfw/src/fsfw/osal/common/TcpTmTcServer.h 0x4201;PUS11_InvalidTypeTimeWindow;No description;1;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4202;PUS11_InvalidTimeWindow;No description;2;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h 0x4203;PUS11_TimeshiftingNotPossible;No description;3;PUS_SERVICE_11;fsfw/src/fsfw/pus/Service11TelecommandScheduling.h @@ -417,102 +417,105 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x4807;HGIO_GpioGetValueFailed;No description;7;HAL_GPIO;fsfw/src/fsfw_hal/linux/gpio/LinuxLibgpioIF.h 0x4c00;SPPA_NoPacketFound;No description;0;SPACE_PACKET_PARSER;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h 0x4c01;SPPA_SplitPacket;No description;1;SPACE_PACKET_PARSER;fsfw/src/fsfw/tmtcservices/SpacePacketParser.h -0x4fa0;HEATER_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa1;HEATER_InvalidRampTime;Action Message with invalid ramp time was received.;161;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa2;HEATER_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa3;HEATER_ExecutionFailed;Command execution failed;163;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa4;HEATER_CrcError;Reaction wheel reply has invalid crc;164;HEATER_HANDLER;mission/devices/RwHandler.h -0x4fa5;HEATER_ValueNotRead;No description;165;HEATER_HANDLER;mission/devices/RwHandler.h -0x50a0;SYRLINKS_CrcFailure;No description;160;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a1;SYRLINKS_UartFraminOrParityErrorAck;No description;161;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a2;SYRLINKS_BadCharacterAck;No description;162;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a3;SYRLINKS_BadParameterValueAck;No description;163;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a4;SYRLINKS_BadEndOfFrameAck;No description;164;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a5;SYRLINKS_UnknownCommandIdAck;No description;165;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a6;SYRLINKS_BadCrcAck;No description;166;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a7;SYRLINKS_ReplyWrongSize;No description;167;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x50a8;SYRLINKS_MissingStartFrameCharacter;No description;168;SYRLINKS_HANDLER;mission/devices/SyrlinksHandler.h -0x5100;IMTQ_InvalidCommandCode;No description;0;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5101;IMTQ_MgmMeasurementLowLevelError;No description;1;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5102;IMTQ_ActuateCmdLowLevelError;No description;2;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5103;IMTQ_ParameterMissing;No description;3;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5104;IMTQ_ParameterInvalid;No description;4;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5105;IMTQ_CcUnavailable;No description;5;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5106;IMTQ_InternalProcessingError;No description;6;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5107;IMTQ_RejectedWithoutReason;No description;7;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x5108;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x51a7;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;167;IMTQ_HANDLER;mission/devices/devicedefinitions/imtqHelpers.h -0x52b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x52b7;RWHA_SpiReadTimeout;Timeout when reading reply;183;RW_HANDLER;mission/devices/devicedefinitions/rwHelpers.h -0x53a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;160;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a1;STRH_PingFailed;Ping command failed;161;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a2;STRH_VersionReqFailed;Status in version reply signals error;162;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a3;STRH_InterfaceReqFailed;Status in interface reply signals error;163;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a4;STRH_PowerReqFailed;Status in power reply signals error;164;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;165;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a6;STRH_ActionFailed;Status of reply to action command signals error;166;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;167;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a8;STRH_FilenameTooLong;Name of file received with command is too long;168;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53a9;STRH_InvalidProgram;Received version reply with invalid program ID;169;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53aa;STRH_ReplyError;Status field reply signals error;170;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);171;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);172;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53ad;STRH_RegionMismatch;Region mismatch between send and received data;173;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53ae;STRH_AddressMismatch;Address mismatch between send and received data;174;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53af;STRH_LengthMismatch;Length field mismatch between send and received data;175;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b0;STRH_FileNotExists;Specified file does not exist;176;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b1;STRH_InvalidType;Download blob pixel command has invalid type field;177;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b2;STRH_InvalidId;Received FPGA action command with invalid ID;178;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b3;STRH_ReplyTooShort;Received reply is too short;179;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b4;STRH_CrcFailure;Received reply with invalid CRC;180;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;181;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;182;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b7;STRH_StartrackerNotRunningFirmware;Star tracker must be in firmware mode to run this command;183;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x53b8;STRH_StartrackerNotRunningBootloader;Star tracker must be in bootloader mode to run this command;184;STR_HANDLER;linux/devices/startracker/StarTrackerHandler.h -0x54e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);224;DWLPWRON_CMD;linux/devices/devicedefinitions/PlocMPSoCDefinitions.h -0x54e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);225;DWLPWRON_CMD;linux/devices/devicedefinitions/PlocMPSoCDefinitions.h -0x5700;PLSPVhLP_RequestDone;No description;0;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x5701;PLSPVhLP_NoPacketFound;No description;1;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x5702;PLSPVhLP_DecodeBufTooSmall;No description;2;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x5703;PLSPVhLP_PossiblePacketLossConsecutiveStart;No description;3;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x5704;PLSPVhLP_PossiblePacketLossConsecutiveEnd;No description;4;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x5705;PLSPVhLP_HdlcError;No description;5;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x57a0;PLSPVhLP_FileClosedAccidentally;File accidentally close;160;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x57a1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;161;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x57a2;PLSPVhLP_PathNotExists;Received command with invalid pathname;162;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x57a3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;163;PLOC_SUPV_HELPER;linux/devices/ploc/PlocSupvUartMan.h -0x58a0;SUSS_ErrorUnlockMutex;No description;160;SUS_HANDLER;mission/devices/LegacySusHandler.h -0x58a1;SUSS_ErrorLockMutex;No description;161;SUS_HANDLER;mission/devices/LegacySusHandler.h +0x4fa1;HEATER_CommandNotSupported;No description;161;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa2;HEATER_InitFailed;No description;162;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa3;HEATER_InvalidSwitchNr;No description;163;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa4;HEATER_MainSwitchSetTimeout;No description;164;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x4fa5;HEATER_CommandAlreadyWaiting;No description;165;HEATER_HANDLER;mission/tcs/HeaterHandler.h +0x50a0;SYRLINKS_CrcFailure;No description;160;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a1;SYRLINKS_UartFraminOrParityErrorAck;No description;161;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a2;SYRLINKS_BadCharacterAck;No description;162;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a3;SYRLINKS_BadParameterValueAck;No description;163;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a4;SYRLINKS_BadEndOfFrameAck;No description;164;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a5;SYRLINKS_UnknownCommandIdAck;No description;165;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a6;SYRLINKS_BadCrcAck;No description;166;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a7;SYRLINKS_ReplyWrongSize;No description;167;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x50a8;SYRLINKS_MissingStartFrameCharacter;No description;168;SYRLINKS_HANDLER;mission/com/SyrlinksHandler.h +0x5100;IMTQ_InvalidCommandCode;No description;0;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5101;IMTQ_MgmMeasurementLowLevelError;No description;1;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5102;IMTQ_ActuateCmdLowLevelError;No description;2;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5103;IMTQ_ParameterMissing;No description;3;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5104;IMTQ_ParameterInvalid;No description;4;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5105;IMTQ_CcUnavailable;No description;5;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5106;IMTQ_InternalProcessingError;No description;6;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5107;IMTQ_RejectedWithoutReason;No description;7;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5108;IMTQ_CmdErrUnknown;No description;8;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x5109;IMTQ_StartupCfgError;No description;9;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x510a;IMTQ_UnexpectedSelfTestReply;The status reply to a self test command was received but no self test command has been sent. This should normally never happen.;10;IMTQ_HANDLER;mission/acs/imtqHelpers.h +0x52b0;RWHA_SpiWriteFailure;No description;176;RW_HANDLER;mission/acs/rwHelpers.h +0x52b1;RWHA_SpiReadFailure;Used by the spi send function to tell a failing read call;177;RW_HANDLER;mission/acs/rwHelpers.h +0x52b2;RWHA_MissingStartSign;Can be used by the HDLC decoding mechanism to inform about a missing start sign 0x7E;178;RW_HANDLER;mission/acs/rwHelpers.h +0x52b3;RWHA_InvalidSubstitute;Can be used by the HDLC decoding mechanism to inform about an invalid substitution combination;179;RW_HANDLER;mission/acs/rwHelpers.h +0x52b4;RWHA_MissingEndSign;HDLC decoding mechanism never receives the end sign 0x7E;180;RW_HANDLER;mission/acs/rwHelpers.h +0x52b5;RWHA_NoReply;Reaction wheel only responds with empty frames.;181;RW_HANDLER;mission/acs/rwHelpers.h +0x52b6;RWHA_NoStartMarker;Expected a start marker as first byte;182;RW_HANDLER;mission/acs/rwHelpers.h +0x52b7;RWHA_SpiReadTimeout;Timeout when reading reply;183;RW_HANDLER;mission/acs/rwHelpers.h +0x53a0;STRH_TemperatureReqFailed;Status in temperature reply signals error;160;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a1;STRH_PingFailed;Ping command failed;161;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a2;STRH_VersionReqFailed;Status in version reply signals error;162;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a3;STRH_InterfaceReqFailed;Status in interface reply signals error;163;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a4;STRH_PowerReqFailed;Status in power reply signals error;164;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a5;STRH_SetParamFailed;Status of reply to parameter set command signals error;165;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a6;STRH_ActionFailed;Status of reply to action command signals error;166;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a7;STRH_FilePathTooLong;Received invalid path string. Exceeds allowed length;167;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a8;STRH_FilenameTooLong;Name of file received with command is too long;168;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53a9;STRH_InvalidProgram;Received version reply with invalid program ID;169;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53aa;STRH_ReplyError;Status field reply signals error;170;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ab;STRH_CommandTooShort;Received command which is too short (some data is missing for proper execution);171;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ac;STRH_InvalidLength;Received command with invalid length (too few or too many parameters);172;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ad;STRH_RegionMismatch;Region mismatch between send and received data;173;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53ae;STRH_AddressMismatch;Address mismatch between send and received data;174;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53af;STRH_LengthMismatch;Length field mismatch between send and received data;175;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b0;STRH_FileNotExists;Specified file does not exist;176;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b1;STRH_InvalidType;Download blob pixel command has invalid type field;177;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b2;STRH_InvalidId;Received FPGA action command with invalid ID;178;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b3;STRH_ReplyTooShort;Received reply is too short;179;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b4;STRH_CrcFailure;Received reply with invalid CRC;180;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b5;STRH_StrHelperExecuting;Star tracker handler currently executing a command and using the communication interface;181;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b6;STRH_StartrackerAlreadyBooted;Star tracker is already in firmware mode;182;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b7;STRH_StartrackerNotRunningFirmware;Star tracker must be in firmware mode to run this command;183;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x53b8;STRH_StartrackerNotRunningBootloader;Star tracker must be in bootloader mode to run this command;184;STR_HANDLER;mission/acs/str/StarTrackerHandler.h +0x54e0;DWLPWRON_InvalidMode;Received command has invalid JESD mode (valid modes are 0 - 5);224;DWLPWRON_CMD;linux/payload/plocMpscoDefs.h +0x54e1;DWLPWRON_InvalidLaneRate;Received command has invalid lane rate (valid lane rate are 0 - 9);225;DWLPWRON_CMD;linux/payload/plocMpscoDefs.h +0x5700;PLSPVhLP_RequestDone;No description;0;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x5701;PLSPVhLP_NoPacketFound;No description;1;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x5702;PLSPVhLP_DecodeBufTooSmall;No description;2;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x5703;PLSPVhLP_PossiblePacketLossConsecutiveStart;No description;3;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x5704;PLSPVhLP_PossiblePacketLossConsecutiveEnd;No description;4;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x5705;PLSPVhLP_HdlcError;No description;5;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x57a0;PLSPVhLP_FileClosedAccidentally;File accidentally close;160;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x57a1;PLSPVhLP_ProcessTerminated;Process has been terminated by command;161;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x57a2;PLSPVhLP_PathNotExists;Received command with invalid pathname;162;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x57a3;PLSPVhLP_EventBufferReplyInvalidApid;Expected event buffer TM but received space packet with other APID;163;PLOC_SUPV_HELPER;linux/payload/PlocSupvUartMan.h +0x58a0;SUSS_InvalidSpeed;Action Message with invalid speed was received. Valid speeds must be in the range of [-65000, 1000] or [1000, 65000];160;SUS_HANDLER;mission/acs/RwHandler.h +0x58a1;SUSS_InvalidRampTime;Action Message with invalid ramp time was received.;161;SUS_HANDLER;mission/acs/RwHandler.h +0x58a2;SUSS_SetSpeedCommandInvalidLength;Received set speed command has invalid length. Should be 6.;162;SUS_HANDLER;mission/acs/RwHandler.h +0x58a3;SUSS_ExecutionFailed;Command execution failed;163;SUS_HANDLER;mission/acs/RwHandler.h +0x58a4;SUSS_CrcError;Reaction wheel reply has invalid crc;164;SUS_HANDLER;mission/acs/RwHandler.h +0x58a5;SUSS_ValueNotRead;No description;165;SUS_HANDLER;mission/acs/RwHandler.h +0x5900;IPCI_NoReplyAvailable;No description;0;CCSDS_IP_CORE_BRIDGE;linux/acs/ImtqPollingTask.h +0x5901;IPCI_NoPacketFound;No description;1;CCSDS_IP_CORE_BRIDGE;linux/com/SyrlinksComHandler.h 0x59a0;IPCI_PapbBusy;No description;160;CCSDS_IP_CORE_BRIDGE;linux/ipcore/PapbVcInterface.h 0x5aa0;PTME_UnknownVcId;No description;160;PTME;linux/ipcore/Ptme.h -0x5c01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c02;STRHLP_FileNotExists;Specified file does not exist on filesystem;2;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c03;STRHLP_PathNotExists;Specified path does not exist;3;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c04;STRHLP_FileCreationFailed;Failed to create download image or read flash file;4;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c05;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;5;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c06;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;6;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c07;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;7;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c08;STRHLP_StatusError;Status field in reply signals error;8;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c09;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);9;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c0a;STRHLP_ReceptionTimeout;No description;10;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5c0b;STRHLP_DecodingError;No description;11;STR_HELPER;linux/devices/startracker/StrComHandler.h -0x5d00;GOMS_PacketTooLong;No description;0;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d01;GOMS_InvalidTableId;No description;1;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d02;GOMS_InvalidAddress;No description;2;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d03;GOMS_InvalidParamSize;No description;3;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d04;GOMS_InvalidPayloadSize;No description;4;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5d05;GOMS_UnknownReplyId;No description;5;GOM_SPACE_HANDLER;mission/devices/GomspaceDeviceHandler.h -0x5e00;PLMEMDUMP_NoReplyAvailable;No description;0;PLOC_MEMORY_DUMPER;linux/devices/ImtqPollingTask.h -0x5e01;PLMEMDUMP_NoPacketFound;No description;1;PLOC_MEMORY_DUMPER;linux/devices/SyrlinksComHandler.h -0x5e02;PLMEMDUMP_InvalidCrc;No description;2;PLOC_MEMORY_DUMPER;linux/devices/ScexHelper.h -0x5ea0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;160;PLOC_MEMORY_DUMPER;linux/devices/ploc/PlocMemoryDumper.h -0x5ea1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;161;PLOC_MEMORY_DUMPER;linux/devices/ploc/PlocMemoryDumper.h +0x5c01;STRHLP_SdNotMounted;SD card specified in path string not mounted;1;STR_HELPER;linux/acs/StrComHandler.h +0x5c02;STRHLP_FileNotExists;Specified file does not exist on filesystem;2;STR_HELPER;linux/acs/StrComHandler.h +0x5c03;STRHLP_PathNotExists;Specified path does not exist;3;STR_HELPER;linux/acs/StrComHandler.h +0x5c04;STRHLP_FileCreationFailed;Failed to create download image or read flash file;4;STR_HELPER;linux/acs/StrComHandler.h +0x5c05;STRHLP_RegionMismatch;Region in flash write/read reply does not match expected region;5;STR_HELPER;linux/acs/StrComHandler.h +0x5c06;STRHLP_AddressMismatch;Address in flash write/read reply does not match expected address;6;STR_HELPER;linux/acs/StrComHandler.h +0x5c07;STRHLP_LengthMismatch;Length in flash write/read reply does not match expected length;7;STR_HELPER;linux/acs/StrComHandler.h +0x5c08;STRHLP_StatusError;Status field in reply signals error;8;STR_HELPER;linux/acs/StrComHandler.h +0x5c09;STRHLP_InvalidTypeId;Reply has invalid type ID (should be of action reply type);9;STR_HELPER;linux/acs/StrComHandler.h +0x5c0a;STRHLP_ReceptionTimeout;No description;10;STR_HELPER;linux/acs/StrComHandler.h +0x5c0b;STRHLP_DecodingError;No description;11;STR_HELPER;linux/acs/StrComHandler.h +0x5d00;GOMS_PacketTooLong;No description;0;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d01;GOMS_InvalidTableId;No description;1;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d02;GOMS_InvalidAddress;No description;2;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d03;GOMS_InvalidParamSize;No description;3;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d04;GOMS_InvalidPayloadSize;No description;4;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5d05;GOMS_UnknownReplyId;No description;5;GOM_SPACE_HANDLER;mission/power/GomspaceDeviceHandler.h +0x5ea0;PLMEMDUMP_MramAddressTooHigh;The capacity of the MRAM amounts to 512 kB. Thus the maximum address must not be higher than 0x7d000.;160;PLOC_MEMORY_DUMPER;linux/payload/PlocMemoryDumper.h +0x5ea1;PLMEMDUMP_MramInvalidAddressCombination;The specified end address is lower than the start address;161;PLOC_MEMORY_DUMPER;linux/payload/PlocMemoryDumper.h 0x5fa0;PDEC_AbandonedCltuRetval;No description;160;PDEC_HANDLER;linux/ipcore/PdecHandler.h 0x5fa1;PDEC_FrameDirtyRetval;No description;161;PDEC_HANDLER;linux/ipcore/PdecHandler.h 0x5fa2;PDEC_FrameIllegalMultipleReasons;No description;162;PDEC_HANDLER;linux/ipcore/PdecHandler.h @@ -528,57 +531,58 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x5fac;PDEC_NsNotZeroRetval;No description;172;PDEC_HANDLER;linux/ipcore/PdecHandler.h 0x5fae;PDEC_InvalidBcCc;No description;174;PDEC_HANDLER;linux/ipcore/PdecHandler.h 0x5fb0;PDEC_CommandNotImplemented;Received action message with unknown action id;176;PDEC_HANDLER;linux/ipcore/PdecHandler.h -0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/tmtc/CcsdsIpCoreHandler.h +0x60a0;CCSDS_CommandNotImplemented;Received action message with unknown action id;160;CCSDS_HANDLER;mission/com/CcsdsIpCoreHandler.h 0x61a0;RS_RateNotSupported;The commanded rate is not supported by the current FPGA design;160;RATE_SETTER;linux/ipcore/PtmeConfig.h 0x61a1;RS_BadBitRate;Bad bitrate has been commanded (e.g. 0);161;RATE_SETTER;linux/ipcore/PtmeConfig.h 0x61a2;RS_ClkInversionFailed;Failed to invert clock and thus change the time the data is updated with respect to the tx clock;162;RATE_SETTER;linux/ipcore/PtmeConfig.h 0x61a3;RS_TxManipulatorConfigFailed;Failed to change configuration bit of tx clock manipulator;163;RATE_SETTER;linux/ipcore/PtmeConfig.h -0x6201;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;ARCSEC_JSON_BASE;linux/devices/startracker/ArcsecJsonParamBase.h -0x6202;JSONBASE_SetNotExists;Requested set does not exist in json file;2;ARCSEC_JSON_BASE;linux/devices/startracker/ArcsecJsonParamBase.h -0x6203;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;ARCSEC_JSON_BASE;linux/devices/startracker/ArcsecJsonParamBase.h +0x6201;JSONBASE_JsonFileNotExists;Specified json file does not exist;1;ARCSEC_JSON_BASE;mission/acs/str/ArcsecJsonParamBase.h +0x6202;JSONBASE_SetNotExists;Requested set does not exist in json file;2;ARCSEC_JSON_BASE;mission/acs/str/ArcsecJsonParamBase.h +0x6203;JSONBASE_ParamNotExists;Requested parameter does not exist in json file;3;ARCSEC_JSON_BASE;mission/acs/str/ArcsecJsonParamBase.h 0x63a0;NVMB_KeyNotExists;Specified key does not exist in json file;160;NVM_PARAM_BASE;mission/memory/NvmParameterBase.h 0x64a0;FSHLP_SdNotMounted;SD card specified with path string not mounted;160;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h 0x64a1;FSHLP_FileNotExists;Specified file does not exist on filesystem;161;FILE_SYSTEM_HELPER;bsp_q7s/fs/FilesystemHelper.h -0x65a0;PLMPHLP_FileClosedAccidentally;File accidentally close;160;PLOC_MPSOC_HELPER;linux/devices/ploc/PlocMPSoCHelper.h -0x66a0;SADPL_CommandNotSupported;No description;160;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a1;SADPL_DeploymentAlreadyExecuting;No description;161;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x66a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/devices/SolarArrayDeploymentHandler.h -0x67a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;160;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;161;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;162;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;163;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;164;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;165;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;166;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);167;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;168;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x67a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;169;MPSOC_RETURN_VALUES_IF;linux/devices/devicedefinitions/MPSoCReturnValuesIF.h -0x68a0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;160;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a1;SPVRTVIF_InvalidServiceId;No description;161;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a2;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;162;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a3;SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;163;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a4;SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;164;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a5;SPVRTVIF_GetTimeFailure;Failed to read current system time;165;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a6;SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;166;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a7;SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;167;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a8;SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;168;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68a9;SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;169;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68aa;SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;170;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68ab;SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;171;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68ac;SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);172;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68ad;SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;173;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68ae;SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;174;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68af;SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;175;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68b0;SPVRTVIF_InvalidReplyLength;No description;176;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68b1;SPVRTVIF_InvalidLength;Received action command has invalid length;177;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68b2;SPVRTVIF_FilenameTooLong;Filename too long;178;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68b3;SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;179;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68b4;SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;180;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h -0x68c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/devices/devicedefinitions/PlocSupervisorDefinitions.h +0x6502;PLMPHLP_InvalidCrc;No description;2;PLOC_MPSOC_HELPER;linux/payload/ScexHelper.h +0x65a0;PLMPHLP_FileClosedAccidentally;File accidentally close;160;PLOC_MPSOC_HELPER;linux/payload/PlocMpsocHelper.h +0x66a0;SADPL_CommandNotSupported;No description;160;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a1;SADPL_DeploymentAlreadyExecuting;No description;161;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a2;SADPL_MainSwitchTimeoutFailure;No description;162;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a3;SADPL_SwitchingDeplSa1Failed;No description;163;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x66a4;SADPL_SwitchingDeplSa2Failed;No description;164;SA_DEPL_HANDLER;mission/SolarArrayDeploymentHandler.h +0x67a0;MPSOCRTVIF_CrcFailure;Space Packet received from PLOC has invalid CRC;160;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a1;MPSOCRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC;161;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a2;MPSOCRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC;162;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a3;MPSOCRTVIF_InvalidApid;Received space packet with invalid APID from PLOC;163;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a4;MPSOCRTVIF_InvalidLength;Received command with invalid length;164;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a5;MPSOCRTVIF_FilenameTooLong;Filename of file in OBC filesystem is too long;165;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a6;MPSOCRTVIF_MpsocHelperExecuting;MPSoC helper is currently executing a command;166;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a7;MPSOCRTVIF_MpsocFilenameTooLong;Filename of MPSoC file is to long (max. 256 bytes);167;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a8;MPSOCRTVIF_InvalidParameter;Command has invalid parameter;168;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x67a9;MPSOCRTVIF_NameTooLong;Received command has file string with invalid length;169;MPSOC_RETURN_VALUES_IF;linux/payload/mpsocRetvals.h +0x68a0;SPVRTVIF_CrcFailure;Space Packet received from PLOC supervisor has invalid CRC;160;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a1;SPVRTVIF_InvalidServiceId;No description;161;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a2;SPVRTVIF_ReceivedAckFailure;Received ACK failure reply from PLOC supervisor;162;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a3;SPVRTVIF_ReceivedExeFailure;Received execution failure reply from PLOC supervisor;163;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a4;SPVRTVIF_InvalidApid;Received space packet with invalid APID from PLOC supervisor;164;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a5;SPVRTVIF_GetTimeFailure;Failed to read current system time;165;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a6;SPVRTVIF_InvalidWatchdog;Received command with invalid watchdog parameter. Valid watchdogs are 0 for PS, 1 for PL and 2 for INT;166;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a7;SPVRTVIF_InvalidWatchdogTimeout;Received watchdog timeout config command with invalid timeout. Valid timeouts must be in the range between 1000 and 360000 ms.;167;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a8;SPVRTVIF_InvalidLatchupId;Received latchup config command with invalid latchup ID;168;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68a9;SPVRTVIF_SweepPeriodTooSmall;Received set adc sweep period command with invalid sweep period. Must be larger than 21.;169;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68aa;SPVRTVIF_InvalidTestParam;Receive auto EM test command with invalid test param. Valid params are 1 and 2.;170;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68ab;SPVRTVIF_MramPacketParsingFailure;Returned when scanning for MRAM dump packets failed.;171;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68ac;SPVRTVIF_InvalidMramAddresses;Returned when the start and stop addresses of the MRAM dump or MRAM wipe commands are invalid (e.g. start address bigger than stop address);172;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68ad;SPVRTVIF_NoMramPacket;Expect reception of an MRAM dump packet but received space packet with other apid.;173;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68ae;SPVRTVIF_PathDoesNotExist;Path to PLOC directory on SD card does not exist;174;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68af;SPVRTVIF_MramFileNotExists;MRAM dump file does not exists. The file should actually already have been created with the reception of the first dump packet.;175;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68b0;SPVRTVIF_InvalidReplyLength;No description;176;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68b1;SPVRTVIF_InvalidLength;Received action command has invalid length;177;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68b2;SPVRTVIF_FilenameTooLong;Filename too long;178;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68b3;SPVRTVIF_UpdateStatusReportInvalidLength;Received update status report with invalid packet length field;179;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68b4;SPVRTVIF_UpdateCrcFailure;Update status report does not contain expected CRC. There might be a bit flip in the update memory region.;180;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68b5;SPVRTVIF_SupvHelperExecuting;Supervisor helper task ist currently executing a command (wait until helper tas has finished or interrupt by sending the terminate command);181;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68c0;SPVRTVIF_BufTooSmall;No description;192;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h +0x68c1;SPVRTVIF_NoReplyTimeout;No description;193;SUPV_RETURN_VALUES_IF;linux/payload/plocSupvDefs.h 0x6900;ACSCTRL_FileDeletionFailed;No description;0;ACS_CTRL;mission/controller/AcsController.h 0x6a02;ACSMEKF_MekfUninitialized;No description;2;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h 0x6a03;ACSMEKF_MekfNoGyrData;No description;3;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h @@ -588,11 +592,7 @@ Full ID (hex); Name; Description; Unique ID; Subsytem Name; File Path 0x6a07;ACSMEKF_MekfNotFinite;No description;7;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h 0x6a08;ACSMEKF_MekfInitialized;No description;8;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h 0x6a09;ACSMEKF_MekfRunning;No description;9;ACS_MEKF;mission/controller/acs/MultiplicativeKalmanFilter.h -0x6b02;ACSSAF_SafectrlNoMagFieldForControl;No description;2;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b03;ACSSAF_SafectrlUseMekf;No description;3;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b04;ACSSAF_SafectrlUseNonmekf;No description;4;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b05;ACSSAF_SafectrlUseDamping;No description;5;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h -0x6b06;ACSSAF_SafectrlNoSensorsForControl;No description;6;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h +0x6b01;ACSSAF_SafectrlMekfInputInvalid;No description;1;ACS_SAFE;mission/controller/acs/control/SafeCtrl.h 0x6c01;ACSPTG_PtgctrlMekfInputInvalid;No description;1;ACS_PTG;mission/controller/acs/control/PtgCtrl.h 0x6d01;ACSDTB_DetumbleNoSensordata;No description;1;ACS_DETUMBLE;mission/controller/acs/control/Detumble.h 0x6e00;SDMA_OpOngoing;No description;0;SD_CARD_MANAGER;bsp_q7s/fs/SdCardManager.h diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index ce30734a..25c6c39d 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 280 translations. + * @brief Auto-generated event translation file. Contains 284 translations. * @details - * Generated on: 2023-03-24 15:19:38 + * Generated on: 2023-04-04 13:59:07 */ #include "translateEvents.h" @@ -97,7 +97,6 @@ const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY"; const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID"; const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO"; const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY"; -const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET"; const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION"; const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE"; const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT"; @@ -210,6 +209,11 @@ const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED" const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE"; const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT"; const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED"; +const char *DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING = "DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY"; +const char *TRANSITION_OTHER_SIDE_FAILED_12900_STRING = "TRANSITION_OTHER_SIDE_FAILED_12900"; +const char *NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE_12901"; +const char *POWER_STATE_MACHINE_TIMEOUT_12902_STRING = "POWER_STATE_MACHINE_TIMEOUT_12902"; +const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903"; 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"; @@ -266,21 +270,25 @@ const char *I2C_UNAVAILABLE_REBOOT_STRING = "I2C_UNAVAILABLE_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING"; -const char *PLOC_OVERHEATING_STRING = "PLOC_OVERHEATING"; const char *OBC_OVERHEATING_STRING = "OBC_OVERHEATING"; -const char *HPA_OVERHEATING_STRING = "HPA_OVERHEATING"; -const char *PLPCDU_OVERHEATING_STRING = "PLPCDU_OVERHEATING"; +const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING"; +const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_OVERHEATING"; +const char *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE"; const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED"; const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON"; const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION"; const char *FILE_TOO_LARGE_STRING = "FILE_TOO_LARGE"; const char *BUSY_DUMPING_EVENT_STRING = "BUSY_DUMPING_EVENT"; -const char *DUMP_WAS_CANCELLED_STRING = "DUMP_WAS_CANCELLED"; const char *DUMP_OK_STORE_DONE_STRING = "DUMP_OK_STORE_DONE"; const char *DUMP_NOK_STORE_DONE_STRING = "DUMP_NOK_STORE_DONE"; const char *DUMP_MISC_STORE_DONE_STRING = "DUMP_MISC_STORE_DONE"; const char *DUMP_HK_STORE_DONE_STRING = "DUMP_HK_STORE_DONE"; const char *DUMP_CFDP_STORE_DONE_STRING = "DUMP_CFDP_STORE_DONE"; +const char *DUMP_OK_CANCELLED_STRING = "DUMP_OK_CANCELLED"; +const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED"; +const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED"; +const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED"; +const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -469,10 +477,8 @@ const char *translateEvents(Event event) { case (11204): return MEKF_RECOVERY_STRING; case (11205): - return MEKF_AUTOMATIC_RESET_STRING; - case (11206): return MEKF_INVALID_MODE_VIOLATION_STRING; - case (11207): + case (11206): return SAFE_MODE_CONTROLLER_FAILURE_STRING; case (11300): return SWITCH_CMD_SENT_STRING; @@ -694,6 +700,16 @@ const char *translateEvents(Event event) { return POWER_STATE_MACHINE_TIMEOUT_STRING; case (12803): return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING; + case (12804): + return DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING; + case (12900): + return TRANSITION_OTHER_SIDE_FAILED_12900_STRING; + case (12901): + return NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING; + case (12902): + return POWER_STATE_MACHINE_TIMEOUT_12902_STRING; + case (12903): + return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING; case (13000): return CHILDREN_LOST_MODE_STRING; case (13100): @@ -806,14 +822,14 @@ const char *translateEvents(Event event) { return NO_HEALTHY_HEATER_AVAILABLE_STRING; case (14102): return SYRLINKS_OVERHEATING_STRING; - case (14103): - return PLOC_OVERHEATING_STRING; case (14104): return OBC_OVERHEATING_STRING; case (14105): - return HPA_OVERHEATING_STRING; + return CAMERA_OVERHEATING_STRING; case (14106): - return PLPCDU_OVERHEATING_STRING; + return PCDU_SYSTEM_OVERHEATING_STRING; + case (14107): + return HEATER_NOT_OFF_FOR_OFF_MODE_STRING; case (14201): return TX_TIMER_EXPIRED_STRING; case (14202): @@ -824,8 +840,6 @@ const char *translateEvents(Event event) { return FILE_TOO_LARGE_STRING; case (14302): return BUSY_DUMPING_EVENT_STRING; - case (14303): - return DUMP_WAS_CANCELLED_STRING; case (14305): return DUMP_OK_STORE_DONE_STRING; case (14306): @@ -836,6 +850,16 @@ const char *translateEvents(Event event) { return DUMP_HK_STORE_DONE_STRING; case (14309): return DUMP_CFDP_STORE_DONE_STRING; + case (14310): + return DUMP_OK_CANCELLED_STRING; + case (14311): + return DUMP_NOK_CANCELLED_STRING; + case (14312): + return DUMP_MISC_CANCELLED_STRING; + case (14313): + return DUMP_HK_CANCELLED_STRING; + case (14314): + return DUMP_CFDP_CANCELLED_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index 7cb9ef33..c579b741 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 173 translations. - * Generated on: 2023-03-24 15:19:38 + * Contains 175 translations. + * Generated on: 2023-04-04 13:59:07 */ #include "translateObjects.h" @@ -37,6 +37,8 @@ const char *GYRO_3_L3G_HANDLER_STRING = "GYRO_3_L3G_HANDLER"; const char *RW4_STRING = "RW4"; const char *STAR_TRACKER_STRING = "STAR_TRACKER"; const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER"; +const char *GPS_0_HEALTH_DEV_STRING = "GPS_0_HEALTH_DEV"; +const char *GPS_1_HEALTH_DEV_STRING = "GPS_1_HEALTH_DEV"; const char *IMTQ_POLLING_STRING = "IMTQ_POLLING"; const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER"; const char *PCDU_HANDLER_STRING = "PCDU_HANDLER"; @@ -244,6 +246,10 @@ const char *translateObject(object_id_t object) { return STAR_TRACKER_STRING; case 0x44130045: return GPS_CONTROLLER_STRING; + case 0x44130046: + return GPS_0_HEALTH_DEV_STRING; + case 0x44130047: + return GPS_1_HEALTH_DEV_STRING; case 0x44140013: return IMTQ_POLLING_STRING; case 0x44140014: diff --git a/generators/requirements.txt b/generators/requirements.txt index 28bbc320..c4afd24b 100644 --- a/generators/requirements.txt +++ b/generators/requirements.txt @@ -1,2 +1,2 @@ colorlog==6.7.0 -git+https://egit.irs.uni-stuttgart.de/fsfw/fsfwgen@v0.3.1#egg=fsfwgen +git+https://egit.irs.uni-stuttgart.de/fsfw/fsfwgen@v0.3.2#egg=fsfwgen diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index b500c823..7a627d18 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -1,8 +1,11 @@ add_subdirectory(utility) add_subdirectory(callbacks) add_subdirectory(boardtest) -add_subdirectory(devices) add_subdirectory(ipcore) +add_subdirectory(com) +add_subdirectory(acs) +add_subdirectory(tcs) +add_subdirectory(payload) if(EIVE_ADD_LINUX_FSFWCONFIG) add_subdirectory(fsfwconfig) @@ -10,7 +13,7 @@ endif() # Dependency on proprietary library if(TGT_BSP MATCHES "arm/q7s") - add_subdirectory(csp) + add_subdirectory(power) endif() target_sources(${OBSW_NAME} PUBLIC ObjectFactory.cpp scheduling.cpp) diff --git a/linux/ObjectFactory.cpp b/linux/ObjectFactory.cpp index 2a788898..66a3195b 100644 --- a/linux/ObjectFactory.cpp +++ b/linux/ObjectFactory.cpp @@ -8,26 +8,25 @@ #include #include #include +#include #include -#include -#include +#include +#include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include #include +#include #include "OBSWConfig.h" #include "devConf.h" #include "devices/addresses.h" #include "devices/gpioIds.h" #include "eive/definitions.h" -#include "mission/system/tree/acsModeTree.h" +#include "mission/system/acs/acsModeTree.h" #include "mission/system/tree/payloadModeTree.h" #include "mission/system/tree/tcsModeTree.h" @@ -328,8 +327,8 @@ void ObjectFactory::createScexComponents(std::string uartDev, PowerSwitchIF* pwr scexHandler->connectModeTreeParent(satsystem::payload::SUBSYSTEM); } -AcsController* ObjectFactory::createAcsController(bool connectSubsystem) { - auto acsCtrl = new AcsController(objects::ACS_CONTROLLER); +AcsController* ObjectFactory::createAcsController(bool connectSubsystem, bool enableHkSets) { + auto acsCtrl = new AcsController(objects::ACS_CONTROLLER, enableHkSets); if (connectSubsystem) { acsCtrl->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM); } diff --git a/linux/ObjectFactory.h b/linux/ObjectFactory.h index 056dbd65..16801ba9 100644 --- a/linux/ObjectFactory.h +++ b/linux/ObjectFactory.h @@ -3,16 +3,15 @@ #include #include #include +#include #include -#include +#include #include #include #include #include -#include "mission/devices/HeaterHandler.h" - class GpioIF; class SpiComIF; class PowerSwitchIF; @@ -31,6 +30,6 @@ void createScexComponents(std::string uartDev, PowerSwitchIF* pwrSwitcher, void gpioChecker(ReturnValue_t result, std::string output); -AcsController* createAcsController(bool connectSubsystem); +AcsController* createAcsController(bool connectSubsystem, bool enableHkSets); } // namespace ObjectFactory diff --git a/linux/devices/AcsBoardPolling.cpp b/linux/acs/AcsBoardPolling.cpp similarity index 99% rename from linux/devices/AcsBoardPolling.cpp rename to linux/acs/AcsBoardPolling.cpp index 04fe92df..1013f24b 100644 --- a/linux/devices/AcsBoardPolling.cpp +++ b/linux/acs/AcsBoardPolling.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include "devices/gpioIds.h" diff --git a/linux/devices/AcsBoardPolling.h b/linux/acs/AcsBoardPolling.h similarity index 96% rename from linux/devices/AcsBoardPolling.h rename to linux/acs/AcsBoardPolling.h index 73195527..794c9c47 100644 --- a/linux/devices/AcsBoardPolling.h +++ b/linux/acs/AcsBoardPolling.h @@ -7,8 +7,8 @@ #include #include #include -#include -#include +#include +#include class AcsBoardPolling : public SystemObject, public ExecutableObjectIF, diff --git a/linux/acs/CMakeLists.txt b/linux/acs/CMakeLists.txt new file mode 100644 index 00000000..99cacbc2 --- /dev/null +++ b/linux/acs/CMakeLists.txt @@ -0,0 +1,7 @@ +target_sources( + ${OBSW_NAME} PUBLIC AcsBoardPolling.cpp ImtqPollingTask.cpp RwPollingTask.cpp + SusPolling.cpp StrComHandler.cpp) + +if(EIVE_BUILD_GPSD_GPS_HANDLER) + target_sources(${OBSW_NAME} PRIVATE GpsHyperionLinuxController.cpp) +endif() diff --git a/linux/devices/GpsHyperionLinuxController.cpp b/linux/acs/GpsHyperionLinuxController.cpp similarity index 98% rename from linux/devices/GpsHyperionLinuxController.cpp rename to linux/acs/GpsHyperionLinuxController.cpp index 0b971f49..900de0aa 100644 --- a/linux/devices/GpsHyperionLinuxController.cpp +++ b/linux/acs/GpsHyperionLinuxController.cpp @@ -18,8 +18,11 @@ #include GpsHyperionLinuxController::GpsHyperionLinuxController(object_id_t objectId, object_id_t parentId, - bool debugHyperionGps) - : ExtendedControllerBase(objectId), gpsSet(this), debugHyperionGps(debugHyperionGps) {} + bool enableHkSets, bool debugHyperionGps) + : ExtendedControllerBase(objectId), + gpsSet(this), + enableHkSets(enableHkSets), + debugHyperionGps(debugHyperionGps) {} GpsHyperionLinuxController::~GpsHyperionLinuxController() { gps_stream(&gps, WATCH_DISABLE, nullptr); @@ -86,7 +89,7 @@ ReturnValue_t GpsHyperionLinuxController::initializeLocalDataPool( localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry()); localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry()); localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry()); - poolManager.subscribeForRegularPeriodicPacket({gpsSet.getSid(), false, 30.0}); + poolManager.subscribeForRegularPeriodicPacket({gpsSet.getSid(), enableHkSets, 30.0}); return returnvalue::OK; } @@ -99,6 +102,7 @@ void GpsHyperionLinuxController::setResetPinTriggerFunction(gpioResetFunction_t ReturnValue_t GpsHyperionLinuxController::performOperation(uint8_t opCode) { handleQueue(); poolManager.performHkOperation(); + while (true) { #if OBSW_THREAD_TRACING == 1 trace::threadTrace(opCounter, "GPS CTRL"); diff --git a/linux/devices/GpsHyperionLinuxController.h b/linux/acs/GpsHyperionLinuxController.h similarity index 95% rename from linux/devices/GpsHyperionLinuxController.h rename to linux/acs/GpsHyperionLinuxController.h index f00724bd..d5b1f637 100644 --- a/linux/devices/GpsHyperionLinuxController.h +++ b/linux/acs/GpsHyperionLinuxController.h @@ -1,12 +1,13 @@ #ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_ #define MISSION_DEVICES_GPSHYPERIONHANDLER_H_ +#include +#include + #include "eive/eventSubsystemIds.h" #include "fsfw/FSFW.h" #include "fsfw/controller/ExtendedControllerBase.h" #include "fsfw/devicehandlers/DeviceHandlerBase.h" -#include "mission/devices/devicedefinitions/GPSDefinitions.h" -#include "mission/trace.h" #ifdef FSFW_OSAL_LINUX #include @@ -28,7 +29,7 @@ class GpsHyperionLinuxController : public ExtendedControllerBase { enum ReadModes { SHM = 0, SOCKET = 1 }; - GpsHyperionLinuxController(object_id_t objectId, object_id_t parentId, + GpsHyperionLinuxController(object_id_t objectId, object_id_t parentId, bool enableHkSets, bool debugHyperionGps = false); virtual ~GpsHyperionLinuxController(); @@ -57,6 +58,7 @@ class GpsHyperionLinuxController : public ExtendedControllerBase { private: GpsPrimaryDataset gpsSet; gps_data_t gps = {}; + bool enableHkSets = false; const char* currentClientBuf = nullptr; ReadModes readMode = ReadModes::SOCKET; Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000); diff --git a/linux/devices/ImtqPollingTask.cpp b/linux/acs/ImtqPollingTask.cpp similarity index 86% rename from linux/devices/ImtqPollingTask.cpp rename to linux/acs/ImtqPollingTask.cpp index ca7c75ff..efa65735 100644 --- a/linux/devices/ImtqPollingTask.cpp +++ b/linux/acs/ImtqPollingTask.cpp @@ -27,7 +27,7 @@ ReturnValue_t ImtqPollingTask::performOperation(uint8_t operationCode) { comStatus = returnvalue::OK; // Stopwatch watch; - switch (currentRequest) { + switch (currentRequest.requestType) { case imtq::RequestType::MEASURE_NO_ACTUATION: { // Measured to take 24 ms for debug and release builds. // Stopwatch watch; @@ -51,6 +51,30 @@ void ImtqPollingTask::handleMeasureStep() { uint8_t* replyPtr; ImtqRepliesDefault replies(replyBuf.data()); // If some startup handling is added later, set configured after it was done once. + if (performStartup) { + // Set integration time for the MGM. + cmdBuf[0] = imtq::CC::SET_PARAM; + size_t dummy = 0; + SerializeAdapter::serialize(&imtq::param::INTEGRATION_TIME_SELECT, cmdBuf.data() + 1, &dummy, + cmdBuf.size(), SerializeIF::Endianness::LITTLE); + cmdBuf[3] = currentRequest.integrationTimeSel; + cmdLen = 4; + ReturnValue_t result = performI2cFullRequest(replyBuf.data(), 5); + if (result != returnvalue::OK) { + comStatus = imtq::STARTUP_CFG_ERROR; + } + if (replyBuf[0] != imtq::CC::SET_PARAM) { + sif::error << "ImtqPollingTask: First byte of reply not equal to sent CC" << std::endl; + comStatus = imtq::STARTUP_CFG_ERROR; + } + if (replyBuf[4] != currentRequest.integrationTimeSel) { + sif::error << "ImtqPollingTask: Integration time configuration failed" << std::endl; + comStatus = imtq::STARTUP_CFG_ERROR; + } + currentIntegrationTimeMs = + imtq::integrationTimeFromSelectValue(currentRequest.integrationTimeSel); + performStartup = false; + } replies.setConfigured(); // Can be used later to verify correct timing (e.g. all data has been read) @@ -73,7 +97,7 @@ void ImtqPollingTask::handleMeasureStep() { return; } - if (specialRequest != imtq::SpecialRequest::NONE) { + if (currentRequest.specialRequest != imtq::SpecialRequest::NONE) { auto executeSelfTest = [&](imtq::selfTest::Axis axis) { cmdBuf[0] = imtq::CC::SELF_TEST_CMD; cmdBuf[1] = axis; @@ -81,7 +105,7 @@ void ImtqPollingTask::handleMeasureStep() { }; // If a self-test is already ongoing, ignore the request. if (replies.getSystemState()[2] != static_cast(imtq::mode::SELF_TEST)) { - switch (specialRequest) { + switch (currentRequest.specialRequest) { case (imtq::SpecialRequest::DO_SELF_TEST_POS_X): { executeSelfTest(imtq::selfTest::Axis::X_POSITIVE); break; @@ -234,18 +258,21 @@ ReturnValue_t ImtqPollingTask::initializeInterface(CookieIF* cookie) { ReturnValue_t ImtqPollingTask::sendMessage(CookieIF* cookie, const uint8_t* sendData, size_t sendLen) { const auto* imtqReq = reinterpret_cast(sendData); + if (sendLen != sizeof(imtq::Request)) { + return returnvalue::FAILED; + } { MutexGuard mg(ipcLock); - if (imtqReq->request == imtq::RequestType::ACTUATE) { - std::memcpy(dipoles, imtqReq->dipoles, sizeof(dipoles)); - torqueDuration = imtqReq->torqueDuration; - } - currentRequest = imtqReq->request; - specialRequest = imtqReq->specialRequest; if (state != InternalState::IDLE) { return returnvalue::FAILED; } state = InternalState::IS_BUSY; + if (currentRequest.mode != imtqReq->mode) { + if (imtqReq->mode == acs::SimpleSensorMode::NORMAL) { + performStartup = true; + } + } + std::memcpy(¤tRequest, imtqReq, sendLen); } semaphore->release(); @@ -345,10 +372,10 @@ void ImtqPollingTask::buildDipoleCommand() { uint8_t* serPtr = cmdBuf.data() + 1; size_t serLen = 0; for (uint8_t idx = 0; idx < 3; idx++) { - SerializeAdapter::serialize(&dipoles[idx], &serPtr, &serLen, cmdBuf.size(), + SerializeAdapter::serialize(¤tRequest.dipoles[idx], &serPtr, &serLen, cmdBuf.size(), SerializeIF::Endianness::LITTLE); } - SerializeAdapter::serialize(&torqueDuration, &serPtr, &serLen, cmdBuf.size(), + SerializeAdapter::serialize(¤tRequest.torqueDuration, &serPtr, &serLen, cmdBuf.size(), SerializeIF::Endianness::LITTLE); // sif::debug << "Dipole X: " << dipoles[0] << std::endl; // sif::debug << "Torqeu Dur: " << torqueDuration << std::endl; @@ -357,22 +384,28 @@ void ImtqPollingTask::buildDipoleCommand() { ReturnValue_t ImtqPollingTask::readReceivedMessage(CookieIF* cookie, uint8_t** buffer, size_t* size) { - imtq::RequestType currentRequest; + imtq::Request currentRequest; { MutexGuard mg(ipcLock); - currentRequest = this->currentRequest; + std::memcpy(¤tRequest, &this->currentRequest, sizeof(currentRequest)); } size_t replyLen = 0; - MutexGuard mg(bufLock); - if (currentRequest == imtq::RequestType::MEASURE_NO_ACTUATION) { - replyLen = getExchangeBufLen(specialRequest); - memcpy(exchangeBuf.data(), replyBuf.data(), replyLen); - } else if (currentRequest == imtq::RequestType::ACTUATE) { - replyLen = ImtqRepliesWithTorque::BASE_LEN; - memcpy(exchangeBuf.data(), replyBufActuation.data(), replyLen); - } else { - *size = 0; + { + MutexGuard mg(bufLock); + if (currentRequest.requestType == imtq::RequestType::MEASURE_NO_ACTUATION) { + replyLen = getExchangeBufLen(currentRequest.specialRequest); + memcpy(exchangeBuf.data(), replyBuf.data(), replyLen); + } else if (currentRequest.requestType == imtq::RequestType::ACTUATE) { + replyLen = ImtqRepliesWithTorque::BASE_LEN; + memcpy(exchangeBuf.data(), replyBufActuation.data(), replyLen); + } else { + *size = 0; + } + } + { + MutexGuard mg(ipcLock); + this->currentRequest.requestType = imtq::RequestType::DO_NOTHING; } *buffer = exchangeBuf.data(); *size = replyLen; @@ -417,6 +450,7 @@ void ImtqPollingTask::clearReadFlagsWithTorque(ImtqRepliesWithTorque& replies) { ReturnValue_t ImtqPollingTask::performI2cFullRequest(uint8_t* reply, size_t replyLen) { int fd = 0; if (cmdLen == 0 or reply == nullptr) { + sif::error << "ImtqPollingTask: Command lenght is zero or reply PTR is invalid" << std::endl; return returnvalue::FAILED; } diff --git a/linux/devices/ImtqPollingTask.h b/linux/acs/ImtqPollingTask.h similarity index 91% rename from linux/devices/ImtqPollingTask.h rename to linux/acs/ImtqPollingTask.h index 32497753..8ffe307b 100644 --- a/linux/devices/ImtqPollingTask.h +++ b/linux/acs/ImtqPollingTask.h @@ -3,13 +3,14 @@ #include #include +#include #include #include "fsfw/devicehandlers/DeviceCommunicationIF.h" #include "fsfw/objectmanager/SystemObject.h" #include "fsfw/tasks/ExecutableObjectIF.h" -#include "mission/devices/devicedefinitions/imtqHelpers.h" +#include "mission/acs/imtqHelpers.h" class ImtqPollingTask : public SystemObject, public ExecutableObjectIF, @@ -24,7 +25,6 @@ class ImtqPollingTask : public SystemObject, static constexpr ReturnValue_t NO_REPLY_AVAILABLE = returnvalue::makeCode(2, 0); enum class InternalState { IDLE, IS_BUSY } state = InternalState::IDLE; - imtq::RequestType currentRequest = imtq::RequestType::MEASURE_NO_ACTUATION; SemaphoreIF* semaphore; ReturnValue_t comStatus = returnvalue::OK; @@ -38,10 +38,9 @@ class ImtqPollingTask : public SystemObject, // Required in addition to integration time, otherwise old data might be read. static constexpr uint32_t MGM_READ_BUFFER_TIME_MS = 6; bool ignoreNextActuateRequest = false; + bool performStartup = false; - imtq::SpecialRequest specialRequest = imtq::SpecialRequest::NONE; - int16_t dipoles[3] = {}; - uint16_t torqueDuration = 0; + imtq::Request currentRequest{}; std::array cmdBuf; std::array replyBuf; diff --git a/linux/devices/RwPollingTask.cpp b/linux/acs/RwPollingTask.cpp similarity index 99% rename from linux/devices/RwPollingTask.cpp rename to linux/acs/RwPollingTask.cpp index 45528178..07958d8b 100644 --- a/linux/devices/RwPollingTask.cpp +++ b/linux/acs/RwPollingTask.cpp @@ -11,7 +11,7 @@ #include #include "devConf.h" -#include "mission/devices/devicedefinitions/rwHelpers.h" +#include "mission/acs/rwHelpers.h" RwPollingTask::RwPollingTask(object_id_t objectId, const char* spiDev, GpioIF& gpioIF) : SystemObject(objectId), spiDev(spiDev), gpioIF(gpioIF) { diff --git a/linux/devices/RwPollingTask.h b/linux/acs/RwPollingTask.h similarity index 98% rename from linux/devices/RwPollingTask.h rename to linux/acs/RwPollingTask.h index 0131f2b4..5fb25d1d 100644 --- a/linux/devices/RwPollingTask.h +++ b/linux/acs/RwPollingTask.h @@ -9,7 +9,7 @@ #include #include -#include "mission/devices/devicedefinitions/rwHelpers.h" +#include "mission/acs/rwHelpers.h" class RwCookie : public SpiCookie { friend class RwPollingTask; diff --git a/linux/devices/startracker/StrComHandler.cpp b/linux/acs/StrComHandler.cpp similarity index 98% rename from linux/devices/startracker/StrComHandler.cpp rename to linux/acs/StrComHandler.cpp index 7a9055d8..303c2228 100644 --- a/linux/devices/startracker/StrComHandler.cpp +++ b/linux/acs/StrComHandler.cpp @@ -1,8 +1,10 @@ +#include "StrComHandler.h" + #include #include #include #include -#include +#include #include #include @@ -11,8 +13,6 @@ #include "OBSWConfig.h" #include "eive/definitions.h" #include "fsfw/timemanager/Countdown.h" -#include "helpers.h" -#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h" #include "mission/utility/Filenaming.h" #include "mission/utility/ProgressPrinter.h" #include "mission/utility/Timestamp.h" @@ -42,7 +42,6 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { while (true) { lock->lockMutex(); state = InternalState::SLEEPING; - datalinkLayer.reset(); lock->unlockMutex(); semaphore.acquire(); switch (state) { @@ -58,6 +57,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { } case InternalState::UPLOAD_IMAGE: { replyTimeout.setTimeout(200); + resetReplyHandlingState(); result = performImageUpload(); if (result == returnvalue::OK) { triggerEvent(IMAGE_UPLOAD_SUCCESSFUL); @@ -68,6 +68,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { } case InternalState::DOWNLOAD_IMAGE: { replyTimeout.setTimeout(200); + resetReplyHandlingState(); result = performImageDownload(); if (result == returnvalue::OK) { triggerEvent(IMAGE_DOWNLOAD_SUCCESSFUL); @@ -78,6 +79,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { } case InternalState::FLASH_READ: { replyTimeout.setTimeout(200); + resetReplyHandlingState(); result = performFlashRead(); if (result == returnvalue::OK) { triggerEvent(FLASH_READ_SUCCESSFUL); @@ -88,6 +90,7 @@ ReturnValue_t StrComHandler::performOperation(uint8_t operationCode) { } case InternalState::FIRMWARE_UPDATE: { replyTimeout.setTimeout(200); + resetReplyHandlingState(); result = performFirmwareUpdate(); if (result == returnvalue::OK) { triggerEvent(FIRMWARE_UPDATE_SUCCESSFUL); @@ -553,12 +556,12 @@ ReturnValue_t StrComHandler::sendAndRead(size_t size, uint32_t failParameter) { } ReturnValue_t StrComHandler::checkActionReply(size_t replySize) { - uint8_t type = str::getReplyFrameType(replyPtr); + uint8_t type = startracker::getReplyFrameType(replyPtr); if (type != TMTC_ACTIONREPLY) { sif::warning << "StrHelper::checkActionReply: Received reply with invalid type ID" << std::endl; return INVALID_TYPE_ID; } - uint8_t status = str::getStatusField(replyPtr); + uint8_t status = startracker::getStatusField(replyPtr); if (status != ArcsecDatalinkLayer::STATUS_OK) { sif::warning << "StrHelper::checkActionReply: Status failure: " << static_cast(status) << std::endl; @@ -645,7 +648,8 @@ ReturnValue_t StrComHandler::sendMessage(CookieIF* cookie, const uint8_t* sendDa return BUSY; } } - serial::flushRxBuf(serialPort); + // Ensure consistent state. + resetReplyHandlingState(); const uint8_t* txFrame; size_t frameLen; @@ -697,6 +701,7 @@ ReturnValue_t StrComHandler::readReceivedMessage(CookieIF* cookie, uint8_t** buf *buffer = const_cast(replyPtr); *size = replyLen; } + replyLen = 0; return replyResult; } @@ -781,3 +786,8 @@ ReturnValue_t StrComHandler::readOneReply(uint32_t failParameter) { } } } + +void StrComHandler::resetReplyHandlingState() { + serial::flushRxBuf(serialPort); + datalinkLayer.reset(); +} diff --git a/linux/devices/startracker/StrComHandler.h b/linux/acs/StrComHandler.h similarity index 99% rename from linux/devices/startracker/StrComHandler.h rename to linux/acs/StrComHandler.h index b581678c..385e8b2e 100644 --- a/linux/devices/startracker/StrComHandler.h +++ b/linux/acs/StrComHandler.h @@ -1,9 +1,10 @@ #ifndef BSP_Q7S_DEVICES_STRHELPER_H_ #define BSP_Q7S_DEVICES_STRHELPER_H_ +#include + #include -#include "ArcsecDatalinkLayer.h" #include "OBSWConfig.h" #ifdef XIPHOS_Q7S @@ -373,6 +374,8 @@ class StrComHandler : public SystemObject, public DeviceCommunicationIF, public * @return */ ReturnValue_t readOneReply(uint32_t failParameter); + + void resetReplyHandlingState(); }; #endif /* BSP_Q7S_DEVICES_STRHELPER_H_ */ diff --git a/linux/devices/SusPolling.cpp b/linux/acs/SusPolling.cpp similarity index 98% rename from linux/devices/SusPolling.cpp rename to linux/acs/SusPolling.cpp index dac0255b..aea92ffe 100644 --- a/linux/devices/SusPolling.cpp +++ b/linux/acs/SusPolling.cpp @@ -4,12 +4,11 @@ #include #include #include +#include #include -#include +#include #include -#include "mission/devices/devicedefinitions/susMax1227Helpers.h" - using namespace returnvalue; SusPolling::SusPolling(object_id_t objectId, SpiComIF& spiComIF, GpioIF& gpioIF) diff --git a/linux/devices/SusPolling.h b/linux/acs/SusPolling.h similarity index 96% rename from linux/devices/SusPolling.h rename to linux/acs/SusPolling.h index e9bcf59d..470f11d5 100644 --- a/linux/devices/SusPolling.h +++ b/linux/acs/SusPolling.h @@ -8,7 +8,7 @@ #include #include "devices/addresses.h" -#include "mission/devices/devicedefinitions/acsPolling.h" +#include "mission/acs/acsBoardPolling.h" class SusPolling : public SystemObject, public ExecutableObjectIF, public DeviceCommunicationIF { public: diff --git a/linux/boardtest/I2cTestClass.h b/linux/boardtest/I2cTestClass.h index 1a578363..299d74c5 100644 --- a/linux/boardtest/I2cTestClass.h +++ b/linux/boardtest/I2cTestClass.h @@ -1,13 +1,12 @@ #ifndef LINUX_BOARDTEST_I2CTESTCLASS_H_ #define LINUX_BOARDTEST_I2CTESTCLASS_H_ +#include #include #include #include -#include "mission/devices/devicedefinitions/BpxBatteryDefinitions.h" - class I2cTestClass : public TestTask { public: I2cTestClass(object_id_t objectId, std::string i2cdev); diff --git a/linux/boardtest/SpiTestClass.cpp b/linux/boardtest/SpiTestClass.cpp index 2521c9a8..1b9b4c65 100644 --- a/linux/boardtest/SpiTestClass.cpp +++ b/linux/boardtest/SpiTestClass.cpp @@ -18,8 +18,9 @@ #if defined(XIPHOS_Q7S) #include "busConf.h" #endif +#include + #include "devices/gpioIds.h" -#include "mission/devices/max1227.h" SpiTestClass::SpiTestClass(object_id_t objectId, GpioIF *gpioIF) : TestTask(objectId), gpioIF(gpioIF) { diff --git a/linux/boardtest/UartTestClass.cpp b/linux/boardtest/UartTestClass.cpp index def7da8b..6522a901 100644 --- a/linux/boardtest/UartTestClass.cpp +++ b/linux/boardtest/UartTestClass.cpp @@ -4,9 +4,10 @@ #include // Contains file controls like O_RDWR #include #include -#include -#include -#include +#include +#include +#include +#include #include // write(), read(), close() #include @@ -18,7 +19,6 @@ #include "fsfw/globalfunctions/DleEncoder.h" #include "fsfw/globalfunctions/arrayprinter.h" #include "fsfw/serviceinterface.h" -#include "mission/devices/devicedefinitions/ScexDefinitions.h" #define GPS_REPLY_WIRETAPPING 0 diff --git a/linux/boardtest/UartTestClass.h b/linux/boardtest/UartTestClass.h index fd20e621..f959f877 100644 --- a/linux/boardtest/UartTestClass.h +++ b/linux/boardtest/UartTestClass.h @@ -6,12 +6,12 @@ #include #include #include +#include #include // Contains POSIX terminal control definitions #include //#include "lwgps/lwgps.h" -#include "mission/devices/devicedefinitions/ScexDefinitions.h" #include "test/TestTask.h" class ScexUartReader; diff --git a/linux/com/CMakeLists.txt b/linux/com/CMakeLists.txt new file mode 100644 index 00000000..99e00706 --- /dev/null +++ b/linux/com/CMakeLists.txt @@ -0,0 +1 @@ +target_sources(${OBSW_NAME} PUBLIC SyrlinksComHandler.cpp) diff --git a/linux/devices/SyrlinksComHandler.cpp b/linux/com/SyrlinksComHandler.cpp similarity index 100% rename from linux/devices/SyrlinksComHandler.cpp rename to linux/com/SyrlinksComHandler.cpp diff --git a/linux/devices/SyrlinksComHandler.h b/linux/com/SyrlinksComHandler.h similarity index 100% rename from linux/devices/SyrlinksComHandler.h rename to linux/com/SyrlinksComHandler.h diff --git a/linux/devices/CMakeLists.txt b/linux/devices/CMakeLists.txt deleted file mode 100644 index 7dbda12b..00000000 --- a/linux/devices/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -if(EIVE_BUILD_GPSD_GPS_HANDLER) - target_sources(${OBSW_NAME} PRIVATE GpsHyperionLinuxController.cpp) -endif() - -target_sources( - ${OBSW_NAME} - PRIVATE Max31865RtdPolling.cpp - ScexUartReader.cpp - ImtqPollingTask.cpp - SusPolling.cpp - ScexDleParser.cpp - ScexHelper.cpp - RwPollingTask.cpp - AcsBoardPolling.cpp - SyrlinksComHandler.cpp) - -add_subdirectory(ploc) - -# Dependency on proprietary library -if(TGT_BSP MATCHES "arm/q7s") - add_subdirectory(startracker) -endif() diff --git a/linux/devices/ploc/CMakeLists.txt b/linux/devices/ploc/CMakeLists.txt deleted file mode 100644 index 67a0637b..00000000 --- a/linux/devices/ploc/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -target_sources( - ${OBSW_NAME} - PRIVATE PlocSupervisorHandler.cpp PlocMemoryDumper.cpp PlocMPSoCHandler.cpp - PlocMPSoCHelper.cpp PlocSupvUartMan.cpp) diff --git a/linux/devices/startracker/helpers.cpp b/linux/devices/startracker/helpers.cpp deleted file mode 100644 index 112bc06a..00000000 --- a/linux/devices/startracker/helpers.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "helpers.h" - -uint8_t str::getReplyFrameType(const uint8_t* rawFrame) { return rawFrame[0]; } - -uint8_t str::getId(const uint8_t* rawFrame) { return rawFrame[1]; } - -uint8_t str::getStatusField(const uint8_t* rawFrame) { return rawFrame[2]; } diff --git a/linux/devices/startracker/helpers.h b/linux/devices/startracker/helpers.h deleted file mode 100644 index 9b4f5f9e..00000000 --- a/linux/devices/startracker/helpers.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef LINUX_DEVICES_STARTRACKER_HELPERS_H_ -#define LINUX_DEVICES_STARTRACKER_HELPERS_H_ - -#include "arcsec/common/genericstructs.h" - -namespace str { - -/** - * @brief Returns the frame type field of a decoded frame. - */ -uint8_t getReplyFrameType(const uint8_t* rawFrame); -uint8_t getId(const uint8_t* rawFrame); -uint8_t getStatusField(const uint8_t* rawFrame); - -} // namespace str - -#endif /* LINUX_DEVICES_STARTRACKER_HELPERS_H_ */ diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index ce30734a..25c6c39d 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 280 translations. + * @brief Auto-generated event translation file. Contains 284 translations. * @details - * Generated on: 2023-03-24 15:19:38 + * Generated on: 2023-04-04 13:59:07 */ #include "translateEvents.h" @@ -97,7 +97,6 @@ const char *SAFE_RATE_RECOVERY_STRING = "SAFE_RATE_RECOVERY"; const char *MULTIPLE_RW_INVALID_STRING = "MULTIPLE_RW_INVALID"; const char *MEKF_INVALID_INFO_STRING = "MEKF_INVALID_INFO"; const char *MEKF_RECOVERY_STRING = "MEKF_RECOVERY"; -const char *MEKF_AUTOMATIC_RESET_STRING = "MEKF_AUTOMATIC_RESET"; const char *MEKF_INVALID_MODE_VIOLATION_STRING = "MEKF_INVALID_MODE_VIOLATION"; const char *SAFE_MODE_CONTROLLER_FAILURE_STRING = "SAFE_MODE_CONTROLLER_FAILURE"; const char *SWITCH_CMD_SENT_STRING = "SWITCH_CMD_SENT"; @@ -210,6 +209,11 @@ const char *TRANSITION_OTHER_SIDE_FAILED_STRING = "TRANSITION_OTHER_SIDE_FAILED" const char *NOT_ENOUGH_DEVICES_DUAL_MODE_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE"; const char *POWER_STATE_MACHINE_TIMEOUT_STRING = "POWER_STATE_MACHINE_TIMEOUT"; const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED"; +const char *DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING = "DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY"; +const char *TRANSITION_OTHER_SIDE_FAILED_12900_STRING = "TRANSITION_OTHER_SIDE_FAILED_12900"; +const char *NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING = "NOT_ENOUGH_DEVICES_DUAL_MODE_12901"; +const char *POWER_STATE_MACHINE_TIMEOUT_12902_STRING = "POWER_STATE_MACHINE_TIMEOUT_12902"; +const char *SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING = "SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903"; 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"; @@ -266,21 +270,25 @@ const char *I2C_UNAVAILABLE_REBOOT_STRING = "I2C_UNAVAILABLE_REBOOT"; const char *NO_VALID_SENSOR_TEMPERATURE_STRING = "NO_VALID_SENSOR_TEMPERATURE"; const char *NO_HEALTHY_HEATER_AVAILABLE_STRING = "NO_HEALTHY_HEATER_AVAILABLE"; const char *SYRLINKS_OVERHEATING_STRING = "SYRLINKS_OVERHEATING"; -const char *PLOC_OVERHEATING_STRING = "PLOC_OVERHEATING"; const char *OBC_OVERHEATING_STRING = "OBC_OVERHEATING"; -const char *HPA_OVERHEATING_STRING = "HPA_OVERHEATING"; -const char *PLPCDU_OVERHEATING_STRING = "PLPCDU_OVERHEATING"; +const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING"; +const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_OVERHEATING"; +const char *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE"; const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED"; const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON"; const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION"; const char *FILE_TOO_LARGE_STRING = "FILE_TOO_LARGE"; const char *BUSY_DUMPING_EVENT_STRING = "BUSY_DUMPING_EVENT"; -const char *DUMP_WAS_CANCELLED_STRING = "DUMP_WAS_CANCELLED"; const char *DUMP_OK_STORE_DONE_STRING = "DUMP_OK_STORE_DONE"; const char *DUMP_NOK_STORE_DONE_STRING = "DUMP_NOK_STORE_DONE"; const char *DUMP_MISC_STORE_DONE_STRING = "DUMP_MISC_STORE_DONE"; const char *DUMP_HK_STORE_DONE_STRING = "DUMP_HK_STORE_DONE"; const char *DUMP_CFDP_STORE_DONE_STRING = "DUMP_CFDP_STORE_DONE"; +const char *DUMP_OK_CANCELLED_STRING = "DUMP_OK_CANCELLED"; +const char *DUMP_NOK_CANCELLED_STRING = "DUMP_NOK_CANCELLED"; +const char *DUMP_MISC_CANCELLED_STRING = "DUMP_MISC_CANCELLED"; +const char *DUMP_HK_CANCELLED_STRING = "DUMP_HK_CANCELLED"; +const char *DUMP_CFDP_CANCELLED_STRING = "DUMP_CFDP_CANCELLED"; const char *translateEvents(Event event) { switch ((event & 0xFFFF)) { @@ -469,10 +477,8 @@ const char *translateEvents(Event event) { case (11204): return MEKF_RECOVERY_STRING; case (11205): - return MEKF_AUTOMATIC_RESET_STRING; - case (11206): return MEKF_INVALID_MODE_VIOLATION_STRING; - case (11207): + case (11206): return SAFE_MODE_CONTROLLER_FAILURE_STRING; case (11300): return SWITCH_CMD_SENT_STRING; @@ -694,6 +700,16 @@ const char *translateEvents(Event event) { return POWER_STATE_MACHINE_TIMEOUT_STRING; case (12803): return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_STRING; + case (12804): + return DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY_STRING; + case (12900): + return TRANSITION_OTHER_SIDE_FAILED_12900_STRING; + case (12901): + return NOT_ENOUGH_DEVICES_DUAL_MODE_12901_STRING; + case (12902): + return POWER_STATE_MACHINE_TIMEOUT_12902_STRING; + case (12903): + return SIDE_SWITCH_TRANSITION_NOT_ALLOWED_12903_STRING; case (13000): return CHILDREN_LOST_MODE_STRING; case (13100): @@ -806,14 +822,14 @@ const char *translateEvents(Event event) { return NO_HEALTHY_HEATER_AVAILABLE_STRING; case (14102): return SYRLINKS_OVERHEATING_STRING; - case (14103): - return PLOC_OVERHEATING_STRING; case (14104): return OBC_OVERHEATING_STRING; case (14105): - return HPA_OVERHEATING_STRING; + return CAMERA_OVERHEATING_STRING; case (14106): - return PLPCDU_OVERHEATING_STRING; + return PCDU_SYSTEM_OVERHEATING_STRING; + case (14107): + return HEATER_NOT_OFF_FOR_OFF_MODE_STRING; case (14201): return TX_TIMER_EXPIRED_STRING; case (14202): @@ -824,8 +840,6 @@ const char *translateEvents(Event event) { return FILE_TOO_LARGE_STRING; case (14302): return BUSY_DUMPING_EVENT_STRING; - case (14303): - return DUMP_WAS_CANCELLED_STRING; case (14305): return DUMP_OK_STORE_DONE_STRING; case (14306): @@ -836,6 +850,16 @@ const char *translateEvents(Event event) { return DUMP_HK_STORE_DONE_STRING; case (14309): return DUMP_CFDP_STORE_DONE_STRING; + case (14310): + return DUMP_OK_CANCELLED_STRING; + case (14311): + return DUMP_NOK_CANCELLED_STRING; + case (14312): + return DUMP_MISC_CANCELLED_STRING; + case (14313): + return DUMP_HK_CANCELLED_STRING; + case (14314): + return DUMP_CFDP_CANCELLED_STRING; default: return "UNKNOWN_EVENT"; } diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index 7cb9ef33..c579b741 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -1,8 +1,8 @@ /** * @brief Auto-generated object translation file. * @details - * Contains 173 translations. - * Generated on: 2023-03-24 15:19:38 + * Contains 175 translations. + * Generated on: 2023-04-04 13:59:07 */ #include "translateObjects.h" @@ -37,6 +37,8 @@ const char *GYRO_3_L3G_HANDLER_STRING = "GYRO_3_L3G_HANDLER"; const char *RW4_STRING = "RW4"; const char *STAR_TRACKER_STRING = "STAR_TRACKER"; const char *GPS_CONTROLLER_STRING = "GPS_CONTROLLER"; +const char *GPS_0_HEALTH_DEV_STRING = "GPS_0_HEALTH_DEV"; +const char *GPS_1_HEALTH_DEV_STRING = "GPS_1_HEALTH_DEV"; const char *IMTQ_POLLING_STRING = "IMTQ_POLLING"; const char *IMTQ_HANDLER_STRING = "IMTQ_HANDLER"; const char *PCDU_HANDLER_STRING = "PCDU_HANDLER"; @@ -244,6 +246,10 @@ const char *translateObject(object_id_t object) { return STAR_TRACKER_STRING; case 0x44130045: return GPS_CONTROLLER_STRING; + case 0x44130046: + return GPS_0_HEALTH_DEV_STRING; + case 0x44130047: + return GPS_1_HEALTH_DEV_STRING; case 0x44140013: return IMTQ_POLLING_STRING; case 0x44140014: diff --git a/linux/ipcore/AxiPtmeConfig.cpp b/linux/ipcore/AxiPtmeConfig.cpp index 043fd775..6dee3e2f 100644 --- a/linux/ipcore/AxiPtmeConfig.cpp +++ b/linux/ipcore/AxiPtmeConfig.cpp @@ -1,5 +1,7 @@ #include "AxiPtmeConfig.h" +#include + #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw_hal/linux/uio/UioMapper.h" @@ -39,97 +41,59 @@ ReturnValue_t AxiPtmeConfig::writeCaduRateReg(uint8_t rateVal) { return returnvalue::OK; } -ReturnValue_t AxiPtmeConfig::enableTxclockManipulator() { - ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::EN_TX_CLK_MANIPULATOR); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; +void AxiPtmeConfig::enableTxclockManipulator() { + writeBit(COMMON_CONFIG_REG, true, BitPos::EN_TX_CLK_MANIPULATOR); } -ReturnValue_t AxiPtmeConfig::disableTxclockManipulator() { - ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::EN_TX_CLK_MANIPULATOR); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; +void AxiPtmeConfig::disableTxclockManipulator() { + writeBit(COMMON_CONFIG_REG, false, BitPos::EN_TX_CLK_MANIPULATOR); } -ReturnValue_t AxiPtmeConfig::enableTxclockInversion() { - ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::INVERT_CLOCK); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; +void AxiPtmeConfig::enableTxclockInversion() { + writeBit(COMMON_CONFIG_REG, true, BitPos::INVERT_CLOCK); } -ReturnValue_t AxiPtmeConfig::disableTxclockInversion() { - ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::INVERT_CLOCK); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; +void AxiPtmeConfig::disableTxclockInversion() { + writeBit(COMMON_CONFIG_REG, false, BitPos::INVERT_CLOCK); } -ReturnValue_t AxiPtmeConfig::enableBatPriorityBit() { - ReturnValue_t result = writeBit(COMMON_CONFIG_REG, true, BitPos::EN_BAT_PRIORITY); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; +void AxiPtmeConfig::enableBatPriorityBit() { + writeBit(COMMON_CONFIG_REG, true, BitPos::EN_BAT_PRIORITY); } -ReturnValue_t AxiPtmeConfig::disableBatPriorityBit() { - ReturnValue_t result = writeBit(COMMON_CONFIG_REG, false, BitPos::EN_BAT_PRIORITY); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; +void AxiPtmeConfig::disableBatPriorityBit() { + writeBit(COMMON_CONFIG_REG, false, BitPos::EN_BAT_PRIORITY); } -ReturnValue_t AxiPtmeConfig::writeReg(uint32_t regOffset, uint32_t writeVal) { - ReturnValue_t result = returnvalue::OK; - result = mutex->lockMutex(timeoutType, mutexTimeout); - if (result != returnvalue::OK) { - sif::warning << "AxiPtmeConfig::readReg: Failed to lock mutex" << std::endl; - return returnvalue::FAILED; - } +void AxiPtmeConfig::writeReg(uint32_t regOffset, uint32_t writeVal) { + MutexGuard mg(mutex, timeoutType, mutexTimeout); *(baseAddress + regOffset / ADRESS_DIVIDER) = writeVal; - result = mutex->unlockMutex(); - if (result != returnvalue::OK) { - sif::warning << "AxiPtmeConfig::readReg: Failed to unlock mutex" << std::endl; - return returnvalue::FAILED; - } - return returnvalue::OK; } -ReturnValue_t AxiPtmeConfig::readReg(uint32_t regOffset, uint32_t* readVal) { - ReturnValue_t result = returnvalue::OK; - result = mutex->lockMutex(timeoutType, mutexTimeout); - if (result != returnvalue::OK) { - sif::warning << "AxiPtmeConfig::readReg: Failed to lock mutex" << std::endl; - return returnvalue::FAILED; - } - *readVal = *(baseAddress + regOffset / ADRESS_DIVIDER); - result = mutex->unlockMutex(); - if (result != returnvalue::OK) { - sif::warning << "AxiPtmeConfig::readReg: Failed to unlock mutex" << std::endl; - return returnvalue::FAILED; - } - return returnvalue::OK; +uint32_t AxiPtmeConfig::readReg(uint32_t regOffset) { + MutexGuard mg(mutex, timeoutType, mutexTimeout); + return *(baseAddress + regOffset / ADRESS_DIVIDER); } -ReturnValue_t AxiPtmeConfig::writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos) { - uint32_t readVal = 0; - ReturnValue_t result = readReg(regOffset, &readVal); - if (result != returnvalue::OK) { - return result; - } +void AxiPtmeConfig::writePollThreshold(AxiPtmeConfig::IdlePollThreshold pollThreshold) { + uint32_t regVal = readCommonCfgReg(); + // Clear bits first + regVal &= ~(0b111 << 3); + regVal |= (static_cast(pollThreshold) << 3); + writeCommonCfgReg(regVal); +} + +AxiPtmeConfig::IdlePollThreshold AxiPtmeConfig::readPollThreshold() { + uint32_t regVal = readCommonCfgReg(); + return static_cast((regVal >> 3) & 0b111); +} + +void AxiPtmeConfig::writeCommonCfgReg(uint32_t value) { writeReg(COMMON_CONFIG_REG, value); } +uint32_t AxiPtmeConfig::readCommonCfgReg() { return readReg(COMMON_CONFIG_REG); } + +void AxiPtmeConfig::writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos) { + uint32_t readVal = readReg(regOffset); uint32_t writeVal = (readVal & ~(1 << static_cast(bitPos))) | bitVal << static_cast(bitPos); - result = writeReg(regOffset, writeVal); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; + writeReg(regOffset, writeVal); } diff --git a/linux/ipcore/AxiPtmeConfig.h b/linux/ipcore/AxiPtmeConfig.h index 420e9a5a..98188775 100644 --- a/linux/ipcore/AxiPtmeConfig.h +++ b/linux/ipcore/AxiPtmeConfig.h @@ -14,6 +14,16 @@ */ class AxiPtmeConfig : public SystemObject { public: + enum IdlePollThreshold : uint8_t { + ALWAYS = 0b000, + POLL_1 = 0b001, + POLL_4 = 0b010, + POLL_16 = 0b011, + POLL_64 = 0b100, + POLL_256 = 0b101, + POLL_1024 = 0b110, + NEVER = 0b111 + }; /** * @brief Constructor * @param axiUio Device file of UIO belonging to the AXI configuration interface. @@ -40,8 +50,8 @@ class AxiPtmeConfig : public SystemObject { * Default: Enables TX clock manipulator * */ - ReturnValue_t enableTxclockManipulator(); - ReturnValue_t disableTxclockManipulator(); + void enableTxclockManipulator(); + void disableTxclockManipulator(); /** * @brief The next to functions control whether data will be updated on the rising or falling edge @@ -51,11 +61,14 @@ class AxiPtmeConfig : public SystemObject { * Disable clock inversion. Data updated on rising edge. * Default: Inversion is disabled */ - ReturnValue_t enableTxclockInversion(); - ReturnValue_t disableTxclockInversion(); + void enableTxclockInversion(); + void disableTxclockInversion(); - ReturnValue_t enableBatPriorityBit(); - ReturnValue_t disableBatPriorityBit(); + void enableBatPriorityBit(); + void disableBatPriorityBit(); + + void writePollThreshold(IdlePollThreshold pollThreshold); + IdlePollThreshold readPollThreshold(); private: // Address of register storing the bitrate configuration parameter @@ -80,7 +93,7 @@ class AxiPtmeConfig : public SystemObject { * * @param writeVal Value to write */ - ReturnValue_t writeReg(uint32_t regOffset, uint32_t writeVal); + void writeReg(uint32_t regOffset, uint32_t writeVal); /** * @brief Reads value from configuration register @@ -88,7 +101,10 @@ class AxiPtmeConfig : public SystemObject { * @param regOffset Offset of register from base address to read from * Qparam readVal Pointer to variable where read value will be written to */ - ReturnValue_t readReg(uint32_t regOffset, uint32_t* readVal); + uint32_t readReg(uint32_t regOffset); + + uint32_t readCommonCfgReg(); + void writeCommonCfgReg(uint32_t value); /** * @brief Sets one bit in a register @@ -99,7 +115,7 @@ class AxiPtmeConfig : public SystemObject { * * @return returnvalue::OK if successful, otherwise returnvalue::FAILED */ - ReturnValue_t writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos); + void writeBit(uint32_t regOffset, bool bitVal, BitPos bitPos); }; #endif /* LINUX_OBC_AXIPTMECONFIG_H_ */ diff --git a/linux/ipcore/PapbVcInterface.cpp b/linux/ipcore/PapbVcInterface.cpp index 8c98df90..60968cc6 100644 --- a/linux/ipcore/PapbVcInterface.cpp +++ b/linux/ipcore/PapbVcInterface.cpp @@ -2,6 +2,9 @@ #include #include +#include +#include + #include "fsfw/serviceinterface/ServiceInterface.h" PapbVcInterface::PapbVcInterface(LinuxLibgpioIF* gpioComIF, gpioId_t papbBusyId, @@ -16,30 +19,71 @@ PapbVcInterface::~PapbVcInterface() {} ReturnValue_t PapbVcInterface::initialize() { UioMapper uioMapper(uioFile, mapNum); - uint32_t* baseReg; - ReturnValue_t result = uioMapper.getMappedAdress(&baseReg, UioMapper::Permissions::WRITE_ONLY); + ReturnValue_t result = uioMapper.getMappedAdress(const_cast(&vcBaseReg), + UioMapper::Permissions::WRITE_ONLY); if (result != returnvalue::OK) { return result; } - vcBaseReg = baseReg; return returnvalue::OK; } ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size) { - if (pollPapbBusySignal(0, 0) == returnvalue::OK) { - startPacketTransfer(); + // There are no packets smaller than 4, this is considered a configuration error. + if (size < 4) { + return returnvalue::FAILED; + } + if (pollInterfaceReadiness(0, true) == returnvalue::OK) { + startPacketTransfer(ByteWidthCfg::ONE); } else { return DirectTmSinkIF::IS_BUSY; } + // TODO: This should work but does not.. :( + // size_t idx = 0; + // while (idx < size) { + // + // nanosleep(&BETWEEN_POLL_DELAY, &remDelay); + // if ((size - idx) < 4) { + // *vcBaseReg = CONFIG_DATA_INPUT | (size - idx - 1); + // usleep(1); + // } + // if (pollPapbBusySignal(2) == returnvalue::OK) { + // // vcBaseReg + DATA_REG_OFFSET + 3 = static_cast(data + idx); + // // vcBaseReg + DATA_REG_OFFSET + 2 = static_cast(data + idx + 1); + // // vcBaseReg + DATA_REG_OFFSET + 1 = static_cast(data + idx + 2); + // // vcBaseReg + DATA_REG_OFFSET = static_cast(data + idx + 3); + // + // // std::memcpy((vcBaseReg + DATA_REG_OFFSET), data + idx , nextWriteSize); + // *(vcBaseReg + DATA_REG_OFFSET) = *reinterpret_cast(data + idx); + // //uint8_t* byteReg = reinterpret_cast(vcBaseReg + DATA_REG_OFFSET); + // + // //byteReg[0] = data[idx]; + // //byteReg[1] = data[idx]; + // } else { + // abortPacketTransfer(); + // return returnvalue::FAILED; + // } + // // TODO: Change this after the bugfix. Right now, the PAPB ignores the content of the byte + // // width configuration.5 + // // It's okay to increment by a larger amount for the last segment here, loop will be over + // // in any case. + // idx += 4; + // } for (size_t idx = 0; idx < size; idx++) { - if (pollPapbBusySignal(10, 10) == returnvalue::OK) { + // This delay is super-important, DO NOT REMOVE! + // Polling the GPIO or the config register too often messes up the scheduler. + // TODO: Maybe this should not be done like this. It would be better if there was a custom + // FPGA module which can accept packets and then takes care of dumping that packet into + // the PTME. DMA would be an ideal solution for this. + nanosleep(&BETWEEN_POLL_DELAY, &remDelay); + if (pollInterfaceReadiness(2, false) == returnvalue::OK) { *(vcBaseReg + DATA_REG_OFFSET) = static_cast(data[idx]); } else { abortPacketTransfer(); return returnvalue::FAILED; } } - if (pollPapbBusySignal(10, 10) == returnvalue::OK) { + nanosleep(&BETWEEN_POLL_DELAY, &remDelay); + if (pollInterfaceReadiness(2, false) == returnvalue::OK) { completePacketTransfer(); } else { abortPacketTransfer(); @@ -48,34 +92,41 @@ ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size) { return returnvalue::OK; } -void PapbVcInterface::startPacketTransfer() { *vcBaseReg = CONFIG_START; } +void PapbVcInterface::startPacketTransfer(ByteWidthCfg initWidth) { + *vcBaseReg = CONFIG_DATA_INPUT | initWidth; +} void PapbVcInterface::completePacketTransfer() { *vcBaseReg = CONFIG_END; } -ReturnValue_t PapbVcInterface::pollPapbBusySignal(uint32_t maxPollRetries, - uint32_t retryDelayUs) const { - gpio::Levels papbBusyState = gpio::Levels::LOW; - ReturnValue_t result; +ReturnValue_t PapbVcInterface::pollInterfaceReadiness(uint32_t maxPollRetries, + bool checkReadyState) const { uint32_t busyIdx = 0; + nextDelay.tv_nsec = FIRST_DELAY_PAPB_POLLING_NS; while (true) { - /** Check if PAPB interface is ready to receive data */ - result = gpioComIF->readGpio(papbBusyId, papbBusyState); - if (result != returnvalue::OK) { - sif::warning << "PapbVcInterface::pollPapbBusySignal: Failed to read papb busy signal" - << std::endl; - return returnvalue::FAILED; - } - if (papbBusyState == gpio::Levels::HIGH) { + // Check if PAPB interface is ready to receive data. Use the configuration register for this. + // Bit 5, see PTME ptme_001_01-0-7-r2 Table 31. + uint32_t reg = *vcBaseReg; + bool busy = (reg >> 5) & 0b1; + bool ready = (reg >> 6) & 0b1; + if (not busy) { return returnvalue::OK; } + if (checkReadyState and not ready) { + return PAPB_BUSY; + } busyIdx++; if (busyIdx >= maxPollRetries) { return PAPB_BUSY; } - usleep(retryDelayUs); + // Ignore signal handling here for now. + nanosleep(&nextDelay, &remDelay); + // Adaptive delay. + if (nextDelay.tv_nsec * 2 <= MAX_DELAY_PAPB_POLLING_NS) { + nextDelay.tv_nsec *= 2; + } } return returnvalue::OK; } @@ -100,7 +151,7 @@ void PapbVcInterface::isVcInterfaceBufferEmpty() { return; } -bool PapbVcInterface::isBusy() const { return pollPapbBusySignal(0, 0) == PAPB_BUSY; } +bool PapbVcInterface::isBusy() const { return pollInterfaceReadiness(0, true) == PAPB_BUSY; } void PapbVcInterface::cancelTransfer() { abortPacketTransfer(); } diff --git a/linux/ipcore/PapbVcInterface.h b/linux/ipcore/PapbVcInterface.h index 7491398c..e54def5d 100644 --- a/linux/ipcore/PapbVcInterface.h +++ b/linux/ipcore/PapbVcInterface.h @@ -5,6 +5,8 @@ #include #include +#include + #include "OBSWConfig.h" #include "fsfw/returnvalues/returnvalue.h" @@ -50,13 +52,14 @@ class PapbVcInterface : public VirtualChannelIF { static const ReturnValue_t PAPB_BUSY = MAKE_RETURN_CODE(0xA0); + enum ByteWidthCfg : uint32_t { ONE = 0b00, TWO = 0b01, THREE = 0b10, FOUR = 0b11 }; /** * Configuration bits: * bit[1:0]: Size of data (1,2,3 or 4 bytes). 1 Byte <=> b00 * bit[2]: Set this bit to 1 to abort a transferred packet * bit[3]: Signals to VcInterface the start of a new telemetry packet */ - static constexpr uint32_t CONFIG_START = 0b00001000; + static constexpr uint32_t CONFIG_DATA_INPUT = 0b00001000; /** * Abort a transferred packet. @@ -76,6 +79,9 @@ class PapbVcInterface : public VirtualChannelIF { */ static const int DATA_REG_OFFSET = 256; + static constexpr long int FIRST_DELAY_PAPB_POLLING_NS = 10; + static constexpr long int MAX_DELAY_PAPB_POLLING_NS = 40; + LinuxLibgpioIF* gpioComIF = nullptr; /** Pulled to low when virtual channel not ready to receive data */ @@ -85,6 +91,9 @@ class PapbVcInterface : public VirtualChannelIF { std::string uioFile; int mapNum = 0; + mutable struct timespec nextDelay = {.tv_sec = 0, .tv_nsec = 0}; + const struct timespec BETWEEN_POLL_DELAY = {.tv_sec = 0, .tv_nsec = 10}; + mutable struct timespec remDelay; volatile uint32_t* vcBaseReg = nullptr; @@ -94,7 +103,7 @@ class PapbVcInterface : public VirtualChannelIF { * @brief This function sends the config byte to the virtual channel of the PTME IP Core * to initiate a packet transfer. */ - void startPacketTransfer(); + void startPacketTransfer(ByteWidthCfg initWidth); void abortPacketTransfer(); @@ -111,7 +120,7 @@ class PapbVcInterface : public VirtualChannelIF { * * @return returnvalue::OK when ready to receive data else PAPB_BUSY. */ - ReturnValue_t pollPapbBusySignal(uint32_t maxPollRetries, uint32_t retryDelayUs) const; + inline ReturnValue_t pollInterfaceReadiness(uint32_t maxPollRetries, bool checkReadyState) const; /** * @brief This function can be used for debugging to check whether there are packets in diff --git a/linux/ipcore/PtmeConfig.cpp b/linux/ipcore/PtmeConfig.cpp index 08f5b979..5f247b54 100644 --- a/linux/ipcore/PtmeConfig.cpp +++ b/linux/ipcore/PtmeConfig.cpp @@ -26,33 +26,30 @@ ReturnValue_t PtmeConfig::setRate(uint32_t bitRate) { return axiPtmeConfig->writeCaduRateReg(static_cast(rateVal)); } -ReturnValue_t PtmeConfig::invertTxClock(bool invert) { - ReturnValue_t result = returnvalue::OK; +void PtmeConfig::invertTxClock(bool invert) { if (invert) { - result = axiPtmeConfig->enableTxclockInversion(); + axiPtmeConfig->enableTxclockInversion(); } else { - result = axiPtmeConfig->disableTxclockInversion(); + axiPtmeConfig->disableTxclockInversion(); } - if (result != returnvalue::OK) { - return CLK_INVERSION_FAILED; - } - return result; } -ReturnValue_t PtmeConfig::configTxManipulator(bool enable) { - ReturnValue_t result = returnvalue::OK; +void PtmeConfig::configTxManipulator(bool enable) { if (enable) { - result = axiPtmeConfig->enableTxclockManipulator(); + axiPtmeConfig->enableTxclockManipulator(); } else { - result = axiPtmeConfig->disableTxclockManipulator(); + axiPtmeConfig->disableTxclockManipulator(); } - return result; } -ReturnValue_t PtmeConfig::enableBatPriorityBit(bool enable) { +void PtmeConfig::enableBatPriorityBit(bool enable) { if (enable) { - return axiPtmeConfig->enableBatPriorityBit(); + axiPtmeConfig->enableBatPriorityBit(); } else { - return axiPtmeConfig->disableBatPriorityBit(); + axiPtmeConfig->disableBatPriorityBit(); } } + +void PtmeConfig::setPollThreshold(AxiPtmeConfig::IdlePollThreshold pollThreshold) { + axiPtmeConfig->writePollThreshold(pollThreshold); +} diff --git a/linux/ipcore/PtmeConfig.h b/linux/ipcore/PtmeConfig.h index c7ae4f5f..87614187 100644 --- a/linux/ipcore/PtmeConfig.h +++ b/linux/ipcore/PtmeConfig.h @@ -43,7 +43,7 @@ class PtmeConfig : public SystemObject { * * @return REUTRN_OK if successful, otherwise error return value */ - ReturnValue_t invertTxClock(bool invert); + void invertTxClock(bool invert); /** * @brief Controls the tx clock manipulator of the PTME wrapper component @@ -53,7 +53,7 @@ class PtmeConfig : public SystemObject { * * @return REUTRN_OK if successful, otherwise error return value */ - ReturnValue_t configTxManipulator(bool enable); + void configTxManipulator(bool enable); /** * Enable the bat priority bit in the PTME wrapper component. @@ -62,7 +62,9 @@ class PtmeConfig : public SystemObject { * @param enable * @return */ - ReturnValue_t enableBatPriorityBit(bool enable); + void enableBatPriorityBit(bool enable); + + void setPollThreshold(AxiPtmeConfig::IdlePollThreshold pollThreshold); private: static const uint8_t INTERFACE_ID = CLASS_ID::RATE_SETTER; diff --git a/linux/payload/CMakeLists.txt b/linux/payload/CMakeLists.txt new file mode 100644 index 00000000..7b2c4486 --- /dev/null +++ b/linux/payload/CMakeLists.txt @@ -0,0 +1,10 @@ +target_sources( + ${OBSW_NAME} + PUBLIC PlocMemoryDumper.cpp + PlocMpsocHandler.cpp + PlocMpsocHelper.cpp + PlocSupervisorHandler.cpp + PlocSupvUartMan.cpp + ScexDleParser.cpp + ScexHelper.cpp + ScexUartReader.cpp) diff --git a/linux/devices/ploc/PlocMemoryDumper.cpp b/linux/payload/PlocMemoryDumper.cpp similarity index 99% rename from linux/devices/ploc/PlocMemoryDumper.cpp rename to linux/payload/PlocMemoryDumper.cpp index a5cd04c4..2d61af69 100644 --- a/linux/devices/ploc/PlocMemoryDumper.cpp +++ b/linux/payload/PlocMemoryDumper.cpp @@ -1,6 +1,5 @@ -#include "PlocMemoryDumper.h" - #include +#include #include #include diff --git a/linux/devices/ploc/PlocMemoryDumper.h b/linux/payload/PlocMemoryDumper.h similarity index 96% rename from linux/devices/ploc/PlocMemoryDumper.h rename to linux/payload/PlocMemoryDumper.h index 4a4e05bf..63346d69 100644 --- a/linux/devices/ploc/PlocMemoryDumper.h +++ b/linux/payload/PlocMemoryDumper.h @@ -1,8 +1,8 @@ #ifndef MISSION_DEVICES_PLOCMEMORYDUMPER_H_ #define MISSION_DEVICES_PLOCMEMORYDUMPER_H_ -#include -#include +#include +#include #include "OBSWConfig.h" diff --git a/linux/devices/ploc/PlocMPSoCHandler.cpp b/linux/payload/PlocMpsocHandler.cpp similarity index 99% rename from linux/devices/ploc/PlocMPSoCHandler.cpp rename to linux/payload/PlocMpsocHandler.cpp index 5b53e089..72f2355f 100644 --- a/linux/devices/ploc/PlocMPSoCHandler.cpp +++ b/linux/payload/PlocMpsocHandler.cpp @@ -1,11 +1,11 @@ -#include "PlocMPSoCHandler.h" +#include +#include #include #include "OBSWConfig.h" #include "fsfw/datapool/PoolReadGuard.h" #include "fsfw/globalfunctions/CRC.h" -#include "linux/devices/devicedefinitions/PlocSupervisorDefinitions.h" PlocMPSoCHandler::PlocMPSoCHandler(object_id_t objectId, object_id_t uartComIFid, CookieIF* comCookie, PlocMPSoCHelper* plocMPSoCHelper, diff --git a/linux/devices/ploc/PlocMPSoCHandler.h b/linux/payload/PlocMpsocHandler.h similarity index 98% rename from linux/devices/ploc/PlocMPSoCHandler.h rename to linux/payload/PlocMpsocHandler.h index f14fbe9d..10e6bd5d 100644 --- a/linux/devices/ploc/PlocMPSoCHandler.h +++ b/linux/payload/PlocMpsocHandler.h @@ -1,9 +1,13 @@ #ifndef BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ #define BSP_Q7S_DEVICES_PLOC_PLOCMPSOCHANDLER_H_ +#include +#include +#include +#include + #include -#include "PlocMPSoCHelper.h" #include "fsfw/action/CommandActionHelper.h" #include "fsfw/action/CommandsActionsIF.h" #include "fsfw/devicehandlers/DeviceHandlerBase.h" @@ -11,9 +15,6 @@ #include "fsfw/tmtcservices/SourceSequenceCounter.h" #include "fsfw_hal/linux/gpio/Gpio.h" #include "fsfw_hal/linux/serial/SerialComIF.h" -#include "linux/devices/devicedefinitions/MPSoCReturnValuesIF.h" -#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "linux/devices/devicedefinitions/PlocSupervisorDefinitions.h" /** * @brief This is the device handler for the MPSoC of the payload computer. diff --git a/linux/devices/ploc/PlocMPSoCHelper.cpp b/linux/payload/PlocMpsocHelper.cpp similarity index 99% rename from linux/devices/ploc/PlocMPSoCHelper.cpp rename to linux/payload/PlocMpsocHelper.cpp index fca2e51c..a22462e2 100644 --- a/linux/devices/ploc/PlocMPSoCHelper.cpp +++ b/linux/payload/PlocMpsocHelper.cpp @@ -1,4 +1,4 @@ -#include "PlocMPSoCHelper.h" +#include #include #include diff --git a/linux/devices/ploc/PlocMPSoCHelper.h b/linux/payload/PlocMpsocHelper.h similarity index 98% rename from linux/devices/ploc/PlocMPSoCHelper.h rename to linux/payload/PlocMpsocHelper.h index dea35a82..b74c0844 100644 --- a/linux/devices/ploc/PlocMPSoCHelper.h +++ b/linux/payload/PlocMpsocHelper.h @@ -1,6 +1,9 @@ #ifndef BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ #define BSP_Q7S_DEVICES_PLOCMPSOCHELPER_H_ +#include +#include + #include #include "fsfw/devicehandlers/CookieIF.h" @@ -10,8 +13,6 @@ #include "fsfw/tasks/ExecutableObjectIF.h" #include "fsfw/tmtcservices/SourceSequenceCounter.h" #include "fsfw_hal/linux/serial/SerialComIF.h" -#include "linux/devices/devicedefinitions/PlocMPSoCDefinitions.h" -#include "mission/trace.h" #ifdef XIPHOS_Q7S #include "bsp_q7s/fs/SdCardManager.h" #endif diff --git a/linux/devices/ploc/PlocSupervisorHandler.cpp b/linux/payload/PlocSupervisorHandler.cpp similarity index 100% rename from linux/devices/ploc/PlocSupervisorHandler.cpp rename to linux/payload/PlocSupervisorHandler.cpp diff --git a/linux/devices/ploc/PlocSupervisorHandler.h b/linux/payload/PlocSupervisorHandler.h similarity index 99% rename from linux/devices/ploc/PlocSupervisorHandler.h rename to linux/payload/PlocSupervisorHandler.h index dcad9d09..78c20205 100644 --- a/linux/devices/ploc/PlocSupervisorHandler.h +++ b/linux/payload/PlocSupervisorHandler.h @@ -1,7 +1,8 @@ #ifndef MISSION_DEVICES_PLOCSUPERVISORHANDLER_H_ #define MISSION_DEVICES_PLOCSUPERVISORHANDLER_H_ -#include +#include +#include #include "OBSWConfig.h" #include "devices/powerSwitcherList.h" @@ -10,7 +11,6 @@ #include "fsfw_hal/linux/gpio/Gpio.h" #include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h" #include "fsfw_hal/linux/serial/SerialComIF.h" -#include "linux/devices/devicedefinitions/PlocSupervisorDefinitions.h" #ifdef XIPHOS_Q7S #include "bsp_q7s/fs/SdCardManager.h" diff --git a/linux/devices/ploc/PlocSupvUartMan.cpp b/linux/payload/PlocSupvUartMan.cpp similarity index 99% rename from linux/devices/ploc/PlocSupvUartMan.cpp rename to linux/payload/PlocSupvUartMan.cpp index fe8516b5..e4371be5 100644 --- a/linux/devices/ploc/PlocSupvUartMan.cpp +++ b/linux/payload/PlocSupvUartMan.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include diff --git a/linux/devices/ploc/PlocSupvUartMan.h b/linux/payload/PlocSupvUartMan.h similarity index 99% rename from linux/devices/ploc/PlocSupvUartMan.h rename to linux/payload/PlocSupvUartMan.h index 7b32ffac..61d4b284 100644 --- a/linux/devices/ploc/PlocSupvUartMan.h +++ b/linux/payload/PlocSupvUartMan.h @@ -2,6 +2,8 @@ #define BSP_Q7S_DEVICES_PLOCSUPVHELPER_H_ #include +#include +#include #include #include @@ -14,8 +16,6 @@ #include "fsfw/returnvalues/returnvalue.h" #include "fsfw/tasks/ExecutableObjectIF.h" #include "fsfw_hal/linux/serial/SerialComIF.h" -#include "linux/devices/devicedefinitions/PlocSupervisorDefinitions.h" -#include "mission/trace.h" #include "tas/crc.h" #ifdef XIPHOS_Q7S diff --git a/linux/devices/ScexDleParser.cpp b/linux/payload/ScexDleParser.cpp similarity index 86% rename from linux/devices/ScexDleParser.cpp rename to linux/payload/ScexDleParser.cpp index a2f01396..2de84872 100644 --- a/linux/devices/ScexDleParser.cpp +++ b/linux/payload/ScexDleParser.cpp @@ -1,4 +1,4 @@ -#include "ScexDleParser.h" +#include ScexDleParser::ScexDleParser(SimpleRingBuffer &decodeRingBuf, DleEncoder &decoder, BufPair encodedBuf, BufPair decodedBuf) diff --git a/linux/devices/ScexDleParser.h b/linux/payload/ScexDleParser.h similarity index 100% rename from linux/devices/ScexDleParser.h rename to linux/payload/ScexDleParser.h diff --git a/linux/devices/ScexHelper.cpp b/linux/payload/ScexHelper.cpp similarity index 98% rename from linux/devices/ScexHelper.cpp rename to linux/payload/ScexHelper.cpp index bce5fbda..73937030 100644 --- a/linux/devices/ScexHelper.cpp +++ b/linux/payload/ScexHelper.cpp @@ -1,6 +1,5 @@ -#include "ScexHelper.h" - #include +#include #include "fsfw/serviceinterface.h" diff --git a/linux/devices/ScexHelper.h b/linux/payload/ScexHelper.h similarity index 88% rename from linux/devices/ScexHelper.h rename to linux/payload/ScexHelper.h index f2adf617..b95c605b 100644 --- a/linux/devices/ScexHelper.h +++ b/linux/payload/ScexHelper.h @@ -1,7 +1,7 @@ -#ifndef LINUX_DEVICES_SCEXHELPER_H_ -#define LINUX_DEVICES_SCEXHELPER_H_ +#ifndef LINUX_PAYLOAD_SCEXHELPER_H_ +#define LINUX_PAYLOAD_SCEXHELPER_H_ #include -#include +#include #include #include @@ -43,4 +43,4 @@ class ScexHelper : public SerializeIF { size_t totalPacketLen = 0; }; -#endif /* LINUX_DEVICES_SCEXHELPER_H_ */ +#endif /* LINUX_PAYLOAD_SCEXHELPER_H_ */ diff --git a/linux/devices/ScexUartReader.cpp b/linux/payload/ScexUartReader.cpp similarity index 99% rename from linux/devices/ScexUartReader.cpp rename to linux/payload/ScexUartReader.cpp index 9aa2287c..ccc629ff 100644 --- a/linux/devices/ScexUartReader.cpp +++ b/linux/payload/ScexUartReader.cpp @@ -1,5 +1,3 @@ -#include "ScexUartReader.h" - #include // Contains file controls like O_RDWR #include #include @@ -7,6 +5,7 @@ #include #include #include +#include #include // write(), read(), close() #include // Error integer and strerror() function diff --git a/linux/devices/ScexUartReader.h b/linux/payload/ScexUartReader.h similarity index 98% rename from linux/devices/ScexUartReader.h rename to linux/payload/ScexUartReader.h index 8f5454b2..5b2bbb8b 100644 --- a/linux/devices/ScexUartReader.h +++ b/linux/payload/ScexUartReader.h @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include // Contains POSIX terminal control definitions class SemaphoreIF; diff --git a/linux/devices/devicedefinitions/MPSoCReturnValuesIF.h b/linux/payload/mpsocRetvals.h similarity index 100% rename from linux/devices/devicedefinitions/MPSoCReturnValuesIF.h rename to linux/payload/mpsocRetvals.h diff --git a/linux/devices/devicedefinitions/PlocMemDumpDefinitions.h b/linux/payload/plocMemDumpDefs.h similarity index 100% rename from linux/devices/devicedefinitions/PlocMemDumpDefinitions.h rename to linux/payload/plocMemDumpDefs.h diff --git a/linux/devices/devicedefinitions/PlocMPSoCDefinitions.h b/linux/payload/plocMpscoDefs.h similarity index 99% rename from linux/devices/devicedefinitions/PlocMPSoCDefinitions.h rename to linux/payload/plocMpscoDefs.h index ef769eef..975dad32 100644 --- a/linux/devices/devicedefinitions/PlocMPSoCDefinitions.h +++ b/linux/payload/plocMpscoDefs.h @@ -1,12 +1,14 @@ #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ -#include "MPSoCReturnValuesIF.h" +#include +#include +#include + #include "OBSWConfig.h" #include "eive/definitions.h" #include "fsfw/globalfunctions/CRC.h" #include "fsfw/serialize/SerializeAdapter.h" -#include "mission/devices/devicedefinitions/SpBase.h" namespace mpsoc { diff --git a/linux/devices/devicedefinitions/PlocSupervisorDefinitions.h b/linux/payload/plocSupvDefs.h similarity index 99% rename from linux/devices/devicedefinitions/PlocSupervisorDefinitions.h rename to linux/payload/plocSupvDefs.h index ffc310f0..d3fda3da 100644 --- a/linux/devices/devicedefinitions/PlocSupervisorDefinitions.h +++ b/linux/payload/plocSupvDefs.h @@ -8,11 +8,11 @@ #include #include #include +#include #include #include "eive/resultClassIds.h" -#include "mission/devices/devicedefinitions/SpBase.h" namespace supv { diff --git a/linux/csp/CMakeLists.txt b/linux/power/CMakeLists.txt similarity index 100% rename from linux/csp/CMakeLists.txt rename to linux/power/CMakeLists.txt diff --git a/linux/csp/CspComIF.cpp b/linux/power/CspComIF.cpp similarity index 99% rename from linux/csp/CspComIF.cpp rename to linux/power/CspComIF.cpp index 554ecba0..1b1cd0a0 100644 --- a/linux/csp/CspComIF.cpp +++ b/linux/power/CspComIF.cpp @@ -1,17 +1,15 @@ -#include "CspComIF.h" - #include #include #include -#include +#include +#include +#include #include #include #include #include #include -#include "mission/csp/CspCookie.h" - using namespace GOMSPACE; CspComIF::CspComIF(object_id_t objectId, const char* routeTaskName, uint32_t routerRealTimePriority) diff --git a/linux/csp/CspComIF.h b/linux/power/CspComIF.h similarity index 96% rename from linux/csp/CspComIF.h rename to linux/power/CspComIF.h index 47712230..615064c2 100644 --- a/linux/csp/CspComIF.h +++ b/linux/power/CspComIF.h @@ -1,5 +1,5 @@ -#ifndef LINUX_CSP_CSPCOMIF_H_ -#define LINUX_CSP_CSPCOMIF_H_ +#ifndef LINUX_POWER_CSPCOMIF_H_ +#define LINUX_POWER_CSPCOMIF_H_ #include #include @@ -90,4 +90,4 @@ class CspComIF : public DeviceCommunicationIF, public SystemObject { static void *routerWorkWrapper(void *args); }; -#endif /* LINUX_CSP_CSPCOMIF_H_ */ +#endif /* LINUX_POWER_CSPCOMIF_H_ */ diff --git a/linux/tcs/CMakeLists.txt b/linux/tcs/CMakeLists.txt new file mode 100644 index 00000000..3721f02a --- /dev/null +++ b/linux/tcs/CMakeLists.txt @@ -0,0 +1 @@ +target_sources(${OBSW_NAME} PUBLIC Max31865RtdPolling.cpp) diff --git a/linux/devices/Max31865RtdPolling.cpp b/linux/tcs/Max31865RtdPolling.cpp similarity index 99% rename from linux/devices/Max31865RtdPolling.cpp rename to linux/tcs/Max31865RtdPolling.cpp index db13a76c..f8ec7ed9 100644 --- a/linux/devices/Max31865RtdPolling.cpp +++ b/linux/tcs/Max31865RtdPolling.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #define OBSW_RTD_AUTO_MODE 1 diff --git a/linux/devices/Max31865RtdPolling.h b/linux/tcs/Max31865RtdPolling.h similarity index 98% rename from linux/devices/Max31865RtdPolling.h rename to linux/tcs/Max31865RtdPolling.h index ef73fb8b..e865d66d 100644 --- a/linux/devices/Max31865RtdPolling.h +++ b/linux/tcs/Max31865RtdPolling.h @@ -6,10 +6,10 @@ #include #include #include +#include #include "devConf.h" #include "fsfw/devicehandlers/DeviceCommunicationIF.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" struct Max31865ReaderCookie : public CookieIF { Max31865ReaderCookie(){}; diff --git a/mission/CMakeLists.txt b/mission/CMakeLists.txt index bb1e800d..bb7cf140 100644 --- a/mission/CMakeLists.txt +++ b/mission/CMakeLists.txt @@ -1,13 +1,17 @@ add_subdirectory(controller) -add_subdirectory(core) -add_subdirectory(devices) add_subdirectory(utility) add_subdirectory(memory) add_subdirectory(tmtc) add_subdirectory(system) -add_subdirectory(csp) +add_subdirectory(com) +add_subdirectory(acs) +add_subdirectory(power) +add_subdirectory(tcs) +add_subdirectory(payload) add_subdirectory(cfdp) add_subdirectory(config) -target_sources(${LIB_EIVE_MISSION} PRIVATE acsDefs.cpp payloadDefs.cpp - trace.cpp) +target_sources( + ${LIB_EIVE_MISSION} + PRIVATE SolarArrayDeploymentHandler.cpp genericFactory.cpp + pollingSeqTables.cpp scheduling.cpp) diff --git a/mission/devices/SolarArrayDeploymentHandler.cpp b/mission/SolarArrayDeploymentHandler.cpp similarity index 99% rename from mission/devices/SolarArrayDeploymentHandler.cpp rename to mission/SolarArrayDeploymentHandler.cpp index 81807351..b8ec4d77 100644 --- a/mission/devices/SolarArrayDeploymentHandler.cpp +++ b/mission/SolarArrayDeploymentHandler.cpp @@ -1,7 +1,7 @@ -#include "SolarArrayDeploymentHandler.h" - #include #include +#include +#include #include #include @@ -11,14 +11,13 @@ #include "fsfw/ipc/QueueFactory.h" #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw_hal/common/gpio/GpioCookie.h" -#include "mission/trace.h" static constexpr bool DEBUG_MODE = true; SolarArrayDeploymentHandler::SolarArrayDeploymentHandler(object_id_t setObjectId_, GpioIF& gpioInterface, PowerSwitchIF& mainLineSwitcher_, - pcdu::Switches mainLineSwitch_, + power::Switches mainLineSwitch_, gpioId_t deplSA1, gpioId_t deplSA2, SdCardMountedIF& sdcMountedIF) : SystemObject(setObjectId_), diff --git a/mission/devices/SolarArrayDeploymentHandler.h b/mission/SolarArrayDeploymentHandler.h similarity index 99% rename from mission/devices/SolarArrayDeploymentHandler.h rename to mission/SolarArrayDeploymentHandler.h index 61211ca3..6be3affa 100644 --- a/mission/devices/SolarArrayDeploymentHandler.h +++ b/mission/SolarArrayDeploymentHandler.h @@ -2,6 +2,7 @@ #define MISSION_DEVICES_SOLARARRAYDEPLOYMENT_H_ #include +#include #include @@ -19,7 +20,6 @@ #include "fsfw/timemanager/Countdown.h" #include "fsfw_hal/common/gpio/GpioIF.h" #include "mission/memory/SdCardMountedIF.h" -#include "mission/trace.h" #include "returnvalues/classIds.h" enum DeploymentChannels : uint8_t { SA_1 = 1, SA_2 = 2 }; @@ -107,7 +107,7 @@ class SolarArrayDeploymentHandler : public ExecutableObjectIF, * @param burnTimeMs Time duration the power will be applied to the burn wires. */ SolarArrayDeploymentHandler(object_id_t setObjectId, GpioIF& gpio, - PowerSwitchIF& mainLineSwitcher, pcdu::Switches mainLineSwitch, + PowerSwitchIF& mainLineSwitcher, power::Switches mainLineSwitch, gpioId_t deplSA1, gpioId_t deplSA2, SdCardMountedIF& sdcMountedIF); virtual ~SolarArrayDeploymentHandler(); diff --git a/mission/acs/CMakeLists.txt b/mission/acs/CMakeLists.txt new file mode 100644 index 00000000..e518d948 --- /dev/null +++ b/mission/acs/CMakeLists.txt @@ -0,0 +1,18 @@ +target_sources( + ${LIB_EIVE_MISSION} + PRIVATE GyrAdis1650XHandler.cpp + GyrL3gCustomHandler.cpp + ImtqHandler.cpp + MgmLis3CustomHandler.cpp + MgmRm3100CustomHandler.cpp + RwHandler.cpp + SusHandler.cpp + gyroAdisHelpers.cpp + imtqHelpers.cpp + rwHelpers.cpp + defs.cpp) + +# Dependency on proprietary library +if(TGT_BSP MATCHES "arm/q7s") + add_subdirectory(str) +endif() diff --git a/mission/devices/GyrAdis1650XHandler.cpp b/mission/acs/GyrAdis1650XHandler.cpp similarity index 96% rename from mission/devices/GyrAdis1650XHandler.cpp rename to mission/acs/GyrAdis1650XHandler.cpp index 7d576238..57033e80 100644 --- a/mission/devices/GyrAdis1650XHandler.cpp +++ b/mission/acs/GyrAdis1650XHandler.cpp @@ -1,8 +1,8 @@ -#include "mission/devices/GyrAdis1650XHandler.h" +#include "GyrAdis1650XHandler.h" #include "fsfw/action/HasActionsIF.h" #include "fsfw/datapool/PoolReadGuard.h" -#include "mission/devices/devicedefinitions/acsPolling.h" +#include "mission/acs/acsBoardPolling.h" GyrAdis1650XHandler::GyrAdis1650XHandler(object_id_t objectId, object_id_t deviceCommunication, CookieIF *comCookie, adis1650x::Type type) @@ -28,11 +28,7 @@ void GyrAdis1650XHandler::doStartUp() { } if (breakCountdown.hasTimedOut()) { updatePeriodicReply(true, adis1650x::REPLY); - if (goToNormalMode) { - setMode(MODE_NORMAL); - } else { - setMode(MODE_ON); - } + setMode(MODE_ON); internalState = InternalState::NONE; } } @@ -91,12 +87,11 @@ ReturnValue_t GyrAdis1650XHandler::scanForReply(const uint8_t *start, size_t rem getMode() == _MODE_POWER_DOWN) { return IGNORE_FULL_PACKET; } + *foundLen = remainingSize; if (remainingSize != sizeof(acs::Adis1650XReply)) { - *foundLen = remainingSize; return returnvalue::FAILED; } *foundId = adis1650x::REPLY; - *foundLen = remainingSize; if (internalState == InternalState::SHUTDOWN) { commandExecuted = true; } @@ -208,8 +203,6 @@ adis1650x::BurstModes GyrAdis1650XHandler::getBurstMode() { return adis1650x::burstModeFromMscCtrl(currentCtrlReg); } -void GyrAdis1650XHandler::setToGoToNormalModeImmediately() { goToNormalMode = true; } - void GyrAdis1650XHandler::enablePeriodicPrintouts(bool enable, uint8_t divider) { periodicPrintout = enable; debugDivider.setDivider(divider); diff --git a/mission/devices/GyrAdis1650XHandler.h b/mission/acs/GyrAdis1650XHandler.h similarity index 93% rename from mission/devices/GyrAdis1650XHandler.h rename to mission/acs/GyrAdis1650XHandler.h index 020dcd6e..5d906f61 100644 --- a/mission/devices/GyrAdis1650XHandler.h +++ b/mission/acs/GyrAdis1650XHandler.h @@ -1,8 +1,8 @@ #ifndef MISSION_DEVICES_GYROADIS16507HANDLER_H_ #define MISSION_DEVICES_GYROADIS16507HANDLER_H_ -#include -#include +#include +#include #include "FSFWConfig.h" #include "OBSWConfig.h" @@ -21,7 +21,6 @@ class GyrAdis1650XHandler : public DeviceHandlerBase { adis1650x::Type type); void enablePeriodicPrintouts(bool enable, uint8_t divider); - void setToGoToNormalModeImmediately(); // DeviceHandlerBase abstract function implementation void doStartUp() override; @@ -47,7 +46,6 @@ class GyrAdis1650XHandler : public DeviceHandlerBase { AdisGyroConfigDataset configDataset; double sensitivity = adis1650x::SENSITIVITY_UNSET; - bool goToNormalMode = false; bool warningSwitch = true; enum class InternalState { NONE, STARTUP, SHUTDOWN }; diff --git a/mission/devices/GyrL3gCustomHandler.cpp b/mission/acs/GyrL3gCustomHandler.cpp similarity index 94% rename from mission/devices/GyrL3gCustomHandler.cpp rename to mission/acs/GyrL3gCustomHandler.cpp index d3624bdf..934fba99 100644 --- a/mission/devices/GyrL3gCustomHandler.cpp +++ b/mission/acs/GyrL3gCustomHandler.cpp @@ -1,10 +1,10 @@ -#include +#include +#include #include #include "fsfw/datapool/PoolReadGuard.h" -#include "mission/devices/devicedefinitions/acsPolling.h" GyrL3gCustomHandler::GyrL3gCustomHandler(object_id_t objectId, object_id_t deviceCommunication, CookieIF *comCookie, uint32_t transitionDelayMs) @@ -23,11 +23,7 @@ void GyrL3gCustomHandler::doStartUp() { if (internalState == InternalState::STARTUP) { if (commandExecuted) { - if (goNormalModeImmediately) { - setMode(MODE_NORMAL); - } else { - setMode(_MODE_TO_ON); - } + setMode(MODE_ON); internalState = InternalState::NONE; commandExecuted = false; } @@ -103,12 +99,11 @@ ReturnValue_t GyrL3gCustomHandler::scanForReply(const uint8_t *start, size_t len if (getMode() == _MODE_WAIT_OFF or getMode() == _MODE_WAIT_ON or getMode() == _MODE_POWER_DOWN) { return IGNORE_FULL_PACKET; } + *foundLen = len; if (len != sizeof(acs::GyroL3gReply)) { - *foundLen = len; return returnvalue::FAILED; } - *foundId = l3gd20h::REPLY; - *foundLen = len; + *foundId = adis1650x::REPLY; if (internalState == InternalState::SHUTDOWN) { commandExecuted = true; } @@ -145,8 +140,6 @@ uint32_t GyrL3gCustomHandler::getTransitionDelayMs(Mode_t from, Mode_t to) { return this->transitionDelayMs; } -void GyrL3gCustomHandler::setToGoToNormalMode(bool enable) { this->goNormalModeImmediately = true; } - ReturnValue_t GyrL3gCustomHandler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { localDataPoolMap.emplace(l3gd20h::ANG_VELOC_X, new PoolEntry({0.0})); diff --git a/mission/devices/GyrL3gCustomHandler.h b/mission/acs/GyrL3gCustomHandler.h similarity index 93% rename from mission/devices/GyrL3gCustomHandler.h rename to mission/acs/GyrL3gCustomHandler.h index 5f840cfc..08d1b706 100644 --- a/mission/devices/GyrL3gCustomHandler.h +++ b/mission/acs/GyrL3gCustomHandler.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include /** * @brief Device Handler for the L3GD20H gyroscope sensor @@ -32,11 +32,6 @@ class GyrL3gCustomHandler : public DeviceHandlerBase { */ void setAbsoluteLimits(float limitX, float limitY, float limitZ); - /** - * @brief Configure device handler to go to normal mode immediately - */ - void setToGoToNormalMode(bool enable); - protected: /* DeviceHandlerBase overrides */ ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override; @@ -69,7 +64,6 @@ class GyrL3gCustomHandler : public DeviceHandlerBase { bool commandExecuted = false; uint8_t statusReg = 0; - bool goNormalModeImmediately = false; uint8_t ctrlReg1Value = l3gd20h::CTRL_REG_1_VAL; uint8_t ctrlReg2Value = l3gd20h::CTRL_REG_2_VAL; diff --git a/mission/devices/ImtqHandler.cpp b/mission/acs/ImtqHandler.cpp similarity index 98% rename from mission/devices/ImtqHandler.cpp rename to mission/acs/ImtqHandler.cpp index 46a2c53a..ca76a5d7 100644 --- a/mission/devices/ImtqHandler.cpp +++ b/mission/acs/ImtqHandler.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include @@ -30,8 +30,9 @@ static constexpr bool ACTUATION_WIRETAPPING = false; ImtqHandler::ImtqHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, - power::Switch_t pwrSwitcher) + power::Switch_t pwrSwitcher, bool enableHkSets) : DeviceHandlerBase(objectId, comIF, comCookie), + enableHkSets(enableHkSets), statusSet(this), dipoleSet(*this), rawMtmNoTorque(this), @@ -150,19 +151,25 @@ void ImtqHandler::doStartUp() { } void ImtqHandler::doShutDown() { - updatePeriodicReply(false, imtq::cmdIds::REPLY_NO_TORQUE); - updatePeriodicReply(false, imtq::cmdIds::REPLY_WITH_TORQUE); - specialRequestActive = false; - firstReplyCycle = true; - internalState = InternalState::NONE; - commandExecuted = false; - statusSet.setValidity(false, true); - rawMtmNoTorque.setValidity(false, true); - rawMtmWithTorque.setValidity(false, true); - hkDatasetNoTorque.setValidity(false, true); - hkDatasetWithTorque.setValidity(false, true); - calMtmMeasurementSet.setValidity(false, true); - setMode(_MODE_POWER_DOWN); + if (internalState != InternalState::SHUTDOWN) { + commandExecuted = false; + internalState = InternalState::SHUTDOWN; + } + if (internalState == InternalState::SHUTDOWN and commandExecuted) { + updatePeriodicReply(false, imtq::cmdIds::REPLY_NO_TORQUE); + updatePeriodicReply(false, imtq::cmdIds::REPLY_WITH_TORQUE); + specialRequestActive = false; + firstReplyCycle = true; + internalState = InternalState::NONE; + commandExecuted = false; + statusSet.setValidity(false, true); + rawMtmNoTorque.setValidity(false, true); + rawMtmWithTorque.setValidity(false, true); + hkDatasetNoTorque.setValidity(false, true); + hkDatasetWithTorque.setValidity(false, true); + calMtmMeasurementSet.setValidity(false, true); + setMode(_MODE_POWER_DOWN); + } } ReturnValue_t ImtqHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { @@ -177,7 +184,7 @@ ReturnValue_t ImtqHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { } default: { *id = imtq::cmdIds::REQUEST; - request.request = imtq::RequestType::DO_NOTHING; + request.requestType = imtq::RequestType::DO_NOTHING; request.specialRequest = imtq::SpecialRequest::NONE; expectedReply = DeviceHandlerIF::NO_COMMAND_ID; rawPacket = reinterpret_cast(&request); @@ -189,7 +196,7 @@ ReturnValue_t ImtqHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { } ReturnValue_t ImtqHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { - if (internalState == InternalState::STARTUP) { + if (internalState == InternalState::STARTUP or internalState == InternalState::SHUTDOWN) { *id = imtq::cmdIds::REQUEST; return buildCommandFromCommand(*id, nullptr, 0); } @@ -200,7 +207,7 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma const uint8_t* commandData, size_t commandDataLen) { auto genericSpecialRequest = [&](imtq::SpecialRequest specialRequest) { - request.request = imtq::RequestType::MEASURE_NO_ACTUATION; + request.requestType = imtq::RequestType::MEASURE_NO_ACTUATION; request.specialRequest = specialRequest; expectedReply = imtq::cmdIds::REPLY_NO_TORQUE; specialRequestActive = true; @@ -237,9 +244,16 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma return returnvalue::OK; } case (imtq::cmdIds::REQUEST): { - request.request = imtq::RequestType::MEASURE_NO_ACTUATION; + request.requestType = imtq::RequestType::MEASURE_NO_ACTUATION; request.specialRequest = imtq::SpecialRequest::NONE; + // 6 ms integration time instead of 10 ms. + request.integrationTimeSel = 2; expectedReply = imtq::cmdIds::REPLY_NO_TORQUE; + if (internalState == InternalState::SHUTDOWN) { + request.mode = acs::SimpleSensorMode::OFF; + } else { + request.mode = acs::SimpleSensorMode::NORMAL; + } rawPacket = reinterpret_cast(&request); rawPacketLen = sizeof(imtq::Request); return returnvalue::OK; @@ -266,7 +280,7 @@ ReturnValue_t ImtqHandler::buildCommandFromCommand(DeviceCommandId_t deviceComma } expectedReply = imtq::cmdIds::REPLY_WITH_TORQUE; - request.request = imtq::RequestType::ACTUATE; + request.requestType = imtq::RequestType::ACTUATE; request.specialRequest = imtq::SpecialRequest::NONE; std::memcpy(request.dipoles, dipoleSet.dipoles.value, sizeof(request.dipoles)); request.torqueDuration = dipoleSet.currentTorqueDurationMs.value; @@ -308,6 +322,9 @@ ReturnValue_t ImtqHandler::scanForReply(const uint8_t* start, size_t remainingSi if (getMode() == _MODE_WAIT_OFF or getMode() == _MODE_WAIT_ON or getMode() == _MODE_POWER_DOWN) { return IGNORE_FULL_PACKET; } + if (internalState == InternalState::SHUTDOWN) { + commandExecuted = true; + } if (remainingSize > 0) { *foundLen = remainingSize; *foundId = expectedReply; @@ -778,9 +795,9 @@ ReturnValue_t ImtqHandler::initializeLocalDataPool(localpool::DataPool& localDat localDataPoolMap.emplace(imtq::FINA_NEG_Z_COIL_Z_TEMPERATURE, new PoolEntry({0})); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(hkDatasetNoTorque.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(hkDatasetNoTorque.getSid(), enableHkSets, 30.0)); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(hkDatasetWithTorque.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(hkDatasetWithTorque.getSid(), enableHkSets, 30.0)); poolManager.subscribeForDiagPeriodicPacket( subdp::DiagnosticsHkPeriodicParams(rawMtmNoTorque.getSid(), false, 10.0)); poolManager.subscribeForDiagPeriodicPacket( diff --git a/mission/devices/ImtqHandler.h b/mission/acs/ImtqHandler.h similarity index 98% rename from mission/devices/ImtqHandler.h rename to mission/acs/ImtqHandler.h index e337f40c..b435e499 100644 --- a/mission/devices/ImtqHandler.h +++ b/mission/acs/ImtqHandler.h @@ -2,7 +2,7 @@ #define MISSION_DEVICES_IMTQHANDLER_H_ #include -#include +#include #include #include "events/subsystemIdRanges.h" @@ -18,7 +18,7 @@ class ImtqHandler : public DeviceHandlerBase { enum NormalPollingMode { UNCALIBRATED = 0, CALIBRATED = 1, BOTH = 2 }; ImtqHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, - power::Switch_t pwrSwitcher); + power::Switch_t pwrSwitcher, bool enableHkSets); virtual ~ImtqHandler(); void setPollingMode(NormalPollingMode pollMode); @@ -85,6 +85,7 @@ class ImtqHandler : public DeviceHandlerBase { enum class InternalState { NONE, STARTUP, SHUTDOWN } internalState = InternalState::NONE; bool commandExecuted = false; + bool enableHkSets = false; imtq::Request request{}; diff --git a/mission/devices/MgmLis3CustomHandler.cpp b/mission/acs/MgmLis3CustomHandler.cpp similarity index 98% rename from mission/devices/MgmLis3CustomHandler.cpp rename to mission/acs/MgmLis3CustomHandler.cpp index 151d321d..d1dd5eff 100644 --- a/mission/devices/MgmLis3CustomHandler.cpp +++ b/mission/acs/MgmLis3CustomHandler.cpp @@ -1,4 +1,4 @@ -#include +#include "MgmLis3CustomHandler.h" #include @@ -20,7 +20,7 @@ void MgmLis3CustomHandler::doStartUp() { } if (internalState == InternalState::STARTUP) { if (commandExecuted) { - setMode(MODE_NORMAL); + setMode(MODE_ON); internalState = InternalState::NONE; commandExecuted = false; } diff --git a/mission/devices/MgmLis3CustomHandler.h b/mission/acs/MgmLis3CustomHandler.h similarity index 98% rename from mission/devices/MgmLis3CustomHandler.h rename to mission/acs/MgmLis3CustomHandler.h index 15c87e0f..06ab6d73 100644 --- a/mission/devices/MgmLis3CustomHandler.h +++ b/mission/acs/MgmLis3CustomHandler.h @@ -5,7 +5,7 @@ #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" -#include "mission/devices/devicedefinitions/acsPolling.h" +#include "mission/acs/acsBoardPolling.h" class PeriodicOperationDivider; diff --git a/mission/devices/MgmRm3100CustomHandler.cpp b/mission/acs/MgmRm3100CustomHandler.cpp similarity index 98% rename from mission/devices/MgmRm3100CustomHandler.cpp rename to mission/acs/MgmRm3100CustomHandler.cpp index f6f86950..e57effda 100644 --- a/mission/devices/MgmRm3100CustomHandler.cpp +++ b/mission/acs/MgmRm3100CustomHandler.cpp @@ -1,4 +1,4 @@ -#include +#include "MgmRm3100CustomHandler.h" #include "fsfw/datapool/PoolReadGuard.h" #include "fsfw/devicehandlers/DeviceHandlerMessage.h" @@ -25,7 +25,7 @@ void MgmRm3100CustomHandler::doStartUp() { if (commandExecuted) { commandExecuted = false; internalState = InternalState::NONE; - setMode(MODE_NORMAL); + setMode(MODE_ON); } } } diff --git a/mission/devices/MgmRm3100CustomHandler.h b/mission/acs/MgmRm3100CustomHandler.h similarity index 98% rename from mission/devices/MgmRm3100CustomHandler.h rename to mission/acs/MgmRm3100CustomHandler.h index 4c0c98b3..3cb4559e 100644 --- a/mission/devices/MgmRm3100CustomHandler.h +++ b/mission/acs/MgmRm3100CustomHandler.h @@ -5,7 +5,7 @@ #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" -#include "mission/devices/devicedefinitions/acsPolling.h" +#include "mission/acs/acsBoardPolling.h" /** * @brief Device Handler for the RM3100 geomagnetic magnetometer sensor diff --git a/mission/devices/RwHandler.cpp b/mission/acs/RwHandler.cpp similarity index 99% rename from mission/devices/RwHandler.cpp rename to mission/acs/RwHandler.cpp index e70152dd..5ba5d7a3 100644 --- a/mission/devices/RwHandler.cpp +++ b/mission/acs/RwHandler.cpp @@ -33,6 +33,7 @@ void RwHandler::doStartUp() { sif::debug << "RwHandler::doStartUp: Failed to pull enable gpio to high"; } updatePeriodicReply(true, rws::REPLY_ID); + statusSet.setReportingEnabled(true); setMode(_MODE_TO_ON); } @@ -48,6 +49,7 @@ void RwHandler::doShutDown() { statusSet.referenceSpeed = 0.0; statusSet.state = 0; statusSet.setValidity(false, true); + statusSet.setReportingEnabled(false); } { PoolReadGuard pg(&tmDataset); @@ -304,7 +306,7 @@ ReturnValue_t RwHandler::initializeLocalDataPool(localpool::DataPool& localDataP localDataPoolMap.emplace(rws::SPI_REG_OVERRUN_ERRORS, new PoolEntry({0})); localDataPoolMap.emplace(rws::SPI_TOTAL_ERRORS, new PoolEntry({0})); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(statusSet.getSid(), false, 5.0)); + subdp::DiagnosticsHkPeriodicParams(statusSet.getSid(), false, 12.0)); poolManager.subscribeForRegularPeriodicPacket( subdp::RegularHkPeriodicParams(tmDataset.getSid(), false, 30.0)); poolManager.subscribeForRegularPeriodicPacket( diff --git a/mission/devices/RwHandler.h b/mission/acs/RwHandler.h similarity index 98% rename from mission/devices/RwHandler.h rename to mission/acs/RwHandler.h index cdb72de1..0537ef8c 100644 --- a/mission/devices/RwHandler.h +++ b/mission/acs/RwHandler.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include "events/subsystemIdRanges.h" diff --git a/mission/devices/SusHandler.cpp b/mission/acs/SusHandler.cpp similarity index 98% rename from mission/devices/SusHandler.cpp rename to mission/acs/SusHandler.cpp index 886c7cec..0032a11d 100644 --- a/mission/devices/SusHandler.cpp +++ b/mission/acs/SusHandler.cpp @@ -1,6 +1,6 @@ #include "SusHandler.h" -#include +#include #include @@ -20,7 +20,7 @@ void SusHandler::doStartUp() { } if (internalState == InternalState::STARTUP) { if (commandExecuted) { - setMode(MODE_NORMAL); + setMode(MODE_ON); internalState = InternalState::NONE; commandExecuted = false; } diff --git a/mission/devices/SusHandler.h b/mission/acs/SusHandler.h similarity index 95% rename from mission/devices/SusHandler.h rename to mission/acs/SusHandler.h index 6eb781db..ad7d7a17 100644 --- a/mission/devices/SusHandler.h +++ b/mission/acs/SusHandler.h @@ -3,11 +3,11 @@ #include #include +#include #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" -#include "mission/devices/devicedefinitions/acsPolling.h" -#include "mission/devices/devicedefinitions/susMax1227Helpers.h" +#include "mission/acs/acsBoardPolling.h" class SusHandler : public DeviceHandlerBase { public: diff --git a/mission/devices/devicedefinitions/acsPolling.h b/mission/acs/acsBoardPolling.h similarity index 97% rename from mission/devices/devicedefinitions/acsPolling.h rename to mission/acs/acsBoardPolling.h index 612512a7..90f0f19c 100644 --- a/mission/devices/devicedefinitions/acsPolling.h +++ b/mission/acs/acsBoardPolling.h @@ -1,13 +1,13 @@ #ifndef MISSION_DEVICES_DEVICEDEFINITIONS_ACSPOLLING_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_ACSPOLLING_H_ +#include + #include "fsfw/thermal/tcsDefinitions.h" #include "gyroAdisHelpers.h" namespace acs { -enum SimpleSensorMode { NORMAL = 0, OFF = 1 }; - struct Adis1650XRequest { SimpleSensorMode mode; adis1650x::Type type; diff --git a/mission/devices/devicedefinitions/GPSDefinitions.h b/mission/acs/archive/GPSDefinitions.h similarity index 94% rename from mission/devices/devicedefinitions/GPSDefinitions.h rename to mission/acs/archive/GPSDefinitions.h index 80e2861a..d9f93173 100644 --- a/mission/devices/devicedefinitions/GPSDefinitions.h +++ b/mission/acs/archive/GPSDefinitions.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ +#ifndef MISSION_ACS_ARCHIVE_GPSDEFINITIONS_H_ +#define MISSION_ACS_ARCHIVE_GPSDEFINITIONS_H_ #include "eive/eventSubsystemIds.h" #include "fsfw/datapoollocal/StaticLocalDataSet.h" @@ -72,4 +72,4 @@ class GpsPrimaryDataset : public StaticLocalDataSet<18> { : StaticLocalDataSet(hkOwner, GpsHyperion::DATASET_ID) {} }; -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GPSDEFINITIONS_H_ */ +#endif /* MISSION_ACS_ARCHIVE_GPSDEFINITIONS_H_ */ diff --git a/mission/devices/GPSHyperionHandler.cpp b/mission/acs/archive/GPSHyperionHandler.cpp similarity index 99% rename from mission/devices/GPSHyperionHandler.cpp rename to mission/acs/archive/GPSHyperionHandler.cpp index 1bc34959..16451ae3 100644 --- a/mission/devices/GPSHyperionHandler.cpp +++ b/mission/acs/archive/GPSHyperionHandler.cpp @@ -1,6 +1,7 @@ #include "GPSHyperionHandler.h" -#include "devicedefinitions/GPSDefinitions.h" +#include + #include "fsfw/datapool/PoolReadGuard.h" #include "fsfw/timemanager/Clock.h" #include "lwgps/lwgps.h" diff --git a/mission/devices/GPSHyperionHandler.h b/mission/acs/archive/GPSHyperionHandler.h similarity index 97% rename from mission/devices/GPSHyperionHandler.h rename to mission/acs/archive/GPSHyperionHandler.h index b5734f23..cbc36fb6 100644 --- a/mission/devices/GPSHyperionHandler.h +++ b/mission/acs/archive/GPSHyperionHandler.h @@ -1,7 +1,8 @@ #ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_ #define MISSION_DEVICES_GPSHYPERIONHANDLER_H_ -#include "devicedefinitions/GPSDefinitions.h" +#include + #include "fsfw/FSFW.h" #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "lwgps/lwgps.h" diff --git a/mission/devices/LegacySusHandler.cpp b/mission/acs/archive/LegacySusHandler.cpp similarity index 100% rename from mission/devices/LegacySusHandler.cpp rename to mission/acs/archive/LegacySusHandler.cpp diff --git a/mission/devices/LegacySusHandler.h b/mission/acs/archive/LegacySusHandler.h similarity index 97% rename from mission/devices/LegacySusHandler.h rename to mission/acs/archive/LegacySusHandler.h index 5a16d180..e9968e39 100644 --- a/mission/devices/LegacySusHandler.h +++ b/mission/acs/archive/LegacySusHandler.h @@ -2,11 +2,11 @@ #define MISSION_DEVICES_LEGACYSUSHANDLER_H_ #include -#include +#include +#include #include "events/subsystemIdRanges.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" -#include "mission/devices/max1227.h" #include "returnvalues/classIds.h" /** diff --git a/mission/acsDefs.cpp b/mission/acs/defs.cpp similarity index 97% rename from mission/acsDefs.cpp rename to mission/acs/defs.cpp index 4027896c..f90df9a3 100644 --- a/mission/acsDefs.cpp +++ b/mission/acs/defs.cpp @@ -1,4 +1,4 @@ -#include "acsDefs.h" +#include "defs.h" const char* acs::getModeStr(AcsMode mode) { static const char* modeStr = "UNKNOWN"; diff --git a/mission/acsDefs.h b/mission/acs/defs.h similarity index 97% rename from mission/acsDefs.h rename to mission/acs/defs.h index 6097db32..8523c683 100644 --- a/mission/acsDefs.h +++ b/mission/acs/defs.h @@ -6,6 +6,8 @@ namespace acs { +enum class SimpleSensorMode { NORMAL = 0, OFF = 1 }; + // These modes are the modes of the ACS controller and of the ACS subsystem. enum AcsMode : Mode_t { OFF = HasModesIF::MODE_OFF, diff --git a/mission/devices/devicedefinitions/gyroAdisHelpers.cpp b/mission/acs/gyroAdisHelpers.cpp similarity index 100% rename from mission/devices/devicedefinitions/gyroAdisHelpers.cpp rename to mission/acs/gyroAdisHelpers.cpp diff --git a/mission/devices/devicedefinitions/gyroAdisHelpers.h b/mission/acs/gyroAdisHelpers.h similarity index 100% rename from mission/devices/devicedefinitions/gyroAdisHelpers.h rename to mission/acs/gyroAdisHelpers.h diff --git a/mission/devices/devicedefinitions/imtqHelpers.cpp b/mission/acs/imtqHelpers.cpp similarity index 79% rename from mission/devices/devicedefinitions/imtqHelpers.cpp rename to mission/acs/imtqHelpers.cpp index 758cfe23..a222eb76 100644 --- a/mission/devices/devicedefinitions/imtqHelpers.cpp +++ b/mission/acs/imtqHelpers.cpp @@ -1,5 +1,26 @@ #include "imtqHelpers.h" +uint16_t imtq::integrationTimeFromSelectValue(uint8_t value) { + switch (value) { + case (0): + return 2; + case (1): + return 3; + case (2): + return 6; + case (3): + return 10; + case (4): + return 20; + case (5): + return 40; + case (6): + return 80; + default: + return 10; + } +} + size_t imtq::getReplySize(CC::CC cc, size_t* optSecondSize) { switch (cc) { // Software reset is a bit special and can also cause a I2C NAK because diff --git a/mission/devices/devicedefinitions/imtqHelpers.h b/mission/acs/imtqHelpers.h similarity index 99% rename from mission/devices/devicedefinitions/imtqHelpers.h rename to mission/acs/imtqHelpers.h index 87b69f8b..38530d3c 100644 --- a/mission/devices/devicedefinitions/imtqHelpers.h +++ b/mission/acs/imtqHelpers.h @@ -5,11 +5,17 @@ #include #include #include +#include class ImtqHandler; +// C garbage which can be included from gps.h +#undef STATUS_SET + namespace imtq { +uint16_t integrationTimeFromSelectValue(uint8_t value); + enum class RequestType : uint8_t { MEASURE_NO_ACTUATION, ACTUATE, DO_NOTHING }; enum class SpecialRequest : uint8_t { @@ -24,7 +30,8 @@ enum class SpecialRequest : uint8_t { }; struct Request { - imtq::RequestType request = imtq::RequestType::MEASURE_NO_ACTUATION; + acs::SimpleSensorMode mode = acs::SimpleSensorMode::OFF; + imtq::RequestType requestType = imtq::RequestType::MEASURE_NO_ACTUATION; imtq::SpecialRequest specialRequest = imtq::SpecialRequest::NONE; uint8_t integrationTimeSel = 3; int16_t dipoles[3]{}; @@ -54,9 +61,10 @@ static const ReturnValue_t CC_UNAVAILABLE = MAKE_RETURN_CODE(5); static const ReturnValue_t INTERNAL_PROCESSING_ERROR = MAKE_RETURN_CODE(6); static const ReturnValue_t REJECTED_WITHOUT_REASON = MAKE_RETURN_CODE(7); static const ReturnValue_t CMD_ERR_UNKNOWN = MAKE_RETURN_CODE(8); +static constexpr ReturnValue_t STARTUP_CFG_ERROR = MAKE_RETURN_CODE(9); //! [EXPORT] : [COMMENT] The status reply to a self test command was received but no self test //! command has been sent. This should normally never happen. -static const ReturnValue_t UNEXPECTED_SELF_TEST_REPLY = MAKE_RETURN_CODE(0xA7); +static const ReturnValue_t UNEXPECTED_SELF_TEST_REPLY = MAKE_RETURN_CODE(10); namespace cmdIds { @@ -159,6 +167,13 @@ enum CC : uint8_t { } // namespace CC +namespace param { + +static constexpr uint16_t SEL_MTM = 0x2002; +static constexpr uint16_t INTEGRATION_TIME_SELECT = 0x2003; + +} // namespace param + size_t getReplySize(CC::CC cc, size_t* optSecondSize = nullptr); namespace mode { diff --git a/mission/devices/devicedefinitions/rwHelpers.cpp b/mission/acs/rwHelpers.cpp similarity index 100% rename from mission/devices/devicedefinitions/rwHelpers.cpp rename to mission/acs/rwHelpers.cpp diff --git a/mission/devices/devicedefinitions/rwHelpers.h b/mission/acs/rwHelpers.h similarity index 100% rename from mission/devices/devicedefinitions/rwHelpers.h rename to mission/acs/rwHelpers.h diff --git a/linux/devices/startracker/ArcsecDatalinkLayer.cpp b/mission/acs/str/ArcsecDatalinkLayer.cpp similarity index 97% rename from linux/devices/startracker/ArcsecDatalinkLayer.cpp rename to mission/acs/str/ArcsecDatalinkLayer.cpp index 29043e32..532c12b8 100644 --- a/linux/devices/startracker/ArcsecDatalinkLayer.cpp +++ b/mission/acs/str/ArcsecDatalinkLayer.cpp @@ -1,4 +1,4 @@ -#include "ArcsecDatalinkLayer.h" +#include ArcsecDatalinkLayer::ArcsecDatalinkLayer() : decodeRingBuf(BUFFER_LENGTHS, true) { slipInit(); } diff --git a/linux/devices/startracker/ArcsecDatalinkLayer.h b/mission/acs/str/ArcsecDatalinkLayer.h similarity index 97% rename from linux/devices/startracker/ArcsecDatalinkLayer.h rename to mission/acs/str/ArcsecDatalinkLayer.h index bfc82d90..404d9e52 100644 --- a/linux/devices/startracker/ArcsecDatalinkLayer.h +++ b/mission/acs/str/ArcsecDatalinkLayer.h @@ -3,11 +3,11 @@ #include #include +#include #include "arcsec/common/misc.h" #include "eive/resultClassIds.h" #include "fsfw/returnvalues/returnvalue.h" -#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h" /** * @brief Helper class to handle the datalinklayer of replies from the star tracker of arcsec. diff --git a/linux/devices/startracker/ArcsecJsonParamBase.cpp b/mission/acs/str/ArcsecJsonParamBase.cpp similarity index 97% rename from linux/devices/startracker/ArcsecJsonParamBase.cpp rename to mission/acs/str/ArcsecJsonParamBase.cpp index 04afb75f..b5dd2150 100644 --- a/linux/devices/startracker/ArcsecJsonParamBase.cpp +++ b/mission/acs/str/ArcsecJsonParamBase.cpp @@ -1,4 +1,5 @@ -#include "ArcsecJsonParamBase.h" +#include +#include #include "arcsecJsonKeys.h" diff --git a/linux/devices/startracker/ArcsecJsonParamBase.h b/mission/acs/str/ArcsecJsonParamBase.h similarity index 98% rename from linux/devices/startracker/ArcsecJsonParamBase.h rename to mission/acs/str/ArcsecJsonParamBase.h index ff457016..90c54f45 100644 --- a/linux/devices/startracker/ArcsecJsonParamBase.h +++ b/mission/acs/str/ArcsecJsonParamBase.h @@ -1,6 +1,8 @@ #ifndef BSP_Q7S_DEVICES_STARTRACKER_ARCSECJSONPARAMBASE_H_ #define BSP_Q7S_DEVICES_STARTRACKER_ARCSECJSONPARAMBASE_H_ +#include + #include #include #include @@ -9,7 +11,6 @@ #include "arcsec/common/genericstructs.h" #include "eive/resultClassIds.h" #include "fsfw/returnvalues/returnvalue.h" -#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h" using json = nlohmann::json; diff --git a/linux/devices/startracker/CMakeLists.txt b/mission/acs/str/CMakeLists.txt similarity index 62% rename from linux/devices/startracker/CMakeLists.txt rename to mission/acs/str/CMakeLists.txt index 24dbaf8e..edb3494c 100644 --- a/linux/devices/startracker/CMakeLists.txt +++ b/mission/acs/str/CMakeLists.txt @@ -1,4 +1,4 @@ target_sources( ${OBSW_NAME} PRIVATE StarTrackerHandler.cpp strJsonCommands.cpp ArcsecDatalinkLayer.cpp - ArcsecJsonParamBase.cpp StrComHandler.cpp helpers.cpp) + ArcsecJsonParamBase.cpp strHelpers.cpp) diff --git a/linux/devices/startracker/StarTrackerHandler.cpp b/mission/acs/str/StarTrackerHandler.cpp similarity index 97% rename from linux/devices/startracker/StarTrackerHandler.cpp rename to mission/acs/str/StarTrackerHandler.cpp index 448afc91..52751f24 100644 --- a/linux/devices/startracker/StarTrackerHandler.cpp +++ b/mission/acs/str/StarTrackerHandler.cpp @@ -1,10 +1,11 @@ -#include "StarTrackerHandler.h" - #include #include #include #include #include +#include +#include +#include #include #include @@ -12,8 +13,6 @@ #include "OBSWConfig.h" #include "arcsec/common/misc.h" -#include "helpers.h" -#include "strJsonCommands.h" std::atomic_bool JCFG_DONE(false); @@ -57,6 +56,49 @@ StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF, StarTrackerHandler::~StarTrackerHandler() {} +void StarTrackerHandler::doStartUp() { + switch (startupState) { + case StartupState::IDLE: + startupState = StartupState::CHECK_PROGRAM; + return; + case StartupState::BOOT_BOOTLOADER: + // This step is required in case the star tracker is already in firmware mode to harmonize + // the device handler's submode to the star tracker's mode + return; + case StartupState::DONE: + if (jcfgCountdown.isBusy()) { + startupState = StartupState::WAIT_JCFG; + return; + } + startupState = StartupState::IDLE; + break; + case StartupState::WAIT_JCFG: { + if (jcfgCountdown.hasTimedOut()) { + startupState = StartupState::IDLE; + break; + } + return; + } + default: + return; + } + solutionSet.setReportingEnabled(true); + startupState = StartupState::DONE; + internalState = InternalState::IDLE; + setMode(_MODE_TO_ON); +} + +void StarTrackerHandler::doShutDown() { + // If the star tracker is shutdown also stop all running processes in the image loader task + strHelper->stopProcess(); + internalState = InternalState::IDLE; + startupState = StartupState::IDLE; + bootState = FwBootState::NONE; + solutionSet.setReportingEnabled(false); + reinitNextSetParam = false; + setMode(_MODE_POWER_DOWN); +} + ReturnValue_t StarTrackerHandler::initialize() { ReturnValue_t result = returnvalue::OK; result = DeviceHandlerBase::initialize(); @@ -214,6 +256,8 @@ ReturnValue_t StarTrackerHandler::executeAction(ActionId_t actionId, MessageQueu default: break; } + // In case the JSON has changed, reinitiate the next parameter set to update. + reinitNextSetParam = true; return DeviceHandlerBase::executeAction(actionId, commandedBy, data, size); } @@ -235,46 +279,6 @@ void StarTrackerHandler::performOperationHook() { Submode_t StarTrackerHandler::getInitialSubmode() { return SUBMODE_BOOTLOADER; } -void StarTrackerHandler::doStartUp() { - switch (startupState) { - case StartupState::IDLE: - startupState = StartupState::CHECK_PROGRAM; - return; - case StartupState::BOOT_BOOTLOADER: - // This step is required in case the star tracker is already in firmware mode to harmonize - // the device handler's submode to the star tracker's mode - return; - case StartupState::DONE: - if (jcfgCountdown.isBusy()) { - startupState = StartupState::WAIT_JCFG; - return; - } - startupState = StartupState::IDLE; - break; - case StartupState::WAIT_JCFG: { - if (jcfgCountdown.hasTimedOut()) { - startupState = StartupState::IDLE; - break; - } - return; - } - default: - return; - } - startupState = StartupState::DONE; - internalState = InternalState::IDLE; - setMode(_MODE_TO_ON); -} - -void StarTrackerHandler::doShutDown() { - // If the star tracker is shutdown also stop all running processes in the image loader task - strHelper->stopProcess(); - internalState = InternalState::IDLE; - startupState = StartupState::IDLE; - bootState = FwBootState::NONE; - setMode(_MODE_POWER_DOWN); -} - ReturnValue_t StarTrackerHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { if (strHelperHandlingSpecialRequest) { return NOTHING_TO_SEND; @@ -312,6 +316,8 @@ ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t if (bootCountdown.isBusy()) { return NOTHING_TO_SEND; } + // Was already done. + reinitNextSetParam = false; bootState = FwBootState::REQ_VERSION; } switch (bootState) { @@ -460,7 +466,8 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi return returnvalue::OK; } case (startracker::SUBSCRIPTION): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.subscription); + result = + prepareParamCommand(commandData, commandDataLen, jcfgs.subscription, reinitNextSetParam); return returnvalue::OK; } case (startracker::REQ_SOLUTION): { @@ -476,55 +483,60 @@ ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t devi return returnvalue::OK; } case (startracker::LIMITS): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.limits); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.limits, reinitNextSetParam); return result; } case (startracker::MOUNTING): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.mounting); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.mounting, reinitNextSetParam); return result; } case (startracker::IMAGE_PROCESSOR): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.imageProcessor); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.imageProcessor, + reinitNextSetParam); return result; } case (startracker::CAMERA): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.camera); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.camera, reinitNextSetParam); return result; } case (startracker::CENTROIDING): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.centroiding); + result = + prepareParamCommand(commandData, commandDataLen, jcfgs.centroiding, reinitNextSetParam); return result; } case (startracker::LISA): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.lisa); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.lisa, reinitNextSetParam); return result; } case (startracker::MATCHING): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.matching); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.matching, reinitNextSetParam); return result; } case (startracker::VALIDATION): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.validation); + result = + prepareParamCommand(commandData, commandDataLen, jcfgs.validation, reinitNextSetParam); return result; } case (startracker::ALGO): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.algo); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.algo, reinitNextSetParam); return result; } case (startracker::TRACKING): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.tracking); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.tracking, reinitNextSetParam); return result; } case (startracker::LOGLEVEL): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.logLevel); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.logLevel, reinitNextSetParam); return result; } case (startracker::LOGSUBSCRIPTION): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.logSubscription); + result = prepareParamCommand(commandData, commandDataLen, jcfgs.logSubscription, + reinitNextSetParam); return result; } case (startracker::DEBUG_CAMERA): { - result = prepareParamCommand(commandData, commandDataLen, jcfgs.debugCamera); + result = + prepareParamCommand(commandData, commandDataLen, jcfgs.debugCamera, reinitNextSetParam); return result; } case (startracker::CHECKSUM): { @@ -819,7 +831,6 @@ void StarTrackerHandler::bootBootloader() { ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) { ReturnValue_t result = returnvalue::OK; - size_t bytesLeft = 0; if (remainingSize == 0) { *foundLen = remainingSize; @@ -831,26 +842,26 @@ ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t rema return returnvalue::FAILED; } - switch (str::getReplyFrameType(start)) { + switch (startracker::getReplyFrameType(start)) { case TMTC_ACTIONREPLY: { - *foundLen = remainingSize - bytesLeft; - result = scanForActionReply(str::getId(start), foundId); + *foundLen = remainingSize; + return scanForActionReply(startracker::getId(start), foundId); break; } case TMTC_SETPARAMREPLY: { - *foundLen = remainingSize - bytesLeft; - result = scanForSetParameterReply(str::getId(start), foundId); + *foundLen = remainingSize; + return scanForSetParameterReply(startracker::getId(start), foundId); break; } case TMTC_PARAMREPLY: { - *foundLen = remainingSize - bytesLeft; - result = scanForGetParameterReply(str::getId(start), foundId); + *foundLen = remainingSize; + return scanForGetParameterReply(startracker::getId(start), foundId); break; } case TMTC_TELEMETRYREPLYA: case TMTC_TELEMETRYREPLY: { - *foundLen = remainingSize - bytesLeft; - result = scanForTmReply(str::getId(start), foundId); + *foundLen = remainingSize; + return scanForTmReply(startracker::getId(start), foundId); break; } default: { @@ -858,9 +869,6 @@ ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t* start, size_t rema result = returnvalue::FAILED; } } - - remainingSize = bytesLeft; - return result; } @@ -1271,7 +1279,7 @@ ReturnValue_t StarTrackerHandler::initializeLocalDataPool(localpool::DataPool& l poolManager.subscribeForRegularPeriodicPacket( subdp::RegularHkPeriodicParams(interfaceSet.getSid(), false, 10.0)); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(solutionSet.getSid(), false, 5.0)); + subdp::DiagnosticsHkPeriodicParams(solutionSet.getSid(), false, 12.0)); poolManager.subscribeForRegularPeriodicPacket( subdp::RegularHkPeriodicParams(cameraSet.getSid(), false, 10.0)); poolManager.subscribeForRegularPeriodicPacket( @@ -1689,12 +1697,19 @@ void StarTrackerHandler::prepareHistogramRequest() { ReturnValue_t StarTrackerHandler::prepareParamCommand(const uint8_t* commandData, size_t commandDataLen, - ArcsecJsonParamBase& paramSet) { + ArcsecJsonParamBase& paramSet, + bool reinitSet) { // Stopwatch watch; ReturnValue_t result = returnvalue::OK; if (commandDataLen > MAX_PATH_SIZE) { return FILE_PATH_TOO_LONG; } + if (reinitSet) { + result = paramSet.init(paramJsonFile); + if (result != returnvalue::OK) { + return result; + } + } result = paramSet.create(commandBuffer); if (result != returnvalue::OK) { @@ -1818,7 +1833,7 @@ ReturnValue_t StarTrackerHandler::prepareRequestDebugCameraParams() { } ReturnValue_t StarTrackerHandler::handleSetParamReply(const uint8_t* rawFrame) { - uint8_t status = str::getStatusField(rawFrame); + uint8_t status = startracker::getStatusField(rawFrame); if (status != startracker::STATUS_OK) { sif::warning << "StarTrackerHandler::handleSetParamReply: Failed to execute parameter set " " command with parameter ID" @@ -1835,7 +1850,7 @@ ReturnValue_t StarTrackerHandler::handleSetParamReply(const uint8_t* rawFrame) { } ReturnValue_t StarTrackerHandler::handleActionReply(const uint8_t* rawFrame) { - uint8_t status = str::getStatusField(rawFrame); + uint8_t status = startracker::getStatusField(rawFrame); if (status != startracker::STATUS_OK) { sif::warning << "StarTrackerHandler::handleActionReply: Failed to execute action " << "command with action ID " @@ -1903,7 +1918,7 @@ ReturnValue_t StarTrackerHandler::handleParamRequest(const uint8_t* rawFrame, ReturnValue_t StarTrackerHandler::handlePingReply(const uint8_t* rawFrame) { ReturnValue_t result = returnvalue::OK; uint32_t pingId = 0; - uint8_t status = str::getStatusField(rawFrame); + uint8_t status = startracker::getStatusField(rawFrame); const uint8_t* buffer = rawFrame + ACTION_DATA_OFFSET; size_t size = sizeof(pingId); SerializeAdapter::deSerialize(&pingId, &buffer, &size, SerializeIF::Endianness::LITTLE); @@ -1956,7 +1971,7 @@ ReturnValue_t StarTrackerHandler::checkProgram() { ReturnValue_t StarTrackerHandler::handleTm(const uint8_t* rawFrame, LocalPoolDataSetBase& dataset, size_t size) { ReturnValue_t result = returnvalue::OK; - uint8_t status = str::getStatusField(rawFrame); + uint8_t status = startracker::getStatusField(rawFrame); if (status != startracker::STATUS_OK) { sif::warning << "StarTrackerHandler::handleTm: Reply error: " << static_cast(status) << std::endl; @@ -1987,7 +2002,7 @@ ReturnValue_t StarTrackerHandler::handleTm(const uint8_t* rawFrame, LocalPoolDat ReturnValue_t StarTrackerHandler::handleActionReplySet(const uint8_t* rawFrame, LocalPoolDataSetBase& dataset, size_t size) { ReturnValue_t result = returnvalue::OK; - uint8_t status = str::getStatusField(rawFrame); + uint8_t status = startracker::getStatusField(rawFrame); if (status != startracker::STATUS_OK) { sif::warning << "StarTrackerHandler::handleActionReplySet: Reply error: " << static_cast(status) << std::endl; diff --git a/linux/devices/startracker/StarTrackerHandler.h b/mission/acs/str/StarTrackerHandler.h similarity index 98% rename from linux/devices/startracker/StarTrackerHandler.h rename to mission/acs/str/StarTrackerHandler.h index 821aa3b2..69b3e121 100644 --- a/linux/devices/startracker/StarTrackerHandler.h +++ b/mission/acs/str/StarTrackerHandler.h @@ -2,19 +2,19 @@ #define MISSION_DEVICES_STARTRACKERHANDLER_H_ #include +#include +#include +#include +#include #include -#include "ArcsecJsonParamBase.h" #include "OBSWConfig.h" -#include "StrComHandler.h" #include "arcsec/common/SLIP.h" #include "devices/powerSwitcherList.h" #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw/src/fsfw/serialize/SerializeAdapter.h" #include "fsfw/timemanager/Countdown.h" -#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h" -#include "strJsonCommands.h" /** * @brief This is the device handler for the star tracker from arcsec. @@ -287,6 +287,8 @@ class StarTrackerHandler : public DeviceHandlerBase { InternalState internalState = InternalState::IDLE; + bool reinitNextSetParam = false; + bool strHelperHandlingSpecialRequest = false; const power::Switch_t powerSwitch = power::NO_SWITCH; @@ -409,7 +411,7 @@ class StarTrackerHandler : public DeviceHandlerBase { * @return returnvalue::OK if successful, otherwise error return Value */ ReturnValue_t prepareParamCommand(const uint8_t* commandData, size_t commandDataLen, - ArcsecJsonParamBase& paramSet); + ArcsecJsonParamBase& paramSet, bool reinitSet); /** * @brief The following function will fill the command buffer with the command to request diff --git a/linux/devices/startracker/arcsecJsonKeys.h b/mission/acs/str/arcsecJsonKeys.h similarity index 100% rename from linux/devices/startracker/arcsecJsonKeys.h rename to mission/acs/str/arcsecJsonKeys.h diff --git a/mission/acs/str/strHelpers.cpp b/mission/acs/str/strHelpers.cpp new file mode 100644 index 00000000..c6d59c7a --- /dev/null +++ b/mission/acs/str/strHelpers.cpp @@ -0,0 +1,7 @@ +#include + +uint8_t startracker::getReplyFrameType(const uint8_t* rawFrame) { return rawFrame[0]; } + +uint8_t startracker::getId(const uint8_t* rawFrame) { return rawFrame[1]; } + +uint8_t startracker::getStatusField(const uint8_t* rawFrame) { return rawFrame[2]; } diff --git a/linux/devices/devicedefinitions/StarTrackerDefinitions.h b/mission/acs/str/strHelpers.h similarity index 99% rename from linux/devices/devicedefinitions/StarTrackerDefinitions.h rename to mission/acs/str/strHelpers.h index be115a78..002d9934 100644 --- a/linux/devices/devicedefinitions/StarTrackerDefinitions.h +++ b/mission/acs/str/strHelpers.h @@ -11,6 +11,13 @@ namespace startracker { +/** + * @brief Returns the frame type field of a decoded frame. + */ +uint8_t getReplyFrameType(const uint8_t* rawFrame); +uint8_t getId(const uint8_t* rawFrame); +uint8_t getStatusField(const uint8_t* rawFrame); + /** This is the address of the star tracker */ static const uint8_t ADDRESS = 33; diff --git a/linux/devices/startracker/strJsonCommands.cpp b/mission/acs/str/strJsonCommands.cpp similarity index 99% rename from linux/devices/startracker/strJsonCommands.cpp rename to mission/acs/str/strJsonCommands.cpp index 0a47cb87..134a00a0 100644 --- a/linux/devices/startracker/strJsonCommands.cpp +++ b/mission/acs/str/strJsonCommands.cpp @@ -1,4 +1,5 @@ -#include "strJsonCommands.h" +#include +#include #include "arcsecJsonKeys.h" diff --git a/linux/devices/startracker/strJsonCommands.h b/mission/acs/str/strJsonCommands.h similarity index 98% rename from linux/devices/startracker/strJsonCommands.h rename to mission/acs/str/strJsonCommands.h index 381246a6..99588f9c 100644 --- a/linux/devices/startracker/strJsonCommands.h +++ b/mission/acs/str/strJsonCommands.h @@ -7,9 +7,10 @@ * @author J. Meier */ +#include + #include -#include "ArcsecJsonParamBase.h" #include "fsfw/serviceinterface/ServiceInterface.h" /** diff --git a/mission/devices/devicedefinitions/susMax1227Helpers.h b/mission/acs/susMax1227Helpers.h similarity index 100% rename from mission/devices/devicedefinitions/susMax1227Helpers.h rename to mission/acs/susMax1227Helpers.h diff --git a/mission/com/CMakeLists.txt b/mission/com/CMakeLists.txt new file mode 100644 index 00000000..90e90c88 --- /dev/null +++ b/mission/com/CMakeLists.txt @@ -0,0 +1,11 @@ +target_sources( + ${LIB_EIVE_MISSION} + PRIVATE SyrlinksHandler.cpp + CcsdsIpCoreHandler.cpp + LiveTmTask.cpp + PersistentLogTmStoreTask.cpp + TmStoreTaskBase.cpp + VirtualChannel.cpp + VirtualChannelWithQueue.cpp + PersistentSingleTmStoreTask.cpp + LiveTmTask.cpp) diff --git a/mission/tmtc/CcsdsIpCoreHandler.cpp b/mission/com/CcsdsIpCoreHandler.cpp similarity index 58% rename from mission/tmtc/CcsdsIpCoreHandler.cpp rename to mission/com/CcsdsIpCoreHandler.cpp index 1cb3e894..625c90cd 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.cpp +++ b/mission/com/CcsdsIpCoreHandler.cpp @@ -11,13 +11,15 @@ #include "fsfw/serialize/SerializeAdapter.h" #include "fsfw/serviceinterface/ServiceInterface.h" #include "fsfw/serviceinterface/serviceInterfaceDefintions.h" -#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" +#include "mission/com/syrlinksDefs.h" CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t tcDestination, PtmeConfig& ptmeConfig, std::atomic_bool& linkState, - GpioIF* gpioIF, PtmeGpios gpioIds) + GpioIF* gpioIF, PtmeGpios gpioIds, + std::atomic_bool& ptmeLocked) : SystemObject(objectId), linkState(linkState), + ptmeLocked(ptmeLocked), tcDestination(tcDestination), parameterHelper(this), actionHelper(this, nullptr), @@ -29,12 +31,14 @@ CcsdsIpCoreHandler::CcsdsIpCoreHandler(object_id_t objectId, object_id_t tcDesti auto mqArgs = MqArgs(objectId, static_cast(this)); eventQueue = QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); + ptmeLocked = true; } CcsdsIpCoreHandler::~CcsdsIpCoreHandler() = default; ReturnValue_t CcsdsIpCoreHandler::performOperation(uint8_t operationCode) { readCommandQueue(); + performPtmeUpdateWhenApplicable(); return returnvalue::OK; } @@ -71,11 +75,11 @@ ReturnValue_t CcsdsIpCoreHandler::initialize() { } // This also pulls the PTME out of reset state. - if (batPriorityParam == 0) { - disablePrioritySelectMode(); - } else { - enablePrioritySelectMode(); - } + updateBatPriorityFromParam(); + ptmeConfig.setPollThreshold( + static_cast(params.pollThresholdParam)); + resetPtme(); + ptmeLocked = false; #if OBSW_SYRLINKS_SIMULATED == 1 // Update data on rising edge @@ -117,7 +121,10 @@ ReturnValue_t CcsdsIpCoreHandler::getParameter(uint8_t domainId, uint8_t uniqueI ParameterWrapper* parameterWrapper, const ParameterWrapper* newValues, uint16_t startAtIndex) { - if ((domainId == 0) and (uniqueIdentifier == ParamId::BAT_PRIORITY)) { + if (domainId != 0) { + return HasParametersIF::INVALID_DOMAIN_ID; + } + if (uniqueIdentifier == ParamId::BAT_PRIORITY) { uint8_t newVal = 0; ReturnValue_t result = newValues->getElement(&newVal); if (result != returnvalue::OK) { @@ -126,11 +133,33 @@ ReturnValue_t CcsdsIpCoreHandler::getParameter(uint8_t domainId, uint8_t uniqueI if (newVal > 1) { return HasParametersIF::INVALID_VALUE; } - parameterWrapper->set(batPriorityParam); - if (mode == MODE_ON) { - updateBatPriorityOnTxOff = true; - } else if (mode == MODE_OFF) { - updateBatPriorityFromParam(); + parameterWrapper->set(params.batPriorityParam); + if (newVal != params.batPriorityParam) { + // This ensures that the BAT priority is updated at some point when an update of the PTME is + // allowed + updateContext.updateBatPrio = true; + // If we are off, we can do the update after X cycles. Otherwise, wait until the transmitter + // goes off. + if (mode == MODE_OFF) { + initPtmeUpdateAfterXCycles(); + } + } + return returnvalue::OK; + } else if (uniqueIdentifier == ParamId::POLL_THRESHOLD) { + uint8_t newVal = 0; + ReturnValue_t result = newValues->getElement(&newVal); + if (result != returnvalue::OK) { + return result; + } + if (newVal > static_cast(AxiPtmeConfig::NEVER)) { + return HasParametersIF::INVALID_VALUE; + } + parameterWrapper->set(newVal); + if (newVal != params.pollThresholdParam) { + updateContext.updatePollThreshold = true; + if (mode == MODE_OFF) { + initPtmeUpdateAfterXCycles(); + } } return returnvalue::OK; } @@ -148,50 +177,33 @@ ReturnValue_t CcsdsIpCoreHandler::executeAction(ActionId_t actionId, MessageQueu const uint8_t* data, size_t size) { ReturnValue_t result = returnvalue::OK; switch (actionId) { - case SET_LOW_RATE: { - submode = static_cast(com::CcsdsSubmode::DATARATE_LOW); - result = ptmeConfig.setRate(RATE_100KBPS); - break; - } - case SET_HIGH_RATE: { - submode = static_cast(com::CcsdsSubmode::DATARATE_HIGH); - result = ptmeConfig.setRate(RATE_500KBPS); - break; - } case ARBITRARY_RATE: { uint32_t bitrate = 0; - SerializeAdapter::deSerialize(&bitrate, &data, &size, SerializeIF::Endianness::BIG); - result = ptmeConfig.setRate(bitrate); + result = SerializeAdapter::deSerialize(&bitrate, &data, &size, SerializeIF::Endianness::BIG); + if (result != returnvalue::OK) { + return result; + } + ptmeConfig.setRate(bitrate); + updateContext.updateClockRate = true; + if (mode == MODE_OFF) { + initPtmeUpdateAfterXCycles(); + } break; } - case EN_TRANSMITTER: { - enableTransmit(); - if (mode == HasModesIF::MODE_OFF) { - mode = HasModesIF::MODE_ON; - } - return EXECUTION_FINISHED; - } - case DISABLE_TRANSMITTER: { - disableTransmit(); - if (mode == HasModesIF::MODE_ON) { - mode = HasModesIF::MODE_OFF; - } - return EXECUTION_FINISHED; - } case ENABLE_TX_CLK_MANIPULATOR: { - result = ptmeConfig.configTxManipulator(true); + ptmeConfig.configTxManipulator(true); break; } case DISABLE_TX_CLK_MANIPULATOR: { - result = ptmeConfig.configTxManipulator(false); + ptmeConfig.configTxManipulator(false); break; } case UPDATE_ON_RISING_EDGE: { - result = ptmeConfig.invertTxClock(false); + ptmeConfig.invertTxClock(false); break; } case UPDATE_ON_FALLING_EDGE: { - result = ptmeConfig.invertTxClock(true); + ptmeConfig.invertTxClock(true); break; } default: @@ -206,12 +218,8 @@ ReturnValue_t CcsdsIpCoreHandler::executeAction(ActionId_t actionId, MessageQueu void CcsdsIpCoreHandler::updateLinkState() { linkState = LINK_UP; } void CcsdsIpCoreHandler::enableTransmit() { - // Reset PTME on each transmit enable. - updateBatPriorityFromParam(); -#ifndef TE0720_1CFA gpioIF->pullHigh(ptmeGpios.enableTxClock); gpioIF->pullHigh(ptmeGpios.enableTxData); -#endif linkState = LINK_UP; } @@ -236,34 +244,23 @@ ReturnValue_t CcsdsIpCoreHandler::checkModeCommand(Mode_t mode, Submode_t submod } void CcsdsIpCoreHandler::startTransition(Mode_t mode, Submode_t submode) { - auto rateSet = [&](uint32_t rate) { - ReturnValue_t result = ptmeConfig.setRate(rate); - if (result == returnvalue::OK) { - this->mode = HasModesIF::MODE_ON; - } - }; + triggerEvent(CHANGING_MODE, mode, submode); if (mode == HasModesIF::MODE_ON) { - enableTransmit(); - if (submode == static_cast(com::CcsdsSubmode::DATARATE_DEFAULT)) { - com::Datarate currentDatarate = com::getCurrentDatarate(); - if (currentDatarate == com::Datarate::LOW_RATE_MODULATION_BPSK) { - rateSet(RATE_100KBPS); - } else if (currentDatarate == com::Datarate::HIGH_RATE_MODULATION_0QPSK) { - rateSet(RATE_500KBPS); - } - } else if (submode == static_cast(com::CcsdsSubmode::DATARATE_HIGH)) { - rateSet(RATE_500KBPS); - } else if (submode == static_cast(com::CcsdsSubmode::DATARATE_LOW)) { - rateSet(RATE_100KBPS); + if (this->submode != submode) { + initPtmeUpdateAfterXCycles(); + updateContext.enableTransmitAfterPtmeUpdate = true; + updateContext.updateClockRate = true; + this->submode = submode; + this->mode = mode; + updateContext.setModeAfterUpdate = true; + return; } - + // No rate change, so enable transmitter right away. + enableTransmit(); } else if (mode == HasModesIF::MODE_OFF) { disableTransmit(); - this->mode = HasModesIF::MODE_OFF; } - this->submode = submode; - modeHelper.modeChanged(mode, submode); - announceMode(false); + setMode(mode, submode); } void CcsdsIpCoreHandler::announceMode(bool recursive) { triggerEvent(MODE_INFO, mode, submode); } @@ -274,9 +271,9 @@ void CcsdsIpCoreHandler::disableTransmit() { gpioIF->pullLow(ptmeGpios.enableTxData); #endif linkState = LINK_DOWN; - if (updateBatPriorityOnTxOff) { - updateBatPriorityFromParam(); - updateBatPriorityOnTxOff = false; + // Some parameters need update and transmitter is off now. + if (updateContext.updateBatPrio or updateContext.updateClockRate) { + initPtmeUpdateAfterXCycles(); } } @@ -294,26 +291,95 @@ ModeTreeChildIF& CcsdsIpCoreHandler::getModeTreeChildIF() { return *this; } object_id_t CcsdsIpCoreHandler::getObjectId() const { return SystemObject::getObjectId(); } -void CcsdsIpCoreHandler::enablePrioritySelectMode() { - ptmeConfig.enableBatPriorityBit(true); - // Reset the PTME - gpioIF->pullLow(ptmeGpios.ptmeResetn); - usleep(10); - gpioIF->pullHigh(ptmeGpios.ptmeResetn); -} +void CcsdsIpCoreHandler::enablePrioritySelectMode() { ptmeConfig.enableBatPriorityBit(true); } -void CcsdsIpCoreHandler::disablePrioritySelectMode() { - ptmeConfig.enableBatPriorityBit(false); - // Reset the PTME - gpioIF->pullLow(ptmeGpios.ptmeResetn); - usleep(10); - gpioIF->pullHigh(ptmeGpios.ptmeResetn); -} +void CcsdsIpCoreHandler::disablePrioritySelectMode() { ptmeConfig.enableBatPriorityBit(false); } void CcsdsIpCoreHandler::updateBatPriorityFromParam() { - if (batPriorityParam == 0) { + if (params.batPriorityParam == 0) { disablePrioritySelectMode(); } else { enablePrioritySelectMode(); } } + +void CcsdsIpCoreHandler::setMode(Mode_t mode, Submode_t submode) { + this->submode = submode; + this->mode = mode; + modeHelper.modeChanged(mode, submode); + announceMode(false); +} + +void CcsdsIpCoreHandler::performPtmeUpdateWhenApplicable() { + if (not updateContext.performPtmeUpdateAfterXCycles) { + return; + } + if (updateContext.ptmeUpdateCycleCount >= 2) { + bool doResetPtme = false; + if (updateContext.updateBatPrio) { + updateBatPriorityFromParam(); + updateContext.updateBatPrio = false; + doResetPtme = true; + } + if (updateContext.updatePollThreshold) { + ptmeConfig.setPollThreshold( + static_cast(params.pollThresholdParam)); + updateContext.updatePollThreshold = false; + doResetPtme = true; + } + ReturnValue_t result = returnvalue::OK; + if (updateContext.updateClockRate) { + if (submode == static_cast(com::CcsdsSubmode::DATARATE_DEFAULT)) { + com::Datarate currentDatarate = com::getCurrentDatarate(); + if (currentDatarate == com::Datarate::LOW_RATE_MODULATION_BPSK) { + result = ptmeConfig.setRate(RATE_100KBPS); + } else if (currentDatarate == com::Datarate::HIGH_RATE_MODULATION_0QPSK) { + result = ptmeConfig.setRate(RATE_500KBPS); + } + } else if (submode == static_cast(com::CcsdsSubmode::DATARATE_HIGH)) { + result = ptmeConfig.setRate(RATE_500KBPS); + } else if (submode == static_cast(com::CcsdsSubmode::DATARATE_LOW)) { + result = ptmeConfig.setRate(RATE_100KBPS); + } + if (result != returnvalue::OK) { + sif::error << "CcsdsIpCoreHandler: Setting datarate failed" << std::endl; + } + updateContext.updateClockRate = false; + doResetPtme = true; + } + finishPtmeUpdateAfterXCycles(doResetPtme); + return; + } + updateContext.ptmeUpdateCycleCount++; +} + +void CcsdsIpCoreHandler::resetPtme() { + gpioIF->pullLow(ptmeGpios.ptmeResetn); + usleep(10); + gpioIF->pullHigh(ptmeGpios.ptmeResetn); +} + +void CcsdsIpCoreHandler::initPtmeUpdateAfterXCycles() { + if (not updateContext.performPtmeUpdateAfterXCycles) { + updateContext.performPtmeUpdateAfterXCycles = true; + updateContext.ptmeUpdateCycleCount = 0; + ptmeLocked = true; + } +} + +void CcsdsIpCoreHandler::finishPtmeUpdateAfterXCycles(bool doResetPtme) { + if (doResetPtme) { + resetPtme(); + } + ptmeLocked = false; + updateContext.performPtmeUpdateAfterXCycles = false; + updateContext.ptmeUpdateCycleCount = 0; + if (updateContext.enableTransmitAfterPtmeUpdate) { + enableTransmit(); + updateContext.enableTransmitAfterPtmeUpdate = false; + } + if (updateContext.setModeAfterUpdate) { + setMode(mode, submode); + updateContext.setModeAfterUpdate = false; + } +} diff --git a/mission/tmtc/CcsdsIpCoreHandler.h b/mission/com/CcsdsIpCoreHandler.h similarity index 83% rename from mission/tmtc/CcsdsIpCoreHandler.h rename to mission/com/CcsdsIpCoreHandler.h index 8d203081..a5d02ad0 100644 --- a/mission/tmtc/CcsdsIpCoreHandler.h +++ b/mission/com/CcsdsIpCoreHandler.h @@ -2,7 +2,7 @@ #define CCSDSHANDLER_H_ #include -#include +#include #include #include @@ -23,7 +23,7 @@ #include "fsfw_hal/common/gpio/GpioIF.h" #include "fsfw_hal/common/gpio/gpioDefinitions.h" #include "linux/ipcore/PtmeConfig.h" -#include "mission/comDefs.h" +#include "mission/com/defs.h" struct PtmeGpios { gpioId_t enableTxClock = gpio::NO_GPIO; @@ -36,6 +36,10 @@ struct PtmeGpios { * programmable logic of the Q7S. * * @details + * From a system view, OFF means that the transmitter is off, on means that the transmitter is on. + * The handler will only take care of the IP configuration, the actual swithing and configuration + * of the COM hardware (Syrlinks for the EIVE project) will be done in a separate device handler. + * * After reboot default CADU bitrate is always set to 100 kbps (results in downlink rate * of 200 kbps due to convolutional code added by syrlinks transceiver). The IP core handler exposes * a parameter to enable the priority selection mode for the PTME core. @@ -56,7 +60,7 @@ class CcsdsIpCoreHandler : public SystemObject, public ReceivesParameterMessagesIF, public HasActionsIF { public: - enum ParamId : uint8_t { BAT_PRIORITY = 0 }; + enum ParamId : uint8_t { BAT_PRIORITY = 0, POLL_THRESHOLD = 1 }; static const bool LINK_UP = true; static const bool LINK_DOWN = false; @@ -75,7 +79,8 @@ class CcsdsIpCoreHandler : public SystemObject, * @param enTxData GPIO ID of RS485 tx data enable */ CcsdsIpCoreHandler(object_id_t objectId, object_id_t tcDestination, PtmeConfig& ptmeConfig, - std::atomic_bool& linkState, GpioIF* gpioIF, PtmeGpios gpioIds); + std::atomic_bool& linkState, GpioIF* gpioIF, PtmeGpios gpioIds, + std::atomic_bool& ptmeLocked); ~CcsdsIpCoreHandler(); @@ -133,9 +138,8 @@ class CcsdsIpCoreHandler : public SystemObject, //! [EXPORT] : [COMMENT] Received action message with unknown action id static const ReturnValue_t COMMAND_NOT_IMPLEMENTED = MAKE_RETURN_CODE(0xA0); - // using VirtualChannelMap = std::unordered_map; - // VirtualChannelMap virtualChannelMap; std::atomic_bool& linkState; + std::atomic_bool& ptmeLocked; object_id_t tcDestination; @@ -152,9 +156,22 @@ class CcsdsIpCoreHandler : public SystemObject, PtmeConfig& ptmeConfig; PtmeGpios ptmeGpios; - // BAT priority bit on by default to enable priority selection mode for the PTME. - uint8_t batPriorityParam = 0; - bool updateBatPriorityOnTxOff = false; + struct Parameters { + // BAT priority bit on by default to enable priority selection mode for the PTME. + uint8_t batPriorityParam = 0; + uint8_t pollThresholdParam = static_cast(AxiPtmeConfig::IdlePollThreshold::POLL_4); + + } params; + + struct UpdateContext { + bool updateBatPrio = false; + bool updateClockRate = false; + bool updatePollThreshold = false; + bool enableTransmitAfterPtmeUpdate = false; + uint8_t ptmeUpdateCycleCount = 0; + bool performPtmeUpdateAfterXCycles = false; + bool setModeAfterUpdate = false; + } updateContext{}; GpioIF* gpioIF = nullptr; @@ -176,6 +193,8 @@ class CcsdsIpCoreHandler : public SystemObject, */ void disableTransmit(); + void performPtmeUpdateWhenApplicable(); + /** * The following set of functions configure the mode of the PTME bandwith allocation table (BAT) * module. This consists of the following 2 steps: @@ -185,6 +204,11 @@ class CcsdsIpCoreHandler : public SystemObject, void enablePrioritySelectMode(); void disablePrioritySelectMode(); void updateBatPriorityFromParam(); + + void setMode(Mode_t mode, Submode_t submode); + void resetPtme(); + void initPtmeUpdateAfterXCycles(); + void finishPtmeUpdateAfterXCycles(bool doResetPtme); }; #endif /* CCSDSHANDLER_H_ */ diff --git a/mission/com/LiveTmTask.cpp b/mission/com/LiveTmTask.cpp new file mode 100644 index 00000000..d09c6ced --- /dev/null +++ b/mission/com/LiveTmTask.cpp @@ -0,0 +1,107 @@ +#include "LiveTmTask.h" + +#include +#include +#include +#include + +LiveTmTask::LiveTmTask(object_id_t objectId, PusTmFunnel& pusFunnel, CfdpTmFunnel& cfdpFunnel, + VirtualChannelWithQueue& channel, const std::atomic_bool& ptmeLocked) + : SystemObject(objectId), + modeHelper(this), + pusFunnel(pusFunnel), + cfdpFunnel(cfdpFunnel), + channel(channel), + ptmeLocked(ptmeLocked) { + requestQueue = QueueFactory::instance()->createMessageQueue(); +} + +ReturnValue_t LiveTmTask::performOperation(uint8_t opCode) { + readCommandQueue(); + while (true) { + bool performWriteOp = true; + if (mode == MODE_OFF or ptmeLocked) { + performWriteOp = false; + } + + // The funnel tasks are scheduled here directly as well. + ReturnValue_t result = channel.handleNextTm(performWriteOp); + if (result == DirectTmSinkIF::IS_BUSY) { + sif::error << "Lost live TM, PAPB busy" << std::endl; + } + if (result == MessageQueueIF::EMPTY) { + if (tmFunnelCd.hasTimedOut()) { + pusFunnel.performOperation(0); + cfdpFunnel.performOperation(0); + tmFunnelCd.resetTimer(); + } + // Read command queue during idle times. + readCommandQueue(); + // 40 ms IDLE delay. Might tweak this in the future. + TaskFactory::delayTask(40); + } else { + packetCounter++; + } + } +} + +MessageQueueId_t LiveTmTask::getCommandQueue() const { return requestQueue->getId(); } + +void LiveTmTask::getMode(Mode_t* mode, Submode_t* submode) { + if (mode != nullptr) { + *mode = this->mode; + } + if (submode != nullptr) { + *submode = SUBMODE_NONE; + } +} + +ReturnValue_t LiveTmTask::checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t* msToReachTheMode) { + if (mode == MODE_ON or mode == MODE_OFF) { + return returnvalue::OK; + } + return returnvalue::FAILED; +} + +void LiveTmTask::startTransition(Mode_t mode, Submode_t submode) { + this->mode = mode; + modeHelper.modeChanged(mode, submode); + announceMode(false); +} + +void LiveTmTask::announceMode(bool recursive) { triggerEvent(MODE_INFO, mode, SUBMODE_NONE); } + +object_id_t LiveTmTask::getObjectId() const { return SystemObject::getObjectId(); } + +const HasHealthIF* LiveTmTask::getOptHealthIF() const { return nullptr; } + +const HasModesIF& LiveTmTask::getModeIF() const { return *this; } + +ReturnValue_t LiveTmTask::connectModeTreeParent(HasModeTreeChildrenIF& parent) { + return modetree::connectModeTreeParent(parent, *this, nullptr, modeHelper); +} + +void LiveTmTask::readCommandQueue(void) { + CommandMessage commandMessage; + ReturnValue_t result = returnvalue::FAILED; + + result = requestQueue->receiveMessage(&commandMessage); + if (result == returnvalue::OK) { + result = modeHelper.handleModeCommand(&commandMessage); + if (result == returnvalue::OK) { + return; + } + CommandMessage reply; + reply.setReplyRejected(CommandMessage::UNKNOWN_COMMAND, commandMessage.getCommand()); + requestQueue->reply(&reply); + return; + } +} + +ModeTreeChildIF& LiveTmTask::getModeTreeChildIF() { return *this; } + +ReturnValue_t LiveTmTask::initialize() { + modeHelper.initialize(); + return returnvalue::OK; +} diff --git a/mission/com/LiveTmTask.h b/mission/com/LiveTmTask.h new file mode 100644 index 00000000..c203f1de --- /dev/null +++ b/mission/com/LiveTmTask.h @@ -0,0 +1,57 @@ +#ifndef MISSION_TMTC_LIVETMTASK_H_ +#define MISSION_TMTC_LIVETMTASK_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class LiveTmTask : public SystemObject, + public HasModesIF, + public ExecutableObjectIF, + public ModeTreeChildIF, + public ModeTreeConnectionIF { + public: + LiveTmTask(object_id_t objectId, PusTmFunnel& pusFunnel, CfdpTmFunnel& cfdpFunnel, + VirtualChannelWithQueue& channel, const std::atomic_bool& ptmeLocked); + + ReturnValue_t performOperation(uint8_t opCode) override; + ReturnValue_t initialize() override; + ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF& parent) override; + + private: + MessageQueueIF* requestQueue; + ModeHelper modeHelper; + Mode_t mode = HasModesIF::MODE_OFF; + Countdown tmFunnelCd = Countdown(100); + PusTmFunnel& pusFunnel; + CfdpTmFunnel& cfdpFunnel; + VirtualChannelWithQueue& channel; + uint32_t packetCounter = 0; + const std::atomic_bool& ptmeLocked; + + void readCommandQueue(void); + + MessageQueueId_t getCommandQueue() const override; + + void getMode(Mode_t* mode, Submode_t* submode) override; + + ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t* msToReachTheMode) override; + + void startTransition(Mode_t mode, Submode_t submode) override; + + void announceMode(bool recursive) override; + + object_id_t getObjectId() const override; + const HasHealthIF* getOptHealthIF() const override; + const HasModesIF& getModeIF() const override; + ModeTreeChildIF& getModeTreeChildIF() override; +}; + +#endif /* MISSION_TMTC_LIVETMTASK_H_ */ diff --git a/mission/com/PersistentLogTmStoreTask.cpp b/mission/com/PersistentLogTmStoreTask.cpp new file mode 100644 index 00000000..0fc02461 --- /dev/null +++ b/mission/com/PersistentLogTmStoreTask.cpp @@ -0,0 +1,74 @@ +#include "PersistentLogTmStoreTask.h" + +#include +#include + +PersistentLogTmStoreTask::PersistentLogTmStoreTask(object_id_t objectId, StorageManagerIF& ipcStore, + LogStores stores, VirtualChannel& channel, + SdCardMountedIF& sdcMan, + const std::atomic_bool& ptmeLocked) + : TmStoreTaskBase(objectId, ipcStore, channel, sdcMan, ptmeLocked), + stores(stores), + okStoreContext(persTmStore::DUMP_OK_STORE_DONE, persTmStore::DUMP_OK_CANCELLED), + notOkStoreContext(persTmStore::DUMP_NOK_STORE_DONE, persTmStore::DUMP_NOK_CANCELLED), + miscStoreContext(persTmStore::DUMP_MISC_STORE_DONE, persTmStore::DUMP_MISC_CANCELLED) {} + +ReturnValue_t PersistentLogTmStoreTask::performOperation(uint8_t opCode) { + bool someonesBusy = false; + bool vcBusyDuringDump = false; + auto stateHandlingForStore = [&](bool storeIsBusy, DumpContext& ctx) { + if (storeIsBusy) { + someonesBusy = true; + } + if (fileHasSwapped) { + someFileWasSwapped = fileHasSwapped; + } + if (ctx.vcBusyDuringDump) { + vcBusyDuringDump = true; + } + }; + while (true) { + readCommandQueue(); + + if (not cyclicStoreCheck()) { + continue; + } + someonesBusy = false; + someFileWasSwapped = false; + vcBusyDuringDump = false; + stateHandlingForStore(handleOneStore(stores.okStore, okStoreContext), okStoreContext); + stateHandlingForStore(handleOneStore(stores.notOkStore, notOkStoreContext), notOkStoreContext); + stateHandlingForStore(handleOneStore(stores.miscStore, miscStoreContext), miscStoreContext); + if (not someonesBusy) { + TaskFactory::delayTask(100); + } else if (vcBusyDuringDump) { + // TODO: Might not be necessary + sif::debug << "VC busy, delaying" << std::endl; + TaskFactory::delayTask(10); + } + } +} + +bool PersistentLogTmStoreTask::initStoresIfPossible() { + if (sdcMan.isSdCardUsable(std::nullopt)) { + stores.okStore.initializeTmStore(); + stores.miscStore.initializeTmStore(); + stores.notOkStore.initializeTmStore(); + return true; + } + return false; +} + +void PersistentLogTmStoreTask::startTransition(Mode_t mode, Submode_t submode) { + if (mode == MODE_OFF) { + bool channelIsOn = channel.isTxOn(); + cancelDump(okStoreContext, stores.okStore, channelIsOn); + cancelDump(notOkStoreContext, stores.notOkStore, channelIsOn); + cancelDump(miscStoreContext, stores.miscStore, channelIsOn); + this->mode = MODE_OFF; + } else if (mode == MODE_ON) { + this->mode = MODE_ON; + } + modeHelper.modeChanged(mode, submode); + announceMode(false); +} diff --git a/mission/tmtc/PersistentLogTmStoreTask.h b/mission/com/PersistentLogTmStoreTask.h similarity index 80% rename from mission/tmtc/PersistentLogTmStoreTask.h rename to mission/com/PersistentLogTmStoreTask.h index 99cb9118..18da93f5 100644 --- a/mission/tmtc/PersistentLogTmStoreTask.h +++ b/mission/com/PersistentLogTmStoreTask.h @@ -5,11 +5,11 @@ #include #include #include -#include +#include +#include +#include #include #include -#include -#include struct LogStores { LogStores(PersistentTmStores& stores) @@ -22,7 +22,8 @@ struct LogStores { class PersistentLogTmStoreTask : public TmStoreTaskBase, public ExecutableObjectIF { public: PersistentLogTmStoreTask(object_id_t objectId, StorageManagerIF& ipcStore, LogStores tmStore, - VirtualChannel& channel, SdCardMountedIF& sdcMan); + VirtualChannel& channel, SdCardMountedIF& sdcMan, + const std::atomic_bool& ptmeLocked); ReturnValue_t performOperation(uint8_t opCode) override; @@ -35,7 +36,8 @@ class PersistentLogTmStoreTask : public TmStoreTaskBase, public ExecutableObject Countdown graceDelayDuringDumping = Countdown(200); bool someFileWasSwapped = false; - bool initStoresIfPossible(); + bool initStoresIfPossible() override; + void startTransition(Mode_t mode, Submode_t submode) override; }; #endif /* MISSION_TMTC_PERSISTENTLOGTMSTORETASK_H_ */ diff --git a/mission/com/PersistentSingleTmStoreTask.cpp b/mission/com/PersistentSingleTmStoreTask.cpp new file mode 100644 index 00000000..61173265 --- /dev/null +++ b/mission/com/PersistentSingleTmStoreTask.cpp @@ -0,0 +1,54 @@ +#include "PersistentSingleTmStoreTask.h" + +#include +#include +#include + +PersistentSingleTmStoreTask::PersistentSingleTmStoreTask( + object_id_t objectId, StorageManagerIF& ipcStore, PersistentTmStoreWithTmQueue& tmStore, + VirtualChannel& channel, Event eventIfDumpDone, Event eventIfCancelled, SdCardMountedIF& sdcMan, + const std::atomic_bool& ptmeLocked) + : TmStoreTaskBase(objectId, ipcStore, channel, sdcMan, ptmeLocked), + storeWithQueue(tmStore), + dumpContext(eventIfDumpDone, eventIfCancelled) {} + +ReturnValue_t PersistentSingleTmStoreTask::performOperation(uint8_t opCode) { + while (true) { + readCommandQueue(); + + // Delay done by the check + if (not cyclicStoreCheck()) { + continue; + } + bool busy = handleOneStore(storeWithQueue, dumpContext); + if (not busy) { + TaskFactory::delayTask(100); + } else if (dumpContext.vcBusyDuringDump) { + sif::debug << "VC busy, delaying" << std::endl; + // TODO: Might not be necessary + TaskFactory::delayTask(10); + } else { + // TODO: Would be best to remove this, but not delaying here can lead to evil issues. + TaskFactory::delayTask(2); + } + } +} + +bool PersistentSingleTmStoreTask::initStoresIfPossible() { + if (sdcMan.isSdCardUsable(std::nullopt)) { + storeWithQueue.initializeTmStore(); + return true; + } + return false; +} + +void PersistentSingleTmStoreTask::startTransition(Mode_t mode, Submode_t submode) { + if (mode == MODE_OFF) { + cancelDump(dumpContext, storeWithQueue, channel.isTxOn()); + this->mode = MODE_OFF; + } else if (mode == MODE_ON) { + this->mode = MODE_ON; + } + modeHelper.modeChanged(mode, submode); + announceMode(false); +} diff --git a/mission/tmtc/PersistentSingleTmStoreTask.h b/mission/com/PersistentSingleTmStoreTask.h similarity index 70% rename from mission/tmtc/PersistentSingleTmStoreTask.h rename to mission/com/PersistentSingleTmStoreTask.h index 7a4dd7ca..1a4c8683 100644 --- a/mission/tmtc/PersistentSingleTmStoreTask.h +++ b/mission/com/PersistentSingleTmStoreTask.h @@ -3,15 +3,16 @@ #include #include +#include +#include #include -#include -#include class PersistentSingleTmStoreTask : public TmStoreTaskBase, public ExecutableObjectIF { public: PersistentSingleTmStoreTask(object_id_t objectId, StorageManagerIF& ipcStore, PersistentTmStoreWithTmQueue& storeWithQueue, VirtualChannel& channel, - Event eventIfDumpDone, SdCardMountedIF& sdcMan); + Event eventIfDumpDone, Event eventIfCancelled, + SdCardMountedIF& sdcMan, const std::atomic_bool& ptmeLocked); ReturnValue_t performOperation(uint8_t opCode) override; @@ -21,7 +22,9 @@ class PersistentSingleTmStoreTask : public TmStoreTaskBase, public ExecutableObj Countdown tcHandlingCd = Countdown(400); Countdown graceDelayDuringDumping = Countdown(100); - bool initStoresIfPossible(); + bool initStoresIfPossible() override; + + void startTransition(Mode_t mode, Submode_t submode) override; }; #endif /* MISSION_TMTC_PERSISTENTSINGLETMSTORETASK_H_ */ diff --git a/mission/devices/SyrlinksHandler.cpp b/mission/com/SyrlinksHandler.cpp similarity index 87% rename from mission/devices/SyrlinksHandler.cpp rename to mission/com/SyrlinksHandler.cpp index edb2ae1f..6fbc8dc2 100644 --- a/mission/devices/SyrlinksHandler.cpp +++ b/mission/com/SyrlinksHandler.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include "OBSWConfig.h" #include "mission/config/comCfg.h" @@ -27,8 +27,9 @@ void SyrlinksHandler::doStartUp() { if (internalState == InternalState::ENABLE_TEMPERATURE_PROTECTION) { if (commandExecuted) { // Go to normal mode immediately and disable transmitter on startup. - setMode(_MODE_TO_NORMAL); + setMode(_MODE_TO_ON); internalState = InternalState::IDLE; + transState = TransitionState::IDLE; commandExecuted = false; } } @@ -36,14 +37,16 @@ void SyrlinksHandler::doStartUp() { void SyrlinksHandler::doShutDown() { // In any case, always disable TX first. - if (internalState != InternalState::SET_TX_STANDBY) { - internalState = InternalState::SET_TX_STANDBY; + if (internalState != InternalState::TX_TRANSITION) { + internalState = InternalState::TX_TRANSITION; + transState = TransitionState::SET_TX_STANDBY; commandExecuted = false; } - if (internalState == InternalState::SET_TX_STANDBY) { + if (internalState == InternalState::TX_TRANSITION) { if (commandExecuted) { temperatureSet.setValidity(false, true); internalState = InternalState::OFF; + transState = TransitionState::IDLE; commandExecuted = false; setMode(_MODE_POWER_DOWN); } @@ -97,33 +100,47 @@ ReturnValue_t SyrlinksHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { } ReturnValue_t SyrlinksHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { + if (transState == TransitionState::CMD_PENDING or transState == TransitionState::DONE) { + return NOTHING_TO_SEND; + } switch (internalState) { case InternalState::ENABLE_TEMPERATURE_PROTECTION: { *id = syrlinks::WRITE_LCL_CONFIG; + transState = TransitionState::CMD_PENDING; return buildCommandFromCommand(*id, nullptr, 0); } - case InternalState::SET_TX_MODULATION: { - *id = syrlinks::SET_TX_MODE_MODULATION; - return buildCommandFromCommand(*id, nullptr, 0); - } - case InternalState::SELECT_MODULATION_BPSK: { - *id = syrlinks::SET_WAVEFORM_BPSK; - return buildCommandFromCommand(*id, nullptr, 0); - } - case InternalState::SELECT_MODULATION_0QPSK: { - *id = syrlinks::SET_WAVEFORM_0QPSK; - return buildCommandFromCommand(*id, nullptr, 0); - } - case InternalState::SET_TX_CW: { - *id = syrlinks::SET_TX_MODE_CW; - return buildCommandFromCommand(*id, nullptr, 0); - } - case InternalState::SET_TX_STANDBY: { - *id = syrlinks::SET_TX_MODE_STANDBY; - return buildCommandFromCommand(*id, nullptr, 0); - } - default: + case InternalState::TX_TRANSITION: { + switch (transState) { + case TransitionState::SET_TX_MODULATION: { + *id = syrlinks::SET_TX_MODE_MODULATION; + return buildCommandFromCommand(*id, nullptr, 0); + } + case TransitionState::SELECT_MODULATION_BPSK: { + *id = syrlinks::SET_WAVEFORM_BPSK; + return buildCommandFromCommand(*id, nullptr, 0); + } + case TransitionState::SELECT_MODULATION_0QPSK: { + *id = syrlinks::SET_WAVEFORM_0QPSK; + return buildCommandFromCommand(*id, nullptr, 0); + } + case TransitionState::SET_TX_CW: { + *id = syrlinks::SET_TX_MODE_CW; + return buildCommandFromCommand(*id, nullptr, 0); + } + case TransitionState::SET_TX_STANDBY: { + *id = syrlinks::SET_TX_MODE_STANDBY; + return buildCommandFromCommand(*id, nullptr, 0); + } + default: { + return NOTHING_TO_SEND; + } + } + transState = TransitionState::CMD_PENDING; break; + } + default: { + break; + } } return NOTHING_TO_SEND; } @@ -442,7 +459,6 @@ ReturnValue_t SyrlinksHandler::interpretDeviceReply(DeviceCommandId_t id, const return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY; } } - return returnvalue::OK; } @@ -620,8 +636,6 @@ void SyrlinksHandler::parseAgcHighByte(const uint8_t* packet) { agcValueHighByte = convertHexStringToUint8(reinterpret_cast(packet + offset)); } -void SyrlinksHandler::setNormalDatapoolEntriesInvalid() {} - uint32_t SyrlinksHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 2500; } ReturnValue_t SyrlinksHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, @@ -641,16 +655,20 @@ ReturnValue_t SyrlinksHandler::initializeLocalDataPool(localpool::DataPool& loca localDataPoolMap.emplace(syrlinks::TEMP_BASEBAND_BOARD, new PoolEntry({0})); localDataPoolMap.emplace(syrlinks::TEMP_POWER_AMPLIFIER, new PoolEntry({0})); + bool enableHkSets = false; +#if OBSW_ENABLE_PERIODIC_HK == 1 + enableHkSets = true; +#endif poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(txDataset.getSid(), false, 5.0)); + subdp::DiagnosticsHkPeriodicParams(txDataset.getSid(), enableHkSets, 60.0)); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(rxDataset.getSid(), false, 5.0)); + subdp::DiagnosticsHkPeriodicParams(rxDataset.getSid(), enableHkSets, 60.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(temperatureSet.getSid(), false, 10.0)); + subdp::RegularHkPeriodicParams(temperatureSet.getSid(), enableHkSets, 120.0)); return returnvalue::OK; } -void SyrlinksHandler::setModeNormal() { setMode(MODE_NORMAL); } +void SyrlinksHandler::setModeNormal() { setMode(_MODE_TO_NORMAL); } float SyrlinksHandler::calcTempVal(uint16_t raw) { return 0.126984 * raw - 67.87; } @@ -669,15 +687,37 @@ ReturnValue_t SyrlinksHandler::handleAckReply(const uint8_t* packet) { break; } case (syrlinks::SET_WAVEFORM_BPSK): - case (syrlinks::SET_WAVEFORM_0QPSK): - case (syrlinks::SET_TX_MODE_STANDBY): - case (syrlinks::SET_TX_MODE_MODULATION): - case (syrlinks::SET_TX_MODE_CW): { + case (syrlinks::SET_WAVEFORM_0QPSK): { if (result == returnvalue::OK and isTransitionalMode()) { + transState = TransitionState::SET_TX_MODULATION; commandExecuted = true; } break; } + case (syrlinks::SET_TX_MODE_STANDBY): { + if (result == returnvalue::OK and isTransitionalMode()) { + transState = TransitionState::DONE; + commandExecuted = true; + } + break; + } + case (syrlinks::SET_TX_MODE_MODULATION): { + if (result == returnvalue::OK and isTransitionalMode()) { + transState = TransitionState::DONE; + commandExecuted = true; + } + break; + } + case (syrlinks::SET_TX_MODE_CW): { + if (result == returnvalue::OK and isTransitionalMode()) { + commandExecuted = true; + transState = TransitionState::DONE; + } + break; + } + default: { + sif::error << "Syrlinks: Unexpected ACK reply" << std::endl; + } } switch (rememberCommandId) { case (syrlinks::SET_TX_MODE_STANDBY): { @@ -695,7 +735,7 @@ ReturnValue_t SyrlinksHandler::handleAckReply(const uint8_t* packet) { ReturnValue_t SyrlinksHandler::isModeCombinationValid(Mode_t mode, Submode_t submode) { if (mode == HasModesIF::MODE_ON or mode == DeviceHandlerIF::MODE_NORMAL) { - if (submode >= com::Submode::NUM_SUBMODES) { + if (submode >= com::Submode::NUM_SUBMODES or submode < com::Submode::RX_ONLY) { return HasModesIF::INVALID_SUBMODE; } return returnvalue::OK; @@ -722,68 +762,54 @@ void SyrlinksHandler::setDebugMode(bool enable) { this->debugMode = enable; } void SyrlinksHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { Mode_t tgtMode = getBaseMode(getMode()); - auto commandDone = [&]() { - setMode(tgtMode); + auto doneHandler = [&]() { internalState = InternalState::IDLE; + transState = TransitionState::IDLE; + DeviceHandlerBase::doTransition(modeFrom, subModeFrom); }; - auto txOnHandler = [&](InternalState selMod) { - if (internalState == InternalState::IDLE) { - commandExecuted = false; - internalState = selMod; - } - // Select modulation first (BPSK or 0QPSK). - if (internalState == selMod) { - if (commandExecuted) { - internalState = InternalState::SET_TX_MODULATION; - commandExecuted = false; - } - } - // Now go into modulation mode. - if (internalState == InternalState::SET_TX_MODULATION) { - if (commandExecuted) { - commandDone(); - return true; - } - } - return false; - }; + if (transState == TransitionState::DONE) { + return doneHandler(); + } auto txStandbyHandler = [&]() { - if (internalState == InternalState::IDLE) { - internalState = InternalState::SET_TX_STANDBY; - commandExecuted = false; - } - if (internalState == InternalState::SET_TX_STANDBY) { - if (commandExecuted) { - commandDone(); - return; - } - } + txDataset.setReportingEnabled(false); + poolManager.changeCollectionInterval(temperatureSet.getSid(), 60.0); + transState = TransitionState::SET_TX_STANDBY; + internalState = InternalState::TX_TRANSITION; }; + auto txOnHandler = [&](TransitionState tgtTransitionState) { + txDataset.setReportingEnabled(true); + poolManager.changeCollectionInterval(txDataset.getSid(), 10.0); + poolManager.changeCollectionInterval(temperatureSet.getSid(), 5.0); + transState = tgtTransitionState; + internalState = InternalState::TX_TRANSITION; + }; + if (tgtMode == HasModesIF::MODE_ON or tgtMode == DeviceHandlerIF::MODE_NORMAL) { + // If submode has not changed, no special transition handling necessary. + if (getSubmode() == subModeFrom) { + return doneHandler(); + } + // Transition is on-going, wait for it to finish. + if (transState != TransitionState::IDLE) { + return; + } + // Transition start logic. switch (getSubmode()) { case (com::Submode::RX_AND_TX_DEFAULT_DATARATE): { auto currentDatarate = com::getCurrentDatarate(); if (currentDatarate == com::Datarate::LOW_RATE_MODULATION_BPSK) { - if (txOnHandler(InternalState::SELECT_MODULATION_BPSK)) { - return; - } + txOnHandler(TransitionState::SELECT_MODULATION_BPSK); } else if (currentDatarate == com::Datarate::HIGH_RATE_MODULATION_0QPSK) { - if (txOnHandler(InternalState::SELECT_MODULATION_0QPSK)) { - return; - } + txOnHandler(TransitionState::SELECT_MODULATION_0QPSK); } break; } case (com::Submode::RX_AND_TX_LOW_DATARATE): { - if (txOnHandler(InternalState::SELECT_MODULATION_BPSK)) { - return; - } + txOnHandler(TransitionState::SELECT_MODULATION_BPSK); break; } case (com::Submode::RX_AND_TX_HIGH_DATARATE): { - if (txOnHandler(InternalState::SELECT_MODULATION_0QPSK)) { - return; - } + txOnHandler(TransitionState::SELECT_MODULATION_0QPSK); break; } case (com::Submode::RX_ONLY): { @@ -791,21 +817,17 @@ void SyrlinksHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { return; } case (com::Submode::RX_AND_TX_CW): { - if (internalState == InternalState::IDLE) { - internalState = InternalState::SET_TX_STANDBY; - commandExecuted = false; - } - if (commandExecuted) { - commandDone(); - return; - } + txOnHandler(TransitionState::SET_TX_CW); break; } default: { - commandDone(); + sif::error << "SyrlinksHandler: Unexpected submode " << getSubmode() << std::endl; + DeviceHandlerBase::doTransition(modeFrom, subModeFrom); } } } else if (tgtMode == HasModesIF::MODE_OFF) { txStandbyHandler(); + } else { + return doneHandler(); } } diff --git a/mission/devices/SyrlinksHandler.h b/mission/com/SyrlinksHandler.h similarity index 97% rename from mission/devices/SyrlinksHandler.h rename to mission/com/SyrlinksHandler.h index ea5c0336..2c9d620f 100644 --- a/mission/devices/SyrlinksHandler.h +++ b/mission/com/SyrlinksHandler.h @@ -7,8 +7,8 @@ #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw/timemanager/Countdown.h" #include "fsfw_hal/linux/gpio/Gpio.h" -#include "mission/comDefs.h" -#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" +#include "mission/com/defs.h" +#include "mission/com/syrlinksDefs.h" #include "returnvalues/classIds.h" /** @@ -46,7 +46,6 @@ class SyrlinksHandler : public DeviceHandlerBase { size_t* foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override; ReturnValue_t getSwitches(const uint8_t** switches, uint8_t* numberOfSwitches) override; - void setNormalDatapoolEntriesInvalid() override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; @@ -118,15 +117,20 @@ class SyrlinksHandler : public DeviceHandlerBase { enum class InternalState { OFF, ENABLE_TEMPERATURE_PROTECTION, + TX_TRANSITION, + IDLE + } internalState = InternalState::OFF; + + enum class TransitionState { + IDLE, SELECT_MODULATION_BPSK, SELECT_MODULATION_0QPSK, SET_TX_MODULATION, SET_TX_CW, SET_TX_STANDBY, - IDLE - }; - - InternalState internalState = InternalState::OFF; + CMD_PENDING, + DONE + } transState = TransitionState::IDLE; /** * This object is used to store the id of the next command to execute. This controls the diff --git a/mission/com/TmStoreTaskBase.cpp b/mission/com/TmStoreTaskBase.cpp new file mode 100644 index 00000000..6598225d --- /dev/null +++ b/mission/com/TmStoreTaskBase.cpp @@ -0,0 +1,228 @@ +#include "TmStoreTaskBase.h" + +#include +#include +#include +#include +#include +#include + +#include "mission/persistentTmStoreDefs.h" + +TmStoreTaskBase::TmStoreTaskBase(object_id_t objectId, StorageManagerIF& ipcStore, + VirtualChannel& channel, SdCardMountedIF& sdcMan, + const std::atomic_bool& ptmeLocked) + : SystemObject(objectId), + modeHelper(this), + ipcStore(ipcStore), + tmReader(&timeReader), + channel(channel), + sdcMan(sdcMan), + ptmeLocked(ptmeLocked) { + requestQueue = QueueFactory::instance()->createMessageQueue(10); +} + +bool TmStoreTaskBase::handleOneStore(PersistentTmStoreWithTmQueue& store, + DumpContext& dumpContext) { + ReturnValue_t result; + bool tmToStoreReceived = false; + bool tcRequestReceived = false; + bool dumpPerformed = false; + fileHasSwapped = false; + dumpContext.packetWasDumped = false; + dumpContext.vcBusyDuringDump = false; + + // Store TM persistently + result = store.handleNextTm(); + if (result == returnvalue::OK) { + tmToStoreReceived = true; + } + // Dump TMs + if (store.getState() == PersistentTmStore::State::DUMPING) { + if (handleOneDump(store, dumpContext, dumpPerformed) != returnvalue::OK) { + return result; + } + } else { + Command_t execCmd; + // Handle TC requests, for example deletion or retrieval requests. + result = store.handleCommandQueue(ipcStore, execCmd); + if (result == returnvalue::OK) { + if (execCmd == TmStoreMessage::DOWNLINK_STORE_CONTENT_TIME) { + cancelDumpCd.resetTimer(); + tmSinkBusyCd.resetTimer(); + dumpContext.reset(); + } + tcRequestReceived = true; + } + } + if (tcRequestReceived or tmToStoreReceived or dumpPerformed) { + return true; + } + return false; +} + +bool TmStoreTaskBase::cyclicStoreCheck() { + if (not storesInitialized) { + storesInitialized = initStoresIfPossible(); + if (not storesInitialized) { + TaskFactory::delayTask(400); + return false; + } + } else if (sdCardCheckCd.hasTimedOut()) { + if (not sdcMan.isSdCardUsable(std::nullopt)) { + // Might be due to imminent shutdown or SD card switch. + storesInitialized = false; + TaskFactory::delayTask(100); + return false; + } + sdCardCheckCd.resetTimer(); + } + return true; +} + +void TmStoreTaskBase::cancelDump(DumpContext& ctx, PersistentTmStore& store, bool isTxOn) { + ctx.reset(); + if (store.getState() == PersistentTmStore::State::DUMPING) { + triggerEvent(ctx.eventIfCancelled, ctx.numberOfDumpedPackets, ctx.dumpedBytes); + } + store.cancelDump(); + if (isTxOn) { + channel.cancelTransfer(); + } +} + +ReturnValue_t TmStoreTaskBase::handleOneDump(PersistentTmStoreWithTmQueue& store, + DumpContext& dumpContext, bool& dumpPerformed) { + ReturnValue_t result = returnvalue::OK; + // The PTME might have been reset an transmitter state change, so there is no point in continuing + // the dump. + // TODO: Will be solved in a cleaner way, this is kind of a hack. + if (not channel.isTxOn()) { + cancelDump(dumpContext, store, false); + return returnvalue::FAILED; + } + // It is assumed that the PTME will only be locked for a short period (e.g. to change datarate). + if (not channel.isBusy() and not ptmeLocked) { + performDump(store, dumpContext, dumpPerformed); + } else { + // The PTME might be at full load, so it might sense to delay for a bit to let it do + // its work until some more bandwidth is available. Set a flag here so the upper layer can + // do ths. + dumpContext.vcBusyDuringDump = true; + dumpContext.ptmeBusyCounter++; + if (dumpContext.ptmeBusyCounter == 100) { + // If this happens, something is probably wrong. + sif::warning << "PTME busy for longer period. Cancelling dump" << std::endl; + cancelDump(dumpContext, store, channel.isTxOn()); + } + } + if (cancelDumpCd.hasTimedOut() or tmSinkBusyCd.hasTimedOut()) { + cancelDump(dumpContext, store, channel.isTxOn()); + } + return result; +} + +ReturnValue_t TmStoreTaskBase::performDump(PersistentTmStoreWithTmQueue& store, + DumpContext& dumpContext, bool& dumpPerformed) { + size_t dumpedLen = 0; + + auto dumpDoneHandler = [&]() { + uint32_t startTime; + uint32_t endTime; + store.getStartAndEndTimeCurrentOrLastDump(startTime, endTime); + triggerEvent(dumpContext.eventIfDone, dumpContext.numberOfDumpedPackets, + dumpContext.dumpedBytes); + dumpContext.reset(); + }; + // Dump the next packet into the PTME. + dumpContext.ptmeBusyCounter = 0; + tmSinkBusyCd.resetTimer(); + ReturnValue_t result = store.getNextDumpPacket(tmReader, fileHasSwapped); + if (result != returnvalue::OK) { + sif::error << "PersistentTmStore: Getting next dump packet failed" << std::endl; + } else if (fileHasSwapped or result == PersistentTmStore::DUMP_DONE) { + // This can happen if a file is corrupted and the next file swap completes the dump. + dumpDoneHandler(); + return returnvalue::OK; + } + dumpedLen = tmReader.getFullPacketLen(); + // Only write to VC if mode is on, but always confirm the dump. + // If the mode is OFF, it is assumed the PTME is not usable and is not allowed to be written + // (e.g. to confirm a reset or the transmitter is off anyway). + if (mode == MODE_ON) { + result = channel.write(tmReader.getFullData(), dumpedLen); + if (result == DirectTmSinkIF::IS_BUSY) { + sif::warning << "PersistentTmStore: Unexpected VC channel busy" << std::endl; + } else if (result != returnvalue::OK) { + sif::warning << "PersistentTmStore: Unexpected VC channel write failure" << std::endl; + } + } + result = store.confirmDump(tmReader, fileHasSwapped); + if ((result == PersistentTmStore::DUMP_DONE or result == returnvalue::OK)) { + dumpPerformed = true; + if (dumpedLen > 0) { + dumpContext.dumpedBytes += dumpedLen; + dumpContext.numberOfDumpedPackets += 1; + dumpContext.packetWasDumped = true; + } + } + if (result == PersistentTmStore::DUMP_DONE) { + dumpDoneHandler(); + } + return returnvalue::OK; +} + +ReturnValue_t TmStoreTaskBase::initialize() { + modeHelper.initialize(); + return returnvalue::OK; +} + +void TmStoreTaskBase::getMode(Mode_t* mode, Submode_t* submode) { + if (mode != nullptr) { + *mode = this->mode; + } + if (submode != nullptr) { + *submode = SUBMODE_NONE; + } +} + +ReturnValue_t TmStoreTaskBase::checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t* msToReachTheMode) { + if (mode == MODE_ON or mode == MODE_OFF) { + return returnvalue::OK; + } + return returnvalue::FAILED; +} + +MessageQueueId_t TmStoreTaskBase::getCommandQueue() const { return requestQueue->getId(); } + +void TmStoreTaskBase::announceMode(bool recursive) { triggerEvent(MODE_INFO, mode, SUBMODE_NONE); } + +object_id_t TmStoreTaskBase::getObjectId() const { return SystemObject::getObjectId(); } + +const HasHealthIF* TmStoreTaskBase::getOptHealthIF() const { return nullptr; } + +const HasModesIF& TmStoreTaskBase::getModeIF() const { return *this; } + +ReturnValue_t TmStoreTaskBase::connectModeTreeParent(HasModeTreeChildrenIF& parent) { + return modetree::connectModeTreeParent(parent, *this, nullptr, modeHelper); +} + +ModeTreeChildIF& TmStoreTaskBase::getModeTreeChildIF() { return *this; } + +void TmStoreTaskBase::readCommandQueue(void) { + CommandMessage commandMessage; + ReturnValue_t result = returnvalue::FAILED; + + result = requestQueue->receiveMessage(&commandMessage); + if (result == returnvalue::OK) { + result = modeHelper.handleModeCommand(&commandMessage); + if (result == returnvalue::OK) { + return; + } + CommandMessage reply; + reply.setReplyRejected(CommandMessage::UNKNOWN_COMMAND, commandMessage.getCommand()); + requestQueue->reply(&reply); + return; + } +} diff --git a/mission/com/TmStoreTaskBase.h b/mission/com/TmStoreTaskBase.h new file mode 100644 index 00000000..ef61bd19 --- /dev/null +++ b/mission/com/TmStoreTaskBase.h @@ -0,0 +1,106 @@ +#ifndef MISSION_TMTC_TMSTORETASKBASE_H_ +#define MISSION_TMTC_TMSTORETASKBASE_H_ + +#include +#include +#include +#include +#include +#include +#include + +/** + * Generic class which composes a Virtual Channel and a persistent TM stores. This allows dumping + * the TM store into the virtual channel directly. + */ +class TmStoreTaskBase : public SystemObject, + public HasModesIF, + public ModeTreeChildIF, + public ModeTreeConnectionIF { + public: + struct DumpContext { + DumpContext(Event eventIfDone, Event eventIfCancelled) + : eventIfDone(eventIfDone), eventIfCancelled(eventIfCancelled) {} + void reset() { + numberOfDumpedPackets = 0; + dumpedBytes = 0; + vcBusyDuringDump = false; + packetWasDumped = false; + bytesDumpedAtLastDelay = 0; + ptmeBusyCounter = 0; + } + const Event eventIfDone; + const Event eventIfCancelled; + size_t numberOfDumpedPackets = 0; + size_t bytesDumpedAtLastDelay = 0; + size_t dumpedBytes = 0; + uint32_t ptmeBusyCounter = 0; + bool packetWasDumped = false; + bool vcBusyDuringDump = false; + }; + + TmStoreTaskBase(object_id_t objectId, StorageManagerIF& ipcStore, VirtualChannel& channel, + SdCardMountedIF& sdcMan, const std::atomic_bool& ptmeLocked); + + ReturnValue_t initialize() override; + ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF& parent) override; + + protected: + ModeHelper modeHelper; + MessageQueueIF* requestQueue; + StorageManagerIF& ipcStore; + PusTmReader tmReader; + CdsShortTimeStamper timeReader; + VirtualChannel& channel; + SdCardMountedIF& sdcMan; + const std::atomic_bool& ptmeLocked; + + Mode_t mode = HasModesIF::MODE_OFF; + Countdown sdCardCheckCd = Countdown(800); + // 20 minutes are allowed as maximum dump time. + Countdown cancelDumpCd = Countdown(60 * 20 * 1000); + // If the TM sink is busy for 1 minute for whatever reason, cancel the dump. + Countdown tmSinkBusyCd = Countdown(60 * 1000); + + bool storesInitialized = false; + bool fileHasSwapped = false; + + void readCommandQueue(void); + + virtual bool initStoresIfPossible() = 0; + virtual void startTransition(Mode_t mode, Submode_t submode) = 0; + + void cancelDump(DumpContext& ctx, PersistentTmStore& store, bool isTxOn); + /** + * + * Handling for one store. Returns if anything was done. + * @param store + * @return + */ + bool handleOneStore(PersistentTmStoreWithTmQueue& store, DumpContext& dumpContext); + + ReturnValue_t handleOneDump(PersistentTmStoreWithTmQueue& store, DumpContext& dumpContext, + bool& dumpPerformed); + ReturnValue_t performDump(PersistentTmStoreWithTmQueue& store, DumpContext& dumpContext, + bool& dumpPerformed); + + /** + * Occasionally check whether SD card is okay to be used. If not, poll whether it is ready to + * be used again and re-initialize stores. Returns whether store is okay to be used. + */ + bool cyclicStoreCheck(); + + MessageQueueId_t getCommandQueue() const override; + + void getMode(Mode_t* mode, Submode_t* submode) override; + + ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode, + uint32_t* msToReachTheMode) override; + void announceMode(bool recursive) override; + object_id_t getObjectId() const override; + const HasHealthIF* getOptHealthIF() const override; + const HasModesIF& getModeIF() const override; + ModeTreeChildIF& getModeTreeChildIF() override; +}; + +#endif /* MISSION_TMTC_TMSTORETASKBASE_H_ */ diff --git a/mission/tmtc/VirtualChannel.cpp b/mission/com/VirtualChannel.cpp similarity index 74% rename from mission/tmtc/VirtualChannel.cpp rename to mission/com/VirtualChannel.cpp index 4fed30b1..8e225674 100644 --- a/mission/tmtc/VirtualChannel.cpp +++ b/mission/com/VirtualChannel.cpp @@ -1,12 +1,8 @@ #include "VirtualChannel.h" VirtualChannel::VirtualChannel(object_id_t objectId, uint8_t vcId, const char* vcName, PtmeIF& ptme, - const std::atomic_bool& linkStateProvider) - : SystemObject(objectId), - ptme(ptme), - vcId(vcId), - vcName(vcName), - linkStateProvider(linkStateProvider) {} + const std::atomic_bool& txOn) + : SystemObject(objectId), ptme(ptme), vcId(vcId), vcName(vcName), txOn(txOn) {} ReturnValue_t VirtualChannel::initialize() { return returnvalue::OK; } @@ -15,7 +11,7 @@ ReturnValue_t VirtualChannel::sendNextTm(const uint8_t* data, size_t size) { } ReturnValue_t VirtualChannel::write(const uint8_t* data, size_t size) { - if (linkStateProvider.load()) { + if (txOn) { return ptme.writeToVc(vcId, data, size); } return returnvalue::OK; @@ -27,10 +23,12 @@ const char* VirtualChannel::getName() const { return vcName.c_str(); } bool VirtualChannel::isBusy() const { // Data is discarded, so channel is not busy. - if (linkStateProvider.load()) { + if (not txOn) { return false; } return ptme.isBusy(vcId); } void VirtualChannel::cancelTransfer() { ptme.cancelTransfer(vcId); } + +bool VirtualChannel::isTxOn() const { return txOn; } diff --git a/mission/tmtc/VirtualChannel.h b/mission/com/VirtualChannel.h similarity index 95% rename from mission/tmtc/VirtualChannel.h rename to mission/com/VirtualChannel.h index 4cad3305..98aba903 100644 --- a/mission/tmtc/VirtualChannel.h +++ b/mission/com/VirtualChannel.h @@ -30,6 +30,7 @@ class VirtualChannel : public SystemObject, public VirtualChannelIF { ReturnValue_t write(const uint8_t* data, size_t size) override; void cancelTransfer() override; uint8_t getVcid() const; + bool isTxOn() const; const char* getName() const; @@ -37,5 +38,5 @@ class VirtualChannel : public SystemObject, public VirtualChannelIF { PtmeIF& ptme; uint8_t vcId = 0; std::string vcName; - const std::atomic_bool& linkStateProvider; + const std::atomic_bool& txOn; }; diff --git a/mission/tmtc/VirtualChannelWithQueue.cpp b/mission/com/VirtualChannelWithQueue.cpp similarity index 82% rename from mission/tmtc/VirtualChannelWithQueue.cpp rename to mission/com/VirtualChannelWithQueue.cpp index c00ccd9c..a90829ab 100644 --- a/mission/tmtc/VirtualChannelWithQueue.cpp +++ b/mission/com/VirtualChannelWithQueue.cpp @@ -1,11 +1,11 @@ -#include +#include "VirtualChannelWithQueue.h" -#include "CcsdsIpCoreHandler.h" #include "OBSWConfig.h" #include "fsfw/ipc/QueueFactory.h" #include "fsfw/objectmanager/ObjectManager.h" #include "fsfw/serviceinterface/ServiceInterfaceStream.h" #include "fsfw/tmtcservices/TmTcMessage.h" +#include "mission/com/CcsdsIpCoreHandler.h" VirtualChannelWithQueue::VirtualChannelWithQueue(object_id_t objectId, uint8_t vcId, const char* vcName, PtmeIF& ptme, @@ -19,7 +19,7 @@ VirtualChannelWithQueue::VirtualChannelWithQueue(object_id_t objectId, uint8_t v const char* VirtualChannelWithQueue::getName() const { return VirtualChannel::getName(); } -ReturnValue_t VirtualChannelWithQueue::sendNextTm() { +ReturnValue_t VirtualChannelWithQueue::handleNextTm(bool performWriteOp) { TmTcMessage message; ReturnValue_t result = tmQueue->receiveMessage(&message); if (result == MessageQueueIF::EMPTY) { @@ -36,15 +36,13 @@ ReturnValue_t VirtualChannelWithQueue::sendNextTm() { return result; } - result = write(data, size); - if (result != returnvalue::OK) { - return result; + if (performWriteOp) { + result = write(data, size); } + // Try delete in any case, ignore failures (which should not happen), it is more important to + // propagate write errors. tmStore.deleteData(storeId); - if (result != returnvalue::OK) { - return result; - } - return returnvalue::OK; + return result; } MessageQueueId_t VirtualChannelWithQueue::getReportReceptionQueue(uint8_t virtualChannel) const { diff --git a/mission/tmtc/VirtualChannelWithQueue.h b/mission/com/VirtualChannelWithQueue.h similarity index 93% rename from mission/tmtc/VirtualChannelWithQueue.h rename to mission/com/VirtualChannelWithQueue.h index 0c060a06..04c7f965 100644 --- a/mission/tmtc/VirtualChannelWithQueue.h +++ b/mission/com/VirtualChannelWithQueue.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include @@ -34,7 +34,7 @@ class VirtualChannelWithQueue : public VirtualChannel, public AcceptsTelemetryIF MessageQueueId_t getReportReceptionQueue(uint8_t virtualChannel = 0) const override; [[nodiscard]] const char* getName() const override; - ReturnValue_t sendNextTm(); + ReturnValue_t handleNextTm(bool performWriteOp); private: MessageQueueIF* tmQueue = nullptr; diff --git a/mission/comDefs.h b/mission/com/defs.h similarity index 96% rename from mission/comDefs.h rename to mission/com/defs.h index 5c307edb..b0662107 100644 --- a/mission/comDefs.h +++ b/mission/com/defs.h @@ -1,6 +1,8 @@ #ifndef MISSION_COMDEFS_H_ #define MISSION_COMDEFS_H_ +#include + namespace com { enum class Datarate : uint8_t { diff --git a/mission/devices/devicedefinitions/SyrlinksDefinitions.h b/mission/com/syrlinksDefs.h similarity index 100% rename from mission/devices/devicedefinitions/SyrlinksDefinitions.h rename to mission/com/syrlinksDefs.h diff --git a/mission/config/comCfg.cpp b/mission/config/comCfg.cpp index 8387214d..664a2e55 100644 --- a/mission/config/comCfg.cpp +++ b/mission/config/comCfg.cpp @@ -3,6 +3,8 @@ #include #include +#include + com::Datarate DATARATE_CFG_RAW = com::Datarate::LOW_RATE_MODULATION_BPSK; MutexIF* DATARATE_LOCK = nullptr; diff --git a/mission/config/comCfg.h b/mission/config/comCfg.h index 54a49ade..575fe6fd 100644 --- a/mission/config/comCfg.h +++ b/mission/config/comCfg.h @@ -3,7 +3,7 @@ #include -#include "mission/comDefs.h" +#include "mission/com/defs.h" namespace com { diff --git a/mission/controller/AcsController.cpp b/mission/controller/AcsController.cpp index a5fd470d..a1f3d4cb 100644 --- a/mission/controller/AcsController.cpp +++ b/mission/controller/AcsController.cpp @@ -1,11 +1,12 @@ #include "AcsController.h" #include -#include +#include #include -AcsController::AcsController(object_id_t objectId) +AcsController::AcsController(object_id_t objectId, bool enableHkSets) : ExtendedControllerBase(objectId), + enableHkSets(enableHkSets), guidance(&acsParameters), safeCtrl(&acsParameters), ptgCtrl(&acsParameters), @@ -591,7 +592,7 @@ ReturnValue_t AcsController::initializeLocalDataPool(localpool::DataPool &localD localDataPoolMap.emplace(acsctrl::PoolIds::MGM_3_RM3100_UT, &mgm3VecRaw); localDataPoolMap.emplace(acsctrl::PoolIds::MGM_IMTQ_CAL_NT, &imtqMgmVecRaw); localDataPoolMap.emplace(acsctrl::PoolIds::MGM_IMTQ_CAL_ACT_STATUS, &imtqCalActStatus); - poolManager.subscribeForRegularPeriodicPacket({mgmDataRaw.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({mgmDataRaw.getSid(), false, 10.0}); // MGM Processed localDataPoolMap.emplace(acsctrl::PoolIds::MGM_0_VEC, &mgm0VecProc); localDataPoolMap.emplace(acsctrl::PoolIds::MGM_1_VEC, &mgm1VecProc); @@ -601,7 +602,7 @@ ReturnValue_t AcsController::initializeLocalDataPool(localpool::DataPool &localD localDataPoolMap.emplace(acsctrl::PoolIds::MGM_VEC_TOT, &mgmVecTot); localDataPoolMap.emplace(acsctrl::PoolIds::MGM_VEC_TOT_DERIVATIVE, &mgmVecTotDer); localDataPoolMap.emplace(acsctrl::PoolIds::MAG_IGRF_MODEL, &magIgrf); - poolManager.subscribeForRegularPeriodicPacket({mgmDataProcessed.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({mgmDataProcessed.getSid(), enableHkSets, 10.0}); // SUS Raw localDataPoolMap.emplace(acsctrl::PoolIds::SUS_0_N_LOC_XFYFZM_PT_XF, &sus0ValRaw); localDataPoolMap.emplace(acsctrl::PoolIds::SUS_1_N_LOC_XBYFZM_PT_XB, &sus1ValRaw); @@ -615,7 +616,7 @@ ReturnValue_t AcsController::initializeLocalDataPool(localpool::DataPool &localD localDataPoolMap.emplace(acsctrl::PoolIds::SUS_9_R_LOC_XBYBZB_PT_YF, &sus9ValRaw); localDataPoolMap.emplace(acsctrl::PoolIds::SUS_10_N_LOC_XMYBZF_PT_ZF, &sus10ValRaw); localDataPoolMap.emplace(acsctrl::PoolIds::SUS_11_R_LOC_XBYMZB_PT_ZB, &sus11ValRaw); - poolManager.subscribeForRegularPeriodicPacket({susDataRaw.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({susDataRaw.getSid(), false, 10.0}); // SUS Processed localDataPoolMap.emplace(acsctrl::PoolIds::SUS_0_VEC, &sus0VecProc); localDataPoolMap.emplace(acsctrl::PoolIds::SUS_1_VEC, &sus1VecProc); @@ -632,43 +633,43 @@ ReturnValue_t AcsController::initializeLocalDataPool(localpool::DataPool &localD localDataPoolMap.emplace(acsctrl::PoolIds::SUS_VEC_TOT, &susVecTot); localDataPoolMap.emplace(acsctrl::PoolIds::SUS_VEC_TOT_DERIVATIVE, &susVecTotDer); localDataPoolMap.emplace(acsctrl::PoolIds::SUN_IJK_MODEL, &sunIjk); - poolManager.subscribeForRegularPeriodicPacket({susDataProcessed.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({susDataProcessed.getSid(), enableHkSets, 10.0}); // GYR Raw localDataPoolMap.emplace(acsctrl::PoolIds::GYR_0_ADIS, &gyr0VecRaw); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_1_L3, &gyr1VecRaw); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_2_ADIS, &gyr2VecRaw); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_3_L3, &gyr3VecRaw); - poolManager.subscribeForDiagPeriodicPacket({gyrDataRaw.getSid(), false, 5.0}); + poolManager.subscribeForDiagPeriodicPacket({gyrDataRaw.getSid(), false, 10.0}); // GYR Processed localDataPoolMap.emplace(acsctrl::PoolIds::GYR_0_VEC, &gyr0VecProc); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_1_VEC, &gyr1VecProc); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_2_VEC, &gyr2VecProc); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_3_VEC, &gyr3VecProc); localDataPoolMap.emplace(acsctrl::PoolIds::GYR_VEC_TOT, &gyrVecTot); - poolManager.subscribeForDiagPeriodicPacket({gyrDataProcessed.getSid(), false, 5.0}); + poolManager.subscribeForDiagPeriodicPacket({gyrDataProcessed.getSid(), enableHkSets, 10.0}); // GPS Processed localDataPoolMap.emplace(acsctrl::PoolIds::GC_LATITUDE, &gcLatitude); localDataPoolMap.emplace(acsctrl::PoolIds::GD_LONGITUDE, &gdLongitude); localDataPoolMap.emplace(acsctrl::PoolIds::ALTITUDE, &altitude); localDataPoolMap.emplace(acsctrl::PoolIds::GPS_POSITION, &gpsPosition); localDataPoolMap.emplace(acsctrl::PoolIds::GPS_VELOCITY, &gpsVelocity); - poolManager.subscribeForRegularPeriodicPacket({gpsDataProcessed.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({gpsDataProcessed.getSid(), enableHkSets, 30.0}); // MEKF localDataPoolMap.emplace(acsctrl::PoolIds::QUAT_MEKF, &quatMekf); localDataPoolMap.emplace(acsctrl::PoolIds::SAT_ROT_RATE_MEKF, &satRotRateMekf); localDataPoolMap.emplace(acsctrl::PoolIds::MEKF_STATUS, &mekfStatus); - poolManager.subscribeForDiagPeriodicPacket({mekfData.getSid(), false, 5.0}); + poolManager.subscribeForDiagPeriodicPacket({mekfData.getSid(), enableHkSets, 10.0}); // Ctrl Values localDataPoolMap.emplace(acsctrl::PoolIds::TGT_QUAT, &tgtQuat); localDataPoolMap.emplace(acsctrl::PoolIds::ERROR_QUAT, &errQuat); localDataPoolMap.emplace(acsctrl::PoolIds::ERROR_ANG, &errAng); localDataPoolMap.emplace(acsctrl::PoolIds::TGT_ROT_RATE, &tgtRotRate); - poolManager.subscribeForRegularPeriodicPacket({ctrlValData.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({ctrlValData.getSid(), enableHkSets, 10.0}); // Actuator CMD localDataPoolMap.emplace(acsctrl::PoolIds::RW_TARGET_TORQUE, &rwTargetTorque); localDataPoolMap.emplace(acsctrl::PoolIds::RW_TARGET_SPEED, &rwTargetSpeed); localDataPoolMap.emplace(acsctrl::PoolIds::MTQ_TARGET_DIPOLE, &mtqTargetDipole); - poolManager.subscribeForRegularPeriodicPacket({actuatorCmdData.getSid(), false, 5.0}); + poolManager.subscribeForRegularPeriodicPacket({actuatorCmdData.getSid(), enableHkSets, 10.0}); return returnvalue::OK; } diff --git a/mission/controller/AcsController.h b/mission/controller/AcsController.h index fd17d606..76cfe7b5 100644 --- a/mission/controller/AcsController.h +++ b/mission/controller/AcsController.h @@ -9,10 +9,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include "acs/ActuatorCmd.h" #include "acs/Guidance.h" @@ -28,7 +28,7 @@ class AcsController : public ExtendedControllerBase, public ReceivesParameterMes public: static constexpr dur_millis_t INIT_DELAY = 500; - AcsController(object_id_t objectId); + AcsController(object_id_t objectId, bool enableHkSets); MessageQueueId_t getCommandQueue() const; ReturnValue_t getParameter(uint8_t domainId, uint8_t parameterId, @@ -46,6 +46,8 @@ class AcsController : public ExtendedControllerBase, public ReceivesParameterMes static constexpr double RW_OFF_TORQUE[4] = {0.0, 0.0, 0.0, 0.0}; static constexpr int32_t RW_OFF_SPEED[4] = {0, 0, 0, 0}; + bool enableHkSets = false; + AcsParameters acsParameters; SensorProcessing sensorProcessing; Navigation navigation; diff --git a/mission/controller/ThermalController.cpp b/mission/controller/ThermalController.cpp index 0a11d5dd..96b6de86 100644 --- a/mission/controller/ThermalController.cpp +++ b/mission/controller/ThermalController.cpp @@ -1,20 +1,26 @@ #include "ThermalController.h" #include +#include #include #include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include +// Enabling this should trigger a special event which in turn should trigger a system reaction. +#define LOWER_SYRLINKS_UPPER_LIMITS 0 +#define LOWER_EBAND_UPPER_LIMITS 0 +#define LOWER_PLOC_UPPER_LIMITS 0 + ThermalController::ThermalController(object_id_t objectId, HeaterHandler& heater) : ExtendedControllerBase(objectId), heaterHandler(heater), @@ -23,25 +29,26 @@ ThermalController::ThermalController(object_id_t objectId, HeaterHandler& heater deviceTemperatures(this), heaterInfo(this), imtqThermalSet(objects::IMTQ_HANDLER, ThermalStateCfg()), - max31865Set0(objects::RTD_0_IC3_PLOC_HEATSPREADER, - EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set1(objects::RTD_1_IC4_PLOC_MISSIONBOARD, - EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set2(objects::RTD_2_IC5_4K_CAMERA, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set3(objects::RTD_3_IC6_DAC_HEATSPREADER, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set4(objects::RTD_4_IC7_STARTRACKER, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set5(objects::RTD_5_IC8_RW1_MX_MY, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set6(objects::RTD_6_IC9_DRO, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set7(objects::RTD_7_IC10_SCEX, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set8(objects::RTD_8_IC11_X8, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set9(objects::RTD_9_IC12_HPA, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set10(objects::RTD_10_IC13_PL_TX, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set11(objects::RTD_11_IC14_MPA, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set12(objects::RTD_12_IC15_ACU, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set13(objects::RTD_13_IC16_PLPCDU_HEATSPREADER, - EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set14(objects::RTD_14_IC17_TCS_BOARD, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), - max31865Set15(objects::RTD_15_IC18_IMTQ, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet0PlocHspd(objects::RTD_0_IC3_PLOC_HEATSPREADER, + EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet1PlocMissionBrd(objects::RTD_1_IC4_PLOC_MISSIONBOARD, + EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet2PlCam(objects::RTD_2_IC5_4K_CAMERA, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet3DacHspd(objects::RTD_3_IC6_DAC_HEATSPREADER, + EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet4Str(objects::RTD_4_IC7_STARTRACKER, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet5Rw1MxMy(objects::RTD_5_IC8_RW1_MX_MY, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet6Dro(objects::RTD_6_IC9_DRO, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet7Scex(objects::RTD_7_IC10_SCEX, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet8X8(objects::RTD_8_IC11_X8, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet9Hpa(objects::RTD_9_IC12_HPA, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet10EbandTx(objects::RTD_10_IC13_PL_TX, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet11Mpa(objects::RTD_11_IC14_MPA, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet31865Set12(objects::RTD_12_IC15_ACU, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet13PlPcduHspd(objects::RTD_13_IC16_PLPCDU_HEATSPREADER, + EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet14TcsBrd(objects::RTD_14_IC17_TCS_BOARD, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), + maxSet15Imtq(objects::RTD_15_IC18_IMTQ, EiveMax31855::RtdCommands::EXCHANGE_SET_ID), tmp1075SetTcs0(objects::TMP1075_HANDLER_TCS_0), tmp1075SetTcs1(objects::TMP1075_HANDLER_TCS_1), tmp1075SetPlPcdu0(objects::TMP1075_HANDLER_PLPCDU_0), @@ -64,8 +71,12 @@ ThermalController::ThermalController(object_id_t objectId, HeaterHandler& heater } ReturnValue_t ThermalController::initialize() { - auto result = ExtendedControllerBase::initialize(); - return result; + auto* camSwitcher = ObjectManager::instance()->get(objects::CAM_SWITCHER); + if (camSwitcher == nullptr) { + return ObjectManagerIF::CHILD_INIT_FAILED; + } + camId = camSwitcher->getCommandQueue(); + return ExtendedControllerBase::initialize(); } ReturnValue_t ThermalController::handleCommandMessage(CommandMessage* message) { @@ -76,6 +87,7 @@ void ThermalController::performControlOperation() { #if OBSW_THREAD_TRACING == 1 trace::threadTrace(opCounter, "TCS Task"); #endif + switch (internalState) { case InternalState::STARTUP: { initialCountdown.resetTimer(); @@ -84,7 +96,9 @@ void ThermalController::performControlOperation() { } case InternalState::INITIAL_DELAY: { if (initialCountdown.hasTimedOut()) { + sif::info << "Starting thermal control operations" << std::endl; internalState = InternalState::READY; + break; } return; } @@ -95,26 +109,52 @@ void ThermalController::performControlOperation() { break; } - ReturnValue_t result = sensorTemperatures.read(); - if (result == returnvalue::OK) { - copySensors(); - sensorTemperatures.commit(); + if (cycles == 50) { + bool changedLimits = false; +#if LOWER_SYRLINKS_UPPER_LIMITS == 1 + changedLimits = true; + sBandTransceiverLimits.cutOffLimit = 0; + sBandTransceiverLimits.opUpperLimit = 0; + sBandTransceiverLimits.nopUpperLimit = 0; +#endif +#if LOWER_PLOC_UPPER_LIMITS == 1 + changedLimits = true; + plocMissionBoardLimits.cutOffLimit = 0; + plocMissionBoardLimits.opUpperLimit = 0; + plocMissionBoardLimits.nopUpperLimit = 0; +#endif +#if LOWER_EBAND_UPPER_LIMITS == 1 + changedLimits = true; + hpaLimits.cutOffLimit = 0; + hpaLimits.opUpperLimit = 0; + hpaLimits.nopUpperLimit = 0; +#endif + if (changedLimits) { + sif::debug << "ThermalController: changing limits" << std::endl; // TODO: rausschmeissen + } } - result = susTemperatures.read(); - if (result == returnvalue::OK) { - copySus(); - susTemperatures.commit(); + { + PoolReadGuard pg(&sensorTemperatures); + if (pg.getReadResult() == returnvalue::OK) { + copySensors(); + } + } + { + PoolReadGuard pg(&susTemperatures); + if (pg.getReadResult() == returnvalue::OK) { + copySus(); + } + } + { + PoolReadGuard pg(&deviceTemperatures); + if (pg.getReadResult() == returnvalue::OK) { + copyDevices(); + } } - result = deviceTemperatures.read(); - if (result == returnvalue::OK) { - copyDevices(); - deviceTemperatures.commit(); - } - - std::array heaterStates; - heaterHandler.getAllSwitchStates(heaterStates); + HeaterSwitchStates heaterSwitchStateArray{}; + heaterHandler.getAllSwitchStates(heaterSwitchStateArray); { PoolReadGuard pg(&heaterInfo); std::memcpy(heaterInfo.heaterSwitchState.value, heaterStates.data(), 8); @@ -126,7 +166,26 @@ void ThermalController::performControlOperation() { } } - // performThermalModuleCtrl(); + if (transitionToOff) { + for (const auto& switchState : heaterSwitchStateArray) { + if (switchState != HeaterHandler::SwitchState::OFF) { + transitionToOffCycles++; + // if heater still ON after 10 cycles, switch OFF again + if (transitionToOffCycles == 10) { + for (uint8_t i = 0; i < heater::Switchers::NUMBER_OF_SWITCHES; i++) { + heaterHandler.switchHeater(static_cast(i), + HeaterHandler::SwitchState::OFF); + } + triggerEvent(tcsCtrl::HEATER_NOT_OFF_FOR_OFF_MODE); + } + return; + } + setMode(MODE_OFF); + } + } else if (mode != MODE_OFF) { + performThermalModuleCtrl(heaterSwitchStateArray); + } + cycles++; } ReturnValue_t ThermalController::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, @@ -196,14 +255,19 @@ ReturnValue_t ThermalController::initializeLocalDataPool(localpool::DataPool& lo localDataPoolMap.emplace(tcsCtrl::HEATER_SWITCH_LIST, &heaterSwitchStates); localDataPoolMap.emplace(tcsCtrl::HEATER_CURRENT, &heaterCurrent); + bool enableHkSets = false; +#if OBSW_ENABLE_PERIODIC_HK == 1 + enableHkSets = true; +#endif poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(sensorTemperatures.getSid(), false, 10.0)); + subdp::RegularHkPeriodicParams(sensorTemperatures.getSid(), enableHkSets, 120.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(susTemperatures.getSid(), false, 10.0)); + subdp::RegularHkPeriodicParams(susTemperatures.getSid(), enableHkSets, 240.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(deviceTemperatures.getSid(), false, 10.0)); + subdp::RegularHkPeriodicParams(deviceTemperatures.getSid(), enableHkSets, 120.0)); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(heaterInfo.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(heaterInfo.getSid(), enableHkSets, 120.0)); + return returnvalue::OK; } @@ -235,181 +299,179 @@ ReturnValue_t ThermalController::checkModeCommand(Mode_t mode, Submode_t submode void ThermalController::copySensors() { { - PoolReadGuard pg0(&max31865Set0, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg0(&maxSet0PlocHspd, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg0.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_ploc_heatspreader.value = max31865Set0.temperatureCelcius.value; - sensorTemperatures.sensor_ploc_heatspreader.setValid( - max31865Set0.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_ploc_heatspreader.isValid()) { - sensorTemperatures.sensor_ploc_heatspreader.value = INVALID_TEMPERATURE; + sensorTemperatures.plocHeatspreader.value = maxSet0PlocHspd.temperatureCelcius.value; + sensorTemperatures.plocHeatspreader.setValid(maxSet0PlocHspd.temperatureCelcius.isValid()); + if (not sensorTemperatures.plocHeatspreader.isValid()) { + sensorTemperatures.plocHeatspreader.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg1(&max31865Set1, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg1(&maxSet1PlocMissionBrd, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg1.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_ploc_missionboard.value = max31865Set1.temperatureCelcius.value; - sensorTemperatures.sensor_ploc_missionboard.setValid( - max31865Set1.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_ploc_missionboard.isValid()) { - sensorTemperatures.sensor_ploc_missionboard.value = INVALID_TEMPERATURE; + sensorTemperatures.plocMissionboard.value = maxSet1PlocMissionBrd.temperatureCelcius.value; + sensorTemperatures.plocMissionboard.setValid( + maxSet1PlocMissionBrd.temperatureCelcius.isValid()); + if (not sensorTemperatures.plocMissionboard.isValid()) { + sensorTemperatures.plocMissionboard.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg2(&max31865Set2, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg2(&maxSet2PlCam, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg2.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_4k_camera.value = max31865Set2.temperatureCelcius.value; - sensorTemperatures.sensor_4k_camera.setValid(max31865Set2.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_4k_camera.isValid()) { - sensorTemperatures.sensor_4k_camera.value = INVALID_TEMPERATURE; + sensorTemperatures.payload4kCamera.value = maxSet2PlCam.temperatureCelcius.value; + sensorTemperatures.payload4kCamera.setValid(maxSet2PlCam.temperatureCelcius.isValid()); + if (not sensorTemperatures.payload4kCamera.isValid()) { + sensorTemperatures.payload4kCamera.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg3(&max31865Set3, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg3(&maxSet3DacHspd, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg3.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_dac_heatspreader.value = max31865Set3.temperatureCelcius.value; - sensorTemperatures.sensor_dac_heatspreader.setValid( - max31865Set3.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_dac_heatspreader.isValid()) { - sensorTemperatures.sensor_dac_heatspreader.value = INVALID_TEMPERATURE; + sensorTemperatures.dacHeatspreader.value = maxSet3DacHspd.temperatureCelcius.value; + sensorTemperatures.dacHeatspreader.setValid(maxSet3DacHspd.temperatureCelcius.isValid()); + if (not sensorTemperatures.dacHeatspreader.isValid()) { + sensorTemperatures.dacHeatspreader.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg4(&max31865Set4, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg4(&maxSet4Str, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg4.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_startracker.value = max31865Set4.temperatureCelcius.value; - sensorTemperatures.sensor_startracker.setValid(max31865Set4.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_startracker.isValid()) { - sensorTemperatures.sensor_startracker.value = INVALID_TEMPERATURE; + sensorTemperatures.startracker.value = maxSet4Str.temperatureCelcius.value; + sensorTemperatures.startracker.setValid(maxSet4Str.temperatureCelcius.isValid()); + if (not sensorTemperatures.startracker.isValid()) { + sensorTemperatures.startracker.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg5(&max31865Set5, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg5(&maxSet5Rw1MxMy, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg5.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_rw1.value = max31865Set5.temperatureCelcius.value; - sensorTemperatures.sensor_rw1.setValid(max31865Set5.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_rw1.isValid()) { - sensorTemperatures.sensor_rw1.value = INVALID_TEMPERATURE; + sensorTemperatures.rw1.value = maxSet5Rw1MxMy.temperatureCelcius.value; + sensorTemperatures.rw1.setValid(maxSet5Rw1MxMy.temperatureCelcius.isValid()); + if (not sensorTemperatures.rw1.isValid()) { + sensorTemperatures.rw1.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg6(&max31865Set6, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg6(&maxSet6Dro, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg6.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_dro.value = max31865Set6.temperatureCelcius.value; - sensorTemperatures.sensor_dro.setValid(max31865Set6.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_dro.isValid()) { - sensorTemperatures.sensor_dro.value = INVALID_TEMPERATURE; + sensorTemperatures.dro.value = maxSet6Dro.temperatureCelcius.value; + sensorTemperatures.dro.setValid(maxSet6Dro.temperatureCelcius.isValid()); + if (not sensorTemperatures.dro.isValid()) { + sensorTemperatures.dro.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg7(&max31865Set7, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg7(&maxSet7Scex, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg7.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_scex.value = max31865Set7.temperatureCelcius.value; - sensorTemperatures.sensor_scex.setValid(max31865Set7.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_scex.isValid()) { - sensorTemperatures.sensor_scex.value = INVALID_TEMPERATURE; + sensorTemperatures.scex.value = maxSet7Scex.temperatureCelcius.value; + sensorTemperatures.scex.setValid(maxSet7Scex.temperatureCelcius.isValid()); + if (not sensorTemperatures.scex.isValid()) { + sensorTemperatures.scex.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg8(&max31865Set8, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg8(&maxSet8X8, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg8.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_x8.value = max31865Set8.temperatureCelcius.value; - sensorTemperatures.sensor_x8.setValid(max31865Set8.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_x8.isValid()) { - sensorTemperatures.sensor_x8.value = INVALID_TEMPERATURE; + sensorTemperatures.x8.value = maxSet8X8.temperatureCelcius.value; + sensorTemperatures.x8.setValid(maxSet8X8.temperatureCelcius.isValid()); + if (not sensorTemperatures.x8.isValid()) { + sensorTemperatures.x8.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg9(&max31865Set9, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg9(&maxSet9Hpa, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg9.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_hpa.value = max31865Set9.temperatureCelcius.value; - sensorTemperatures.sensor_hpa.setValid(max31865Set9.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_hpa.isValid()) { - sensorTemperatures.sensor_hpa.value = INVALID_TEMPERATURE; + sensorTemperatures.hpa.value = maxSet9Hpa.temperatureCelcius.value; + sensorTemperatures.hpa.setValid(maxSet9Hpa.temperatureCelcius.isValid()); + if (not sensorTemperatures.hpa.isValid()) { + sensorTemperatures.hpa.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg10(&max31865Set10, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg10(&maxSet10EbandTx, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg10.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_tx_modul.value = max31865Set10.temperatureCelcius.value; - sensorTemperatures.sensor_tx_modul.setValid(max31865Set10.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_tx_modul.isValid()) { - sensorTemperatures.sensor_tx_modul.value = INVALID_TEMPERATURE; + sensorTemperatures.eBandTx.value = maxSet10EbandTx.temperatureCelcius.value; + sensorTemperatures.eBandTx.setValid(maxSet10EbandTx.temperatureCelcius.isValid()); + if (not sensorTemperatures.eBandTx.isValid()) { + sensorTemperatures.eBandTx.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg11(&max31865Set11, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg11(&maxSet11Mpa, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg11.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_mpa.value = max31865Set11.temperatureCelcius.value; - sensorTemperatures.sensor_mpa.setValid(max31865Set11.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_mpa.isValid()) { - sensorTemperatures.sensor_mpa.value = INVALID_TEMPERATURE; + sensorTemperatures.mpa.value = maxSet11Mpa.temperatureCelcius.value; + sensorTemperatures.mpa.setValid(maxSet11Mpa.temperatureCelcius.isValid()); + if (not sensorTemperatures.mpa.isValid()) { + sensorTemperatures.mpa.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg12(&max31865Set12, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg12(&maxSet31865Set12, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg12.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_acu.value = max31865Set12.temperatureCelcius.value; - sensorTemperatures.sensor_acu.setValid(max31865Set12.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_acu.isValid()) { - sensorTemperatures.sensor_acu.value = INVALID_TEMPERATURE; + sensorTemperatures.acu.value = maxSet31865Set12.temperatureCelcius.value; + sensorTemperatures.acu.setValid(maxSet31865Set12.temperatureCelcius.isValid()); + if (not sensorTemperatures.acu.isValid()) { + sensorTemperatures.acu.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg13(&max31865Set13, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg13(&maxSet13PlPcduHspd, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg13.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_plpcdu_heatspreader.value = max31865Set13.temperatureCelcius.value; - sensorTemperatures.sensor_plpcdu_heatspreader.setValid( - max31865Set13.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_plpcdu_heatspreader.isValid()) { - sensorTemperatures.sensor_plpcdu_heatspreader.value = INVALID_TEMPERATURE; + sensorTemperatures.plpcduHeatspreader.value = maxSet13PlPcduHspd.temperatureCelcius.value; + sensorTemperatures.plpcduHeatspreader.setValid( + maxSet13PlPcduHspd.temperatureCelcius.isValid()); + if (not sensorTemperatures.plpcduHeatspreader.isValid()) { + sensorTemperatures.plpcduHeatspreader.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg14(&max31865Set14, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg14(&maxSet14TcsBrd, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg14.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_tcs_board.value = max31865Set14.temperatureCelcius.value; - sensorTemperatures.sensor_tcs_board.setValid(max31865Set14.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_tcs_board.isValid()) { - sensorTemperatures.sensor_tcs_board.value = INVALID_TEMPERATURE; + sensorTemperatures.tcsBoard.value = maxSet14TcsBrd.temperatureCelcius.value; + sensorTemperatures.tcsBoard.setValid(maxSet14TcsBrd.temperatureCelcius.isValid()); + if (not sensorTemperatures.tcsBoard.isValid()) { + sensorTemperatures.tcsBoard.value = INVALID_TEMPERATURE; } } } { - PoolReadGuard pg15(&max31865Set15, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); + PoolReadGuard pg15(&maxSet15Imtq, MutexIF::TimeoutType::WAITING, MUTEX_TIMEOUT); if (pg15.getReadResult() == returnvalue::OK) { - sensorTemperatures.sensor_magnettorquer.value = max31865Set15.temperatureCelcius.value; - sensorTemperatures.sensor_magnettorquer.setValid(max31865Set15.temperatureCelcius.isValid()); - if (not sensorTemperatures.sensor_magnettorquer.isValid()) { - sensorTemperatures.sensor_magnettorquer.value = INVALID_TEMPERATURE; + sensorTemperatures.mgt.value = maxSet15Imtq.temperatureCelcius.value; + sensorTemperatures.mgt.setValid(maxSet15Imtq.temperatureCelcius.isValid()); + if (not sensorTemperatures.mgt.isValid()) { + sensorTemperatures.mgt.value = INVALID_TEMPERATURE; } } } @@ -910,28 +972,33 @@ void ThermalController::copyDevices() { } void ThermalController::ctrlAcsBoard() { - // TODO: check heater::Switchers switchNr = heater::HEATER_2_ACS_BRD; heater::Switchers redSwitchNr = heater::HEATER_0_OBC_BRD; // A side + thermalComponent = ACS_BOARD; sensors[0].first = deviceTemperatures.gyro0SideA.isValid(); sensors[0].second = deviceTemperatures.gyro0SideA.value; - sensors[1].first = deviceTemperatures.mgm0SideA.isValid(); - sensors[1].second = deviceTemperatures.mgm0SideA.value; - sensors[2].first = deviceTemperatures.gyro1SideA.isValid(); - sensors[2].second = deviceTemperatures.gyro1SideA.value; - sensors[3].first = sensorTemperatures.sensor_tcs_board.isValid(); - sensors[3].second = sensorTemperatures.sensor_tcs_board.value; - numSensors = 4; - if (selectAndReadSensorTemp()) { - if (chooseHeater(switchNr, redSwitchNr)) { - ctrlHeater(switchNr, redSwitchNr, acsBoardLimits); + sensors[1].first = deviceTemperatures.gyro2SideB.isValid(); + sensors[1].second = deviceTemperatures.gyro2SideB.value; + sensors[2].first = deviceTemperatures.mgm0SideA.isValid(); + sensors[2].second = deviceTemperatures.mgm0SideA.value; + sensors[3].first = deviceTemperatures.mgm2SideB.isValid(); + sensors[3].second = deviceTemperatures.mgm2SideB.value; + sensors[4].first = sensorTemperatures.tcsBoard.isValid(); + sensors[4].second = sensorTemperatures.tcsBoard.value; + numSensors = 5; + { + HeaterContext htrCtx(switchNr, redSwitchNr, acsBoardLimits); + if (selectAndReadSensorTemp(htrCtx)) { + if (chooseHeater(switchNr, redSwitchNr)) { + checkLimitsAndCtrlHeater(htrCtx); + } + resetSensorsArray(); + return; } - resetSensorsArray(); - return; } - + resetSensorsArray(); // B side sensors[0].first = deviceTemperatures.gyro2SideB.isValid(); sensors[0].second = deviceTemperatures.gyro2SideB.value; @@ -939,17 +1006,21 @@ void ThermalController::ctrlAcsBoard() { sensors[1].second = deviceTemperatures.mgm2SideB.value; sensors[2].first = deviceTemperatures.gyro3SideB.isValid(); sensors[2].second = deviceTemperatures.gyro3SideB.value; - sensors[3].first = sensorTemperatures.sensor_tcs_board.isValid(); - sensors[3].second = sensorTemperatures.sensor_tcs_board.value; - if (selectAndReadSensorTemp()) { - if (chooseHeater(switchNr, redSwitchNr)) { - ctrlHeater(switchNr, redSwitchNr, acsBoardLimits); - } - } else { - if (chooseHeater(switchNr, redSwitchNr)) { - if (heaterHandler.checkSwitchState(switchNr)) { - heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF); - sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl; + sensors[3].first = sensorTemperatures.tcsBoard.isValid(); + sensors[3].second = sensorTemperatures.tcsBoard.value; + numSensors = 4; + + { + HeaterContext htrCtx(switchNr, redSwitchNr, acsBoardLimits); + if (selectAndReadSensorTemp(htrCtx)) { + if (chooseHeater(switchNr, redSwitchNr)) { + checkLimitsAndCtrlHeater(htrCtx); + } + } else { + if (chooseHeater(switchNr, redSwitchNr)) { + if (heaterHandler.getSwitchState(switchNr)) { + heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF); + } } } } @@ -957,107 +1028,169 @@ void ThermalController::ctrlAcsBoard() { } void ThermalController::ctrlMgt() { - PoolReadGuard pg(&imtqThermalSet); - auto heaterReq = - static_cast(imtqThermalSet.heaterRequest.value); - - if (heaterReq == ThermalComponentIF::STATE_REQUEST_OPERATIONAL) { - sensors[0].first = sensorTemperatures.sensor_magnettorquer.isValid(); - sensors[0].second = sensorTemperatures.sensor_magnettorquer.value; - sensors[1].first = deviceTemperatures.mgt.isValid(); - sensors[1].second = deviceTemperatures.mgt.value; - sensors[2].first = sensorTemperatures.sensor_plpcdu_heatspreader.isValid(); - sensors[2].second = sensorTemperatures.sensor_plpcdu_heatspreader.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_2_ACS_BRD, heater::HEATER_3_PCDU_PDU, mgtLimits); - } + thermalComponent = MGT; + sensors[0].first = sensorTemperatures.mgt.isValid(); + sensors[0].second = sensorTemperatures.mgt.value; + sensors[1].first = deviceTemperatures.mgt.isValid(); + sensors[1].second = deviceTemperatures.mgt.value; + sensors[2].first = sensorTemperatures.plpcduHeatspreader.isValid(); + sensors[2].second = sensorTemperatures.plpcduHeatspreader.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_2_ACS_BRD, heater::HEATER_3_PCDU_PDU, mgtLimits); + ctrlComponentTemperature(htrCtx); + // TODO: trigger special event } void ThermalController::ctrlRw() { - // TODO: better solution? + Event eventToTrigger = 0; + bool oneIsAboveLimit = false; + + std::array sensorTemps{}; + // RW1 - sensors[0].first = sensorTemperatures.sensor_rw1.isValid(); - sensors[0].second = sensorTemperatures.sensor_rw1.value; + thermalComponent = RW; + sensors[0].first = sensorTemperatures.rw1.isValid(); + sensors[0].second = sensorTemperatures.rw1.value; sensors[1].first = deviceTemperatures.rw1.isValid(); sensors[1].second = deviceTemperatures.rw1.value; sensors[2].first = deviceTemperatures.rw4.isValid(); sensors[2].second = deviceTemperatures.rw4.value; - sensors[3].first = sensorTemperatures.sensor_dro.isValid(); - sensors[3].second = sensorTemperatures.sensor_dro.value; + sensors[3].first = sensorTemperatures.dro.isValid(); + sensors[3].second = sensorTemperatures.dro.value; numSensors = 4; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + { + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + ctrlComponentTemperature(htrCtx); + sensorTemps[0] = tempFloatToU32(); + if (componentAboveUpperLimit) { + oneIsAboveLimit = true; + eventToTrigger = overHeatEventToTrigger; + } + } // RW2 + thermalComponent = RW; sensors[0].first = deviceTemperatures.rw2.isValid(); sensors[0].second = deviceTemperatures.rw2.value; sensors[1].first = deviceTemperatures.rw3.isValid(); sensors[1].second = deviceTemperatures.rw3.value; - sensors[2].first = sensorTemperatures.sensor_rw1.isValid(); - sensors[2].second = sensorTemperatures.sensor_rw1.value; - sensors[3].first = sensorTemperatures.sensor_dro.isValid(); - sensors[3].second = sensorTemperatures.sensor_dro.value; + sensors[2].first = sensorTemperatures.rw1.isValid(); + sensors[2].second = sensorTemperatures.rw1.value; + sensors[3].first = sensorTemperatures.dro.isValid(); + sensors[3].second = sensorTemperatures.dro.value; numSensors = 4; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); - + { + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + ctrlComponentTemperature(htrCtx); + sensorTemps[1] = tempFloatToU32(); + if (componentAboveUpperLimit) { + oneIsAboveLimit = true; + if (eventToTrigger != ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH) { + eventToTrigger = overHeatEventToTrigger; + } + } + } // RW3 + thermalComponent = RW; sensors[0].first = deviceTemperatures.rw3.isValid(); sensors[0].second = deviceTemperatures.rw3.value; sensors[1].first = deviceTemperatures.rw4.isValid(); sensors[1].second = deviceTemperatures.rw4.value; - sensors[2].first = sensorTemperatures.sensor_rw1.isValid(); - sensors[2].second = sensorTemperatures.sensor_rw1.value; - sensors[3].first = sensorTemperatures.sensor_dro.isValid(); - sensors[3].second = sensorTemperatures.sensor_dro.value; + sensors[2].first = sensorTemperatures.rw1.isValid(); + sensors[2].second = sensorTemperatures.rw1.value; + sensors[3].first = sensorTemperatures.dro.isValid(); + sensors[3].second = sensorTemperatures.dro.value; numSensors = 4; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + { + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + ctrlComponentTemperature(htrCtx); + sensorTemps[2] = tempFloatToU32(); + if (componentAboveUpperLimit) { + oneIsAboveLimit = true; + if (eventToTrigger != ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH) { + eventToTrigger = overHeatEventToTrigger; + } + } + } // RW4 + thermalComponent = RW; sensors[0].first = deviceTemperatures.rw4.isValid(); sensors[0].second = deviceTemperatures.rw4.value; sensors[1].first = deviceTemperatures.rw1.isValid(); sensors[1].second = deviceTemperatures.rw1.value; - sensors[2].first = sensorTemperatures.sensor_rw1.isValid(); - sensors[2].second = sensorTemperatures.sensor_rw1.value; - sensors[3].first = sensorTemperatures.sensor_dro.isValid(); - sensors[3].second = sensorTemperatures.sensor_dro.value; + sensors[2].first = sensorTemperatures.rw1.isValid(); + sensors[2].second = sensorTemperatures.rw1.value; + sensors[3].first = sensorTemperatures.dro.isValid(); + sensors[3].second = sensorTemperatures.dro.value; numSensors = 4; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + { + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_6_DRO, rwLimits); + ctrlComponentTemperature(htrCtx); + sensorTemps[3] = tempFloatToU32(); + if (componentAboveUpperLimit) { + oneIsAboveLimit = true; + if (eventToTrigger != ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH) { + eventToTrigger = overHeatEventToTrigger; + } + } + } + + if (oneIsAboveLimit and not rwTooHotFlag) { + EventManagerIF::triggerEvent(objects::RW1, eventToTrigger, sensorTemps[0]); + EventManagerIF::triggerEvent(objects::RW2, eventToTrigger, sensorTemps[1]); + EventManagerIF::triggerEvent(objects::RW3, eventToTrigger, sensorTemps[2]); + EventManagerIF::triggerEvent(objects::RW4, eventToTrigger, sensorTemps[3]); + rwTooHotFlag = true; + } else if (not oneIsAboveLimit) { + rwTooHotFlag = false; + } } void ThermalController::ctrlStr() { - sensors[0].first = sensorTemperatures.sensor_startracker.isValid(); - sensors[0].second = sensorTemperatures.sensor_startracker.value; + thermalComponent = STR; + sensors[0].first = sensorTemperatures.startracker.isValid(); + sensors[0].second = sensorTemperatures.startracker.value; sensors[1].first = deviceTemperatures.startracker.isValid(); sensors[1].second = deviceTemperatures.startracker.value; - sensors[2].first = sensorTemperatures.sensor_dro.isValid(); - sensors[2].second = sensorTemperatures.sensor_dro.value; + sensors[2].first = sensorTemperatures.dro.isValid(); + sensors[2].second = sensorTemperatures.dro.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_5_STR, heater::HEATER_6_DRO, strLimits); + HeaterContext htrCtx(heater::HEATER_5_STR, heater::HEATER_6_DRO, strLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandlerWhichClearsOneShotFlag(objects::STAR_TRACKER, strTooHotFlag); } void ThermalController::ctrlIfBoard() { + thermalComponent = IF_BOARD; sensors[0].first = sensorTemperatures.tmp1075IfBrd.isValid(); sensors[0].second = sensorTemperatures.tmp1075IfBrd.value; - sensors[1].first = sensorTemperatures.sensor_magnettorquer.isValid(); - sensors[1].second = sensorTemperatures.sensor_magnettorquer.value; + sensors[1].first = sensorTemperatures.mgt.isValid(); + sensors[1].second = sensorTemperatures.mgt.value; sensors[2].first = deviceTemperatures.mgm2SideB.isValid(); sensors[2].second = deviceTemperatures.mgm2SideB.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_2_ACS_BRD, heater::HEATER_3_PCDU_PDU, ifBoardLimits); + HeaterContext htrCtx(heater::HEATER_2_ACS_BRD, heater::HEATER_3_PCDU_PDU, ifBoardLimits); + ctrlComponentTemperature(htrCtx); + // TODO: special event overheating + could go back to safe mode } void ThermalController::ctrlTcsBoard() { - sensors[0].first = sensorTemperatures.sensor_tcs_board.isValid(); - sensors[0].second = sensorTemperatures.sensor_tcs_board.value; + thermalComponent = TCS_BOARD; + sensors[0].first = sensorTemperatures.tcsBoard.isValid(); + sensors[0].second = sensorTemperatures.tcsBoard.value; sensors[1].first = sensorTemperatures.tmp1075Tcs0.isValid(); sensors[1].second = sensorTemperatures.tmp1075Tcs0.value; sensors[2].first = sensorTemperatures.tmp1075Tcs1.isValid(); sensors[2].second = sensorTemperatures.tmp1075Tcs1.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, tcsBoardLimits); + HeaterContext htrCtx(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, tcsBoardLimits); + ctrlComponentTemperature(htrCtx); + // TODO: special event overheating + could go back to safe mode } void ThermalController::ctrlObc() { + thermalComponent = OBC; sensors[0].first = deviceTemperatures.q7s.isValid(); sensors[0].second = deviceTemperatures.q7s.value; sensors[1].first = sensorTemperatures.tmp1075Tcs1.isValid(); @@ -1065,13 +1198,18 @@ void ThermalController::ctrlObc() { sensors[2].first = sensorTemperatures.tmp1075Tcs0.isValid(); sensors[2].second = sensorTemperatures.tmp1075Tcs0.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, obcLimits); - if (componentAboveCutOffLimit) { - triggerEvent(OBC_OVERHEATING); + HeaterContext htrCtx(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, obcLimits); + ctrlComponentTemperature(htrCtx); + if (componentAboveUpperLimit and not obcTooHotFlag) { + triggerEvent(tcsCtrl::OBC_OVERHEATING, tempFloatToU32()); + obcTooHotFlag = true; + } else if (not componentAboveUpperLimit) { + obcTooHotFlag = false; } } void ThermalController::ctrlObcIfBoard() { + thermalComponent = OBCIF_BOARD; sensors[0].first = deviceTemperatures.q7s.isValid(); sensors[0].second = deviceTemperatures.q7s.value; sensors[1].first = sensorTemperatures.tmp1075Tcs0.isValid(); @@ -1079,255 +1217,378 @@ void ThermalController::ctrlObcIfBoard() { sensors[2].first = sensorTemperatures.tmp1075Tcs1.isValid(); sensors[2].second = sensorTemperatures.tmp1075Tcs1.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, obcIfBoardLimits); + HeaterContext htrCtx(heater::HEATER_0_OBC_BRD, heater::HEATER_2_ACS_BRD, obcIfBoardLimits); + ctrlComponentTemperature(htrCtx); + if (componentAboveUpperLimit and not obcTooHotFlag) { + triggerEvent(tcsCtrl::OBC_OVERHEATING, tempFloatToU32()); + obcTooHotFlag = true; + } else if (not componentAboveUpperLimit) { + obcTooHotFlag = false; // TODO: !! + } } void ThermalController::ctrlSBandTransceiver() { + thermalComponent = SBAND_TRANSCEIVER; sensors[0].first = deviceTemperatures.syrlinksPowerAmplifier.isValid(); sensors[0].second = deviceTemperatures.syrlinksPowerAmplifier.value; sensors[1].first = deviceTemperatures.syrlinksBasebandBoard.isValid(); sensors[1].second = deviceTemperatures.syrlinksBasebandBoard.value; - sensors[2].first = sensorTemperatures.sensor_4k_camera.isValid(); - sensors[2].second = sensorTemperatures.sensor_4k_camera.value; + sensors[2].first = sensorTemperatures.payload4kCamera.isValid(); + sensors[2].second = sensorTemperatures.payload4kCamera.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_7_S_BAND, heater::HEATER_4_CAMERA, - sBandTransceiverLimits); - if (componentAboveCutOffLimit) { - triggerEvent(SYRLINKS_OVERHEATING); + HeaterContext htrCtx(heater::HEATER_7_S_BAND, heater::HEATER_4_CAMERA, sBandTransceiverLimits); + ctrlComponentTemperature(htrCtx); + if (componentAboveUpperLimit and not syrlinksTooHotFlag) { + triggerEvent(tcsCtrl::SYRLINKS_OVERHEATING, tempFloatToU32()); + syrlinksTooHotFlag = true; + } else if (not componentAboveUpperLimit) { + syrlinksTooHotFlag = false; } } void ThermalController::ctrlPcduP60Board() { + thermalComponent = PCDUP60_BOARD; sensors[0].first = deviceTemperatures.temp1P60dock.isValid(); sensors[0].second = deviceTemperatures.temp1P60dock.value; sensors[1].first = deviceTemperatures.temp2P60dock.isValid(); sensors[1].second = deviceTemperatures.temp2P60dock.value; numSensors = 2; - ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, pcduP60BoardLimits); + HeaterContext htrCtx(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, pcduP60BoardLimits); + ctrlComponentTemperature(htrCtx); + if (componentAboveUpperLimit and not pcduSystemTooHotFlag) { + triggerEvent(tcsCtrl::PCDU_SYSTEM_OVERHEATING, tempFloatToU32()); + pcduSystemTooHotFlag = true; + } else if (not componentAboveUpperLimit) { + pcduSystemTooHotFlag = false; + } // TODO: ! } void ThermalController::ctrlPcduAcu() { + thermalComponent = PCDUACU; heater::Switchers switchNr = heater::HEATER_3_PCDU_PDU; heater::Switchers redSwitchNr = heater::HEATER_2_ACS_BRD; if (chooseHeater(switchNr, redSwitchNr)) { bool sensorTempAvailable = true; - + // TODO: check if (deviceTemperatures.acu.value[0] != INVALID_TEMPERATURE) { sensorTemp = deviceTemperatures.acu.value[0]; } else if (deviceTemperatures.acu.value[1] != INVALID_TEMPERATURE) { sensorTemp = deviceTemperatures.acu.value[1]; } else if (deviceTemperatures.acu.value[2] != INVALID_TEMPERATURE) { sensorTemp = deviceTemperatures.acu.value[2]; - } else if (sensorTemperatures.sensor_acu.isValid()) { - sensorTemp = sensorTemperatures.sensor_acu.value; + } else if (sensorTemperatures.acu.isValid()) { + sensorTemp = sensorTemperatures.acu.value; } else { - triggerEvent(NO_VALID_SENSOR_TEMPERATURE, switchNr); + triggerEvent(tcsCtrl::NO_VALID_SENSOR_TEMPERATURE, thermalComponent); sensorTempAvailable = false; } if (sensorTempAvailable) { - ctrlHeater(switchNr, redSwitchNr, pcduAcuLimits); + HeaterContext htrCtx(switchNr, redSwitchNr, pcduAcuLimits); + checkLimitsAndCtrlHeater(htrCtx); } } + if (componentAboveUpperLimit and not pcduSystemTooHotFlag) { + triggerEvent(tcsCtrl::PCDU_SYSTEM_OVERHEATING, tempFloatToU32()); + pcduSystemTooHotFlag = true; + } else if (not componentAboveUpperLimit) { + pcduSystemTooHotFlag = false; + } } void ThermalController::ctrlPcduPdu() { + thermalComponent = PCDUPDU; sensors[0].first = deviceTemperatures.pdu1.isValid(); sensors[0].second = deviceTemperatures.pdu1.value; sensors[1].first = deviceTemperatures.pdu2.isValid(); sensors[1].second = deviceTemperatures.pdu2.value; sensors[2].first = sensorTemperatures.tmp1075Tcs0.isValid(); sensors[2].second = sensorTemperatures.tmp1075Tcs0.value; - numSensors = 2; - ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, pcduPduLimits); + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, pcduPduLimits); + ctrlComponentTemperature(htrCtx); + if (componentAboveUpperLimit and not pcduSystemTooHotFlag) { + triggerEvent(tcsCtrl::PCDU_SYSTEM_OVERHEATING, tempFloatToU32()); + pcduSystemTooHotFlag = true; + } else if (not componentAboveUpperLimit) { + pcduSystemTooHotFlag = false; + } } void ThermalController::ctrlPlPcduBoard() { + thermalComponent = PLPCDU_BOARD; sensors[0].first = sensorTemperatures.tmp1075PlPcdu0.isValid(); sensors[0].second = sensorTemperatures.tmp1075PlPcdu0.value; sensors[1].first = sensorTemperatures.tmp1075PlPcdu1.isValid(); sensors[1].second = sensorTemperatures.tmp1075PlPcdu1.value; sensors[2].first = deviceTemperatures.adcPayloadPcdu.isValid(); sensors[2].second = deviceTemperatures.adcPayloadPcdu.value; - sensors[3].first = sensorTemperatures.sensor_plpcdu_heatspreader.isValid(); - sensors[3].second = sensorTemperatures.sensor_plpcdu_heatspreader.value; + sensors[3].first = sensorTemperatures.plpcduHeatspreader.isValid(); + sensors[3].second = sensorTemperatures.plpcduHeatspreader.value; numSensors = 4; - ctrlComponentTemperature(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, plPcduBoardLimits); - if (componentAboveCutOffLimit) { - triggerEvent(PLPCDU_OVERHEATING); - } + HeaterContext htrCtx(heater::HEATER_3_PCDU_PDU, heater::HEATER_2_ACS_BRD, plPcduBoardLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); } void ThermalController::ctrlPlocMissionBoard() { - sensors[0].first = sensorTemperatures.sensor_ploc_heatspreader.isValid(); - sensors[0].second = sensorTemperatures.sensor_ploc_heatspreader.value; - sensors[1].first = sensorTemperatures.sensor_ploc_missionboard.isValid(); - sensors[1].second = sensorTemperatures.sensor_ploc_missionboard.value; - sensors[2].first = sensorTemperatures.sensor_dac_heatspreader.isValid(); - sensors[2].second = sensorTemperatures.sensor_dac_heatspreader.value; + thermalComponent = PLOCMISSION_BOARD; + sensors[0].first = sensorTemperatures.plocHeatspreader.isValid(); + sensors[0].second = sensorTemperatures.plocHeatspreader.value; + sensors[1].first = sensorTemperatures.plocMissionboard.isValid(); + sensors[1].second = sensorTemperatures.plocMissionboard.value; + sensors[2].first = sensorTemperatures.dacHeatspreader.isValid(); + sensors[2].second = sensorTemperatures.dacHeatspreader.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, - plocMissionBoardLimits); - if (componentAboveCutOffLimit) { - triggerEvent(PLOC_OVERHEATING); - } + HeaterContext htrCtx(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, + plocMissionBoardLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLOC_SUPERVISOR_HANDLER, plocTooHotFlag); } void ThermalController::ctrlPlocProcessingBoard() { - sensors[0].first = sensorTemperatures.sensor_ploc_missionboard.isValid(); - sensors[0].second = sensorTemperatures.sensor_ploc_missionboard.value; - sensors[1].first = sensorTemperatures.sensor_ploc_heatspreader.isValid(); - sensors[1].second = sensorTemperatures.sensor_ploc_heatspreader.value; - sensors[2].first = sensorTemperatures.sensor_dac_heatspreader.isValid(); - sensors[2].second = sensorTemperatures.sensor_dac_heatspreader.value; + thermalComponent = PLOCPROCESSING_BOARD; + sensors[0].first = sensorTemperatures.plocMissionboard.isValid(); + sensors[0].second = sensorTemperatures.plocMissionboard.value; + sensors[1].first = sensorTemperatures.plocHeatspreader.isValid(); + sensors[1].second = sensorTemperatures.plocHeatspreader.value; + sensors[2].first = sensorTemperatures.dacHeatspreader.isValid(); + sensors[2].second = sensorTemperatures.dacHeatspreader.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, - plocProcessingBoardLimits); + HeaterContext htrCtx(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, + plocProcessingBoardLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLOC_SUPERVISOR_HANDLER, plocTooHotFlag); } void ThermalController::ctrlDac() { - sensors[0].first = sensorTemperatures.sensor_dac_heatspreader.isValid(); - sensors[0].second = sensorTemperatures.sensor_dac_heatspreader.value; - sensors[1].first = sensorTemperatures.sensor_ploc_missionboard.isValid(); - sensors[1].second = sensorTemperatures.sensor_ploc_missionboard.value; - sensors[2].first = sensorTemperatures.sensor_ploc_heatspreader.isValid(); - sensors[2].second = sensorTemperatures.sensor_ploc_heatspreader.value; + thermalComponent = DAC; + sensors[0].first = sensorTemperatures.dacHeatspreader.isValid(); + sensors[0].second = sensorTemperatures.dacHeatspreader.value; + sensors[1].first = sensorTemperatures.plocMissionboard.isValid(); + sensors[1].second = sensorTemperatures.plocMissionboard.value; + sensors[2].first = sensorTemperatures.plocHeatspreader.isValid(); + sensors[2].second = sensorTemperatures.plocHeatspreader.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, dacLimits); + HeaterContext htrCtx(heater::HEATER_1_PLOC_PROC_BRD, heater::HEATER_0_OBC_BRD, dacLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); } void ThermalController::ctrlCameraBody() { - sensors[0].first = sensorTemperatures.sensor_4k_camera.isValid(); - sensors[0].second = sensorTemperatures.sensor_4k_camera.value; - sensors[1].first = sensorTemperatures.sensor_dro.isValid(); - sensors[1].second = sensorTemperatures.sensor_dro.value; - sensors[2].first = sensorTemperatures.sensor_mpa.isValid(); - sensors[2].second = sensorTemperatures.sensor_mpa.value; + thermalComponent = CAMERA; + sensors[0].first = sensorTemperatures.payload4kCamera.isValid(); + sensors[0].second = sensorTemperatures.payload4kCamera.value; + sensors[1].first = sensorTemperatures.dro.isValid(); + sensors[1].second = sensorTemperatures.dro.value; + sensors[2].first = sensorTemperatures.mpa.isValid(); + sensors[2].second = sensorTemperatures.mpa.value; numSensors = 3; - ctrlComponentTemperature(heater::HEATER_4_CAMERA, heater::HEATER_6_DRO, cameraLimits); -} - -void ThermalController::ctrlDro() { - sensors[0].first = sensorTemperatures.sensor_dro.isValid(); - sensors[0].second = sensorTemperatures.sensor_dro.value; - sensors[1].first = sensorTemperatures.sensor_4k_camera.isValid(); - sensors[1].second = sensorTemperatures.sensor_4k_camera.value; - sensors[2].first = sensorTemperatures.sensor_mpa.isValid(); - sensors[2].second = sensorTemperatures.sensor_mpa.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, droLimits); -} - -void ThermalController::ctrlX8() { - sensors[0].first = sensorTemperatures.sensor_x8.isValid(); - sensors[0].second = sensorTemperatures.sensor_x8.value; - sensors[1].first = sensorTemperatures.sensor_hpa.isValid(); - sensors[1].second = sensorTemperatures.sensor_hpa.value; - sensors[2].first = sensorTemperatures.sensor_tx_modul.isValid(); - sensors[2].second = sensorTemperatures.sensor_tx_modul.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, x8Limits); -} - -void ThermalController::ctrlTx() { - sensors[0].first = sensorTemperatures.sensor_tx_modul.isValid(); - sensors[0].second = sensorTemperatures.sensor_tx_modul.value; - sensors[1].first = sensorTemperatures.sensor_x8.isValid(); - sensors[1].second = sensorTemperatures.sensor_x8.value; - sensors[2].first = sensorTemperatures.sensor_mpa.isValid(); - sensors[2].second = sensorTemperatures.sensor_mpa.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, txLimits); -} - -void ThermalController::ctrlMpa() { - sensors[0].first = sensorTemperatures.sensor_mpa.isValid(); - sensors[0].second = sensorTemperatures.sensor_mpa.value; - sensors[1].first = sensorTemperatures.sensor_hpa.isValid(); - sensors[1].second = sensorTemperatures.sensor_hpa.value; - sensors[2].first = sensorTemperatures.sensor_tx_modul.isValid(); - sensors[2].second = sensorTemperatures.sensor_tx_modul.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, mpaLimits); -} - -void ThermalController::ctrlHpa() { - sensors[0].first = sensorTemperatures.sensor_hpa.isValid(); - sensors[0].second = sensorTemperatures.sensor_hpa.value; - sensors[1].first = sensorTemperatures.sensor_x8.isValid(); - sensors[1].second = sensorTemperatures.sensor_x8.value; - sensors[2].first = sensorTemperatures.sensor_mpa.isValid(); - sensors[2].second = sensorTemperatures.sensor_mpa.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, hpaLimits); - if (componentAboveCutOffLimit) { - triggerEvent(HPA_OVERHEATING); + HeaterContext htrCtx(heater::HEATER_4_CAMERA, heater::HEATER_6_DRO, cameraLimits); + ctrlComponentTemperature(htrCtx); + if (componentAboveUpperLimit and not camTooHotOneShotFlag) { + triggerEvent(tcsCtrl::CAMERA_OVERHEATING, tempFloatToU32()); + CommandMessage msg; + HealthMessage::setHealthMessage(&msg, HealthMessage::HEALTH_SET, HealthState::FAULTY); + ReturnValue_t result = commandQueue->sendMessage(camId, &msg); + if (result != returnvalue::OK) { + sif::error << "ThermalController::ctrlCameraBody(): Sending health message failed" + << std::endl; + } + camTooHotOneShotFlag = true; + } else if (not componentAboveUpperLimit) { + camTooHotOneShotFlag = false; } } -void ThermalController::performThermalModuleCtrl() { - ctrlCameraBody(); +void ThermalController::ctrlDro() { + thermalComponent = DRO; + sensors[0].first = sensorTemperatures.dro.isValid(); + sensors[0].second = sensorTemperatures.dro.value; + sensors[1].first = sensorTemperatures.payload4kCamera.isValid(); + sensors[1].second = sensorTemperatures.payload4kCamera.value; + sensors[2].first = sensorTemperatures.mpa.isValid(); + sensors[2].second = sensorTemperatures.mpa.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, droLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); +} + +void ThermalController::ctrlX8() { + thermalComponent = X8; + sensors[0].first = sensorTemperatures.x8.isValid(); + sensors[0].second = sensorTemperatures.x8.value; + sensors[1].first = sensorTemperatures.hpa.isValid(); + sensors[1].second = sensorTemperatures.hpa.value; + sensors[2].first = sensorTemperatures.eBandTx.isValid(); + sensors[2].second = sensorTemperatures.eBandTx.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, x8Limits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); +} + +void ThermalController::ctrlTx() { + thermalComponent = TX; + sensors[0].first = sensorTemperatures.eBandTx.isValid(); + sensors[0].second = sensorTemperatures.eBandTx.value; + sensors[1].first = sensorTemperatures.x8.isValid(); + sensors[1].second = sensorTemperatures.x8.value; + sensors[2].first = sensorTemperatures.mpa.isValid(); + sensors[2].second = sensorTemperatures.mpa.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, txLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); +} + +void ThermalController::ctrlMpa() { + thermalComponent = MPA; + sensors[0].first = sensorTemperatures.mpa.isValid(); + sensors[0].second = sensorTemperatures.mpa.value; + sensors[1].first = sensorTemperatures.hpa.isValid(); + sensors[1].second = sensorTemperatures.hpa.value; + sensors[2].first = sensorTemperatures.eBandTx.isValid(); + sensors[2].second = sensorTemperatures.eBandTx.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, mpaLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); +} + +void ThermalController::ctrlHpa() { + thermalComponent = HPA; + sensors[0].first = sensorTemperatures.hpa.isValid(); + sensors[0].second = sensorTemperatures.hpa.value; + sensors[1].first = sensorTemperatures.x8.isValid(); + sensors[1].second = sensorTemperatures.x8.value; + sensors[2].first = sensorTemperatures.mpa.isValid(); + sensors[2].second = sensorTemperatures.mpa.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_4_CAMERA, hpaLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandler(objects::PLPCDU_HANDLER, eBandTooHotFlag); +} + +void ThermalController::ctrlScexBoard() { + thermalComponent = SCEX_BOARD; + sensors[0].first = sensorTemperatures.scex.isValid(); + sensors[0].second = sensorTemperatures.scex.value; + sensors[1].first = sensorTemperatures.x8.isValid(); + sensors[1].second = sensorTemperatures.x8.value; + sensors[2].first = sensorTemperatures.hpa.isValid(); + sensors[2].second = sensorTemperatures.hpa.value; + numSensors = 3; + HeaterContext htrCtx(heater::HEATER_6_DRO, heater::HEATER_5_STR, scexBoardLimits); + ctrlComponentTemperature(htrCtx); + tooHotHandlerWhichClearsOneShotFlag(objects::SCEX, scexTooHotFlag); +} + +void ThermalController::performThermalModuleCtrl(const HeaterSwitchStates& heaterSwitchStates) { ctrlAcsBoard(); ctrlMgt(); ctrlRw(); ctrlStr(); ctrlIfBoard(); - ctrlAcsBoard(); + ctrlTcsBoard(); ctrlObc(); ctrlObcIfBoard(); ctrlSBandTransceiver(); ctrlPcduP60Board(); ctrlPcduAcu(); ctrlPcduPdu(); - ctrlPlPcduBoard(); + + // Payload components + std::array plocInAllowedRange{}; ctrlPlocMissionBoard(); + plocInAllowedRange.at(0) = not componentAboveUpperLimit; ctrlPlocProcessingBoard(); - ctrlDac(); + plocInAllowedRange.at(1) = not componentAboveUpperLimit; - ctrlDro(); - ctrlX8(); - ctrlHpa(); - ctrlTx(); - ctrlMpa(); + if (plocTooHotFlag) { + bool clearFlag = true; + for (const auto& inRange : plocInAllowedRange) { + if (not inRange) { + clearFlag = false; + } + } + if (clearFlag) { + plocTooHotFlag = false; + } + } + ctrlCameraBody(); ctrlScexBoard(); -} -void ThermalController::ctrlScexBoard() { - sensors[0].first = sensorTemperatures.sensor_scex.isValid(); - sensors[0].second = sensorTemperatures.sensor_scex.value; - sensors[1].first = sensorTemperatures.sensor_x8.isValid(); - sensors[1].second = sensorTemperatures.sensor_x8.value; - sensors[2].first = sensorTemperatures.sensor_hpa.isValid(); - sensors[2].second = sensorTemperatures.sensor_hpa.value; - numSensors = 3; - ctrlComponentTemperature(heater::HEATER_6_DRO, heater::HEATER_5_STR, scexBoardLimits); -} + // E-Band + std::array eBandInAllowedRange{}; + ctrlPlPcduBoard(); + eBandInAllowedRange.at(0) = not componentAboveUpperLimit; + ctrlDac(); + eBandInAllowedRange.at(1) = not componentAboveUpperLimit; + ctrlDro(); + eBandInAllowedRange.at(2) = not componentAboveUpperLimit; + ctrlX8(); + eBandInAllowedRange.at(3) = not componentAboveUpperLimit; + ctrlHpa(); + eBandInAllowedRange.at(4) = not componentAboveUpperLimit; + ctrlTx(); + eBandInAllowedRange.at(5) = not componentAboveUpperLimit; + ctrlMpa(); + eBandInAllowedRange.at(6) = not componentAboveUpperLimit; -void ThermalController::ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr, - struct TempLimits& tempLimit) { - componentAboveCutOffLimit = false; - // Heater off - if (not heaterHandler.checkSwitchState(switchNr)) { - if (sensorTemp < tempLimit.opLowerLimit) { - heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::ON); - sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " ON" << std::endl; + if (eBandTooHotFlag) { + bool clearFlag = true; + for (const auto& inRange : eBandInAllowedRange) { + if (not inRange) { + clearFlag = false; + } } - // Heater on - } else if (heaterHandler.checkSwitchState(switchNr)) { - if (sensorTemp >= tempLimit.opLowerLimit + TEMP_OFFSET) { - heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF); - sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl; + if (clearFlag) { + eBandTooHotFlag = false; } - } else if (not redSwitchNrInUse) { - if (heaterHandler.checkSwitchState(redSwitchNr)) { - if (sensorTemp >= tempLimit.cutOffLimit) { - componentAboveCutOffLimit = true; - heaterHandler.switchHeater(redSwitchNr, HeaterHandler::SwitchState::OFF); - sif::info << "ThermalController::ctrlHeater: Heater" << redSwitchNr << " OFF" << std::endl; + } + + heaterTransitionControl(heaterSwitchStates); +} +void ThermalController::ctrlComponentTemperature(HeaterContext& htrCtx) { + if (selectAndReadSensorTemp(htrCtx)) { + if (chooseHeater(htrCtx.switchNr, htrCtx.redSwitchNr)) { + checkLimitsAndCtrlHeater(htrCtx); + } + } else { + // TODO: muss der Heater dann wirklich abgeschalten werden? + if (chooseHeater(htrCtx.switchNr, htrCtx.redSwitchNr)) { + if (heaterHandler.getSwitchState(htrCtx.switchNr)) { + heaterHandler.switchHeater(htrCtx.switchNr, HeaterHandler::SwitchState::OFF); } } } + resetSensorsArray(); } +bool ThermalController::selectAndReadSensorTemp(HeaterContext& htrCtx) { + for (unsigned i = 0; i < numSensors; i++) { + if (sensors[i].first and sensors[i].second != INVALID_TEMPERATURE and + sensors[i].second > SANITY_LIMIT_LOWER_TEMP and + sensors[i].second < SANITY_LIMIT_UPPER_TEMP) { + sensorTemp = sensors[i].second; + thermalStates[thermalComponent].errorCounter = 0; + return true; + } + } + thermalStates[thermalComponent].errorCounter++; + if (thermalComponent != RW and thermalComponent != ACS_BOARD) { + if (thermalStates[thermalComponent].errorCounter <= 3) { + triggerEvent(tcsCtrl::NO_VALID_SENSOR_TEMPERATURE, thermalComponent); + } + } else { + if (thermalStates[thermalComponent].errorCounter <= 8) { + triggerEvent(tcsCtrl::NO_VALID_SENSOR_TEMPERATURE, thermalComponent); + } + } + + return false; +} bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switchers redSwitchNr) { bool heaterAvailable = true; @@ -1337,7 +1598,7 @@ bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switch redSwitchNrInUse = true; } else { heaterAvailable = false; - triggerEvent(NO_HEALTHY_HEATER_AVAILABLE, switchNr, redSwitchNr); + triggerEvent(tcsCtrl::NO_HEALTHY_HEATER_AVAILABLE, switchNr, redSwitchNr); } } else { redSwitchNrInUse = false; @@ -1345,40 +1606,159 @@ bool ThermalController::chooseHeater(heater::Switchers& switchNr, heater::Switch return heaterAvailable; } -bool ThermalController::selectAndReadSensorTemp() { - for (unsigned i = 0; i < numSensors; i++) { - if (sensors[i].first and sensors[i].second != INVALID_TEMPERATURE) { - sensorTemp = sensors[i].second; - return true; - } +void ThermalController::heaterCtrlTempTooHighHandler(HeaterContext& htrCtx, const char* whatLimit) { + if (htrCtx.switchState == HeaterHandler::SwitchState::ON) { + sif::info << "TCS: Component " << static_cast(thermalComponent) << " too warm, above " + << whatLimit << ", switching off heater" << std::endl; + heaterHandler.switchHeater(htrCtx.switchNr, HeaterHandler::SwitchState::OFF); + heaterStates[htrCtx.switchNr].switchTransition = true; + heaterStates[htrCtx.switchNr].target = HeaterHandler::SwitchState::OFF; + } + if (heaterHandler.getSwitchState(htrCtx.redSwitchNr) == HeaterHandler::SwitchState::ON) { + heaterHandler.switchHeater(htrCtx.redSwitchNr, HeaterHandler::SwitchState::OFF); + heaterStates[htrCtx.redSwitchNr].switchTransition = true; + heaterStates[htrCtx.redSwitchNr].target = HeaterHandler::SwitchState::OFF; } - triggerEvent(NO_VALID_SENSOR_TEMPERATURE); - return false; } -void ThermalController::ctrlComponentTemperature(heater::Switchers switchNr, - heater::Switchers redSwitchNr, - TempLimits& tempLimit) { - if (selectAndReadSensorTemp()) { - if (chooseHeater(switchNr, redSwitchNr)) { - ctrlHeater(switchNr, redSwitchNr, tempLimit); - } +void ThermalController::checkLimitsAndCtrlHeater(HeaterContext& htrCtx) { + componentAboveCutOffLimit = false; + componentAboveUpperLimit = false; + // Stay passive during switch transitions, wait for heater switching to complete. Otherwise, + // still check whether components are out of range, which might be important information for the + // top level control loop. + if (heaterStates[htrCtx.switchNr].switchTransition) { + htrCtx.doHeaterHandling = false; + heaterCtrlCheckUpperLimits(htrCtx); } else { - if (chooseHeater(switchNr, - redSwitchNr)) { // TODO: muss der Heater dann wirklich abgeschalten werden? - if (heaterHandler.checkSwitchState(switchNr)) { - heaterHandler.switchHeater(switchNr, HeaterHandler::SwitchState::OFF); - sif::info << "ThermalController::ctrlHeater: Heater" << switchNr << " OFF" << std::endl; + // Heater off + htrCtx.switchState = heaterHandler.getSwitchState(htrCtx.switchNr); + if (htrCtx.switchState == HeaterHandler::SwitchState::OFF) { + if (sensorTemp < htrCtx.tempLimit.opLowerLimit) { + heaterHandler.switchHeater(htrCtx.switchNr, HeaterHandler::SwitchState::ON); + sif::info << "ThermalController::checkLimitsAndCtrlHeater: Heater " + << static_cast(thermalComponent) << " ON" << std::endl; + heaterStates[htrCtx.switchNr].switchTransition = true; + thermalStates[thermalComponent].heating = true; + heaterStates[htrCtx.switchNr].target = HeaterHandler::SwitchState::ON; + } else { + thermalStates[thermalComponent].heating = false; + } + heaterCtrlCheckUpperLimits(htrCtx); + // Heater on + } else if (heaterHandler.getSwitchState(htrCtx.switchNr) == HeaterHandler::SwitchState::ON) { + if (thermalStates[thermalComponent].heating) { + // We are already in a heating cycle, so need to check whether heating task is complete. + if (sensorTemp >= htrCtx.tempLimit.opLowerLimit + TEMP_OFFSET) { + heaterHandler.switchHeater(htrCtx.switchNr, HeaterHandler::SwitchState::OFF); + sif::info << "ThermalController::checkLimitsAndCtrlHeater: Heater " + << static_cast(thermalComponent) << " OFF" << std::endl; + heaterStates[htrCtx.switchNr].switchTransition = true; + heaterStates[htrCtx.switchNr].target = HeaterHandler::SwitchState::OFF; + thermalStates[thermalComponent].heating = false; + } + } else { + // This can happen if heater is used as alternative heater (no regular heating cycle), so we + // should still check the upper limits. + bool tooHighHandlerAlreadyCalled = heaterCtrlCheckUpperLimits(htrCtx); + if (sensorTemp >= htrCtx.tempLimit.cutOffLimit) { + componentAboveCutOffLimit = true; + if (not tooHighHandlerAlreadyCalled) { + heaterCtrlTempTooHighHandler(htrCtx, "CutOff-Limit"); + } + } } } } - resetSensorsArray(); +} + +bool ThermalController::heaterCtrlCheckUpperLimits(HeaterContext& htrCtx) { + if (sensorTemp >= htrCtx.tempLimit.nopUpperLimit) { + componentAboveUpperLimit = true; + if (htrCtx.doHeaterHandling) { + heaterCtrlTempTooHighHandler(htrCtx, "NOP-Limit"); + } + overHeatEventToTrigger = ThermalComponentIF::COMPONENT_TEMP_OOL_HIGH; + return true; + } else if (sensorTemp >= htrCtx.tempLimit.opUpperLimit) { + componentAboveUpperLimit = true; + if (htrCtx.doHeaterHandling) { + heaterCtrlTempTooHighHandler(htrCtx, "OP-Limit"); + } + overHeatEventToTrigger = ThermalComponentIF::COMPONENT_TEMP_HIGH; + return true; + } + return false; } void ThermalController::resetSensorsArray() { - // TODO: müssen auch andere Variablen resettet werden? senstemp? for (auto& validValuePair : sensors) { validValuePair.first = false; validValuePair.second = INVALID_TEMPERATURE; } + thermalComponent = NONE; +} +void ThermalController::heaterTransitionControl(const HeaterSwitchStates& currentHeaterStates) { + // TODO: Test + for (unsigned i = 0; i < 7; i++) { + if (heaterStates[i].switchTransition) { + if (currentHeaterStates[i] == heaterStates[i].target) { + heaterStates[i].switchTransition = false; + continue; + } + if (heaterStates[i].heaterSwitchControlCycles > 3) { + heaterStates[i].switchTransition = false; + heaterStates[i].heaterSwitchControlCycles = 0; + } + heaterStates[i].heaterSwitchControlCycles++; + } + } +} +uint32_t ThermalController::tempFloatToU32() const { + auto sensorTempAsFloat = static_cast(sensorTemp); + uint32_t tempRaw = 0; + size_t dummyLen = 0; + SerializeAdapter::serialize(&sensorTempAsFloat, reinterpret_cast(&tempRaw), &dummyLen, + sizeof(tempRaw), SerializeIF::Endianness::NETWORK); + return tempRaw; +} + +void ThermalController::setMode(Mode_t mode) { + if (mode == MODE_OFF) { + transitionToOff = false; + } + this->mode = mode; + modeHelper.modeChanged(mode, submode); + announceMode(false); +} + +bool ThermalController::tooHotHandler(object_id_t object, bool& oneShotFlag) { + if (componentAboveUpperLimit and not oneShotFlag) { + // Too hot -> returns true + EventManagerIF::triggerEvent(object, overHeatEventToTrigger, tempFloatToU32()); + oneShotFlag = true; + return true; + } + return false; +} + +void ThermalController::tooHotHandlerWhichClearsOneShotFlag(object_id_t object, bool& oneShotFlag) { + // Clear the one shot flag is the component is in acceptable temperature range. + if (not tooHotHandler(object, oneShotFlag) and not componentAboveUpperLimit) { + oneShotFlag = false; + } +} + +void ThermalController::startTransition(Mode_t mode_, Submode_t submode_) { + triggerEvent(CHANGING_MODE, mode_, submode_); + if (mode_ == MODE_OFF) { + for (uint8_t i = 0; i < heater::Switchers::NUMBER_OF_SWITCHES; i++) { + heaterHandler.switchHeater(static_cast(i), + HeaterHandler::SwitchState::OFF); + } + transitionToOff = true; + transitionToOffCycles = 0; + } else { + setMode(mode_); + } } diff --git a/mission/controller/ThermalController.h b/mission/controller/ThermalController.h index 8a8e7773..d531e813 100644 --- a/mission/controller/ThermalController.h +++ b/mission/controller/ThermalController.h @@ -7,24 +7,23 @@ #include #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include -#include "mission/devices/HeaterHandler.h" -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" -#include "mission/trace.h" - /** * NOP Limit: Hard limit for device, usually from datasheet. Device damage is possible lif NOP limit * is exceeded. @@ -46,17 +45,73 @@ struct TempLimits { float nopUpperLimit; }; +struct ThermalState { + uint8_t errorCounter; + bool heating; + uint32_t heaterStartTime; +}; + +struct HeaterState { + bool switchTransition; + HeaterHandler::SwitchState target; + uint8_t heaterSwitchControlCycles; +}; + +using HeaterSwitchStates = std::array; + +enum ThermalComponents : uint8_t { + NONE = 0, + ACS_BOARD = 1, + MGT = 2, + RW = 3, + STR = 4, + IF_BOARD = 5, + TCS_BOARD = 6, + OBC = 7, + OBCIF_BOARD = 8, + SBAND_TRANSCEIVER = 9, + PCDUP60_BOARD = 10, + PCDUACU = 11, + PCDUPDU = 12, + PLPCDU_BOARD = 13, + PLOCMISSION_BOARD = 14, + PLOCPROCESSING_BOARD = 15, + DAC = 16, + CAMERA = 17, + DRO = 18, + X8 = 19, + HPA = 20, + TX = 21, + MPA = 22, + SCEX_BOARD = 23, + NUM_ENTRIES +}; + class ThermalController : public ExtendedControllerBase { public: static const uint16_t INVALID_TEMPERATURE = 999; static const uint8_t NUMBER_OF_SENSORS = 16; + static constexpr int16_t SANITY_LIMIT_LOWER_TEMP = -80; + static constexpr int16_t SANITY_LIMIT_UPPER_TEMP = 160; ThermalController(object_id_t objectId, HeaterHandler& heater); ReturnValue_t initialize() override; protected: - void performThermalModuleCtrl(); + struct HeaterContext { + public: + HeaterContext(heater::Switchers switchNr, heater::Switchers redundantSwitchNr, + const TempLimits& tempLimit) + : switchNr(switchNr), redSwitchNr(redundantSwitchNr), tempLimit(tempLimit) {} + bool doHeaterHandling = true; + heater::Switchers switchNr; + HeaterHandler::SwitchState switchState = HeaterHandler::SwitchState::OFF; + heater::Switchers redSwitchNr; + const TempLimits& tempLimit; + }; + + void performThermalModuleCtrl(const HeaterSwitchStates& heaterSwitchStates); ReturnValue_t handleCommandMessage(CommandMessage* message) override; void performControlOperation() override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, @@ -68,16 +123,7 @@ class ThermalController : public ExtendedControllerBase { uint32_t* msToReachTheMode) override; private: - static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_CONTROLLER; - static constexpr Event NO_VALID_SENSOR_TEMPERATURE = MAKE_EVENT(0, severity::MEDIUM); - static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, severity::MEDIUM); - static constexpr Event SYRLINKS_OVERHEATING = MAKE_EVENT(2, severity::HIGH); - static constexpr Event PLOC_OVERHEATING = MAKE_EVENT(3, severity::HIGH); - static constexpr Event OBC_OVERHEATING = MAKE_EVENT(4, severity::HIGH); - static constexpr Event HPA_OVERHEATING = MAKE_EVENT(5, severity::HIGH); - static constexpr Event PLPCDU_OVERHEATING = MAKE_EVENT(6, severity::HIGH); - - static const uint32_t DELAY = 500; + static const uint32_t INIT_DELAY = 1500; static const uint32_t TEMP_OFFSET = 5; @@ -97,22 +143,22 @@ class ThermalController : public ExtendedControllerBase { DeviceHandlerThermalSet imtqThermalSet; // Temperature Sensors - MAX31865::PrimarySet max31865Set0; - MAX31865::PrimarySet max31865Set1; - MAX31865::PrimarySet max31865Set2; - MAX31865::PrimarySet max31865Set3; - MAX31865::PrimarySet max31865Set4; - MAX31865::PrimarySet max31865Set5; - MAX31865::PrimarySet max31865Set6; - MAX31865::PrimarySet max31865Set7; - MAX31865::PrimarySet max31865Set8; - MAX31865::PrimarySet max31865Set9; - MAX31865::PrimarySet max31865Set10; - MAX31865::PrimarySet max31865Set11; - MAX31865::PrimarySet max31865Set12; - MAX31865::PrimarySet max31865Set13; - MAX31865::PrimarySet max31865Set14; - MAX31865::PrimarySet max31865Set15; + MAX31865::PrimarySet maxSet0PlocHspd; + MAX31865::PrimarySet maxSet1PlocMissionBrd; + MAX31865::PrimarySet maxSet2PlCam; + MAX31865::PrimarySet maxSet3DacHspd; + MAX31865::PrimarySet maxSet4Str; + MAX31865::PrimarySet maxSet5Rw1MxMy; + MAX31865::PrimarySet maxSet6Dro; + MAX31865::PrimarySet maxSet7Scex; + MAX31865::PrimarySet maxSet8X8; + MAX31865::PrimarySet maxSet9Hpa; + MAX31865::PrimarySet maxSet10EbandTx; + MAX31865::PrimarySet maxSet11Mpa; + MAX31865::PrimarySet maxSet31865Set12; + MAX31865::PrimarySet maxSet13PlPcduHspd; + MAX31865::PrimarySet maxSet14TcsBrd; + MAX31865::PrimarySet maxSet15Imtq; TMP1075::Tmp1075Dataset tmp1075SetTcs0; TMP1075::Tmp1075Dataset tmp1075SetTcs1; @@ -192,18 +238,38 @@ class ThermalController : public ExtendedControllerBase { TempLimits dacLimits = TempLimits(-65.0, -40.0, 113.0, 118.0, 150.0); TempLimits cameraLimits = TempLimits(-40.0, -30.0, 60.0, 65.0, 85.0); TempLimits droLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0); - TempLimits x8Limits = TempLimits(-40.0, -30.0, -75.0, 80.0, 90.0); - TempLimits hpaLimits = TempLimits(-40.0, -30.0, -75.0, 80.0, 90.0); - TempLimits txLimits = TempLimits(-40.0, -30.0, -75.0, 80.0, 90.0); - TempLimits mpaLimits = TempLimits(-40.0, -30.0, -75.0, 80.0, 90.0); + TempLimits x8Limits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0); + TempLimits hpaLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0); + TempLimits txLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0); + TempLimits mpaLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0); TempLimits scexBoardLimits = TempLimits(-60.0, -40.0, 80.0, 85.0, 150.0); double sensorTemp = INVALID_TEMPERATURE; + ThermalComponents thermalComponent = NONE; bool redSwitchNrInUse = false; + MessageQueueId_t camId = MessageQueueIF::NO_QUEUE; bool componentAboveCutOffLimit = false; + bool componentAboveUpperLimit = false; + Event overHeatEventToTrigger; + bool eBandTooHotFlag = false; + bool camTooHotOneShotFlag = false; + bool scexTooHotFlag = false; + bool plocTooHotFlag = false; + bool pcduSystemTooHotFlag = false; + bool syrlinksTooHotFlag = false; + bool obcTooHotFlag = false; + bool strTooHotFlag = false; + bool rwTooHotFlag = false; - // Initial delay to make sure all pool variables have been initialized their owners - Countdown initialCountdown = Countdown(DELAY); + bool transitionToOff = false; + uint32_t transitionToOffCycles = 0; + uint32_t cycles = 0; + std::array thermalStates{}; + std::array heaterStates{}; + + // Initial delay to make sure all pool variables have been initialized their owners. + // Also, wait for system initialization to complete. + Countdown initialCountdown = Countdown(INIT_DELAY); #if OBSW_THREAD_TRACING == 1 uint32_t opCounter = 0; @@ -222,16 +288,20 @@ class ThermalController : public ExtendedControllerBase { static constexpr dur_millis_t MUTEX_TIMEOUT = 50; + void startTransition(Mode_t mode, Submode_t submode) override; + void resetSensorsArray(); void copySensors(); void copySus(); void copyDevices(); - void ctrlComponentTemperature(heater::Switchers switchNr, heater::Switchers redSwitchNr, - TempLimits& tempLimit); - void ctrlHeater(heater::Switchers switchNr, heater::Switchers redSwitchNr, TempLimits& tempLimit); + void ctrlComponentTemperature(HeaterContext& heaterContext); + void checkLimitsAndCtrlHeater(HeaterContext& heaterContext); + bool heaterCtrlCheckUpperLimits(HeaterContext& heaterContext); + void heaterCtrlTempTooHighHandler(HeaterContext& heaterContext, const char* whatLimit); + bool chooseHeater(heater::Switchers& switchNr, heater::Switchers redSwitchNr); - bool selectAndReadSensorTemp(); + bool selectAndReadSensorTemp(HeaterContext& htrCtx); void ctrlAcsBoard(); void ctrlMgt(); @@ -256,6 +326,11 @@ class ThermalController : public ExtendedControllerBase { void ctrlTx(); void ctrlMpa(); void ctrlScexBoard(); + void heaterTransitionControl(const HeaterSwitchStates& currentHeaterStates); + void setMode(Mode_t mode); + uint32_t tempFloatToU32() const; + bool tooHotHandler(object_id_t object, bool& oneShotFlag); + void tooHotHandlerWhichClearsOneShotFlag(object_id_t object, bool& oneShotFlag); }; #endif /* MISSION_CONTROLLER_THERMALCONTROLLER_H_ */ diff --git a/mission/controller/acs/SensorValues.h b/mission/controller/acs/SensorValues.h index 25946d0b..d7da66c0 100644 --- a/mission/controller/acs/SensorValues.h +++ b/mission/controller/acs/SensorValues.h @@ -3,13 +3,13 @@ #include #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include namespace ACS { diff --git a/mission/controller/controllerdefinitions/ThermalControllerDefinitions.h b/mission/controller/tcsDefs.h similarity index 77% rename from mission/controller/controllerdefinitions/ThermalControllerDefinitions.h rename to mission/controller/tcsDefs.h index e7c95218..e187091b 100644 --- a/mission/controller/controllerdefinitions/ThermalControllerDefinitions.h +++ b/mission/controller/tcsDefs.h @@ -5,9 +5,19 @@ #include #include "devices/heaterSwitcherList.h" +#include "eive/eventSubsystemIds.h" namespace tcsCtrl { +static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_CONTROLLER; +static constexpr Event NO_VALID_SENSOR_TEMPERATURE = MAKE_EVENT(0, severity::MEDIUM); +static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, severity::MEDIUM); +static constexpr Event SYRLINKS_OVERHEATING = MAKE_EVENT(2, severity::HIGH); +static constexpr Event OBC_OVERHEATING = MAKE_EVENT(4, severity::HIGH); +static constexpr Event CAMERA_OVERHEATING = MAKE_EVENT(5, severity::HIGH); +static constexpr Event PCDU_SYSTEM_OVERHEATING = MAKE_EVENT(6, severity::HIGH); +static constexpr Event HEATER_NOT_OFF_FOR_OFF_MODE = MAKE_EVENT(7, severity::MEDIUM); + enum SetId : uint32_t { SENSOR_TEMPERATURES = 0, DEVICE_TEMPERATURES = 1, @@ -93,34 +103,33 @@ static const uint8_t ENTRIES_SUS_TEMPERATURE_SET = 12; */ class SensorTemperatures : public StaticLocalDataSet { public: - SensorTemperatures(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, SENSOR_TEMPERATURES) {} + explicit SensorTemperatures(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, SENSOR_TEMPERATURES) {} - SensorTemperatures(object_id_t objectId) + explicit SensorTemperatures(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, SENSOR_TEMPERATURES)) {} - lp_var_t sensor_ploc_heatspreader = + lp_var_t plocHeatspreader = lp_var_t(sid.objectId, PoolIds::SENSOR_PLOC_HEATSPREADER, this); - lp_var_t sensor_ploc_missionboard = + lp_var_t plocMissionboard = lp_var_t(sid.objectId, PoolIds::SENSOR_PLOC_MISSIONBOARD, this); - lp_var_t sensor_4k_camera = lp_var_t(sid.objectId, PoolIds::SENSOR_4K_CAMERA, this); - lp_var_t sensor_dac_heatspreader = + lp_var_t payload4kCamera = lp_var_t(sid.objectId, PoolIds::SENSOR_4K_CAMERA, this); + lp_var_t dacHeatspreader = lp_var_t(sid.objectId, PoolIds::SENSOR_DAC_HEATSPREADER, this); - lp_var_t sensor_startracker = - lp_var_t(sid.objectId, PoolIds::SENSOR_STARTRACKER, this); - lp_var_t sensor_rw1 = lp_var_t(sid.objectId, PoolIds::SENSOR_RW1, this); - lp_var_t sensor_scex = lp_var_t(sid.objectId, PoolIds::SENSOR_SCEX, this); - lp_var_t sensor_tx_modul = lp_var_t(sid.objectId, PoolIds::SENSOR_TX_MODUL, this); + lp_var_t startracker = lp_var_t(sid.objectId, PoolIds::SENSOR_STARTRACKER, this); + lp_var_t rw1 = lp_var_t(sid.objectId, PoolIds::SENSOR_RW1, this); + lp_var_t scex = lp_var_t(sid.objectId, PoolIds::SENSOR_SCEX, this); + lp_var_t eBandTx = lp_var_t(sid.objectId, PoolIds::SENSOR_TX_MODUL, this); // E-Band module - lp_var_t sensor_dro = lp_var_t(sid.objectId, PoolIds::SENSOR_DRO, this); - lp_var_t sensor_mpa = lp_var_t(sid.objectId, PoolIds::SENSOR_MPA, this); - lp_var_t sensor_x8 = lp_var_t(sid.objectId, PoolIds::SENSOR_X8, this); - lp_var_t sensor_hpa = lp_var_t(sid.objectId, PoolIds::SENSOR_HPA, this); - lp_var_t sensor_acu = lp_var_t(sid.objectId, PoolIds::SENSOR_ACU, this); - lp_var_t sensor_plpcdu_heatspreader = + lp_var_t dro = lp_var_t(sid.objectId, PoolIds::SENSOR_DRO, this); + lp_var_t mpa = lp_var_t(sid.objectId, PoolIds::SENSOR_MPA, this); + lp_var_t x8 = lp_var_t(sid.objectId, PoolIds::SENSOR_X8, this); + lp_var_t hpa = lp_var_t(sid.objectId, PoolIds::SENSOR_HPA, this); + lp_var_t acu = lp_var_t(sid.objectId, PoolIds::SENSOR_ACU, this); + lp_var_t plpcduHeatspreader = lp_var_t(sid.objectId, PoolIds::SENSOR_PLPCDU_HEATSPREADER, this); - lp_var_t sensor_tcs_board = lp_var_t(sid.objectId, PoolIds::SENSOR_TCS_BOARD, this); - lp_var_t sensor_magnettorquer = - lp_var_t(sid.objectId, PoolIds::SENSOR_MAGNETTORQUER, this); + lp_var_t tcsBoard = lp_var_t(sid.objectId, PoolIds::SENSOR_TCS_BOARD, this); + lp_var_t mgt = lp_var_t(sid.objectId, PoolIds::SENSOR_MAGNETTORQUER, this); lp_var_t tmp1075Tcs0 = lp_var_t(sid.objectId, PoolIds::SENSOR_TMP1075_TCS_0, this); lp_var_t tmp1075Tcs1 = lp_var_t(sid.objectId, PoolIds::SENSOR_TMP1075_TCS_1, this); lp_var_t tmp1075PlPcdu0 = @@ -137,9 +146,10 @@ class SensorTemperatures : public StaticLocalDataSet { public: - DeviceTemperatures(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, DEVICE_TEMPERATURES) {} + explicit DeviceTemperatures(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, DEVICE_TEMPERATURES) {} - DeviceTemperatures(object_id_t objectId) + explicit DeviceTemperatures(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, DEVICE_TEMPERATURES)) {} lp_var_t q7s = lp_var_t(sid.objectId, PoolIds::TEMP_Q7S, this); @@ -178,9 +188,11 @@ class DeviceTemperatures : public StaticLocalDataSet { public: - SusTemperatures(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, SUS_TEMPERATURES) {} + explicit SusTemperatures(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, SUS_TEMPERATURES) {} - SusTemperatures(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, SUS_TEMPERATURES)) {} + explicit SusTemperatures(object_id_t objectId) + : StaticLocalDataSet(sid_t(objectId, SUS_TEMPERATURES)) {} lp_var_t sus_0_n_loc_xfyfzm_pt_xf = lp_var_t(sid.objectId, PoolIds::SUS_0_N_LOC_XFYFZM_PT_XF, this); diff --git a/mission/core/CMakeLists.txt b/mission/core/CMakeLists.txt deleted file mode 100644 index ce731219..00000000 --- a/mission/core/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -target_sources(${LIB_EIVE_MISSION} PRIVATE GenericFactory.cpp scheduling.cpp - pollingSeqTables.cpp) diff --git a/mission/csp/CMakeLists.txt b/mission/csp/CMakeLists.txt deleted file mode 100644 index d5b6f3fe..00000000 --- a/mission/csp/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -target_sources(${LIB_EIVE_MISSION} PRIVATE CspCookie.cpp) diff --git a/mission/devices/CMakeLists.txt b/mission/devices/CMakeLists.txt deleted file mode 100644 index 68e369a0..00000000 --- a/mission/devices/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -target_sources( - ${LIB_EIVE_MISSION} - PRIVATE GomspaceDeviceHandler.cpp - BpxBatteryHandler.cpp - Tmp1075Handler.cpp - PcduHandler.cpp - P60DockHandler.cpp - Pdu1Handler.cpp - Pdu2Handler.cpp - ACUHandler.cpp - SyrlinksHandler.cpp - Max31865PT1000Handler.cpp - Max31865EiveHandler.cpp - ImtqHandler.cpp - HeaterHandler.cpp - RadiationSensorHandler.cpp - GyrAdis1650XHandler.cpp - GyrL3gCustomHandler.cpp - MgmRm3100CustomHandler.cpp - MgmLis3CustomHandler.cpp - RwHandler.cpp - max1227.cpp - SusHandler.cpp - PayloadPcduHandler.cpp - SolarArrayDeploymentHandler.cpp - ScexDeviceHandler.cpp) - -add_subdirectory(devicedefinitions) diff --git a/mission/devices/devicedefinitions/CMakeLists.txt b/mission/devices/devicedefinitions/CMakeLists.txt deleted file mode 100644 index eab4d4cb..00000000 --- a/mission/devices/devicedefinitions/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -target_sources(${LIB_EIVE_MISSION} PRIVATE ScexDefinitions.cpp rwHelpers.cpp - imtqHelpers.cpp gyroAdisHelpers.cpp) diff --git a/mission/devices/devicedefinitions/GyroL3GD20Definitions.h b/mission/devices/devicedefinitions/GyroL3GD20Definitions.h deleted file mode 100644 index 43783c82..00000000 --- a/mission/devices/devicedefinitions/GyroL3GD20Definitions.h +++ /dev/null @@ -1,130 +0,0 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GYROL3GD20DEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_GYROL3GD20DEFINITIONS_H_ - -#include -#include - -#include - -namespace l3gd20h { - -/* Actual size is 15 but we round up a bit */ -static constexpr size_t MAX_BUFFER_SIZE = 16; - -static constexpr uint8_t READ_MASK = 0b1000'0000; - -static constexpr uint8_t AUTO_INCREMENT_MASK = 0b0100'0000; - -static constexpr uint8_t WHO_AM_I_REG = 0b0000'1111; -static constexpr uint8_t WHO_AM_I_VAL = 0b1101'0111; - -/*------------------------------------------------------------------------*/ -/* Control registers */ -/*------------------------------------------------------------------------*/ -static constexpr uint8_t CTRL_REG_1 = 0b0010'0000; -static constexpr uint8_t CTRL_REG_2 = 0b0010'0001; -static constexpr uint8_t CTRL_REG_3 = 0b0010'0010; -static constexpr uint8_t CTRL_REG_4 = 0b0010'0011; -static constexpr uint8_t CTRL_REG_5 = 0b0010'0100; - -/* Register 1 */ -static constexpr uint8_t SET_DR_1 = 1 << 7; -static constexpr uint8_t SET_DR_0 = 1 << 6; -static constexpr uint8_t SET_BW_1 = 1 << 5; -static constexpr uint8_t SET_BW_0 = 1 << 4; -static constexpr uint8_t SET_POWER_NORMAL_MODE = 1 << 3; -static constexpr uint8_t SET_Z_ENABLE = 1 << 2; -static constexpr uint8_t SET_X_ENABLE = 1 << 1; -static constexpr uint8_t SET_Y_ENABLE = 1; - -static constexpr uint8_t CTRL_REG_1_VAL = - SET_POWER_NORMAL_MODE | SET_Z_ENABLE | SET_Y_ENABLE | SET_X_ENABLE; - -/* Register 2 */ -static constexpr uint8_t EXTERNAL_EDGE_ENB = 1 << 7; -static constexpr uint8_t LEVEL_SENSITIVE_TRIGGER = 1 << 6; -static constexpr uint8_t SET_HPM_1 = 1 << 5; -static constexpr uint8_t SET_HPM_0 = 1 << 4; -static constexpr uint8_t SET_HPCF_3 = 1 << 3; -static constexpr uint8_t SET_HPCF_2 = 1 << 2; -static constexpr uint8_t SET_HPCF_1 = 1 << 1; -static constexpr uint8_t SET_HPCF_0 = 1; - -static constexpr uint8_t CTRL_REG_2_VAL = 0b0000'0000; - -/* Register 3 */ -static constexpr uint8_t CTRL_REG_3_VAL = 0b0000'0000; - -/* Register 4 */ -static constexpr uint8_t SET_BNU = 1 << 7; -static constexpr uint8_t SET_BLE = 1 << 6; -static constexpr uint8_t SET_FS_1 = 1 << 5; -static constexpr uint8_t SET_FS_0 = 1 << 4; -static constexpr uint8_t SET_IMP_ENB = 1 << 3; -static constexpr uint8_t SET_SELF_TEST_ENB_1 = 1 << 2; -static constexpr uint8_t SET_SELF_TEST_ENB_0 = 1 << 1; -static constexpr uint8_t SET_SPI_IF_SELECT = 1; - -/* Enable big endian data format */ -static constexpr uint8_t CTRL_REG_4_VAL = SET_BLE; - -/* Register 5 */ -static constexpr uint8_t SET_REBOOT_MEM = 1 << 7; -static constexpr uint8_t SET_FIFO_ENB = 1 << 6; - -static constexpr uint8_t CTRL_REG_5_VAL = 0b0000'0000; - -/* Possible range values in degrees per second (DPS). */ -static constexpr uint16_t RANGE_DPS_00 = 245; -static constexpr uint16_t RANGE_DPS_01 = 500; -static constexpr uint16_t RANGE_DPS_11 = 2000; - -static constexpr uint8_t READ_START = CTRL_REG_1; -static constexpr size_t READ_LEN = 14; - -/* Indexing */ -static constexpr uint8_t REFERENCE_IDX = 6; -static constexpr uint8_t TEMPERATURE_IDX = 7; -static constexpr uint8_t STATUS_IDX = 8; -static constexpr uint8_t OUT_X_H = 9; -static constexpr uint8_t OUT_X_L = 10; -static constexpr uint8_t OUT_Y_H = 11; -static constexpr uint8_t OUT_Y_L = 12; -static constexpr uint8_t OUT_Z_H = 13; -static constexpr uint8_t OUT_Z_L = 14; - -/*------------------------------------------------------------------------*/ -/* Device Handler specific */ -/*------------------------------------------------------------------------*/ -static constexpr DeviceCommandId_t READ_REGS = 0; -static constexpr DeviceCommandId_t CONFIGURE_CTRL_REGS = 1; -static constexpr DeviceCommandId_t READ_CTRL_REGS = 2; - -static constexpr uint32_t GYRO_DATASET_ID = READ_REGS; - -enum GyroPoolIds : lp_id_t { ANG_VELOC_X, ANG_VELOC_Y, ANG_VELOC_Z, TEMPERATURE }; - -} // namespace l3gd20h - -class GyroPrimaryDataset : public StaticLocalDataSet<5> { - public: - /** Constructor for data users like controllers */ - GyroPrimaryDataset(object_id_t mgmId) - : StaticLocalDataSet(sid_t(mgmId, l3gd20h::GYRO_DATASET_ID)) { - setAllVariablesReadOnly(); - } - - /* Angular velocities in degrees per second (DPS) */ - lp_var_t angVelocX = lp_var_t(sid.objectId, l3gd20h::ANG_VELOC_X, this); - lp_var_t angVelocY = lp_var_t(sid.objectId, l3gd20h::ANG_VELOC_Y, this); - lp_var_t angVelocZ = lp_var_t(sid.objectId, l3gd20h::ANG_VELOC_Z, this); - lp_var_t temperature = lp_var_t(sid.objectId, l3gd20h::TEMPERATURE, this); - - private: - friend class GyroHandlerL3GD20H; - /** Constructor for the data creator */ - GyroPrimaryDataset(HasLocalDataPoolIF* hkOwner) - : StaticLocalDataSet(hkOwner, l3gd20h::GYRO_DATASET_ID) {} -}; - -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GYROL3GD20DEFINITIONS_H_ */ diff --git a/mission/devices/devicedefinitions/powerDefinitions.h b/mission/devices/devicedefinitions/powerDefinitions.h deleted file mode 100644 index 8d1b5578..00000000 --- a/mission/devices/devicedefinitions/powerDefinitions.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_POWERDEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_POWERDEFINITIONS_H_ - -#include - -#include "eive/eventSubsystemIds.h" - -namespace power { - -static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PCDU_HANDLER; -//! [EXPORT] : [COMMENT] Indicates that a FSFW object requested setting a switch -//! P1: 1 if on was requested, 0 for off | P2: Switch Index -static constexpr Event SWITCH_CMD_SENT = event::makeEvent(SUBSYSTEM_ID, 0, severity::INFO); -//! [EXPORT] : [COMMENT] Indicated that a switch state has changed -//! P1: New switch state, 1 for on, 0 for off | P2: Switch Index -static constexpr Event SWITCH_HAS_CHANGED = event::makeEvent(SUBSYSTEM_ID, 1, severity::INFO); -static constexpr Event SWITCHING_Q7S_DENIED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM); - -static constexpr Event FDIR_REACTION_IGNORED = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM); - -} // namespace power - -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_POWERDEFINITIONS_H_ */ diff --git a/mission/core/GenericFactory.cpp b/mission/genericFactory.cpp similarity index 93% rename from mission/core/GenericFactory.cpp rename to mission/genericFactory.cpp index 53ca6904..ce338097 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/genericFactory.cpp @@ -1,5 +1,3 @@ -#include "GenericFactory.h" - #include #include #include @@ -26,13 +24,14 @@ #include #include #include -#include -#include +#include #include -#include -#include -#include +#include +#include +#include +#include #include +#include #include #include #include @@ -46,8 +45,8 @@ #include "eive/definitions.h" #include "fsfw/pus/Service11TelecommandScheduling.h" #include "mission/cfdp/Config.h" -#include "mission/system/objects/RwAssembly.h" -#include "mission/system/tree/acsModeTree.h" +#include "mission/system/acs/RwAssembly.h" +#include "mission/system/acs/acsModeTree.h" #include "mission/system/tree/tcsModeTree.h" #include "mission/tmtc/tmFilters.h" #include "objects/systemObjectList.h" @@ -193,8 +192,8 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_, PusTmFun // HK store and PUS funnel to HK store routing { - PersistentTmStoreArgs storeArgs(objects::HK_TM_STORE, "tm", "hk", RolloverInterval::MINUTELY, - 15, *ramToFileStore, sdcMan); + PersistentTmStoreArgs storeArgs(objects::HK_TM_STORE, "tm", "hk", RolloverInterval::MINUTELY, 2, + *ramToFileStore, sdcMan); stores.hkStore = new PersistentTmStoreWithTmQueue(storeArgs, "HK STORE", config::HK_STORE_QUEUE_SIZE); (*pusFunnel) @@ -235,7 +234,7 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_, PusTmFun new Service2DeviceAccess(objects::PUS_SERVICE_2_DEVICE_ACCESS, config::EIVE_PUS_APID, pus::PUS_SERVICE_2, 3, 10); new Service3Housekeeping(objects::PUS_SERVICE_3_HOUSEKEEPING, config::EIVE_PUS_APID, - pus::PUS_SERVICE_3); + pus::PUS_SERVICE_3, config::HK_SERVICE_QUEUE_DEPTH); new Service5EventReporting( PsbParams(objects::PUS_SERVICE_5_EVENT_REPORTING, config::EIVE_PUS_APID, pus::PUS_SERVICE_5), 40, 120); @@ -296,7 +295,7 @@ void ObjectFactory::createGenericHeaterComponents(GpioIF& gpioIF, PowerSwitchIF& {new HealthDevice(objects::HEATER_7_SYRLINKS, MessageQueueIF::NO_QUEUE), gpioIds::HEATER_7}, }}); heaterHandler = new HeaterHandler(objects::HEATER_HANDLER, &gpioIF, helper, &pwrSwitcher, - pcdu::Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V); + power::Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V); heaterHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM); } @@ -348,7 +347,8 @@ void ObjectFactory::createAcsBoardAssy(PowerSwitchIF& pwrSwitcher, AcsBoardHelper acsBoardHelper = AcsBoardHelper( objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER, objects::MGM_3_RM3100_HANDLER, objects::GYRO_0_ADIS_HANDLER, objects::GYRO_1_L3G_HANDLER, - objects::GYRO_2_ADIS_HANDLER, objects::GYRO_3_L3G_HANDLER, objects::GPS_CONTROLLER); + objects::GYRO_2_ADIS_HANDLER, objects::GYRO_3_L3G_HANDLER, objects::GPS_CONTROLLER, + objects::GPS_0_HEALTH_DEV, objects::GPS_1_HEALTH_DEV); auto acsAss = new AcsBoardAssembly(objects::ACS_BOARD_ASS, &pwrSwitcher, acsBoardHelper, gpioComIF); for (auto& assChild : assemblyDhbs) { @@ -359,13 +359,17 @@ void ObjectFactory::createAcsBoardAssy(PowerSwitchIF& pwrSwitcher, } } gpsCtrl->connectModeTreeParent(*acsAss); + auto* gps0HealthDev = new HealthDevice(objects::GPS_0_HEALTH_DEV, acsAss->getCommandQueue()); + auto* gps1HealthDev = new HealthDevice(objects::GPS_1_HEALTH_DEV, acsAss->getCommandQueue()); + acsAss->registerChild(objects::GPS_0_HEALTH_DEV, gps0HealthDev->getCommandQueue()); + acsAss->registerChild(objects::GPS_1_HEALTH_DEV, gps1HealthDev->getCommandQueue()); acsAss->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM); } TcsBoardAssembly* ObjectFactory::createTcsBoardAssy(PowerSwitchIF& pwrSwitcher) { TcsBoardHelper helper(RTD_INFOS); auto* tcsBoardAss = new TcsBoardAssembly(objects::TCS_BOARD_ASS, &pwrSwitcher, - pcdu::Switches::PDU1_CH0_TCS_BOARD_3V3, helper); + power::Switches::PDU1_CH0_TCS_BOARD_3V3, helper); tcsBoardAss->connectModeTreeParent(satsystem::tcs::SUBSYSTEM); return tcsBoardAss; } diff --git a/mission/core/GenericFactory.h b/mission/genericFactory.h similarity index 96% rename from mission/core/GenericFactory.h rename to mission/genericFactory.h index 1c5e9ce6..496c516b 100644 --- a/mission/core/GenericFactory.h +++ b/mission/genericFactory.h @@ -2,14 +2,15 @@ #define MISSION_CORE_GENERICFACTORY_H_ #include +#include #include #include +#include #include #include "fsfw/objectmanager/SystemObjectIF.h" #include "fsfw/power/PowerSwitchIF.h" #include "fsfw_hal/common/gpio/GpioIF.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" using persTmStore::PersistentTmStores; diff --git a/mission/mission.mk b/mission/mission.mk deleted file mode 100644 index 028b9c13..00000000 --- a/mission/mission.mk +++ /dev/null @@ -1,17 +0,0 @@ -# add main and others -CXXSRC += $(wildcard $(CURRENTPATH)/*.cpp) -CSRC += $(wildcard $(CURRENTPATH)/*.c) - -CSRC += $(wildcard $(CURRENTPATH)/core/*.c) -CXXSRC += $(wildcard $(CURRENTPATH)/core/*.cpp) - -CXXSRC += $(wildcard $(CURRENTPATH)/devices/*.cpp) -CSRC += $(wildcard $(CURRENTPATH)/devices/*.c) - -CXXSRC += $(wildcard $(CURRENTPATH)/utility/*.cpp) -CSRC += $(wildcard $(CURRENTPATH)/utility/*.c) - -CXXSRC += $(wildcard $(CURRENTPATH)/test/*.cpp) -CSRC += $(wildcard $(CURRENTPATH)/test/*.c) - - diff --git a/mission/payload/CMakeLists.txt b/mission/payload/CMakeLists.txt new file mode 100644 index 00000000..f48a594b --- /dev/null +++ b/mission/payload/CMakeLists.txt @@ -0,0 +1,3 @@ +target_sources( + ${LIB_EIVE_MISSION} PRIVATE PayloadPcduHandler.cpp RadiationSensorHandler.cpp + ScexDeviceHandler.cpp scexHelpers.cpp defs.cpp) diff --git a/mission/devices/PayloadPcduHandler.cpp b/mission/payload/PayloadPcduHandler.cpp similarity index 99% rename from mission/devices/PayloadPcduHandler.cpp rename to mission/payload/PayloadPcduHandler.cpp index b93936d7..ff0c8557 100644 --- a/mission/devices/PayloadPcduHandler.cpp +++ b/mission/payload/PayloadPcduHandler.cpp @@ -1,6 +1,5 @@ -#include "PayloadPcduHandler.h" - #include +#include #include "OBSWConfig.h" diff --git a/mission/devices/PayloadPcduHandler.h b/mission/payload/PayloadPcduHandler.h similarity index 97% rename from mission/devices/PayloadPcduHandler.h rename to mission/payload/PayloadPcduHandler.h index 0fd78887..b73de353 100644 --- a/mission/devices/PayloadPcduHandler.h +++ b/mission/payload/PayloadPcduHandler.h @@ -4,15 +4,15 @@ #include #include #include +#include #include #include "events/subsystemIdRanges.h" #include "fsfw/FSFW.h" #include "fsfw_hal/common/gpio/GpioIF.h" -#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h" #include "mission/memory/SdCardMountedIF.h" -#include "mission/system/objects/DualLanePowerStateMachine.h" -#include "mission/system/objects/definitions.h" +#include "mission/power/defs.h" +#include "mission/system/DualLanePowerStateMachine.h" #ifdef FSFW_OSAL_LINUX class SpiComIF; diff --git a/mission/devices/RadiationSensorHandler.cpp b/mission/payload/RadiationSensorHandler.cpp similarity index 98% rename from mission/devices/RadiationSensorHandler.cpp rename to mission/payload/RadiationSensorHandler.cpp index 0520daec..d18fcb2c 100644 --- a/mission/devices/RadiationSensorHandler.cpp +++ b/mission/payload/RadiationSensorHandler.cpp @@ -1,9 +1,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include RadiationSensorHandler::RadiationSensorHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, GpioIF *gpioIF, diff --git a/mission/devices/RadiationSensorHandler.h b/mission/payload/RadiationSensorHandler.h similarity index 90% rename from mission/devices/RadiationSensorHandler.h rename to mission/payload/RadiationSensorHandler.h index b4ad39de..de9bcc93 100644 --- a/mission/devices/RadiationSensorHandler.h +++ b/mission/payload/RadiationSensorHandler.h @@ -1,9 +1,9 @@ -#ifndef MISSION_DEVICES_RADIATIONSENSORHANDLER_H_ -#define MISSION_DEVICES_RADIATIONSENSORHANDLER_H_ +#ifndef MISSION_PAYLOAD_RADIATIONSENSORHANDLER_H_ +#define MISSION_PAYLOAD_RADIATIONSENSORHANDLER_H_ #include #include -#include +#include #include /** @@ -54,4 +54,4 @@ class RadiationSensorHandler : public DeviceHandlerBase { CommunicationStep communicationStep = CommunicationStep::START_CONVERSION; }; -#endif /* MISSION_DEVICES_RADIATIONSENSORHANDLER_H_ */ +#endif /* MISSION_PAYLOAD_RADIATIONSENSORHANDLER_H_ */ diff --git a/mission/devices/ScexDeviceHandler.cpp b/mission/payload/ScexDeviceHandler.cpp similarity index 80% rename from mission/devices/ScexDeviceHandler.cpp rename to mission/payload/ScexDeviceHandler.cpp index 9f41c8a0..8c3b7386 100644 --- a/mission/devices/ScexDeviceHandler.cpp +++ b/mission/payload/ScexDeviceHandler.cpp @@ -1,8 +1,8 @@ -#include "ScexDeviceHandler.h" - #include -#include +#include #include +#include +#include #include #include @@ -11,8 +11,8 @@ #include #include +#include "eive/definitions.h" #include "fsfw/globalfunctions/CRC.h" -#include "mission/devices/devicedefinitions/ScexDefinitions.h" using std::ofstream; using namespace returnvalue; @@ -28,6 +28,7 @@ void ScexDeviceHandler::doStartUp() { setMode(MODE_ON); } void ScexDeviceHandler::doShutDown() { reader.reset(); commandActive = false; + fileNameSet = false; multiFileFinishOutstanding = false; setMode(_MODE_POWER_DOWN); } @@ -206,50 +207,13 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons using namespace scex; ReturnValue_t status = OK; - auto oneFileHandler = [&](std::string cmdName) { - auto activeSd = sdcMan.getActiveSdCard(); - if (not activeSd) { - return HasFileSystemIF::FILESYSTEM_INACTIVE; - } - fileId = date_time_string(); - std::ostringstream oss; - auto prefix = sdcMan.getCurrentMountPrefix(); - if (prefix == nullptr) { - return returnvalue::FAILED; - } - oss << prefix << "/scex/scex-" << cmdName << fileId << ".bin"; - fileName = oss.str(); - ofstream out(fileName, ofstream::binary); - if (out.bad()) { - sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName - << std::endl; - return FAILED; - } - out << helper; - return OK; - }; - auto multiFileHandler = [&](std::string cmdName) { + auto multiFileHandler = [&](const char* cmdName) { if ((helper.getPacketCounter() == 1) or (not fileNameSet)) { - auto activeSd = sdcMan.getActiveSdCard(); - if (not activeSd) { - return HasFileSystemIF::FILESYSTEM_INACTIVE; + status = generateNewScexFile(cmdName); + if (status != returnvalue::OK) { + return status; } - fileId = date_time_string(); - std::ostringstream oss; - auto prefix = sdcMan.getCurrentMountPrefix(); - if (prefix == nullptr) { - return returnvalue::FAILED; - } - oss << prefix << "/scex/scex-" << cmdName << fileId << ".bin"; - fileName = oss.str(); fileNameSet = true; - ofstream out(fileName, ofstream::binary); - if (out.bad()) { - sif::error << "ScexDeviceHandler::handleValidReply: Could not open file " << fileName - << std::endl; - return FAILED; - } - out << helper; } else { ofstream out(fileName, ofstream::binary | ofstream::app); // append @@ -265,31 +229,31 @@ ReturnValue_t ScexDeviceHandler::interpretDeviceReply(DeviceCommandId_t id, cons id = helper.getCmd(); switch (id) { case (PING): { - status = oneFileHandler("ping_"); + status = generateNewScexFile(PING_IDLE_BASE_NAME); break; } case (ION_CMD): { - status = oneFileHandler("ion_"); + status = generateNewScexFile(ION_BASE_NAME); break; } case (TEMP_CMD): { - status = oneFileHandler("temp_"); + status = generateNewScexFile(TEMPERATURE_BASE_NAME); break; } case (EXP_STATUS_CMD): { - status = oneFileHandler("exp_status_"); + status = generateNewScexFile(EXP_STATUS_BASE_NAME); break; } case (FRAM): { - status = multiFileHandler("fram_"); + status = multiFileHandler(FRAM_BASE_NAME); break; } case (ONE_CELL): { - status = multiFileHandler("one_cell_"); + status = multiFileHandler(ONE_CELL_BASE_NAME); break; } case (ALL_CELLS_CMD): { - status = multiFileHandler("multi_cell_"); + status = multiFileHandler(ALL_CELLS_BASE_NAME); break; } default: @@ -355,37 +319,41 @@ ReturnValue_t ScexDeviceHandler::initializeLocalDataPool(localpool::DataPool& lo return OK; } -std::string ScexDeviceHandler::date_time_string() { - using namespace std; - string date_time; - Clock::TimeOfDay_t tod; - Clock::getDateAndTime(&tod); - ostringstream oss(std::ostringstream::ate); - - if (tod.hour < 10) { - oss << tod.year << tod.month << tod.day << "_0" << tod.hour; - } else { - oss << tod.year << tod.month << tod.day << "_" << tod.hour; - } - if (tod.minute < 10) { - oss << 0 << tod.minute; - - } else { - oss << tod.minute; - } - if (tod.second < 10) { - oss << 0 << tod.second; - } else { - oss << tod.second; +ReturnValue_t ScexDeviceHandler::generateNewScexFile(const char* cmdName) { + char timeString[64]{}; + auto activeSd = sdcMan.getActiveSdCard(); + if (not activeSd) { + return HasFileSystemIF::FILESYSTEM_INACTIVE; } - date_time = oss.str(); - - return date_time; + std::ostringstream oss; + auto prefix = sdcMan.getCurrentMountPrefix(); + if (prefix == nullptr) { + return returnvalue::FAILED; + } + timeval tv; + Clock::getClock_timeval(&tv); + time_t epoch = tv.tv_sec; + struct tm* time = gmtime(&epoch); + size_t writtenBytes = strftime(reinterpret_cast(timeString), sizeof(timeString), + config::FILE_DATE_FORMAT, time); + if (writtenBytes == 0) { + sif::error << "PersistentTmStore::createMostRecentFile: Could not create file timestamp" + << std::endl; + return returnvalue::FAILED; + } + oss << prefix << "/scex/scex-" << cmdName << "-" << timeString << ".bin"; + fileName = oss.str(); + ofstream out(fileName, ofstream::binary); + if (out.bad()) { + sif::error << "ScexDeviceHandler::interpretDeviceReply: Could not open file " << fileName + << std::endl; + return FAILED; + } + out << helper; + return OK; } -void ScexDeviceHandler::modeChanged() {} - void ScexDeviceHandler::setPowerSwitcher(PowerSwitchIF& powerSwitcher, power::Switch_t switchId) { DeviceHandlerBase::setPowerSwitcher(&powerSwitcher); this->switchId = switchId; diff --git a/mission/devices/ScexDeviceHandler.h b/mission/payload/ScexDeviceHandler.h similarity index 76% rename from mission/devices/ScexDeviceHandler.h rename to mission/payload/ScexDeviceHandler.h index a164c5e2..e7721ef6 100644 --- a/mission/devices/ScexDeviceHandler.h +++ b/mission/payload/ScexDeviceHandler.h @@ -1,9 +1,9 @@ -#ifndef MISSION_DEVICES_SCEXDEVICEHANDLER_H_ -#define MISSION_DEVICES_SCEXDEVICEHANDLER_H_ +#ifndef MISSION_PAYLOAD_SCEXDEVICEHANDLER_H_ +#define MISSION_PAYLOAD_SCEXDEVICEHANDLER_H_ #include -#include -#include +#include +#include #include @@ -13,6 +13,14 @@ class SdCardMountedIF; class ScexDeviceHandler : public DeviceHandlerBase { public: + static constexpr char FRAM_BASE_NAME[] = "framContent"; + static constexpr char ION_BASE_NAME[] = "ion"; + static constexpr char TEMPERATURE_BASE_NAME[] = "temperature"; + static constexpr char EXP_STATUS_BASE_NAME[] = "expStatus"; + static constexpr char ONE_CELL_BASE_NAME[] = "oneCell"; + static constexpr char ALL_CELLS_BASE_NAME[] = "allCells"; + static constexpr char PING_IDLE_BASE_NAME[] = "pingIdle"; + ScexDeviceHandler(object_id_t objectId, ScexUartReader &reader, CookieIF *cookie, SdCardMountedIF &sdcMan); void setPowerSwitcher(PowerSwitchIF &powerSwitcher, power::Switch_t switchId); @@ -35,8 +43,6 @@ class ScexDeviceHandler : public DeviceHandlerBase { SdCardMountedIF &sdcMan; Countdown finishCountdown = Countdown(LONG_CD); - std::string date_time_string(); - // DeviceHandlerBase private function implementation void doStartUp() override; void doShutDown() override; @@ -59,7 +65,8 @@ class ScexDeviceHandler : public DeviceHandlerBase { ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; ReturnValue_t initializeAfterTaskCreation() override; - void modeChanged() override; + + ReturnValue_t generateNewScexFile(const char *cmdName); }; -#endif /* MISSION_DEVICES_SCEXDEVICEHANDLER_H_ */ +#endif /* MISSION_PAYLOAD_SCEXDEVICEHANDLER_H_ */ diff --git a/mission/payloadDefs.cpp b/mission/payload/defs.cpp similarity index 94% rename from mission/payloadDefs.cpp rename to mission/payload/defs.cpp index b57f278a..d5d4912e 100644 --- a/mission/payloadDefs.cpp +++ b/mission/payload/defs.cpp @@ -1,4 +1,4 @@ -#include "payloadDefs.h" +#include const char* payload::getModeStr(Mode mode) { static const char* modeStr = "UNKNOWN"; diff --git a/mission/payloadDefs.h b/mission/payload/defs.h similarity index 100% rename from mission/payloadDefs.h rename to mission/payload/defs.h diff --git a/mission/devices/devicedefinitions/payloadPcduDefinitions.h b/mission/payload/payloadPcduDefinitions.h similarity index 99% rename from mission/devices/devicedefinitions/payloadPcduDefinitions.h rename to mission/payload/payloadPcduDefinitions.h index a5c3effd..e6c7b653 100644 --- a/mission/devices/devicedefinitions/payloadPcduDefinitions.h +++ b/mission/payload/payloadPcduDefinitions.h @@ -4,13 +4,13 @@ #include #include #include +#include #include #include #include #include "OBSWConfig.h" -#include "mission/devices/max1227.h" namespace plpcdu { diff --git a/mission/devices/devicedefinitions/SpBase.h b/mission/payload/plocSpBase.h similarity index 95% rename from mission/devices/devicedefinitions/SpBase.h rename to mission/payload/plocSpBase.h index 8678cf9d..e754c7e8 100644 --- a/mission/devices/devicedefinitions/SpBase.h +++ b/mission/payload/plocSpBase.h @@ -1,6 +1,7 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_SPBASE_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_SPBASE_H_ +#ifndef MISSION_PAYLOAD_PLOCSPBASE_H_ +#define MISSION_PAYLOAD_PLOCSPBASE_H_ +#include #include #include @@ -117,4 +118,4 @@ class SpTmReader : public SpacePacketReader { } // namespace ploc -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_SPBASE_H_ */ +#endif /* MISSION_PAYLOAD_PLOCSPBASE_H_ */ diff --git a/mission/devices/devicedefinitions/RadSensorDefinitions.h b/mission/payload/radSensorDefinitions.h similarity index 100% rename from mission/devices/devicedefinitions/RadSensorDefinitions.h rename to mission/payload/radSensorDefinitions.h diff --git a/mission/devices/devicedefinitions/ScexDefinitions.cpp b/mission/payload/scexHelpers.cpp similarity index 97% rename from mission/devices/devicedefinitions/ScexDefinitions.cpp rename to mission/payload/scexHelpers.cpp index c4319876..26f6a139 100644 --- a/mission/devices/devicedefinitions/ScexDefinitions.cpp +++ b/mission/payload/scexHelpers.cpp @@ -1,6 +1,5 @@ -#include "ScexDefinitions.h" - #include +#include #include diff --git a/mission/devices/devicedefinitions/ScexDefinitions.h b/mission/payload/scexHelpers.h similarity index 88% rename from mission/devices/devicedefinitions/ScexDefinitions.h rename to mission/payload/scexHelpers.h index 22e3878b..aa0f320b 100644 --- a/mission/devices/devicedefinitions/ScexDefinitions.h +++ b/mission/payload/scexHelpers.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_SCEXDEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_SCEXDEFINITIONS_H_ +#ifndef MISSION_PAYLOAD_SCEXHELPERS_H_ +#define MISSION_PAYLOAD_SCEXHELPERS_H_ #include #include @@ -49,4 +49,4 @@ ReturnValue_t prepareScexCmd(Cmds cmd, std::pair cmdBufPair, s } // namespace scex -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_SCEXDEFINITIONS_H_ */ +#endif /* MISSION_PAYLOAD_SCEXHELPERS_H_ */ diff --git a/mission/persistentTmStoreDefs.h b/mission/persistentTmStoreDefs.h index 2498536d..8b8873de 100644 --- a/mission/persistentTmStoreDefs.h +++ b/mission/persistentTmStoreDefs.h @@ -25,8 +25,6 @@ static constexpr Event POSSIBLE_FILE_CORRUPTION = event::makeEvent(SUBSYSTEM_ID, //! P2: Allowed file size static constexpr Event FILE_TOO_LARGE = event::makeEvent(SUBSYSTEM_ID, 1, severity::LOW); static constexpr Event BUSY_DUMPING_EVENT = event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); -//! [EXPORT] : [COMMENT] Dump was cancelled. P1: Object ID of store. -static constexpr Event DUMP_WAS_CANCELLED = event::makeEvent(SUBSYSTEM_ID, 3, severity::LOW); //! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. static constexpr Event DUMP_OK_STORE_DONE = event::makeEvent(SUBSYSTEM_ID, 5, severity::INFO); @@ -38,6 +36,17 @@ static constexpr Event DUMP_MISC_STORE_DONE = event::makeEvent(SUBSYSTEM_ID, 7, static constexpr Event DUMP_HK_STORE_DONE = event::makeEvent(SUBSYSTEM_ID, 8, severity::INFO); //! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. static constexpr Event DUMP_CFDP_STORE_DONE = event::makeEvent(SUBSYSTEM_ID, 9, severity::INFO); + +//! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. +static constexpr Event DUMP_OK_CANCELLED = event::makeEvent(SUBSYSTEM_ID, 10, severity::LOW); +//! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. +static constexpr Event DUMP_NOK_CANCELLED = event::makeEvent(SUBSYSTEM_ID, 11, severity::LOW); +//! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. +static constexpr Event DUMP_MISC_CANCELLED = event::makeEvent(SUBSYSTEM_ID, 12, severity::LOW); +//! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. +static constexpr Event DUMP_HK_CANCELLED = event::makeEvent(SUBSYSTEM_ID, 13, severity::LOW); +//! [EXPORT] : [COMMENT] P1: Number of dumped packets. P2: Total dumped bytes. +static constexpr Event DUMP_CFDP_CANCELLED = event::makeEvent(SUBSYSTEM_ID, 14, severity::LOW); }; // namespace persTmStore #endif /* MISSION_PERSISTENTTMSTOREDEFS_H_ */ diff --git a/mission/core/pollingSeqTables.cpp b/mission/pollingSeqTables.cpp similarity index 95% rename from mission/core/pollingSeqTables.cpp rename to mission/pollingSeqTables.cpp index 1b8f6e89..0367ef27 100644 --- a/mission/core/pollingSeqTables.cpp +++ b/mission/pollingSeqTables.cpp @@ -4,11 +4,11 @@ #include #include #include -#include +#include +#include #include "OBSWConfig.h" #include "eive/definitions.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" #ifndef RPI_TEST_ADIS16507 #define RPI_TEST_ADIS16507 0 @@ -26,10 +26,11 @@ ReturnValue_t pst::pstSyrlinks(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0, DeviceHandlerIF::GET_WRITE); thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.25, DeviceHandlerIF::SEND_READ); thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.25, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.4, DeviceHandlerIF::SEND_WRITE); thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.7, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.7, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.75, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::SYRLINKS_HANDLER, length * 0.75, DeviceHandlerIF::GET_READ); static_cast(length); @@ -102,25 +103,25 @@ ReturnValue_t pst::pstGompaceCan(FixedTimeslotTaskIF *thisSequence) { thisSequence->addSlot(objects::PDU2_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); thisSequence->addSlot(objects::ACU_HANDLER, length * 0, DeviceHandlerIF::PERFORM_OPERATION); - thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::PDU1_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::PDU2_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::ACU_HANDLER, length * 0.2, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::PDU1_HANDLER, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::PDU2_HANDLER, length * 0, DeviceHandlerIF::SEND_WRITE); + thisSequence->addSlot(objects::ACU_HANDLER, length * 0, DeviceHandlerIF::SEND_WRITE); - thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::PDU1_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::PDU2_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::ACU_HANDLER, length * 0.4, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::PDU1_HANDLER, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::PDU2_HANDLER, length * 0, DeviceHandlerIF::GET_WRITE); + thisSequence->addSlot(objects::ACU_HANDLER, length * 0, DeviceHandlerIF::GET_WRITE); - thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::PDU1_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::PDU2_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::ACU_HANDLER, length * 0.6, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0.5, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::PDU1_HANDLER, length * 0.5, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::PDU2_HANDLER, length * 0.5, DeviceHandlerIF::SEND_READ); + thisSequence->addSlot(objects::ACU_HANDLER, length * 0.5, DeviceHandlerIF::SEND_READ); - thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::PDU1_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::PDU2_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ); - thisSequence->addSlot(objects::ACU_HANDLER, length * 0.8, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::P60DOCK_HANDLER, length * 0.5, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::PDU1_HANDLER, length * 0.5, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::PDU2_HANDLER, length * 0.5, DeviceHandlerIF::GET_READ); + thisSequence->addSlot(objects::ACU_HANDLER, length * 0.5, DeviceHandlerIF::GET_READ); if (thisSequence->checkSequence() != returnvalue::OK) { sif::error << "GomSpace PST initialization failed" << std::endl; return returnvalue::FAILED; diff --git a/mission/core/pollingSeqTables.h b/mission/pollingSeqTables.h similarity index 100% rename from mission/core/pollingSeqTables.h rename to mission/pollingSeqTables.h diff --git a/mission/devices/ACUHandler.cpp b/mission/power/AcuHandler.cpp similarity index 95% rename from mission/devices/ACUHandler.cpp rename to mission/power/AcuHandler.cpp index 2a8ffe8b..24499c0b 100644 --- a/mission/devices/ACUHandler.cpp +++ b/mission/power/AcuHandler.cpp @@ -1,10 +1,10 @@ -#include "ACUHandler.h" +#include #include "OBSWConfig.h" ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, - FailureIsolationBase *customFdir) - : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir), + FailureIsolationBase *customFdir, bool enableHkSets) + : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir, enableHkSets), coreHk(this), auxHk(this) { cfg.maxConfigTableAddress = ACU::MAX_CONFIGTABLE_ADDRESS; @@ -149,9 +149,9 @@ ReturnValue_t ACUHandler::initializeLocalDataPool(localpool::DataPool &localData localDataPoolMap.emplace(pool::ACU_WDT_GND_LEFT, new PoolEntry({0})); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), enableHkSets, 30.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(auxHk.getSid(), false, 30.0)); + subdp::RegularHkPeriodicParams(auxHk.getSid(), enableHkSets, 6000.0)); return returnvalue::OK; } diff --git a/mission/devices/ACUHandler.h b/mission/power/AcuHandler.h similarity index 85% rename from mission/devices/ACUHandler.h rename to mission/power/AcuHandler.h index ef4feab0..5d895c9f 100644 --- a/mission/devices/ACUHandler.h +++ b/mission/power/AcuHandler.h @@ -1,9 +1,9 @@ -#ifndef MISSION_DEVICES_ACUHANDLER_H_ -#define MISSION_DEVICES_ACUHANDLER_H_ +#ifndef MISSION_POWER_ACUHANDLER_H_ +#define MISSION_POWER_ACUHANDLER_H_ -#include +#include +#include -#include "GomspaceDeviceHandler.h" #include "fsfw/datapool/PoolReadGuard.h" /** @@ -13,7 +13,7 @@ class ACUHandler : public GomspaceDeviceHandler { public: ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, - FailureIsolationBase* customFdir); + FailureIsolationBase* customFdir, bool enableHkSets); virtual ~ACUHandler(); void setDebugMode(bool enable); @@ -53,4 +53,4 @@ class ACUHandler : public GomspaceDeviceHandler { void printChannelStats(); }; -#endif /* MISSION_DEVICES_ACUHANDLER_H_ */ +#endif /* MISSION_POWER_ACUHANDLER_H_ */ diff --git a/mission/devices/BpxBatteryHandler.cpp b/mission/power/BpxBatteryHandler.cpp similarity index 96% rename from mission/devices/BpxBatteryHandler.cpp rename to mission/power/BpxBatteryHandler.cpp index b4bdc307..6b258ab2 100644 --- a/mission/devices/BpxBatteryHandler.cpp +++ b/mission/power/BpxBatteryHandler.cpp @@ -1,9 +1,12 @@ -#include "BpxBatteryHandler.h" - #include +#include -BpxBatteryHandler::BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie) - : DeviceHandlerBase(objectId, comIF, comCookie), hkSet(this), cfgSet(this) {} +BpxBatteryHandler::BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, + bool enableHkSets) + : DeviceHandlerBase(objectId, comIF, comCookie), + enableHkSets(enableHkSets), + hkSet(this), + cfgSet(this) {} BpxBatteryHandler::~BpxBatteryHandler() {} @@ -268,8 +271,9 @@ ReturnValue_t BpxBatteryHandler::initializeLocalDataPool(localpool::DataPool& lo localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode); localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow); localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh); + poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(hkSet.getSid(), false, 30.0)); + subdp::RegularHkPeriodicParams(hkSet.getSid(), enableHkSets, 20.0)); poolManager.subscribeForRegularPeriodicPacket( subdp::RegularHkPeriodicParams(cfgSet.getSid(), false, 30.0)); return returnvalue::OK; diff --git a/mission/devices/BpxBatteryHandler.h b/mission/power/BpxBatteryHandler.h similarity index 89% rename from mission/devices/BpxBatteryHandler.h rename to mission/power/BpxBatteryHandler.h index c42ed7fd..0f6d835c 100644 --- a/mission/devices/BpxBatteryHandler.h +++ b/mission/power/BpxBatteryHandler.h @@ -1,14 +1,14 @@ -#ifndef MISSION_DEVICES_BPXBATTERYHANDLER_H_ -#define MISSION_DEVICES_BPXBATTERYHANDLER_H_ +#ifndef MISSION_POWER_BPXBATTERYHANDLER_H_ +#define MISSION_POWER_BPXBATTERYHANDLER_H_ #include - -#include "devicedefinitions/BpxBatteryDefinitions.h" -#include "mission/trace.h" +#include +#include class BpxBatteryHandler : public DeviceHandlerBase { public: - BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie); + BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, + bool enableHkSets); virtual ~BpxBatteryHandler(); void setToGoToNormalMode(bool enable); @@ -20,6 +20,7 @@ class BpxBatteryHandler : public DeviceHandlerBase { IDLE = 1, }; + bool enableHkSets = false; States state = States::CHECK_COM; bool commandExecuted = false; bool debugMode = false; @@ -63,4 +64,4 @@ class BpxBatteryHandler : public DeviceHandlerBase { LocalDataPoolManager& poolManager) override; }; -#endif /* MISSION_DEVICES_BPXBATTERYHANDLER_H_ */ +#endif /* MISSION_POWER_BPXBATTERYHANDLER_H_ */ diff --git a/mission/power/CMakeLists.txt b/mission/power/CMakeLists.txt new file mode 100644 index 00000000..05232e25 --- /dev/null +++ b/mission/power/CMakeLists.txt @@ -0,0 +1,10 @@ +target_sources( + ${LIB_EIVE_MISSION} + PRIVATE CspCookie.cpp + Pdu1Handler.cpp + Pdu2Handler.cpp + AcuHandler.cpp + P60DockHandler.cpp + PcduHandler.cpp + GomspaceDeviceHandler.cpp + BpxBatteryHandler.cpp) diff --git a/mission/csp/CspCookie.cpp b/mission/power/CspCookie.cpp similarity index 95% rename from mission/csp/CspCookie.cpp rename to mission/power/CspCookie.cpp index 228a8058..2bb85fd1 100644 --- a/mission/csp/CspCookie.cpp +++ b/mission/power/CspCookie.cpp @@ -1,4 +1,4 @@ -#include "CspCookie.h" +#include using namespace GOMSPACE; CspCookie::CspCookie(uint16_t maxReplyLength_, uint8_t cspAddress_, uint32_t timeoutMs) diff --git a/mission/csp/CspCookie.h b/mission/power/CspCookie.h similarity index 93% rename from mission/csp/CspCookie.h rename to mission/power/CspCookie.h index 9eb0a639..a77de5d3 100644 --- a/mission/csp/CspCookie.h +++ b/mission/power/CspCookie.h @@ -2,12 +2,11 @@ #define LINUX_CSP_CSPCOOKIE_H_ #include +#include #include #include -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" - /** * @brief This is the cookie for devices supporting the CSP (CubeSat Space * Protocol). diff --git a/mission/devices/devicedefinitions/GomSpacePackets.h b/mission/power/GomSpacePackets.h similarity index 97% rename from mission/devices/devicedefinitions/GomSpacePackets.h rename to mission/power/GomSpacePackets.h index 650fa763..ad90eca9 100644 --- a/mission/devices/devicedefinitions/GomSpacePackets.h +++ b/mission/power/GomSpacePackets.h @@ -1,11 +1,11 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEPACKETS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEPACKETS_H_ +#ifndef MISSION_POWER_GOMSPACEPACKETS_H_ +#define MISSION_POWER_GOMSPACEPACKETS_H_ #include #include #include #include -#include +#include class CspParamRequestBase : public SerialLinkedListAdapter { public: @@ -381,4 +381,4 @@ class GetParamMessageUnpacker : public SerialLinkedListAdapter { SerializeElement parameterSize; }; -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEPACKETS_H_ */ +#endif /* MISSION_POWER_GOMSPACEPACKETS_H_ */ diff --git a/mission/devices/GomspaceDeviceHandler.cpp b/mission/power/GomspaceDeviceHandler.cpp similarity index 98% rename from mission/devices/GomspaceDeviceHandler.cpp rename to mission/power/GomspaceDeviceHandler.cpp index 389b08c7..89fca8ee 100644 --- a/mission/devices/GomspaceDeviceHandler.cpp +++ b/mission/power/GomspaceDeviceHandler.cpp @@ -1,20 +1,21 @@ -#include "GomspaceDeviceHandler.h" - #include #include +#include +#include +#include #include -#include "devicedefinitions/GomSpacePackets.h" -#include "devicedefinitions/powerDefinitions.h" #include "eive/objects.h" using namespace GOMSPACE; GomspaceDeviceHandler::GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, TableConfig& tableConfig, - FailureIsolationBase* customFdir) - : DeviceHandlerBase(objectId, comIF, comCookie, customFdir), tableCfg(tableConfig) { + FailureIsolationBase* customFdir, bool enableHkSets) + : DeviceHandlerBase(objectId, comIF, comCookie, customFdir), + enableHkSets(enableHkSets), + tableCfg(tableConfig) { if (comCookie == nullptr) { sif::error << "GomspaceDeviceHandler::GomspaceDeviceHandler: Invalid com cookie" << std::endl; } @@ -641,3 +642,11 @@ ReturnValue_t GomspaceDeviceHandler::parsePduHkTable(PDU::PduCoreHk& coreHk, PDU } return returnvalue::OK; } + +ReturnValue_t GomspaceDeviceHandler::setHealth(HealthState health) { + if (health != HealthState::HEALTHY and health != HealthState::EXTERNAL_CONTROL and + health != HealthState::NEEDS_RECOVERY) { + return returnvalue::FAILED; + } + return returnvalue::OK; +} diff --git a/mission/devices/GomspaceDeviceHandler.h b/mission/power/GomspaceDeviceHandler.h similarity index 94% rename from mission/devices/GomspaceDeviceHandler.h rename to mission/power/GomspaceDeviceHandler.h index af9d3411..758cc5a3 100644 --- a/mission/devices/GomspaceDeviceHandler.h +++ b/mission/power/GomspaceDeviceHandler.h @@ -1,11 +1,11 @@ -#ifndef MISSION_DEVICES_GOMSPACEDEVICEHANDLER_H_ -#define MISSION_DEVICES_GOMSPACEDEVICEHANDLER_H_ +#ifndef MISSION_POWER_GOMSPACEDEVICEHANDLER_H_ +#define MISSION_POWER_GOMSPACEDEVICEHANDLER_H_ -#include -#include +#include +#include +#include #include "fsfw/devicehandlers/DeviceHandlerBase.h" -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" #include "returnvalues/classIds.h" struct TableConfig { @@ -45,7 +45,8 @@ class GomspaceDeviceHandler : public DeviceHandlerBase { * device. */ GomspaceDeviceHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, - TableConfig &tableConfig, FailureIsolationBase *customFdir); + TableConfig &tableConfig, FailureIsolationBase *customFdir, + bool enableHkSets); virtual ~GomspaceDeviceHandler(); /** @@ -59,6 +60,7 @@ class GomspaceDeviceHandler : public DeviceHandlerBase { static const uint8_t PARAM_SET_OK = 1; static const uint8_t PING_REPLY_SIZE = 2; + bool enableHkSets = false; uint8_t rememberRequestedSize = 0; uint8_t rememberCommandId = GOMSPACE::NONE; uint8_t cspPacket[MAX_PACKET_LEN]; @@ -78,6 +80,9 @@ class GomspaceDeviceHandler : public DeviceHandlerBase { ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override; void setNormalDatapoolEntriesInvalid() override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; + + ReturnValue_t setHealth(HealthState health) override; + /** * @brief The command to generate a request to receive the full housekeeping table is device * specific. Thus the child has to build this command. @@ -180,4 +185,4 @@ inline T GomspaceDeviceHandler::as(const uint8_t *ptr) { return *(reinterpret_cast(ptr)); } -#endif /* MISSION_DEVICES_GOMSPACEDEVICEHANDLER_H_ */ +#endif /* MISSION_POWER_GOMSPACEDEVICEHANDLER_H_ */ diff --git a/mission/devices/P60DockHandler.cpp b/mission/power/P60DockHandler.cpp similarity index 97% rename from mission/devices/P60DockHandler.cpp rename to mission/power/P60DockHandler.cpp index 8c768847..d643aef1 100644 --- a/mission/devices/P60DockHandler.cpp +++ b/mission/power/P60DockHandler.cpp @@ -1,12 +1,11 @@ -#include "P60DockHandler.h" - #include +#include #include "OBSWConfig.h" P60DockHandler::P60DockHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, - FailureIsolationBase *customFdir) - : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir), + FailureIsolationBase *customFdir, bool enableHkSets) + : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir, enableHkSets), coreHk(this), auxHk(this) { cfg.maxConfigTableAddress = P60Dock::MAX_CONFIGTABLE_ADDRESS; @@ -167,9 +166,9 @@ ReturnValue_t P60DockHandler::initializeLocalDataPool(localpool::DataPool &local localDataPoolMap.emplace(pool::P60DOCK_ANT6_DEPL, new PoolEntry({0})); localDataPoolMap.emplace(pool::P60DOCK_AR6_DEPL, new PoolEntry({0})); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), enableHkSets, 30.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(auxHk.getSid(), false, 30.0)); + subdp::RegularHkPeriodicParams(auxHk.getSid(), enableHkSets, 6000.0)); return returnvalue::OK; } diff --git a/mission/devices/P60DockHandler.h b/mission/power/P60DockHandler.h similarity index 90% rename from mission/devices/P60DockHandler.h rename to mission/power/P60DockHandler.h index b91907a8..2d654260 100644 --- a/mission/devices/P60DockHandler.h +++ b/mission/power/P60DockHandler.h @@ -1,9 +1,9 @@ -#ifndef MISSION_DEVICES_P60DOCKHANDLER_H_ -#define MISSION_DEVICES_P60DOCKHANDLER_H_ +#ifndef MISSION_POWER_P60DOCKHANDLER_H_ +#define MISSION_POWER_P60DOCKHANDLER_H_ -#include +#include +#include -#include "GomspaceDeviceHandler.h" #include "eive/eventSubsystemIds.h" /** @@ -22,7 +22,7 @@ class P60DockHandler : public GomspaceDeviceHandler { static constexpr Event BATT_MODE_CHANGED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM); P60DockHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, - FailureIsolationBase* customFdir); + FailureIsolationBase* customFdir, bool enableHkSets); virtual ~P60DockHandler(); void setDebugMode(bool enable); @@ -71,4 +71,4 @@ class P60DockHandler : public GomspaceDeviceHandler { void parseHkTableReply(const uint8_t* packet); }; -#endif /* MISSION_DEVICES_P60DOCKHANDLER_H_ */ +#endif /* MISSION_POWER_P60DOCKHANDLER_H_ */ diff --git a/mission/devices/PcduHandler.cpp b/mission/power/PcduHandler.cpp similarity index 80% rename from mission/devices/PcduHandler.cpp rename to mission/power/PcduHandler.cpp index 4c2f742c..0561288c 100644 --- a/mission/devices/PcduHandler.cpp +++ b/mission/power/PcduHandler.cpp @@ -4,8 +4,8 @@ #include #include #include -#include -#include +#include +#include PcduHandler::PcduHandler(object_id_t setObjectId, size_t cmdQueueSize) : SystemObject(setObjectId), @@ -28,25 +28,35 @@ ReturnValue_t PcduHandler::performOperation(uint8_t counter) { if (counter == DeviceHandlerIF::PERFORM_OPERATION) { readCommandQueue(); } - uint8_t switchState = 0; + uint8_t switchState5V = 0; + uint8_t switchState3V3 = 0; { PoolReadGuard pg(&p60CoreHk.outputEnables); if (pg.getReadResult() == returnvalue::OK) { - switchState = p60CoreHk.outputEnables.value[10]; + switchState5V = p60CoreHk.outputEnables.value[P60Dock::hk::STACK_5V]; + switchState3V3 = p60CoreHk.outputEnables.value[P60Dock::hk::STACK_3V3]; } else { return returnvalue::OK; } } { - PoolReadGuard pg(&switcherSet.p60Dock5VStack); + PoolReadGuard pg(&switcherSet); if (pg.getReadResult() == returnvalue::OK) { - if (switcherSet.p60Dock5VStack.value != switchState) { - triggerEvent(power::SWITCH_HAS_CHANGED, switchState, pcdu::Switches::P60_DOCK_5V_STACK); + if (switcherSet.p60Dock5VStack.value != switchState5V) { + triggerEvent(power::SWITCH_HAS_CHANGED, switchState5V, power::Switches::P60_DOCK_5V_STACK); MutexGuard mg(pwrLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX); - switchStates[pcdu::P60_DOCK_5V_STACK] = switchState; + switchStates[power::P60_DOCK_5V_STACK] = switchState5V; + } + if (switcherSet.p60Dock3V3Stack.value != switchState3V3) { + triggerEvent(power::SWITCH_HAS_CHANGED, switchState3V3, + power::Switches::P60_DOCK_3V3_STACK); + MutexGuard mg(pwrLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX); + switchStates[power::P60_DOCK_3V3_STACK] = switchState3V3; } switcherSet.p60Dock5VStack.setValid(true); - switcherSet.p60Dock5VStack.value = switchState; + switcherSet.p60Dock5VStack.value = switchState5V; + switcherSet.p60Dock3V3Stack.setValid(true); + switcherSet.p60Dock3V3Stack.value = switchState3V3; } } return returnvalue::OK; @@ -103,7 +113,7 @@ ReturnValue_t PcduHandler::initialize() { void PcduHandler::initializeSwitchStates() { using namespace pcdu; try { - for (uint8_t idx = 0; idx < NUMBER_OF_SWITCHES; idx++) { + for (uint8_t idx = 0; idx < power::NUMBER_OF_SWITCHES; idx++) { if (idx < PDU::CHANNELS_LEN) { switchStates[idx] = INIT_SWITCHES_PDU1.at(idx); } else if (idx < PDU::CHANNELS_LEN * 2) { @@ -181,22 +191,23 @@ void PcduHandler::updatePdu2SwitchStates() { } switcherSet.pdu2Switches.setValid(true); MutexGuard mg(pwrLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH0_Q7S, pdu2CoreHk.outputEnables[Channels::Q7S]); + checkAndUpdatePduSwitch(pdu, power::PDU2_CH0_Q7S, pdu2CoreHk.outputEnables[Channels::Q7S]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH1_PL_PCDU_BATT_0_14V8, pdu2CoreHk.outputEnables[Channels::PAYLOAD_PCDU_CH1]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH2_RW_5V, pdu2CoreHk.outputEnables[Channels::RW]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH2_RW_5V, + pdu2CoreHk.outputEnables[Channels::RW]); + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH3_TCS_BOARD_HEATER_IN_8V, pdu2CoreHk.outputEnables[Channels::TCS_HEATER_IN]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH4_SUS_REDUNDANT_3V3, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH4_SUS_REDUNDANT_3V3, pdu2CoreHk.outputEnables[Channels::SUS_REDUNDANT]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH5_DEPLOYMENT_MECHANISM_8V, pdu2CoreHk.outputEnables[Channels::DEPY_MECHANISM]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH6_PL_PCDU_BATT_1_14V8, pdu2CoreHk.outputEnables[Channels::PAYLOAD_PCDU_CH6]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3, pdu2CoreHk.outputEnables[Channels::ACS_B_SIDE]); - checkAndUpdatePduSwitch(pdu, Switches::PDU2_CH8_PAYLOAD_CAMERA, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU2_CH8_PAYLOAD_CAMERA, pdu2CoreHk.outputEnables[Channels::PAYLOAD_CAMERA]); if (firstSwitchInfoPdu2) { firstSwitchInfoPdu2 = false; @@ -218,23 +229,23 @@ void PcduHandler::updatePdu1SwitchStates() { } switcherSet.pdu1Switches.setValid(true); MutexGuard mg(pwrLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH0_TCS_BOARD_3V3, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH0_TCS_BOARD_3V3, pdu1CoreHk.outputEnables[Channels::TCS_BOARD_3V3]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH1_SYRLINKS_12V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH1_SYRLINKS_12V, pdu1CoreHk.outputEnables[Channels::SYRLINKS]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH2_STAR_TRACKER_5V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH2_STAR_TRACKER_5V, pdu1CoreHk.outputEnables[Channels::STR]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH3_MGT_5V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH3_MGT_5V, pdu1CoreHk.outputEnables[Channels::MGT]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH4_SUS_NOMINAL_3V3, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH4_SUS_NOMINAL_3V3, pdu1CoreHk.outputEnables[Channels::SUS_NOMINAL]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH5_SOLAR_CELL_EXP_5V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH5_SOLAR_CELL_EXP_5V, pdu1CoreHk.outputEnables[Channels::SOL_CELL_EXPERIMENT]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH6_PLOC_12V, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH6_PLOC_12V, pdu1CoreHk.outputEnables[Channels::PLOC]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH7_ACS_A_SIDE_3V3, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH7_ACS_A_SIDE_3V3, pdu1CoreHk.outputEnables[Channels::ACS_A_SIDE]); - checkAndUpdatePduSwitch(pdu, Switches::PDU1_CH8_UNOCCUPIED, + checkAndUpdatePduSwitch(pdu, power::Switches::PDU1_CH8_UNOCCUPIED, pdu1CoreHk.outputEnables[Channels::UNUSED]); if (firstSwitchInfoPdu1) { firstSwitchInfoPdu1 = false; @@ -255,103 +266,108 @@ ReturnValue_t PcduHandler::sendSwitchCommand(uint8_t switchNr, ReturnValue_t onO GomspaceDeviceHandler* module = nullptr; switch (switchNr) { - case pcdu::PDU1_CH0_TCS_BOARD_3V3: { + case power::PDU1_CH0_TCS_BOARD_3V3: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_TCS_BOARD_3V3; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH1_SYRLINKS_12V: { + case power::PDU1_CH1_SYRLINKS_12V: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_SYRLINKS; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH2_STAR_TRACKER_5V: { + case power::PDU1_CH2_STAR_TRACKER_5V: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_STAR_TRACKER; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH3_MGT_5V: { + case power::PDU1_CH3_MGT_5V: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_MGT; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH4_SUS_NOMINAL_3V3: { + case power::PDU1_CH4_SUS_NOMINAL_3V3: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_SUS_NOMINAL; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH5_SOLAR_CELL_EXP_5V: { + case power::PDU1_CH5_SOLAR_CELL_EXP_5V: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_SOLAR_CELL_EXP; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH6_PLOC_12V: { + case power::PDU1_CH6_PLOC_12V: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_PLOC; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH7_ACS_A_SIDE_3V3: { + case power::PDU1_CH7_ACS_A_SIDE_3V3: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_A; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } - case pcdu::PDU1_CH8_UNOCCUPIED: { + case power::PDU1_CH8_UNOCCUPIED: { memoryAddress = PDU1::CONFIG_ADDRESS_OUT_EN_CHANNEL8; module = ObjectManager::instance()->get(objects::PDU1_HANDLER); break; } // This is a dangerous command. Reject/Igore it for now - case pcdu::PDU2_CH0_Q7S: { + case power::PDU2_CH0_Q7S: { return returnvalue::FAILED; // memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_Q7S; // pdu = ObjectManager::instance()->get(objects::PDU2_HANDLER); // break; } - case pcdu::PDU2_CH1_PL_PCDU_BATT_0_14V8: { + case power::PDU2_CH1_PL_PCDU_BATT_0_14V8: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_PAYLOAD_PCDU_CH1; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH2_RW_5V: { + case power::PDU2_CH2_RW_5V: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_RW; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH3_TCS_BOARD_HEATER_IN_8V: { + case power::PDU2_CH3_TCS_BOARD_HEATER_IN_8V: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_TCS_BOARD_HEATER_IN; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH4_SUS_REDUNDANT_3V3: { + case power::PDU2_CH4_SUS_REDUNDANT_3V3: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_SUS_REDUNDANT; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH5_DEPLOYMENT_MECHANISM_8V: { + case power::PDU2_CH5_DEPLOYMENT_MECHANISM_8V: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_DEPLOYMENT_MECHANISM; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH6_PL_PCDU_BATT_1_14V8: { + case power::PDU2_CH6_PL_PCDU_BATT_1_14V8: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_PAYLOAD_PCDU_CH6; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH7_ACS_BOARD_SIDE_B_3V3: { + case power::PDU2_CH7_ACS_BOARD_SIDE_B_3V3: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_ACS_BOARD_SIDE_B; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::PDU2_CH8_PAYLOAD_CAMERA: { + case power::PDU2_CH8_PAYLOAD_CAMERA: { memoryAddress = PDU2::CONFIG_ADDRESS_OUT_EN_PAYLOAD_CAMERA; module = ObjectManager::instance()->get(objects::PDU2_HANDLER); break; } - case pcdu::P60_DOCK_5V_STACK: { + case power::P60_DOCK_5V_STACK: { memoryAddress = P60Dock::CONFIG_ADDRESS_OUT_EN_5V_STACK; module = ObjectManager::instance()->get(objects::P60DOCK_HANDLER); break; } + case power::P60_DOCK_3V3_STACK: { + memoryAddress = P60Dock::CONFIG_ADDRESS_OUT_EN_3V3_STACK; + module = ObjectManager::instance()->get(objects::P60DOCK_HANDLER); + break; + } default: { sif::error << "PCDUHandler::sendSwitchCommand: Invalid switch number " << std::endl; @@ -399,7 +415,7 @@ ReturnValue_t PcduHandler::sendSwitchCommand(uint8_t switchNr, ReturnValue_t onO ReturnValue_t PcduHandler::sendFuseOnCommand(uint8_t fuseNr) { return returnvalue::OK; } ReturnValue_t PcduHandler::getSwitchState(uint8_t switchNr) const { - if (switchNr >= pcdu::NUMBER_OF_SWITCHES) { + if (switchNr >= power::NUMBER_OF_SWITCHES) { sif::debug << "PCDUHandler::getSwitchState: Invalid switch number" << std::endl; return returnvalue::FAILED; } @@ -429,7 +445,8 @@ ReturnValue_t PcduHandler::initializeLocalDataPool(localpool::DataPool& localDat using namespace pcdu; localDataPoolMap.emplace(PoolIds::PDU1_SWITCHES, &pdu1Switches); localDataPoolMap.emplace(PoolIds::PDU2_SWITCHES, &pdu2Switches); - localDataPoolMap.emplace(PoolIds::P60DOCK_SWITCHES, &p60Dock5VSwitch); + localDataPoolMap.emplace(PoolIds::P60DOCK_5V, &p60Dock5VSwitch); + localDataPoolMap.emplace(PoolIds::P60DOCK_3V3, &p60Dock3V3Switch); poolManager.subscribeForDiagPeriodicPacket( subdp::DiagnosticsHkPeriodicParams(switcherSet.getSid(), false, 5.0)); return returnvalue::OK; @@ -459,7 +476,7 @@ LocalPoolDataSetBase* PcduHandler::getDataSetHandle(sid_t sid) { } } -void PcduHandler::checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, pcdu::Switches switchIdx, +void PcduHandler::checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, power::Switches switchIdx, uint8_t setValue) { using namespace pcdu; if (switchStates[switchIdx] != setValue) { diff --git a/mission/devices/PcduHandler.h b/mission/power/PcduHandler.h similarity index 92% rename from mission/devices/PcduHandler.h rename to mission/power/PcduHandler.h index 170c27f2..86d3747f 100644 --- a/mission/devices/PcduHandler.h +++ b/mission/power/PcduHandler.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_PCDUHANDLER_H_ -#define MISSION_DEVICES_PCDUHANDLER_H_ +#ifndef MISSION_POWER_PCDUHANDLER_H_ +#define MISSION_POWER_PCDUHANDLER_H_ #include #include @@ -8,10 +8,9 @@ #include #include #include -#include - -#include "devicedefinitions/GomspaceDefinitions.h" -#include "devicedefinitions/powerDefinitions.h" +#include +#include +#include /** * @brief The PCDUHandler provides a compact interface to handle all devices related to the @@ -81,6 +80,7 @@ class PcduHandler : public PowerSwitchIF, PoolEntry pdu2Switches = PoolEntry(pcdu::INIT_SWITCHES_PDU2.data(), pcdu::INIT_SWITCHES_PDU2.size()); PoolEntry p60Dock5VSwitch = PoolEntry(); + PoolEntry p60Dock3V3Switch = PoolEntry(); /** The timeStamp of the current pdu2HkTableDataset */ CCSDSTime::CDS_short timeStampPdu2HkDataset; @@ -89,7 +89,7 @@ class PcduHandler : public PowerSwitchIF, CCSDSTime::CDS_short timeStampPdu1HkDataset; uint8_t SWITCH_STATE_UNKNOWN = 2; - uint8_t switchStates[pcdu::NUMBER_OF_SWITCHES]; + uint8_t switchStates[power::NUMBER_OF_SWITCHES]; /** * Pointer to the IPCStore. * This caches the pointer received from the objectManager in the constructor. @@ -138,7 +138,7 @@ class PcduHandler : public PowerSwitchIF, */ void updateHkTableDataset(store_address_t storeId, LocalPoolDataSetBase* dataset, CCSDSTime::CDS_short* datasetTimeStamp); - void checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, pcdu::Switches switchIdx, uint8_t setValue); + void checkAndUpdatePduSwitch(GOMSPACE::Pdu pdu, power::Switches switchIdx, uint8_t setValue); }; -#endif /* MISSION_DEVICES_PCDUHANDLER_H_ */ +#endif /* MISSION_POWER_PCDUHANDLER_H_ */ diff --git a/mission/devices/Pdu1Handler.cpp b/mission/power/Pdu1Handler.cpp similarity index 94% rename from mission/devices/Pdu1Handler.cpp rename to mission/power/Pdu1Handler.cpp index 25f14c76..3151b66e 100644 --- a/mission/devices/Pdu1Handler.cpp +++ b/mission/power/Pdu1Handler.cpp @@ -1,12 +1,12 @@ #include -#include -#include +#include +#include #include "devices/powerSwitcherList.h" Pdu1Handler::Pdu1Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, - FailureIsolationBase *customFdir) - : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir), + FailureIsolationBase *customFdir, bool enableHkSets) + : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir, enableHkSets), coreHk(this), auxHk(this) { initPduConfigTable(); @@ -90,9 +90,9 @@ ReturnValue_t Pdu1Handler::initializeLocalDataPool(localpool::DataPool &localDat LocalDataPoolManager &poolManager) { initializePduPool(localDataPoolMap, poolManager, pcdu::INIT_SWITCHES_PDU1); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), enableHkSets, 30.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(auxHk.getSid(), false, 30.0)); + subdp::RegularHkPeriodicParams(auxHk.getSid(), enableHkSets, 6000.0)); return returnvalue::OK; } diff --git a/mission/devices/Pdu1Handler.h b/mission/power/Pdu1Handler.h similarity index 93% rename from mission/devices/Pdu1Handler.h rename to mission/power/Pdu1Handler.h index b81f647e..1037b585 100644 --- a/mission/devices/Pdu1Handler.h +++ b/mission/power/Pdu1Handler.h @@ -1,8 +1,8 @@ #ifndef MISSION_DEVICES_PDU1Handler_H_ #define MISSION_DEVICES_PDU1Handler_H_ -#include "GomspaceDeviceHandler.h" -#include "devicedefinitions/GomspaceDefinitions.h" +#include +#include /** * @brief This is the device handler for the PDU1. @@ -22,7 +22,7 @@ class Pdu1Handler : public GomspaceDeviceHandler { public: Pdu1Handler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, - FailureIsolationBase* customFdir); + FailureIsolationBase* customFdir, bool enableHkSets); virtual ~Pdu1Handler(); virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, diff --git a/mission/devices/Pdu2Handler.cpp b/mission/power/Pdu2Handler.cpp similarity index 94% rename from mission/devices/Pdu2Handler.cpp rename to mission/power/Pdu2Handler.cpp index 363c5f51..404c7b74 100644 --- a/mission/devices/Pdu2Handler.cpp +++ b/mission/power/Pdu2Handler.cpp @@ -1,12 +1,12 @@ #include -#include -#include +#include +#include #include "devices/powerSwitcherList.h" Pdu2Handler::Pdu2Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie, - FailureIsolationBase *customFdir) - : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir), + FailureIsolationBase *customFdir, bool enableHkSets) + : GomspaceDeviceHandler(objectId, comIF, comCookie, cfg, customFdir, enableHkSets), coreHk(this), auxHk(this) { initPduConfigTable(); @@ -49,9 +49,9 @@ ReturnValue_t Pdu2Handler::initializeLocalDataPool(localpool::DataPool &localDat LocalDataPoolManager &poolManager) { initializePduPool(localDataPoolMap, poolManager, pcdu::INIT_SWITCHES_PDU2); poolManager.subscribeForDiagPeriodicPacket( - subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), false, 10.0)); + subdp::DiagnosticsHkPeriodicParams(coreHk.getSid(), enableHkSets, 30.0)); poolManager.subscribeForRegularPeriodicPacket( - subdp::RegularHkPeriodicParams(auxHk.getSid(), false, 30.0)); + subdp::RegularHkPeriodicParams(auxHk.getSid(), enableHkSets, 6000.0)); return returnvalue::OK; } diff --git a/mission/devices/Pdu2Handler.h b/mission/power/Pdu2Handler.h similarity index 87% rename from mission/devices/Pdu2Handler.h rename to mission/power/Pdu2Handler.h index acb229dc..8a41b31d 100644 --- a/mission/devices/Pdu2Handler.h +++ b/mission/power/Pdu2Handler.h @@ -1,9 +1,8 @@ -#ifndef MISSION_DEVICES_PDU2HANDLER_H_ -#define MISSION_DEVICES_PDU2HANDLER_H_ +#ifndef MISSION_POWER_PDU2HANDLER_H_ +#define MISSION_POWER_PDU2HANDLER_H_ -#include - -#include "GomspaceDeviceHandler.h" +#include +#include /** * @brief This is the device handler for the PDU2. @@ -22,7 +21,7 @@ class Pdu2Handler : public GomspaceDeviceHandler { public: Pdu2Handler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie, - FailureIsolationBase* customFdir); + FailureIsolationBase* customFdir, bool enableHkSets); virtual ~Pdu2Handler(); virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, @@ -56,4 +55,4 @@ class Pdu2Handler : public GomspaceDeviceHandler { void parseHkTableReply(const uint8_t* packet); }; -#endif /* MISSION_DEVICES_PDU2HANDLER_H_ */ +#endif /* MISSION_POWER_PDU2HANDLER_H_ */ diff --git a/mission/devices/devicedefinitions/BpxBatteryDefinitions.h b/mission/power/bpxBattDefs.h similarity index 97% rename from mission/devices/devicedefinitions/BpxBatteryDefinitions.h rename to mission/power/bpxBattDefs.h index eb19529b..1808c94a 100644 --- a/mission/devices/devicedefinitions/BpxBatteryDefinitions.h +++ b/mission/power/bpxBattDefs.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_BPXBATTERYDEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_BPXBATTERYDEFINITIONS_H_ +#ifndef MISSION_POWER_BPXBATTDEFS_H_ +#define MISSION_POWER_BPXBATTDEFS_H_ #include #include @@ -248,4 +248,4 @@ class BpxBatteryCfg : public StaticLocalDataSet { : StaticLocalDataSet(hkOwner, BpxBattery::CFG_SET_ID) {} }; -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_BPXBATTERYDEFINITIONS_H_ */ +#endif /* MISSION_POWER_BPXBATTDEFS_H_ */ diff --git a/mission/power/defs.h b/mission/power/defs.h new file mode 100644 index 00000000..b10fe1ff --- /dev/null +++ b/mission/power/defs.h @@ -0,0 +1,61 @@ +#ifndef MISSION_POWER_DEFS_H_ +#define MISSION_POWER_DEFS_H_ + +#include +#include +#include + +#include "eive/eventSubsystemIds.h" + +namespace power { + +/* Switches are uint8_t datatype and go from 0 to 255 */ +enum Switches : power::Switch_t { + PDU1_CH0_TCS_BOARD_3V3, + PDU1_CH1_SYRLINKS_12V, + PDU1_CH2_STAR_TRACKER_5V, + PDU1_CH3_MGT_5V, + PDU1_CH4_SUS_NOMINAL_3V3, + PDU1_CH5_SOLAR_CELL_EXP_5V, + PDU1_CH6_PLOC_12V, + PDU1_CH7_ACS_A_SIDE_3V3, + PDU1_CH8_UNOCCUPIED, + + PDU2_CH0_Q7S, + PDU2_CH1_PL_PCDU_BATT_0_14V8, + PDU2_CH2_RW_5V, + PDU2_CH3_TCS_BOARD_HEATER_IN_8V, + PDU2_CH4_SUS_REDUNDANT_3V3, + PDU2_CH5_DEPLOYMENT_MECHANISM_8V, + PDU2_CH6_PL_PCDU_BATT_1_14V8, + PDU2_CH7_ACS_BOARD_SIDE_B_3V3, + PDU2_CH8_PAYLOAD_CAMERA, + + P60_DOCK_5V_STACK, + P60_DOCK_3V3_STACK, + NUMBER_OF_SWITCHES +}; + +static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::PCDU_HANDLER; +//! [EXPORT] : [COMMENT] Indicates that a FSFW object requested setting a switch +//! P1: 1 if on was requested, 0 for off | P2: Switch Index +static constexpr Event SWITCH_CMD_SENT = event::makeEvent(SUBSYSTEM_ID, 0, severity::INFO); +//! [EXPORT] : [COMMENT] Indicated that a switch state has changed +//! P1: New switch state, 1 for on, 0 for off | P2: Switch Index +static constexpr Event SWITCH_HAS_CHANGED = event::makeEvent(SUBSYSTEM_ID, 1, severity::INFO); +static constexpr Event SWITCHING_Q7S_DENIED = event::makeEvent(SUBSYSTEM_ID, 2, severity::MEDIUM); + +static constexpr Event FDIR_REACTION_IGNORED = event::makeEvent(SUBSYSTEM_ID, 3, severity::MEDIUM); + +enum class States { IDLE, SWITCHING_POWER, CHECKING_POWER, MODE_COMMANDING }; +enum class OpCodes { NONE, TO_OFF_DONE, TO_NOT_OFF_DONE, TIMEOUT_OCCURED }; + +} // namespace power + +namespace duallane { + +enum Submodes : Submode_t { A_SIDE = 0, B_SIDE = 1, DUAL_MODE = 2 }; + +} + +#endif /* MISSION_POWER_DEFS_H_ */ diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/power/gsDefs.h similarity index 96% rename from mission/devices/devicedefinitions/GomspaceDefinitions.h rename to mission/power/gsDefs.h index 75a81d8f..d42cabd2 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/power/gsDefs.h @@ -1,16 +1,17 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ +#ifndef MISSION_POWER_GSDEFS_H_ +#define MISSION_POWER_GSDEFS_H_ #include #include #include #include +#include #include #include "devices/powerSwitcherList.h" #include "fsfw/platform.h" -#include "gomspaceDefines.h" +#include "mission/power/defs.h" namespace GOMSPACE { @@ -108,6 +109,7 @@ enum class SetIds : uint32_t { CORE = 1, AUX = 2, CONFIG = 3 }; namespace P60Dock { +static const uint16_t CONFIG_ADDRESS_OUT_EN_3V3_STACK = 0x71; static const uint16_t CONFIG_ADDRESS_OUT_EN_5V_STACK = 0x72; namespace pool { @@ -713,33 +715,7 @@ class AuxHk : public StaticLocalDataSet<12> { namespace pcdu { -enum PoolIds : uint32_t { PDU1_SWITCHES, PDU2_SWITCHES, P60DOCK_SWITCHES }; - -/* Switches are uint8_t datatype and go from 0 to 255 */ -enum Switches : power::Switch_t { - PDU1_CH0_TCS_BOARD_3V3, - PDU1_CH1_SYRLINKS_12V, - PDU1_CH2_STAR_TRACKER_5V, - PDU1_CH3_MGT_5V, - PDU1_CH4_SUS_NOMINAL_3V3, - PDU1_CH5_SOLAR_CELL_EXP_5V, - PDU1_CH6_PLOC_12V, - PDU1_CH7_ACS_A_SIDE_3V3, - PDU1_CH8_UNOCCUPIED, - - PDU2_CH0_Q7S, - PDU2_CH1_PL_PCDU_BATT_0_14V8, - PDU2_CH2_RW_5V, - PDU2_CH3_TCS_BOARD_HEATER_IN_8V, - PDU2_CH4_SUS_REDUNDANT_3V3, - PDU2_CH5_DEPLOYMENT_MECHANISM_8V, - PDU2_CH6_PL_PCDU_BATT_1_14V8, - PDU2_CH7_ACS_BOARD_SIDE_B_3V3, - PDU2_CH8_PAYLOAD_CAMERA, - - P60_DOCK_5V_STACK, - NUMBER_OF_SWITCHES -}; +enum PoolIds : uint32_t { PDU1_SWITCHES, PDU2_SWITCHES, P60DOCK_5V, P60DOCK_3V3 }; static const uint8_t ON = 1; static const uint8_t OFF = 0; @@ -760,7 +736,7 @@ const std::array INIT_SWITCHES_PDU2 = {ON, OFF, OFF static constexpr uint32_t SWITCHER_SET_ID = 0; -class SwitcherStates : public StaticLocalDataSet { +class SwitcherStates : public StaticLocalDataSet { public: SwitcherStates(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, SWITCHER_SET_ID) {} @@ -770,8 +746,9 @@ class SwitcherStates : public StaticLocalDataSet { lp_vec_t(sid.objectId, PDU1_SWITCHES, this); lp_vec_t pdu2Switches = lp_vec_t(sid.objectId, PDU2_SWITCHES, this); - lp_var_t p60Dock5VStack = lp_var_t(sid.objectId, P60DOCK_SWITCHES, this); + lp_var_t p60Dock5VStack = lp_var_t(sid.objectId, P60DOCK_5V, this); + lp_var_t p60Dock3V3Stack = lp_var_t(sid.objectId, P60DOCK_3V3, this); }; } // namespace pcdu -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINITIONS_H_ */ +#endif /* MISSION_POWER_GSDEFS_H_ */ diff --git a/mission/devices/devicedefinitions/gomspaceDefines.h b/mission/power/gsLibDefs.h similarity index 80% rename from mission/devices/devicedefinitions/gomspaceDefines.h rename to mission/power/gsLibDefs.h index ddd346d7..cc9fc121 100644 --- a/mission/devices/devicedefinitions/gomspaceDefines.h +++ b/mission/power/gsLibDefs.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINES_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINES_H_ +#ifndef MISSION_POWER_GSLIBDEFS_H_ +#define MISSION_POWER_GSLIBDEFS_H_ #include "fsfw/platform.h" @@ -30,4 +30,4 @@ static constexpr uint32_t P60ACU_PARAM_SIZE = 0x1B; } // namespace gsConstants -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEDEFINES_H_ */ +#endif /* MISSION_POWER_GSLIBDEFS_H_ */ diff --git a/mission/core/scheduling.cpp b/mission/scheduling.cpp similarity index 96% rename from mission/core/scheduling.cpp rename to mission/scheduling.cpp index 50b5e473..f89ce711 100644 --- a/mission/core/scheduling.cpp +++ b/mission/scheduling.cpp @@ -1,7 +1,8 @@ #include "scheduling.h" +#include + #include "fsfw/tasks/PeriodicTaskIF.h" -#include "mission/devices/devicedefinitions/Max31865Definitions.h" void scheduling::scheduleTmpTempSensors(PeriodicTaskIF* tmpTask) { const std::array tmpIds = { diff --git a/mission/core/scheduling.h b/mission/scheduling.h similarity index 100% rename from mission/core/scheduling.h rename to mission/scheduling.h diff --git a/mission/sysDefs.h b/mission/sysDefs.h index 1d1db0a8..70ff8138 100644 --- a/mission/sysDefs.h +++ b/mission/sysDefs.h @@ -1,7 +1,8 @@ #ifndef MISSION_SYSDEFS_H_ #define MISSION_SYSDEFS_H_ -#include "acsDefs.h" +#include "acs/defs.h" + namespace satsystem { enum Mode : Mode_t { BOOT = 5, SAFE = acs::AcsMode::SAFE, PTG_IDLE = acs::AcsMode::PTG_IDLE }; diff --git a/mission/system/CMakeLists.txt b/mission/system/CMakeLists.txt index 617e2765..44122d7e 100644 --- a/mission/system/CMakeLists.txt +++ b/mission/system/CMakeLists.txt @@ -1,3 +1,8 @@ add_subdirectory(objects) add_subdirectory(tree) +add_subdirectory(acs) +add_subdirectory(com) add_subdirectory(fdir) +add_subdirectory(power) + +target_sources(${LIB_EIVE_MISSION} PRIVATE DualLanePowerStateMachine.cpp) diff --git a/mission/system/objects/DualLanePowerStateMachine.cpp b/mission/system/DualLanePowerStateMachine.cpp similarity index 100% rename from mission/system/objects/DualLanePowerStateMachine.cpp rename to mission/system/DualLanePowerStateMachine.cpp diff --git a/mission/system/objects/DualLanePowerStateMachine.h b/mission/system/DualLanePowerStateMachine.h similarity index 95% rename from mission/system/objects/DualLanePowerStateMachine.h rename to mission/system/DualLanePowerStateMachine.h index 7a6f29b6..d3f596f7 100644 --- a/mission/system/objects/DualLanePowerStateMachine.h +++ b/mission/system/DualLanePowerStateMachine.h @@ -5,7 +5,7 @@ #include #include -#include "definitions.h" +#include "mission/power/defs.h" class AssemblyBase; class PowerSwitchIF; diff --git a/mission/system/objects/AcsBoardAssembly.cpp b/mission/system/acs/AcsBoardAssembly.cpp similarity index 64% rename from mission/system/objects/AcsBoardAssembly.cpp rename to mission/system/acs/AcsBoardAssembly.cpp index 4939c0eb..fdc6053d 100644 --- a/mission/system/objects/AcsBoardAssembly.cpp +++ b/mission/system/acs/AcsBoardAssembly.cpp @@ -77,14 +77,14 @@ ReturnValue_t AcsBoardAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_ if (wantedSubmode == A_SIDE) { if ((helper.gyro0SideAMode != wantedMode and helper.gyro1SideAMode != wantedMode) or (helper.mgm0SideAMode != wantedMode and helper.mgm1SideAMode != wantedMode) or - helper.gpsMode != MODE_ON) { + (helper.gpsMode != MODE_ON) or gps0HealthDevFaulty()) { return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE; } return returnvalue::OK; } else if (wantedSubmode == B_SIDE) { if ((helper.gyro2SideBMode != wantedMode and helper.gyro3SideBMode != wantedMode) or (helper.mgm2SideBMode != wantedMode and helper.mgm3SideBMode != wantedMode) or - helper.gpsMode != MODE_ON) { + (helper.gpsMode != MODE_ON) or gps1HealthDevFaulty()) { return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE; } return returnvalue::OK; @@ -110,30 +110,38 @@ ReturnValue_t AcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t s using namespace duallane; ReturnValue_t result = returnvalue::OK; bool needsSecondStep = false; + handleSideSwitchStates(submode, needsSecondStep); auto cmdSeq = [&](object_id_t objectId, Mode_t devMode, ModeTableIdx tableIdx) { if (mode == devMode) { modeTable[tableIdx].setMode(mode); - } else if (mode == DeviceHandlerIF::MODE_NORMAL) { - if (isUseable(objectId, devMode)) { - if (devMode == MODE_ON) { - modeTable[tableIdx].setMode(mode); - modeTable[tableIdx].setSubmode(SUBMODE_NONE); - } else { - modeTable[tableIdx].setMode(MODE_ON); - modeTable[tableIdx].setSubmode(SUBMODE_NONE); - if (internalState != STATE_SECOND_STEP) { - needsSecondStep = true; - } - } - } - } else if (mode == MODE_ON) { - if (isUseable(objectId, devMode)) { - modeTable[tableIdx].setMode(MODE_ON); - modeTable[tableIdx].setSubmode(SUBMODE_NONE); - } + } else if (isModeCommandable(objectId, devMode)) { + modeTable[tableIdx].setMode(mode); + modeTable[tableIdx].setSubmode(SUBMODE_NONE); + } + }; + + bool gpsUsable = isGpsUsable(submode); + auto gpsCmd = [&](bool gnss0NReset, bool gnss1NReset, uint8_t gnssSelect) { + if (gpsUsable) { + if (mode == MODE_ON or mode == DeviceHandlerIF::MODE_NORMAL) { + modeTable[ModeTableIdx::GPS].setMode(MODE_ON); + } else if (mode == MODE_OFF) { + gnss0NReset = true; + gnss1NReset = true; + modeTable[ModeTableIdx::GPS].setMode(MODE_OFF); + } + modeTable[ModeTableIdx::GPS].setSubmode(SUBMODE_NONE); + + gpioHandler(gpioIds::GNSS_0_NRESET, gnss0NReset, + "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" + "of GNSS 0"); + gpioHandler(gpioIds::GNSS_1_NRESET, gnss1NReset, + "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" + "of GNSS 1"); + gpioHandler(gpioIds::GNSS_SELECT, gnssSelect, + "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select"); } }; - bool gpsUsable = isUseable(helper.gpsId, helper.gpsMode); switch (submode) { case (A_SIDE): { modeTable[ModeTableIdx::GYRO_2_B].setMode(MODE_OFF); @@ -148,16 +156,7 @@ ReturnValue_t AcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t s cmdSeq(helper.gyro1L3gIdSideA, helper.gyro1SideAMode, ModeTableIdx::GYRO_1_A); cmdSeq(helper.mgm0Lis3IdSideA, helper.mgm0SideAMode, ModeTableIdx::MGM_0_A); cmdSeq(helper.mgm1Rm3100IdSideA, helper.mgm1SideAMode, ModeTableIdx::MGM_1_A); - if (gpsUsable) { - gpioHandler(gpioIds::GNSS_0_NRESET, true, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" - "of GNSS 0 high (used GNSS)"); - gpioHandler(gpioIds::GNSS_1_NRESET, false, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" - "of GNSS 1 low (unused GNSS)"); - gpioHandler(gpioIds::GNSS_SELECT, false, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select low"); - } + gpsCmd(true, false, 0); break; } case (B_SIDE): { @@ -173,20 +172,10 @@ ReturnValue_t AcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t s cmdSeq(helper.gyro3L3gIdSideB, helper.gyro3SideBMode, ModeTableIdx::GYRO_3_B); cmdSeq(helper.mgm2Lis3IdSideB, helper.mgm2SideBMode, ModeTableIdx::MGM_2_B); cmdSeq(helper.mgm3Rm3100IdSideB, helper.mgm3SideBMode, ModeTableIdx::MGM_3_B); - if (gpsUsable) { - gpioHandler(gpioIds::GNSS_0_NRESET, false, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" - "of GNSS 0 low (unused GNSS)"); - gpioHandler(gpioIds::GNSS_1_NRESET, true, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" - "of GNSS 1 high (used GNSS)"); - gpioHandler(gpioIds::GNSS_SELECT, true, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select high"); - } + gpsCmd(false, true, 1); break; } case (DUAL_MODE): { - cmdSeq(helper.gpsId, helper.gpsMode, ModeTableIdx::GPS); cmdSeq(helper.gyro0AdisIdSideA, helper.gyro0SideAMode, ModeTableIdx::GYRO_0_A); cmdSeq(helper.gyro1L3gIdSideA, helper.gyro1SideAMode, ModeTableIdx::GYRO_1_A); cmdSeq(helper.mgm0Lis3IdSideA, helper.mgm0SideAMode, ModeTableIdx::MGM_0_A); @@ -195,26 +184,10 @@ ReturnValue_t AcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t s cmdSeq(helper.gyro3L3gIdSideB, helper.gyro3SideBMode, ModeTableIdx::GYRO_3_B); cmdSeq(helper.mgm2Lis3IdSideB, helper.mgm2SideBMode, ModeTableIdx::MGM_2_B); cmdSeq(helper.mgm3Rm3100IdSideB, helper.mgm3SideBMode, ModeTableIdx::MGM_3_B); - ReturnValue_t status = returnvalue::OK; - if (gpsUsable) { - gpioHandler(gpioIds::GNSS_0_NRESET, true, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" - "of GNSS 0 high (used GNSS)"); - gpioHandler(gpioIds::GNSS_1_NRESET, true, - "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull nReset pin" - "of GNSS 1 high (used GNSS)"); - if (defaultSubmode == Submodes::A_SIDE) { - status = gpioIF->pullLow(gpioIds::GNSS_SELECT); - } else { - status = gpioIF->pullHigh(gpioIds::GNSS_SELECT); - } - if (status != returnvalue::OK) { -#if OBSW_VERBOSE_LEVEL >= 1 - sif::error << "AcsBoardAssembly::handleNormalOrOnModeCmd: Could not pull GNSS select to" - "default side for dual mode" - << std::endl; -#endif - } + if (defaultSubmode == Submodes::A_SIDE) { + gpsCmd(true, true, 0); + } else { + gpsCmd(true, true, 1); } break; } @@ -222,10 +195,6 @@ ReturnValue_t AcsBoardAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t s sif::error << "AcsBoardAssembly::handleNormalModeCmd: Unknown submode" << std::endl; } } - if (gpsUsable) { - modeTable[ModeTableIdx::GPS].setMode(MODE_ON); - modeTable[ModeTableIdx::GPS].setSubmode(SUBMODE_NONE); - } if (needsSecondStep) { result = NEED_SECOND_STEP; } @@ -291,25 +260,102 @@ ReturnValue_t AcsBoardAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; - auto overwriteHealthForOneDev = [&](object_id_t dev) { - HealthState health = healthHelper.healthTable->getHealth(dev); - if (health == FAULTY or health == PERMANENT_FAULTY) { - overwriteDeviceHealth(dev, health); - status = NEED_TO_CHANGE_HEALTH; - } else if (health == EXTERNAL_CONTROL) { + auto checkAcsBoardSensorGroup = [&](object_id_t o0, object_id_t o1, object_id_t o2, + object_id_t o3) { + HealthState h0 = healthHelper.healthTable->getHealth(o0); + HealthState h1 = healthHelper.healthTable->getHealth(o1); + HealthState h2 = healthHelper.healthTable->getHealth(o2); + HealthState h3 = healthHelper.healthTable->getHealth(o3); + if ((h0 == FAULTY or h0 == PERMANENT_FAULTY) and (h1 == FAULTY or h1 == PERMANENT_FAULTY) and + (h2 == FAULTY or h2 == PERMANENT_FAULTY) and (h3 == FAULTY or h3 == PERMANENT_FAULTY)) { + overwriteDeviceHealth(o0, h0); + overwriteDeviceHealth(o1, h1); + overwriteDeviceHealth(o2, h2); + overwriteDeviceHealth(o3, h3); + } + if (h0 == EXTERNAL_CONTROL or h1 == EXTERNAL_CONTROL or h2 == EXTERNAL_CONTROL or + h3 == EXTERNAL_CONTROL) { modeHelper.setForced(true); } }; + if (healthHelper.healthTable->getHealth(helper.healthDevGps0) == EXTERNAL_CONTROL or + healthHelper.healthTable->getHealth(helper.healthDevGps1) == EXTERNAL_CONTROL) { + modeHelper.setForced(true); + } + if (healthHelper.healthTable->getHealth(helper.healthDevGps0) == PERMANENT_FAULTY and + healthHelper.healthTable->getHealth(helper.healthDevGps1) == FAULTY) { + overwriteDeviceHealth(helper.healthDevGps1, FAULTY); + } else if (healthHelper.healthTable->getHealth(helper.healthDevGps1) == PERMANENT_FAULTY and + healthHelper.healthTable->getHealth(helper.healthDevGps0) == FAULTY) { + overwriteDeviceHealth(helper.healthDevGps0, FAULTY); + } else if (healthHelper.healthTable->isFaulty(helper.healthDevGps0) and + healthHelper.healthTable->isFaulty(helper.healthDevGps1)) { + overwriteDeviceHealth(helper.healthDevGps0, + healthHelper.healthTable->getHealth(helper.healthDevGps0)); + overwriteDeviceHealth(helper.healthDevGps1, + healthHelper.healthTable->getHealth(helper.healthDevGps1)); + } + if (deviceSubmode == duallane::DUAL_MODE) { - overwriteHealthForOneDev(helper.mgm0Lis3IdSideA); - overwriteHealthForOneDev(helper.mgm1Rm3100IdSideA); - overwriteHealthForOneDev(helper.mgm2Lis3IdSideB); - overwriteHealthForOneDev(helper.mgm3Rm3100IdSideB); - overwriteHealthForOneDev(helper.gyro0AdisIdSideA); - overwriteHealthForOneDev(helper.gyro1L3gIdSideA); - overwriteHealthForOneDev(helper.gyro2AdisIdSideB); - overwriteHealthForOneDev(helper.gyro3L3gIdSideB); - overwriteHealthForOneDev(helper.gpsId); + checkAcsBoardSensorGroup(helper.mgm0Lis3IdSideA, helper.mgm1Rm3100IdSideA, + helper.mgm2Lis3IdSideB, helper.mgm3Rm3100IdSideB); + checkAcsBoardSensorGroup(helper.gyro0AdisIdSideA, helper.gyro1L3gIdSideA, + helper.gyro2AdisIdSideB, helper.gyro3L3gIdSideB); } return status; } + +void AcsBoardAssembly::handleChildrenLostMode(ReturnValue_t result) { + using namespace duallane; + // Special handling to account for GPS devices being faulty. If the GPS device on the other + // side is marked faulty, directly to to dual side. + if (submode == Submodes::A_SIDE) { + if (gps0HealthDevFaulty()) { + triggerEvent(DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY, submode, 0); + startTransition(mode, Submodes::DUAL_MODE); + return; + } + } else if (submode == Submodes::B_SIDE) { + if (gps1HealthDevFaulty()) { + triggerEvent(DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY, submode, 0); + startTransition(mode, Submodes::DUAL_MODE); + return; + } + } + DualLaneAssemblyBase::handleChildrenLostMode(result); +} + +bool AcsBoardAssembly::gps0HealthDevFaulty() const { + auto health = healthHelper.healthTable->getHealth(helper.healthDevGps0); + if (health == FAULTY or health == PERMANENT_FAULTY) { + return true; + } + return false; +} + +bool AcsBoardAssembly::gps1HealthDevFaulty() const { + auto health = healthHelper.healthTable->getHealth(helper.healthDevGps1); + if (health == FAULTY or health == PERMANENT_FAULTY) { + return true; + } + return false; +} + +bool AcsBoardAssembly::isGpsUsable(uint8_t targetSubmode) const { + if (targetSubmode == duallane::A_SIDE and + healthHelper.healthTable->isFaulty(helper.healthDevGps0)) { + // Causes a OFF command to be sent, which triggers a side switch or a switch to dual side. + return false; + } + if (targetSubmode == duallane::B_SIDE and + healthHelper.healthTable->isFaulty(helper.healthDevGps1)) { + // Causes a OFF command to be sent, which triggers a side switch or a switch to dual side. + return false; + } + auto gpsIter = childrenMap.find(helper.gpsId); + // Check if device is already in target mode + if (gpsIter != childrenMap.end() and gpsIter->second.mode == mode) { + return true; + } + return true; +} diff --git a/mission/system/objects/AcsBoardAssembly.h b/mission/system/acs/AcsBoardAssembly.h similarity index 81% rename from mission/system/objects/AcsBoardAssembly.h rename to mission/system/acs/AcsBoardAssembly.h index a07431fe..01e74862 100644 --- a/mission/system/objects/AcsBoardAssembly.h +++ b/mission/system/acs/AcsBoardAssembly.h @@ -6,13 +6,13 @@ #include #include "DualLaneAssemblyBase.h" -#include "DualLanePowerStateMachine.h" #include "eive/eventSubsystemIds.h" +#include "mission/system/DualLanePowerStateMachine.h" struct AcsBoardHelper { AcsBoardHelper(object_id_t mgm0Id, object_id_t mgm1Id, object_id_t mgm2Id, object_id_t mgm3Id, object_id_t gyro0Id, object_id_t gyro1Id, object_id_t gyro2Id, object_id_t gyro3Id, - object_id_t gpsId) + object_id_t gpsId, object_id_t gps0HealthDev, object_id_t gps1HealthDev) : mgm0Lis3IdSideA(mgm0Id), mgm1Rm3100IdSideA(mgm1Id), mgm2Lis3IdSideB(mgm2Id), @@ -21,7 +21,9 @@ struct AcsBoardHelper { gyro1L3gIdSideA(gyro1Id), gyro2AdisIdSideB(gyro2Id), gyro3L3gIdSideB(gyro3Id), - gpsId(gpsId) {} + gpsId(gpsId), + healthDevGps0(gps0HealthDev), + healthDevGps1(gps1HealthDev) {} object_id_t mgm0Lis3IdSideA = objects::NO_OBJECT; object_id_t mgm1Rm3100IdSideA = objects::NO_OBJECT; @@ -35,6 +37,9 @@ struct AcsBoardHelper { object_id_t gpsId = objects::NO_OBJECT; + object_id_t healthDevGps0 = objects::NO_OBJECT; + object_id_t healthDevGps1 = objects::NO_OBJECT; + Mode_t gyro0SideAMode = HasModesIF::MODE_OFF; Mode_t gyro1SideAMode = HasModesIF::MODE_OFF; Mode_t gyro2SideBMode = HasModesIF::MODE_OFF; @@ -91,6 +96,11 @@ class AcsBoardAssembly : public DualLaneAssemblyBase { //! desired mode/submode combination static constexpr Event SIDE_SWITCH_TRANSITION_NOT_ALLOWED = event::makeEvent(SUBSYSTEM_ID, 3, severity::LOW); + //! [EXPORT] : [COMMENT] This is triggered when the assembly would have normally switched + //! the board side, but the GPS device of the other side was marked faulty. + //! P1: Current submode. + static constexpr Event DIRECT_TRANSITION_TO_DUAL_OTHER_GPS_FAULTY = + event::makeEvent(SUBSYSTEM_ID, 4, severity::MEDIUM); static constexpr uint8_t NUMBER_DEVICES_MODE_TABLE = 9; @@ -105,8 +115,8 @@ class AcsBoardAssembly : public DualLaneAssemblyBase { void selectGpsInDualMode(duallane::Submodes side); private: - static constexpr pcdu::Switches SWITCH_A = pcdu::Switches::PDU1_CH7_ACS_A_SIDE_3V3; - static constexpr pcdu::Switches SWITCH_B = pcdu::Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3; + static constexpr power::Switches SWITCH_A = power::Switches::PDU1_CH7_ACS_A_SIDE_3V3; + static constexpr power::Switches SWITCH_B = power::Switches::PDU2_CH7_ACS_BOARD_SIDE_B_3V3; AcsBoardHelper helper; GpioIF* gpioIF = nullptr; @@ -120,9 +130,14 @@ class AcsBoardAssembly : public DualLaneAssemblyBase { ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override; ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; + void handleChildrenLostMode(ReturnValue_t result) override; + ReturnValue_t handleNormalOrOnModeCmd(Mode_t mode, Submode_t submode); ReturnValue_t checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode); void refreshHelperModes(); + bool gps0HealthDevFaulty() const; + bool gps1HealthDevFaulty() const; + bool isGpsUsable(uint8_t targetSubmode) const; }; #endif /* MISSION_SYSTEM_ACSBOARDASSEMBLY_H_ */ diff --git a/mission/system/fdir/AcsBoardFdir.cpp b/mission/system/acs/AcsBoardFdir.cpp similarity index 100% rename from mission/system/fdir/AcsBoardFdir.cpp rename to mission/system/acs/AcsBoardFdir.cpp diff --git a/mission/system/fdir/AcsBoardFdir.h b/mission/system/acs/AcsBoardFdir.h similarity index 100% rename from mission/system/fdir/AcsBoardFdir.h rename to mission/system/acs/AcsBoardFdir.h diff --git a/mission/system/objects/AcsSubsystem.cpp b/mission/system/acs/AcsSubsystem.cpp similarity index 95% rename from mission/system/objects/AcsSubsystem.cpp rename to mission/system/acs/AcsSubsystem.cpp index 873d88cf..2b1d9ef6 100644 --- a/mission/system/objects/AcsSubsystem.cpp +++ b/mission/system/acs/AcsSubsystem.cpp @@ -4,7 +4,7 @@ #include #include "fsfw/modes/ModeMessage.h" -#include "mission/acsDefs.h" +#include "mission/acs/defs.h" AcsSubsystem::AcsSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables) diff --git a/mission/system/objects/AcsSubsystem.h b/mission/system/acs/AcsSubsystem.h similarity index 100% rename from mission/system/objects/AcsSubsystem.h rename to mission/system/acs/AcsSubsystem.h diff --git a/mission/system/acs/CMakeLists.txt b/mission/system/acs/CMakeLists.txt new file mode 100644 index 00000000..b7f927a0 --- /dev/null +++ b/mission/system/acs/CMakeLists.txt @@ -0,0 +1,13 @@ +target_sources( + ${LIB_EIVE_MISSION} + PRIVATE AcsBoardAssembly.cpp + AcsSubsystem.cpp + StrAssembly.cpp + DualLaneAssemblyBase.cpp + ImtqAssembly.cpp + RwAssembly.cpp + SusAssembly.cpp + AcsBoardFdir.cpp + acsModeTree.cpp + SusFdir.cpp + StrFdir.cpp) diff --git a/mission/system/objects/DualLaneAssemblyBase.cpp b/mission/system/acs/DualLaneAssemblyBase.cpp similarity index 82% rename from mission/system/objects/DualLaneAssemblyBase.cpp rename to mission/system/acs/DualLaneAssemblyBase.cpp index 22728457..ecb91689 100644 --- a/mission/system/objects/DualLaneAssemblyBase.cpp +++ b/mission/system/acs/DualLaneAssemblyBase.cpp @@ -5,7 +5,7 @@ #include "OBSWConfig.h" DualLaneAssemblyBase::DualLaneAssemblyBase(object_id_t objectId, PowerSwitchIF* pwrSwitcher, - pcdu::Switches switch1, pcdu::Switches switch2, + power::Switches switch1, power::Switches switch2, Event pwrTimeoutEvent, Event sideSwitchNotAllowedEvent, Event transitionOtherSideFailedEvent) : AssemblyBase(objectId, 20), @@ -36,6 +36,7 @@ void DualLaneAssemblyBase::performChildOperation() { void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) { using namespace duallane; pwrStateMachine.reset(); + if (mode != MODE_OFF) { // Special exception: A transition from dual side to single mode must be handled like // going OFF. @@ -45,9 +46,16 @@ void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) { AssemblyBase::startTransition(mode, submode); return; } + if (sideSwitchState == SideSwitchState::NONE and sideSwitchTransition(mode, submode)) { + sideSwitchState = SideSwitchState::REQUESTED; + } + uint8_t pwrSubmode = submode; + if (sideSwitchState == SideSwitchState::REQUESTED) { + pwrSubmode = duallane::DUAL_MODE; + } // If anything other than MODE_OFF is commanded, perform power state machine first // Cache the target modes, required by power state machine - pwrStateMachine.start(mode, submode); + pwrStateMachine.start(mode, pwrSubmode); // Cache these for later after the power state machine has finished targetMode = mode; targetSubmode = submode; @@ -56,7 +64,7 @@ void DualLaneAssemblyBase::startTransition(Mode_t mode, Submode_t submode) { } } -bool DualLaneAssemblyBase::isUseable(object_id_t object, Mode_t mode) { +bool DualLaneAssemblyBase::isModeCommandable(object_id_t object, Mode_t mode) { if (healthHelper.healthTable->isFaulty(object)) { return false; } @@ -65,11 +73,8 @@ bool DualLaneAssemblyBase::isUseable(object_id_t object, Mode_t mode) { if (childrenMap[object].mode == mode) { return true; } - - if (healthHelper.healthTable->isCommandable(object)) { - return true; - } - return false; + // Check for external control health state is done by base class. + return true; } ReturnValue_t DualLaneAssemblyBase::pwrStateMachineWrapper() { @@ -110,13 +115,6 @@ ReturnValue_t DualLaneAssemblyBase::isModeCombinationValid(Mode_t mode, Submode_ if (submode != A_SIDE and submode != B_SIDE and submode != DUAL_MODE) { return returnvalue::FAILED; } - if (sideSwitchTransition(mode, submode)) { - // I could implement this but this would increase the already high complexity. This is not - // necessary. The operator should can send a command to switch the assembly off first and - // then send a command to turn on the other side, either to ON or to NORMAL - triggerEvent(SIDE_SWITCH_TRANSITION_NOT_ALLOWED_ID, 0, 0); - return TRANS_NOT_ALLOWED; - } return returnvalue::OK; } @@ -132,7 +130,11 @@ void DualLaneAssemblyBase::handleModeReached() { // For dual to single side transition, devices should be logically off, but the switch // handling still needs to be done. if (dualToSingleSideTransition) { - pwrStateMachine.start(targetMode, targetSubmode); + if (sideSwitchState == SideSwitchState::DISABLE_OTHER_SIDE) { + pwrStateMachine.start(targetMode, targetSubmodeForSideSwitch); + } else { + pwrStateMachine.start(targetMode, targetSubmode); + } pwrStateMachineWrapper(); return; } @@ -231,9 +233,8 @@ bool DualLaneAssemblyBase::sideSwitchTransition(Mode_t mode, Submode_t submode) return false; } if (this->mode == MODE_ON or this->mode == DeviceHandlerIF::MODE_NORMAL) { - if (this->submode == Submodes::A_SIDE and submode == Submodes::B_SIDE) { - return true; - } else if (this->submode == Submodes::B_SIDE and submode == Submodes::A_SIDE) { + if ((this->submode == Submodes::A_SIDE and submode == Submodes::B_SIDE) or + (this->submode == Submodes::B_SIDE and submode == Submodes::A_SIDE)) { return true; } return false; @@ -241,12 +242,31 @@ bool DualLaneAssemblyBase::sideSwitchTransition(Mode_t mode, Submode_t submode) return false; } +void DualLaneAssemblyBase::handleSideSwitchStates(uint8_t& submode, bool& needsSecondStep) { + if (sideSwitchState == SideSwitchState::REQUESTED) { + sideSwitchState = SideSwitchState::TO_DUAL; + } + // Switch to dual side first, and later switch back to the otherside + if (sideSwitchState == SideSwitchState::TO_DUAL) { + targetSubmodeForSideSwitch = static_cast(submode); + submode = duallane::Submodes::DUAL_MODE; + sideSwitchState = SideSwitchState::DISABLE_OTHER_SIDE; + // TODO: Ugly hack. The base class should support arbitrary number of steps.. + needsSecondStep = true; + } else if (sideSwitchState == SideSwitchState::DISABLE_OTHER_SIDE) { + // Set this flag because the power needs to be switched off. + dualToSingleSideTransition = true; + submode = targetSubmodeForSideSwitch; + } +} + void DualLaneAssemblyBase::finishModeOp() { using namespace duallane; AssemblyBase::handleModeReached(); pwrStateMachine.reset(); powerRetryCounter = 0; tryingOtherSide = false; + sideSwitchState = SideSwitchState::NONE; dualToSingleSideTransition = false; dualModeErrorSwitch = true; } diff --git a/mission/system/objects/DualLaneAssemblyBase.h b/mission/system/acs/DualLaneAssemblyBase.h similarity index 84% rename from mission/system/objects/DualLaneAssemblyBase.h rename to mission/system/acs/DualLaneAssemblyBase.h index 929ef3f9..d15a2f30 100644 --- a/mission/system/objects/DualLaneAssemblyBase.h +++ b/mission/system/acs/DualLaneAssemblyBase.h @@ -2,7 +2,7 @@ #define MISSION_SYSTEM_DUALLANEASSEMBLYBASE_H_ #include -#include +#include /** * @brief Encapsulates assemblies which are also responsible for dual lane power switching @@ -18,8 +18,8 @@ class DualLaneAssemblyBase : public AssemblyBase, public ConfirmsFailuresIF { static constexpr UniqueEventId_t POWER_STATE_MACHINE_TIMEOUT_ID = 2; static constexpr UniqueEventId_t SIDE_SWITCH_TRANSITION_NOT_ALLOWED_ID = 3; - DualLaneAssemblyBase(object_id_t objectId, PowerSwitchIF* pwrSwitcher, pcdu::Switches switch1, - pcdu::Switches switch2, Event pwrSwitchTimeoutEvent, + DualLaneAssemblyBase(object_id_t objectId, PowerSwitchIF* pwrSwitcher, power::Switches switch1, + power::Switches switch2, Event pwrSwitchTimeoutEvent, Event sideSwitchNotAllowedEvent, Event transitionOtherSideFailedEvent); protected: @@ -34,6 +34,11 @@ class DualLaneAssemblyBase : public AssemblyBase, public ConfirmsFailuresIF { bool dualToSingleSideTransition = false; duallane::Submodes defaultSubmode = duallane::Submodes::A_SIDE; + enum SideSwitchState { NONE, REQUESTED, TO_DUAL, DISABLE_OTHER_SIDE }; + + SideSwitchState sideSwitchState = SideSwitchState::NONE; + duallane::Submodes targetSubmodeForSideSwitch = duallane::Submodes::B_SIDE; + enum RecoveryCustomStates { IDLE, POWER_SWITCHING_OFF, @@ -44,12 +49,19 @@ class DualLaneAssemblyBase : public AssemblyBase, public ConfirmsFailuresIF { MessageQueueIF* eventQueue = nullptr; /** - * Check whether it makes sense to send mode commands to the device + * To be called in mode command packer function of the child class. + * @param submode + * @param needsSecondStep + */ + void handleSideSwitchStates(uint8_t& submode, bool& needsSecondStep); + + /** + * Check whether it makes sense to send mode commands to the device. * @param object * @param mode * @return */ - bool isUseable(object_id_t object, Mode_t mode); + bool isModeCommandable(object_id_t object, Mode_t mode); /** * Thin wrapper function which is required because the helper class diff --git a/mission/system/objects/ImtqAssembly.cpp b/mission/system/acs/ImtqAssembly.cpp similarity index 100% rename from mission/system/objects/ImtqAssembly.cpp rename to mission/system/acs/ImtqAssembly.cpp diff --git a/mission/system/objects/ImtqAssembly.h b/mission/system/acs/ImtqAssembly.h similarity index 100% rename from mission/system/objects/ImtqAssembly.h rename to mission/system/acs/ImtqAssembly.h diff --git a/mission/system/objects/RwAssembly.cpp b/mission/system/acs/RwAssembly.cpp similarity index 100% rename from mission/system/objects/RwAssembly.cpp rename to mission/system/acs/RwAssembly.cpp diff --git a/mission/system/objects/RwAssembly.h b/mission/system/acs/RwAssembly.h similarity index 100% rename from mission/system/objects/RwAssembly.h rename to mission/system/acs/RwAssembly.h diff --git a/mission/system/objects/StrAssembly.cpp b/mission/system/acs/StrAssembly.cpp similarity index 79% rename from mission/system/objects/StrAssembly.cpp rename to mission/system/acs/StrAssembly.cpp index 10ca5759..abd7a4ce 100644 --- a/mission/system/objects/StrAssembly.cpp +++ b/mission/system/acs/StrAssembly.cpp @@ -11,8 +11,13 @@ StrAssembly::StrAssembly(object_id_t objectId) : AssemblyBase(objectId) { } ReturnValue_t StrAssembly::commandChildren(Mode_t mode, Submode_t submode) { - commandTable[0].setMode(mode); + // To ensure consistent state. + commandTable[0].setMode(MODE_OFF); commandTable[0].setSubmode(submode); + if (healthHelper.healthTable->getHealth(objects::STAR_TRACKER) != FAULTY) { + commandTable[0].setMode(mode); + commandTable[0].setSubmode(submode); + } HybridIterator iter(commandTable.begin(), commandTable.end()); executeTable(iter); return returnvalue::OK; diff --git a/mission/system/objects/StrAssembly.h b/mission/system/acs/StrAssembly.h similarity index 100% rename from mission/system/objects/StrAssembly.h rename to mission/system/acs/StrAssembly.h diff --git a/mission/system/fdir/StrFdir.cpp b/mission/system/acs/StrFdir.cpp similarity index 92% rename from mission/system/fdir/StrFdir.cpp rename to mission/system/acs/StrFdir.cpp index 7d0947a9..97a4162a 100644 --- a/mission/system/fdir/StrFdir.cpp +++ b/mission/system/acs/StrFdir.cpp @@ -1,6 +1,6 @@ #include "StrFdir.h" -#include "mission/acsDefs.h" +#include "mission/acs/defs.h" StrFdir::StrFdir(object_id_t strObject) : DeviceHandlerFailureIsolation(strObject, objects::NO_OBJECT) {} diff --git a/mission/system/fdir/StrFdir.h b/mission/system/acs/StrFdir.h similarity index 100% rename from mission/system/fdir/StrFdir.h rename to mission/system/acs/StrFdir.h diff --git a/mission/system/objects/SusAssembly.cpp b/mission/system/acs/SusAssembly.cpp similarity index 86% rename from mission/system/objects/SusAssembly.cpp rename to mission/system/acs/SusAssembly.cpp index 9008e7e0..13946c13 100644 --- a/mission/system/objects/SusAssembly.cpp +++ b/mission/system/acs/SusAssembly.cpp @@ -45,6 +45,7 @@ ReturnValue_t SusAssembly::handleNormalOrOnModeCmd(Mode_t mode, Submode_t submod using namespace duallane; ReturnValue_t result = returnvalue::OK; bool needsSecondStep = false; + handleSideSwitchStates(submode, needsSecondStep); auto cmdSeq = [&](object_id_t objectId, Mode_t devMode, uint8_t tableIdx) { if (mode == devMode) { modeTable[tableIdx].setMode(mode); @@ -158,18 +159,29 @@ void SusAssembly::refreshHelperModes() { ReturnValue_t SusAssembly::checkAndHandleHealthStates(Mode_t deviceMode, Submode_t deviceSubmode) { using namespace returnvalue; ReturnValue_t status = returnvalue::OK; - auto overwriteHealthForOneDev = [&](object_id_t dev) { + auto checkSusGroup = [&](object_id_t devNom, object_id_t devRed) { + HealthState healthNom = healthHelper.healthTable->getHealth(devNom); + HealthState healthRed = healthHelper.healthTable->getHealth(devRed); + if ((healthNom == FAULTY or healthNom == PERMANENT_FAULTY) and + (healthRed == FAULTY or healthRed == PERMANENT_FAULTY)) { + overwriteDeviceHealth(devNom, healthNom); + overwriteDeviceHealth(devRed, healthRed); + } + }; + auto checkHealthForOneDev = [&](object_id_t dev) { HealthState health = healthHelper.healthTable->getHealth(dev); - if (health == FAULTY or health == PERMANENT_FAULTY) { - overwriteDeviceHealth(dev, health); - status = NEED_TO_CHANGE_HEALTH; - } else if (health == EXTERNAL_CONTROL) { + if (health == EXTERNAL_CONTROL) { modeHelper.setForced(true); } }; if (deviceSubmode == duallane::DUAL_MODE) { - for (uint8_t idx = 0; idx < 12; idx++) { - overwriteHealthForOneDev(helper.susIds[idx]); + uint8_t idx = 0; + for (idx = 0; idx < 6; idx++) { + checkSusGroup(helper.susIds[idx], helper.susIds[idx + 6]); + checkHealthForOneDev(helper.susIds[idx]); + } + for (idx = 6; idx < 12; idx++) { + checkHealthForOneDev(helper.susIds[idx]); } } return status; diff --git a/mission/system/objects/SusAssembly.h b/mission/system/acs/SusAssembly.h similarity index 93% rename from mission/system/objects/SusAssembly.h rename to mission/system/acs/SusAssembly.h index e993bee4..15f347dd 100644 --- a/mission/system/objects/SusAssembly.h +++ b/mission/system/acs/SusAssembly.h @@ -44,8 +44,8 @@ class SusAssembly : public DualLaneAssemblyBase { private: enum class States { IDLE, SWITCHING_POWER, MODE_COMMANDING } state = States::IDLE; - static constexpr pcdu::Switches SWITCH_NOM = pcdu::Switches::PDU1_CH4_SUS_NOMINAL_3V3; - static constexpr pcdu::Switches SWITCH_RED = pcdu::Switches::PDU2_CH4_SUS_REDUNDANT_3V3; + static constexpr power::Switches SWITCH_NOM = power::Switches::PDU1_CH4_SUS_NOMINAL_3V3; + static constexpr power::Switches SWITCH_RED = power::Switches::PDU2_CH4_SUS_REDUNDANT_3V3; FixedArrayList modeTable; SusAssHelper helper; diff --git a/mission/system/fdir/SusFdir.cpp b/mission/system/acs/SusFdir.cpp similarity index 100% rename from mission/system/fdir/SusFdir.cpp rename to mission/system/acs/SusFdir.cpp diff --git a/mission/system/fdir/SusFdir.h b/mission/system/acs/SusFdir.h similarity index 100% rename from mission/system/fdir/SusFdir.h rename to mission/system/acs/SusFdir.h diff --git a/mission/system/tree/acsModeTree.cpp b/mission/system/acs/acsModeTree.cpp similarity index 99% rename from mission/system/tree/acsModeTree.cpp rename to mission/system/acs/acsModeTree.cpp index 9b0c573a..85d2ea45 100644 --- a/mission/system/tree/acsModeTree.cpp +++ b/mission/system/acs/acsModeTree.cpp @@ -9,9 +9,9 @@ #include #include "eive/objects.h" -#include "mission/acsDefs.h" -#include "mission/system/objects/definitions.h" -#include "util.h" +#include "mission/acs/defs.h" +#include "mission/power/defs.h" +#include "mission/system/tree/util.h" AcsSubsystem satsystem::acs::ACS_SUBSYSTEM(objects::ACS_SUBSYSTEM, 12, 24); diff --git a/mission/system/tree/acsModeTree.h b/mission/system/acs/acsModeTree.h similarity index 74% rename from mission/system/tree/acsModeTree.h rename to mission/system/acs/acsModeTree.h index 27236fba..da0374e6 100644 --- a/mission/system/tree/acsModeTree.h +++ b/mission/system/acs/acsModeTree.h @@ -1,4 +1,4 @@ -#include +#include namespace satsystem { namespace acs { diff --git a/mission/system/com/CMakeLists.txt b/mission/system/com/CMakeLists.txt new file mode 100644 index 00000000..6d31da88 --- /dev/null +++ b/mission/system/com/CMakeLists.txt @@ -0,0 +1,3 @@ +target_sources( + ${LIB_EIVE_MISSION} PRIVATE comModeTree.cpp ComSubsystem.cpp + SyrlinksAssembly.cpp SyrlinksFdir.cpp) diff --git a/mission/system/objects/ComSubsystem.cpp b/mission/system/com/ComSubsystem.cpp similarity index 86% rename from mission/system/objects/ComSubsystem.cpp rename to mission/system/com/ComSubsystem.cpp index b9ed0a05..5001dbe5 100644 --- a/mission/system/objects/ComSubsystem.cpp +++ b/mission/system/com/ComSubsystem.cpp @@ -1,12 +1,14 @@ #include "ComSubsystem.h" +#include #include #include #include #include #include -#include +#include #include +#include #include @@ -21,7 +23,13 @@ ComSubsystem::ComSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequence } void ComSubsystem::performChildOperation() { + Subsystem::performChildOperation(); readEventQueue(); + if (performRecoveryToRxOnly and not isInTransition) { + startRxOnlyRecovery(true); + // To avoid immediately enabling TX after falling back. + rememberBitLock = false; + } // Execute default rate sequence after transition has been completed if (rememberBitLock and not isInTransition) { startRxAndTxLowRateSeq(); @@ -30,8 +38,6 @@ void ComSubsystem::performChildOperation() { if (countdownActive) { checkTransmitterCountdown(); } - - Subsystem::performChildOperation(); } MessageQueueId_t ComSubsystem::getCommandQueue() const { return Subsystem::getCommandQueue(); } @@ -93,7 +99,11 @@ ReturnValue_t ComSubsystem::initialize() { "listener" << std::endl; #endif - return ObjectManagerIF::CHILD_INIT_FAILED; + } + result = manager->subscribeToEvent(eventQueue->getId(), + event::getEventId(tcsCtrl::SYRLINKS_OVERHEATING)); + if (result != returnvalue::OK) { + return ObjectManager::CHILD_INIT_FAILED; } result = manager->subscribeToEventRange(eventQueue->getId(), event::getEventId(PdecHandler::CARRIER_LOCK), @@ -144,6 +154,19 @@ void ComSubsystem::readEventQueue() { void ComSubsystem::handleEventMessage(EventMessage *eventMessage) { Event event = eventMessage->getEvent(); switch (event) { + case tcsCtrl::SYRLINKS_OVERHEATING: { + // This event overrides the bit lock. + rememberBitLock = false; + if (mode == com::RX_ONLY) { + return; + } + if (isInTransition) { + performRecoveryToRxOnly = true; + return; + } + startRxOnlyRecovery(true); + break; + } case PdecHandler::BIT_LOCK_PDEC: { handleBitLockEvent(); break; @@ -191,6 +214,12 @@ void ComSubsystem::checkTransmitterCountdown() { } } +void ComSubsystem::startRxOnlyRecovery(bool forced) { + modeHelper.setForced(forced); + startTransition(com::RX_ONLY, 0); + performRecoveryToRxOnly = false; +} + bool ComSubsystem::isTxMode(Mode_t mode) { if ((mode == com::Submode::RX_AND_TX_DEFAULT_DATARATE) || (mode == com::Submode::RX_AND_TX_LOW_DATARATE) || diff --git a/mission/system/objects/ComSubsystem.h b/mission/system/com/ComSubsystem.h similarity index 96% rename from mission/system/objects/ComSubsystem.h rename to mission/system/com/ComSubsystem.h index 854a877b..476bf646 100644 --- a/mission/system/objects/ComSubsystem.h +++ b/mission/system/com/ComSubsystem.h @@ -7,7 +7,7 @@ #include #include -#include "mission/comDefs.h" +#include "mission/com/defs.h" class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF { public: @@ -57,6 +57,7 @@ class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF { * @brief Enables transmitter in low rate mode */ void startRxAndTxLowRateSeq(); + void startRxOnlyRecovery(bool forced); /** * @brief Returns true if mode is a mode where the transmitter is on @@ -73,6 +74,7 @@ class ComSubsystem : public Subsystem, public ReceivesParameterMessagesIF { MessageQueueIF *eventQueue = nullptr; bool enableTxWhenCarrierLock = false; + bool performRecoveryToRxOnly = false; // Countdown will be started as soon as the transmitter was enabled Countdown transmitterCountdown; diff --git a/mission/system/com/SyrlinksAssembly.cpp b/mission/system/com/SyrlinksAssembly.cpp new file mode 100644 index 00000000..b5e50924 --- /dev/null +++ b/mission/system/com/SyrlinksAssembly.cpp @@ -0,0 +1,57 @@ +#include "SyrlinksAssembly.h" + +#include + +using namespace returnvalue; + +SyrlinksAssembly::SyrlinksAssembly(object_id_t objectId) : AssemblyBase(objectId) { + ModeListEntry entry; + entry.setObject(objects::SYRLINKS_HANDLER); + entry.setMode(MODE_OFF); + entry.setSubmode(SUBMODE_NONE); + commandTable.insert(entry); +} + +ReturnValue_t SyrlinksAssembly::commandChildren(Mode_t mode, Submode_t submode) { + commandTable[0].setMode(mode); + commandTable[0].setSubmode(submode); + HybridIterator iter(commandTable.begin(), commandTable.end()); + if (recoveryState == RECOVERY_IDLE) { + ReturnValue_t result = checkAndHandleHealthState(mode, submode); + if (result == NEED_TO_CHANGE_HEALTH) { + return OK; + } + } + executeTable(iter); + return returnvalue::OK; +} + +ReturnValue_t SyrlinksAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) { + if (childrenMap[objects::SYRLINKS_HANDLER].mode != wantedMode) { + return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE; + } + return returnvalue::OK; +} + +ReturnValue_t SyrlinksAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) { + if (mode == MODE_ON or mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_OFF) { + return returnvalue::OK; + } + return returnvalue::FAILED; +} + +ReturnValue_t SyrlinksAssembly::checkAndHandleHealthState(Mode_t deviceMode, + Submode_t deviceSubmode) { + HealthState health = healthHelper.healthTable->getHealth(objects::SYRLINKS_HANDLER); + if (health == FAULTY or health == PERMANENT_FAULTY) { + overwriteDeviceHealth(objects::SYRLINKS_HANDLER, health); + return NEED_TO_CHANGE_HEALTH; + } else if (health == EXTERNAL_CONTROL) { + modeHelper.setForced(true); + } + return OK; +} + +void SyrlinksAssembly::handleChildrenLostMode(ReturnValue_t result) { + startTransition(mode, submode); +} diff --git a/mission/system/com/SyrlinksAssembly.h b/mission/system/com/SyrlinksAssembly.h new file mode 100644 index 00000000..314474d3 --- /dev/null +++ b/mission/system/com/SyrlinksAssembly.h @@ -0,0 +1,20 @@ +#ifndef MISSION_SYSTEM_OBJECTS_SYRLINKSASSEMBLY_H_ +#define MISSION_SYSTEM_OBJECTS_SYRLINKSASSEMBLY_H_ +#include + +class SyrlinksAssembly : public AssemblyBase { + public: + SyrlinksAssembly(object_id_t objectId); + + private: + FixedArrayList commandTable; + + ReturnValue_t commandChildren(Mode_t mode, Submode_t submode) override; + ReturnValue_t checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) override; + ReturnValue_t isModeCombinationValid(Mode_t mode, Submode_t submode) override; + void handleChildrenLostMode(ReturnValue_t result) override; + + ReturnValue_t checkAndHandleHealthState(Mode_t deviceMode, Submode_t deviceSubmode); +}; + +#endif /* MISSION_SYSTEM_OBJECTS_SYRLINKSASSEMBLY_H_ */ diff --git a/mission/system/fdir/SyrlinksFdir.cpp b/mission/system/com/SyrlinksFdir.cpp similarity index 98% rename from mission/system/fdir/SyrlinksFdir.cpp rename to mission/system/com/SyrlinksFdir.cpp index 999b5ad0..a8e25496 100644 --- a/mission/system/fdir/SyrlinksFdir.cpp +++ b/mission/system/com/SyrlinksFdir.cpp @@ -7,7 +7,7 @@ #include "fsfw/power/Fuse.h" #include "fsfw/serviceinterface/ServiceInterfaceStream.h" #include "fsfw/thermal/ThermalComponentIF.h" -#include "mission/devices/devicedefinitions/SyrlinksDefinitions.h" +#include "mission/com/syrlinksDefs.h" SyrlinksFdir::SyrlinksFdir(object_id_t syrlinksId) : DeviceHandlerFailureIsolation(syrlinksId, objects::NO_OBJECT) {} diff --git a/mission/system/fdir/SyrlinksFdir.h b/mission/system/com/SyrlinksFdir.h similarity index 100% rename from mission/system/fdir/SyrlinksFdir.h rename to mission/system/com/SyrlinksFdir.h diff --git a/mission/system/tree/comModeTree.cpp b/mission/system/com/comModeTree.cpp similarity index 88% rename from mission/system/tree/comModeTree.cpp rename to mission/system/com/comModeTree.cpp index dd3aa7a1..bb9a8d10 100644 --- a/mission/system/tree/comModeTree.cpp +++ b/mission/system/com/comModeTree.cpp @@ -5,8 +5,8 @@ #include #include "eive/objects.h" -#include "mission/comDefs.h" -#include "util.h" +#include "mission/com/defs.h" +#include "mission/system/tree/util.h" const auto check = subsystem::checkInsert; @@ -22,7 +22,7 @@ auto COM_SEQUENCE_RX_ONLY = auto COM_TABLE_RX_ONLY_TGT = std::make_pair( static_cast(::com::Submode::RX_ONLY << 24) | 1, FixedArrayList()); auto COM_TABLE_RX_ONLY_TRANS_0 = std::make_pair( - static_cast(::com::Submode::RX_ONLY << 24) | 2, FixedArrayList()); + static_cast(::com::Submode::RX_ONLY << 24) | 2, FixedArrayList()); auto COM_TABLE_RX_ONLY_TRANS_1 = std::make_pair( static_cast(::com::Submode::RX_ONLY << 24) | 3, FixedArrayList()); @@ -36,7 +36,7 @@ auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_0 = FixedArrayList()); auto COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1 = std::make_pair(static_cast(::com::Submode::RX_AND_TX_LOW_DATARATE << 24) | 3, - FixedArrayList()); + FixedArrayList()); auto COM_SEQUENCE_RX_AND_TX_HIGH_RATE = std::make_pair(::com::Submode::RX_AND_TX_HIGH_DATARATE, FixedArrayList()); @@ -48,7 +48,7 @@ auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_0 = FixedArrayList()); auto COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1 = std::make_pair(static_cast(::com::Submode::RX_AND_TX_HIGH_DATARATE << 24) | 3, - FixedArrayList()); + FixedArrayList()); auto COM_SEQUENCE_RX_AND_TX_DEFAULT_RATE = std::make_pair(::com::Submode::RX_AND_TX_DEFAULT_DATARATE, FixedArrayList()); @@ -60,7 +60,7 @@ auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_0 = FixedArrayList()); auto COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1 = std::make_pair(static_cast(::com::Submode::RX_AND_TX_DEFAULT_DATARATE << 24) | 3, - FixedArrayList()); + FixedArrayList()); namespace { @@ -110,6 +110,10 @@ void buildRxOnlySequence(Subsystem& ss, ModeListEntry& eh) { // Build RX Only transition 0 iht(objects::SYRLINKS_ASSY, NML, ::com::Submode::RX_ONLY, COM_TABLE_RX_ONLY_TRANS_0.second); + iht(objects::LOG_STORE_AND_TM_TASK, OFF, 0, COM_TABLE_RX_ONLY_TRANS_0.second); + iht(objects::HK_STORE_AND_TM_TASK, OFF, 0, COM_TABLE_RX_ONLY_TRANS_0.second); + iht(objects::CFDP_STORE_AND_TM_TASK, OFF, 0, COM_TABLE_RX_ONLY_TRANS_0.second); + iht(objects::LIVE_TM_TASK, OFF, 0, COM_TABLE_RX_ONLY_TRANS_0.second); check(ss.addTable(TableEntry(COM_TABLE_RX_ONLY_TRANS_0.first, &COM_TABLE_RX_ONLY_TRANS_0.second)), ctxc); @@ -165,6 +169,10 @@ void buildTxAndRxLowRateSequence(Subsystem& ss, ModeListEntry& eh) { // Build TX and RX low transition 1 iht(objects::SYRLINKS_ASSY, NML, ::com::Submode::RX_AND_TX_LOW_DATARATE, COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.second); + iht(objects::LOG_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.second); + iht(objects::HK_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.second); + iht(objects::CFDP_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.second); + iht(objects::LIVE_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.second); check(ss.addTable(TableEntry(COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.first, &COM_TABLE_RX_AND_TX_LOW_RATE_TRANS_1.second)), ctxc); @@ -217,6 +225,10 @@ void buildTxAndRxHighRateSequence(Subsystem& ss, ModeListEntry& eh) { // Build TX and RX high transition 1 iht(objects::SYRLINKS_ASSY, NML, ::com::Submode::RX_AND_TX_HIGH_DATARATE, COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.second); + iht(objects::LOG_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.second); + iht(objects::HK_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.second); + iht(objects::CFDP_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.second); + iht(objects::LIVE_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.second); check(ss.addTable(TableEntry(COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.first, &COM_TABLE_RX_AND_TX_HIGH_RATE_TRANS_1.second)), ctxc); @@ -271,6 +283,10 @@ void buildTxAndRxDefaultRateSequence(Subsystem& ss, ModeListEntry& eh) { // Build TX and RX default transition 1 iht(objects::SYRLINKS_ASSY, NML, ::com::Submode::RX_AND_TX_DEFAULT_DATARATE, COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.second); + iht(objects::LOG_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.second); + iht(objects::HK_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.second); + iht(objects::CFDP_STORE_AND_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.second); + iht(objects::LIVE_TM_TASK, ON, 0, COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.second); check(ss.addTable(TableEntry(COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.first, &COM_TABLE_RX_AND_TX_DEFAULT_RATE_TRANS_1.second)), ctxc); diff --git a/mission/system/tree/comModeTree.h b/mission/system/com/comModeTree.h similarity index 92% rename from mission/system/tree/comModeTree.h rename to mission/system/com/comModeTree.h index 0ac7f9b3..bf03bfb4 100644 --- a/mission/system/tree/comModeTree.h +++ b/mission/system/com/comModeTree.h @@ -2,7 +2,8 @@ #define MISSION_SYSTEM_TREE_COMMODETREE_H_ #include -#include + +#include "ComSubsystem.h" namespace satsystem { diff --git a/mission/system/fdir/CMakeLists.txt b/mission/system/fdir/CMakeLists.txt index 34a7e125..3f0baf01 100644 --- a/mission/system/fdir/CMakeLists.txt +++ b/mission/system/fdir/CMakeLists.txt @@ -1,4 +1 @@ -target_sources( - ${LIB_EIVE_MISSION} - PRIVATE AcsBoardFdir.cpp RtdFdir.cpp StrFdir.cpp SusFdir.cpp SyrlinksFdir.cpp - GomspacePowerFdir.cpp) +target_sources(${LIB_EIVE_MISSION} PRIVATE RtdFdir.cpp) diff --git a/mission/system/objects/CMakeLists.txt b/mission/system/objects/CMakeLists.txt index dc4cd80c..53cc200d 100644 --- a/mission/system/objects/CMakeLists.txt +++ b/mission/system/objects/CMakeLists.txt @@ -2,18 +2,8 @@ target_sources( ${LIB_EIVE_MISSION} PRIVATE EiveSystem.cpp CamSwitcher.cpp - AcsSubsystem.cpp - ComSubsystem.cpp TcsSubsystem.cpp PayloadSubsystem.cpp - AcsBoardAssembly.cpp - ImtqAssembly.cpp - SyrlinksAssembly.cpp Stack5VHandler.cpp - SusAssembly.cpp - RwAssembly.cpp - DualLanePowerStateMachine.cpp - StrAssembly.cpp PowerStateMachineBase.cpp - DualLaneAssemblyBase.cpp TcsBoardAssembly.cpp) diff --git a/mission/system/objects/CamSwitcher.cpp b/mission/system/objects/CamSwitcher.cpp index b995e211..90a78945 100644 --- a/mission/system/objects/CamSwitcher.cpp +++ b/mission/system/objects/CamSwitcher.cpp @@ -3,3 +3,8 @@ CamSwitcher::CamSwitcher(object_id_t objectId, PowerSwitchIF &pwrSwitcher, power::Switch_t pwrSwitch) : PowerSwitcherComponent(objectId, &pwrSwitcher, pwrSwitch) {} +void CamSwitcher::performFaultyOperation() { + if (not switcher.active() and switcher.getState() != PowerSwitcher::SWITCH_IS_OFF) { + switcher.turnOff(); + } +} diff --git a/mission/system/objects/CamSwitcher.h b/mission/system/objects/CamSwitcher.h index 672b884b..57f371ce 100644 --- a/mission/system/objects/CamSwitcher.h +++ b/mission/system/objects/CamSwitcher.h @@ -8,6 +8,7 @@ class CamSwitcher : public PowerSwitcherComponent { CamSwitcher(object_id_t objectId, PowerSwitchIF &pwrSwitcher, power::Switch_t pwrSwitch); private: + void performFaultyOperation() override; }; #endif /* MISSION_SYSTEM_OBJECTS_CAMSWITCHER_H_ */ diff --git a/mission/system/objects/EiveSystem.cpp b/mission/system/objects/EiveSystem.cpp index bb2a229d..f6b99b1e 100644 --- a/mission/system/objects/EiveSystem.cpp +++ b/mission/system/objects/EiveSystem.cpp @@ -3,12 +3,16 @@ #include #include #include -#include +#include +#include +#include + +#include "mission/sysDefs.h" EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables) : Subsystem(setObjectId, maxNumberOfSequences, maxNumberOfTables) { - auto mqArgs = MqArgs(getObjectId(), static_cast(this)); + auto mqArgs = MqArgs(SubsystemBase::getObjectId(), static_cast(this)); eventQueue = QueueFactory::instance()->createMessageQueue(10, EventMessage::EVENT_MESSAGE_SIZE, &mqArgs); } @@ -16,15 +20,15 @@ EiveSystem::EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, void EiveSystem::announceMode(bool recursive) { const char* modeStr = "UNKNOWN"; switch (mode) { - case (acs::AcsMode::OFF): { - modeStr = "OFF"; + case (satsystem::Mode::BOOT): { + modeStr = "OFF/BOOT"; break; } - case (acs::AcsMode::SAFE): { + case (satsystem::Mode::SAFE): { modeStr = "SAFE"; break; } - case (acs::AcsMode::PTG_IDLE): { + case (satsystem::Mode::PTG_IDLE): { modeStr = "POINTING IDLE"; break; } @@ -46,12 +50,16 @@ void EiveSystem::announceMode(bool recursive) { } void EiveSystem::performChildOperation() { + Subsystem::performChildOperation(); handleEventMessages(); - return Subsystem::performChildOperation(); + if (not isInTransition and performSafeRecovery) { + commandSelfToSafe(); + performSafeRecovery = false; + } } ReturnValue_t EiveSystem::initialize() { - EventManagerIF* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); + auto* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); if (manager == nullptr) { #if FSFW_CPP_OSTREAM_ENABLED == 1 sif::error << "AcsSubsystem::initialize: Invalid event manager" << std::endl; @@ -67,21 +75,37 @@ ReturnValue_t EiveSystem::initialize() { #endif return ObjectManagerIF::CHILD_INIT_FAILED; } + manager->subscribeToEvent(eventQueue->getId(), + event::getEventId(tcsCtrl::PCDU_SYSTEM_OVERHEATING)); + manager->subscribeToEvent(eventQueue->getId(), event::getEventId(tcsCtrl::OBC_OVERHEATING)); + return Subsystem::initialize(); } void EiveSystem::handleEventMessages() { EventMessage event; - for (ReturnValue_t result = eventQueue->receiveMessage(&event); result == returnvalue::OK; - result = eventQueue->receiveMessage(&event)) { + for (ReturnValue_t status = eventQueue->receiveMessage(&event); status == returnvalue::OK; + status = eventQueue->receiveMessage(&event)) { switch (event.getMessageId()) { case EventMessage::EVENT_MESSAGE: + switch (event.getEvent()) { + case tcsCtrl::OBC_OVERHEATING: + case tcsCtrl::PCDU_SYSTEM_OVERHEATING: { + if (isInTransition) { + performSafeRecovery = true; + return; + } + + commandSelfToSafe(); + break; + } + } break; default: - sif::debug << "AcsSubsystem::performChildOperation: Did not subscribe " - "to this event message" - << std::endl; + sif::debug << "EiveSystem: Did not subscribe to event " << event.getEvent() << std::endl; break; } } } + +void EiveSystem::commandSelfToSafe() { startTransition(satsystem::Mode::SAFE, 0); } diff --git a/mission/system/objects/EiveSystem.h b/mission/system/objects/EiveSystem.h index 0d75b31a..06110775 100644 --- a/mission/system/objects/EiveSystem.h +++ b/mission/system/objects/EiveSystem.h @@ -8,12 +8,14 @@ class EiveSystem : public Subsystem { EiveSystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables); private: + MessageQueueIF* eventQueue = nullptr; + bool performSafeRecovery = false; + ReturnValue_t initialize() override; void performChildOperation() override; void announceMode(bool recursive) override; void handleEventMessages(); - - MessageQueueIF* eventQueue = nullptr; + void commandSelfToSafe(); }; #endif /* MISSION_SYSTEM_EIVESYSTEM_H_ */ diff --git a/mission/system/objects/PayloadSubsystem.cpp b/mission/system/objects/PayloadSubsystem.cpp index 5cbd4459..f8e3b08f 100644 --- a/mission/system/objects/PayloadSubsystem.cpp +++ b/mission/system/objects/PayloadSubsystem.cpp @@ -1,6 +1,6 @@ #include "PayloadSubsystem.h" -#include "mission/payloadDefs.h" +#include PayloadSubsystem::PayloadSubsystem(object_id_t setObjectId, uint32_t maxNumberOfSequences, uint32_t maxNumberOfTables) diff --git a/mission/system/objects/PowerStateMachineBase.h b/mission/system/objects/PowerStateMachineBase.h index 12e72b60..bc917b23 100644 --- a/mission/system/objects/PowerStateMachineBase.h +++ b/mission/system/objects/PowerStateMachineBase.h @@ -5,7 +5,7 @@ #include #include -#include "definitions.h" +#include "mission/power/defs.h" class PowerStateMachineBase { public: diff --git a/mission/system/objects/Stack5VHandler.h b/mission/system/objects/Stack5VHandler.h index 364d744b..8781fc55 100644 --- a/mission/system/objects/Stack5VHandler.h +++ b/mission/system/objects/Stack5VHandler.h @@ -2,8 +2,7 @@ #define MISSION_SYSTEM_OBJECTS_STACK5VHANDLER_H_ #include - -#include "mission/devices/devicedefinitions/GomspaceDefinitions.h" +#include enum class StackCommander { RAD_SENSOR = 0, PL_PCDU = 1 }; enum class HandlerState { SWITCH_PENDING, IDLE }; @@ -32,7 +31,7 @@ class Stack5VHandler { HandlerState handlerState = HandlerState::IDLE; bool radSensorIsOn = false; bool plPcduIsOn = false; - pcdu::Switches stackSwitch = pcdu::Switches::P60_DOCK_5V_STACK; + power::Switches stackSwitch = power::Switches::P60_DOCK_5V_STACK; bool updateInternalStates(); }; diff --git a/mission/system/objects/definitions.h b/mission/system/objects/definitions.h deleted file mode 100644 index 9e0176d9..00000000 --- a/mission/system/objects/definitions.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include - -namespace power { - -enum class States { IDLE, SWITCHING_POWER, CHECKING_POWER, MODE_COMMANDING }; -enum class OpCodes { NONE, TO_OFF_DONE, TO_NOT_OFF_DONE, TIMEOUT_OCCURED }; - -} // namespace power - -namespace duallane { - -enum Submodes : Submode_t { A_SIDE = 0, B_SIDE = 1, DUAL_MODE = 2 }; - -} // namespace duallane diff --git a/mission/system/power/CMakeLists.txt b/mission/system/power/CMakeLists.txt new file mode 100644 index 00000000..8fa4967e --- /dev/null +++ b/mission/system/power/CMakeLists.txt @@ -0,0 +1 @@ +target_sources(${LIB_EIVE_MISSION} PRIVATE GomspacePowerFdir.cpp) diff --git a/mission/system/fdir/GomspacePowerFdir.cpp b/mission/system/power/GomspacePowerFdir.cpp similarity index 98% rename from mission/system/fdir/GomspacePowerFdir.cpp rename to mission/system/power/GomspacePowerFdir.cpp index 5d35ca24..98e10f58 100644 --- a/mission/system/fdir/GomspacePowerFdir.cpp +++ b/mission/system/power/GomspacePowerFdir.cpp @@ -1,5 +1,7 @@ #include "GomspacePowerFdir.h" +#include + #include "fsfw/devicehandlers/DeviceHandlerIF.h" #include "fsfw/health/HealthTableIF.h" #include "fsfw/modes/HasModesIF.h" @@ -7,7 +9,6 @@ #include "fsfw/power/Fuse.h" #include "fsfw/serviceinterface/ServiceInterfaceStream.h" #include "fsfw/thermal/ThermalComponentIF.h" -#include "mission/devices/devicedefinitions/powerDefinitions.h" GomspacePowerFdir::GomspacePowerFdir(object_id_t devId, object_id_t parentId) : DeviceHandlerFailureIsolation(devId, parentId) {} diff --git a/mission/system/fdir/GomspacePowerFdir.h b/mission/system/power/GomspacePowerFdir.h similarity index 100% rename from mission/system/fdir/GomspacePowerFdir.h rename to mission/system/power/GomspacePowerFdir.h diff --git a/mission/system/tree/CMakeLists.txt b/mission/system/tree/CMakeLists.txt index 08d44e87..a6764013 100644 --- a/mission/system/tree/CMakeLists.txt +++ b/mission/system/tree/CMakeLists.txt @@ -1,4 +1,2 @@ -target_sources( - ${LIB_EIVE_MISSION} - PRIVATE acsModeTree.cpp payloadModeTree.cpp comModeTree.cpp tcsModeTree.cpp - system.cpp util.cpp) +target_sources(${LIB_EIVE_MISSION} PRIVATE payloadModeTree.cpp tcsModeTree.cpp + system.cpp util.cpp) diff --git a/mission/system/tree/payloadModeTree.cpp b/mission/system/tree/payloadModeTree.cpp index 0f955929..ab67852d 100644 --- a/mission/system/tree/payloadModeTree.cpp +++ b/mission/system/tree/payloadModeTree.cpp @@ -4,12 +4,12 @@ #include #include #include +#include +#include #include "eive/objects.h" -#include "mission/devices/devicedefinitions/payloadPcduDefinitions.h" -#include "mission/payloadDefs.h" +#include "mission/power/defs.h" #include "mission/system/objects/PayloadSubsystem.h" -#include "mission/system/objects/definitions.h" #include "util.h" namespace { diff --git a/mission/system/tree/system.cpp b/mission/system/tree/system.cpp index b5743f57..6e3b3f72 100644 --- a/mission/system/tree/system.cpp +++ b/mission/system/tree/system.cpp @@ -2,13 +2,13 @@ #include #include -#include +#include #include +#include -#include "acsModeTree.h" -#include "comModeTree.h" #include "eive/objects.h" -#include "mission/comDefs.h" +#include "mission/com/defs.h" +#include "mission/system/acs/acsModeTree.h" #include "payloadModeTree.h" #include "tcsModeTree.h" #include "util.h" diff --git a/mission/tcs/CMakeLists.txt b/mission/tcs/CMakeLists.txt new file mode 100644 index 00000000..ea077050 --- /dev/null +++ b/mission/tcs/CMakeLists.txt @@ -0,0 +1,3 @@ +target_sources( + ${LIB_EIVE_MISSION} PRIVATE HeaterHandler.cpp max1227.cpp + Max31865EiveHandler.cpp Tmp1075Handler.cpp) diff --git a/mission/devices/HeaterHandler.cpp b/mission/tcs/HeaterHandler.cpp similarity index 96% rename from mission/devices/HeaterHandler.cpp rename to mission/tcs/HeaterHandler.cpp index 150c4778..4ec82c08 100644 --- a/mission/devices/HeaterHandler.cpp +++ b/mission/tcs/HeaterHandler.cpp @@ -1,9 +1,8 @@ -#include "HeaterHandler.h" - #include #include #include #include +#include #include @@ -39,7 +38,7 @@ HeaterHandler::HeaterHandler(object_id_t setObjectId_, GpioIF* gpioInterface_, H cmdQueueSize, MessageQueueMessage::MAX_MESSAGE_SIZE, &mqArgs); } -HeaterHandler::~HeaterHandler() {} +HeaterHandler::~HeaterHandler() = default; ReturnValue_t HeaterHandler::performOperation(uint8_t operationCode) { try { @@ -260,7 +259,7 @@ void HeaterHandler::handleSwitchOnCommand(heater::Switchers heaterIdx) { // Check state of main line switch ReturnValue_t mainSwitchState = mainLineSwitcher->getSwitchState(mainLineSwitch); if (mainSwitchState == PowerSwitchIF::SWITCH_ON) { - if (checkSwitchState(heaterIdx) == SwitchState::OFF) { + if (getSwitchState(heaterIdx) == SwitchState::OFF) { gpioId_t gpioId = heater.gpioId; result = gpioInterface->pullHigh(gpioId); if (result != returnvalue::OK) { @@ -293,12 +292,13 @@ void HeaterHandler::handleSwitchOnCommand(heater::Switchers heaterIdx) { } else if (mainSwitchState == PowerSwitchIF::SWITCH_OFF && heater.waitMainSwitchOn) { // Just waiting for the main switch being set on return; - } else if (mainSwitchState == PowerSwitchIF::SWITCH_OFF) { + } else if (mainSwitchState == PowerSwitchIF::SWITCH_OFF or + mainSwitchState == PowerSwitchIF::SWITCH_UNKNOWN) { mainLineSwitcher->sendSwitchCommand(mainLineSwitch, PowerSwitchIF::SWITCH_ON); heater.mainSwitchCountdown.setTimeout(mainLineSwitcher->getSwitchDelayMs()); heater.waitMainSwitchOn = true; } else { - sif::debug << "HeaterHandler::handleSwitchHandling: Failed to get state of" + sif::debug << "HeaterHandler::handleSwitchOnCommand: Failed to get state of" << " main line switch" << std::endl; if (heater.replyQueue != commandQueue->getId()) { actionHelper.finish(false, heater.replyQueue, heater.action, mainSwitchState); @@ -311,7 +311,7 @@ void HeaterHandler::handleSwitchOffCommand(heater::Switchers heaterIdx) { ReturnValue_t result = returnvalue::OK; auto& heater = heaterVec.at(heaterIdx); // Check whether switch is already off - if (checkSwitchState(heaterIdx)) { + if (getSwitchState(heaterIdx)) { gpioId_t gpioId = heater.gpioId; result = gpioInterface->pullLow(gpioId); if (result != returnvalue::OK) { @@ -345,7 +345,7 @@ void HeaterHandler::handleSwitchOffCommand(heater::Switchers heaterIdx) { heater.cmdActive = false; } -HeaterHandler::SwitchState HeaterHandler::checkSwitchState(heater::Switchers switchNr) const { +HeaterHandler::SwitchState HeaterHandler::getSwitchState(heater::Switchers switchNr) const { MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX); return heaterVec.at(switchNr).switchState; } @@ -429,7 +429,7 @@ ReturnValue_t HeaterHandler::getSwitchState(uint8_t switchNr) const { if (switchNr > 7) { return returnvalue::FAILED; } - if (checkSwitchState(static_cast(switchNr)) == SwitchState::ON) { + if (getSwitchState(static_cast(switchNr)) == SwitchState::ON) { return PowerSwitchIF::SWITCH_ON; } return PowerSwitchIF::SWITCH_OFF; diff --git a/mission/devices/HeaterHandler.h b/mission/tcs/HeaterHandler.h similarity index 97% rename from mission/devices/HeaterHandler.h rename to mission/tcs/HeaterHandler.h index 42f42abf..6787b660 100644 --- a/mission/devices/HeaterHandler.h +++ b/mission/tcs/HeaterHandler.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_HEATERHANDLER_H_ -#define MISSION_DEVICES_HEATERHANDLER_H_ +#ifndef MISSION_TCS_HEATERHANDLER_H_ +#define MISSION_TCS_HEATERHANDLER_H_ #include #include @@ -174,7 +174,7 @@ class HeaterHandler : public ExecutableObjectIF, * @brief Returns the state of a switch (ON - true, or OFF - false). * @param switchNr The number of the switch to check. */ - SwitchState checkSwitchState(heater::Switchers switchNr) const; + SwitchState getSwitchState(heater::Switchers switchNr) const; /** * @brief This function runs commands waiting for execution. @@ -209,4 +209,4 @@ class HeaterHandler : public ExecutableObjectIF, bool allSwitchesOff(); }; -#endif /* MISSION_DEVICES_HEATERHANDLER_H_ */ +#endif /* MISSION_TCS_HEATERHANDLER_H_ */ diff --git a/mission/devices/devicedefinitions/Max31865Definitions.h b/mission/tcs/Max31865Definitions.h similarity index 100% rename from mission/devices/devicedefinitions/Max31865Definitions.h rename to mission/tcs/Max31865Definitions.h diff --git a/mission/devices/Max31865EiveHandler.cpp b/mission/tcs/Max31865EiveHandler.cpp similarity index 99% rename from mission/devices/Max31865EiveHandler.cpp rename to mission/tcs/Max31865EiveHandler.cpp index 3fcd0f32..284a2d0c 100644 --- a/mission/devices/Max31865EiveHandler.cpp +++ b/mission/tcs/Max31865EiveHandler.cpp @@ -1,6 +1,5 @@ -#include "Max31865EiveHandler.h" - #include +#include Max31865EiveHandler::Max31865EiveHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie) diff --git a/mission/devices/Max31865EiveHandler.h b/mission/tcs/Max31865EiveHandler.h similarity index 90% rename from mission/devices/Max31865EiveHandler.h rename to mission/tcs/Max31865EiveHandler.h index 6a030718..aa159ba9 100644 --- a/mission/devices/Max31865EiveHandler.h +++ b/mission/tcs/Max31865EiveHandler.h @@ -1,10 +1,9 @@ -#ifndef MISSION_DEVICES_MAX31865EIVEHANDLER_H_ -#define MISSION_DEVICES_MAX31865EIVEHANDLER_H_ +#ifndef MISSION_TCS_MAX31865EIVEHANDLER_H_ +#define MISSION_TCS_MAX31865EIVEHANDLER_H_ #include #include - -#include "devicedefinitions/Max31865Definitions.h" +#include class Max31865EiveHandler : public DeviceHandlerBase { public: @@ -44,4 +43,4 @@ class Max31865EiveHandler : public DeviceHandlerBase { bool transitionOk = false; }; -#endif /* MISSION_DEVICES_MAX31865EIVEHANDLER_H_ */ +#endif /* MISSION_TCS_MAX31865EIVEHANDLER_H_ */ diff --git a/mission/devices/Max31865PT1000Handler.cpp b/mission/tcs/Max31865PT1000Handler.cpp similarity index 99% rename from mission/devices/Max31865PT1000Handler.cpp rename to mission/tcs/Max31865PT1000Handler.cpp index 75588cbd..7dcb493a 100644 --- a/mission/devices/Max31865PT1000Handler.cpp +++ b/mission/tcs/Max31865PT1000Handler.cpp @@ -1,4 +1,4 @@ -#include "Max31865PT1000Handler.h" +#include #include #include diff --git a/mission/devices/Max31865PT1000Handler.h b/mission/tcs/Max31865PT1000Handler.h similarity index 95% rename from mission/devices/Max31865PT1000Handler.h rename to mission/tcs/Max31865PT1000Handler.h index 5841c7b1..3c7eac29 100644 --- a/mission/devices/Max31865PT1000Handler.h +++ b/mission/tcs/Max31865PT1000Handler.h @@ -1,15 +1,14 @@ -#ifndef MISSION_DEVICES_MAX31865PT1000HANDLER_H_ -#define MISSION_DEVICES_MAX31865PT1000HANDLER_H_ +#ifndef MISSION_TCS_MAX31865PT1000HANDLER_H_ +#define MISSION_TCS_MAX31865PT1000HANDLER_H_ #include #include #include +#include #include #include -#include "devicedefinitions/Max31865Definitions.h" - /** * @brief Device Handler for the thermal sensors * @details @@ -122,4 +121,4 @@ class Max31865PT1000Handler : public DeviceHandlerBase { #endif }; -#endif /* MISSION_DEVICES_MAX31865PT1000HANDLER_H_ */ +#endif /* MISSION_TCS_MAX31865PT1000HANDLER_H_ */ diff --git a/mission/devices/devicedefinitions/Tmp1075Definitions.h b/mission/tcs/Tmp1075Definitions.h similarity index 82% rename from mission/devices/devicedefinitions/Tmp1075Definitions.h rename to mission/tcs/Tmp1075Definitions.h index 6799fd42..946ac82e 100644 --- a/mission/devices/devicedefinitions/Tmp1075Definitions.h +++ b/mission/tcs/Tmp1075Definitions.h @@ -1,5 +1,11 @@ -#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_TMP1075DEFINITIONS_H_ -#define MISSION_DEVICES_DEVICEDEFINITIONS_TMP1075DEFINITIONS_H_ +#ifndef MISSION_TCS_TMP1075DEFINITIONS_H_ +#define MISSION_TCS_TMP1075DEFINITIONS_H_ + +#include + +#include + +#include "fsfw/devicehandlers/DeviceHandlerIF.h" namespace TMP1075 { static const uint8_t TEMP_REG_ADDR = 0x0; @@ -33,4 +39,4 @@ class Tmp1075Dataset : public StaticLocalDataSet { }; } // namespace TMP1075 -#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_TMP1075DEFINITIONS_H_ */ +#endif /* MISSION_TCS_TMP1075DEFINITIONS_H_ */ diff --git a/mission/devices/Tmp1075Handler.cpp b/mission/tcs/Tmp1075Handler.cpp similarity index 93% rename from mission/devices/Tmp1075Handler.cpp rename to mission/tcs/Tmp1075Handler.cpp index def317e8..df57aa8a 100644 --- a/mission/devices/Tmp1075Handler.cpp +++ b/mission/tcs/Tmp1075Handler.cpp @@ -1,6 +1,6 @@ #include -#include -#include +#include +#include Tmp1075Handler::Tmp1075Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie) : DeviceHandlerBase(objectId, comIF, comCookie), dataset(this) { @@ -132,3 +132,11 @@ ReturnValue_t Tmp1075Handler::initializeLocalDataPool(localpool::DataPool &local } void Tmp1075Handler::setModeNormal() { setMode(_MODE_TO_NORMAL); } + +ReturnValue_t Tmp1075Handler::setHealth(HealthState health) { + if (health != FAULTY and health != PERMANENT_FAULTY and health != HEALTHY and + health != EXTERNAL_CONTROL) { + return returnvalue::FAILED; + } + return returnvalue::OK; +} diff --git a/mission/devices/Tmp1075Handler.h b/mission/tcs/Tmp1075Handler.h similarity index 91% rename from mission/devices/Tmp1075Handler.h rename to mission/tcs/Tmp1075Handler.h index 6840db0f..02fd6823 100644 --- a/mission/devices/Tmp1075Handler.h +++ b/mission/tcs/Tmp1075Handler.h @@ -1,8 +1,8 @@ -#ifndef MISSION_DEVICES_TMP1075HANDLER_H_ -#define MISSION_DEVICES_TMP1075HANDLER_H_ +#ifndef MISSION_TCS_TMP1075HANDLER_H_ +#define MISSION_TCS_TMP1075HANDLER_H_ #include -#include +#include /** * @brief This is the device handler class for the tmp1075 temperature sensor. @@ -37,6 +37,7 @@ class Tmp1075Handler : public DeviceHandlerBase { uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; + ReturnValue_t setHealth(HealthState health) override; private: /** @@ -59,4 +60,4 @@ class Tmp1075Handler : public DeviceHandlerBase { CommunicationStep communicationStep = CommunicationStep::START_ADC_CONVERSION; }; -#endif /* MISSION_DEVICES_TMP1075HANDLER_H_ */ +#endif /* MISSION_TCS_TMP1075HANDLER_H_ */ diff --git a/mission/devices/max1227.cpp b/mission/tcs/max1227.cpp similarity index 96% rename from mission/devices/max1227.cpp rename to mission/tcs/max1227.cpp index dc04e785..8b49bb53 100644 --- a/mission/devices/max1227.cpp +++ b/mission/tcs/max1227.cpp @@ -1,4 +1,4 @@ -#include "max1227.h" +#include #include diff --git a/mission/devices/max1227.h b/mission/tcs/max1227.h similarity index 95% rename from mission/devices/max1227.h rename to mission/tcs/max1227.h index a9c1e53b..5a0e7683 100644 --- a/mission/devices/max1227.h +++ b/mission/tcs/max1227.h @@ -1,5 +1,5 @@ -#ifndef MISSION_DEVICES_MAX1227_H_ -#define MISSION_DEVICES_MAX1227_H_ +#ifndef MISSION_TCS_MAX1227_H_ +#define MISSION_TCS_MAX1227_H_ #include #include @@ -81,4 +81,4 @@ float getTemperature(uint16_t raw); } // namespace max1227 -#endif /* MISSION_DEVICES_MAX1227_H_ */ +#endif /* MISSION_TCS_MAX1227_H_ */ diff --git a/mission/tmtc/CMakeLists.txt b/mission/tmtc/CMakeLists.txt index b155e02e..a8388d83 100644 --- a/mission/tmtc/CMakeLists.txt +++ b/mission/tmtc/CMakeLists.txt @@ -1,18 +1,11 @@ target_sources( ${LIB_EIVE_MISSION} - PRIVATE CcsdsIpCoreHandler.cpp - VirtualChannelWithQueue.cpp - PersistentTmStoreWithTmQueue.cpp - LiveTmTask.cpp - VirtualChannel.cpp + PRIVATE PersistentTmStoreWithTmQueue.cpp TmFunnelHandler.cpp TmFunnelBase.cpp CfdpTmFunnel.cpp tmFilters.cpp PusLiveDemux.cpp - PersistentSingleTmStoreTask.cpp - PersistentLogTmStoreTask.cpp - TmStoreTaskBase.cpp PusPacketFilter.cpp PusTmRouteByFilterHelper.cpp Service15TmStorage.cpp diff --git a/mission/tmtc/LiveTmTask.cpp b/mission/tmtc/LiveTmTask.cpp deleted file mode 100644 index 7e6d3de6..00000000 --- a/mission/tmtc/LiveTmTask.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "LiveTmTask.h" - -#include -#include - -LiveTmTask::LiveTmTask(object_id_t objectId, PusTmFunnel& pusFunnel, CfdpTmFunnel& cfdpFunnel, - VirtualChannelWithQueue& channel) - : SystemObject(objectId), pusFunnel(pusFunnel), cfdpFunnel(cfdpFunnel), channel(channel) {} - -ReturnValue_t LiveTmTask::performOperation(uint8_t opCode) { - while (true) { - // The funnel tasks are scheduled here directly as well. - ReturnValue_t result = channel.sendNextTm(); - if (result == DirectTmSinkIF::IS_BUSY) { - sif::error << "Lost live TM, PAPB busy" << std::endl; - } - if (result == MessageQueueIF::EMPTY) { - if (tmFunnelCd.hasTimedOut()) { - pusFunnel.performOperation(0); - cfdpFunnel.performOperation(0); - tmFunnelCd.resetTimer(); - } - // 40 ms IDLE delay. Might tweak this in the future. - TaskFactory::delayTask(40); - } - } -} diff --git a/mission/tmtc/LiveTmTask.h b/mission/tmtc/LiveTmTask.h deleted file mode 100644 index a0ca6b83..00000000 --- a/mission/tmtc/LiveTmTask.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MISSION_TMTC_LIVETMTASK_H_ -#define MISSION_TMTC_LIVETMTASK_H_ - -#include -#include -#include -#include -#include -#include - -class LiveTmTask : public SystemObject, public ExecutableObjectIF { - public: - LiveTmTask(object_id_t objectId, PusTmFunnel& pusFunnel, CfdpTmFunnel& cfdpFunnel, - VirtualChannelWithQueue& channel); - - ReturnValue_t performOperation(uint8_t opCode) override; - - private: - Countdown tmFunnelCd = Countdown(100); - PusTmFunnel& pusFunnel; - CfdpTmFunnel& cfdpFunnel; - VirtualChannelWithQueue& channel; -}; - -#endif /* MISSION_TMTC_LIVETMTASK_H_ */ diff --git a/mission/tmtc/PersistentLogTmStoreTask.cpp b/mission/tmtc/PersistentLogTmStoreTask.cpp deleted file mode 100644 index ccabb16d..00000000 --- a/mission/tmtc/PersistentLogTmStoreTask.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "PersistentLogTmStoreTask.h" - -#include -#include - -PersistentLogTmStoreTask::PersistentLogTmStoreTask(object_id_t objectId, StorageManagerIF& ipcStore, - LogStores stores, VirtualChannel& channel, - SdCardMountedIF& sdcMan) - : TmStoreTaskBase(objectId, ipcStore, channel, sdcMan), - stores(stores), - okStoreContext(persTmStore::DUMP_OK_STORE_DONE), - notOkStoreContext(persTmStore::DUMP_NOK_STORE_DONE), - miscStoreContext(persTmStore::DUMP_MISC_STORE_DONE) {} - -ReturnValue_t PersistentLogTmStoreTask::performOperation(uint8_t opCode) { - bool someonesBusy = false; - auto stateHandlingForStore = [&](bool storeIsBusy) { - if (storeIsBusy) { - someonesBusy = true; - } - if (fileHasSwapped) { - someFileWasSwapped = fileHasSwapped; - } - }; - while (true) { - if (not cyclicStoreCheck()) { - continue; - } - someonesBusy = false; - someFileWasSwapped = false; - stateHandlingForStore(handleOneStore(stores.okStore, okStoreContext)); - stateHandlingForStore(handleOneStore(stores.notOkStore, notOkStoreContext)); - stateHandlingForStore(handleOneStore(stores.miscStore, miscStoreContext)); - if (not someonesBusy) { - TaskFactory::delayTask(100); - } else /* and graceDelayDuringDumping.hasTimedOut()*/ { - if (someFileWasSwapped) { - TaskFactory::delayTask(20); - } - // TaskFactory::delayTask(2); - // graceDelayDuringDumping.resetTimer(); - } - } -} - -bool PersistentLogTmStoreTask::initStoresIfPossible() { - if (sdcMan.isSdCardUsable(std::nullopt)) { - stores.okStore.initializeTmStore(); - stores.miscStore.initializeTmStore(); - stores.notOkStore.initializeTmStore(); - return true; - } - return false; -} diff --git a/mission/tmtc/PersistentSingleTmStoreTask.cpp b/mission/tmtc/PersistentSingleTmStoreTask.cpp deleted file mode 100644 index a814694e..00000000 --- a/mission/tmtc/PersistentSingleTmStoreTask.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include -#include -#include - -PersistentSingleTmStoreTask::PersistentSingleTmStoreTask( - object_id_t objectId, StorageManagerIF& ipcStore, PersistentTmStoreWithTmQueue& tmStore, - VirtualChannel& channel, Event eventIfDumpDone, SdCardMountedIF& sdcMan) - : TmStoreTaskBase(objectId, ipcStore, channel, sdcMan), - storeWithQueue(tmStore), - dumpContext(eventIfDumpDone) {} - -ReturnValue_t PersistentSingleTmStoreTask::performOperation(uint8_t opCode) { - while (true) { - // Delay done by the check - if (not cyclicStoreCheck()) { - continue; - } - bool busy = handleOneStore(storeWithQueue, dumpContext); - if (not busy) { - TaskFactory::delayTask(100); - } else { - if (fileHasSwapped) { - TaskFactory::delayTask(20); - } - // if (fileHasSwapped and graceDelayDuringDumping.hasTimedOut()) { - // TaskFactory::delayTask(2); - // graceDelayDuringDumping.resetTimer(); - // } - } - } -} - -bool PersistentSingleTmStoreTask::initStoresIfPossible() { - if (sdcMan.isSdCardUsable(std::nullopt)) { - storeWithQueue.initializeTmStore(); - return true; - } - return false; -} diff --git a/mission/tmtc/PersistentTmStore.cpp b/mission/tmtc/PersistentTmStore.cpp index 6cbcac86..bace6025 100644 --- a/mission/tmtc/PersistentTmStore.cpp +++ b/mission/tmtc/PersistentTmStore.cpp @@ -9,6 +9,7 @@ #include #include +#include "eive/definitions.h" #include "fsfw/ipc/CommandMessage.h" #include "fsfw/ipc/QueueFactory.h" #include "fsfw/tmstorage/TmStoreMessage.h" @@ -171,7 +172,7 @@ void PersistentTmStore::deleteUpTo(uint32_t unixSeconds) { // Convert file time to the UNIX epoch struct tm fileTime {}; if (pathToTime(file.path(), fileTime) != returnvalue::OK) { - sif::error << "Time extraction for " << file << "failed" << std::endl; + sif::error << "Time extraction for " << file << " failed" << std::endl; continue; } time_t fileEpoch = timegm(&fileTime); @@ -212,7 +213,7 @@ ReturnValue_t PersistentTmStore::loadNextDumpFile() { sif::error << "PersistentTmStore: Could not retrieve file size: " << e.message() << std::endl; continue; } - sif::debug << "Path: " << dumpParams.dirEntry.path() << std::endl; + // sif::debug << "Path: " << dumpParams.dirEntry.path() << std::endl; // File empty or can't even read CCSDS header. if (dumpParams.fileSize <= 6) { @@ -251,41 +252,37 @@ ReturnValue_t PersistentTmStore::loadNextDumpFile() { return DUMP_DONE; } -ReturnValue_t PersistentTmStore::dumpNextPacket(DirectTmSinkIF& tmSink, size_t& dumpedLen, - bool& fileHasSwapped) { - if (state == State::IDLE) { +ReturnValue_t PersistentTmStore::getNextDumpPacket(PusTmReader& reader, bool& fileHasSwapped) { + if (state == State::IDLE or dumpParams.pendingPacketDump) { return returnvalue::FAILED; } - PusTmReader reader(&timeReader, fileBuf.data() + dumpParams.currentSize, - fileBuf.size() - dumpParams.currentSize); + reader.setReadOnlyData(fileBuf.data() + dumpParams.currentSize, + fileBuf.size() - dumpParams.currentSize); // CRC check to fully ensure this is a valid TM ReturnValue_t result = reader.parseDataWithCrcCheck(); - if (result == returnvalue::OK) { - result = tmSink.write(fileBuf.data() + dumpParams.currentSize, reader.getFullPacketLen()); - if (result == DirectTmSinkIF::IS_BUSY) { - return result; - } else if (result != returnvalue::OK) { - // TODO: Event? - sif::error << "PersistentTmStore: Writing to TM sink failed" << std::endl; - return result; - } - dumpParams.currentSize += reader.getFullPacketLen(); - dumpedLen = reader.getFullPacketLen(); - if (dumpParams.currentSize >= dumpParams.fileSize) { - fileHasSwapped = true; - return loadNextDumpFile(); - } - } else { + if (result != returnvalue::OK) { sif::error << "PersistentTmStore: Parsing of PUS TM failed with code " << result << std::endl; triggerEvent(persTmStore::POSSIBLE_FILE_CORRUPTION, result, dumpParams.currentFileUnixStamp); // Delete the file and load next. Could use better algorithm to partially // restore the file dump, but for now do not trust the file. - dumpedLen = 0; std::error_code e; std::filesystem::remove(dumpParams.dirEntry.path().c_str(), e); fileHasSwapped = true; return loadNextDumpFile(); } + fileHasSwapped = false; + dumpParams.pendingPacketDump = true; + return returnvalue::OK; +} + +ReturnValue_t PersistentTmStore::confirmDump(const PusTmReader& reader, bool& fileHasSwapped) { + dumpParams.pendingPacketDump = false; + dumpParams.currentSize += reader.getFullPacketLen(); + if (dumpParams.currentSize >= dumpParams.fileSize) { + fileHasSwapped = true; + return loadNextDumpFile(); + } + fileHasSwapped = false; return returnvalue::OK; } @@ -293,7 +290,7 @@ ReturnValue_t PersistentTmStore::pathToTime(const std::filesystem::path& path, s auto pathStr = path.string(); size_t splitChar = pathStr.find('_'); auto timeOnlyStr = pathStr.substr(splitChar + 1); - if (nullptr == strptime(timeOnlyStr.c_str(), FILE_DATE_FORMAT, &time)) { + if (nullptr == strptime(timeOnlyStr.c_str(), config::FILE_DATE_FORMAT, &time)) { return returnvalue::FAILED; } return returnvalue::OK; @@ -310,7 +307,7 @@ ReturnValue_t PersistentTmStore::createMostRecentFile(std::optional suf time_t epoch = currentTv.tv_sec; struct tm* time = gmtime(&epoch); size_t writtenBytes = strftime(reinterpret_cast(fileBuf.data() + currentIdx), - fileBuf.size(), FILE_DATE_FORMAT, time); + fileBuf.size(), config::FILE_DATE_FORMAT, time); if (writtenBytes == 0) { sif::error << "PersistentTmStore::createMostRecentFile: Could not create file timestamp" << std::endl; diff --git a/mission/tmtc/PersistentTmStore.h b/mission/tmtc/PersistentTmStore.h index a0910026..17d2c9e7 100644 --- a/mission/tmtc/PersistentTmStore.h +++ b/mission/tmtc/PersistentTmStore.h @@ -4,12 +4,10 @@ #include #include #include -#include #include #include #include #include -#include #include @@ -57,13 +55,25 @@ class PersistentTmStore : public TmStoreFrontendSimpleIF, public SystemObject { ReturnValue_t startDumpFromUpTo(uint32_t fromUnixSeconds, uint32_t upToUnixSeconds); /** * - * @param tmSink - * @param dumpedLen - * @param fileHasSwapped - * @return DUMP_DONE if dump is finished, returnvalue::OK if dump of next packet was a success, - * and DirectTmSinkIF::IS_BUSY is TM sink is busy. + * @param tmReader: Next packet will be loaded into the PUS TM reader. A CRC check will be + * performed on the packet. If that check fails, the file is considered corrupted and will + * be deleted for now. + * @param fileHasSwapped: If the CRC check fails, the file will be deleted and a new one has to + * be loaded. The dump can reach completion during that process. If a file is swapped, this + * boolean is set to true + * @return DUMP_DONE if dump is finished, returnvalue::OK if the next packet was loaded into the + * TM reader, and the returnvalue of the file swap operation if the CRC check failed and + * a new file was loaded. */ - ReturnValue_t dumpNextPacket(DirectTmSinkIF& tmSink, size_t& dumpedLen, bool& fileHasSwapped); + ReturnValue_t getNextDumpPacket(PusTmReader& tmReader, bool& fileHasSwapped); + /** + * Confirm the dump to advance the dump state machine. + * @param tmReader + * @param fileHasSwapped: If the confirmed dumps completes the current file, a new file will + * be loaded and this parameter will be set to true. + * @return If a file is swapped, the retrunvalue of the file swap operation. + */ + ReturnValue_t confirmDump(const PusTmReader& tmReader, bool& fileHasSwapped); void getStartAndEndTimeCurrentOrLastDump(uint32_t& startTime, uint32_t& endTime) const; ReturnValue_t storePacket(PusTmReader& reader); @@ -75,16 +85,12 @@ class PersistentTmStore : public TmStoreFrontendSimpleIF, public SystemObject { private: static constexpr uint8_t MAX_FILES_IN_ONE_SECOND = 10; static constexpr size_t MAX_FILESIZE = 8192; - // ISO8601 timestamp. - static constexpr char FILE_DATE_FORMAT[] = "%FT%H%M%SZ"; //! [EXPORT] : [SKIP] static constexpr ReturnValue_t INVALID_FILE_DETECTED_AND_DELETED = returnvalue::makeCode(2, 1); MessageQueueIF* tcQueue; State state = State::IDLE; - // PacketFilter filter; - CdsShortTimeStamper timeReader; bool baseDirUninitialized = true; const char* baseDir; std::string baseName; @@ -96,6 +102,7 @@ class PersistentTmStore : public TmStoreFrontendSimpleIF, public SystemObject { timeval activeFileTv{}; struct ActiveDumpParams { + bool pendingPacketDump = false; uint32_t fromUnixTime = 0; uint32_t untilUnixTime = 0; uint32_t currentFileUnixStamp = 0; diff --git a/mission/tmtc/TmStoreTaskBase.cpp b/mission/tmtc/TmStoreTaskBase.cpp deleted file mode 100644 index eefe9dc6..00000000 --- a/mission/tmtc/TmStoreTaskBase.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "TmStoreTaskBase.h" - -#include -#include -#include -#include - -#include "mission/persistentTmStoreDefs.h" - -TmStoreTaskBase::TmStoreTaskBase(object_id_t objectId, StorageManagerIF& ipcStore, - VirtualChannel& channel, SdCardMountedIF& sdcMan) - : SystemObject(objectId), ipcStore(ipcStore), channel(channel), sdcMan(sdcMan) {} - -bool TmStoreTaskBase::handleOneStore(PersistentTmStoreWithTmQueue& store, - DumpContext& dumpContext) { - ReturnValue_t result; - bool tmToStoreReceived = false; - bool tcRequestReceived = false; - bool dumpsPerformed = false; - // Store TM persistently - result = store.handleNextTm(); - if (result == returnvalue::OK) { - tmToStoreReceived = true; - } - // Dump TMs when applicable - if (store.getState() == PersistentTmStore::State::DUMPING) { - size_t dumpedLen = 0; - if (not channel.isBusy()) { - tmSinkBusyCd.resetTimer(); - result = store.dumpNextPacket(channel, dumpedLen, fileHasSwapped); - if (result == DirectTmSinkIF::IS_BUSY) { - sif::warning << "Unexpected PAPB busy" << std::endl; - } - if ((result == PersistentTmStore::DUMP_DONE or result == returnvalue::OK) and dumpedLen > 0) { - dumpContext.dumpedBytes += dumpedLen; - dumpContext.numberOfDumpedPackets += 1; - } - if (result == PersistentTmStore::DUMP_DONE) { - uint32_t startTime; - uint32_t endTime; - store.getStartAndEndTimeCurrentOrLastDump(startTime, endTime); - triggerEvent(dumpContext.eventIfDone, dumpContext.numberOfDumpedPackets, - dumpContext.dumpedBytes); - dumpsPerformed = true; - } else if (result == returnvalue::OK) { - dumpsPerformed = true; - } - } else { - dumpContext.ptmeBusyCounter++; - if (dumpContext.ptmeBusyCounter == 50) { - sif::warning << "PTME busy for longer period. Dumped length so far: " - << dumpContext.dumpedBytes << std::endl; - dumpContext.ptmeBusyCounter = 0; - } - } - if (cancelDumpCd.hasTimedOut() or tmSinkBusyCd.hasTimedOut()) { - triggerEvent(persTmStore::DUMP_WAS_CANCELLED, store.getObjectId()); - store.cancelDump(); - } - } else { - Command_t execCmd; - // Handle TC requests, for example deletion or retrieval requests. - result = store.handleCommandQueue(ipcStore, execCmd); - if (result == returnvalue::OK) { - if (execCmd == TmStoreMessage::DOWNLINK_STORE_CONTENT_TIME) { - cancelDumpCd.resetTimer(); - tmSinkBusyCd.resetTimer(); - dumpContext.reset(); - } - tcRequestReceived = true; - } - } - if (tcRequestReceived or tmToStoreReceived or dumpsPerformed) { - return true; - } - return false; -} - -bool TmStoreTaskBase::cyclicStoreCheck() { - if (not storesInitialized) { - storesInitialized = initStoresIfPossible(); - if (not storesInitialized) { - TaskFactory::delayTask(400); - return false; - } - } else if (sdCardCheckCd.hasTimedOut()) { - if (not sdcMan.isSdCardUsable(std::nullopt)) { - // Might be due to imminent shutdown or SD card switch. - storesInitialized = false; - TaskFactory::delayTask(100); - return false; - } - sdCardCheckCd.resetTimer(); - } - return true; -} diff --git a/mission/tmtc/TmStoreTaskBase.h b/mission/tmtc/TmStoreTaskBase.h deleted file mode 100644 index aa0efbb4..00000000 --- a/mission/tmtc/TmStoreTaskBase.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef MISSION_TMTC_TMSTORETASKBASE_H_ -#define MISSION_TMTC_TMSTORETASKBASE_H_ - -#include -#include -#include - -class TmStoreTaskBase : public SystemObject { - public: - struct DumpContext { - DumpContext(Event eventIfDone) : eventIfDone(eventIfDone) {} - void reset() { - numberOfDumpedPackets = 0; - dumpedBytes = 0; - } - const Event eventIfDone; - uint32_t numberOfDumpedPackets = 0; - uint32_t dumpedBytes = 0; - uint32_t ptmeBusyCounter = 0; - }; - - TmStoreTaskBase(object_id_t objectId, StorageManagerIF& ipcStore, VirtualChannel& channel, - SdCardMountedIF& sdcMan); - - protected: - /** - * Handling for one store. Returns if anything was done. - * @param store - * @return - */ - bool handleOneStore(PersistentTmStoreWithTmQueue& store, DumpContext& dumpContext); - - /** - * Occasionally check whether SD card is okay to be used. If not, poll whether it is ready to - * be used again and re-initialize stores. Returns whether store is okay to be used. - */ - bool cyclicStoreCheck(); - - virtual bool initStoresIfPossible() = 0; - - StorageManagerIF& ipcStore; - Countdown sdCardCheckCd = Countdown(800); - // 20 minutes are allowed as maximum dump time. - Countdown cancelDumpCd = Countdown(60 * 20 * 1000); - // If the TM sink is busy for 1 minute for whatever reason, cancel the dump. - Countdown tmSinkBusyCd = Countdown(60 * 1000); - VirtualChannel& channel; - bool storesInitialized = false; - bool fileHasSwapped = false; - SdCardMountedIF& sdcMan; -}; - -#endif /* MISSION_TMTC_TMSTORETASKBASE_H_ */ diff --git a/mission/utility/CMakeLists.txt b/mission/utility/CMakeLists.txt index dadce33f..0641f4a0 100644 --- a/mission/utility/CMakeLists.txt +++ b/mission/utility/CMakeLists.txt @@ -1,3 +1,4 @@ target_sources( - ${LIB_EIVE_MISSION} PRIVATE Timestamp.cpp ProgressPrinter.cpp Filenaming.cpp - GlobalConfigHandler.cpp DummySdCardManager.cpp) + ${LIB_EIVE_MISSION} + PRIVATE Timestamp.cpp ProgressPrinter.cpp Filenaming.cpp + GlobalConfigHandler.cpp DummySdCardManager.cpp trace.cpp) diff --git a/mission/trace.cpp b/mission/utility/trace.cpp similarity index 85% rename from mission/trace.cpp rename to mission/utility/trace.cpp index 6c9af0af..6641d087 100644 --- a/mission/trace.cpp +++ b/mission/utility/trace.cpp @@ -1,4 +1,4 @@ -#include "trace.h" +#include #include "fsfw/serviceinterface.h" diff --git a/mission/trace.h b/mission/utility/trace.h similarity index 58% rename from mission/trace.h rename to mission/utility/trace.h index fbc99d37..52eb887a 100644 --- a/mission/trace.h +++ b/mission/utility/trace.h @@ -1,5 +1,5 @@ -#ifndef MISSION_TRACE_H_ -#define MISSION_TRACE_H_ +#ifndef MISSION_UTILITY_TRACE_H_ +#define MISSION_UTILITY_TRACE_H_ #include @@ -11,4 +11,4 @@ void threadTrace(uint32_t& counter, const char* name, unsigned div = 5); } -#endif /* MISSION_TRACE_H_ */ +#endif /* MISSION_UTILITY_TRACE_H_ */ diff --git a/release_checklist.md b/release_checklist.md index 2e0247c7..4c8be066 100644 --- a/release_checklist.md +++ b/release_checklist.md @@ -4,8 +4,8 @@ OBSW Release Checklist # Pre-Release 1. Update version in `CMakeLists.txt` -2. Re-run the auto-formatters with the `scripts/auto-formatter.sh` script -3. Re-run the generators with `generators/gen.py all` +2. Re-run the generators with `generators/gen.py all` +3. Re-run the auto-formatters with the `scripts/auto-formatter.sh` script 4. Verify that the Q7S, Q7S EM and Host build are working 5. Wait for CI/CD results diff --git a/scripts/auto-formatter.sh b/scripts/auto-formatter.sh index 1bea10a4..7cefa8fd 100755 --- a/scripts/auto-formatter.sh +++ b/scripts/auto-formatter.sh @@ -30,14 +30,15 @@ else fi cpp_format="clang-format" -file_selectors="-iname *.h -o -iname *.cpp -o -iname *.c -o -iname *.tpp" +file_selectors="( -iname *.h -o -iname *.cpp -o -iname *.c -o -iname *.tpp )" +file_excludes="( -not -iname translateObjects.cpp -not -iname translateEvents.cpp )" if command -v ${cpp_format} &> /dev/null; then for dir in ${folder_list[@]}; do echo "Auto-formatting C/C++ files in ${dir} recursively" - find ${dir} ${file_selectors} | xargs ${cpp_format} --style=file -i + find ${dir} ${file_excludes} -and ${file_selectors} | xargs ${cpp_format} --style=file -i done find ./unittest ${file_selectors} -o -type d -name build -prune | \ - xargs clang-format --style=file -i + xargs ${cpp_format} --style=file -i else echo "No ${cpp_format} tool found, not formatting C++/C files" fi diff --git a/thirdparty/CMakeLists.txt b/thirdparty/CMakeLists.txt index 7455bdae..e300cd11 100644 --- a/thirdparty/CMakeLists.txt +++ b/thirdparty/CMakeLists.txt @@ -2,4 +2,9 @@ if(EIVE_ADD_LINUX_FILES) add_subdirectory(tas) endif() +# Dependency on proprietary library +if(TGT_BSP MATCHES "arm/q7s") + add_subdirectory(arcsec_star_tracker) +endif() + add_subdirectory(rapidcsv) diff --git a/thirdparty/arcsec_star_tracker b/thirdparty/arcsec_star_tracker index cbb3b24d..2823952e 160000 --- a/thirdparty/arcsec_star_tracker +++ b/thirdparty/arcsec_star_tracker @@ -1 +1 @@ -Subproject commit cbb3b24dc1993b727735fd63576088401ba351ec +Subproject commit 2823952e0902726e6e35dd7c159761f76bf7e505 diff --git a/tmtc b/tmtc index 5e0d33c9..50668ca7 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 5e0d33c9a843c3cd2da10304050665ef25a08f2a +Subproject commit 50668ca7a74edd4219456e393cd10f7858591130 diff --git a/unittest/controller/testThermalController.cpp b/unittest/controller/testThermalController.cpp index 0772018e..623c6d52 100644 --- a/unittest/controller/testThermalController.cpp +++ b/unittest/controller/testThermalController.cpp @@ -4,12 +4,13 @@ #include #include #include +#include #include #include "../testEnvironment.h" #include "dummies/TemperatureSensorInserter.h" -#include "mission/core/GenericFactory.h" +#include "mission/genericFactory.h" #include "test/gpio/DummyGpioIF.h" TEST_CASE("Thermal Controller", "[ThermalController]") { @@ -19,7 +20,8 @@ TEST_CASE("Thermal Controller", "[ThermalController]") { TemperatureSensorInserter::Tmp1075DummyMap map1; new TemperatureSensorInserter(objects::THERMAL_TEMP_INSERTER, map0, map1); auto dummyGpioIF = new DummyGpioIF(); - auto dummySwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0); + auto* dummySwitcher = new DummyPowerSwitcher(objects::PCDU_HANDLER, 18, 0); + new CamSwitcher(objects::CAM_SWITCHER, *dummySwitcher, power::Switches::PDU2_CH8_PAYLOAD_CAMERA); // TODO: Create dummy heater handler HeaterHandler* heaterHandler = nullptr; // new ThermalController(objects::THERMAL_CONTROLLER); diff --git a/unittest/hdlcEncodingRw.cpp b/unittest/hdlcEncodingRw.cpp index 88587414..10c71bc0 100644 --- a/unittest/hdlcEncodingRw.cpp +++ b/unittest/hdlcEncodingRw.cpp @@ -2,7 +2,7 @@ #include -#include "mission/devices/devicedefinitions/rwHelpers.h" +#include "mission/acs/rwHelpers.h" TEST_CASE("HDLC Encoding RW", "[acs]") { std::array encodedBuffer{};