#ifndef MISSION_DEVICES_SusHandler_H_ #define MISSION_DEVICES_SusHandler_H_ #include #include #include #include "fsfw/devicehandlers/DeviceHandlerBase.h" #include "fsfw/globalfunctions/PeriodicOperationDivider.h" #include "mission/acs/acsBoardPolling.h" class SusHandler : public DeviceHandlerBase { public: static constexpr DeviceCommandId_t REQUEST = 0x70; static constexpr DeviceCommandId_t REPLY = 0x77; static const uint8_t INTERFACE_ID = CLASS_ID::SUS_HANDLER; static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::SUS_HANDLER; //! [EXPORT] : [COMMENT] Possible indicator that the SUS device is glitchy static constexpr Event TEMPERATURE_IS_ALL_ONES = event::makeEvent(SUBSYSTEM_ID, 0, severity::LOW); SusHandler(uint32_t objectId, uint8_t susIdx, object_id_t deviceCommunication, CookieIF *comCookie); virtual ~SusHandler(); void enablePeriodicPrintouts(bool enable, uint8_t divider); void setToGoToNormalMode(bool enable); protected: /** DeviceHandlerBase overrides */ void doShutDown() override; void doStartUp() override; uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override; ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t *commandData, size_t commandDataLen) override; ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t *id) override; ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t *id) override; ReturnValue_t scanForReply(const uint8_t *start, size_t len, DeviceCommandId_t *foundId, size_t *foundLen) override; ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) override; void fillCommandAndReplyMap() override; void modeChanged(void) override; ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) override; LocalPoolDataSetBase *getDataSetHandle(sid_t sid) override; private: Countdown faultyDataEventCd = Countdown(60000); susMax1227::SusDataset dataset; acs::SusRequest request{}; uint8_t susIdx; uint32_t transitionDelay = 1000; bool goToNormalMode = false; PoolEntry tempC = PoolEntry({0.0}); PoolEntry channelVec = PoolEntry({0, 0, 0, 0, 0, 0}); enum class InternalState { NONE, STARTUP, SHUTDOWN, }; InternalState internalState = InternalState::NONE; bool commandExecuted = false; ReturnValue_t prepareRequest(acs::SimpleSensorMode mode); }; #endif /* MISSION_DEVICES_SusHandler_H_ */