#ifndef LINUX_DEVICES_PLPCDUHANDLER_H_ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include #include #include #include "fsfw/FSFW.h" #include "fsfw_hal/common/gpio/GpioIF.h" #include "mission/devices/devicedefinitions/payloadPcduDefinitions.h" #ifdef FSFW_OSAL_LINUX class SpiComIF; class SpiCookie; #endif /** * @brief Device handler for the EIVE Payload PCDU * @details * Documentation: * https://egit.irs.uni-stuttgart.de/eive/eive_dokumente/src/branch/master/400_Raumsegment/412_PayloaPCDUDocumentation/release/EIVE-D-421-001_PLPCDU_Documentation.pdf * * Important components: * - SSR - Solid State Relay: Decouples voltages from battery * - DRO - Dielectric Resonsant Oscillator: Generates modulation signal * - X8: Frequency X8 Multiplicator * - TX: Transmitter/Sender module. Modulates data onto carrier signal * - MPA - Medium Power Amplifier * - HPA - High Power Amplifier */ class PayloadPcduHandler : public DeviceHandlerBase { public: PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF, bool periodicPrintout); void setToGoToNormalModeImmediately(bool enable); void enablePeriodicPrintout(bool enable, uint8_t divider); static ReturnValue_t extConvAsTwoCallback(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sendData, size_t sendLen, void* args); #ifdef FSFW_OSAL_LINUX static ReturnValue_t transferAsTwo(SpiComIF* comIf, SpiCookie* cookie, const uint8_t* sendData, size_t sendLen, bool tempOnly); #endif private: enum class States { PCDU_OFF, // Solid State Relay, enable battery voltages VBAT0 and VBAT1. This will also switch on // the ADC ON_TRANS_SSR, ON_TRANS_ADC_CLOSE_ZERO, // Enable Dielectric Resonant Oscillator and start monitoring voltages as // soon as DRO voltage reaches 6V ON_TRANS_DRO, // Switch on X8 compoennt and monitor voltages for 5 seconds ON_TRANS_X8, // Switch on TX component and monitor voltages for 5 seconds ON_TRANS_TX, // Switch on MPA component and monitor voltages for 5 seconds ON_TRANS_MPA, // Switch on HPA component and monitor voltages for 5 seconds ON_TRANS_HPA, // All components of the experiment are on PCDU_ON, } state = States::PCDU_OFF; enum class AdcMode { EXT_CONV, INT_CONV } adcMode = AdcMode::INT_CONV; enum class MonitoringMode { NONE, CLOSE_TO_ZERO, NEGATIVE } monMode = MonitoringMode::NONE; enum class AdcStates { OFF, BOOT_DELAY, SEND_SETUP, NORMAL } adcState = AdcStates::OFF; bool goToNormalMode = false; plpcdu::PlPcduAdcSet adcSet; std::array cmdBuf = {}; // This variable is tied to DRO +6 V voltage. Voltages, currents are monitored and the experiment // is shut down immediately if there is a negative voltage. bool transitionOk = false; bool commandExecuted = false; bool adcCmdExecuted = false; bool periodicPrintout = false; PeriodicOperationDivider opDivider = PeriodicOperationDivider(5); uint8_t tempReadDivisor = 1; Countdown countdown = Countdown(5000); Countdown adcCountdown = Countdown(50); GpioIF* gpioIF; PoolEntry channelValues = PoolEntry({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); PoolEntry tempC = PoolEntry({0.0}); void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override; void doStartUp() override; void doShutDown() override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override; ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t* id) override; void fillCommandAndReplyMap() override; ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData, size_t commandDataLen) override; ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId, size_t* foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override; uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap, LocalDataPoolManager& poolManager) override; void handleExtConvRead(const uint8_t* bufStart); void handlePrintout(); void stateMachineToNormal(); }; #endif /* LINUX_DEVICES_PLPCDUHANDLER_H_ */