#ifndef MISSION_DEVICES_RADIATIONSENSORHANDLER_H_
#define MISSION_DEVICES_RADIATIONSENSORHANDLER_H_

#include <fsfw/devicehandlers/DeviceHandlerBase.h>
#include <fsfw_hal/common/gpio/GpioIF.h>
#include <mission/devices/devicedefinitions/RadSensorDefinitions.h>

/**
 * @brief	This is the device handler class for radiation sensor on the OBC IF Board. The
 * sensor is based on the MAX1227 ADC converter.
 *
 * @details Datasheet of MAX1227: https://datasheets.maximintegrated.com/en/ds/MAX1227-MAX1231.pdf
 *
 * @author	J. Meier
 */
class RadiationSensorHandler : public DeviceHandlerBase {
 public:
  RadiationSensorHandler(object_id_t objectId, object_id_t comIF, CookieIF *comCookie,
                         GpioIF *gpioIF);
  virtual ~RadiationSensorHandler();
  void setToGoToNormalModeImmediately();

 protected:
  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;

 private:
  enum class CommunicationStep { START_CONVERSION, READ_CONVERSIONS };

  enum class InternalState { SETUP, CONFIGURED };

  RAD_SENSOR::RadSensorDataset dataset;
  static const uint8_t MAX_CMD_LEN = RAD_SENSOR::READ_SIZE;
  GpioIF *gpioIF = nullptr;

  bool goToNormalMode = false;
  uint8_t cmdBuffer[MAX_CMD_LEN];
  InternalState internalState = InternalState::SETUP;
  CommunicationStep communicationStep = CommunicationStep::START_CONVERSION;
};

#endif /* MISSION_DEVICES_RADIATIONSENSORHANDLER_H_ */