From 2968856d713ae924d545cf8a3834e2a9d4c9239c Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 6 Apr 2023 22:35:23 +0200 Subject: [PATCH] finally works --- dummies/BpxDummy.cpp | 26 +++--- fsfw | 2 +- linux/boardtest/I2cTestClass.cpp | 4 +- mission/controller/ThermalController.h | 12 +-- mission/power/BpxBatteryHandler.cpp | 124 +++++++++++++------------ mission/power/BpxBatteryHandler.h | 2 +- mission/power/bpxBattDefs.h | 47 +++++----- mission/system/EiveSystem.cpp | 111 ++++++++++++++-------- mission/system/EiveSystem.h | 3 + mission/tcs/HeaterHandler.cpp | 1 - mission/tcs/HeaterHandler.h | 4 +- tmtc | 2 +- 12 files changed, 184 insertions(+), 154 deletions(-) diff --git a/dummies/BpxDummy.cpp b/dummies/BpxDummy.cpp index ca546285..085bd841 100644 --- a/dummies/BpxDummy.cpp +++ b/dummies/BpxDummy.cpp @@ -37,19 +37,19 @@ uint32_t BpxDummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return ReturnValue_t BpxDummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_1, &battTemp1); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_2, &battTemp2); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_3, &battTemp3); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_4, &battTemp4); - localDataPoolMap.emplace(BpxBattery::CHARGE_CURRENT, &chargeCurrent); - localDataPoolMap.emplace(BpxBattery::DISCHARGE_CURRENT, &dischargeCurrent); - localDataPoolMap.emplace(BpxBattery::HEATER_CURRENT, &heaterCurrent); - localDataPoolMap.emplace(BpxBattery::BATT_VOLTAGE, &battVolt); - localDataPoolMap.emplace(BpxBattery::REBOOT_COUNTER, &rebootCounter); - localDataPoolMap.emplace(BpxBattery::BOOTCAUSE, &bootCause); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_1, &battTemp1); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_2, &battTemp2); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_3, &battTemp3); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_4, &battTemp4); + localDataPoolMap.emplace(bpxBat::CHARGE_CURRENT, &chargeCurrent); + localDataPoolMap.emplace(bpxBat::DISCHARGE_CURRENT, &dischargeCurrent); + localDataPoolMap.emplace(bpxBat::HEATER_CURRENT, &heaterCurrent); + localDataPoolMap.emplace(bpxBat::BATT_VOLTAGE, &battVolt); + localDataPoolMap.emplace(bpxBat::REBOOT_COUNTER, &rebootCounter); + localDataPoolMap.emplace(bpxBat::BOOTCAUSE, &bootCause); - localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh); + localDataPoolMap.emplace(bpxBat::BATTERY_HEATER_MODE, &battheatMode); + localDataPoolMap.emplace(bpxBat::BATTHEAT_LOW_LIMIT, &battheatLow); + localDataPoolMap.emplace(bpxBat::BATTHEAT_HIGH_LIMIT, &battheatHigh); return returnvalue::OK; } diff --git a/fsfw b/fsfw index 6650c293..5a930476 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 6650c293da09d8851c2bd6c4d6e6c5a8390d003e +Subproject commit 5a9304765f670685b6ca27cc9e6064012a17bab7 diff --git a/linux/boardtest/I2cTestClass.cpp b/linux/boardtest/I2cTestClass.cpp index 4d4e6267..1b9f82fe 100644 --- a/linux/boardtest/I2cTestClass.cpp +++ b/linux/boardtest/I2cTestClass.cpp @@ -37,7 +37,7 @@ void I2cTestClass::battInit() { if (ioctl(bpxInfo.fd, I2C_SLAVE, bpxInfo.addr) < 0) { sif::error << "Failed to acquire bus access and/or talk to slave" << std::endl; } - cmdBuf[0] = BpxBattery::PORT_PING; + cmdBuf[0] = bpxBat::PORT_PING; cmdBuf[1] = 0x42; sendLen = 2; ReturnValue_t result = i2cWrite(bpxInfo.fd, cmdBuf.data(), sendLen); @@ -66,7 +66,7 @@ void I2cTestClass::battPeriodic() { if (ioctl(bpxInfo.fd, I2C_SLAVE, bpxInfo.addr) < 0) { sif::error << "Failed to acquire bus access and/or talk to slave" << std::endl; } - cmdBuf[0] = BpxBattery::PORT_GET_HK; + cmdBuf[0] = bpxBat::PORT_GET_HK; sendLen = 1; ReturnValue_t result = i2cWrite(bpxInfo.fd, cmdBuf.data(), sendLen); if (result != returnvalue::OK) { diff --git a/mission/controller/ThermalController.h b/mission/controller/ThermalController.h index d531e813..631a37aa 100644 --- a/mission/controller/ThermalController.h +++ b/mission/controller/ThermalController.h @@ -182,14 +182,10 @@ class ThermalController : public ExtendedControllerBase { susMax1227::SusDataset susSet11; lp_var_t tempQ7s = lp_var_t(objects::CORE_CONTROLLER, core::PoolIds::TEMPERATURE); - lp_var_t battTemp1 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_1); - lp_var_t battTemp2 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_2); - lp_var_t battTemp3 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_3); - lp_var_t battTemp4 = - lp_var_t(objects::BPX_BATT_HANDLER, BpxBattery::BATT_TEMP_4); + lp_var_t battTemp1 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_1); + lp_var_t battTemp2 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_2); + lp_var_t battTemp3 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_3); + lp_var_t battTemp4 = lp_var_t(objects::BPX_BATT_HANDLER, bpxBat::BATT_TEMP_4); lp_var_t tempRw1 = lp_var_t(objects::RW1, rws::TEMPERATURE_C); lp_var_t tempRw2 = lp_var_t(objects::RW2, rws::TEMPERATURE_C); lp_var_t tempRw3 = lp_var_t(objects::RW3, rws::TEMPERATURE_C); diff --git a/mission/power/BpxBatteryHandler.cpp b/mission/power/BpxBatteryHandler.cpp index 6b258ab2..b4aece40 100644 --- a/mission/power/BpxBatteryHandler.cpp +++ b/mission/power/BpxBatteryHandler.cpp @@ -27,54 +27,56 @@ void BpxBatteryHandler::doStartUp() { void BpxBatteryHandler::doShutDown() { // Perform a COM check on reboot state = States::CHECK_COM; + setMode(MODE_OFF); } ReturnValue_t BpxBatteryHandler::buildNormalDeviceCommand(DeviceCommandId_t* id) { - *id = BpxBattery::GET_HK; + *id = bpxBat::GET_HK; return buildCommandFromCommand(*id, nullptr, 0); } ReturnValue_t BpxBatteryHandler::buildTransitionDeviceCommand(DeviceCommandId_t* id) { if (state == States::CHECK_COM) { - *id = BpxBattery::PING; + *id = bpxBat::PING; return buildCommandFromCommand(*id, nullptr, 0); } return returnvalue::OK; } void BpxBatteryHandler::fillCommandAndReplyMap() { - using namespace BpxBattery; + using namespace bpxBat; insertInCommandAndReplyMap(GET_HK, 1, &hkSet, GET_HK_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::PING, 1, nullptr, PING_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::REBOOT, 1, nullptr, 0); - insertInCommandAndReplyMap(BpxBattery::RESET_COUNTERS, 1, nullptr, EMPTY_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::CONFIG_CMD, 1, nullptr, EMPTY_REPLY_LEN); - insertInCommandAndReplyMap(BpxBattery::CONFIG_GET, 1, &cfgSet, CONFIG_GET_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::PING, 1, nullptr, PING_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::REBOOT, 1, nullptr, 0); + insertInCommandAndReplyMap(bpxBat::RESET_COUNTERS, 1, nullptr, EMPTY_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::CONFIG_CMD, 1, nullptr, EMPTY_REPLY_LEN); + insertInCommandAndReplyMap(bpxBat::CONFIG_GET, 1, &cfgSet, CONFIG_GET_REPLY_LEN); } ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, size_t commandDataLen) { switch (deviceCommand) { - case (BpxBattery::GET_HK): { - cmdBuf[0] = BpxBattery::PORT_GET_HK; + case (bpxBat::GET_HK): { + cmdBuf[0] = bpxBat::PORT_GET_HK; this->rawPacketLen = 1; break; } - case (BpxBattery::PING): { + case (bpxBat::PING): { if (commandDataLen == 1 and commandData != nullptr) { sentPingByte = commandData[0]; } else { - sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE; + sentPingByte = bpxBat::DEFAULT_PING_SENT_BYTE; } - cmdBuf[0] = BpxBattery::PORT_PING; + cmdBuf[0] = bpxBat::PORT_PING; cmdBuf[1] = sentPingByte; this->rawPacketLen = 2; break; } - case (BpxBattery::REBOOT): { - cmdBuf[0] = BpxBattery::PORT_REBOOT; + case (bpxBat::REBOOT): { + sif::info << "BPX BATT: Executing reboot command" << std::endl; + cmdBuf[0] = bpxBat::PORT_REBOOT; cmdBuf[1] = 0x80; cmdBuf[2] = 0x07; cmdBuf[3] = 0x80; @@ -85,26 +87,26 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic triggerEvent(DeviceHandlerIF::DEVICE_WANTS_HARD_REBOOT); break; } - case (BpxBattery::RESET_COUNTERS): { - cmdBuf[0] = BpxBattery::PORT_RESET_COUNTERS; - cmdBuf[1] = BpxBattery::RESET_COUNTERS_MAGIC_VALUE; + case (bpxBat::RESET_COUNTERS): { + cmdBuf[0] = bpxBat::PORT_RESET_COUNTERS; + cmdBuf[1] = bpxBat::RESET_COUNTERS_MAGIC_VALUE; this->rawPacketLen = 2; break; } - case (BpxBattery::CONFIG_CMD): { - cmdBuf[0] = BpxBattery::PORT_CONFIG_CMD; + case (bpxBat::CONFIG_CMD): { + cmdBuf[0] = bpxBat::PORT_CONFIG_CMD; // Needs to be set to 0x01 according to datasheet cmdBuf[1] = 0x01; this->rawPacketLen = 2; break; } - case (BpxBattery::CONFIG_GET): { - cmdBuf[0] = BpxBattery::PORT_CONFIG_GET; + case (bpxBat::CONFIG_GET): { + cmdBuf[0] = bpxBat::PORT_CONFIG_GET; this->rawPacketLen = 1; break; } - case (BpxBattery::CONFIG_SET): { - cmdBuf[0] = BpxBattery::PORT_CONFIG_SET; + case (bpxBat::CONFIG_SET): { + cmdBuf[0] = bpxBat::PORT_CONFIG_SET; if (commandDataLen != 3) { return DeviceHandlerIF::INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS; } @@ -114,8 +116,8 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic this->rawPacketLen = 4; break; } - case (BpxBattery::MAN_HEAT_ON): { - cmdBuf[0] = BpxBattery::PORT_MAN_HEAT_ON; + case (bpxBat::MAN_HEAT_ON): { + cmdBuf[0] = bpxBat::PORT_MAN_HEAT_ON; if (commandDataLen != 2) { return DeviceHandlerIF::INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS; } @@ -125,8 +127,8 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic this->rawPacketLen = 3; break; } - case (BpxBattery::MAN_HEAT_OFF): { - cmdBuf[0] = BpxBattery::PORT_MAN_HEAT_OFF; + case (bpxBat::MAN_HEAT_OFF): { + cmdBuf[0] = bpxBat::PORT_MAN_HEAT_OFF; this->rawPacketLen = 1; break; } @@ -142,35 +144,35 @@ ReturnValue_t BpxBatteryHandler::buildCommandFromCommand(DeviceCommandId_t devic ReturnValue_t BpxBatteryHandler::scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) { - using namespace BpxBattery; + using namespace bpxBat; switch (lastCmd) { - case (BpxBattery::GET_HK): { + case (bpxBat::GET_HK): { if (remainingSize != GET_HK_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } break; } - case (BpxBattery::PING): - case (BpxBattery::MAN_HEAT_ON): - case (BpxBattery::MAN_HEAT_OFF): { + case (bpxBat::PING): + case (bpxBat::MAN_HEAT_ON): + case (bpxBat::MAN_HEAT_OFF): { if (remainingSize != PING_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } break; } - case (BpxBattery::REBOOT): { + case (bpxBat::REBOOT): { // Ignore break; } - case (BpxBattery::RESET_COUNTERS): - case (BpxBattery::CONFIG_CMD): - case (BpxBattery::CONFIG_SET): { + case (bpxBat::RESET_COUNTERS): + case (bpxBat::CONFIG_CMD): + case (bpxBat::CONFIG_SET): { if (remainingSize != EMPTY_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } break; } - case (BpxBattery::CONFIG_GET): { + case (bpxBat::CONFIG_GET): { if (remainingSize != CONFIG_GET_REPLY_LEN) { return DeviceHandlerIF::LENGTH_MISSMATCH; } @@ -187,11 +189,11 @@ ReturnValue_t BpxBatteryHandler::scanForReply(const uint8_t* start, size_t remai } ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) { - if (id != BpxBattery::REBOOT and packet[1] != 0) { + if (id != bpxBat::REBOOT and packet[1] != 0) { return DeviceHandlerIF::DEVICE_REPORTED_ERROR; } switch (id) { - case (BpxBattery::GET_HK): { + case (bpxBat::GET_HK): { PoolReadGuard rg(&hkSet); ReturnValue_t result = hkSet.parseRawHk(packet + 2, 21); hkSet.setValidity(true, true); @@ -213,7 +215,7 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons } break; } - case (BpxBattery::PING): { + case (bpxBat::PING): { if (packet[2] != sentPingByte) { return DeviceHandlerIF::INVALID_DATA; } @@ -222,19 +224,19 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons } break; } - case (BpxBattery::RESET_COUNTERS): - case (BpxBattery::CONFIG_CMD): - case (BpxBattery::CONFIG_SET): { + case (bpxBat::RESET_COUNTERS): + case (bpxBat::CONFIG_CMD): + case (bpxBat::CONFIG_SET): { break; } - case (BpxBattery::MAN_HEAT_ON): - case (BpxBattery::MAN_HEAT_OFF): { + case (bpxBat::MAN_HEAT_ON): + case (bpxBat::MAN_HEAT_OFF): { if (packet[2] != 0x01) { return DeviceHandlerIF::DEVICE_DID_NOT_EXECUTE; } break; } - case (BpxBattery::CONFIG_GET): { + case (bpxBat::CONFIG_GET): { PoolReadGuard rg(&cfgSet); ReturnValue_t result = cfgSet.parseRawHk(packet + 2, 3); if (result != returnvalue::OK) { @@ -243,7 +245,7 @@ ReturnValue_t BpxBatteryHandler::interpretDeviceReply(DeviceCommandId_t id, cons cfgSet.setValidity(true, true); break; } - case (BpxBattery::REBOOT): { + case (bpxBat::REBOOT): { break; } default: { @@ -257,20 +259,20 @@ uint32_t BpxBatteryHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) ReturnValue_t BpxBatteryHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_1, &battTemp1); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_2, &battTemp2); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_3, &battTemp3); - localDataPoolMap.emplace(BpxBattery::BATT_TEMP_4, &battTemp4); - localDataPoolMap.emplace(BpxBattery::CHARGE_CURRENT, &chargeCurrent); - localDataPoolMap.emplace(BpxBattery::DISCHARGE_CURRENT, &dischargeCurrent); - localDataPoolMap.emplace(BpxBattery::HEATER_CURRENT, &heaterCurrent); - localDataPoolMap.emplace(BpxBattery::BATT_VOLTAGE, &battVolt); - localDataPoolMap.emplace(BpxBattery::REBOOT_COUNTER, &rebootCounter); - localDataPoolMap.emplace(BpxBattery::BOOTCAUSE, &bootCause); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_1, &battTemp1); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_2, &battTemp2); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_3, &battTemp3); + localDataPoolMap.emplace(bpxBat::BATT_TEMP_4, &battTemp4); + localDataPoolMap.emplace(bpxBat::CHARGE_CURRENT, &chargeCurrent); + localDataPoolMap.emplace(bpxBat::DISCHARGE_CURRENT, &dischargeCurrent); + localDataPoolMap.emplace(bpxBat::HEATER_CURRENT, &heaterCurrent); + localDataPoolMap.emplace(bpxBat::BATT_VOLTAGE, &battVolt); + localDataPoolMap.emplace(bpxBat::REBOOT_COUNTER, &rebootCounter); + localDataPoolMap.emplace(bpxBat::BOOTCAUSE, &bootCause); - localDataPoolMap.emplace(BpxBattery::BATTERY_HEATER_MODE, &battheatMode); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_LOW_LIMIT, &battheatLow); - localDataPoolMap.emplace(BpxBattery::BATTHEAT_HIGH_LIMIT, &battheatHigh); + localDataPoolMap.emplace(bpxBat::BATTERY_HEATER_MODE, &battheatMode); + localDataPoolMap.emplace(bpxBat::BATTHEAT_LOW_LIMIT, &battheatLow); + localDataPoolMap.emplace(bpxBat::BATTHEAT_HIGH_LIMIT, &battheatHigh); poolManager.subscribeForRegularPeriodicPacket( subdp::RegularHkPeriodicParams(hkSet.getSid(), enableHkSets, 20.0)); diff --git a/mission/power/BpxBatteryHandler.h b/mission/power/BpxBatteryHandler.h index 0f6d835c..d01691a9 100644 --- a/mission/power/BpxBatteryHandler.h +++ b/mission/power/BpxBatteryHandler.h @@ -25,7 +25,7 @@ class BpxBatteryHandler : public DeviceHandlerBase { bool commandExecuted = false; bool debugMode = false; bool goToNormalModeImmediately = false; - uint8_t sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE; + uint8_t sentPingByte = bpxBat::DEFAULT_PING_SENT_BYTE; #if OBSW_THREAD_TRACING == 1 uint32_t opCounter = 0; #endif diff --git a/mission/power/bpxBattDefs.h b/mission/power/bpxBattDefs.h index 1808c94a..6df87efd 100644 --- a/mission/power/bpxBattDefs.h +++ b/mission/power/bpxBattDefs.h @@ -8,7 +8,7 @@ #include "fsfw/devicehandlers/DeviceHandlerIF.h" -namespace BpxBattery { +namespace bpxBat { enum LocalPoolIds { CHARGE_CURRENT = 0, @@ -114,18 +114,18 @@ class BpxHkDeserializer : public SerialLinkedListAdapter { } }; -}; // namespace BpxBattery +}; // namespace bpxBat /** * @brief BPX HK data holder */ -class BpxBatteryHk : public StaticLocalDataSet { +class BpxBatteryHk : public StaticLocalDataSet { public: /** * Constructor for data users * @param gyroId */ - BpxBatteryHk(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, BpxBattery::HK_SET_ID)) { + BpxBatteryHk(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, bpxBat::HK_SET_ID)) { setAllVariablesReadOnly(); } @@ -176,28 +176,25 @@ class BpxBatteryHk : public StaticLocalDataSet { } //! Charge current in mA - lp_var_t chargeCurrent = - lp_var_t(sid.objectId, BpxBattery::CHARGE_CURRENT, this); + lp_var_t chargeCurrent = lp_var_t(sid.objectId, bpxBat::CHARGE_CURRENT, this); //! Discharge current in mA lp_var_t dischargeCurrent = - lp_var_t(sid.objectId, BpxBattery::DISCHARGE_CURRENT, this); + lp_var_t(sid.objectId, bpxBat::DISCHARGE_CURRENT, this); //! Heater current in mA - lp_var_t heaterCurrent = - lp_var_t(sid.objectId, BpxBattery::HEATER_CURRENT, this); + lp_var_t heaterCurrent = lp_var_t(sid.objectId, bpxBat::HEATER_CURRENT, this); //! Battery voltage in mV - lp_var_t battVoltage = lp_var_t(sid.objectId, BpxBattery::BATT_VOLTAGE, this); + lp_var_t battVoltage = lp_var_t(sid.objectId, bpxBat::BATT_VOLTAGE, this); //! Battery temperature 1 in degC - lp_var_t battTemp1 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_1, this); + lp_var_t battTemp1 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_1, this); //! Battery temperature 2 in degC - lp_var_t battTemp2 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_2, this); + lp_var_t battTemp2 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_2, this); //! Battery temperature 3 in degC - lp_var_t battTemp3 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_3, this); + lp_var_t battTemp3 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_3, this); //! Battery temperature 4 in degC - lp_var_t battTemp4 = lp_var_t(sid.objectId, BpxBattery::BATT_TEMP_4, this); - lp_var_t rebootCounter = - lp_var_t(sid.objectId, BpxBattery::REBOOT_COUNTER, this); - lp_var_t bootcause = lp_var_t(sid.objectId, BpxBattery::BOOTCAUSE, this); + lp_var_t battTemp4 = lp_var_t(sid.objectId, bpxBat::BATT_TEMP_4, this); + lp_var_t rebootCounter = lp_var_t(sid.objectId, bpxBat::REBOOT_COUNTER, this); + lp_var_t bootcause = lp_var_t(sid.objectId, bpxBat::BOOTCAUSE, this); private: friend class BpxBatteryHandler; @@ -205,16 +202,16 @@ class BpxBatteryHk : public StaticLocalDataSet { * Constructor for data creator * @param hkOwner */ - BpxBatteryHk(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, BpxBattery::HK_SET_ID) {} + BpxBatteryHk(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, bpxBat::HK_SET_ID) {} }; -class BpxBatteryCfg : public StaticLocalDataSet { +class BpxBatteryCfg : public StaticLocalDataSet { public: /** * Constructor for data users * @param gyroId */ - BpxBatteryCfg(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, BpxBattery::CFG_SET_ID)) { + BpxBatteryCfg(object_id_t bpxId) : StaticLocalDataSet(sid_t(bpxId, bpxBat::CFG_SET_ID)) { setAllVariablesReadOnly(); } @@ -230,13 +227,12 @@ class BpxBatteryCfg : public StaticLocalDataSet { //! Mode for battheater [0=OFF,1=Auto] lp_var_t battheatermode = - lp_var_t(sid.objectId, BpxBattery::BATTERY_HEATER_MODE, this); + lp_var_t(sid.objectId, bpxBat::BATTERY_HEATER_MODE, this); //! Turn heater on at [degC] - lp_var_t battheaterLow = - lp_var_t(sid.objectId, BpxBattery::BATTHEAT_LOW_LIMIT, this); + lp_var_t battheaterLow = lp_var_t(sid.objectId, bpxBat::BATTHEAT_LOW_LIMIT, this); //! Turn heater off at [degC] lp_var_t battheaterHigh = - lp_var_t(sid.objectId, BpxBattery::BATTHEAT_HIGH_LIMIT, this); + lp_var_t(sid.objectId, bpxBat::BATTHEAT_HIGH_LIMIT, this); private: friend class BpxBatteryHandler; @@ -244,8 +240,7 @@ class BpxBatteryCfg : public StaticLocalDataSet { * Constructor for data creator * @param hkOwner */ - BpxBatteryCfg(HasLocalDataPoolIF* hkOwner) - : StaticLocalDataSet(hkOwner, BpxBattery::CFG_SET_ID) {} + BpxBatteryCfg(HasLocalDataPoolIF* hkOwner) : StaticLocalDataSet(hkOwner, bpxBat::CFG_SET_ID) {} }; #endif /* MISSION_POWER_BPXBATTDEFS_H_ */ diff --git a/mission/system/EiveSystem.cpp b/mission/system/EiveSystem.cpp index a6f7f0b3..fd8c170d 100644 --- a/mission/system/EiveSystem.cpp +++ b/mission/system/EiveSystem.cpp @@ -73,11 +73,19 @@ ReturnValue_t EiveSystem::initialize() { if (result != returnvalue::OK) { return result; } + auto* bpxDest = ObjectManager::instance()->get(objects::BPX_BATT_HANDLER); if (bpxDest == nullptr) { return ObjectManager::CHILD_INIT_FAILED; } bpxBattQueueId = bpxDest->getCommandQueue(); + + auto* coreCtrl = ObjectManager::instance()->get(objects::CORE_CONTROLLER); + if (coreCtrl == nullptr) { + return ObjectManager::CHILD_INIT_FAILED; + } + coreCtrlQueueId = coreCtrl->getCommandQueue(); + auto* manager = ObjectManager::instance()->get(objects::EVENT_MANAGER); if (manager == nullptr) { #if FSFW_CPP_OSTREAM_ENABLED == 1 @@ -178,51 +186,71 @@ void EiveSystem::i2cRecoveryLogic() { } } if (not isInTransition and performI2cReboot) { - if (i2cRebootState == I2cRebootState::SYSTEM_MODE_BOOT) { - startTransition(satsystem::Mode::BOOT, 0); - i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; - i2cRebootHandlingCountdown.resetTimer(); - } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT) { - if (mode == satsystem::Mode::BOOT) { - result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_OFF); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - commonI2cRecoverySequenceFinish(); - return; - } - CommandMessage msg; - ActionMessage::setCommand(&msg, BpxBattery::REBOOT, store_address_t()); - result = commandQueue->sendMessage(bpxBattQueueId, &msg); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - commonI2cRecoverySequenceFinish(); - return; + switch (i2cRebootState) { + case (I2cRebootState::NONE): { + break; + } + case (I2cRebootState::SYSTEM_MODE_BOOT): { + sif::debug << "going to boot mode" << std::endl; + startTransition(satsystem::Mode::BOOT, 0); + i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT; + i2cRebootHandlingCountdown.resetTimer(); + break; + } + case (I2cRebootState::SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT): { + sif::debug << "3v3 stack off and batt reboot" << std::endl; + if (mode == satsystem::Mode::BOOT) { + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_OFF); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + commonI2cRecoverySequenceFinish(); + return; + } + CommandMessage msg; + store_address_t dummy{}; + ActionMessage::setCommand(&msg, bpxBat::REBOOT, dummy); + result = commandQueue->sendMessage(bpxBattQueueId, &msg); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + commonI2cRecoverySequenceFinish(); + return; + } + i2cRebootState = I2cRebootState::WAIT_CYCLE; } + break; + } + case (I2cRebootState::WAIT_CYCLE): { i2cRebootState = I2cRebootState::SWITCH_3V3_STACK_ON; + break; } - if (i2cRebootHandlingCountdown.hasTimedOut()) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); - performI2cReboot = false; + case (I2cRebootState::SWITCH_3V3_STACK_ON): { + sif::debug << "3v3 stack on" << std::endl; + result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, + PowerSwitchIF::SWITCH_ON); + if (result != returnvalue::OK) { + actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); + commonI2cRecoverySequenceFinish(); + return; + } + i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; + break; } - } else if (i2cRebootState == I2cRebootState::SWITCH_3V3_STACK_ON) { - result = powerSwitcher->sendSwitchCommand(power::Switches::P60_DOCK_3V3_STACK, - PowerSwitchIF::SWITCH_ON); - if (result != returnvalue::OK) { - actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, result); - commonI2cRecoverySequenceFinish(); - return; + case (I2cRebootState::SYSTEM_MODE_SAFE): { + if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == + PowerSwitchIF::SWITCH_ON) { + // This should always be accepted + commonI2cRecoverySequenceFinish(); + sif::debug << "going back to safe" << std::endl; + actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); + } + break; } - i2cRebootState = I2cRebootState::SYSTEM_MODE_SAFE; - } else if (i2cRebootState == I2cRebootState::SYSTEM_MODE_SAFE) { - if (powerSwitcher->getSwitchState(power::Switches::P60_DOCK_3V3_STACK) == - PowerSwitchIF::SWITCH_ON) { - // This should always be accepted - commonI2cRecoverySequenceFinish(); - actionHelper.finish(true, actionCommandedBy, EXECUTE_I2C_REBOOT); + default: { + sif::error << "EiveSystem: Unexpected I2C reboot state" << std::endl; + break; } } - // Timeout handling for the internal procedure. if (i2cRebootState != I2cRebootState::NONE and i2cRebootHandlingCountdown.hasTimedOut()) { actionHelper.finish(false, actionCommandedBy, EXECUTE_I2C_REBOOT, returnvalue::FAILED); @@ -247,3 +275,10 @@ void EiveSystem::commonI2cRecoverySequenceFinish() { // This should always be accepted commandSelfToSafe(); } + +ReturnValue_t EiveSystem::handleCommandMessage(CommandMessage* message) { + if (message->getMessageType() == messagetypes::ACTION) { + return actionHelper.handleActionMessage(message); + } + return Subsystem::handleCommandMessage(message); +} diff --git a/mission/system/EiveSystem.h b/mission/system/EiveSystem.h index d31db17d..fd1d540c 100644 --- a/mission/system/EiveSystem.h +++ b/mission/system/EiveSystem.h @@ -23,6 +23,7 @@ class EiveSystem : public Subsystem, public HasActionsIF { NONE, SYSTEM_MODE_BOOT, SWITCH_3V3_STACK_OFF_AND_BATT_REBOOT, + WAIT_CYCLE, SWITCH_3V3_STACK_ON, SYSTEM_MODE_SAFE } i2cRebootState = I2cRebootState::NONE; @@ -49,6 +50,8 @@ class EiveSystem : public Subsystem, public HasActionsIF { ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t* data, size_t size) override; + ReturnValue_t handleCommandMessage(CommandMessage* message) override; + void i2cRecoveryLogic(); void handleEventMessages(); void commandSelfToSafe(); diff --git a/mission/tcs/HeaterHandler.cpp b/mission/tcs/HeaterHandler.cpp index 4ec82c08..9105e380 100644 --- a/mission/tcs/HeaterHandler.cpp +++ b/mission/tcs/HeaterHandler.cpp @@ -331,7 +331,6 @@ void HeaterHandler::handleSwitchOffCommand(heater::Switchers heaterIdx) { } } } else { - sif::info << "HeaterHandler::handleSwitchOffCommand: Switch already off" << std::endl; triggerEvent(SWITCH_ALREADY_OFF, heaterIdx); } if (heater.replyQueue != NO_COMMANDER) { diff --git a/mission/tcs/HeaterHandler.h b/mission/tcs/HeaterHandler.h index 6787b660..5bbd85f4 100644 --- a/mission/tcs/HeaterHandler.h +++ b/mission/tcs/HeaterHandler.h @@ -101,8 +101,8 @@ class HeaterHandler : public ExecutableObjectIF, static constexpr Event GPIO_PULL_LOW_FAILED = MAKE_EVENT(1, severity::LOW); static constexpr Event HEATER_WENT_ON = event::makeEvent(SUBSYSTEM_ID, 2, severity::INFO); static constexpr Event HEATER_WENT_OFF = event::makeEvent(SUBSYSTEM_ID, 3, severity::INFO); - static constexpr Event SWITCH_ALREADY_ON = MAKE_EVENT(4, severity::LOW); - static constexpr Event SWITCH_ALREADY_OFF = MAKE_EVENT(5, severity::LOW); + static constexpr Event SWITCH_ALREADY_ON = MAKE_EVENT(4, severity::INFO); + static constexpr Event SWITCH_ALREADY_OFF = MAKE_EVENT(5, severity::INFO); static constexpr Event MAIN_SWITCH_TIMEOUT = MAKE_EVENT(6, severity::MEDIUM); //! A faulty heater was one. The SW will autonomously attempt to shut it down. P1: Heater Index static constexpr Event FAULTY_HEATER_WAS_ON = event::makeEvent(SUBSYSTEM_ID, 7, severity::LOW); diff --git a/tmtc b/tmtc index 7e5fa2e6..ad082760 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 7e5fa2e61a3f2b50860fe2e3427f31f7ebaf854f +Subproject commit ad0827607958d0bfbe3dfb903cdd8a65a71e0e7a