#ifndef _USER_GPIO_H_
#define _USER_GPIO_H_
#include "cpu.h"


enum
{
    OUT_HIGH,
    OUT_LOW,
};
typedef void (*gpio_interrupt_handler)(uint8_t interr_type);

typedef struct
{
    gpio_interrupt_handler gpio_handler;
}user_gpio_cfg_parameter_t;

void user_gpio_init(void);
void user_gpio_config(user_gpio_cfg_parameter_t *p_parameter);

void user_gpio_dir_out_hig(uint32_t gpio_pins_map, uint32_t pins_value);
void user_gpio_dir_out_low(uint32_t gpio_pins_map, uint32_t pins_value);
void user_gpio_dir_set(uint32_t group_gpio_pins, uint32_t set_pins_value);


void user_gpio_dir_out_fast(uint32_t gpio_pins_map, uint32_t pins_value);

void user_gpio_out(gpio_pin GPIO_Pin, functional_state_t enable);
void user_pwm_config(gpio_pin GPIO_Pin, functional_state_t enable);

void user_gpio_dir_in(uint32_t gpio_pins_map,gpio_irq_type interr_type);
uint32_t user_gpio_get_pins_value(uint32_t pins_map);
void set_gpio_irq(uint32_t gpio_pins_map,gpio_irq_type interr_type);
void set_gpio_irq_sel_int(irq_bank start,uint32_t gpio_pins_map,gpio_irq_type interr_type);

void user_gpio_close(uint32_t group_gpio_pins,gpio_mode_type mode);
void user_gpio_example(void);
void gpio_config_default(void);
void all_gpio_config(gpio_mode_type mode);

#define gpio_to_value(v)  (1 << (v))

#endif
