STR tests #739
59
CHANGELOG.md
59
CHANGELOG.md
@ -16,11 +16,64 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
|
|
||||||
# [unreleased]
|
# [unreleased]
|
||||||
|
|
||||||
# [v6.0.0] to be released
|
## Changed
|
||||||
|
|
||||||
|
- TCS: Remove OBC IF board thermal module, which is exactly identical to OBC module and therefore
|
||||||
|
obsolete.
|
||||||
|
- Swapped PL and PS I2C, BPX battery and MGT are connected to PS I2C now for firmware versions
|
||||||
|
equal or above v4. However, this software version is compatible to both v3 and v4 of the firmware.
|
||||||
|
- The firmware version variables are global statics inititalized early during the program
|
||||||
|
runtime now. This makes it possible to check the firmware version earlier.
|
||||||
|
- The TCS controller will now always command heaters OFF when being blind for thermal
|
||||||
|
components (no sensors available), irrespective of current switch state.
|
||||||
|
- Make OBSW compatible to prospective FW version v5.0.0, where the Q7 I2C devices were
|
||||||
|
moved to a PL I2C block and the TMP sensor devices were moved to the PS I2C0.
|
||||||
|
- Made `Xadc` code a little bit more robust against errors.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- TMP1075: Set dataset invalid on shutdown explicitely
|
||||||
|
- Small fixes for TMP1075 FDIR: Use strange and missed reply counters.
|
||||||
|
- TCS controller: Last heater (S-band heater) was skipped for transition completion
|
||||||
|
checks.
|
||||||
|
- TCS controller: A helper member to track the elapsed heater control cycles was not reset
|
||||||
|
properly, which could lead to switch transitions being completed immediately. This can
|
||||||
|
lead to weird bugs like heaters being commanded ON twice and can potentially lead to
|
||||||
|
other bugs.
|
||||||
|
- TMP1075: Devices did not go to OFF mode when being set faulty.
|
||||||
|
- Update PL PCDU 1 in TCS mode tree on the EM.
|
||||||
|
- TMP1075: Possibly ignored health commands.
|
||||||
|
- Bugfix in FSFW where certain packet types could only be sent with source data fields with a
|
||||||
|
maximum size of 255 bytes.
|
||||||
|
- TCS CTRL: Limit number of heater handler messages sent in case there are not sensors available
|
||||||
|
anymore.
|
||||||
|
|
||||||
|
# Added
|
||||||
|
|
||||||
|
- Two events for heaters being commanded ON and OFF by the TCS controller
|
||||||
|
- Upper limit for burn time of TCS heaters. Currently set to 1 hour for each heater.
|
||||||
|
This mechanism will only track the burn time for heaters which were commanded by the
|
||||||
|
TCS controller.
|
||||||
|
- TCS controller is now observable by introducing a new HK dataset which exposes some internal
|
||||||
|
fields related to TCS control.
|
||||||
|
|
||||||
|
# [v6.0.0] 2023-07-02
|
||||||
|
|
||||||
|
- `q7s-package` version v3.2.0
|
||||||
- Important bugfixes for PTME. See `q7s-package` CHANGELOG.
|
- Important bugfixes for PTME. See `q7s-package` CHANGELOG.
|
||||||
|
|
||||||
# [v5.2.0] 2023-06-29
|
## Changed
|
||||||
|
|
||||||
|
- Added back PTME busy bit polling. This is necessary due to changes to the AXI APB interface
|
||||||
|
to the PTME core.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
|
||||||
|
- For the live channel (VC0), telemetry was still only dumped if the transmitter is active.
|
||||||
|
Please note that this fix will lead to crashes for FW versions below v3.2.
|
||||||
|
However, it might not be an issue for the oldest firmware on the satellite (v2.5.1).
|
||||||
|
|
||||||
|
# [v5.2.0] 2023-07-02
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
@ -32,6 +85,8 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
|
|
||||||
- PTME was always reset on submode changes. The reset will now only be performed if the actual data
|
- PTME was always reset on submode changes. The reset will now only be performed if the actual data
|
||||||
rate changes.
|
rate changes.
|
||||||
|
- Add back ACS board code for the EM. Now that the radiation sensor was removed, the image switching
|
||||||
|
issue has disappeared and adding back the ACS board is worth it for the GPS timekeeping.
|
||||||
|
|
||||||
# [v5.1.0] 2023-06-28
|
# [v5.1.0] 2023-06-28
|
||||||
|
|
||||||
|
@ -105,7 +105,7 @@ set(OBSW_ADD_THERMAL_TEMP_INSERTER
|
|||||||
${OBSW_Q7S_EM}
|
${OBSW_Q7S_EM}
|
||||||
CACHE STRING "Add thermal sensor temperature inserter")
|
CACHE STRING "Add thermal sensor temperature inserter")
|
||||||
set(OBSW_ADD_ACS_BOARD
|
set(OBSW_ADD_ACS_BOARD
|
||||||
${INIT_VAL}
|
1
|
||||||
CACHE STRING "Add ACS board module")
|
CACHE STRING "Add ACS board module")
|
||||||
set(OBSW_ADD_GPS_CTRL
|
set(OBSW_ADD_GPS_CTRL
|
||||||
${INIT_VAL}
|
${INIT_VAL}
|
||||||
@ -150,7 +150,7 @@ set(OBSW_ADD_SYRLINKS
|
|||||||
1
|
1
|
||||||
CACHE STRING "Add Syrlinks module")
|
CACHE STRING "Add Syrlinks module")
|
||||||
set(OBSW_ADD_TMP_DEVICES
|
set(OBSW_ADD_TMP_DEVICES
|
||||||
${INIT_VAL}
|
1
|
||||||
CACHE STRING "Add TMP devices")
|
CACHE STRING "Add TMP devices")
|
||||||
set(OBSW_ADD_GOMSPACE_PCDU
|
set(OBSW_ADD_GOMSPACE_PCDU
|
||||||
1
|
1
|
||||||
|
@ -964,6 +964,12 @@ used by other software components to read the current chip and copy.
|
|||||||
This is a configuration scripts which runs after the Network Time Protocol has run. This script
|
This is a configuration scripts which runs after the Network Time Protocol has run. This script
|
||||||
currently sets the static IP address `192.168.133.10` and starts the `can` interface.
|
currently sets the static IP address `192.168.133.10` and starts the `can` interface.
|
||||||
|
|
||||||
|
## Initial boot delay
|
||||||
|
|
||||||
|
You can create a file named `boot_delays_secs.txt` inside the home folder to delay the OBSW boot
|
||||||
|
for 6 seconds if the file is empty of for the number of seconds specified inside the file. This
|
||||||
|
can be helpful if something inside the OBSW leads to an immediate crash of the OBC.
|
||||||
|
|
||||||
## PCDU
|
## PCDU
|
||||||
|
|
||||||
Connect to serial console of P60 Dock
|
Connect to serial console of P60 Dock
|
||||||
|
@ -113,7 +113,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
if (heaterHandler == nullptr) {
|
if (heaterHandler == nullptr) {
|
||||||
sif::error << "HeaterHandler could not be created" << std::endl;
|
sif::error << "HeaterHandler could not be created" << std::endl;
|
||||||
} else {
|
} else {
|
||||||
ObjectFactory::createThermalController(*heaterHandler);
|
ObjectFactory::createThermalController(*heaterHandler, true);
|
||||||
}
|
}
|
||||||
new TestTask(objects::TEST_TASK);
|
new TestTask(objects::TEST_TASK);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 296 translations.
|
* @brief Auto-generated event translation file. Contains 299 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-06-21 19:01:02
|
* Generated on: 2023-07-07 12:06:06
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -286,6 +286,9 @@ const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING";
|
|||||||
const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_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 *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE";
|
||||||
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
||||||
|
const char *TCS_SWITCHING_HEATER_ON_STRING = "TCS_SWITCHING_HEATER_ON";
|
||||||
|
const char *TCS_SWITCHING_HEATER_OFF_STRING = "TCS_SWITCHING_HEATER_OFF";
|
||||||
|
const char *TCS_HEATER_MAX_BURN_TIME_REACHED_STRING = "TCS_HEATER_MAX_BURN_TIME_REACHED";
|
||||||
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
||||||
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
||||||
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
||||||
@ -866,6 +869,12 @@ const char *translateEvents(Event event) {
|
|||||||
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
||||||
case (14108):
|
case (14108):
|
||||||
return MGT_OVERHEATING_STRING;
|
return MGT_OVERHEATING_STRING;
|
||||||
|
case (14109):
|
||||||
|
return TCS_SWITCHING_HEATER_ON_STRING;
|
||||||
|
case (14110):
|
||||||
|
return TCS_SWITCHING_HEATER_OFF_STRING;
|
||||||
|
case (14111):
|
||||||
|
return TCS_HEATER_MAX_BURN_TIME_REACHED_STRING;
|
||||||
case (14201):
|
case (14201):
|
||||||
return TX_TIMER_EXPIRED_STRING;
|
return TX_TIMER_EXPIRED_STRING;
|
||||||
case (14202):
|
case (14202):
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 171 translations.
|
* Contains 171 translations.
|
||||||
* Generated on: 2023-06-21 19:01:02
|
* Generated on: 2023-07-07 12:06:06
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
|
@ -7,7 +7,8 @@ target_link_libraries(${SIMPLE_OBSW_NAME} PUBLIC ${LIB_FSFW_NAME})
|
|||||||
target_compile_definitions(${SIMPLE_OBSW_NAME} PRIVATE "Q7S_SIMPLE_MODE")
|
target_compile_definitions(${SIMPLE_OBSW_NAME} PRIVATE "Q7S_SIMPLE_MODE")
|
||||||
add_subdirectory(simple)
|
add_subdirectory(simple)
|
||||||
|
|
||||||
target_sources(${OBSW_NAME} PUBLIC main.cpp obsw.cpp)
|
target_sources(${OBSW_NAME} PUBLIC main.cpp obsw.cpp scheduling.cpp
|
||||||
|
objectFactory.cpp)
|
||||||
|
|
||||||
add_subdirectory(boardtest)
|
add_subdirectory(boardtest)
|
||||||
|
|
||||||
|
@ -12,6 +12,9 @@ static constexpr char SPI_RW_DEV[] = "/dev/spi_rw";
|
|||||||
static constexpr char I2C_PL_EIVE[] = "/dev/i2c_pl";
|
static constexpr char I2C_PL_EIVE[] = "/dev/i2c_pl";
|
||||||
//! I2C bus using the I2C peripheral of the ARM processing system (PS)
|
//! I2C bus using the I2C peripheral of the ARM processing system (PS)
|
||||||
static constexpr char I2C_PS_EIVE[] = "/dev/i2c_ps";
|
static constexpr char I2C_PS_EIVE[] = "/dev/i2c_ps";
|
||||||
|
//! I2C bus using the first I2C peripheral of the ARM processing system (PS).
|
||||||
|
//! Named like this because it is used by default for the Q7 devices.
|
||||||
|
static constexpr char I2C_Q7_EIVE[] = "/dev/i2c_q7";
|
||||||
|
|
||||||
static constexpr char UART_GNSS_DEV[] = "/dev/gps0";
|
static constexpr char UART_GNSS_DEV[] = "/dev/gps0";
|
||||||
static constexpr char UART_PLOC_MPSOC_DEV[] = "/dev/ul_plmpsoc";
|
static constexpr char UART_PLOC_MPSOC_DEV[] = "/dev/ul_plmpsoc";
|
||||||
|
@ -1,4 +1 @@
|
|||||||
target_sources(${OBSW_NAME} PRIVATE CoreController.cpp scheduling.cpp
|
target_sources(${OBSW_NAME} PRIVATE CoreController.cpp WatchdogHandler.cpp)
|
||||||
ObjectFactory.cpp WatchdogHandler.cpp)
|
|
||||||
|
|
||||||
target_sources(${SIMPLE_OBSW_NAME} PRIVATE scheduling.cpp)
|
|
||||||
|
@ -188,17 +188,6 @@ ReturnValue_t CoreController::initialize() {
|
|||||||
}
|
}
|
||||||
triggerEvent(core::REBOOT_SW, CURRENT_CHIP, CURRENT_COPY);
|
triggerEvent(core::REBOOT_SW, CURRENT_CHIP, CURRENT_COPY);
|
||||||
announceCurrentImageInfo();
|
announceCurrentImageInfo();
|
||||||
// This has to come before the version announce because it might be required for retrieving
|
|
||||||
// the firmware version.
|
|
||||||
if (common::OBSW_VERSION_MAJOR >= 6 or common::OBSW_VERSION_MAJOR == 4) {
|
|
||||||
UioMapper sysRomMapper(q7s::UIO_SYS_ROM);
|
|
||||||
result = sysRomMapper.getMappedAdress(&mappedSysRomAddr, UioMapper::Permissions::READ_ONLY);
|
|
||||||
if (result != returnvalue::OK) {
|
|
||||||
// TODO: This might be a reason to switch to another image..
|
|
||||||
sif::error << "Getting mapped SYS ROM UIO address failed" << std::endl;
|
|
||||||
result = ObjectManager::CHILD_INIT_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
announceVersionInfo();
|
announceVersionInfo();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -2526,14 +2515,10 @@ void CoreController::announceVersionInfo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
triggerEvent(VERSION_INFO, p1, p2);
|
triggerEvent(VERSION_INFO, p1, p2);
|
||||||
|
p1 = (core::FW_VERSION_MAJOR << 24) | (core::FW_VERSION_MINOR << 16) |
|
||||||
if (common::OBSW_VERSION_MAJOR >= 6 or common::OBSW_VERSION_MAJOR == 4) {
|
(core::FW_VERSION_REVISION << 8) | (core::FW_VERSION_HAS_SHA);
|
||||||
if (mappedSysRomAddr != nullptr) {
|
std::memcpy(&p2, core::FW_VERSION_GIT_SHA, 4);
|
||||||
uint32_t p1Firmware = *(reinterpret_cast<uint32_t *>(mappedSysRomAddr));
|
triggerEvent(FIRMWARE_INFO, p1, p2);
|
||||||
uint32_t p2Firmware = *(reinterpret_cast<uint32_t *>(mappedSysRomAddr) + 1);
|
|
||||||
triggerEvent(FIRMWARE_INFO, p1Firmware, p2Firmware);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreController::announceCurrentImageInfo() {
|
void CoreController::announceCurrentImageInfo() {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef BSP_Q7S_CORE_CORECONTROLLER_H_
|
#ifndef BSP_Q7S_CORE_CORECONTROLLER_H_
|
||||||
#define BSP_Q7S_CORE_CORECONTROLLER_H_
|
#define BSP_Q7S_CORE_CORECONTROLLER_H_
|
||||||
|
|
||||||
|
#include <bsp_q7s/core/defs.h>
|
||||||
#include <fsfw/container/DynamicFIFO.h>
|
#include <fsfw/container/DynamicFIFO.h>
|
||||||
#include <fsfw/container/SimpleRingBuffer.h>
|
#include <fsfw/container/SimpleRingBuffer.h>
|
||||||
#include <fsfw/globalfunctions/PeriodicOperationDivider.h>
|
#include <fsfw/globalfunctions/PeriodicOperationDivider.h>
|
||||||
@ -14,7 +15,6 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
#include "CoreDefinitions.h"
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/fs/SdCardManager.h"
|
#include "bsp_q7s/fs/SdCardManager.h"
|
||||||
#include "events/subsystemIdRanges.h"
|
#include "events/subsystemIdRanges.h"
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
#ifndef BSP_Q7S_CORE_COREDEFINITIONS_H_
|
#ifndef BSP_Q7S_CORE_DEFS_H_
|
||||||
#define BSP_Q7S_CORE_COREDEFINITIONS_H_
|
#define BSP_Q7S_CORE_DEFS_H_
|
||||||
|
|
||||||
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
|
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
|
||||||
|
|
||||||
namespace core {
|
namespace core {
|
||||||
|
|
||||||
|
extern uint8_t FW_VERSION_MAJOR;
|
||||||
|
extern uint8_t FW_VERSION_MINOR;
|
||||||
|
extern uint8_t FW_VERSION_REVISION;
|
||||||
|
extern bool FW_VERSION_HAS_SHA;
|
||||||
|
extern char FW_VERSION_GIT_SHA[4];
|
||||||
|
|
||||||
static const uint8_t HK_SET_ENTRIES = 3;
|
static const uint8_t HK_SET_ENTRIES = 3;
|
||||||
static const uint32_t HK_SET_ID = 5;
|
static const uint32_t HK_SET_ID = 5;
|
||||||
|
|
||||||
@ -36,4 +42,4 @@ class HkSet : public StaticLocalDataSet<HK_SET_ENTRIES> {
|
|||||||
|
|
||||||
} // namespace core
|
} // namespace core
|
||||||
|
|
||||||
#endif /* BSP_Q7S_CORE_COREDEFINITIONS_H_ */
|
#endif /* BSP_Q7S_CORE_DEFS_H_ */
|
@ -1,4 +1,5 @@
|
|||||||
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
||||||
|
#include <bsp_q7s/objectFactory.h>
|
||||||
#include <dummies/ComCookieDummy.h>
|
#include <dummies/ComCookieDummy.h>
|
||||||
#include <dummies/PcduHandlerDummy.h>
|
#include <dummies/PcduHandlerDummy.h>
|
||||||
#include <fsfw/health/HealthTableIF.h>
|
#include <fsfw/health/HealthTableIF.h>
|
||||||
@ -10,8 +11,8 @@
|
|||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/core/CoreController.h"
|
#include "bsp_q7s/core/CoreController.h"
|
||||||
#include "bsp_q7s/core/ObjectFactory.h"
|
|
||||||
#include "busConf.h"
|
#include "busConf.h"
|
||||||
|
#include "common/config/devices/addresses.h"
|
||||||
#include "devConf.h"
|
#include "devConf.h"
|
||||||
#include "dummies/helperFactory.h"
|
#include "dummies/helperFactory.h"
|
||||||
#include "eive/objects.h"
|
#include "eive/objects.h"
|
||||||
@ -35,6 +36,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
PersistentTmStores stores;
|
PersistentTmStores stores;
|
||||||
|
readFirmwareVersion();
|
||||||
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel,
|
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel,
|
||||||
*SdCardManager::instance(), &ipcStore, &tmStore, stores, 200,
|
*SdCardManager::instance(), &ipcStore, &tmStore, stores, 200,
|
||||||
enableHkSets);
|
enableHkSets);
|
||||||
@ -44,7 +46,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
SpiComIF* spiMainComIF = nullptr;
|
SpiComIF* spiMainComIF = nullptr;
|
||||||
I2cComIF* i2cComIF = nullptr;
|
I2cComIF* i2cComIF = nullptr;
|
||||||
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF);
|
createCommunicationInterfaces(&gpioComIF, &uartComIF, &spiMainComIF, &i2cComIF);
|
||||||
/* Adding gpios for chip select decoding to the gpioComIf */
|
// Adding GPIOs for chip select decoding and initializing them.
|
||||||
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
|
q7s::gpioCallbacks::initSpiCsDecoder(gpioComIF);
|
||||||
gpioCallbacks::disableAllDecoder(gpioComIF);
|
gpioCallbacks::disableAllDecoder(gpioComIF);
|
||||||
createPlI2cResetGpio(gpioComIF);
|
createPlI2cResetGpio(gpioComIF);
|
||||||
@ -60,6 +62,21 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#if OBSW_ADD_PLOC_SUPERVISOR == 1 || OBSW_ADD_PLOC_MPSOC == 1
|
#if OBSW_ADD_PLOC_SUPERVISOR == 1 || OBSW_ADD_PLOC_MPSOC == 1
|
||||||
dummyCfg.addPlocDummies = false;
|
dummyCfg.addPlocDummies = false;
|
||||||
#endif
|
#endif
|
||||||
|
#if OBSW_ADD_TMP_DEVICES == 1
|
||||||
|
std::vector<std::pair<object_id_t, address_t>> tmpDevsToAdd = {{
|
||||||
|
{objects::TMP1075_HANDLER_PLPCDU_0, addresses::TMP1075_PLPCDU_0},
|
||||||
|
{objects::TMP1075_HANDLER_PLPCDU_1, addresses::TMP1075_PLPCDU_1},
|
||||||
|
{objects::TMP1075_HANDLER_IF_BOARD, addresses::TMP1075_IF_BOARD},
|
||||||
|
}};
|
||||||
|
createTmpComponents(tmpDevsToAdd);
|
||||||
|
dummy::Tmp1075Cfg tmpCfg{};
|
||||||
|
tmpCfg.addTcsBrd0 = true;
|
||||||
|
tmpCfg.addTcsBrd1 = true;
|
||||||
|
tmpCfg.addPlPcdu0 = false;
|
||||||
|
tmpCfg.addPlPcdu1 = false;
|
||||||
|
tmpCfg.addIfBrd = false;
|
||||||
|
dummyCfg.tmp1075Cfg = tmpCfg;
|
||||||
|
#endif
|
||||||
#if OBSW_ADD_GOMSPACE_PCDU == 1
|
#if OBSW_ADD_GOMSPACE_PCDU == 1
|
||||||
dummyCfg.addPowerDummies = false;
|
dummyCfg.addPowerDummies = false;
|
||||||
// The ACU broke.
|
// The ACU broke.
|
||||||
@ -87,9 +104,10 @@ void ObjectFactory::produce(void* args) {
|
|||||||
|
|
||||||
new CoreController(objects::CORE_CONTROLLER, enableHkSets);
|
new CoreController(objects::CORE_CONTROLLER, enableHkSets);
|
||||||
|
|
||||||
#if OBSW_ADD_ACS_BOARD == 1
|
// Initialize chip select to avoid SPI bus issues.
|
||||||
// Still initialize chip select to avoid SPI bus issues.
|
|
||||||
createRadSensorChipSelect(gpioComIF);
|
createRadSensorChipSelect(gpioComIF);
|
||||||
|
|
||||||
|
#if OBSW_ADD_ACS_BOARD == 1
|
||||||
createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher, true,
|
createAcsBoardComponents(*spiMainComIF, gpioComIF, uartComIF, *pwrSwitcher, true,
|
||||||
adis1650x::Type::ADIS16507);
|
adis1650x::Type::ADIS16507);
|
||||||
#else
|
#else
|
||||||
@ -99,8 +117,12 @@ void ObjectFactory::produce(void* args) {
|
|||||||
gpioChecker(gpioComIF->addGpios(acsBoardGpios), "ACS Board");
|
gpioChecker(gpioComIF->addGpios(acsBoardGpios), "ACS Board");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char* battAndImtqI2cDev = q7s::I2C_PL_EIVE;
|
||||||
|
if (core::FW_VERSION_MAJOR >= 4) {
|
||||||
|
battAndImtqI2cDev = q7s::I2C_PS_EIVE;
|
||||||
|
}
|
||||||
#if OBSW_ADD_MGT == 1
|
#if OBSW_ADD_MGT == 1
|
||||||
createImtqComponents(pwrSwitcher, enableHkSets);
|
createImtqComponents(pwrSwitcher, enableHkSets, battAndImtqI2cDev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_SYRLINKS == 1
|
#if OBSW_ADD_SYRLINKS == 1
|
||||||
@ -112,7 +134,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
||||||
createBpxBatteryComponent(enableHkSets);
|
createBpxBatteryComponent(enableHkSets, battAndImtqI2cDev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_STAR_TRACKER == 1
|
#if OBSW_ADD_STAR_TRACKER == 1
|
||||||
@ -144,6 +166,6 @@ void ObjectFactory::produce(void* args) {
|
|||||||
createAcsController(true, enableHkSets);
|
createAcsController(true, enableHkSets);
|
||||||
HeaterHandler* heaterHandler;
|
HeaterHandler* heaterHandler;
|
||||||
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
||||||
createThermalController(*heaterHandler);
|
createThermalController(*heaterHandler, true);
|
||||||
satsystem::init();
|
satsystem::init(true);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
#include <bsp_q7s/callbacks/q7sGpioCallbacks.h>
|
||||||
|
#include <bsp_q7s/objectFactory.h>
|
||||||
#include <devices/gpioIds.h>
|
#include <devices/gpioIds.h>
|
||||||
#include <fsfw/storagemanager/LocalPool.h>
|
#include <fsfw/storagemanager/LocalPool.h>
|
||||||
#include <fsfw/storagemanager/PoolManager.h>
|
#include <fsfw/storagemanager/PoolManager.h>
|
||||||
@ -7,9 +8,9 @@
|
|||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/core/CoreController.h"
|
#include "bsp_q7s/core/CoreController.h"
|
||||||
#include "bsp_q7s/core/ObjectFactory.h"
|
|
||||||
#include "busConf.h"
|
#include "busConf.h"
|
||||||
#include "devConf.h"
|
#include "devConf.h"
|
||||||
|
#include "devices/addresses.h"
|
||||||
#include "eive/objects.h"
|
#include "eive/objects.h"
|
||||||
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
|
#include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h"
|
||||||
#include "linux/ObjectFactory.h"
|
#include "linux/ObjectFactory.h"
|
||||||
@ -32,6 +33,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
PersistentTmStores stores;
|
PersistentTmStores stores;
|
||||||
|
readFirmwareVersion();
|
||||||
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel,
|
ObjectFactory::produceGenericObjects(&healthTable, &pusFunnel, &cfdpFunnel,
|
||||||
*SdCardManager::instance(), &ipcStore, &tmStore, stores, 200,
|
*SdCardManager::instance(), &ipcStore, &tmStore, stores, 200,
|
||||||
true);
|
true);
|
||||||
@ -67,7 +69,16 @@ void ObjectFactory::produce(void* args) {
|
|||||||
HeaterHandler* heaterHandler;
|
HeaterHandler* heaterHandler;
|
||||||
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
createHeaterComponents(gpioComIF, pwrSwitcher, healthTable, heaterHandler);
|
||||||
#if OBSW_ADD_TMP_DEVICES == 1
|
#if OBSW_ADD_TMP_DEVICES == 1
|
||||||
createTmpComponents();
|
std::vector<std::pair<object_id_t, address_t>> tmpDevsToAdd = {{
|
||||||
|
{objects::TMP1075_HANDLER_TCS_0, addresses::TMP1075_TCS_0},
|
||||||
|
{objects::TMP1075_HANDLER_TCS_1, addresses::TMP1075_TCS_1},
|
||||||
|
{objects::TMP1075_HANDLER_PLPCDU_0, addresses::TMP1075_PLPCDU_0},
|
||||||
|
// damaged
|
||||||
|
// {objects::TMP1075_HANDLER_PLPCDU_1, addresses::TMP1075_PLPCDU_1},
|
||||||
|
{objects::TMP1075_HANDLER_IF_BOARD, addresses::TMP1075_IF_BOARD},
|
||||||
|
}};
|
||||||
|
|
||||||
|
createTmpComponents(tmpDevsToAdd);
|
||||||
#endif
|
#endif
|
||||||
createSolarArrayDeploymentComponents(*pwrSwitcher, *gpioComIF);
|
createSolarArrayDeploymentComponents(*pwrSwitcher, *gpioComIF);
|
||||||
createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher, *stackHandler);
|
createPlPcduComponents(gpioComIF, spiMainComIF, pwrSwitcher, *stackHandler);
|
||||||
@ -77,13 +88,17 @@ void ObjectFactory::produce(void* args) {
|
|||||||
createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher, spiMainComIF);
|
createRtdComponents(q7s::SPI_DEFAULT_DEV, gpioComIF, pwrSwitcher, spiMainComIF);
|
||||||
createPayloadComponents(gpioComIF, *pwrSwitcher);
|
createPayloadComponents(gpioComIF, *pwrSwitcher);
|
||||||
|
|
||||||
|
const char* battAndImtqI2cDev = q7s::I2C_PL_EIVE;
|
||||||
|
if (core::FW_VERSION_MAJOR >= 4) {
|
||||||
|
battAndImtqI2cDev = q7s::I2C_PS_EIVE;
|
||||||
|
}
|
||||||
#if OBSW_ADD_MGT == 1
|
#if OBSW_ADD_MGT == 1
|
||||||
createImtqComponents(pwrSwitcher, enableHkSets);
|
createImtqComponents(pwrSwitcher, enableHkSets, battAndImtqI2cDev);
|
||||||
#endif
|
#endif
|
||||||
createReactionWheelComponents(gpioComIF, pwrSwitcher);
|
createReactionWheelComponents(gpioComIF, pwrSwitcher);
|
||||||
|
|
||||||
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
#if OBSW_ADD_BPX_BATTERY_HANDLER == 1
|
||||||
createBpxBatteryComponent(enableHkSets);
|
createBpxBatteryComponent(enableHkSets, battAndImtqI2cDev);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if OBSW_ADD_STAR_TRACKER == 1
|
#if OBSW_ADD_STAR_TRACKER == 1
|
||||||
@ -113,7 +128,7 @@ void ObjectFactory::produce(void* args) {
|
|||||||
#endif /* OBSW_ADD_TEST_CODE == 1 */
|
#endif /* OBSW_ADD_TEST_CODE == 1 */
|
||||||
|
|
||||||
createMiscComponents();
|
createMiscComponents();
|
||||||
createThermalController(*heaterHandler);
|
createThermalController(*heaterHandler, false);
|
||||||
createAcsController(true, enableHkSets);
|
createAcsController(true, enableHkSets);
|
||||||
satsystem::init();
|
satsystem::init(false);
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#include "ObjectFactory.h"
|
#include "objectFactory.h"
|
||||||
|
|
||||||
#include <fsfw/devicehandlers/HealthDevice.h>
|
#include <fsfw/devicehandlers/HealthDevice.h>
|
||||||
#include <fsfw/subsystem/Subsystem.h>
|
#include <fsfw/subsystem/Subsystem.h>
|
||||||
#include <fsfw/tasks/TaskFactory.h>
|
#include <fsfw/tasks/TaskFactory.h>
|
||||||
|
#include <fsfw_hal/linux/uio/UioMapper.h>
|
||||||
#include <linux/acs/AcsBoardPolling.h>
|
#include <linux/acs/AcsBoardPolling.h>
|
||||||
#include <linux/acs/GpsHyperionLinuxController.h>
|
#include <linux/acs/GpsHyperionLinuxController.h>
|
||||||
#include <linux/acs/ImtqPollingTask.h>
|
#include <linux/acs/ImtqPollingTask.h>
|
||||||
@ -32,6 +33,9 @@
|
|||||||
#include <mission/system/objects/CamSwitcher.h>
|
#include <mission/system/objects/CamSwitcher.h>
|
||||||
#include <mission/system/tcs/TmpDevFdir.h>
|
#include <mission/system/tcs/TmpDevFdir.h>
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
#include "bsp_q7s/boardtest/Q7STestTask.h"
|
||||||
#include "bsp_q7s/callbacks/gnssCallback.h"
|
#include "bsp_q7s/callbacks/gnssCallback.h"
|
||||||
@ -100,6 +104,7 @@
|
|||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "bsp_q7s/core/defs.h"
|
||||||
#include "fsfw/datapoollocal/LocalDataPoolManager.h"
|
#include "fsfw/datapoollocal/LocalDataPoolManager.h"
|
||||||
#include "fsfw/tmtcpacket/pus/tm.h"
|
#include "fsfw/tmtcpacket/pus/tm.h"
|
||||||
#include "fsfw/tmtcservices/CommandingServiceBase.h"
|
#include "fsfw/tmtcservices/CommandingServiceBase.h"
|
||||||
@ -130,6 +135,11 @@ ResetArgs RESET_ARGS_GNSS;
|
|||||||
std::atomic_bool LINK_STATE = CcsdsIpCoreHandler::LINK_DOWN;
|
std::atomic_bool LINK_STATE = CcsdsIpCoreHandler::LINK_DOWN;
|
||||||
std::atomic_bool PTME_LOCKED = false;
|
std::atomic_bool PTME_LOCKED = false;
|
||||||
std::atomic_uint16_t I2C_FATAL_ERRORS = 0;
|
std::atomic_uint16_t I2C_FATAL_ERRORS = 0;
|
||||||
|
uint8_t core::FW_VERSION_MAJOR = 0;
|
||||||
|
uint8_t core::FW_VERSION_MINOR = 0;
|
||||||
|
uint8_t core::FW_VERSION_REVISION = 0;
|
||||||
|
bool core::FW_VERSION_HAS_SHA = false;
|
||||||
|
char core::FW_VERSION_GIT_SHA[4] = {};
|
||||||
|
|
||||||
void Factory::setStaticFrameworkObjectIds() {
|
void Factory::setStaticFrameworkObjectIds() {
|
||||||
PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR;
|
PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_PACKET_DISTRIBUTOR;
|
||||||
@ -151,28 +161,23 @@ void Factory::setStaticFrameworkObjectIds() {
|
|||||||
|
|
||||||
void ObjectFactory::setStatics() { Factory::setStaticFrameworkObjectIds(); }
|
void ObjectFactory::setStatics() { Factory::setStaticFrameworkObjectIds(); }
|
||||||
|
|
||||||
void ObjectFactory::createTmpComponents() {
|
void ObjectFactory::createTmpComponents(
|
||||||
std::vector<std::pair<object_id_t, address_t>> tmpDevIds = {{
|
std::vector<std::pair<object_id_t, address_t>> tmpDevsToAdd) {
|
||||||
{objects::TMP1075_HANDLER_TCS_0, addresses::TMP1075_TCS_0},
|
const char* tmpI2cDev = q7s::I2C_PS_EIVE;
|
||||||
{objects::TMP1075_HANDLER_TCS_1, addresses::TMP1075_TCS_1},
|
if (core::FW_VERSION_MAJOR == 4) {
|
||||||
{objects::TMP1075_HANDLER_PLPCDU_0, addresses::TMP1075_PLPCDU_0},
|
tmpI2cDev = q7s::I2C_PL_EIVE;
|
||||||
// damaged
|
} else if (core::FW_VERSION_MAJOR >= 5) {
|
||||||
// {objects::TMP1075_HANDLER_PLPCDU_1, addresses::TMP1075_PLPCDU_1},
|
tmpI2cDev = q7s::I2C_Q7_EIVE;
|
||||||
{objects::TMP1075_HANDLER_IF_BOARD, addresses::TMP1075_IF_BOARD},
|
}
|
||||||
}};
|
|
||||||
std::vector<I2cCookie*> tmpDevCookies;
|
std::vector<I2cCookie*> tmpDevCookies;
|
||||||
|
|
||||||
for (size_t idx = 0; idx < tmpDevIds.size(); idx++) {
|
for (size_t idx = 0; idx < tmpDevsToAdd.size(); idx++) {
|
||||||
tmpDevCookies.push_back(
|
tmpDevCookies.push_back(
|
||||||
new I2cCookie(tmpDevIds[idx].second, TMP1075::MAX_REPLY_LENGTH, q7s::I2C_PS_EIVE));
|
new I2cCookie(tmpDevsToAdd[idx].second, TMP1075::MAX_REPLY_LENGTH, tmpI2cDev));
|
||||||
auto* tmpDevHandler =
|
auto* tmpDevHandler =
|
||||||
new Tmp1075Handler(tmpDevIds[idx].first, objects::I2C_COM_IF, tmpDevCookies[idx]);
|
new Tmp1075Handler(tmpDevsToAdd[idx].first, objects::I2C_COM_IF, tmpDevCookies[idx]);
|
||||||
tmpDevHandler->setCustomFdir(new TmpDevFdir(tmpDevIds[idx].first));
|
tmpDevHandler->setCustomFdir(new TmpDevFdir(tmpDevsToAdd[idx].first));
|
||||||
tmpDevHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
tmpDevHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||||
// TODO: Remove this after TCS subsystem was added
|
|
||||||
// These devices are connected to the 3V3 stack and should be powered permanently. Therefore,
|
|
||||||
// we set them to normal mode immediately here.
|
|
||||||
tmpDevHandler->setModeNormal();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -945,12 +950,13 @@ void ObjectFactory::createStrComponents(PowerSwitchIF* pwrSwitcher) {
|
|||||||
starTracker->setCustomFdir(strFdir);
|
starTracker->setCustomFdir(strFdir);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets) {
|
void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets,
|
||||||
|
const char* i2cDev) {
|
||||||
auto* imtqAssy = new ImtqAssembly(objects::IMTQ_ASSY);
|
auto* imtqAssy = new ImtqAssembly(objects::IMTQ_ASSY);
|
||||||
imtqAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
imtqAssy->connectModeTreeParent(satsystem::acs::ACS_SUBSYSTEM);
|
||||||
|
|
||||||
new ImtqPollingTask(objects::IMTQ_POLLING, I2C_FATAL_ERRORS);
|
new ImtqPollingTask(objects::IMTQ_POLLING, I2C_FATAL_ERRORS);
|
||||||
I2cCookie* imtqI2cCookie = new I2cCookie(addresses::IMTQ, imtq::MAX_REPLY_SIZE, q7s::I2C_PL_EIVE);
|
I2cCookie* imtqI2cCookie = new I2cCookie(addresses::IMTQ, imtq::MAX_REPLY_SIZE, i2cDev);
|
||||||
auto imtqHandler = new ImtqHandler(objects::IMTQ_HANDLER, objects::IMTQ_POLLING, imtqI2cCookie,
|
auto imtqHandler = new ImtqHandler(objects::IMTQ_HANDLER, objects::IMTQ_POLLING, imtqI2cCookie,
|
||||||
power::Switches::PDU1_CH3_MGT_5V, enableHkSets);
|
power::Switches::PDU1_CH3_MGT_5V, enableHkSets);
|
||||||
imtqHandler->enableThermalModule(ThermalStateCfg());
|
imtqHandler->enableThermalModule(ThermalStateCfg());
|
||||||
@ -966,8 +972,8 @@ void ObjectFactory::createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enable
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createBpxBatteryComponent(bool enableHkSets) {
|
void ObjectFactory::createBpxBatteryComponent(bool enableHkSets, const char* i2cDev) {
|
||||||
I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, q7s::I2C_PL_EIVE);
|
I2cCookie* bpxI2cCookie = new I2cCookie(addresses::BPX_BATTERY, 100, i2cDev);
|
||||||
BpxBatteryHandler* bpxHandler = new BpxBatteryHandler(
|
BpxBatteryHandler* bpxHandler = new BpxBatteryHandler(
|
||||||
objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie, enableHkSets);
|
objects::BPX_BATT_HANDLER, objects::I2C_COM_IF, bpxI2cCookie, enableHkSets);
|
||||||
bpxHandler->setStartUpImmediately();
|
bpxHandler->setStartUpImmediately();
|
||||||
@ -1023,3 +1029,32 @@ void ObjectFactory::createPlI2cResetGpio(LinuxLibgpioIF* gpioIF) {
|
|||||||
gpioIF->pullHigh(gpioIds::PL_I2C_ARESETN);
|
gpioIF->pullHigh(gpioIds::PL_I2C_ARESETN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnValue_t ObjectFactory::readFirmwareVersion() {
|
||||||
|
uint32_t* mappedSysRomAddr = nullptr;
|
||||||
|
// The SYS ROM FPGA block is only available in those versions.
|
||||||
|
if (not(common::OBSW_VERSION_MAJOR >= 6) or (common::OBSW_VERSION_MAJOR == 4)) {
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
// This has to come before the version announce because it might be required for retrieving
|
||||||
|
// the firmware version.
|
||||||
|
UioMapper sysRomMapper(q7s::UIO_SYS_ROM);
|
||||||
|
ReturnValue_t result =
|
||||||
|
sysRomMapper.getMappedAdress(&mappedSysRomAddr, UioMapper::Permissions::READ_ONLY);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
sif::error << "Getting mapped SYS ROM UIO address failed" << std::endl;
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
|
if (mappedSysRomAddr != nullptr) {
|
||||||
|
uint32_t firstEntry = *(reinterpret_cast<uint32_t*>(mappedSysRomAddr));
|
||||||
|
uint32_t secondEntry = *(reinterpret_cast<uint32_t*>(mappedSysRomAddr) + 1);
|
||||||
|
core::FW_VERSION_MAJOR = (firstEntry >> 24) & 0xff;
|
||||||
|
core::FW_VERSION_MINOR = (firstEntry >> 16) & 0xff;
|
||||||
|
core::FW_VERSION_REVISION = (firstEntry >> 8) & 0xff;
|
||||||
|
bool hasGitSha = (firstEntry & 0x0b1);
|
||||||
|
if (hasGitSha) {
|
||||||
|
std::memcpy(core::FW_VERSION_GIT_SHA, &secondEntry, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
@ -58,7 +58,7 @@ void createPcduComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF** pwrSwitcher
|
|||||||
bool enableHkSets);
|
bool enableHkSets);
|
||||||
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
|
void createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* spiComIF,
|
||||||
PowerSwitchIF* pwrSwitcher, Stack5VHandler& stackHandler);
|
PowerSwitchIF* pwrSwitcher, Stack5VHandler& stackHandler);
|
||||||
void createTmpComponents();
|
void createTmpComponents(std::vector<std::pair<object_id_t, address_t>> tmpDevsToAdd);
|
||||||
void createRadSensorChipSelect(LinuxLibgpioIF* gpioIF);
|
void createRadSensorChipSelect(LinuxLibgpioIF* gpioIF);
|
||||||
ReturnValue_t createRadSensorComponent(LinuxLibgpioIF* gpioComIF, Stack5VHandler& handler);
|
ReturnValue_t createRadSensorComponent(LinuxLibgpioIF* gpioComIF, Stack5VHandler& handler);
|
||||||
void createAcsBoardGpios(GpioCookie& cookie);
|
void createAcsBoardGpios(GpioCookie& cookie);
|
||||||
@ -67,14 +67,15 @@ void createAcsBoardComponents(SpiComIF& spiComIF, LinuxLibgpioIF* gpioComIF, Ser
|
|||||||
adis1650x::Type adisType);
|
adis1650x::Type adisType);
|
||||||
void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTableIF* healthTable,
|
void createHeaterComponents(GpioIF* gpioIF, PowerSwitchIF* pwrSwitcher, HealthTableIF* healthTable,
|
||||||
HeaterHandler*& heaterHandler);
|
HeaterHandler*& heaterHandler);
|
||||||
void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets);
|
void createImtqComponents(PowerSwitchIF* pwrSwitcher, bool enableHkSets, const char* i2cDev);
|
||||||
void createBpxBatteryComponent(bool enableHkSets);
|
void createBpxBatteryComponent(bool enableHkSets, const char* i2cDev);
|
||||||
void createStrComponents(PowerSwitchIF* pwrSwitcher);
|
void createStrComponents(PowerSwitchIF* pwrSwitcher);
|
||||||
void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF);
|
void createSolarArrayDeploymentComponents(PowerSwitchIF& pwrSwitcher, GpioIF& gpioIF);
|
||||||
void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
|
void createSyrlinksComponents(PowerSwitchIF* pwrSwitcher);
|
||||||
void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher);
|
void createPayloadComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF& pwrSwitcher);
|
||||||
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
|
void createReactionWheelComponents(LinuxLibgpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher);
|
||||||
ReturnValue_t createCcsdsComponents(CcsdsComponentArgs& args);
|
ReturnValue_t createCcsdsComponents(CcsdsComponentArgs& args);
|
||||||
|
ReturnValue_t readFirmwareVersion();
|
||||||
void createMiscComponents();
|
void createMiscComponents();
|
||||||
|
|
||||||
void createTestComponents(LinuxLibgpioIF* gpioComIF);
|
void createTestComponents(LinuxLibgpioIF* gpioComIF);
|
@ -11,13 +11,13 @@
|
|||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/core/WatchdogHandler.h"
|
#include "bsp_q7s/core/WatchdogHandler.h"
|
||||||
#include "commonConfig.h"
|
#include "commonConfig.h"
|
||||||
#include "core/scheduling.h"
|
|
||||||
#include "fsfw/tasks/TaskFactory.h"
|
#include "fsfw/tasks/TaskFactory.h"
|
||||||
#include "fsfw/version.h"
|
#include "fsfw/version.h"
|
||||||
#include "mission/acs/defs.h"
|
#include "mission/acs/defs.h"
|
||||||
#include "mission/com/defs.h"
|
#include "mission/com/defs.h"
|
||||||
#include "mission/system/systemTree.h"
|
#include "mission/system/systemTree.h"
|
||||||
#include "q7sConfig.h"
|
#include "q7sConfig.h"
|
||||||
|
#include "scheduling.h"
|
||||||
#include "watchdog/definitions.h"
|
#include "watchdog/definitions.h"
|
||||||
|
|
||||||
static constexpr int OBSW_ALREADY_RUNNING = -2;
|
static constexpr int OBSW_ALREADY_RUNNING = -2;
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "OBSWConfig.h"
|
#include "OBSWConfig.h"
|
||||||
#include "bsp_q7s/core/ObjectFactory.h"
|
|
||||||
#include "fsfw/objectmanager/ObjectManager.h"
|
#include "fsfw/objectmanager/ObjectManager.h"
|
||||||
#include "fsfw/objectmanager/ObjectManagerIF.h"
|
#include "fsfw/objectmanager/ObjectManagerIF.h"
|
||||||
#include "fsfw/platform.h"
|
#include "fsfw/platform.h"
|
||||||
@ -21,6 +20,8 @@
|
|||||||
#include "mission/pollingSeqTables.h"
|
#include "mission/pollingSeqTables.h"
|
||||||
#include "mission/scheduling.h"
|
#include "mission/scheduling.h"
|
||||||
#include "mission/utility/InitMission.h"
|
#include "mission/utility/InitMission.h"
|
||||||
|
#include "objectFactory.h"
|
||||||
|
#include "q7sConfig.h"
|
||||||
|
|
||||||
/* This is configured for linux without CR */
|
/* This is configured for linux without CR */
|
||||||
#ifdef PLATFORM_UNIX
|
#ifdef PLATFORM_UNIX
|
||||||
@ -532,7 +533,15 @@ void scheduling::createPstTasks(TaskFactory& factory, TaskDeadlineMissedFunction
|
|||||||
FixedTimeslotTaskIF* i2cPst =
|
FixedTimeslotTaskIF* i2cPst =
|
||||||
factory.createFixedTimeslotTask("I2C_PS_PST", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.6,
|
factory.createFixedTimeslotTask("I2C_PS_PST", 60, PeriodicTaskIF::MINIMUM_STACK_SIZE * 4, 0.6,
|
||||||
missedDeadlineFunc, &RR_SCHEDULING);
|
missedDeadlineFunc, &RR_SCHEDULING);
|
||||||
result = pst::pstI2cProcessingSystem(i2cPst);
|
pst::TmpSchedConfig tmpSchedConf;
|
||||||
|
#if OBSW_Q7S_EM == 1
|
||||||
|
tmpSchedConf.scheduleTmpDev0 = true;
|
||||||
|
tmpSchedConf.scheduleTmpDev1 = true;
|
||||||
|
tmpSchedConf.schedulePlPcduDev0 = true;
|
||||||
|
tmpSchedConf.schedulePlPcduDev1 = true;
|
||||||
|
tmpSchedConf.scheduleIfBoardDev = true;
|
||||||
|
#endif
|
||||||
|
result = pst::pstI2c(tmpSchedConf, i2cPst);
|
||||||
if (result != returnvalue::OK) {
|
if (result != returnvalue::OK) {
|
||||||
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
if (result == FixedTimeslotTaskIF::SLOT_LIST_EMPTY) {
|
||||||
sif::warning << "scheduling::initTasks: I2C PST is empty" << std::endl;
|
sif::warning << "scheduling::initTasks: I2C PST is empty" << std::endl;
|
@ -129,7 +129,7 @@ ReturnValue_t Xadc::readValFromFile(const char* filename, T& val) {
|
|||||||
sif::warning << "Xadc::readValFromFile: Failed to open file " << filename << std::endl;
|
sif::warning << "Xadc::readValFromFile: Failed to open file " << filename << std::endl;
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
char valstring[MAX_STR_LENGTH] = "";
|
char valstring[MAX_STR_LENGTH]{};
|
||||||
char* returnVal = fgets(valstring, MAX_STR_LENGTH, fp);
|
char* returnVal = fgets(valstring, MAX_STR_LENGTH, fp);
|
||||||
if (returnVal == nullptr) {
|
if (returnVal == nullptr) {
|
||||||
sif::warning << "Xadc::readValFromFile: Failed to read string from file " << filename
|
sif::warning << "Xadc::readValFromFile: Failed to read string from file " << filename
|
||||||
@ -139,6 +139,11 @@ ReturnValue_t Xadc::readValFromFile(const char* filename, T& val) {
|
|||||||
}
|
}
|
||||||
std::istringstream valSstream(valstring);
|
std::istringstream valSstream(valstring);
|
||||||
valSstream >> val;
|
valSstream >> val;
|
||||||
|
if (valSstream.bad()) {
|
||||||
|
sif::warning << "Xadc: Conversion of value to target type failed" << std::endl;
|
||||||
|
fclose(fp);
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#include "CoreControllerDummy.h"
|
#include "CoreControllerDummy.h"
|
||||||
|
|
||||||
#include <bsp_q7s/core/CoreDefinitions.h>
|
#include <bsp_q7s/core/defs.h>
|
||||||
#include <objects/systemObjectList.h>
|
#include <objects/systemObjectList.h>
|
||||||
|
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
@ -7,15 +7,21 @@ using namespace returnvalue;
|
|||||||
Max31865Dummy::Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
Max31865Dummy::Max31865Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie), set(this, EiveMax31855::EXCHANGE_SET_ID) {}
|
: DeviceHandlerBase(objectId, comif, comCookie), set(this, EiveMax31855::EXCHANGE_SET_ID) {}
|
||||||
void Max31865Dummy::doStartUp() { setMode(MODE_ON); }
|
void Max31865Dummy::doStartUp() { setMode(MODE_ON); }
|
||||||
void Max31865Dummy::doShutDown() { setMode(_MODE_POWER_DOWN); }
|
void Max31865Dummy::doShutDown() {
|
||||||
|
PoolReadGuard pg(&set);
|
||||||
|
set.setValidity(false, true);
|
||||||
|
setMode(MODE_OFF);
|
||||||
|
}
|
||||||
ReturnValue_t Max31865Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t Max31865Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
ReturnValue_t Max31865Dummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) { return OK; }
|
ReturnValue_t Max31865Dummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
ReturnValue_t Max31865Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
ReturnValue_t Max31865Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
const uint8_t *commandData,
|
const uint8_t *commandData,
|
||||||
size_t commandDataLen) {
|
size_t commandDataLen) {
|
||||||
return 0;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
ReturnValue_t Max31865Dummy::scanForReply(const uint8_t *start, size_t len,
|
ReturnValue_t Max31865Dummy::scanForReply(const uint8_t *start, size_t len,
|
||||||
DeviceCommandId_t *foundId, size_t *foundLen) {
|
DeviceCommandId_t *foundId, size_t *foundLen) {
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
TemperatureSensorInserter::TemperatureSensorInserter(object_id_t objectId,
|
TemperatureSensorInserter::TemperatureSensorInserter(
|
||||||
Max31865DummyMap tempSensorDummies_,
|
object_id_t objectId, Max31865DummyMap tempSensorDummies_,
|
||||||
Tmp1075DummyMap tempTmpSensorDummies_)
|
std::optional<Tmp1075DummyMap> tempTmpSensorDummies_)
|
||||||
: SystemObject(objectId),
|
: SystemObject(objectId),
|
||||||
max31865DummyMap(std::move(tempSensorDummies_)),
|
max31865DummyMap(std::move(tempSensorDummies_)),
|
||||||
tmp1075DummyMap(std::move(tempTmpSensorDummies_)) {}
|
tmp1075DummyMap(std::move(tempTmpSensorDummies_)) {}
|
||||||
@ -25,8 +25,10 @@ ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) {
|
|||||||
for (auto& rtdDummy : max31865DummyMap) {
|
for (auto& rtdDummy : max31865DummyMap) {
|
||||||
rtdDummy.second->setTemperature(10, true);
|
rtdDummy.second->setTemperature(10, true);
|
||||||
}
|
}
|
||||||
for (auto& tmpDummy : tmp1075DummyMap) {
|
if (tmp1075DummyMap.has_value()) {
|
||||||
tmpDummy.second->setTemperature(10, true);
|
for (auto& tmpDummy : tmp1075DummyMap.value()) {
|
||||||
|
tmpDummy.second->setTemperature(10, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tempsWereInitialized = true;
|
tempsWereInitialized = true;
|
||||||
}
|
}
|
||||||
@ -124,6 +126,21 @@ ReturnValue_t TemperatureSensorInserter::performOperation(uint8_t opCode) {
|
|||||||
sif::debug << "Setting CAM temperature back to normal" << std::endl;
|
sif::debug << "Setting CAM temperature back to normal" << std::endl;
|
||||||
max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(0, true);
|
max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(0, true);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (TestCase::COLD_PLOC_STAYS_COLD): {
|
||||||
|
if (cycles == 15) {
|
||||||
|
sif::debug << "Setting cold PLOC temperature" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_0_IC3_PLOC_HEATSPREADER]->setTemperature(-40, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (TestCase::COLD_CAMERA_STAYS_COLD): {
|
||||||
|
if (cycles == 15) {
|
||||||
|
sif::debug << "Setting cold PLOC temperature" << std::endl;
|
||||||
|
max31865DummyMap[objects::RTD_2_IC5_4K_CAMERA]->setTemperature(-40, true);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cycles++;
|
cycles++;
|
||||||
|
@ -12,7 +12,7 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject
|
|||||||
using Max31865DummyMap = std::map<object_id_t, Max31865Dummy*>;
|
using Max31865DummyMap = std::map<object_id_t, Max31865Dummy*>;
|
||||||
using Tmp1075DummyMap = std::map<object_id_t, Tmp1075Dummy*>;
|
using Tmp1075DummyMap = std::map<object_id_t, Tmp1075Dummy*>;
|
||||||
explicit TemperatureSensorInserter(object_id_t objectId, Max31865DummyMap tempSensorDummies_,
|
explicit TemperatureSensorInserter(object_id_t objectId, Max31865DummyMap tempSensorDummies_,
|
||||||
Tmp1075DummyMap tempTmpSensorDummies_);
|
std::optional<Tmp1075DummyMap> tempTmpSensorDummies_);
|
||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
ReturnValue_t initializeAfterTaskCreation() override;
|
ReturnValue_t initializeAfterTaskCreation() override;
|
||||||
@ -22,7 +22,7 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Max31865DummyMap max31865DummyMap;
|
Max31865DummyMap max31865DummyMap;
|
||||||
Tmp1075DummyMap tmp1075DummyMap;
|
std::optional<Tmp1075DummyMap> tmp1075DummyMap;
|
||||||
|
|
||||||
enum TestCase {
|
enum TestCase {
|
||||||
NONE = 0,
|
NONE = 0,
|
||||||
@ -33,6 +33,8 @@ class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject
|
|||||||
COLD_STR_CONSECUTIVE = 5,
|
COLD_STR_CONSECUTIVE = 5,
|
||||||
COLD_CAMERA = 6,
|
COLD_CAMERA = 6,
|
||||||
COLD_PLOC_CONSECUTIVE = 7,
|
COLD_PLOC_CONSECUTIVE = 7,
|
||||||
|
COLD_PLOC_STAYS_COLD = 8,
|
||||||
|
COLD_CAMERA_STAYS_COLD = 9
|
||||||
};
|
};
|
||||||
int iteration = 0;
|
int iteration = 0;
|
||||||
uint32_t cycles = 0;
|
uint32_t cycles = 0;
|
||||||
|
@ -8,35 +8,57 @@ using namespace returnvalue;
|
|||||||
Tmp1075Dummy::Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
Tmp1075Dummy::Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
|
||||||
: DeviceHandlerBase(objectId, comif, comCookie), set(this) {}
|
: DeviceHandlerBase(objectId, comif, comCookie), set(this) {}
|
||||||
|
|
||||||
void Tmp1075Dummy::doStartUp() { setMode(MODE_NORMAL); }
|
void Tmp1075Dummy::doStartUp() { setMode(MODE_ON); }
|
||||||
void Tmp1075Dummy::doShutDown() { setMode(MODE_OFF); }
|
void Tmp1075Dummy::doShutDown() {
|
||||||
|
PoolReadGuard pg(&set);
|
||||||
|
set.setValidity(false, true);
|
||||||
|
setMode(MODE_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
ReturnValue_t Tmp1075Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
|
||||||
return NOTHING_TO_SEND;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
ReturnValue_t Tmp1075Dummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) { return OK; }
|
|
||||||
|
ReturnValue_t Tmp1075Dummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
|
||||||
|
return NOTHING_TO_SEND;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
ReturnValue_t Tmp1075Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||||
const uint8_t *commandData,
|
const uint8_t *commandData,
|
||||||
size_t commandDataLen) {
|
size_t commandDataLen) {
|
||||||
return 0;
|
return NOTHING_TO_SEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Dummy::scanForReply(const uint8_t *start, size_t len,
|
ReturnValue_t Tmp1075Dummy::scanForReply(const uint8_t *start, size_t len,
|
||||||
DeviceCommandId_t *foundId, size_t *foundLen) {
|
DeviceCommandId_t *foundId, size_t *foundLen) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
ReturnValue_t Tmp1075Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tmp1075Dummy::setTemperature(float temperature, bool valid) {
|
void Tmp1075Dummy::setTemperature(float temperature, bool valid) {
|
||||||
PoolReadGuard pg(&set);
|
PoolReadGuard pg(&set);
|
||||||
set.temperatureCelcius.value = temperature;
|
set.temperatureCelcius.value = temperature;
|
||||||
set.setValidity(valid, true);
|
set.setValidity(valid, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tmp1075Dummy::fillCommandAndReplyMap() {}
|
void Tmp1075Dummy::fillCommandAndReplyMap() {}
|
||||||
|
|
||||||
uint32_t Tmp1075Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; }
|
uint32_t Tmp1075Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; }
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t Tmp1075Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) {
|
LocalDataPoolManager &poolManager) {
|
||||||
localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry<float>({10.0}, true));
|
localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry<float>({10.0}, true));
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnValue_t Tmp1075Dummy::setHealth(HealthState health) {
|
||||||
|
if (health == FAULTY or health == PERMANENT_FAULTY) {
|
||||||
|
setMode(_MODE_SHUT_DOWN);
|
||||||
|
}
|
||||||
|
return DeviceHandlerBase::setHealth(health);
|
||||||
|
}
|
||||||
|
|
||||||
LocalPoolDataSetBase *Tmp1075Dummy::getDataSetHandle(sid_t sid) { return &set; }
|
LocalPoolDataSetBase *Tmp1075Dummy::getDataSetHandle(sid_t sid) { return &set; }
|
||||||
|
@ -26,6 +26,7 @@ class Tmp1075Dummy : public DeviceHandlerBase {
|
|||||||
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
||||||
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||||
LocalDataPoolManager &poolManager) override;
|
LocalDataPoolManager &poolManager) override;
|
||||||
|
ReturnValue_t setHealth(HealthState health) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
LocalPoolDataSetBase *getDataSetHandle(sid_t sid) override;
|
LocalPoolDataSetBase *getDataSetHandle(sid_t sid) override;
|
||||||
|
@ -194,25 +194,36 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio
|
|||||||
objects::RTD_15_IC18_IMTQ,
|
objects::RTD_15_IC18_IMTQ,
|
||||||
new Max31865Dummy(objects::RTD_15_IC18_IMTQ, objects::DUMMY_COM_IF, comCookieDummy));
|
new Max31865Dummy(objects::RTD_15_IC18_IMTQ, objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
|
||||||
std::map<object_id_t, Tmp1075Dummy*> tmpSensorDummies;
|
std::optional<TemperatureSensorInserter::Tmp1075DummyMap> tmpSensorDummies;
|
||||||
tmpSensorDummies.emplace(
|
if (cfg.addTmpDummies) {
|
||||||
objects::TMP1075_HANDLER_TCS_0,
|
TemperatureSensorInserter::Tmp1075DummyMap tmpDummyMap;
|
||||||
new Tmp1075Dummy(objects::TMP1075_HANDLER_TCS_0, objects::DUMMY_COM_IF, comCookieDummy));
|
if (cfg.tmp1075Cfg.addTcsBrd0) {
|
||||||
tmpSensorDummies.emplace(
|
tmpDummyMap.emplace(objects::TMP1075_HANDLER_TCS_0,
|
||||||
objects::TMP1075_HANDLER_TCS_1,
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_TCS_0, objects::DUMMY_COM_IF,
|
||||||
new Tmp1075Dummy(objects::TMP1075_HANDLER_TCS_1, objects::DUMMY_COM_IF, comCookieDummy));
|
comCookieDummy));
|
||||||
tmpSensorDummies.emplace(
|
}
|
||||||
objects::TMP1075_HANDLER_PLPCDU_0,
|
if (cfg.tmp1075Cfg.addTcsBrd1) {
|
||||||
new Tmp1075Dummy(objects::TMP1075_HANDLER_PLPCDU_0, objects::DUMMY_COM_IF, comCookieDummy));
|
tmpDummyMap.emplace(objects::TMP1075_HANDLER_TCS_1,
|
||||||
// damaged.
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_TCS_1, objects::DUMMY_COM_IF,
|
||||||
// tmpSensorDummies.emplace(
|
comCookieDummy));
|
||||||
// objects::TMP1075_HANDLER_PLPCDU_1,
|
}
|
||||||
// new Tmp1075Dummy(objects::TMP1075_HANDLER_PLPCDU_1, objects::DUMMY_COM_IF,
|
if (cfg.tmp1075Cfg.addPlPcdu0) {
|
||||||
// comCookieDummy));
|
tmpDummyMap.emplace(objects::TMP1075_HANDLER_PLPCDU_0,
|
||||||
tmpSensorDummies.emplace(
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_PLPCDU_0,
|
||||||
objects::TMP1075_HANDLER_IF_BOARD,
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
new Tmp1075Dummy(objects::TMP1075_HANDLER_IF_BOARD, objects::DUMMY_COM_IF, comCookieDummy));
|
}
|
||||||
|
if (cfg.tmp1075Cfg.addPlPcdu1) {
|
||||||
|
tmpDummyMap.emplace(objects::TMP1075_HANDLER_PLPCDU_1,
|
||||||
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_PLPCDU_1,
|
||||||
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
}
|
||||||
|
if (cfg.tmp1075Cfg.addIfBrd) {
|
||||||
|
tmpDummyMap.emplace(objects::TMP1075_HANDLER_IF_BOARD,
|
||||||
|
new Tmp1075Dummy(objects::TMP1075_HANDLER_IF_BOARD,
|
||||||
|
objects::DUMMY_COM_IF, comCookieDummy));
|
||||||
|
}
|
||||||
|
tmpSensorDummies = std::move(tmpDummyMap);
|
||||||
|
}
|
||||||
new TemperatureSensorInserter(objects::THERMAL_TEMP_INSERTER, rtdSensorDummies,
|
new TemperatureSensorInserter(objects::THERMAL_TEMP_INSERTER, rtdSensorDummies,
|
||||||
tmpSensorDummies);
|
tmpSensorDummies);
|
||||||
TcsBoardAssembly* tcsBoardAssy =
|
TcsBoardAssembly* tcsBoardAssy =
|
||||||
@ -220,8 +231,10 @@ void dummy::createDummies(DummyCfg cfg, PowerSwitchIF& pwrSwitcher, GpioIF* gpio
|
|||||||
for (auto& rtd : rtdSensorDummies) {
|
for (auto& rtd : rtdSensorDummies) {
|
||||||
rtd.second->connectModeTreeParent(*tcsBoardAssy);
|
rtd.second->connectModeTreeParent(*tcsBoardAssy);
|
||||||
}
|
}
|
||||||
for (auto& tmp : tmpSensorDummies) {
|
if (tmpSensorDummies.has_value()) {
|
||||||
tmp.second->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
for (auto& tmp : tmpSensorDummies.value()) {
|
||||||
|
tmp.second->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (cfg.addCamSwitcherDummy) {
|
if (cfg.addCamSwitcherDummy) {
|
||||||
|
@ -6,6 +6,14 @@ class GpioIF;
|
|||||||
|
|
||||||
namespace dummy {
|
namespace dummy {
|
||||||
|
|
||||||
|
struct Tmp1075Cfg {
|
||||||
|
bool addTcsBrd0 = true;
|
||||||
|
bool addTcsBrd1 = true;
|
||||||
|
bool addPlPcdu0 = true;
|
||||||
|
bool addPlPcdu1 = true;
|
||||||
|
bool addIfBrd = true;
|
||||||
|
};
|
||||||
|
|
||||||
// Default values targeted towards EM.
|
// Default values targeted towards EM.
|
||||||
struct DummyCfg {
|
struct DummyCfg {
|
||||||
bool addCoreCtrlCfg = true;
|
bool addCoreCtrlCfg = true;
|
||||||
@ -20,6 +28,8 @@ struct DummyCfg {
|
|||||||
bool addRtdComIFDummy = true;
|
bool addRtdComIFDummy = true;
|
||||||
bool addPlocDummies = true;
|
bool addPlocDummies = true;
|
||||||
bool addStrDummy = true;
|
bool addStrDummy = true;
|
||||||
|
bool addTmpDummies = true;
|
||||||
|
Tmp1075Cfg tmp1075Cfg;
|
||||||
bool addCamSwitcherDummy = false;
|
bool addCamSwitcherDummy = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
2
fsfw
2
fsfw
@ -1 +1 @@
|
|||||||
Subproject commit 8da89eba80f73cb05e5c38fc012456f1d9569af5
|
Subproject commit 88e8665280a0381c41b724ab035a8c3eff1a23c1
|
@ -280,6 +280,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
14106;0x371a;PCDU_SYSTEM_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
|
14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||||
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||||
|
14109;0x371d;TCS_SWITCHING_HEATER_ON;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
|
||||||
|
14110;0x371e;TCS_SWITCHING_HEATER_OFF;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
|
||||||
|
14111;0x371f;TCS_HEATER_MAX_BURN_TIME_REACHED;MEDIUM;P1: Heater index. P2: Maximum burn time for heater.;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
|
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
|
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
|
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
|
||||||
|
|
@ -280,6 +280,9 @@ Event ID (dec); Event ID (hex); Name; Severity; Description; File Path
|
|||||||
14106;0x371a;PCDU_SYSTEM_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
|
14107;0x371b;HEATER_NOT_OFF_FOR_OFF_MODE;MEDIUM;No description;mission/controller/tcsDefs.h
|
||||||
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
14108;0x371c;MGT_OVERHEATING;HIGH;No description;mission/controller/tcsDefs.h
|
||||||
|
14109;0x371d;TCS_SWITCHING_HEATER_ON;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
|
||||||
|
14110;0x371e;TCS_SWITCHING_HEATER_OFF;INFO;P1: Module index. P2: Heater index;mission/controller/tcsDefs.h
|
||||||
|
14111;0x371f;TCS_HEATER_MAX_BURN_TIME_REACHED;MEDIUM;P1: Heater index. P2: Maximum burn time for heater.;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
|
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
|
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
|
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
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 296 translations.
|
* @brief Auto-generated event translation file. Contains 299 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-06-21 19:01:02
|
* Generated on: 2023-07-07 12:06:06
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -286,6 +286,9 @@ const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING";
|
|||||||
const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_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 *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE";
|
||||||
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
||||||
|
const char *TCS_SWITCHING_HEATER_ON_STRING = "TCS_SWITCHING_HEATER_ON";
|
||||||
|
const char *TCS_SWITCHING_HEATER_OFF_STRING = "TCS_SWITCHING_HEATER_OFF";
|
||||||
|
const char *TCS_HEATER_MAX_BURN_TIME_REACHED_STRING = "TCS_HEATER_MAX_BURN_TIME_REACHED";
|
||||||
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
||||||
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
||||||
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
||||||
@ -866,6 +869,12 @@ const char *translateEvents(Event event) {
|
|||||||
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
||||||
case (14108):
|
case (14108):
|
||||||
return MGT_OVERHEATING_STRING;
|
return MGT_OVERHEATING_STRING;
|
||||||
|
case (14109):
|
||||||
|
return TCS_SWITCHING_HEATER_ON_STRING;
|
||||||
|
case (14110):
|
||||||
|
return TCS_SWITCHING_HEATER_OFF_STRING;
|
||||||
|
case (14111):
|
||||||
|
return TCS_HEATER_MAX_BURN_TIME_REACHED_STRING;
|
||||||
case (14201):
|
case (14201):
|
||||||
return TX_TIMER_EXPIRED_STRING;
|
return TX_TIMER_EXPIRED_STRING;
|
||||||
case (14202):
|
case (14202):
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 175 translations.
|
* Contains 175 translations.
|
||||||
* Generated on: 2023-06-21 19:01:02
|
* Generated on: 2023-07-07 12:06:06
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Auto-generated event translation file. Contains 296 translations.
|
* @brief Auto-generated event translation file. Contains 299 translations.
|
||||||
* @details
|
* @details
|
||||||
* Generated on: 2023-06-21 19:01:02
|
* Generated on: 2023-07-07 12:06:06
|
||||||
*/
|
*/
|
||||||
#include "translateEvents.h"
|
#include "translateEvents.h"
|
||||||
|
|
||||||
@ -286,6 +286,9 @@ const char *CAMERA_OVERHEATING_STRING = "CAMERA_OVERHEATING";
|
|||||||
const char *PCDU_SYSTEM_OVERHEATING_STRING = "PCDU_SYSTEM_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 *HEATER_NOT_OFF_FOR_OFF_MODE_STRING = "HEATER_NOT_OFF_FOR_OFF_MODE";
|
||||||
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
const char *MGT_OVERHEATING_STRING = "MGT_OVERHEATING";
|
||||||
|
const char *TCS_SWITCHING_HEATER_ON_STRING = "TCS_SWITCHING_HEATER_ON";
|
||||||
|
const char *TCS_SWITCHING_HEATER_OFF_STRING = "TCS_SWITCHING_HEATER_OFF";
|
||||||
|
const char *TCS_HEATER_MAX_BURN_TIME_REACHED_STRING = "TCS_HEATER_MAX_BURN_TIME_REACHED";
|
||||||
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
const char *TX_TIMER_EXPIRED_STRING = "TX_TIMER_EXPIRED";
|
||||||
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
const char *BIT_LOCK_TX_ON_STRING = "BIT_LOCK_TX_ON";
|
||||||
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
const char *POSSIBLE_FILE_CORRUPTION_STRING = "POSSIBLE_FILE_CORRUPTION";
|
||||||
@ -866,6 +869,12 @@ const char *translateEvents(Event event) {
|
|||||||
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
return HEATER_NOT_OFF_FOR_OFF_MODE_STRING;
|
||||||
case (14108):
|
case (14108):
|
||||||
return MGT_OVERHEATING_STRING;
|
return MGT_OVERHEATING_STRING;
|
||||||
|
case (14109):
|
||||||
|
return TCS_SWITCHING_HEATER_ON_STRING;
|
||||||
|
case (14110):
|
||||||
|
return TCS_SWITCHING_HEATER_OFF_STRING;
|
||||||
|
case (14111):
|
||||||
|
return TCS_HEATER_MAX_BURN_TIME_REACHED_STRING;
|
||||||
case (14201):
|
case (14201):
|
||||||
return TX_TIMER_EXPIRED_STRING;
|
return TX_TIMER_EXPIRED_STRING;
|
||||||
case (14202):
|
case (14202):
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
* @brief Auto-generated object translation file.
|
* @brief Auto-generated object translation file.
|
||||||
* @details
|
* @details
|
||||||
* Contains 175 translations.
|
* Contains 175 translations.
|
||||||
* Generated on: 2023-06-21 19:01:02
|
* Generated on: 2023-07-07 12:06:06
|
||||||
*/
|
*/
|
||||||
#include "translateObjects.h"
|
#include "translateObjects.h"
|
||||||
|
|
||||||
|
@ -33,10 +33,21 @@ ReturnValue_t PapbVcInterface::write(const uint8_t* data, size_t size) {
|
|||||||
} else {
|
} else {
|
||||||
return DirectTmSinkIF::IS_BUSY;
|
return DirectTmSinkIF::IS_BUSY;
|
||||||
}
|
}
|
||||||
|
if (not pollReadyForOctet(MAX_BUSY_POLLS)) {
|
||||||
|
abortPacketTransfer();
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
for (size_t idx = 0; idx < size; idx++) {
|
for (size_t idx = 0; idx < size; idx++) {
|
||||||
// if (pollInterfaceReadiness(2, false) == returnvalue::OK) {
|
if (not pollReadyForOctet(MAX_BUSY_POLLS)) {
|
||||||
|
abortPacketTransfer();
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
*(vcBaseReg + DATA_REG_OFFSET) = static_cast<uint32_t>(data[idx]);
|
*(vcBaseReg + DATA_REG_OFFSET) = static_cast<uint32_t>(data[idx]);
|
||||||
}
|
}
|
||||||
|
if (not pollReadyForOctet(MAX_BUSY_POLLS)) {
|
||||||
|
abortPacketTransfer();
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
completePacketTransfer();
|
completePacketTransfer();
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
@ -51,7 +62,6 @@ bool PapbVcInterface::pollReadyForPacket() const {
|
|||||||
// Check if PAPB interface is ready to receive data. Use the configuration register for this.
|
// 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.
|
// Bit 5, see PTME ptme_001_01-0-7-r2 Table 31.
|
||||||
uint32_t reg = *vcBaseReg;
|
uint32_t reg = *vcBaseReg;
|
||||||
// bool busy = (reg >> 5) & 0b1;
|
|
||||||
return (reg >> 6) & 0b1;
|
return (reg >> 6) & 0b1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +87,20 @@ bool PapbVcInterface::isBusy() const { return not pollReadyForPacket(); }
|
|||||||
|
|
||||||
void PapbVcInterface::cancelTransfer() { abortPacketTransfer(); }
|
void PapbVcInterface::cancelTransfer() { abortPacketTransfer(); }
|
||||||
|
|
||||||
|
inline bool PapbVcInterface::pollReadyForOctet(uint32_t maxCycles) const {
|
||||||
|
uint32_t reg;
|
||||||
|
uint32_t idx = 0;
|
||||||
|
while (idx < maxCycles) {
|
||||||
|
reg = *vcBaseReg;
|
||||||
|
// Busy bit.
|
||||||
|
if (not((reg >> 5) & 0b1)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t PapbVcInterface::sendTestFrame() {
|
ReturnValue_t PapbVcInterface::sendTestFrame() {
|
||||||
/** Size of one complete transfer frame data field amounts to 1105 bytes */
|
/** Size of one complete transfer frame data field amounts to 1105 bytes */
|
||||||
uint8_t testPacket[1105];
|
uint8_t testPacket[1105];
|
||||||
|
@ -80,6 +80,7 @@ class PapbVcInterface : public VirtualChannelIF {
|
|||||||
|
|
||||||
static constexpr long int FIRST_DELAY_PAPB_POLLING_NS = 10;
|
static constexpr long int FIRST_DELAY_PAPB_POLLING_NS = 10;
|
||||||
static constexpr long int MAX_DELAY_PAPB_POLLING_NS = 40;
|
static constexpr long int MAX_DELAY_PAPB_POLLING_NS = 40;
|
||||||
|
static constexpr uint32_t MAX_BUSY_POLLS = 1000;
|
||||||
|
|
||||||
LinuxLibgpioIF* gpioComIF = nullptr;
|
LinuxLibgpioIF* gpioComIF = nullptr;
|
||||||
/** High when external buffer memory of virtual channel is empty */
|
/** High when external buffer memory of virtual channel is empty */
|
||||||
@ -118,6 +119,8 @@ class PapbVcInterface : public VirtualChannelIF {
|
|||||||
*/
|
*/
|
||||||
inline bool pollReadyForPacket() const;
|
inline bool pollReadyForPacket() const;
|
||||||
|
|
||||||
|
inline bool pollReadyForOctet(uint32_t maxCycles) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function can be used for debugging to check whether there are packets in
|
* @brief This function can be used for debugging to check whether there are packets in
|
||||||
* the packet buffer of the virtual channel or not.
|
* the packet buffer of the virtual channel or not.
|
||||||
|
@ -19,13 +19,8 @@ LiveTmTask::LiveTmTask(object_id_t objectId, PusTmFunnel& pusFunnel, CfdpTmFunne
|
|||||||
ReturnValue_t LiveTmTask::performOperation(uint8_t opCode) {
|
ReturnValue_t LiveTmTask::performOperation(uint8_t opCode) {
|
||||||
readCommandQueue();
|
readCommandQueue();
|
||||||
while (true) {
|
while (true) {
|
||||||
bool performWriteOp = true;
|
|
||||||
if (mode == MODE_OFF or ptmeLocked) {
|
|
||||||
performWriteOp = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The funnel tasks are scheduled here directly as well.
|
// The funnel tasks are scheduled here directly as well.
|
||||||
ReturnValue_t result = channel.handleNextTm(performWriteOp);
|
ReturnValue_t result = channel.handleNextTm(!ptmeLocked);
|
||||||
if (result == DirectTmSinkIF::IS_BUSY) {
|
if (result == DirectTmSinkIF::IS_BUSY) {
|
||||||
sif::error << "Lost live TM, PAPB busy" << std::endl;
|
sif::error << "Lost live TM, PAPB busy" << std::endl;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
|||||||
#ifndef MISSION_CONTROLLER_THERMALCONTROLLER_H_
|
#ifndef MISSION_CONTROLLER_THERMALCONTROLLER_H_
|
||||||
#define MISSION_CONTROLLER_THERMALCONTROLLER_H_
|
#define MISSION_CONTROLLER_THERMALCONTROLLER_H_
|
||||||
|
|
||||||
#include <bsp_q7s/core/CoreDefinitions.h>
|
#include <bsp_q7s/core/defs.h>
|
||||||
#include <fsfw/controller/ExtendedControllerBase.h>
|
#include <fsfw/controller/ExtendedControllerBase.h>
|
||||||
#include <fsfw/devicehandlers/DeviceHandlerThermalSet.h>
|
#include <fsfw/devicehandlers/DeviceHandlerThermalSet.h>
|
||||||
#include <fsfw/timemanager/Countdown.h>
|
#include <fsfw/timemanager/Countdown.h>
|
||||||
@ -24,74 +24,7 @@
|
|||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <optional>
|
||||||
/**
|
|
||||||
* NOP Limit: Hard limit for device, usually from datasheet. Device damage is possible lif NOP limit
|
|
||||||
* is exceeded.
|
|
||||||
* OP Limit: Soft limit. Device should be switched off or TCS controller should take action if the
|
|
||||||
* limit is exceeded to avoid reaching NOP limit
|
|
||||||
*/
|
|
||||||
struct TempLimits {
|
|
||||||
TempLimits(float nopLowerLimit, float opLowerLimit, float cutOffLimit, float opUpperLimit,
|
|
||||||
float nopUpperLimit)
|
|
||||||
: opLowerLimit(opLowerLimit),
|
|
||||||
opUpperLimit(opUpperLimit),
|
|
||||||
cutOffLimit(cutOffLimit),
|
|
||||||
nopLowerLimit(nopLowerLimit),
|
|
||||||
nopUpperLimit(nopUpperLimit) {}
|
|
||||||
float opLowerLimit;
|
|
||||||
float opUpperLimit;
|
|
||||||
float cutOffLimit;
|
|
||||||
float nopLowerLimit;
|
|
||||||
float nopUpperLimit;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ThermalState {
|
|
||||||
uint8_t errorCounter;
|
|
||||||
// Is heating on for that thermal module?
|
|
||||||
bool heating = false;
|
|
||||||
heater::Switch heaterSwitch = heater::Switch::NUMBER_OF_SWITCHES;
|
|
||||||
// Heater start time and end times as UNIX seconds. Please note that these times will be updated
|
|
||||||
// when a switch command is sent, with no guarantess that the heater actually went on.
|
|
||||||
uint32_t heaterStartTime = 0;
|
|
||||||
uint32_t heaterEndTime = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct HeaterState {
|
|
||||||
bool switchTransition;
|
|
||||||
HeaterHandler::SwitchState target;
|
|
||||||
uint8_t heaterSwitchControlCycles;
|
|
||||||
};
|
|
||||||
|
|
||||||
using HeaterSwitchStates = std::array<HeaterHandler::SwitchState, heater::NUMBER_OF_SWITCHES>;
|
|
||||||
|
|
||||||
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 {
|
class ThermalController : public ExtendedControllerBase {
|
||||||
public:
|
public:
|
||||||
@ -102,8 +35,28 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
static constexpr int16_t SANITY_LIMIT_LOWER_TEMP = -80;
|
static constexpr int16_t SANITY_LIMIT_LOWER_TEMP = -80;
|
||||||
static constexpr int16_t SANITY_LIMIT_UPPER_TEMP = 160;
|
static constexpr int16_t SANITY_LIMIT_UPPER_TEMP = 160;
|
||||||
|
|
||||||
|
// 1 hour
|
||||||
|
static constexpr uint32_t DEFAULT_MAX_HEATER_ON_DURATION_MS = 60 * 60 * 1000;
|
||||||
|
static constexpr uint32_t MAX_HEATER_ON_DURATIONS_MS[8] = {// PLOC PROC board
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// PCDU PDU
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// ACS Board
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// OBC Board
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// Camera
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// STR
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// DRO
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS,
|
||||||
|
// S-Band
|
||||||
|
DEFAULT_MAX_HEATER_ON_DURATION_MS};
|
||||||
|
|
||||||
ThermalController(object_id_t objectId, HeaterHandler& heater,
|
ThermalController(object_id_t objectId, HeaterHandler& heater,
|
||||||
const std::atomic_bool& tcsBoardShortUnavailable);
|
const std::atomic_bool& tcsBoardShortUnavailable, bool pollPcdu1Tmp);
|
||||||
|
virtual ~ThermalController();
|
||||||
|
|
||||||
ReturnValue_t initialize() override;
|
ReturnValue_t initialize() override;
|
||||||
|
|
||||||
@ -111,16 +64,16 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
struct HeaterContext {
|
struct HeaterContext {
|
||||||
public:
|
public:
|
||||||
HeaterContext(heater::Switch switchNr, heater::Switch redundantSwitchNr,
|
HeaterContext(heater::Switch switchNr, heater::Switch redundantSwitchNr,
|
||||||
const TempLimits& tempLimit)
|
const tcsCtrl::TempLimits& tempLimit)
|
||||||
: switchNr(switchNr), redSwitchNr(redundantSwitchNr), tempLimit(tempLimit) {}
|
: switchNr(switchNr), redSwitchNr(redundantSwitchNr), tempLimit(tempLimit) {}
|
||||||
bool doHeaterHandling = true;
|
bool doHeaterHandling = true;
|
||||||
heater::Switch switchNr;
|
heater::Switch switchNr;
|
||||||
HeaterHandler::SwitchState switchState = HeaterHandler::SwitchState::OFF;
|
heater::SwitchState switchState = heater::SwitchState::OFF;
|
||||||
heater::Switch redSwitchNr;
|
heater::Switch redSwitchNr;
|
||||||
const TempLimits& tempLimit;
|
const tcsCtrl::TempLimits& tempLimit;
|
||||||
};
|
};
|
||||||
|
|
||||||
void performThermalModuleCtrl(const HeaterSwitchStates& heaterSwitchStates);
|
void performThermalModuleCtrl(const tcsCtrl::HeaterSwitchStates& heaterSwitchStates);
|
||||||
ReturnValue_t handleCommandMessage(CommandMessage* message) override;
|
ReturnValue_t handleCommandMessage(CommandMessage* message) override;
|
||||||
void performControlOperation() override;
|
void performControlOperation() override;
|
||||||
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||||
@ -142,12 +95,12 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
|
|
||||||
HeaterHandler& heaterHandler;
|
HeaterHandler& heaterHandler;
|
||||||
|
|
||||||
|
bool pollPcdu1Tmp;
|
||||||
tcsCtrl::SensorTemperatures sensorTemperatures;
|
tcsCtrl::SensorTemperatures sensorTemperatures;
|
||||||
tcsCtrl::SusTemperatures susTemperatures;
|
tcsCtrl::SusTemperatures susTemperatures;
|
||||||
tcsCtrl::DeviceTemperatures deviceTemperatures;
|
tcsCtrl::DeviceTemperatures deviceTemperatures;
|
||||||
tcsCtrl::HeaterInfo heaterInfo;
|
tcsCtrl::HeaterInfo heaterInfo;
|
||||||
lp_vec_t<int16_t, 9> currentVecPdu2 =
|
tcsCtrl::TcsCtrlInfo tcsCtrlInfo;
|
||||||
lp_vec_t<int16_t, 9>(gp_id_t(objects::PDU2_HANDLER, PDU::pool::PDU_CURRENTS));
|
|
||||||
|
|
||||||
DeviceHandlerThermalSet imtqThermalSet;
|
DeviceHandlerThermalSet imtqThermalSet;
|
||||||
|
|
||||||
@ -173,7 +126,7 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
TMP1075::Tmp1075Dataset tmp1075SetTcs1;
|
TMP1075::Tmp1075Dataset tmp1075SetTcs1;
|
||||||
TMP1075::Tmp1075Dataset tmp1075SetPlPcdu0;
|
TMP1075::Tmp1075Dataset tmp1075SetPlPcdu0;
|
||||||
// damaged
|
// damaged
|
||||||
// TMP1075::Tmp1075Dataset tmp1075SetPlPcdu1;
|
TMP1075::Tmp1075Dataset* tmp1075SetPlPcdu1;
|
||||||
TMP1075::Tmp1075Dataset tmp1075SetIfBoard;
|
TMP1075::Tmp1075Dataset tmp1075SetIfBoard;
|
||||||
|
|
||||||
// SUS
|
// SUS
|
||||||
@ -227,57 +180,67 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
lp_var_t<float> tempMgm2 =
|
lp_var_t<float> tempMgm2 =
|
||||||
lp_var_t<float>(objects::MGM_2_LIS3_HANDLER, mgmLis3::TEMPERATURE_CELCIUS);
|
lp_var_t<float>(objects::MGM_2_LIS3_HANDLER, mgmLis3::TEMPERATURE_CELCIUS);
|
||||||
lp_var_t<float> tempAdcPayloadPcdu = lp_var_t<float>(objects::PLPCDU_HANDLER, plpcdu::TEMP);
|
lp_var_t<float> tempAdcPayloadPcdu = lp_var_t<float>(objects::PLPCDU_HANDLER, plpcdu::TEMP);
|
||||||
|
lp_vec_t<int16_t, 9> currentVecPdu2 =
|
||||||
|
lp_vec_t<int16_t, 9>(gp_id_t(objects::PDU2_HANDLER, PDU::pool::PDU_CURRENTS));
|
||||||
|
|
||||||
// TempLimits
|
// TempLimits
|
||||||
TempLimits acsBoardLimits = TempLimits(-40.0, -40.0, 80.0, 85.0, 85.0);
|
tcsCtrl::TempLimits acsBoardLimits = tcsCtrl::TempLimits(-40.0, -40.0, 80.0, 85.0, 85.0);
|
||||||
TempLimits mgtLimits = TempLimits(-40.0, -40.0, 65.0, 70.0, 70.0);
|
tcsCtrl::TempLimits mgtLimits = tcsCtrl::TempLimits(-40.0, -40.0, 65.0, 70.0, 70.0);
|
||||||
TempLimits rwLimits = TempLimits(-40.0, -40.0, 80.0, 85.0, 85.0);
|
tcsCtrl::TempLimits rwLimits = tcsCtrl::TempLimits(-40.0, -40.0, 80.0, 85.0, 85.0);
|
||||||
TempLimits strLimits = TempLimits(-30.0, -20.0, 65.0, 70.0, 80.0);
|
tcsCtrl::TempLimits strLimits = tcsCtrl::TempLimits(-30.0, -20.0, 65.0, 70.0, 80.0);
|
||||||
TempLimits ifBoardLimits = TempLimits(-65.0, -40.0, 80.0, 85.0, 150.0);
|
tcsCtrl::TempLimits ifBoardLimits = tcsCtrl::TempLimits(-65.0, -40.0, 80.0, 85.0, 150.0);
|
||||||
TempLimits tcsBoardLimits = TempLimits(-60.0, -40.0, 80.0, 85.0, 130.0);
|
tcsCtrl::TempLimits tcsBoardLimits = tcsCtrl::TempLimits(-60.0, -40.0, 80.0, 85.0, 130.0);
|
||||||
TempLimits obcLimits = TempLimits(-40.0, -40.0, 80.0, 85.0, 85.0);
|
tcsCtrl::TempLimits obcLimits = tcsCtrl::TempLimits(-40.0, -40.0, 80.0, 85.0, 85.0);
|
||||||
TempLimits obcIfBoardLimits = TempLimits(-65.0, -40.0, 80.0, 85.0, 125.0);
|
tcsCtrl::TempLimits obcIfBoardLimits = tcsCtrl::TempLimits(-65.0, -40.0, 80.0, 85.0, 125.0);
|
||||||
TempLimits sBandTransceiverLimits = TempLimits(-40.0, -25.0, 35.0, 40.0, 65.0);
|
tcsCtrl::TempLimits sBandTransceiverLimits = tcsCtrl::TempLimits(-40.0, -25.0, 35.0, 40.0, 65.0);
|
||||||
TempLimits pcduP60BoardLimits = TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
|
tcsCtrl::TempLimits pcduP60BoardLimits = tcsCtrl::TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
|
||||||
TempLimits pcduAcuLimits = TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
|
tcsCtrl::TempLimits pcduAcuLimits = tcsCtrl::TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
|
||||||
TempLimits pcduPduLimits = TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
|
tcsCtrl::TempLimits pcduPduLimits = tcsCtrl::TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
|
||||||
TempLimits plPcduBoardLimits = TempLimits(-55.0, -40.0, 80.0, 85.0, 125.0);
|
tcsCtrl::TempLimits plPcduBoardLimits = tcsCtrl::TempLimits(-55.0, -40.0, 80.0, 85.0, 125.0);
|
||||||
TempLimits plocMissionBoardLimits = TempLimits(-30.0, -10.0, 40.0, 45.0, 60);
|
tcsCtrl::TempLimits plocMissionBoardLimits = tcsCtrl::TempLimits(-30.0, -10.0, 40.0, 45.0, 60);
|
||||||
TempLimits plocProcessingBoardLimits = TempLimits(-30.0, -10.0, 40.0, 45.0, 60.0);
|
tcsCtrl::TempLimits plocProcessingBoardLimits =
|
||||||
TempLimits dacLimits = TempLimits(-65.0, -40.0, 113.0, 118.0, 150.0);
|
tcsCtrl::TempLimits(-30.0, -10.0, 40.0, 45.0, 60.0);
|
||||||
TempLimits cameraLimits = TempLimits(-40.0, -30.0, 60.0, 65.0, 85.0);
|
tcsCtrl::TempLimits dacLimits = tcsCtrl::TempLimits(-65.0, -40.0, 113.0, 118.0, 150.0);
|
||||||
TempLimits droLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
tcsCtrl::TempLimits cameraLimits = tcsCtrl::TempLimits(-40.0, -30.0, 60.0, 65.0, 85.0);
|
||||||
TempLimits x8Limits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
tcsCtrl::TempLimits droLimits = tcsCtrl::TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
||||||
TempLimits hpaLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
tcsCtrl::TempLimits x8Limits = tcsCtrl::TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
||||||
TempLimits txLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
tcsCtrl::TempLimits hpaLimits = tcsCtrl::TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
||||||
TempLimits mpaLimits = TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
tcsCtrl::TempLimits txLimits = tcsCtrl::TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
||||||
TempLimits scexBoardLimits = TempLimits(-60.0, -40.0, 80.0, 85.0, 150.0);
|
tcsCtrl::TempLimits mpaLimits = tcsCtrl::TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);
|
||||||
|
tcsCtrl::TempLimits scexBoardLimits = tcsCtrl::TempLimits(-60.0, -40.0, 80.0, 85.0, 150.0);
|
||||||
|
|
||||||
|
struct CtrlContext {
|
||||||
|
double sensorTemp = INVALID_TEMPERATURE;
|
||||||
|
uint8_t currentSensorIndex = 0;
|
||||||
|
tcsCtrl::ThermalComponents thermalComponent = tcsCtrl::NONE;
|
||||||
|
bool redSwitchNrInUse = false;
|
||||||
|
bool componentAboveCutOffLimit = false;
|
||||||
|
bool componentAboveUpperLimit = false;
|
||||||
|
Event overHeatEventToTrigger;
|
||||||
|
} ctrlCtx;
|
||||||
|
|
||||||
double sensorTemp = INVALID_TEMPERATURE;
|
|
||||||
ThermalComponents thermalComponent = NONE;
|
|
||||||
bool redSwitchNrInUse = false;
|
|
||||||
MessageQueueId_t camId = MessageQueueIF::NO_QUEUE;
|
MessageQueueId_t camId = MessageQueueIF::NO_QUEUE;
|
||||||
bool componentAboveCutOffLimit = false;
|
|
||||||
bool componentAboveUpperLimit = false;
|
struct TooHotFlags {
|
||||||
Event overHeatEventToTrigger;
|
bool eBandTooHotFlag = false;
|
||||||
bool eBandTooHotFlag = false;
|
bool camTooHotOneShotFlag = false;
|
||||||
bool camTooHotOneShotFlag = false;
|
bool scexTooHotFlag = false;
|
||||||
bool scexTooHotFlag = false;
|
bool plocTooHotFlag = false;
|
||||||
bool plocTooHotFlag = false;
|
bool pcduSystemTooHotFlag = false;
|
||||||
bool pcduSystemTooHotFlag = false;
|
bool syrlinksTooHotFlag = false;
|
||||||
bool syrlinksTooHotFlag = false;
|
bool obcTooHotFlag = false;
|
||||||
bool obcTooHotFlag = false;
|
bool mgtTooHotFlag = false;
|
||||||
bool mgtTooHotFlag = false;
|
bool strTooHotFlag = false;
|
||||||
bool strTooHotFlag = false;
|
bool rwTooHotFlag = false;
|
||||||
bool rwTooHotFlag = false;
|
} tooHotFlags;
|
||||||
|
|
||||||
bool transitionWhenHeatersOff = false;
|
bool transitionWhenHeatersOff = false;
|
||||||
uint32_t transitionWhenHeatersOffCycles = 0;
|
uint32_t transitionWhenHeatersOffCycles = 0;
|
||||||
Mode_t targetMode = MODE_OFF;
|
Mode_t targetMode = MODE_OFF;
|
||||||
Submode_t targetSubmode = SUBMODE_NONE;
|
Submode_t targetSubmode = SUBMODE_NONE;
|
||||||
uint32_t cycles = 0;
|
uint32_t cycles = 0;
|
||||||
std::array<ThermalState, ThermalComponents::NUM_ENTRIES> thermalStates{};
|
std::array<tcsCtrl::ThermalState, tcsCtrl::NUM_THERMAL_COMPONENTS> thermalStates{};
|
||||||
std::array<HeaterState, heater::NUMBER_OF_SWITCHES> heaterStates{};
|
std::array<tcsCtrl::HeaterState, heater::NUMBER_OF_SWITCHES> heaterStates{};
|
||||||
|
|
||||||
// Initial delay to make sure all pool variables have been initialized their owners.
|
// Initial delay to make sure all pool variables have been initialized their owners.
|
||||||
// Also, wait for system initialization to complete.
|
// Also, wait for system initialization to complete.
|
||||||
@ -298,6 +261,12 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
PoolEntry<uint8_t> heaterSwitchStates = PoolEntry<uint8_t>(heater::NUMBER_OF_SWITCHES);
|
PoolEntry<uint8_t> heaterSwitchStates = PoolEntry<uint8_t>(heater::NUMBER_OF_SWITCHES);
|
||||||
PoolEntry<int16_t> heaterCurrent = PoolEntry<int16_t>();
|
PoolEntry<int16_t> heaterCurrent = PoolEntry<int16_t>();
|
||||||
|
|
||||||
|
PoolEntry<uint8_t> tcsCtrlHeaterOn = PoolEntry<uint8_t>(tcsCtrl::NUM_THERMAL_COMPONENTS);
|
||||||
|
PoolEntry<uint8_t> tcsCtrlSensorIdx = PoolEntry<uint8_t>(tcsCtrl::NUM_THERMAL_COMPONENTS);
|
||||||
|
PoolEntry<uint8_t> tcsCtrlHeaterIdx = PoolEntry<uint8_t>(tcsCtrl::NUM_THERMAL_COMPONENTS);
|
||||||
|
PoolEntry<uint32_t> tcsCtrlStartTimes = PoolEntry<uint32_t>(tcsCtrl::NUM_THERMAL_COMPONENTS);
|
||||||
|
PoolEntry<uint32_t> tcsCtrlEndTimes = PoolEntry<uint32_t>(tcsCtrl::NUM_THERMAL_COMPONENTS);
|
||||||
|
|
||||||
static constexpr dur_millis_t MUTEX_TIMEOUT = 50;
|
static constexpr dur_millis_t MUTEX_TIMEOUT = 50;
|
||||||
|
|
||||||
void startTransition(Mode_t mode, Submode_t submode) override;
|
void startTransition(Mode_t mode, Submode_t submode) override;
|
||||||
@ -319,8 +288,8 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
bool selectAndReadSensorTemp(HeaterContext& htrCtx);
|
bool selectAndReadSensorTemp(HeaterContext& htrCtx);
|
||||||
|
|
||||||
void heaterSwitchHelperAllOff();
|
void heaterSwitchHelperAllOff();
|
||||||
void heaterSwitchHelper(heater::Switch switchNr, HeaterHandler::SwitchState state,
|
void heaterSwitchHelper(heater::Switch switchNr, heater::SwitchState state,
|
||||||
unsigned componentIdx);
|
std::optional<unsigned> componentIdx);
|
||||||
|
|
||||||
void ctrlAcsBoard();
|
void ctrlAcsBoard();
|
||||||
void ctrlMgt();
|
void ctrlMgt();
|
||||||
@ -329,7 +298,6 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
void ctrlIfBoard();
|
void ctrlIfBoard();
|
||||||
void ctrlTcsBoard();
|
void ctrlTcsBoard();
|
||||||
void ctrlObc();
|
void ctrlObc();
|
||||||
void ctrlObcIfBoard();
|
|
||||||
void ctrlSBandTransceiver();
|
void ctrlSBandTransceiver();
|
||||||
void ctrlPcduP60Board();
|
void ctrlPcduP60Board();
|
||||||
void ctrlPcduAcu();
|
void ctrlPcduAcu();
|
||||||
@ -345,7 +313,22 @@ class ThermalController : public ExtendedControllerBase {
|
|||||||
void ctrlTx();
|
void ctrlTx();
|
||||||
void ctrlMpa();
|
void ctrlMpa();
|
||||||
void ctrlScexBoard();
|
void ctrlScexBoard();
|
||||||
void heaterTransitionControl(const HeaterSwitchStates& currentHeaterStates);
|
|
||||||
|
/**
|
||||||
|
* The transition of heaters might take some time. As long as a transition is
|
||||||
|
* going on, the TCS controller works in a reduced form. This function takes care
|
||||||
|
* of tracking transition and capturing their completion.
|
||||||
|
* @param currentHeaterStates
|
||||||
|
*/
|
||||||
|
void heaterTransitionControl(const tcsCtrl::HeaterSwitchStates& currentHeaterStates);
|
||||||
|
/**
|
||||||
|
* Control tasks to prevent heaters being on for prolonged periods. Ideally, this
|
||||||
|
* should never happen, but this task prevents bugs from causing heaters to stay on
|
||||||
|
* for a long time, which draws a lot of power.
|
||||||
|
* @param currentHeaterStates
|
||||||
|
*/
|
||||||
|
void heaterMaxDurationControl(const tcsCtrl::HeaterSwitchStates& currentHeaterStates);
|
||||||
|
void crossCheckHeaterStateOfComponentsWhenHeaterGoesOff(heater::Switch switchIdx);
|
||||||
void setMode(Mode_t mode, Submode_t submode);
|
void setMode(Mode_t mode, Submode_t submode);
|
||||||
uint32_t tempFloatToU32() const;
|
uint32_t tempFloatToU32() const;
|
||||||
bool tooHotHandler(object_id_t object, bool& oneShotFlag);
|
bool tooHotHandler(object_id_t object, bool& oneShotFlag);
|
||||||
|
@ -9,6 +9,85 @@
|
|||||||
|
|
||||||
namespace tcsCtrl {
|
namespace tcsCtrl {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOP Limit: Hard limit for device, usually from datasheet. Device damage is possible lif NOP limit
|
||||||
|
* is exceeded.
|
||||||
|
* OP Limit: Soft limit. Device should be switched off or TCS controller should take action if the
|
||||||
|
* limit is exceeded to avoid reaching NOP limit
|
||||||
|
*/
|
||||||
|
struct TempLimits {
|
||||||
|
TempLimits(float nopLowerLimit, float opLowerLimit, float cutOffLimit, float opUpperLimit,
|
||||||
|
float nopUpperLimit)
|
||||||
|
: opLowerLimit(opLowerLimit),
|
||||||
|
opUpperLimit(opUpperLimit),
|
||||||
|
cutOffLimit(cutOffLimit),
|
||||||
|
nopLowerLimit(nopLowerLimit),
|
||||||
|
nopUpperLimit(nopUpperLimit) {}
|
||||||
|
float opLowerLimit;
|
||||||
|
float opUpperLimit;
|
||||||
|
float cutOffLimit;
|
||||||
|
float nopLowerLimit;
|
||||||
|
float nopUpperLimit;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstraction for the state of a single thermal component
|
||||||
|
*/
|
||||||
|
struct ThermalState {
|
||||||
|
uint8_t noSensorAvailableCounter;
|
||||||
|
// Which sensor is used for this component?
|
||||||
|
uint8_t sensorIndex = 0;
|
||||||
|
// Is heating on for that thermal module?
|
||||||
|
bool heating = false;
|
||||||
|
// Which switch is being used for heating the component
|
||||||
|
heater::Switch heaterSwitch = heater::Switch::HEATER_NONE;
|
||||||
|
// Heater start time and end times as UNIX seconds. Please note that these times will be updated
|
||||||
|
// when a switch command is sent, with no guarantess that the heater actually went on.
|
||||||
|
uint32_t heaterStartTime = 0;
|
||||||
|
uint32_t heaterEndTime = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstraction for the state of a single heater.
|
||||||
|
*/
|
||||||
|
struct HeaterState {
|
||||||
|
bool switchTransition = false;
|
||||||
|
heater::SwitchState target = heater::SwitchState::OFF;
|
||||||
|
uint8_t heaterSwitchControlCycles = 0;
|
||||||
|
bool trackHeaterMaxBurnTime = false;
|
||||||
|
Countdown heaterOnMaxBurnTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
using HeaterSwitchStates = std::array<heater::SwitchState, heater::NUMBER_OF_SWITCHES>;
|
||||||
|
|
||||||
|
enum ThermalComponents : uint8_t {
|
||||||
|
NONE = 0,
|
||||||
|
ACS_BOARD = 1,
|
||||||
|
MGT = 2,
|
||||||
|
RW = 3,
|
||||||
|
STR = 4,
|
||||||
|
IF_BOARD = 5,
|
||||||
|
TCS_BOARD = 6,
|
||||||
|
OBC = 7,
|
||||||
|
LEGACY_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_THERMAL_COMPONENTS
|
||||||
|
};
|
||||||
|
|
||||||
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::TCS_CONTROLLER;
|
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_VALID_SENSOR_TEMPERATURE = MAKE_EVENT(0, severity::MEDIUM);
|
||||||
static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, severity::MEDIUM);
|
static constexpr Event NO_HEALTHY_HEATER_AVAILABLE = MAKE_EVENT(1, severity::MEDIUM);
|
||||||
@ -18,6 +97,12 @@ static constexpr Event CAMERA_OVERHEATING = MAKE_EVENT(5, severity::HIGH);
|
|||||||
static constexpr Event PCDU_SYSTEM_OVERHEATING = MAKE_EVENT(6, 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);
|
static constexpr Event HEATER_NOT_OFF_FOR_OFF_MODE = MAKE_EVENT(7, severity::MEDIUM);
|
||||||
static constexpr Event MGT_OVERHEATING = MAKE_EVENT(8, severity::HIGH);
|
static constexpr Event MGT_OVERHEATING = MAKE_EVENT(8, severity::HIGH);
|
||||||
|
//! [EXPORT] : [COMMENT] P1: Module index. P2: Heater index
|
||||||
|
static constexpr Event TCS_SWITCHING_HEATER_ON = MAKE_EVENT(9, severity::INFO);
|
||||||
|
//! [EXPORT] : [COMMENT] P1: Module index. P2: Heater index
|
||||||
|
static constexpr Event TCS_SWITCHING_HEATER_OFF = MAKE_EVENT(10, severity::INFO);
|
||||||
|
//! [EXPORT] : [COMMENT] P1: Heater index. P2: Maximum burn time for heater.
|
||||||
|
static constexpr Event TCS_HEATER_MAX_BURN_TIME_REACHED = MAKE_EVENT(11, severity::MEDIUM);
|
||||||
|
|
||||||
enum SetId : uint32_t {
|
enum SetId : uint32_t {
|
||||||
SENSOR_TEMPERATURES = 0,
|
SENSOR_TEMPERATURES = 0,
|
||||||
@ -25,6 +110,7 @@ enum SetId : uint32_t {
|
|||||||
SUS_TEMPERATURES = 2,
|
SUS_TEMPERATURES = 2,
|
||||||
COMPONENT_TEMPERATURES = 3,
|
COMPONENT_TEMPERATURES = 3,
|
||||||
HEATER_SET = 4,
|
HEATER_SET = 4,
|
||||||
|
TCS_CTRL_INFO = 5
|
||||||
};
|
};
|
||||||
|
|
||||||
enum PoolIds : lp_id_t {
|
enum PoolIds : lp_id_t {
|
||||||
@ -92,7 +178,13 @@ enum PoolIds : lp_id_t {
|
|||||||
TEMP_ADC_PAYLOAD_PCDU,
|
TEMP_ADC_PAYLOAD_PCDU,
|
||||||
|
|
||||||
HEATER_SWITCH_LIST,
|
HEATER_SWITCH_LIST,
|
||||||
HEATER_CURRENT
|
HEATER_CURRENT,
|
||||||
|
|
||||||
|
HEATER_ON_FOR_COMPONENT_VEC,
|
||||||
|
SENSOR_USED_FOR_TCS_CTRL,
|
||||||
|
HEATER_IDX_USED_FOR_TCS_CTRL,
|
||||||
|
HEATER_START_TIME,
|
||||||
|
HEATER_END_TIME
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint8_t ENTRIES_SENSOR_TEMPERATURE_SET = 25;
|
static const uint8_t ENTRIES_SENSOR_TEMPERATURE_SET = 25;
|
||||||
@ -232,6 +324,29 @@ class HeaterInfo : public StaticLocalDataSet<3> {
|
|||||||
lp_var_t<int16_t> heaterCurrent = lp_var_t<int16_t>(sid.objectId, PoolIds::HEATER_CURRENT, this);
|
lp_var_t<int16_t> heaterCurrent = lp_var_t<int16_t>(sid.objectId, PoolIds::HEATER_CURRENT, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TcsCtrlInfo : public StaticLocalDataSet<6> {
|
||||||
|
public:
|
||||||
|
explicit TcsCtrlInfo(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, TCS_CTRL_INFO) {}
|
||||||
|
|
||||||
|
explicit TcsCtrlInfo(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, TCS_CTRL_INFO)) {}
|
||||||
|
|
||||||
|
lp_vec_t<uint8_t, tcsCtrl::NUM_THERMAL_COMPONENTS> heatingOnVec =
|
||||||
|
lp_vec_t<uint8_t, tcsCtrl::NUM_THERMAL_COMPONENTS>(
|
||||||
|
sid.objectId, PoolIds::HEATER_ON_FOR_COMPONENT_VEC, this);
|
||||||
|
lp_vec_t<uint8_t, tcsCtrl::NUM_THERMAL_COMPONENTS> sensorIdxUsedForTcsCtrl =
|
||||||
|
lp_vec_t<uint8_t, tcsCtrl::NUM_THERMAL_COMPONENTS>(sid.objectId,
|
||||||
|
PoolIds::SENSOR_USED_FOR_TCS_CTRL, this);
|
||||||
|
lp_vec_t<uint8_t, tcsCtrl::NUM_THERMAL_COMPONENTS> heaterSwitchIdx =
|
||||||
|
lp_vec_t<uint8_t, tcsCtrl::NUM_THERMAL_COMPONENTS>(
|
||||||
|
sid.objectId, PoolIds::HEATER_IDX_USED_FOR_TCS_CTRL, this);
|
||||||
|
lp_vec_t<uint32_t, tcsCtrl::NUM_THERMAL_COMPONENTS> heaterStartTimes =
|
||||||
|
lp_vec_t<uint32_t, tcsCtrl::NUM_THERMAL_COMPONENTS>(sid.objectId, PoolIds::HEATER_START_TIME,
|
||||||
|
this);
|
||||||
|
lp_vec_t<uint32_t, tcsCtrl::NUM_THERMAL_COMPONENTS> heaterEndTimes =
|
||||||
|
lp_vec_t<uint32_t, tcsCtrl::NUM_THERMAL_COMPONENTS>(sid.objectId, PoolIds::HEATER_END_TIME,
|
||||||
|
this);
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace tcsCtrl
|
} // namespace tcsCtrl
|
||||||
|
|
||||||
#endif /* MISSION_CONTROLLER_CONTROLLERDEFINITIONS_THERMALCONTROLLERDEFINITIONS_H_ */
|
#endif /* MISSION_CONTROLLER_CONTROLLERDEFINITIONS_THERMALCONTROLLERDEFINITIONS_H_ */
|
||||||
|
@ -311,9 +311,9 @@ void ObjectFactory::createGenericHeaterComponents(GpioIF& gpioIF, PowerSwitchIF&
|
|||||||
heaterHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
heaterHandler->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectFactory::createThermalController(HeaterHandler& heaterHandler) {
|
void ObjectFactory::createThermalController(HeaterHandler& heaterHandler, bool pollPlPcduTmp1) {
|
||||||
auto* tcsCtrl = new ThermalController(objects::THERMAL_CONTROLLER, heaterHandler,
|
auto* tcsCtrl = new ThermalController(objects::THERMAL_CONTROLLER, heaterHandler,
|
||||||
tcs::TCS_BOARD_SHORTLY_UNAVAILABLE);
|
tcs::TCS_BOARD_SHORTLY_UNAVAILABLE, pollPlPcduTmp1);
|
||||||
tcsCtrl->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
tcsCtrl->connectModeTreeParent(satsystem::tcs::SUBSYSTEM);
|
||||||
}
|
}
|
||||||
void ObjectFactory::createRwAssy(PowerSwitchIF& pwrSwitcher, power::Switch_t theSwitch,
|
void ObjectFactory::createRwAssy(PowerSwitchIF& pwrSwitcher, power::Switch_t theSwitch,
|
||||||
|
@ -50,7 +50,7 @@ void produceGenericObjects(HealthTableIF** healthTable, PusTmFunnel** pusFunnel,
|
|||||||
void createGenericHeaterComponents(GpioIF& gpioIF, PowerSwitchIF& pwrSwitcher,
|
void createGenericHeaterComponents(GpioIF& gpioIF, PowerSwitchIF& pwrSwitcher,
|
||||||
HeaterHandler*& heaterHandler);
|
HeaterHandler*& heaterHandler);
|
||||||
|
|
||||||
void createThermalController(HeaterHandler& heaterHandler);
|
void createThermalController(HeaterHandler& heaterHandler, bool pollPlPcduTmp1);
|
||||||
void createRwAssy(PowerSwitchIF& pwrSwitcher, power::Switch_t theSwitch,
|
void createRwAssy(PowerSwitchIF& pwrSwitcher, power::Switch_t theSwitch,
|
||||||
std::array<DeviceHandlerBase*, 4> rws, std::array<object_id_t, 4> rwIds);
|
std::array<DeviceHandlerBase*, 4> rws, std::array<object_id_t, 4> rwIds);
|
||||||
void createSusAssy(PowerSwitchIF& pwrSwitcher, std::array<DeviceHandlerBase*, 12> suses);
|
void createSusAssy(PowerSwitchIF& pwrSwitcher, std::array<DeviceHandlerBase*, 12> suses);
|
||||||
|
@ -39,56 +39,67 @@ ReturnValue_t pst::pstSyrlinks(FixedTimeslotTaskIF *thisSequence) {
|
|||||||
|
|
||||||
// I don't think this needs to be in a PST because linux takes care of bus serialization, but
|
// I don't think this needs to be in a PST because linux takes care of bus serialization, but
|
||||||
// keep it like this for now, it works
|
// keep it like this for now, it works
|
||||||
ReturnValue_t pst::pstI2cProcessingSystem(FixedTimeslotTaskIF *thisSequence) {
|
ReturnValue_t pst::pstI2c(TmpSchedConfig schedConf, FixedTimeslotTaskIF *thisSequence) {
|
||||||
// Length of a communication cycle
|
// Length of a communication cycle
|
||||||
uint32_t length = thisSequence->getPeriodMs();
|
uint32_t length = thisSequence->getPeriodMs();
|
||||||
static_cast<void>(length);
|
static_cast<void>(length);
|
||||||
|
|
||||||
// These are actually part of another bus, but this works, so keep it like this for now
|
if (schedConf.scheduleTmpDev0) {
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.2,
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0,
|
||||||
DeviceHandlerIF::PERFORM_OPERATION);
|
DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.2, DeviceHandlerIF::SEND_WRITE);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0, DeviceHandlerIF::SEND_WRITE);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.2, DeviceHandlerIF::GET_WRITE);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.1, DeviceHandlerIF::GET_WRITE);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.3, DeviceHandlerIF::SEND_READ);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.1, DeviceHandlerIF::SEND_READ);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.3, DeviceHandlerIF::GET_READ);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_0, length * 0.1, DeviceHandlerIF::GET_READ);
|
||||||
|
}
|
||||||
|
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.4,
|
if (schedConf.scheduleTmpDev1) {
|
||||||
DeviceHandlerIF::PERFORM_OPERATION);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.2,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.4, DeviceHandlerIF::SEND_WRITE);
|
DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.4, DeviceHandlerIF::GET_WRITE);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.2,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.5, DeviceHandlerIF::SEND_READ);
|
DeviceHandlerIF::SEND_WRITE);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.5, DeviceHandlerIF::GET_READ);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.2, DeviceHandlerIF::GET_WRITE);
|
||||||
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.3, DeviceHandlerIF::SEND_READ);
|
||||||
|
thisSequence->addSlot(objects::TMP1075_HANDLER_TCS_1, length * 0.3, DeviceHandlerIF::GET_READ);
|
||||||
|
}
|
||||||
|
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.6,
|
if (schedConf.schedulePlPcduDev0) {
|
||||||
DeviceHandlerIF::PERFORM_OPERATION);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.4,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.6,
|
DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
DeviceHandlerIF::SEND_WRITE);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.4,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.6,
|
DeviceHandlerIF::SEND_WRITE);
|
||||||
DeviceHandlerIF::GET_WRITE);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.4,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.7,
|
DeviceHandlerIF::GET_WRITE);
|
||||||
DeviceHandlerIF::SEND_READ);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.5,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.7, DeviceHandlerIF::GET_READ);
|
DeviceHandlerIF::SEND_READ);
|
||||||
// damaged
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_0, length * 0.5,
|
||||||
/*
|
DeviceHandlerIF::GET_READ);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.4,
|
}
|
||||||
DeviceHandlerIF::PERFORM_OPERATION);
|
if (schedConf.schedulePlPcduDev1) {
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.4,
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.6,
|
||||||
DeviceHandlerIF::SEND_WRITE);
|
DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.4,
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.6,
|
||||||
DeviceHandlerIF::GET_WRITE);
|
DeviceHandlerIF::SEND_WRITE);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.4,
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.6,
|
||||||
DeviceHandlerIF::SEND_READ);
|
DeviceHandlerIF::GET_WRITE);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.4, DeviceHandlerIF::GET_READ);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.7,
|
||||||
*/
|
DeviceHandlerIF::SEND_READ);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.8,
|
thisSequence->addSlot(objects::TMP1075_HANDLER_PLPCDU_1, length * 0.7,
|
||||||
DeviceHandlerIF::PERFORM_OPERATION);
|
DeviceHandlerIF::GET_READ);
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.8,
|
}
|
||||||
DeviceHandlerIF::SEND_WRITE);
|
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.8,
|
if (schedConf.scheduleIfBoardDev) {
|
||||||
DeviceHandlerIF::GET_WRITE);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.8,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.9,
|
DeviceHandlerIF::PERFORM_OPERATION);
|
||||||
DeviceHandlerIF::SEND_READ);
|
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.8,
|
||||||
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.9, DeviceHandlerIF::GET_READ);
|
DeviceHandlerIF::SEND_WRITE);
|
||||||
|
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.8,
|
||||||
|
DeviceHandlerIF::GET_WRITE);
|
||||||
|
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.9,
|
||||||
|
DeviceHandlerIF::SEND_READ);
|
||||||
|
thisSequence->addSlot(objects::TMP1075_HANDLER_IF_BOARD, length * 0.9,
|
||||||
|
DeviceHandlerIF::GET_READ);
|
||||||
|
}
|
||||||
static_cast<void>(length);
|
static_cast<void>(length);
|
||||||
return thisSequence->checkSequence();
|
return thisSequence->checkSequence();
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,16 @@ struct AcsPstCfg {
|
|||||||
bool scheduleStr = true;
|
bool scheduleStr = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Default config is for FM.
|
||||||
|
struct TmpSchedConfig {
|
||||||
|
bool scheduleTmpDev0 = true;
|
||||||
|
bool scheduleTmpDev1 = true;
|
||||||
|
bool schedulePlPcduDev0 = true;
|
||||||
|
// damaged on FM
|
||||||
|
bool schedulePlPcduDev1 = false;
|
||||||
|
bool scheduleIfBoardDev = true;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function creates the PST for all gomspace devices.
|
* @brief This function creates the PST for all gomspace devices.
|
||||||
* @details
|
* @details
|
||||||
@ -51,7 +61,7 @@ ReturnValue_t pstSyrlinks(FixedTimeslotTaskIF* thisSequence);
|
|||||||
|
|
||||||
ReturnValue_t pstTcsAndAcs(FixedTimeslotTaskIF* thisSequence, AcsPstCfg cfg);
|
ReturnValue_t pstTcsAndAcs(FixedTimeslotTaskIF* thisSequence, AcsPstCfg cfg);
|
||||||
|
|
||||||
ReturnValue_t pstI2cProcessingSystem(FixedTimeslotTaskIF* thisSequence);
|
ReturnValue_t pstI2c(TmpSchedConfig schedConf, FixedTimeslotTaskIF* thisSequence);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic test PST
|
* Generic test PST
|
||||||
|
@ -31,12 +31,12 @@ void buildPtgInertialSequence(Subsystem& ss, ModeListEntry& eh);
|
|||||||
static const auto OFF = HasModesIF::MODE_OFF;
|
static const auto OFF = HasModesIF::MODE_OFF;
|
||||||
static const auto NML = DeviceHandlerIF::MODE_NORMAL;
|
static const auto NML = DeviceHandlerIF::MODE_NORMAL;
|
||||||
|
|
||||||
void satsystem::init() {
|
void satsystem::init(bool commandPlPcdu1) {
|
||||||
auto& acsSubsystem = acs::init();
|
auto& acsSubsystem = acs::init();
|
||||||
acsSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
acsSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||||
auto& payloadSubsystem = payload::init();
|
auto& payloadSubsystem = payload::init();
|
||||||
payloadSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
payloadSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||||
auto& tcsSubsystem = tcs::init();
|
auto& tcsSubsystem = tcs::init(commandPlPcdu1);
|
||||||
tcsSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
tcsSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||||
auto& comSubsystem = com::init();
|
auto& comSubsystem = com::init();
|
||||||
comSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
comSubsystem.connectModeTreeParent(EIVE_SYSTEM);
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
namespace satsystem {
|
namespace satsystem {
|
||||||
|
|
||||||
void init();
|
void init(bool commandPlPcdu1);
|
||||||
|
|
||||||
extern EiveSystem EIVE_SYSTEM;
|
extern EiveSystem EIVE_SYSTEM;
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ ReturnValue_t TmpDevFdir::eventReceived(EventMessage* event) {
|
|||||||
// We'll try a recovery as long as defined in MAX_REBOOT.
|
// We'll try a recovery as long as defined in MAX_REBOOT.
|
||||||
// Might cause some AssemblyBase cycles, so keep number low.
|
// Might cause some AssemblyBase cycles, so keep number low.
|
||||||
// Ignored for TMP device, no way to power cycle it without going to OFF/BOOT mode.
|
// Ignored for TMP device, no way to power cycle it without going to OFF/BOOT mode.
|
||||||
// handleRecovery(event->getEvent());
|
setFaulty(event->getEvent());
|
||||||
break;
|
break;
|
||||||
case DeviceHandlerIF::DEVICE_INTERPRETING_REPLY_FAILED:
|
case DeviceHandlerIF::DEVICE_INTERPRETING_REPLY_FAILED:
|
||||||
case DeviceHandlerIF::DEVICE_READING_REPLY_FAILED:
|
case DeviceHandlerIF::DEVICE_READING_REPLY_FAILED:
|
||||||
@ -28,8 +28,10 @@ ReturnValue_t TmpDevFdir::eventReceived(EventMessage* event) {
|
|||||||
case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: // Some DH's generate generic reply-ids.
|
case DeviceHandlerIF::DEVICE_UNKNOWN_REPLY: // Some DH's generate generic reply-ids.
|
||||||
case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED:
|
case DeviceHandlerIF::DEVICE_BUILDING_COMMAND_FAILED:
|
||||||
// These faults all mean that there were stupid replies from a device.
|
// These faults all mean that there were stupid replies from a device.
|
||||||
// With now way to do a recovery, set the device to faulty immediately.
|
// With no way to do a recovery, set the device to faulty instead of trying a recovery.
|
||||||
setFaulty(event->getEvent());
|
if (strangeReplyCount.incrementAndCheck()) {
|
||||||
|
setFaulty(event->getEvent());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED:
|
case DeviceHandlerIF::DEVICE_SENDING_COMMAND_FAILED:
|
||||||
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
|
case DeviceHandlerIF::DEVICE_REQUESTING_REPLY_FAILED:
|
||||||
@ -40,7 +42,9 @@ ReturnValue_t TmpDevFdir::eventReceived(EventMessage* event) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// else
|
// else
|
||||||
setFaulty(event->getEvent());
|
if (missedReplyCount.incrementAndCheck()) {
|
||||||
|
setFaulty(event->getEvent());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case StorageManagerIF::GET_DATA_FAILED:
|
case StorageManagerIF::GET_DATA_FAILED:
|
||||||
case StorageManagerIF::STORE_DATA_FAILED:
|
case StorageManagerIF::STORE_DATA_FAILED:
|
||||||
|
@ -10,8 +10,8 @@ TcsSubsystem satsystem::tcs::SUBSYSTEM(objects::TCS_SUBSYSTEM, 12, 24);
|
|||||||
namespace {
|
namespace {
|
||||||
// Alias for checker function
|
// Alias for checker function
|
||||||
const auto check = subsystem::checkInsert;
|
const auto check = subsystem::checkInsert;
|
||||||
void buildOffSequence(Subsystem& ss, ModeListEntry& eh);
|
void buildOffSequence(Subsystem& ss, ModeListEntry& eh, bool commandPlPcdu1);
|
||||||
void buildNormalSequence(Subsystem& ss, ModeListEntry& eh);
|
void buildNormalSequence(Subsystem& ss, ModeListEntry& eh, bool commandPlPcdu1);
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
static const auto OFF = HasModesIF::MODE_OFF;
|
static const auto OFF = HasModesIF::MODE_OFF;
|
||||||
@ -27,17 +27,17 @@ auto TCS_TABLE_NORMAL_TGT = std::make_pair((NML << 24) | 1, FixedArrayList<ModeL
|
|||||||
auto TCS_TABLE_NORMAL_TRANS_0 = std::make_pair((NML << 24) | 2, FixedArrayList<ModeListEntry, 7>());
|
auto TCS_TABLE_NORMAL_TRANS_0 = std::make_pair((NML << 24) | 2, FixedArrayList<ModeListEntry, 7>());
|
||||||
auto TCS_TABLE_NORMAL_TRANS_1 = std::make_pair((NML << 24) | 3, FixedArrayList<ModeListEntry, 2>());
|
auto TCS_TABLE_NORMAL_TRANS_1 = std::make_pair((NML << 24) | 3, FixedArrayList<ModeListEntry, 2>());
|
||||||
|
|
||||||
Subsystem& satsystem::tcs::init() {
|
Subsystem& satsystem::tcs::init(bool commandPlPcdu1) {
|
||||||
ModeListEntry entry;
|
ModeListEntry entry;
|
||||||
buildOffSequence(SUBSYSTEM, entry);
|
buildOffSequence(SUBSYSTEM, entry, commandPlPcdu1);
|
||||||
buildNormalSequence(SUBSYSTEM, entry);
|
buildNormalSequence(SUBSYSTEM, entry, commandPlPcdu1);
|
||||||
SUBSYSTEM.setInitialMode(OFF);
|
SUBSYSTEM.setInitialMode(OFF);
|
||||||
return SUBSYSTEM;
|
return SUBSYSTEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void buildOffSequence(Subsystem& ss, ModeListEntry& eh) {
|
void buildOffSequence(Subsystem& ss, ModeListEntry& eh, bool commandPlPcdu1) {
|
||||||
std::string context = "satsystem::tcs::buildOffSequence";
|
std::string context = "satsystem::tcs::buildOffSequence";
|
||||||
auto ctxc = context.c_str();
|
auto ctxc = context.c_str();
|
||||||
// Insert Helper Table
|
// Insert Helper Table
|
||||||
@ -67,7 +67,9 @@ void buildOffSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
iht(objects::TMP1075_HANDLER_TCS_0, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
iht(objects::TMP1075_HANDLER_TCS_0, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
iht(objects::TMP1075_HANDLER_TCS_1, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
iht(objects::TMP1075_HANDLER_TCS_1, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
iht(objects::TMP1075_HANDLER_PLPCDU_0, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
iht(objects::TMP1075_HANDLER_PLPCDU_0, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
// TMP PL PCDU 1 is damaged
|
if (commandPlPcdu1) {
|
||||||
|
iht(objects::TMP1075_HANDLER_PLPCDU_1, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
|
}
|
||||||
iht(objects::TMP1075_HANDLER_IF_BOARD, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
iht(objects::TMP1075_HANDLER_IF_BOARD, OFF, 0, TCS_TABLE_OFF_TRANS_1.second);
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TRANS_1.first, &TCS_TABLE_OFF_TRANS_1.second)), ctxc);
|
check(ss.addTable(TableEntry(TCS_TABLE_OFF_TRANS_1.first, &TCS_TABLE_OFF_TRANS_1.second)), ctxc);
|
||||||
|
|
||||||
@ -79,7 +81,7 @@ void buildOffSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
ctxc);
|
ctxc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void buildNormalSequence(Subsystem& ss, ModeListEntry& eh) {
|
void buildNormalSequence(Subsystem& ss, ModeListEntry& eh, bool commandPlPcdu1) {
|
||||||
std::string context = "satsystem::tcs::buildNormalSequence";
|
std::string context = "satsystem::tcs::buildNormalSequence";
|
||||||
auto ctxc = context.c_str();
|
auto ctxc = context.c_str();
|
||||||
// Insert Helper Table
|
// Insert Helper Table
|
||||||
@ -105,7 +107,9 @@ void buildNormalSequence(Subsystem& ss, ModeListEntry& eh) {
|
|||||||
iht(objects::TMP1075_HANDLER_TCS_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_TCS_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
iht(objects::TMP1075_HANDLER_TCS_1, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_TCS_1, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
iht(objects::TMP1075_HANDLER_PLPCDU_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_PLPCDU_0, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
// TMP PL PCDU 1 is damaged
|
if (commandPlPcdu1) {
|
||||||
|
iht(objects::TMP1075_HANDLER_PLPCDU_1, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
|
}
|
||||||
iht(objects::TMP1075_HANDLER_IF_BOARD, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
iht(objects::TMP1075_HANDLER_IF_BOARD, NML, 0, TCS_TABLE_NORMAL_TRANS_0.second);
|
||||||
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TRANS_0.first, &TCS_TABLE_NORMAL_TRANS_0.second)),
|
check(ss.addTable(TableEntry(TCS_TABLE_NORMAL_TRANS_0.first, &TCS_TABLE_NORMAL_TRANS_0.second)),
|
||||||
ctxc);
|
ctxc);
|
||||||
|
@ -7,7 +7,7 @@ namespace satsystem {
|
|||||||
namespace tcs {
|
namespace tcs {
|
||||||
|
|
||||||
extern TcsSubsystem SUBSYSTEM;
|
extern TcsSubsystem SUBSYSTEM;
|
||||||
Subsystem& init();
|
Subsystem& init(bool commandPlPcdu1);
|
||||||
|
|
||||||
} // namespace tcs
|
} // namespace tcs
|
||||||
} // namespace satsystem
|
} // namespace satsystem
|
||||||
|
@ -97,7 +97,7 @@ ReturnValue_t HeaterHandler::initialize() {
|
|||||||
|
|
||||||
ReturnValue_t HeaterHandler::initializeHeaterMap() {
|
ReturnValue_t HeaterHandler::initializeHeaterMap() {
|
||||||
for (power::Switch_t switchNr = 0; switchNr < heater::NUMBER_OF_SWITCHES; switchNr++) {
|
for (power::Switch_t switchNr = 0; switchNr < heater::NUMBER_OF_SWITCHES; switchNr++) {
|
||||||
heaterVec.push_back(HeaterWrapper(helper.heaters[switchNr], SwitchState::OFF));
|
heaterVec.push_back(HeaterWrapper(helper.heaters[switchNr], heater::SwitchState::OFF));
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
@ -214,7 +214,7 @@ ReturnValue_t HeaterHandler::sendSwitchCommand(uint8_t switchNr, ReturnValue_t o
|
|||||||
void HeaterHandler::handleSwitchHandling() {
|
void HeaterHandler::handleSwitchHandling() {
|
||||||
for (uint8_t idx = 0; idx < heater::NUMBER_OF_SWITCHES; idx++) {
|
for (uint8_t idx = 0; idx < heater::NUMBER_OF_SWITCHES; idx++) {
|
||||||
auto health = heaterVec[idx].healthDevice->getHealth();
|
auto health = heaterVec[idx].healthDevice->getHealth();
|
||||||
if (heaterVec[idx].switchState == SwitchState::ON) {
|
if (heaterVec[idx].switchState == heater::SwitchState::ON) {
|
||||||
// If a heater is still on but the device was marked faulty by the operator, the SW
|
// If a heater is still on but the device was marked faulty by the operator, the SW
|
||||||
// will shut down the heater
|
// will shut down the heater
|
||||||
if (health == HasHealthIF::FAULTY or health == HasHealthIF::PERMANENT_FAULTY) {
|
if (health == HasHealthIF::FAULTY or health == HasHealthIF::PERMANENT_FAULTY) {
|
||||||
@ -277,7 +277,7 @@ void HeaterHandler::handleSwitchOnCommand(heater::Switch heaterIdx) {
|
|||||||
triggerEvent(HEATER_WENT_ON, heaterIdx, 0);
|
triggerEvent(HEATER_WENT_ON, heaterIdx, 0);
|
||||||
{
|
{
|
||||||
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
||||||
heater.switchState = ON;
|
heater.switchState = heater::SwitchState::ON;
|
||||||
}
|
}
|
||||||
EventManagerIF::triggerEvent(helper.heaters[heaterIdx].first->getObjectId(), MODE_INFO,
|
EventManagerIF::triggerEvent(helper.heaters[heaterIdx].first->getObjectId(), MODE_INFO,
|
||||||
MODE_ON, 0);
|
MODE_ON, 0);
|
||||||
@ -326,10 +326,10 @@ void HeaterHandler::handleSwitchOffCommand(heater::Switch heaterIdx) {
|
|||||||
}
|
}
|
||||||
if (result == returnvalue::OK) {
|
if (result == returnvalue::OK) {
|
||||||
// Check whether switch is already off
|
// Check whether switch is already off
|
||||||
if (getSwitchState(heaterIdx) == SwitchState::ON) {
|
if (getSwitchState(heaterIdx) == heater::SwitchState::ON) {
|
||||||
{
|
{
|
||||||
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
||||||
heater.switchState = OFF;
|
heater.switchState = heater::SwitchState::OFF;
|
||||||
}
|
}
|
||||||
triggerEvent(HEATER_WENT_OFF, heaterIdx, 0);
|
triggerEvent(HEATER_WENT_OFF, heaterIdx, 0);
|
||||||
} else {
|
} else {
|
||||||
@ -356,15 +356,15 @@ void HeaterHandler::handleSwitchOffCommand(heater::Switch heaterIdx) {
|
|||||||
heater.cmdActive = false;
|
heater.cmdActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HeaterHandler::SwitchState HeaterHandler::getSwitchState(heater::Switch switchNr) const {
|
heater::SwitchState HeaterHandler::getSwitchState(heater::Switch switchNr) const {
|
||||||
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
||||||
return heaterVec.at(switchNr).switchState;
|
return heaterVec.at(switchNr).switchState;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t HeaterHandler::switchHeater(heater::Switch heater, SwitchState switchState) {
|
ReturnValue_t HeaterHandler::switchHeater(heater::Switch heater, heater::SwitchState switchState) {
|
||||||
if (switchState == SwitchState::ON) {
|
if (switchState == heater::SwitchState::ON) {
|
||||||
return sendSwitchCommand(heater, PowerSwitchIF::SWITCH_ON);
|
return sendSwitchCommand(heater, PowerSwitchIF::SWITCH_ON);
|
||||||
} else if (switchState == SwitchState::OFF) {
|
} else if (switchState == heater::SwitchState::OFF) {
|
||||||
return sendSwitchCommand(heater, PowerSwitchIF::SWITCH_OFF);
|
return sendSwitchCommand(heater, PowerSwitchIF::SWITCH_OFF);
|
||||||
}
|
}
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
@ -373,10 +373,10 @@ ReturnValue_t HeaterHandler::switchHeater(heater::Switch heater, SwitchState swi
|
|||||||
void HeaterHandler::announceMode(bool recursive) {
|
void HeaterHandler::announceMode(bool recursive) {
|
||||||
triggerEvent(MODE_INFO, mode, submode);
|
triggerEvent(MODE_INFO, mode, submode);
|
||||||
|
|
||||||
std::array<SwitchState, 8> states;
|
std::array<heater::SwitchState, 8> states;
|
||||||
getAllSwitchStates(states);
|
getAllSwitchStates(states);
|
||||||
for (unsigned idx = 0; idx < helper.heaters.size(); idx++) {
|
for (unsigned idx = 0; idx < helper.heaters.size(); idx++) {
|
||||||
if (states[idx] == ON) {
|
if (states[idx] == heater::SwitchState::ON) {
|
||||||
EventManagerIF::triggerEvent(helper.heaters[idx].first->getObjectId(), MODE_INFO, MODE_ON, 0);
|
EventManagerIF::triggerEvent(helper.heaters[idx].first->getObjectId(), MODE_INFO, MODE_ON, 0);
|
||||||
} else {
|
} else {
|
||||||
EventManagerIF::triggerEvent(helper.heaters[idx].first->getObjectId(), MODE_INFO, MODE_OFF,
|
EventManagerIF::triggerEvent(helper.heaters[idx].first->getObjectId(), MODE_INFO, MODE_OFF,
|
||||||
@ -405,7 +405,7 @@ ModeTreeChildIF& HeaterHandler::getModeTreeChildIF() { return *this; }
|
|||||||
|
|
||||||
object_id_t HeaterHandler::getObjectId() const { return SystemObject::getObjectId(); }
|
object_id_t HeaterHandler::getObjectId() const { return SystemObject::getObjectId(); }
|
||||||
|
|
||||||
ReturnValue_t HeaterHandler::getAllSwitchStates(std::array<SwitchState, 8>& statesBuf) {
|
ReturnValue_t HeaterHandler::getAllSwitchStates(std::array<heater::SwitchState, 8>& statesBuf) {
|
||||||
{
|
{
|
||||||
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
||||||
if (mg.getLockResult() != returnvalue::OK) {
|
if (mg.getLockResult() != returnvalue::OK) {
|
||||||
@ -419,13 +419,13 @@ ReturnValue_t HeaterHandler::getAllSwitchStates(std::array<SwitchState, 8>& stat
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool HeaterHandler::allSwitchesOff() {
|
bool HeaterHandler::allSwitchesOff() {
|
||||||
bool allSwitchesOrd = false;
|
|
||||||
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
MutexGuard mg(handlerLock, LOCK_TYPE, LOCK_TIMEOUT, LOCK_CTX);
|
||||||
/* Or all switches. As soon one switch is on, allSwitchesOrd will be true */
|
|
||||||
for (power::Switch_t switchNr = 0; switchNr < heater::NUMBER_OF_SWITCHES; switchNr++) {
|
for (power::Switch_t switchNr = 0; switchNr < heater::NUMBER_OF_SWITCHES; switchNr++) {
|
||||||
allSwitchesOrd = allSwitchesOrd || heaterVec.at(switchNr).switchState;
|
if (heaterVec.at(switchNr).switchState == heater::SwitchState::ON) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return !allSwitchesOrd;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageQueueId_t HeaterHandler::getCommandQueue() const { return commandQueue->getId(); }
|
MessageQueueId_t HeaterHandler::getCommandQueue() const { return commandQueue->getId(); }
|
||||||
@ -440,7 +440,7 @@ ReturnValue_t HeaterHandler::getSwitchState(uint8_t switchNr) const {
|
|||||||
if (switchNr > 7) {
|
if (switchNr > 7) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
if (getSwitchState(static_cast<heater::Switch>(switchNr)) == SwitchState::ON) {
|
if (getSwitchState(static_cast<heater::Switch>(switchNr)) == heater::SwitchState::ON) {
|
||||||
return PowerSwitchIF::SWITCH_ON;
|
return PowerSwitchIF::SWITCH_ON;
|
||||||
}
|
}
|
||||||
return PowerSwitchIF::SWITCH_OFF;
|
return PowerSwitchIF::SWITCH_OFF;
|
||||||
|
@ -60,7 +60,6 @@ class HeaterHandler : public ExecutableObjectIF,
|
|||||||
static const ReturnValue_t COMMAND_ALREADY_WAITING = MAKE_RETURN_CODE(0xA5);
|
static const ReturnValue_t COMMAND_ALREADY_WAITING = MAKE_RETURN_CODE(0xA5);
|
||||||
|
|
||||||
enum CmdSourceParam : uint8_t { INTERNAL = 0, EXTERNAL = 1 };
|
enum CmdSourceParam : uint8_t { INTERNAL = 0, EXTERNAL = 1 };
|
||||||
enum SwitchState : uint8_t { ON = 1, OFF = 0 };
|
|
||||||
|
|
||||||
/** Device command IDs */
|
/** Device command IDs */
|
||||||
static const DeviceCommandId_t SWITCH_HEATER = 0x0;
|
static const DeviceCommandId_t SWITCH_HEATER = 0x0;
|
||||||
@ -69,14 +68,14 @@ class HeaterHandler : public ExecutableObjectIF,
|
|||||||
PowerSwitchIF* mainLineSwitcherObjectId, power::Switch_t mainLineSwitch);
|
PowerSwitchIF* mainLineSwitcherObjectId, power::Switch_t mainLineSwitch);
|
||||||
|
|
||||||
ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF& parent) override;
|
ReturnValue_t connectModeTreeParent(HasModeTreeChildrenIF& parent) override;
|
||||||
ReturnValue_t getAllSwitchStates(std::array<SwitchState, 8>& statesBuf);
|
ReturnValue_t getAllSwitchStates(std::array<heater::SwitchState, 8>& statesBuf);
|
||||||
|
|
||||||
virtual ~HeaterHandler();
|
virtual ~HeaterHandler();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum SwitchAction : uint8_t { SET_SWITCH_OFF, SET_SWITCH_ON, NONE };
|
enum SwitchAction : uint8_t { SET_SWITCH_OFF, SET_SWITCH_ON, NONE };
|
||||||
|
|
||||||
ReturnValue_t switchHeater(heater::Switch heater, SwitchState switchState);
|
ReturnValue_t switchHeater(heater::Switch heater, heater::SwitchState switchState);
|
||||||
HasHealthIF::HealthState getHealth(heater::Switch heater);
|
HasHealthIF::HealthState getHealth(heater::Switch heater);
|
||||||
|
|
||||||
ReturnValue_t performOperation(uint8_t operationCode = 0) override;
|
ReturnValue_t performOperation(uint8_t operationCode = 0) override;
|
||||||
@ -121,14 +120,14 @@ class HeaterHandler : public ExecutableObjectIF,
|
|||||||
* @param mainSwitchCountdown Sets timeout to wait for main switch being set on.
|
* @param mainSwitchCountdown Sets timeout to wait for main switch being set on.
|
||||||
*/
|
*/
|
||||||
struct HeaterWrapper {
|
struct HeaterWrapper {
|
||||||
HeaterWrapper(HeaterPair pair, SwitchState initState)
|
HeaterWrapper(HeaterPair pair, heater::SwitchState initState)
|
||||||
: healthDevice(pair.first), gpioId(pair.second), switchState(initState) {}
|
: healthDevice(pair.first), gpioId(pair.second), switchState(initState) {}
|
||||||
HealthDevice* healthDevice = nullptr;
|
HealthDevice* healthDevice = nullptr;
|
||||||
gpioId_t gpioId = gpio::NO_GPIO;
|
gpioId_t gpioId = gpio::NO_GPIO;
|
||||||
SwitchAction action = SwitchAction::NONE;
|
SwitchAction action = SwitchAction::NONE;
|
||||||
MessageQueueId_t replyQueue = MessageQueueIF::NO_QUEUE;
|
MessageQueueId_t replyQueue = MessageQueueIF::NO_QUEUE;
|
||||||
bool cmdActive = false;
|
bool cmdActive = false;
|
||||||
SwitchState switchState = SwitchState::OFF;
|
heater::SwitchState switchState = heater::SwitchState::OFF;
|
||||||
bool waitMainSwitchOn = false;
|
bool waitMainSwitchOn = false;
|
||||||
Countdown mainSwitchCountdown;
|
Countdown mainSwitchCountdown;
|
||||||
};
|
};
|
||||||
@ -177,7 +176,7 @@ class HeaterHandler : public ExecutableObjectIF,
|
|||||||
* @brief Returns the state of a switch (ON - true, or OFF - false).
|
* @brief Returns the state of a switch (ON - true, or OFF - false).
|
||||||
* @param switchNr The number of the switch to check.
|
* @param switchNr The number of the switch to check.
|
||||||
*/
|
*/
|
||||||
SwitchState getSwitchState(heater::Switch switchNr) const;
|
heater::SwitchState getSwitchState(heater::Switch switchNr) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function runs commands waiting for execution.
|
* @brief This function runs commands waiting for execution.
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include <OBSWConfig.h>
|
#include <OBSWConfig.h>
|
||||||
|
#include <fsfw/datapool/PoolReadGuard.h>
|
||||||
#include <mission/tcs/Tmp1075Definitions.h>
|
#include <mission/tcs/Tmp1075Definitions.h>
|
||||||
#include <mission/tcs/Tmp1075Handler.h>
|
#include <mission/tcs/Tmp1075Handler.h>
|
||||||
|
|
||||||
@ -11,14 +12,12 @@ Tmp1075Handler::Tmp1075Handler(object_id_t objectId, object_id_t comIF, CookieIF
|
|||||||
|
|
||||||
Tmp1075Handler::~Tmp1075Handler() {}
|
Tmp1075Handler::~Tmp1075Handler() {}
|
||||||
|
|
||||||
void Tmp1075Handler::doStartUp() {
|
void Tmp1075Handler::doStartUp() { setMode(MODE_ON); }
|
||||||
if (getMode() == _MODE_START_UP) {
|
|
||||||
setMode(MODE_ON);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tmp1075Handler::doShutDown() {
|
void Tmp1075Handler::doShutDown() {
|
||||||
communicationStep = CommunicationStep::START_ADC_CONVERSION;
|
communicationStep = CommunicationStep::START_ADC_CONVERSION;
|
||||||
|
PoolReadGuard pg(&dataset);
|
||||||
|
dataset.setValidity(false, true);
|
||||||
setMode(_MODE_POWER_DOWN);
|
setMode(_MODE_POWER_DOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,12 +133,14 @@ ReturnValue_t Tmp1075Handler::initializeLocalDataPool(localpool::DataPool &local
|
|||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tmp1075Handler::setModeNormal() { setMode(_MODE_TO_NORMAL); }
|
|
||||||
|
|
||||||
ReturnValue_t Tmp1075Handler::setHealth(HealthState health) {
|
ReturnValue_t Tmp1075Handler::setHealth(HealthState health) {
|
||||||
if (health != FAULTY and health != PERMANENT_FAULTY and health != HEALTHY and
|
if (health != FAULTY and health != PERMANENT_FAULTY and health != HEALTHY and
|
||||||
health != EXTERNAL_CONTROL) {
|
health != EXTERNAL_CONTROL) {
|
||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
// Required because we do not have an assembly.
|
||||||
|
if (health == FAULTY or health == PERMANENT_FAULTY) {
|
||||||
|
setMode(_MODE_SHUT_DOWN);
|
||||||
|
}
|
||||||
|
return DeviceHandlerBase::setHealth(health);
|
||||||
}
|
}
|
||||||
|
@ -20,8 +20,6 @@ class Tmp1075Handler : public DeviceHandlerBase {
|
|||||||
Tmp1075Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie);
|
Tmp1075Handler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie);
|
||||||
virtual ~Tmp1075Handler();
|
virtual ~Tmp1075Handler();
|
||||||
|
|
||||||
void setModeNormal();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void doStartUp() override;
|
void doStartUp() override;
|
||||||
void doShutDown() override;
|
void doShutDown() override;
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
namespace heater {
|
namespace heater {
|
||||||
|
|
||||||
enum Switch : uint8_t {
|
enum Switch : uint8_t {
|
||||||
HEATER_0_PLOC_PROC_BRD,
|
HEATER_0_PLOC_PROC_BRD,
|
||||||
HEATER_1_PCDU_PDU,
|
HEATER_1_PCDU_PDU,
|
||||||
@ -13,9 +14,13 @@ enum Switch : uint8_t {
|
|||||||
HEATER_5_STR,
|
HEATER_5_STR,
|
||||||
HEATER_6_DRO,
|
HEATER_6_DRO,
|
||||||
HEATER_7_S_BAND,
|
HEATER_7_S_BAND,
|
||||||
NUMBER_OF_SWITCHES
|
NUMBER_OF_SWITCHES = 8,
|
||||||
|
HEATER_NONE = 0xff
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
enum SwitchState : uint8_t { ON = 1, OFF = 0 };
|
||||||
|
|
||||||
|
} // namespace heater
|
||||||
|
|
||||||
namespace tcs {
|
namespace tcs {
|
||||||
|
|
||||||
|
2
tmtc
2
tmtc
@ -1 +1 @@
|
|||||||
Subproject commit 18304c31fa423b1af6ff47764d4be81c7f20c8f2
|
Subproject commit 9be81f1725004b55e937718fbaddc4f4e4e74081
|
@ -30,7 +30,8 @@ TEST_CASE("Thermal Controller", "[ThermalController]") {
|
|||||||
|
|
||||||
// testEnvironment::initialize();
|
// testEnvironment::initialize();
|
||||||
|
|
||||||
ThermalController controller(THERMAL_CONTROLLER_ID, *heaterHandler, tcsBrdShortlyUnavailable);
|
ThermalController controller(THERMAL_CONTROLLER_ID, *heaterHandler, tcsBrdShortlyUnavailable,
|
||||||
|
true);
|
||||||
ReturnValue_t result = controller.initialize();
|
ReturnValue_t result = controller.initialize();
|
||||||
REQUIRE(result == returnvalue::OK);
|
REQUIRE(result == returnvalue::OK);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user