diff --git a/CHANGELOG.md b/CHANGELOG.md index a9646256..a277ee5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ list yields a list of all related PRs for each release. ## Added +- PUS11 TC scheduler + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/259 - Regular reboot command PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/242 - Commands for individual RTD devices @@ -31,6 +33,11 @@ list yields a list of all related PRs for each release. username appended at the end is created as a side-product now PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/248 +## Fixed + +- `q7s-cp.py` bugfix + PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/256 + ### Heater - Adds `HealthIF` to heaters. Heaters are own system object with queues now which allows to set them faulty. diff --git a/CMakeLists.txt b/CMakeLists.txt index eb44bd41..ef87352e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,6 +64,8 @@ include(EiveHelpers) option(EIVE_ADD_ETL_LIB "Add ETL library" ON) option(EIVE_ADD_JSON_LIB "Add JSON library" ON) +set(OBSW_MAX_SCHEDULED_TCS 500) + if(EIVE_Q7S_EM) set(OBSW_Q7S_EM 1 diff --git a/bsp_hosted/fsfwconfig/tmtc/apid.h b/bsp_hosted/fsfwconfig/tmtc/apid.h deleted file mode 100644 index 9d5c9ed5..00000000 --- a/bsp_hosted/fsfwconfig/tmtc/apid.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef FSFWCONFIG_TMTC_APID_H_ -#define FSFWCONFIG_TMTC_APID_H_ - -#include - -/** - * Application Process Definition: entity, uniquely identified by an - * application process ID (APID), capable of generating telemetry source - * packets and receiving telecommand packets - * - * SOURCE APID: 0x73 / 115 / s - * APID is a 11 bit number - */ -namespace apid { -static const uint16_t EIVE_OBSW = 0x65; -} - -#endif /* FSFWCONFIG_TMTC_APID_H_ */ diff --git a/bsp_q7s/callbacks/gnssCallback.cpp b/bsp_q7s/callbacks/gnssCallback.cpp index d5dbc3b0..3d29ca4c 100644 --- a/bsp_q7s/callbacks/gnssCallback.cpp +++ b/bsp_q7s/callbacks/gnssCallback.cpp @@ -1,9 +1,14 @@ #include "gnssCallback.h" +#include "fsfw/action/HasActionsIF.h" #include "devices/gpioIds.h" #include "fsfw/tasks/TaskFactory.h" -ReturnValue_t gps::triggerGpioResetPin(void* args) { +ReturnValue_t gps::triggerGpioResetPin(const uint8_t* actionData, size_t len, void* args) { + // At least one byte which denotes which GPS to reset is required + if(len < 1 or actionData == nullptr) { + return HasActionsIF::INVALID_PARAMETERS; + } ResetArgs* resetArgs = reinterpret_cast(args); if (args == nullptr) { return HasReturnvaluesIF::RETURN_FAILED; @@ -12,11 +17,10 @@ ReturnValue_t gps::triggerGpioResetPin(void* args) { return HasReturnvaluesIF::RETURN_FAILED; } gpioId_t gpioId; - if (resetArgs->gnss1) { - gpioId = gpioIds::GNSS_1_NRESET; - - } else { + if (actionData[0] == 0) { gpioId = gpioIds::GNSS_0_NRESET; + } else { + gpioId = gpioIds::GNSS_1_NRESET; } resetArgs->gpioComIF->pullLow(gpioId); TaskFactory::delayTask(resetArgs->waitPeriodMs); diff --git a/bsp_q7s/callbacks/gnssCallback.h b/bsp_q7s/callbacks/gnssCallback.h index 3e769899..cd69f5a6 100644 --- a/bsp_q7s/callbacks/gnssCallback.h +++ b/bsp_q7s/callbacks/gnssCallback.h @@ -5,14 +5,13 @@ #include "fsfw_hal/linux/gpio/LinuxLibgpioIF.h" struct ResetArgs { - bool gnss1 = false; LinuxLibgpioIF* gpioComIF = nullptr; uint32_t waitPeriodMs = 100; }; namespace gps { -ReturnValue_t triggerGpioResetPin(void* args); +ReturnValue_t triggerGpioResetPin(const uint8_t* actionData, size_t len, void* args); } diff --git a/bsp_q7s/core/InitMission.cpp b/bsp_q7s/core/InitMission.cpp index b6a4fa37..492c2890 100644 --- a/bsp_q7s/core/InitMission.cpp +++ b/bsp_q7s/core/InitMission.cpp @@ -429,13 +429,22 @@ void initmission::createPusTasks(TaskFactory& factory, PeriodicTaskIF* pusMedPrio = factory.createPeriodicTask( "PUS_MED_PRIO", 40, PeriodicTaskIF::MINIMUM_STACK_SIZE, 0.8, missedDeadlineFunc); + + result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING); + if (result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("PUS_3", objects::PUS_SERVICE_3_HOUSEKEEPING); + } result = pusMedPrio->addComponent(objects::PUS_SERVICE_8_FUNCTION_MGMT); if (result != HasReturnvaluesIF::RETURN_OK) { initmission::printAddObjectError("PUS_8", objects::PUS_SERVICE_8_FUNCTION_MGMT); } - result = pusMedPrio->addComponent(objects::PUS_SERVICE_3_HOUSEKEEPING); + result = pusMedPrio->addComponent(objects::PUS_SERVICE_11_TC_SCHEDULER); if (result != HasReturnvaluesIF::RETURN_OK) { - sif::error << "Object add component failed" << std::endl; + initmission::printAddObjectError("PUS_11", objects::PUS_SERVICE_11_TC_SCHEDULER); + } + result = pusMedPrio->addComponent(objects::PUS_SERVICE_20_PARAMETERS); + if (result != HasReturnvaluesIF::RETURN_OK) { + initmission::printAddObjectError("PUS_20", objects::PUS_SERVICE_20_PARAMETERS); } result = pusMedPrio->addComponent(objects::PUS_SERVICE_200_MODE_MGMT); if (result != HasReturnvaluesIF::RETURN_OK) { @@ -445,10 +454,6 @@ void initmission::createPusTasks(TaskFactory& factory, if (result != HasReturnvaluesIF::RETURN_OK) { initmission::printAddObjectError("PUS_201", objects::PUS_SERVICE_201_HEALTH); } - result = pusMedPrio->addComponent(objects::PUS_SERVICE_20_PARAMETERS); - if (result != HasReturnvaluesIF::RETURN_OK) { - initmission::printAddObjectError("PUS_20", objects::PUS_SERVICE_20_PARAMETERS); - } taskVec.push_back(pusMedPrio); PeriodicTaskIF* pusLowPrio = factory.createPeriodicTask( diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 8f5d6a63..d8c0a9cb 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -95,8 +95,7 @@ #include "mission/tmtc/VirtualChannel.h" #include "mission/utility/TmFunnel.h" -ResetArgs RESET_ARGS_GNSS_0; -ResetArgs RESET_ARGS_GNSS_1; +ResetArgs RESET_ARGS_GNSS; void Factory::setStaticFrameworkObjectIds() { PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR; @@ -464,15 +463,11 @@ void ObjectFactory::createAcsBoardComponents(LinuxLibgpioIF* gpioComIF, UartComI #if OBSW_DEBUG_GPS == 1 debugGps = true; #endif - RESET_ARGS_GNSS_1.gnss1 = true; - RESET_ARGS_GNSS_1.gpioComIF = gpioComIF; - RESET_ARGS_GNSS_1.waitPeriodMs = 100; - RESET_ARGS_GNSS_0.gnss1 = false; - RESET_ARGS_GNSS_0.gpioComIF = gpioComIF; - RESET_ARGS_GNSS_0.waitPeriodMs = 100; - auto gpsHandler0 = + RESET_ARGS_GNSS.gpioComIF = gpioComIF; + RESET_ARGS_GNSS.waitPeriodMs = 100; + auto gpsCtrl = new GPSHyperionLinuxController(objects::GPS_CONTROLLER, objects::NO_OBJECT, debugGps); - gpsHandler0->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS_0); + gpsCtrl->setResetPinTriggerFunction(gps::triggerGpioResetPin, &RESET_ARGS_GNSS); AcsBoardHelper acsBoardHelper = AcsBoardHelper( objects::MGM_0_LIS3_HANDLER, objects::MGM_1_RM3100_HANDLER, objects::MGM_2_LIS3_HANDLER, diff --git a/common/config/commonConfig.h.in b/common/config/commonConfig.h.in index ad19e135..9581e751 100644 --- a/common/config/commonConfig.h.in +++ b/common/config/commonConfig.h.in @@ -33,6 +33,9 @@ static constexpr uint8_t OBSW_VERSION_REVISION = @OBSW_VERSION_REVISION@; // CST: Commits since tag static const char OBSW_VERSION_CST_GIT_SHA1[] = "@OBSW_VERSION_CST_GIT_SHA1@"; + +static constexpr uint32_t OBSW_MAX_SCHEDULED_TCS = @OBSW_MAX_SCHEDULED_TCS@; + extern const fsfw::Version OBSW_VERSION; extern const uint16_t PUS_PACKET_ID; diff --git a/bsp_hosted/fsfwconfig/tmtc/pusIds.h b/common/config/tmtc/pusIds.h similarity index 71% rename from bsp_hosted/fsfwconfig/tmtc/pusIds.h rename to common/config/tmtc/pusIds.h index 37503786..0891992d 100644 --- a/bsp_hosted/fsfwconfig/tmtc/pusIds.h +++ b/common/config/tmtc/pusIds.h @@ -1,5 +1,5 @@ -#ifndef CONFIG_TMTC_PUSIDS_HPP_ -#define CONFIG_TMTC_PUSIDS_HPP_ +#ifndef COMMON_CONFIG_TMTC_PUSIDS_H_ +#define COMMON_CONFIG_TMTC_PUSIDS_H_ namespace pus { enum Ids { @@ -11,6 +11,7 @@ enum Ids { PUS_SERVICE_6 = 6, PUS_SERVICE_8 = 8, PUS_SERVICE_9 = 9, + PUS_SERVICE_11 = 11, PUS_SERVICE_17 = 17, PUS_SERVICE_19 = 19, PUS_SERVICE_20 = 20, @@ -20,4 +21,4 @@ enum Ids { }; }; -#endif /* CONFIG_TMTC_PUSIDS_HPP_ */ +#endif /* COMMON_CONFIG_TMTC_PUSIDS_H_ */ diff --git a/fsfw b/fsfw index c8355251..76a459a0 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit c8355251967009559ea790b63c3ebfc67a27efef +Subproject commit 76a459a02c9374d3edcb5c52d5c71e94c69d2f0f diff --git a/linux/devices/GPSHyperionLinuxController.cpp b/linux/devices/GPSHyperionLinuxController.cpp index dee3c9af..5d97554a 100644 --- a/linux/devices/GPSHyperionLinuxController.cpp +++ b/linux/devices/GPSHyperionLinuxController.cpp @@ -57,12 +57,12 @@ ReturnValue_t GPSHyperionLinuxController::executeAction(ActionId_t actionId, MessageQueueId_t commandedBy, const uint8_t *data, size_t size) { switch (actionId) { - case (GpsHyperion::TRIGGER_RESET_PIN): { + case (GpsHyperion::TRIGGER_RESET_PIN_GNSS): { if (resetCallback != nullptr) { PoolReadGuard pg(&gpsSet); // Set HK entries invalid gpsSet.setValidity(false, true); - resetCallback(resetCallbackArgs); + resetCallback(data, size, resetCallbackArgs); return HasActionsIF::EXECUTION_FINISHED; } return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; diff --git a/linux/devices/GPSHyperionLinuxController.h b/linux/devices/GPSHyperionLinuxController.h index 94e82023..35ce0a63 100644 --- a/linux/devices/GPSHyperionLinuxController.h +++ b/linux/devices/GPSHyperionLinuxController.h @@ -30,7 +30,7 @@ class GPSHyperionLinuxController : public ExtendedControllerBase { bool debugHyperionGps = false); virtual ~GPSHyperionLinuxController(); - using gpioResetFunction_t = ReturnValue_t (*)(void* args); + using gpioResetFunction_t = ReturnValue_t (*)(const uint8_t* actionData, size_t len, void* args); void setResetPinTriggerFunction(gpioResetFunction_t resetCallback, void* args); ReturnValue_t handleCommandMessage(CommandMessage* message) override; diff --git a/linux/fsfwconfig/tmtc/pusIds.h b/linux/fsfwconfig/tmtc/pusIds.h deleted file mode 100644 index 37503786..00000000 --- a/linux/fsfwconfig/tmtc/pusIds.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef CONFIG_TMTC_PUSIDS_HPP_ -#define CONFIG_TMTC_PUSIDS_HPP_ - -namespace pus { -enum Ids { - PUS_SERVICE_1 = 1, - PUS_SERVICE_2 = 2, - PUS_SERVICE_3 = 3, - PUS_SERVICE_3_PSB = 3, - PUS_SERVICE_5 = 5, - PUS_SERVICE_6 = 6, - PUS_SERVICE_8 = 8, - PUS_SERVICE_9 = 9, - PUS_SERVICE_17 = 17, - PUS_SERVICE_19 = 19, - PUS_SERVICE_20 = 20, - PUS_SERVICE_23 = 23, - PUS_SERVICE_200 = 200, - PUS_SERVICE_201 = 201, -}; -}; - -#endif /* CONFIG_TMTC_PUSIDS_HPP_ */ diff --git a/mission/core/GenericFactory.cpp b/mission/core/GenericFactory.cpp index 3ab598f3..06e1fa29 100644 --- a/mission/core/GenericFactory.cpp +++ b/mission/core/GenericFactory.cpp @@ -13,6 +13,7 @@ #include #include #include +#include "fsfw/pus/Service11TelecommandScheduling.h" #include #include #include @@ -73,7 +74,7 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_) { new PoolManager(objects::IPC_STORE, poolCfg); } - new CCSDSDistributor(apid::EIVE_OBSW, objects::CCSDS_PACKET_DISTRIBUTOR); + auto* ccsdsDistrib = new CCSDSDistributor(apid::EIVE_OBSW, objects::CCSDS_PACKET_DISTRIBUTOR); new PUSDistributor(apid::EIVE_OBSW, objects::PUS_PACKET_DISTRIBUTOR, objects::CCSDS_PACKET_DISTRIBUTOR); @@ -96,6 +97,9 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_) { new Service8FunctionManagement(objects::PUS_SERVICE_8_FUNCTION_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_8, 3, 60); new Service9TimeManagement(objects::PUS_SERVICE_9_TIME_MGMT, apid::EIVE_OBSW, pus::PUS_SERVICE_9); + + new Service11TelecommandScheduling(objects::PUS_SERVICE_11_TC_SCHEDULER, + apid::EIVE_OBSW, pus::PUS_SERVICE_11, ccsdsDistrib); new Service17Test(objects::PUS_SERVICE_17_TEST, apid::EIVE_OBSW, pus::PUS_SERVICE_17); new Service20ParameterManagement(objects::PUS_SERVICE_20_PARAMETERS, apid::EIVE_OBSW, pus::PUS_SERVICE_20); @@ -120,6 +124,6 @@ void ObjectFactory::produceGenericObjects(HealthTableIF** healthTable_) { tcpServer->enableWiretapping(true); #endif /* OBSW_TCP_SERVER_WIRETAPPING == 1 */ #endif /* OBSW_USE_TMTC_TCP_BRIDGE == 0 */ - tmtcBridge->setMaxNumberOfPacketsStored(70); + tmtcBridge->setMaxNumberOfPacketsStored(300); #endif /* OBSW_ADD_TCPIP_BRIDGE == 1 */ } diff --git a/mission/devices/ACUHandler.cpp b/mission/devices/ACUHandler.cpp index f881479d..a3b5eeee 100644 --- a/mission/devices/ACUHandler.cpp +++ b/mission/devices/ACUHandler.cpp @@ -6,7 +6,8 @@ ACUHandler::ACUHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCoo FailureIsolationBase *customFdir) : GomspaceDeviceHandler(objectId, comIF, comCookie, customFdir, ACU::MAX_CONFIGTABLE_ADDRESS, ACU::MAX_HKTABLE_ADDRESS, ACU::HK_TABLE_REPLY_SIZE), - acuHkTableDataset(this) {} + coreHk(this), + auxHk(this) {} ACUHandler::~ACUHandler() {} @@ -15,243 +16,145 @@ ReturnValue_t ACUHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) { return buildCommandFromCommand(*id, NULL, 0); } -void ACUHandler::fillCommandAndReplyMap() { - GomspaceDeviceHandler::fillCommandAndReplyMap(); - this->insertInCommandMap(PRINT_CHANNEL_STATS); -} +void ACUHandler::fillCommandAndReplyMap() { GomspaceDeviceHandler::fillCommandAndReplyMap(); } void ACUHandler::letChildHandleHkReply(DeviceCommandId_t id, const uint8_t *packet) { parseHkTableReply(packet); - handleDeviceTM(&acuHkTableDataset, id, true); - if (debugMode) { #if OBSW_VERBOSE_LEVEL >= 1 - acuHkTableDataset.read(); - float temperatureC_1 = acuHkTableDataset.temperature1.value * 0.1; - float temperatureC_2 = acuHkTableDataset.temperature2.value * 0.1; - float temperatureC_3 = acuHkTableDataset.temperature3.value * 0.1; - sif::info << "ACU: Temperature 1: " << temperatureC_1 << " °C" << std::endl; - sif::info << "ACU: Temperature 2: " << temperatureC_2 << " °C" << std::endl; - sif::info << "ACU: Temperature 3: " << temperatureC_3 << " °C" << std::endl; - sif::info << "ACU: Ground Watchdog Timer Count: " << acuHkTableDataset.wdtCntGnd.value - << std::endl; + PoolReadGuard pg0(&auxHk); + PoolReadGuard pg1(&coreHk); + if (pg0.getReadResult() != RETURN_OK or pg1.getReadResult() != RETURN_OK) { + return; + } + for (size_t idx = 0; idx < 3; idx++) { + float tempC = coreHk.temperatures[idx] * 0.1; + sif::info << "ACU: Temperature " << idx << ": " << tempC << " °C" << std::endl; + } + sif::info << "ACU: Ground Watchdog Timer Count: " << auxHk.wdtCntGnd.value << std::endl; sif::info << "ACU: Ground watchdog timer, seconds left before reboot: " - << acuHkTableDataset.wdtGndLeft.value << std::endl; - acuHkTableDataset.commit(); + << auxHk.wdtGndLeft.value << std::endl; #endif } } LocalPoolDataSetBase *ACUHandler::getDataSetHandle(sid_t sid) { - if (sid == acuHkTableDataset.getSid()) { - return &acuHkTableDataset; + if (sid == coreHk.getSid()) { + return &coreHk; + } else if (sid == auxHk.getSid()) { + return &auxHk; } return nullptr; } -void ACUHandler::parseHkTableReply(const uint8_t *packet) { +ReturnValue_t ACUHandler::parseHkTableReply(const uint8_t *packet) { uint16_t dataOffset = 0; - acuHkTableDataset.read(); + PoolReadGuard pg0(&coreHk); + PoolReadGuard pg1(&auxHk); + auto res0 = pg0.getReadResult(); + auto res1 = pg1.getReadResult(); + if (res0 != RETURN_OK) { + return res0; + } + if (res1 != RETURN_OK) { + return res1; + } dataOffset += 12; - acuHkTableDataset.currentInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + for (size_t idx = 0; idx < 6; idx++) { + coreHk.currentInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + for (size_t idx = 0; idx < 6; idx++) { + coreHk.voltageInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + + coreHk.vcc = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.currentInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.currentInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + coreHk.vbat = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.voltageInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.voltageInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; + for (size_t idx = 0; idx < 3; idx++) { + coreHk.temperatures[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } - acuHkTableDataset.vcc = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vbat = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.temperature1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.temperature2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.temperature3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.mpptMode = *(packet + dataOffset); + coreHk.mpptMode = packet[dataOffset]; dataOffset += 3; - acuHkTableDataset.vboostInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.vboostInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; + for (size_t idx = 0; idx < 6; idx++) { + coreHk.vboostInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + for (size_t idx = 0; idx < 6; idx++) { + coreHk.powerInChannels[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } + for (size_t idx = 0; idx < 3; idx++) { + auxHk.dacEnables[idx] = packet[dataOffset]; + dataOffset += 3; + } + for (size_t idx = 0; idx < 6; idx++) { + auxHk.dacRawChannelVals[idx] = (packet[dataOffset] << 8) | packet[dataOffset + 1]; + dataOffset += 4; + } - acuHkTableDataset.powerInChannel0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.powerInChannel5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.dac0Enable = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.dac1Enable = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.dac2Enable = *(packet + dataOffset); - dataOffset += 3; - - acuHkTableDataset.dacRawChannelVal0 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal1 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal2 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal3 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal4 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - acuHkTableDataset.dacRawChannelVal5 = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); - dataOffset += 4; - - acuHkTableDataset.bootCause = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + auxHk.bootCause = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.bootcnt = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + coreHk.bootcnt = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.uptime = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + coreHk.uptime = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.resetCause = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + auxHk.resetCause = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.mpptTime = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + coreHk.mpptTime = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); /* +12 because here starts the second csp packet */ dataOffset += 2 + 12; - acuHkTableDataset.mpptPeriod = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); + coreHk.mpptPeriod = *(packet + dataOffset) << 8 | *(packet + dataOffset + 1); dataOffset += 4; - acuHkTableDataset.device0 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device1 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device2 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device3 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device4 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device5 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device6 = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device7 = *(packet + dataOffset); - dataOffset += 3; + for (size_t idx = 0; idx < 8; idx++) { + auxHk.deviceTypes[idx] = packet[dataOffset]; + dataOffset += 3; + } + for (size_t idx = 0; idx < 8; idx++) { + auxHk.devicesStatus[idx] = packet[dataOffset]; + dataOffset += 3; + } - acuHkTableDataset.device0Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device1Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device2Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device3Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device4Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device5Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device6Status = *(packet + dataOffset); - dataOffset += 3; - acuHkTableDataset.device7Status = *(packet + dataOffset); - dataOffset += 3; - - acuHkTableDataset.wdtCntGnd = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + auxHk.wdtCntGnd = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - acuHkTableDataset.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | - *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); + auxHk.wdtGndLeft = *(packet + dataOffset) << 24 | *(packet + dataOffset + 1) << 16 | + *(packet + dataOffset + 2) << 8 | *(packet + dataOffset + 3); dataOffset += 6; - - acuHkTableDataset.commit(); + coreHk.setValidity(true, true); + auxHk.setValidity(true, true); + return RETURN_OK; } ReturnValue_t ACUHandler::initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) { using namespace P60System; - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNEL5, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNEL5, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_CURRENT_IN_CHANNELS, new PoolEntry(6)); + localDataPoolMap.emplace(pool::ACU_VOLTAGE_IN_CHANNELS, new PoolEntry(6)); localDataPoolMap.emplace(pool::ACU_VCC, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_VBAT, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_TEMPERATURE_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_TEMPERATURE_2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_TEMPERATURE_3, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_TEMPERATURES, new PoolEntry(3)); localDataPoolMap.emplace(pool::ACU_MPPT_MODE, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_VBOOST_CHANNEL5, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_VBOOST_IN_CHANNELS, new PoolEntry(6)); + localDataPoolMap.emplace(pool::ACU_POWER_IN_CHANNELS, new PoolEntry(6)); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_POWER_CHANNEL5, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_DAC_EN_0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_EN_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_EN_2, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_DAC_RAW_0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DAC_RAW_5, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_DAC_ENABLES, new PoolEntry(3)); + localDataPoolMap.emplace(pool::ACU_DAC_RAW_CHANNELS, new PoolEntry(6)); localDataPoolMap.emplace(pool::ACU_BOOTCAUSE, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_BOOTCNT, new PoolEntry({0})); @@ -260,65 +163,47 @@ ReturnValue_t ACUHandler::initializeLocalDataPool(localpool::DataPool &localData localDataPoolMap.emplace(pool::ACU_MPPT_TIME, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_MPPT_PERIOD, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_0, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_1, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_2, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_3, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_4, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_5, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_6, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_7, new PoolEntry({0})); - - localDataPoolMap.emplace(pool::ACU_DEVICE_0_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_1_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_2_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_3_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_4_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_5_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_6_STATUS, new PoolEntry({0})); - localDataPoolMap.emplace(pool::ACU_DEVICE_7_STATUS, new PoolEntry({0})); + localDataPoolMap.emplace(pool::ACU_DEVICES, new PoolEntry(8)); + localDataPoolMap.emplace(pool::ACU_DEVICES_STATUS, new PoolEntry(8)); localDataPoolMap.emplace(pool::ACU_WDT_CNT_GND, new PoolEntry({0})); localDataPoolMap.emplace(pool::ACU_WDT_GND_LEFT, new PoolEntry({0})); - poolManager.subscribeForPeriodicPacket(acuHkTableDataset.getSid(), false, 30.0, false); + poolManager.subscribeForPeriodicPacket(coreHk.getSid(), false, 10.0, true); + poolManager.subscribeForPeriodicPacket(auxHk.getSid(), false, 30.0, false); return HasReturnvaluesIF::RETURN_OK; } -ReturnValue_t ACUHandler::childCommandHook(DeviceCommandId_t cmd, const uint8_t *commandData, - size_t commandDataLen) { - switch (cmd) { - case PRINT_CHANNEL_STATS: { - printChannelStats(); - return RETURN_OK; - } - default: { - return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED; - } +void ACUHandler::printChannelStats() { + PoolReadGuard pg(&coreHk); + sif::info << "ACU Info: Current [mA], Voltage [mV]" << std::endl; + for (size_t idx = 0; idx < 6; idx++) { + sif::info << std::setw(8) << std::left << "Channel " << idx << std::dec << "| " + << static_cast(coreHk.currentInChannels[idx]) << std::setw(15) + << std::right << coreHk.voltageInChannels[idx] << std::endl; } } -void ACUHandler::printChannelStats() { - PoolReadGuard pg(&acuHkTableDataset); - sif::info << "ACU Info: Current [mA], Voltage [mV]" << std::endl; - sif::info << std::setw(8) << std::left << "Ch0" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel0.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel0.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch1" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel1.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel1.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch2" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel2.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel2.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch3" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel3.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel3.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch4" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel4.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel4.value << std::endl; - sif::info << std::setw(8) << std::left << "Ch5" << std::dec << "| " - << static_cast(acuHkTableDataset.currentInChannel5.value) << std::setw(15) - << std::right << acuHkTableDataset.voltageInChannel5.value << std::endl; -} - void ACUHandler::setDebugMode(bool enable) { this->debugMode = enable; } + +ReturnValue_t ACUHandler::printStatus(DeviceCommandId_t cmd) { + ReturnValue_t result = RETURN_OK; + switch (cmd) { + case (GOMSPACE::PRINT_SWITCH_V_I): { + PoolReadGuard pg(&coreHk); + result = pg.getReadResult(); + if (result != HasReturnvaluesIF::RETURN_OK) { + break; + } + printChannelStats(); + break; + } + default: { + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; + } + } + if (result != HasReturnvaluesIF::RETURN_OK) { + sif::warning << "Reading PDU1 HK table failed!" << std::endl; + } + return result; +} diff --git a/mission/devices/ACUHandler.h b/mission/devices/ACUHandler.h index 16a7c6db..3154e547 100644 --- a/mission/devices/ACUHandler.h +++ b/mission/devices/ACUHandler.h @@ -29,24 +29,22 @@ class ACUHandler : public GomspaceDeviceHandler { */ virtual ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; - virtual void fillCommandAndReplyMap() override; + ReturnValue_t printStatus(DeviceCommandId_t cmd) override; - virtual ReturnValue_t childCommandHook(DeviceCommandId_t cmd, const uint8_t* commandData, - size_t commandDataLen) override; + virtual void fillCommandAndReplyMap() override; LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override; private: - static const DeviceCommandId_t PRINT_CHANNEL_STATS = 51; - - ACU::HkTableDataset acuHkTableDataset; + ACU::CoreHk coreHk; + ACU::AuxHk auxHk; bool debugMode = false; /** * @brief Function extracts the hk table information from the received csp packet and stores * the values in the acuHkTableDataset. */ - void parseHkTableReply(const uint8_t* packet); + ReturnValue_t parseHkTableReply(const uint8_t* packet); /** * @brief Prints channel statistics (current and voltage) to console diff --git a/mission/devices/P60DockHandler.cpp b/mission/devices/P60DockHandler.cpp index f1df649d..25fb238f 100644 --- a/mission/devices/P60DockHandler.cpp +++ b/mission/devices/P60DockHandler.cpp @@ -251,7 +251,7 @@ ReturnValue_t P60DockHandler::printStatus(DeviceCommandId_t cmd) { return HasReturnvaluesIF::RETURN_OK; } default: { - return HasReturnvaluesIF::RETURN_FAILED; + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; } } sif::warning << "Reading P60 Dock HK table failed" << std::endl; diff --git a/mission/devices/PDU1Handler.cpp b/mission/devices/PDU1Handler.cpp index 44f8fb04..fca0fbeb 100644 --- a/mission/devices/PDU1Handler.cpp +++ b/mission/devices/PDU1Handler.cpp @@ -122,7 +122,7 @@ ReturnValue_t PDU1Handler::printStatus(DeviceCommandId_t cmd) { break; } default: { - return HasReturnvaluesIF::RETURN_FAILED; + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; } } if (result != HasReturnvaluesIF::RETURN_OK) { diff --git a/mission/devices/PDU2Handler.cpp b/mission/devices/PDU2Handler.cpp index 1476f95d..d0cef3f5 100644 --- a/mission/devices/PDU2Handler.cpp +++ b/mission/devices/PDU2Handler.cpp @@ -76,7 +76,7 @@ ReturnValue_t PDU2Handler::printStatus(DeviceCommandId_t cmd) { break; } default: { - return HasReturnvaluesIF::RETURN_FAILED; + return DeviceHandlerIF::COMMAND_NOT_SUPPORTED; } } if (result != HasReturnvaluesIF::RETURN_OK) { diff --git a/mission/devices/RadiationSensorHandler.cpp b/mission/devices/RadiationSensorHandler.cpp index b3a9954a..f2694476 100644 --- a/mission/devices/RadiationSensorHandler.cpp +++ b/mission/devices/RadiationSensorHandler.cpp @@ -158,18 +158,18 @@ ReturnValue_t RadiationSensorHandler::interpretDeviceReply(DeviceCommandId_t id, int16_t tempRaw = ((packet[offset] & 0x0f) << 8) | packet[offset + 1]; dataset.temperatureCelcius = tempRaw * 0.125; offset += 2; - dataset.ain0 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain0 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain1 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain1 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 6; - dataset.ain4 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain4 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain5 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain5 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain6 = (*(packet + offset) << 8 | *(packet + offset + 1)); + dataset.ain6 = (*(packet + offset) << 8) | *(packet + offset + 1); offset += 2; - dataset.ain7 = (*(packet + offset) << 8 | *(packet + offset + 1)); - + dataset.ain7 = (*(packet + offset) << 8) | *(packet + offset + 1); + dataset.setValidity(true, true); if (printPeriodicData) { sif::info << "Radiation sensor temperature: " << dataset.temperatureCelcius << " °C" << std::dec << std::endl; diff --git a/mission/devices/devicedefinitions/GPSDefinitions.h b/mission/devices/devicedefinitions/GPSDefinitions.h index f953da22..e842f54b 100644 --- a/mission/devices/devicedefinitions/GPSDefinitions.h +++ b/mission/devices/devicedefinitions/GPSDefinitions.h @@ -14,7 +14,7 @@ static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::GPS_HANDLER; static constexpr Event GPS_FIX_CHANGE = event::makeEvent(SUBSYSTEM_ID, 0, severity::INFO); static constexpr DeviceCommandId_t GPS_REPLY = 0; -static constexpr DeviceCommandId_t TRIGGER_RESET_PIN = 5; +static constexpr DeviceCommandId_t TRIGGER_RESET_PIN_GNSS = 5; static constexpr uint32_t DATASET_ID = 0; diff --git a/mission/devices/devicedefinitions/GomspaceDefinitions.h b/mission/devices/devicedefinitions/GomspaceDefinitions.h index 5c59d3d8..18059fc8 100644 --- a/mission/devices/devicedefinitions/GomspaceDefinitions.h +++ b/mission/devices/devicedefinitions/GomspaceDefinitions.h @@ -38,7 +38,8 @@ static const DeviceCommandId_t PARAM_GET = 0; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t PARAM_SET = 255; //!< [EXPORT] : [COMMAND] static const DeviceCommandId_t REQUEST_HK_TABLE = 16; //!< [EXPORT] : [COMMAND] -//!< [EXPORT] : [COMMAND] Print switch states, voltages and currents to the console +//! [EXPORT] : [COMMAND] Print switch states, voltages and currents to the console +//! For the ACU device, only print voltages and currents of the 6 ACU channels static const DeviceCommandId_t PRINT_SWITCH_V_I = 32; static const DeviceCommandId_t PRINT_LATCHUPS = 33; @@ -55,7 +56,8 @@ enum class SetIds : uint32_t { PDU_2_AUX = 4, P60_CORE = 5, P60_AUX = 6, - ACU = 7 + ACU_CORE = 7, + ACU_AUX = 8 }; namespace pool { @@ -129,67 +131,24 @@ enum Ids : lp_id_t { PDU_WDT_CSP_LEFT2, /** ACU Ids */ - ACU_CURRENT_IN_CHANNEL0, - ACU_CURRENT_IN_CHANNEL1, - ACU_CURRENT_IN_CHANNEL2, - ACU_CURRENT_IN_CHANNEL3, - ACU_CURRENT_IN_CHANNEL4, - ACU_CURRENT_IN_CHANNEL5, - ACU_VOLTAGE_IN_CHANNEL0, - ACU_VOLTAGE_IN_CHANNEL1, - ACU_VOLTAGE_IN_CHANNEL2, - ACU_VOLTAGE_IN_CHANNEL3, - ACU_VOLTAGE_IN_CHANNEL4, - ACU_VOLTAGE_IN_CHANNEL5, + ACU_CURRENT_IN_CHANNELS, + ACU_VOLTAGE_IN_CHANNELS, ACU_VCC, ACU_VBAT, - ACU_TEMPERATURE_1, - ACU_TEMPERATURE_2, - ACU_TEMPERATURE_3, + ACU_TEMPERATURES, ACU_MPPT_MODE, - ACU_VBOOST_CHANNEL0, - ACU_VBOOST_CHANNEL1, - ACU_VBOOST_CHANNEL2, - ACU_VBOOST_CHANNEL3, - ACU_VBOOST_CHANNEL4, - ACU_VBOOST_CHANNEL5, - ACU_POWER_CHANNEL0, - ACU_POWER_CHANNEL1, - ACU_POWER_CHANNEL2, - ACU_POWER_CHANNEL3, - ACU_POWER_CHANNEL4, - ACU_POWER_CHANNEL5, - ACU_DAC_EN_0, - ACU_DAC_EN_1, - ACU_DAC_EN_2, - ACU_DAC_RAW_0, - ACU_DAC_RAW_1, - ACU_DAC_RAW_2, - ACU_DAC_RAW_3, - ACU_DAC_RAW_4, - ACU_DAC_RAW_5, + ACU_VBOOST_IN_CHANNELS, + ACU_POWER_IN_CHANNELS, + ACU_DAC_ENABLES, + ACU_DAC_RAW_CHANNELS, ACU_BOOTCAUSE, ACU_BOOTCNT, ACU_UPTIME, ACU_RESET_CAUSE, ACU_MPPT_TIME, ACU_MPPT_PERIOD, - ACU_DEVICE_0, - ACU_DEVICE_1, - ACU_DEVICE_2, - ACU_DEVICE_3, - ACU_DEVICE_4, - ACU_DEVICE_5, - ACU_DEVICE_6, - ACU_DEVICE_7, - ACU_DEVICE_0_STATUS, - ACU_DEVICE_1_STATUS, - ACU_DEVICE_2_STATUS, - ACU_DEVICE_3_STATUS, - ACU_DEVICE_4_STATUS, - ACU_DEVICE_5_STATUS, - ACU_DEVICE_6_STATUS, - ACU_DEVICE_7_STATUS, + ACU_DEVICES, + ACU_DEVICES_STATUS, ACU_WDT_CNT_GND, ACU_WDT_GND_LEFT, }; @@ -592,143 +551,76 @@ static const uint16_t MAX_HKTABLE_ADDRESS = 120; static const uint8_t HK_TABLE_ENTRIES = 64; static const uint16_t HK_TABLE_REPLY_SIZE = 262; -/** - * @brief This class defines a dataset for the hk table of the ACU. - */ -class HkTableDataset : public StaticLocalDataSet { +class CoreHk : public StaticLocalDataSet<14> { public: - HkTableDataset(HasLocalDataPoolIF* owner) - : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU)) {} + CoreHk(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU_CORE)) {} - HkTableDataset(object_id_t objectId) - : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU))) {} - - lp_var_t currentInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL0, this); - lp_var_t currentInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL1, this); - lp_var_t currentInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL2, this); - lp_var_t currentInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL3, this); - lp_var_t currentInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL4, this); - lp_var_t currentInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNEL5, this); - - lp_var_t voltageInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL0, this); - lp_var_t voltageInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL1, this); - lp_var_t voltageInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL2, this); - lp_var_t voltageInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL3, this); - lp_var_t voltageInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL4, this); - lp_var_t voltageInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNEL5, this); - - lp_var_t vcc = lp_var_t(sid.objectId, P60System::pool::ACU_VCC, this); - lp_var_t vbat = lp_var_t(sid.objectId, P60System::pool::ACU_VBAT, this); - - lp_var_t temperature1 = - lp_var_t(sid.objectId, P60System::pool::ACU_TEMPERATURE_1, this); - lp_var_t temperature2 = - lp_var_t(sid.objectId, P60System::pool::ACU_TEMPERATURE_2, this); - lp_var_t temperature3 = - lp_var_t(sid.objectId, P60System::pool::ACU_TEMPERATURE_3, this); + CoreHk(object_id_t objectId) + : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU_CORE))) {} lp_var_t mpptMode = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_MODE, this); - lp_var_t vboostInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL0, this); - lp_var_t vboostInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL1, this); - lp_var_t vboostInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL2, this); - lp_var_t vboostInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL3, this); - lp_var_t vboostInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL4, this); - lp_var_t vboostInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_VBOOST_CHANNEL5, this); + lp_vec_t currentInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_CURRENT_IN_CHANNELS, this); + lp_vec_t voltageInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_VOLTAGE_IN_CHANNELS, this); - lp_var_t powerInChannel0 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL0, this); - lp_var_t powerInChannel1 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL1, this); - lp_var_t powerInChannel2 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL2, this); - lp_var_t powerInChannel3 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL3, this); - lp_var_t powerInChannel4 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL4, this); - lp_var_t powerInChannel5 = - lp_var_t(sid.objectId, P60System::pool::ACU_POWER_CHANNEL5, this); + lp_var_t vcc = lp_var_t(sid.objectId, P60System::pool::ACU_VCC, this); + lp_var_t vbat = lp_var_t(sid.objectId, P60System::pool::ACU_VBAT, this); - lp_var_t dac0Enable = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_EN_0, this); - lp_var_t dac1Enable = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_EN_1, this); - lp_var_t dac2Enable = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_EN_2, this); + lp_vec_t vboostInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_VBOOST_IN_CHANNELS, this); + lp_vec_t powerInChannels = + lp_vec_t(sid.objectId, P60System::pool::ACU_POWER_IN_CHANNELS, this); - lp_var_t dacRawChannelVal0 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_0, this); - lp_var_t dacRawChannelVal1 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_1, this); - lp_var_t dacRawChannelVal2 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_2, this); - lp_var_t dacRawChannelVal3 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_3, this); - lp_var_t dacRawChannelVal4 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_4, this); - lp_var_t dacRawChannelVal5 = - lp_var_t(sid.objectId, P60System::pool::ACU_DAC_RAW_5, this); + lp_vec_t temperatures = + lp_vec_t(sid.objectId, P60System::pool::ACU_TEMPERATURES, this); - lp_var_t bootCause = - lp_var_t(sid.objectId, P60System::pool::ACU_BOOTCAUSE, this); lp_var_t bootcnt = lp_var_t(sid.objectId, P60System::pool::ACU_BOOTCNT, this); lp_var_t uptime = lp_var_t(sid.objectId, P60System::pool::ACU_UPTIME, this); - lp_var_t resetCause = - lp_var_t(sid.objectId, P60System::pool::ACU_RESET_CAUSE, this); lp_var_t mpptTime = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_TIME, this); lp_var_t mpptPeriod = lp_var_t(sid.objectId, P60System::pool::ACU_MPPT_PERIOD, this); +}; +/** + * @brief This class defines a dataset for the hk table of the ACU. + */ +class AuxHk : public StaticLocalDataSet<12> { + public: + AuxHk(HasLocalDataPoolIF* owner) + : StaticLocalDataSet(owner, static_cast(::P60System::SetIds::ACU_AUX)) {} - lp_var_t device0 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_0, this); - lp_var_t device1 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_1, this); - lp_var_t device2 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_2, this); - lp_var_t device3 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_3, this); - lp_var_t device4 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_4, this); - lp_var_t device5 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_5, this); - lp_var_t device6 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_6, this); - lp_var_t device7 = lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_7, this); + AuxHk(object_id_t objectId) + : StaticLocalDataSet(sid_t(objectId, static_cast(::P60System::SetIds::ACU_AUX))) {} - lp_var_t device0Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_0_STATUS, this); - lp_var_t device1Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_1_STATUS, this); - lp_var_t device2Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_2_STATUS, this); - lp_var_t device3Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_3_STATUS, this); - lp_var_t device4Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_4_STATUS, this); - lp_var_t device5Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_5_STATUS, this); - lp_var_t device6Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_6_STATUS, this); - lp_var_t device7Status = - lp_var_t(sid.objectId, P60System::pool::ACU_DEVICE_7_STATUS, this); + lp_vec_t dacEnables = + lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_ENABLES, this); + + lp_vec_t dacRawChannelVals = + lp_vec_t(sid.objectId, P60System::pool::ACU_DAC_RAW_CHANNELS, this); + + lp_var_t bootCause = + lp_var_t(sid.objectId, P60System::pool::ACU_BOOTCAUSE, this); + lp_var_t resetCause = + lp_var_t(sid.objectId, P60System::pool::ACU_RESET_CAUSE, this); lp_var_t wdtCntGnd = lp_var_t(sid.objectId, P60System::pool::ACU_WDT_CNT_GND, this); lp_var_t wdtGndLeft = lp_var_t(sid.objectId, P60System::pool::ACU_WDT_GND_LEFT, this); + + /** + * There are 8 devices on the PDU. FRAM, ADCs, temperature sensor etc. Each device is + * identified by an ID. Refer also to gs-man-nanopower-p60-pdu-200-1.pdf on pages 17 and 18. + */ + lp_vec_t deviceTypes = + lp_vec_t(sid.objectId, P60System::pool::ACU_DEVICES, this); + /** The status of each device. 0 = None, 1 = Ok, 2 = Error, 3 = Not found */ + lp_vec_t devicesStatus = + lp_vec_t(sid.objectId, P60System::pool::ACU_DEVICES_STATUS, this); }; } // namespace ACU diff --git a/scripts/q7s-cp.py b/scripts/q7s-cp.py index a189e3e6..d0543b45 100755 --- a/scripts/q7s-cp.py +++ b/scripts/q7s-cp.py @@ -27,7 +27,7 @@ def prompt_ssh_key_removal(): print("Invalid port detected") else: break - cmd = f'ssh-keygen -f "${{HOME}}/.ssh/known_hosts" -R "[localhost]:${port}"' + cmd = f'ssh-keygen -f "$HOME/.ssh/known_hosts" -R "[localhost]:{port}"' print(f"Removing problematic SSH key with command {cmd}..") os.system(cmd) diff --git a/tmtc b/tmtc index 6a209e1a..8a008557 160000 --- a/tmtc +++ b/tmtc @@ -1 +1 @@ -Subproject commit 6a209e1a0badc0db91a03e1ef32d43de54d58958 +Subproject commit 8a008557983d496239a0afe252c8bb38983d2f11