#ifndef __IO_H
#define __IO_H

#include <stdbool.h>

// Период опроса входов 100 мс

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

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

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

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


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

#define DEBOUNCE_CNT    50

// Прочие параметры из других модулей для передачи по modbus

//uint32_t uptime;


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

//
void io_port_init(void);

//
void io_init(void);

//
void io_tim_init(void);

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

typedef struct
{
    gpio_type *port;
    uint16_t pin;
    
} simple_gpio_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 input_state[DI_NUMBER];      // состояние входа
extern uint16_t input_state_bit;             // битовое поле

extern uint32_t input_cnt[DI_NUMBER];       // счетчики входов

extern uint16_t output_state_bit;
extern uint16_t output_mode_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[];

//uint16_t output_state[DI_NUMBER];    // состояние выхода, 0 - норма, 1 - обрыв, 2 - КЗ


// -------------------------------------------------------------------------- //
// Структуры настроек. Хранятся во внутренней памяти контроллера.


//
// контроль состояний - обрыв, КЗ, норма
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;


// Структура системных настроек
/*
typedef struct 
{
	uint16_t        model;			// Модель
	uint32_t        proddate;		// Дата производства
	uint32_t        serial;			// Серийный номер
	uint8_t         fw_version[8];	// Версия ПО
	uint8_t         test_state;		// Статус тестирования
	
} sys_settings_t;

*/



#endif  // __IO_H