#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_MAX13865DEFINITIONS_H_
#define MISSION_DEVICES_DEVICEDEFINITIONS_MAX13865DEFINITIONS_H_

#include <fsfw/datapoollocal/StaticLocalDataSet.h>
#include <fsfw/datapoollocal/LocalPoolVariable.h>
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
#include "objects/systemObjectList.h"

namespace Max31865Definitions {

enum PoolIds: lp_id_t {
    RTD_VALUE,
    TEMPERATURE_C,
    FAULT_BYTE
};

static constexpr DeviceCommandId_t CONFIG_CMD = 0x80;
static constexpr DeviceCommandId_t WRITE_HIGH_THRESHOLD = 0x83;
static constexpr DeviceCommandId_t WRITE_LOW_THRESHOLD = 0x85;
static constexpr DeviceCommandId_t REQUEST_CONFIG = 0x00;
static constexpr DeviceCommandId_t REQUEST_RTD = 0x01;
static constexpr DeviceCommandId_t REQUEST_HIGH_THRESHOLD = 0x03;
static constexpr DeviceCommandId_t REQUEST_LOW_THRESHOLD = 0x05;
static constexpr DeviceCommandId_t REQUEST_FAULT_BYTE = 0x07;

static constexpr uint32_t MAX31865_SET_ID = REQUEST_RTD;

static constexpr size_t MAX_REPLY_SIZE = 5;

class Max31865Set:
        public StaticLocalDataSet<sizeof(float) + sizeof(uint8_t)> {
public:
    /**
     * Constructor used by owner and data creators like device handlers.
     * @param owner
     * @param setId
     */
    Max31865Set(HasLocalDataPoolIF* owner):
        StaticLocalDataSet(owner, MAX31865_SET_ID) {
    }

    /**
     * Constructor used by data users like controllers.
     * @param sid
     */
    Max31865Set(object_id_t objectId):
        StaticLocalDataSet(sid_t(objectId, MAX31865_SET_ID)) {
    }

    lp_var_t<float> rtdValue = lp_var_t<float>(sid.objectId,
            PoolIds::RTD_VALUE, this);
    lp_var_t<float> temperatureCelcius = lp_var_t<float>(sid.objectId,
            PoolIds::TEMPERATURE_C, this);
    lp_var_t<uint8_t> errorByte = lp_var_t<uint8_t>(sid.objectId,
            PoolIds::FAULT_BYTE, this);
};

}

#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_MAX13865DEFINITIONS_H_ */