#ifndef __IO_H
#define __IO_H

#include <stdbool.h>


// -------------------------------------------------------------------------- //
// Дискретые входы

#define DI_NUMBER           8   // Количество входов

#define DI_MODE_IN          0   // Режим обычного входа

#define DI_MODE_CNT         1   // Режим счетного входа


// -------------------------------------------------------------------------- //
// Дискретные выходы

#define DO_NUMBER           8   // Количество выходов

#define DEBOUNCE_CNT        50

// -------------------------------------------------------------------------- //
// Аналоговые входы. 

#define AI_ALL_NUMBER       16  // Общее количество

#define AI_COMMON_NUMBER    12  // Основные 12

#define AI_ADD_NUMBER       2   // Дополнительные входы

// -------------------------------------------------------------------------- //
// Аналоговые выходы. 

#define AO_NUMBER           4   // Количество выходов

// -------------------------------------------------------------------------- //

//
void io_port_enable(void);


// -------------------------------------------------------------------------- //

typedef struct
{
    gpio_type *port;
    uint16_t pin;
    
} simple_gpio_t;

//
typedef struct
{
    uint8_t state;          // 0 - выкл, 1 - вкл
    
} di_t;


//
typedef struct
{
    uint8_t state;          // 0 - выкл, 1 - вкл
    uint8_t mode;           // режим работы, 0 - вход, 1 - счетчик импульсов
    uint8_t value;          // значение на выходе в режиме обычного выхода
    uint16_t pwm_duty;      // значение заполнения ШИМ
    uint16_t pwm_period;    // период ШИМ в [0.1с (10..1000)]
    
} do_t;



typedef struct 
{
    gpio_type *port;
    uint16_t pin;
    uint16_t mode;  // 0 - обычный вход, 1 - счетный вход
    uint32_t deb_counter;
    uint32_t cnt;
    bool p_flag;
    bool cnt_flag;
    
} din_t;


typedef struct
{
    gpio_type *port;
    uint16_t pin;
    uint16_t mode;  // 0 - обычный выход, 1 - режим ШИМ
    uint16_t pwm_period_cnt;
    uint16_t pwm_duty_cnt;
    uint16_t pwm_flag;
    uint16_t pwm_period;
    uint16_t pwm_duty;
    
} out_t;


extern uint16_t output_state_bit;
extern uint16_t output_state_save_bit;
extern uint16_t output_value_bit;
extern uint16_t output_value_save_bit;
extern uint16_t output_mode_bit;
extern uint16_t output_mode_save_bit;
extern uint16_t output_pwm[];
extern uint16_t output_pwm_save[];
extern uint16_t output_pwm_period[];
extern uint16_t output_pwm_period_save[];


//
// контроль состояний - обрыв, КЗ, норма
typedef struct
{
    uint16_t state;         // состояние выхода
    uint16_t pwm;           // 
    uint16_t mode;          // режим работы, 0 - выход, 1 - PWM
    uint16_t smode_state;   // значение в безопасном режиме,
                            // 0 - разомкнут, 1 - замкнут
    uint16_t smode_pwm;     // значение PWM в безопасном режиме (%)
    uint16_t normal_state;  // нормальное состояние выхода
                            // 0 - разомкнут, 1 - замкнут
} output_t;


typedef struct
{
    uint16_t smode;         // безопасный режим 0 - включен, 1 - выключен
    uint16_t com_timeout;   // время ожидания запроса от мастера
} system_t;




#endif  // __IO_H

