#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_SUS_H_
#define MISSION_DEVICES_DEVICEDEFINITIONS_SUS_H_

#include <fsfw/datapoollocal/StaticLocalDataSet.h>
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
#include <cstdint>


namespace SUS {

    /**
     * Some MAX1227 could not be reached with frequencies around 4 MHz. Maybe this is caused by
     * the decoder and buffer circuits. Thus frequency is here defined to 1 MHz.
     */
    static const uint32_t MAX1227_SPI_FREQ = 1000000;

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

	static const DeviceCommandId_t WRITE_SETUP = 0x1;
	/**
     * This command initiates the ADC conversion for all channels including the internal
     * temperature sensor.
     */
	static const DeviceCommandId_t START_CONVERSIONS = 0x2;
	/**
	 * This command reads the internal fifo which holds the temperature and the channel
	 * conversions.
	 */
	static const DeviceCommandId_t READ_CONVERSIONS = 0x3;

	/**
	 * @brief   This is the configuration byte which will be written to the setup register after
	 *          power on.
	 *
	 * @note Bit1 (DIFFSEL1) - Bit0 (DIFFSEL0): 0b00, No byte is following the setup byte
	 *       Bit3 (REFSEL1) - Bit2 (REFSEL0):   0b10, Internal reference, no wake-up delay
	 *       Bit5 (CLKSEL1) - Bit4 (CLKSEL0):   0b10, Internally clocked
	 *       Bit7 - Bit6:                       0b01, Tells MAX1227 that this byte should be
	 *                                                written to the setup register
	 *
	 */
	static const uint8_t SETUP = 0b01101000;

	/**
	 * @brief This values 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, Scans channels 0 through N
	 *          Bit6 - Bit3 defines N: 0b0101 (N = 5)
	 *          Bit7: Always 1. Tells the ADC that this is the conversion register.
	 */
	static const uint8_t CONVERSION = 0b10101001;

	static const uint8_t SUS_DATA_SET_ID = READ_CONVERSIONS;

	/** Size of data replies. Temperature and 6 channel convesions (AIN0 - AIN5) */
	static const uint8_t SIZE_READ_CONVERSIONS = 14;

	static const uint8_t MAX_CMD_SIZE = SIZE_READ_CONVERSIONS;

	static const uint8_t POOL_ENTRIES = 7;

	enum Max1227PoolIds: lp_id_t {
		TEMPERATURE_C,
		AIN0,
		AIN1,
		AIN2,
		AIN3,
		AIN4,
		AIN5,
	};

class SusDataset: public StaticLocalDataSet<POOL_ENTRIES> {
public:

    SusDataset(HasLocalDataPoolIF* owner) :
            StaticLocalDataSet(owner, SUS_DATA_SET_ID) {
    }

    SusDataset(object_id_t objectId) :
            StaticLocalDataSet(sid_t(objectId, SUS_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> ain2 = lp_var_t<uint16_t>(sid.objectId, AIN2, this);
    lp_var_t<uint16_t> ain3 = lp_var_t<uint16_t>(sid.objectId, AIN3, 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);
};
}


#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_SUS_H_ */