#pragma once

#include "outputs.h"
#include "inputs.h"

#define MAX_ERROR_STRING_SIZE 64U
#define NUMBER_OF_SENSOR_SANITY_CHECKS 4U

typedef enum _SensorErrorState
{
    SENSOR_NO_ERROR,
    SENSOR_TOO_HIGH,
    SENSOR_TOO_LOW,
    SENSOR_UNCHANGED,
    SENSOR_NOT_FOUND
} eSensorErrorState;

typedef enum _SafetyState
{
    SAFETY_NO_ERROR,
    SAFETY_SENSOR_ERROR,
    SAFETY_INTERNAL_ERROR
} eSafetyState;

typedef sMeasurement (*GetSensorValue)();
typedef struct _TemperatureSensorLimit
{
    float max; // Maximum temperature limit
    float min; // Minimum temperature limit
} sTemperatureSensorLimit;
typedef struct _SensorSanityCheck
{
    eSensorErrorState state;
    char name[MAX_ERROR_STRING_SIZE];
    sTemperatureSensorLimit sSensorLimit;
    float fSensorTemperatureLast;
    uint32_t uUnchangedCounter;
    GetSensorValue getSensor;
} sSensorSanityCheck;

void initSafety(void);
void getSensorSanityStates(sSensorSanityCheck *pSensorSanityChecks);
eSafetyState getSafetyState(void);