#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_RADSENSOR_H_
#define MISSION_DEVICES_DEVICEDEFINITIONS_RADSENSOR_H_

namespace RAD_SENSOR {

static const DeviceCommandId_t NONE = 0x0;  // Set when no command is pending

/**
 * This command initiates the ADC conversion for all channels including the internal
 * temperature sensor.
 */
static const DeviceCommandId_t WRITE_SETUP = 1;
static const DeviceCommandId_t START_CONVERSION = 2;
static const DeviceCommandId_t READ_CONVERSIONS = 3;
static const DeviceCommandId_t ENABLE_DEBUG_OUTPUT = 4;
static const DeviceCommandId_t DISABLE_DEBUG_OUTPUT = 5;

/**
 * @brief   This is the configuration byte which will be written to the setup register after
 *          power on.
 *
 * @note Bit1 (DIFFSEL1) - Bit0 (DIFFSEL0): 0b00, no data follows the setup byte
 *       Bit3 (REFSEL1) - Bit2 (REFSEL0): 0b10, internal reference, no wake-up delay
 *       Bit5 (CLKSEL1) - Bit4 (CLKSEL0): 0b10,  MAX1227 uses internal oscillator for timing
 *       Bit7 - Bit6: 0b01, tells MAX1227 that this is the setup register
 *
 */
static const uint8_t SETUP_DEFINITION = 0b01101000;

/**
 * @brief This value will always be written to the ADC conversion register to specify the
 *        conversions to perform.
 * @details Bit0: 1 - Enables temperature conversion
 *          Bit2 (SCAN1) and Bit1 (SCAN0): 0b00 (channel conversion from 0 to N)
 *          Bit6 - Bit3 defines N: 0b0111 (N = 7)
 *          Bit7: Always 1. Tells the ADC that this is the conversion register.
 */
static const uint8_t CONVERSION_DEFINITION = 0b10111001;
//	static const uint8_t CONVERSION_DEFINITION = 0b10111111;

/**
 * @brief   Writing this value resets the fifo of the MAX1227.
 */
static const uint8_t RESET_DEFINITION = 0b00011000;

static const uint8_t DUMMY_BYTE = 0xFF;

static const uint8_t RAD_SENSOR_DATA_SET_ID = READ_CONVERSIONS;

static const uint8_t DATASET_ENTRIES = 7;
/**
 * One temperature value and conversions for AIN0 - AIN7
 */
static const uint8_t READ_SIZE = 18;

enum Max1227PoolIds : lp_id_t {
  TEMPERATURE_C,
  AIN0,
  AIN1,
  AIN4,
  AIN5,
  AIN6,
  AIN7,
};

class RadSensorDataset : public StaticLocalDataSet<DATASET_ENTRIES> {
 public:
  RadSensorDataset(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, RAD_SENSOR_DATA_SET_ID) {}

  RadSensorDataset(object_id_t objectId)
      : StaticLocalDataSet(sid_t(objectId, RAD_SENSOR_DATA_SET_ID)) {}

  lp_var_t<float> temperatureCelcius = lp_var_t<float>(sid.objectId, TEMPERATURE_C, this);
  lp_var_t<uint16_t> ain0 = lp_var_t<uint16_t>(sid.objectId, AIN0, this);
  lp_var_t<uint16_t> ain1 = lp_var_t<uint16_t>(sid.objectId, AIN1, this);
  lp_var_t<uint16_t> ain4 = lp_var_t<uint16_t>(sid.objectId, AIN4, this);
  lp_var_t<uint16_t> ain5 = lp_var_t<uint16_t>(sid.objectId, AIN5, this);
  lp_var_t<uint16_t> ain6 = lp_var_t<uint16_t>(sid.objectId, AIN6, this);
  lp_var_t<uint16_t> ain7 = lp_var_t<uint16_t>(sid.objectId, AIN7, this);
};
}  // namespace RAD_SENSOR

#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_RADSENSOR_H_ */