#ifndef IIC_H
#define IIC_H

#include <stdint.h>
#include "driver/i2c.h"
#include "esp_log.h"

// 设备地址
#define Device_Address           0x6B


// I2C 主设备配置宏定义
// I2C 主设备时钟线连接的 GPIO 引脚号
#define I2C_MASTER_SCL_IO      GPIO_NUM_4
// I2C 主设备数据线连接的 GPIO 引脚号
#define I2C_MASTER_SDA_IO      GPIO_NUM_3
// I2C 主设备使用的 I2C 端口号
#define I2C_MASTER_NUM         I2C_NUM_0
// I2C 主设备的时钟频率
#define I2C_MASTER_FREQ_HZ     400000
// I2C 主设备不使用发送缓冲区
#define I2C_MASTER_TX_BUF_DISABLE  0
// I2C 主设备不使用接收缓冲区
#define I2C_MASTER_RX_BUF_DISABLE  0

/**
 * @brief 初始化 I2C 主设备
 * 
 * 该函数用于对 I2C 主设备进行初始化配置，包括设置 I2C 模式、引脚、上拉电阻和时钟频率等，
 * 并安装 I2C 驱动。
 * 
 * @return esp_err_t 初始化结果，ESP_OK 表示成功，其他值表示失败
 */
esp_err_t i2c_master_init(void);

/**
 * @brief 向 8 位地址的寄存器写入一个字节数据
 * 
 * 该函数通过 I2C 总线向指定地址的寄存器写入一个字节的数据。
 * 
 * @param addr 寄存器的内部地址
 * @param Data 要写入的数据
 * @return unsigned char 操作结果，1 表示成功，0 表示失败
 */
unsigned char i2cwrite(unsigned char addr, unsigned char Data);

/**
 * @brief 向 8 位地址的寄存器写入多个字节数据
 * 
 * 该函数通过 I2C 总线向指定地址的寄存器开始写入指定长度的字节数据。
 * 
 * @param addr I2C 设备内部寄存器地址
 * @param length 要写入的数据长度
 * @param Data 要写入的数据的地址
 * @return unsigned char 操作状态，1 表示成功，0 表示失败
 */
unsigned char i2cwrites(uint8_t addr, uint8_t length, const uint8_t *Data);

/**
 * @brief 从 8 位地址的寄存器读取一个字节数据
 * 
 * 该函数通过 I2C 总线从指定地址的寄存器读取一个字节的数据。
 * 
 * @param addr I2C 设备内部寄存器地址
 * @param Data 存储读取数据的地址
 * @return unsigned char 操作状态，1 表示成功，0 表示失败
 */
unsigned char i2cread(unsigned char addr, unsigned char *Data);

/**
 * @brief 从 8 位地址的寄存器读取多个字节数据
 * 
 * 该函数通过 I2C 总线从指定地址的寄存器开始读取指定长度的字节数据。
 * 
 * @param addr I2C 设备内部寄存器地址
 * @param length 要读取的数据长度
 * @param Data 存储读取数据的地址
 * @return unsigned char 操作状态，1 表示成功，0 表示失败
 */
unsigned char i2creads(unsigned char addr, unsigned char length, unsigned char *Data);


/**
 * @brief 扫描 I2C 总线上的设备
 * 
 * 该函数会遍历 I2C 地址范围（0 - 127），尝试与每个地址的设备进行通信，
 * 若通信成功则表示该地址存在设备，并输出相应的日志信息。
 * 
 */
void i2c_scan(void);

#endif // IIC_H