#ifndef LINUX_DEVICES_PLPCDUHANDLER_H_ #define LINUX_DEVICES_PLPCDUHANDLER_H_ #include #include #include "devicedefinitions/payloadPcduDefinitions.h" #include "fsfw_hal/common/gpio/GpioIF.h" /** * @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 : DeviceHandlerBase { public: PayloadPcduHandler(object_id_t objectId, object_id_t comIF, CookieIF* cookie, GpioIF* gpioIF); 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 MonitoringMode { NONE, CLOSE_TO_ZERO, NEGATIVE } monMode = MonitoringMode::NONE; enum class AdcStates { OFF, BOOT_DELAY, SEND_SETUP, NORMAL } adcState = AdcStates::OFF; 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; uint8_t tempReadDivisor = 1; Countdown countdown = Countdown(5000); Countdown adcCountdown = Countdown(50); GpioIF* gpioIF; PoolEntry ain0 = PoolEntry({0}); PoolEntry ain1 = PoolEntry({0}); PoolEntry ain2 = PoolEntry({0}); PoolEntry ain3 = PoolEntry({0}); PoolEntry ain4 = PoolEntry({0}); PoolEntry ain5 = PoolEntry({0}); PoolEntry ain6 = PoolEntry({0}); PoolEntry ain7 = PoolEntry({0}); PoolEntry ain8 = PoolEntry({0}); PoolEntry ain9 = PoolEntry({0}); PoolEntry ain10 = PoolEntry({0}); PoolEntry ain11 = PoolEntry({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; }; #endif /* LINUX_DEVICES_PLPCDUHANDLER_H_ */