From 513c907962b6711bad909f9d9ef9eab25073ffa0 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Thu, 10 Feb 2022 16:55:06 +0100 Subject: [PATCH] pass comn if to handler --- bsp_q7s/core/ObjectFactory.cpp | 3 +- linux/devices/PayloadPcduHandler.cpp | 52 ++++++++++++++++++++++------ linux/devices/PayloadPcduHandler.h | 12 +++++-- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/bsp_q7s/core/ObjectFactory.cpp b/bsp_q7s/core/ObjectFactory.cpp index 7340e02d..0ba71665 100644 --- a/bsp_q7s/core/ObjectFactory.cpp +++ b/bsp_q7s/core/ObjectFactory.cpp @@ -1082,7 +1082,8 @@ void ObjectFactory::createPlPcduComponents(LinuxLibgpioIF* gpioComIF, SpiComIF* q7s::SPI_DEFAULT_DEV, plpcdu::MAX_ADC_REPLY_SIZE, spi::DEFAULT_MAX_1227_MODE, spi::DEFAULT_MAX_1227_SPEED); // Create device handler components - auto plPcduHandler = PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie); + auto plPcduHandler = PayloadPcduHandler(objects::PLPCDU_HANDLER, objects::SPI_COM_IF, spiCookie, + gpioComIF); } void ObjectFactory::createTestComponents(LinuxLibgpioIF* gpioComIF) { diff --git a/linux/devices/PayloadPcduHandler.cpp b/linux/devices/PayloadPcduHandler.cpp index 95789c87..fdd98b73 100644 --- a/linux/devices/PayloadPcduHandler.cpp +++ b/linux/devices/PayloadPcduHandler.cpp @@ -1,24 +1,54 @@ #include "PayloadPcduHandler.h" -PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie) - : DeviceHandlerBase(objectId, comIF, cookie), state(States::ON) {} +#include "devices/gpioIds.h" + +PayloadPcduHandler::PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, + GpioIF* gpioIF) + : DeviceHandlerBase(objectId, comIF, cookie), state(States::ADC_OFF_PL_OFF), gpioIF(gpioIF) {} void PayloadPcduHandler::doStartUp() { switch(state) { case(States::ADC_OFF_PL_OFF): { + // Switch on relays here + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT0); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_VBAT1); + state = States::SWITCH_ON_RELAY_TRANSITION; break; } - case(States::SWITCH_ON_RELAY): { - // If necessary, check whether a certain amount of time has elapaed + case(States::SWITCH_ON_RELAY_TRANSITION): { + // If necessary, check whether a certain amount of time has elapsed + state = States::ADC_OFF_PL_OFF; break; } - case(States::ADC_OFF_PL_OFF): { - break; - } - case(States::SWITCH_ON_HPA): { - // If necessary, check whether a certain amount of time has elapaed - break; + default: + // Config error + sif::error << "PayloadPcduHandler::doStartUp: Invalid state" << std::endl; } +} + +void PayloadPcduHandler::doTransition(Mode_t modeFrom, Submode_t subModeFrom) { + if(mode == _MODE_TO_NORMAL) { + switch(state) { + case(States::ADC_OFF_PL_OFF): { + // Switch on HPA here + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_DRO); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_MPA); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_TX); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_X8); + gpioIF->pullHigh(gpioIds::PLPCDU_ENB_HPA); + state = States::SWITCH_ON_HPA_TRANSITION; + break; + } + case(States::SWITCH_ON_HPA_TRANSITION): { + // If necessary, check whether a certain amount of time has elapsed + state = States::ADC_ON_PL_ON; + setMode(MODE_NORMAL); + break; + } + default: + // Config error + sif::error << "PayloadPcduHandler::doTransition: Invalid state" << std::endl; + } } } @@ -52,6 +82,8 @@ ReturnValue_t PayloadPcduHandler::interpretDeviceReply(DeviceCommandId_t id, uint32_t PayloadPcduHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 10000; } + + ReturnValue_t PayloadPcduHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) { return HasReturnvaluesIF::RETURN_OK; diff --git a/linux/devices/PayloadPcduHandler.h b/linux/devices/PayloadPcduHandler.h index 5b8b7ce4..1e946a09 100644 --- a/linux/devices/PayloadPcduHandler.h +++ b/linux/devices/PayloadPcduHandler.h @@ -2,21 +2,27 @@ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include +#include "fsfw_hal/common/gpio/GpioIF.h" class PayloadPcduHandler : DeviceHandlerBase { public: - PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie); + PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF); private: enum class States { ADC_OFF_PL_OFF, - SWITCH_ON_RELAY, + SWITCH_ON_RELAY_TRANSITION, + // In this mode, the handler can start polling the ADC. This is the ON mode ADC_ON_PL_OFF, - SWITCH_ON_HPA, + SWITCH_ON_HPA_TRANSITION, + // Now the ADC is actually spitting out sensible values. This is the normal mode with the + // experiment being on. ADC_ON_PL_ON }; States state; + GpioIF* gpioIF; + void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override;