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

#include "lmcal_cfg.h"
#include "lmcal_gpio.h"
#include "lmcal_gpio_port.h"

#include "at32f403a_407_conf.h"

//******************************************* Локальные константы *******************************************


//******************************************* Проверка параметров *******************************************


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


//************************************ Глобальные (публичные) переменные ************************************


//************************************* Локальные (приватные) переменные ************************************


//***********************************************************************************************************
//******************************** Определения локальных (приватных) функций ********************************
//***********************************************************************************************************

static fun_res_t f_enable_clk(u32 port_num, bool state)
{
    fun_res_t err = ERR_OK;

    if ((gpio_type*)port_num == GPIOA) 
    {
        crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, state);
    } 
    else if((gpio_type*)port_num == GPIOB) 
    {
        crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, state);
    }
    else if((gpio_type*)port_num == GPIOC) 
    {
        crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, state);
    }
    else if((gpio_type*)port_num == GPIOD) 
    {
        crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, state);
    }
    else if((gpio_type*)port_num == GPIOE) 
    {
        crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, state);
    }
    else 
    {
        err = ERR_INVALID_ARGUMENT;
    }

    return err;
}




//***********************************************************************************************************
//******************************** Определения процедур обработки прерываний ********************************
//***********************************************************************************************************


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

fun_res_t lmcal_gpio_port_init(u8 param)
{
    fun_res_t err = ERR_OK;
    L_UNUSED(param);

    // Опциональная функция

    // Примеры использования:
    // - аппаратный сброс периферии
    // - включение тактирования
    // - настройка структур данных для работы функции *_init_pin() инициализации каналов.

    return err;
}



fun_res_t lmcal_gpio_port_init_periph(u32   port_num,
                                      u32   pin_num,
                                      u32   mode,
                                      u32   out_type,
                                      u32   pull_type,
                                      u32   irq_mode,
                                      bool  state)
{
    fun_res_t err = ERR_OK;
    gpio_init_type st_gpio_init;
    L_UNUSED(irq_mode);

    // Настройка тактирования
    err = f_enable_clk(port_num, true);
    L_CHECK_ERR(err);

    // Настройка параметров
    st_gpio_init.gpio_pins           = pin_num;
    st_gpio_init.gpio_mode           = mode;
    st_gpio_init.gpio_out_type       = out_type;
    st_gpio_init.gpio_pull           = pull_type;
    st_gpio_init.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;

    // Запись настроек
    gpio_init((gpio_type*)port_num, &st_gpio_init);

    // Установка значения по умолчанию
    gpio_bits_write((gpio_type*)port_num,
                    pin_num,
                    state);

    L_EXIT;
    return err;    
}



fun_res_t lmcal_gpio_port_deinit(u8 param)
{
    fun_res_t err = ERR_OK;
    L_UNUSED(param);
    // Опциональная функция

    return err;
}



fun_res_t lmcal_gpio_port_deinit_periph(u32 port_num, u32 pin_num)
{
    fun_res_t err = ERR_OK;
    gpio_init_type st_gpio_init;

    // Сброс настроек (настройка каналов на вход)
    gpio_default_para_init(&st_gpio_init);
    st_gpio_init.gpio_pins = pin_num;
    
    gpio_init((gpio_type*)port_num, &st_gpio_init);
                
    return err;
}



fun_res_t lmcal_gpio_port_write_pin(u32 port_num, 
                                    u32 pin_num,
                                    bool state)
{
    fun_res_t err = ERR_OK;

    gpio_bits_write((gpio_type*)port_num, pin_num, state);

    return err;
}



fun_res_t lmcal_gpio_port_read_pin(u32 port_num, 
                                   u32 pin_num,
                                   bool* const state)
{
    fun_res_t err = ERR_OK;
    
    *state = gpio_input_data_bit_read((gpio_type*)port_num, pin_num);
    
    return err;
}


fun_res_t lmcal_gpio_port_set_callback(u32 port_num, u32 pin_num, void_fun_t function)
{
    fun_res_t err = ERR_OK;
    L_UNUSED(port_num);
    L_UNUSED(pin_num);
    L_UNUSED(function);

    return err;
}


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