#ifndef __ANALOG_INPUT_H
#define __ANALOG_INPUT_H

#include <stdbool.h>


typedef struct
{
    uint8_t state;          // 0 - выкл, 1 - вкл
    uint8_t mode;           // режим измерения (0 - напряжение, 1 - ток)
    uint8_t current_mode;   // диапазон измерения тока (0 - 4-20мА, 1 - 0-20mA)
    uint8_t voltage_mode;   // диапазон измерения напряжения (0 - 0-10В, 1 - 0-1В)
    uint8_t name;           // 
    uint8_t gain_factor;    // коэффициент усиления
    float k_factor;         // 
    float b_factor;         //
} ai_t;


typedef struct
{
    bool alarm_flag;
    bool tim_flag;
    uint32_t cnt;
    
} ai_alarm_t;

// Режим измерения (ток или напряжение)
typedef enum
{
    MEAS_VOLTAGE = 0,
    MEAS_CURRENT,  
    
} MEAS_CHAN_MODE_t;


typedef enum 
{
    MUX_301_CH = 0,
    AN_INP_1,
    AN_INP_2,
    AN_INP_3,
    AN_INP_4,
    AN_INP_5,
    AN_INP_6,
    V_ISO_CL,   // +24 V
    V_ISO,      // +5 V
    
    MUX_401_CH,
    AN_INP_7,
    AN_INP_8,
    AN_INP_9,
    AN_INP_10,
    AN_INP_11,
    AN_INP_12,
    CRNT_LIM_U_BFR_R,
    CRNT_LIM_U_ABFR_R,

    NUMBER_ADC_CH,
    
} ANALOG_IN_t;


//
void ai_init_modbus_params(void);

//
void ai_init(void);

//
void ai_led_update(void);

// 
void ai_set(void);

//
void ai_set_meas_mode(void);

//
bool ai_adc_init(void);

//
void ai_processing(void);

//
void adc_meas_two_channels(ai_t *one, ai_t *two, uint16_t *out_one, uint16_t *out_two);

//
uint8_t adc_get_gain(uint8_t tmp);

//
void adc_print_data(void);

//
void adc_print_data_extend(void);

// 
void adc_task(void *params);

//
void adc_alarm_task(void *params);

//
void ai_voltage_alarm_detect(void);

//
void ai_current_alarm_detect(void);

//
void ai_alarm_tim_handler(void);

//
void ai_connect_channel(uint8_t channel);

//
void ai_set_mode(MEAS_CHAN_MODE_t mode, uint8_t channel);

//
void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel);

//
void ai_ext_sens_power(uint16_t state);

//
void ai_leds_processing(void);

//
void ai_connect_test(void);

//
void ai_mode_test(void);


extern uint16_t ai_gain[];

extern uint16_t adc_com_raw_data[];

extern float adc_com_data[];

extern uint16_t adc_com_fil_data[];

extern uint16_t adc_add_raw_data[];

extern uint16_t ai_alarm; 

extern uint16_t ai_state_bit;

extern ai_alarm_t ai_alarm_f[];

extern ai_alarm_t ai_cur_lim;


#endif  // __ANALOG_INPUT_H

