diff --git a/CHANGELOG.md b/CHANGELOG.md index 27b23857..2312f432 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ will consitute of a breaking change warranting a new major release: - STR missed reply handling is now moved to DHB rather than the COM interface. The COM IF will still trigger an event if a reply is taking too long, and FDIR should still work via reply timeouts. +- Re-ordered some functions of the core controller in the initialize function. - Rad sensor is now only polled every 30 minutes instead of every device cycle to reduce wear of the RADFET electronics. - ACS Controller now includes the safe mode from FLP, which will calculate its rotational rate @@ -30,12 +31,17 @@ will consitute of a breaking change warranting a new major release: ## Added +- 5 ms delay after pulling RADFET enable pin high before starting + the ADC conversion. - Set STR time in configuration sequence to firmware mode. - The STR `AutoThreshold` parameters are now set from the configuration JSON file at STR startup. - The STR handler can now handle the COM error reply and triggers an low severity event accordingly. - Add SCEX handler for EM. - Radiation sensor handler dummy for the EM. +- Added event for SD card information in core controller initialize function. This event will also + be triggered after the SD state machine has run, so the event will generally be triggered twice + at system boot, and once after commanding SD card switches. ## Fixed diff --git a/bsp_hosted/fsfwconfig/events/translateEvents.cpp b/bsp_hosted/fsfwconfig/events/translateEvents.cpp index ff9e0a2c..65b11c49 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 300 translations. + * @brief Auto-generated event translation file. Contains 301 translations. * @details - * Generated on: 2023-07-13 21:09:02 + * Generated on: 2023-07-21 11:04:23 */ #include "translateEvents.h" @@ -279,6 +279,7 @@ const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY"; const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *PDEC_REBOOT_STRING = "PDEC_REBOOT"; const char *FIRMWARE_INFO_STRING = "FIRMWARE_INFO"; +const char *ACTIVE_SD_INFO_STRING = "ACTIVE_SD_INFO"; 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"; @@ -856,6 +857,8 @@ const char *translateEvents(Event event) { return PDEC_REBOOT_STRING; case (14013): return FIRMWARE_INFO_STRING; + case (14014): + return ACTIVE_SD_INFO_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; case (14101): diff --git a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp index 97b912f9..ff7f24d8 100644 --- a/bsp_hosted/fsfwconfig/objects/translateObjects.cpp +++ b/bsp_hosted/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 171 translations. - * Generated on: 2023-07-13 21:09:02 + * Generated on: 2023-07-21 11:04:23 */ #include "translateObjects.h" diff --git a/bsp_q7s/core/CoreController.cpp b/bsp_q7s/core/CoreController.cpp index 00c7f248..6d8f60c5 100644 --- a/bsp_q7s/core/CoreController.cpp +++ b/bsp_q7s/core/CoreController.cpp @@ -156,20 +156,12 @@ ReturnValue_t CoreController::initialize() { if (result != returnvalue::OK) { sif::warning << "CoreController::initialize: Base init failed" << std::endl; } - result = scratch::writeNumber(scratch::ALLOC_FAILURE_COUNT, 0); - if (result != returnvalue::OK) { - sif::warning << "CoreController::initialize: Setting up alloc failure " - "count failed" - << std::endl; - } result = paramHelper.initialize(); if (result != returnvalue::OK) { return result; } - sdStateMachine(); - EventManagerIF *eventManager = ObjectManager::instance()->get(objects::EVENT_MANAGER); if (eventManager == nullptr or eventQueue == nullptr) { @@ -189,7 +181,16 @@ ReturnValue_t CoreController::initialize() { triggerEvent(core::REBOOT_SW, CURRENT_CHIP, CURRENT_COPY); announceCurrentImageInfo(); announceVersionInfo(); - + SdCardManager::SdStatePair sdStates; + sdcMan->getSdCardsStatus(sdStates); + announceSdInfo(sdStates); + sdStateMachine(); + result = scratch::writeNumber(scratch::ALLOC_FAILURE_COUNT, 0); + if (result != returnvalue::OK) { + sif::warning << "CoreController::initialize: Setting up alloc failure " + "count failed" + << std::endl; + } return result; } @@ -800,6 +801,7 @@ ReturnValue_t CoreController::sdStateMachine() { } sif::info << "SD card update into " << modeStr << " mode finished. Active SD: " << sdInfo.activeChar << std::endl; + announceSdInfo(sdInfo.currentState); if (not sdInfo.initFinished) { updateInternalSdInfo(); sdInfo.initFinished = true; @@ -2570,6 +2572,17 @@ ReturnValue_t CoreController::performGracefulShutdown(xsc::Chip tgtChip, xsc::Co return returnvalue::OK; } +void CoreController::announceSdInfo(SdCardManager::SdStatePair sdStates) { + auto activeSdCard = sdcMan->getActiveSdCard(); + uint32_t p1 = sd::SdCard::NONE; + if (activeSdCard.has_value()) { + p1 = static_cast(activeSdCard.value()); + } + uint32_t p2 = + (static_cast(sdStates.first) << 16) | static_cast(sdStates.second); + triggerEvent(core::ACTIVE_SD_INFO, p1, p2); +} + bool CoreController::isNumber(const std::string &s) { return !s.empty() && std::find_if(s.begin(), s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end(); diff --git a/bsp_q7s/core/CoreController.h b/bsp_q7s/core/CoreController.h index b6bc9bfb..b6382d36 100644 --- a/bsp_q7s/core/CoreController.h +++ b/bsp_q7s/core/CoreController.h @@ -388,6 +388,7 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe void announceBootCounts(); void announceVersionInfo(); void announceCurrentImageInfo(); + void announceSdInfo(SdCardManager::SdStatePair sdStates); void readHkData(); void dirListingDumpHandler(); bool isNumber(const std::string& s); diff --git a/generators/bsp_hosted_events.csv b/generators/bsp_hosted_events.csv index 228b75bd..61e3a82a 100644 --- a/generators/bsp_hosted_events.csv +++ b/generators/bsp_hosted_events.csv @@ -273,6 +273,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14011;0x36bb;I2C_REBOOT;HIGH;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h 14012;0x36bc;PDEC_REBOOT;HIGH;PDEC recovery through reset was not possible, performing full reboot.;mission/sysDefs.h 14013;0x36bd;FIRMWARE_INFO;INFO;Version information of the firmware (not OBSW). P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h +14014;0x36be;ACTIVE_SD_INFO;INFO;Active SD card info. 0: OFF, 1: ON, 2: MOUNTED. P1: SD Card 0, P2: SD Card 1.;mission/sysDefs.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 diff --git a/generators/bsp_q7s_events.csv b/generators/bsp_q7s_events.csv index 228b75bd..61e3a82a 100644 --- a/generators/bsp_q7s_events.csv +++ b/generators/bsp_q7s_events.csv @@ -273,6 +273,7 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path 14011;0x36bb;I2C_REBOOT;HIGH;I2C is unavailable. Recovery did not work, performing full reboot.;mission/sysDefs.h 14012;0x36bc;PDEC_REBOOT;HIGH;PDEC recovery through reset was not possible, performing full reboot.;mission/sysDefs.h 14013;0x36bd;FIRMWARE_INFO;INFO;Version information of the firmware (not OBSW). P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash P2: First four letters of Git SHA is the last byte of P1 is set.;mission/sysDefs.h +14014;0x36be;ACTIVE_SD_INFO;INFO;Active SD card info. 0: OFF, 1: ON, 2: MOUNTED. P1: SD Card 0, P2: SD Card 1.;mission/sysDefs.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 diff --git a/generators/events/event_parser.py b/generators/events/event_parser.py index 94c1580c..f7463cf9 100644 --- a/generators/events/event_parser.py +++ b/generators/events/event_parser.py @@ -54,9 +54,13 @@ class BspConfig: # Store this file in the root of the generators folder self.csv_filename = Path(f"{ROOT_DIR}/{self.bsp_dir_name}_events.csv") - self.subsystems_csv_filename = Path(f"{ROOT_DIR}/{self.bsp_dir_name}_subsystems.csv") + self.subsystems_csv_filename = Path( + f"{ROOT_DIR}/{self.bsp_dir_name}_subsystems.csv" + ) self.csv_copy_dest = Path(f"{OBSW_ROOT_DIR}/tmtc/eive_tmtc/config/events.csv") - self.subsystem_csv_copy_dest = Path(f"{OBSW_ROOT_DIR}/tmtc/eive_tmtc/config/subsystems.csv") + self.subsystem_csv_copy_dest = Path( + f"{OBSW_ROOT_DIR}/tmtc/eive_tmtc/config/subsystems.csv" + ) if ( self.bsp_select == BspType.BSP_Q7S diff --git a/generators/events/translateEvents.cpp b/generators/events/translateEvents.cpp index ff9e0a2c..65b11c49 100644 --- a/generators/events/translateEvents.cpp +++ b/generators/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 300 translations. + * @brief Auto-generated event translation file. Contains 301 translations. * @details - * Generated on: 2023-07-13 21:09:02 + * Generated on: 2023-07-21 11:04:23 */ #include "translateEvents.h" @@ -279,6 +279,7 @@ const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY"; const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *PDEC_REBOOT_STRING = "PDEC_REBOOT"; const char *FIRMWARE_INFO_STRING = "FIRMWARE_INFO"; +const char *ACTIVE_SD_INFO_STRING = "ACTIVE_SD_INFO"; 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"; @@ -856,6 +857,8 @@ const char *translateEvents(Event event) { return PDEC_REBOOT_STRING; case (14013): return FIRMWARE_INFO_STRING; + case (14014): + return ACTIVE_SD_INFO_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; case (14101): diff --git a/generators/objects/translateObjects.cpp b/generators/objects/translateObjects.cpp index f4124f28..8bd6ae3d 100644 --- a/generators/objects/translateObjects.cpp +++ b/generators/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2023-07-13 21:09:02 + * Generated on: 2023-07-21 11:04:23 */ #include "translateObjects.h" diff --git a/linux/fsfwconfig/events/translateEvents.cpp b/linux/fsfwconfig/events/translateEvents.cpp index ff9e0a2c..65b11c49 100644 --- a/linux/fsfwconfig/events/translateEvents.cpp +++ b/linux/fsfwconfig/events/translateEvents.cpp @@ -1,7 +1,7 @@ /** - * @brief Auto-generated event translation file. Contains 300 translations. + * @brief Auto-generated event translation file. Contains 301 translations. * @details - * Generated on: 2023-07-13 21:09:02 + * Generated on: 2023-07-21 11:04:23 */ #include "translateEvents.h" @@ -279,6 +279,7 @@ const char *TRYING_I2C_RECOVERY_STRING = "TRYING_I2C_RECOVERY"; const char *I2C_REBOOT_STRING = "I2C_REBOOT"; const char *PDEC_REBOOT_STRING = "PDEC_REBOOT"; const char *FIRMWARE_INFO_STRING = "FIRMWARE_INFO"; +const char *ACTIVE_SD_INFO_STRING = "ACTIVE_SD_INFO"; 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"; @@ -856,6 +857,8 @@ const char *translateEvents(Event event) { return PDEC_REBOOT_STRING; case (14013): return FIRMWARE_INFO_STRING; + case (14014): + return ACTIVE_SD_INFO_STRING; case (14100): return NO_VALID_SENSOR_TEMPERATURE_STRING; case (14101): diff --git a/linux/fsfwconfig/objects/translateObjects.cpp b/linux/fsfwconfig/objects/translateObjects.cpp index f4124f28..8bd6ae3d 100644 --- a/linux/fsfwconfig/objects/translateObjects.cpp +++ b/linux/fsfwconfig/objects/translateObjects.cpp @@ -2,7 +2,7 @@ * @brief Auto-generated object translation file. * @details * Contains 175 translations. - * Generated on: 2023-07-13 21:09:02 + * Generated on: 2023-07-21 11:04:23 */ #include "translateObjects.h" diff --git a/mission/payload/RadiationSensorHandler.cpp b/mission/payload/RadiationSensorHandler.cpp index e20d7308..07363fba 100644 --- a/mission/payload/RadiationSensorHandler.cpp +++ b/mission/payload/RadiationSensorHandler.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -98,6 +99,10 @@ ReturnValue_t RadiationSensorHandler::buildCommandFromCommand(DeviceCommandId_t } case (radSens::START_CONVERSION): { ReturnValue_t result = gpioIF->pullHigh(gpioIds::ENABLE_RADFET); + // Test a small delay between pulling the RADFET high and reading the sensor. As long as this + // delay remains small enough, this should not cause scheduling issues. Do not make this + // delay large, this device might be scheduled inside the ACS PST! + TaskFactory::delayTask(5); if (result != returnvalue::OK) { #if OBSW_VERBOSE_LEVEL >= 1 sif::warning diff --git a/mission/sysDefs.h b/mission/sysDefs.h index 9750f3fd..4a53a76d 100644 --- a/mission/sysDefs.h +++ b/mission/sysDefs.h @@ -125,6 +125,10 @@ static constexpr Event PDEC_REBOOT = event::makeEvent(SUBSYSTEM_ID, 12, severity //! P1: Byte 0: Major, Byte 1: Minor, Byte 2: Patch, Byte 3: Has Git Hash //! P2: First four letters of Git SHA is the last byte of P1 is set. static constexpr Event FIRMWARE_INFO = event::makeEvent(SUBSYSTEM_ID, 13, severity::INFO); +//! [EXPORT] : [COMMENT] Active SD card info. SD States: 0: OFF, 1: ON, 2: MOUNTED. +//! P1: Active SD Card Index, 0 if none is active +//! P2: First two bytes: SD state of SD card 0, last two bytes SD state of SD card 1 +static constexpr Event ACTIVE_SD_INFO = event::makeEvent(SUBSYSTEM_ID, 14, severity::INFO); class ListDirectoryCmdBase { public: // TODO: Packet definition for clean deserialization