//***********************************************************************************************************
//! @file        lmcal_gpio.h
//! @brief       Драйвер GPIO
//! @par         Поддерживаемые платформы: -
//! @version     v1.0.0
//! @date        17.06.2025
//!
//! @details     Настройка, чтение и установка состояния портов ввода-вывода.
//!              Настройки задаются в файле конфигурации lmcal_gpio_cfg.h.
//!
//!              Ограничения:
//!              - Ограничения драйвера зависят от модуля *_port.c и файла конфигурации *_cfg.h.
//!              - Нет функций обращения к портам (только к отдельным ножкам)
//!
//!              Возможности:
//!              - Модуль позволяет читать и устанавливать состояния отдельных пинов чипа;
//!              - Модуль позволяет обрабатывать прерывания по изменению состояния входа;
//!               
//!              Порядок работы:
//!              - Настроить конфигурационный файл *_cfg.h;
//!              - Выполнить инициализацию драйвера *_init();
//!              - Задать функции обратного вызова через *_set_callback(), если предполагается работа
//!                c прерываниями по изменению входа;
//!              - Выполнить установку, чтение пинов *_write_pin(), *_read_pin();
//!              - ....
//!              - По завершению работы выполнить деинициализацию драйвера *_deinit().
//!
//***********************************************************************************************************

//! @addtogroup LMCAL
//! @{

//! @addtogroup GPIO
//! @{

#ifndef _LMCAL_GPIO_H
#define _LMCAL_GPIO_H

//******************************************** Включаемые файлы *********************************************

#include "lmcal_private.h"
#include "lmcal_gpio_cfg.h"


//******************************************* Определения типов *********************************************

// Логические каналы драйвера
typedef enum
{
    LMCAL_GPIO_CHANNEL0 = 0U,
    LMCAL_GPIO_CHANNEL1,
    LMCAL_GPIO_CHANNEL2,
    LMCAL_GPIO_CHANNEL3,
    LMCAL_GPIO_CHANNEL4, 
    LMCAL_GPIO_CHANNEL5, 
    LMCAL_GPIO_CHANNEL6, 
    LMCAL_GPIO_CHANNEL7, 
    LMCAL_GPIO_CHANNEL8, 
    LMCAL_GPIO_CHANNEL9, 
    LMCAL_GPIO_CHANNEL10,
    LMCAL_GPIO_CHANNEL11,
    LMCAL_GPIO_CHANNEL12,
    LMCAL_GPIO_CHANNEL13,
    LMCAL_GPIO_CHANNEL14,
    LMCAL_GPIO_CHANNEL15,
    LMCAL_GPIO_CHANNEL16,
    LMCAL_GPIO_CHANNEL17,
    LMCAL_GPIO_CHANNEL18,
    LMCAL_GPIO_CHANNEL19,
    LMCAL_GPIO_CHANNEL20,
    LMCAL_GPIO_CHANNEL21,
    LMCAL_GPIO_CHANNEL22,
    LMCAL_GPIO_CHANNEL23,
    LMCAL_GPIO_CHANNEL24,
    LMCAL_GPIO_CHANNEL25,
    LMCAL_GPIO_CHANNEL26,
    LMCAL_GPIO_CHANNEL27,
    LMCAL_GPIO_CHANNEL28,
    LMCAL_GPIO_CHANNEL29,
    LMCAL_GPIO_CHANNEL30,
    LMCAL_GPIO_CHANNEL31,
    LMCAL_GPIO_CHANNEL32,
    LMCAL_GPIO_CHANNEL33,
    LMCAL_GPIO_CHANNEL34,
    LMCAL_GPIO_CHANNEL35,
    LMCAL_GPIO_CHANNEL36,
    LMCAL_GPIO_CHANNEL37,
    LMCAL_GPIO_CHANNEL38,
    LMCAL_GPIO_CHANNEL39,
    LMCAL_GPIO_CHANNEL_QTY
} lmcal_gpio_channel_t;



//******************************** Объявления глобальных (публичных) функций ********************************

//-----------------------------------------------------------------------------------------------------------
//! @brief       Инициализация модуля 
//! @param       -
//! @retval      см. fun_res_t
//-----------------------------------------------------------------------------------------------------------
extern fun_res_t lmcal_gpio_init(void);


//-----------------------------------------------------------------------------------------------------------
//! @brief       Деинициализация модуля 
//! @param       -
//! @retval      см. fun_res_t
//-----------------------------------------------------------------------------------------------------------
extern fun_res_t lmcal_gpio_deinit(void);


//-----------------------------------------------------------------------------------------------------------
//! @brief       Установка состояния канала GPIO.
//!
//! @param[in]   channel - номер канала;
//! @param[in]   new_state - состояние (1, 0).
//!
//! @retval      см. fun_res_t
//-----------------------------------------------------------------------------------------------------------
extern fun_res_t lmcal_gpio_write_pin(lmcal_gpio_channel_t channel, bool new_state);


//-----------------------------------------------------------------------------------------------------------
//! @brief       Получение состояния канала GPIO.
//!
//! @param[in]   channel - номер канала;
//!
//! @retval      Значение < 0  - ошибка 
//! @retval      Значение >= 0 - состояние канала
//-----------------------------------------------------------------------------------------------------------
extern err_or_res_t lmcal_gpio_read_pin(lmcal_gpio_channel_t channel);
 

//-----------------------------------------------------------------------------------------------------------
//! @brief       Установка функции обратного вызова по прерыванию канала.
//!
//! @param[in]   channel  - номер канала;
//! @param[in]   function - функция обратного вызова.
//!
//! @retval      см. fun_res_t
//-----------------------------------------------------------------------------------------------------------
extern fun_res_t lmcal_gpio_set_callback(lmcal_gpio_channel_t channel, void_fun_t function);

//! @}
//! @}

#endif

//*********************************************** КОНЕЦ ФАЙЛА ***********************************************

