/**
 * @file hal_io.h
 * @brief 
 * @author dfs 
 * @version 1.0
 * @date 2023-12-12
 * 
 * @copyright Copyright (c) 2023  杭州科技股份有限公司
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version <th>Author  <th>Description
 * <tr><td>2023-12-12 <td>1.0     <td>dfs     <td>内容
 * </table>
 */
#ifndef __HAL_IO_H__
#define __HAL_IO_H__

#define IO_DIRECTION_IN             "in"
#define IO_DIRECTION_OUT            "out"
#define CMD_DIR_LEN					12
#define PIN_NUM_MAX    				200
#define PIN_NUM_MIN    				0

#define PIN_STATUS_HIGH      (1)
#define PIN_STATUS_LOW       (0)
#define PIN_STATUS_INVALID   (-1)

extern int gpio_direction_set(int pinnum, int direct);

extern int gpio_val_set(int pinnum, int val);

extern int gpio_val_get(int pinnum);

extern int gpio_val_get_buf(int pinnum);

extern int gpio_export(int pin);

extern int gpio_edge(int pin, int edge);

typedef struct  gpio_io_set_s  gpio_io_set_t;
struct  gpio_io_set_s{
    int pin;
    int filter;    
};

int gpio_epoll_run(gpio_io_set_t *gpio_set);

int gpio_epoll_exit(void);

#if 0
/********************************************libgpiod interface********************************************/
/**
 * 从GPIO输入获取值
 * 
 * 本函数用于获取指定GPIO引脚的输入值。它首先验证传入的值指针是否为NULL，
 * 然后通过芯片和引脚编号从GPIO设备获取实际的输入值。
 * 
 * @param pin_num 引脚编号，指定要获取值的GPIO引脚。
 * @param value 一个整型指针，用于存储获取到的GPIO引脚的输入值。
 * @return 如果操作成功，返回0，并通过value参数返回引脚的输入值；
 *         如果value指针为NULL，返回-1；
 *         如果获取引脚值失败，也返回-1。
 */
int gpio_input_get_value(unsigned int pin_num, int *value);

/**
 * 获取GPIO电平值
 * 
 * 本函数用于获取指定GPIO引脚的值。它首先验证传入的值指针是否为NULL，
 * 然后通过芯片和引脚编号从GPIO设备获取实际的电平值。
 * 
 * @param pin_num 引脚编号，指定要获取值的GPIO引脚。
 * @param value 一个整型指针，用于存储获取到的GPIO引脚的电平值。
 * @return 如果操作成功，返回0，并通过value参数返回引脚的电平值；
 *         如果value指针为NULL，返回-1；
 *         如果获取电平值失败，也返回-1。
 */
int gpio_get_value(unsigned int pin_num, int *value);

/**
 * 设置GPIO引脚的输出值
 * 
 * 根据指定的引脚号和值，设置GPIO引脚的输出状态。
 * 举例:GPIO1_B5 pin_num = 1×32 + 1×8 + 5 = 45, B5中的B代表一个分组, A=0,B=1,C=2,D=3
 * @param pin_num 引脚号，指定要设置的GPIO引脚。
 * @param value 设置的值，通常为0或1，表示低电平或高电平。
 * @return 返回状态码，0表示成功，非0表示失败。
 */
int gpio_output_set_value(unsigned int pin_num, int value);

typedef enum {
	GPIOD_RISING_EDGE,
	GPIOD_FALLING_EDGE,
}GPIO_EDGE_TYPE;
typedef int (*gpio_edge_event_callback)(void *para);
/**
 * 检查GPIO引脚的边缘触发事件
 * 
 * 该函数用于配置GPIO引脚，以检测特定边缘触发的事件（上升沿或下降沿）。当检测到指定的边缘事件时，可选的回调函数将被调用。
 * 
 * @param pin_num 引脚号，是GPIO芯片中的一个具体引脚。
 * @param timeout_ms 等待事件的超时时间，以毫秒为单位。如果在指定时间内没有检测到事件，则认为是超时。
 * @param edge 指定要检测的边缘类型，可以是上升沿或下降沿。
 * @param callback 当检测到指定边缘事件时要调用的回调函数。如果不需要回调，可以设置为NULL。
 * @param cbdata 回调函数的用户数据，可以在回调函数中使用。
 * @return 返回0表示成功，负值表示失败。
 */
int gpio_edge_check(unsigned int pin_num, int timeout_ms, GPIO_EDGE_TYPE edge, gpio_edge_event_callback callback, void *cbdata);
#endif //__HAL_IO_H__
#endif
