/**
 *@file    sr_i2c.h
 *@brief   IIC抽象接口头文件
 *@details 提供IIC相关枚举、结构体
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-04-18
 *@example ZhaoyangSDK\example\pal\hal\i2c_example.c
 */

#ifndef _SR_HAL_I2C_H
#define _SR_HAL_I2C_H

#include "sr_device.h"

typedef enum SR_I2C_FLAG SR_I2C_FLAG_E;

#include "sr_bsp_i2c.h"

/**
 * @brief I2C读写控制标识
 */
enum SR_I2C_FLAG
{
// SR_I2C_WR = 0x0000,   /*!< 写标志，不可以和读标志进行“|”操作 */
// SR_I2C_RD = (1u<<0),  /*!< 读标志，不可以和写标志进行“|”操作 */

#ifdef SR_I2C_SUPPORT_ADDR_10BIT
  SR_I2C_ADDR_10BIT = (1u << 1), /*!< 10 bit从机地址模式,默认7bit */
#endif

  SR_I2C_REG_16BIT = (1u << 2), /*!< 16bit寄存器地址，默认8bit */

};
#ifdef SR_I2C_SUPPORT_ADDR_10BIT
#define IS_I2C_FLAG_MASK (SR_I2C_REG_16BIT|SR_I2C_ADDR_10BIT)
#else
#define IS_I2C_FLAG_MASK (SR_I2C_REG_16BIT)
#endif
#define IS_I2C_FLAG(x) (((x)&IS_I2C_FLAG_MASK)==(x))

// /**
//  * @brief I2C操作函数结构体
//  */
// typedef struct SR_I2C_OPS
// {
//   int (*i2c_open)(SR_DEVICE_T *dev);                                                                                        /*!< 打开I2C设备 */
//   int (*i2c_close)(SR_DEVICE_T *dev);                                                                                       /*!< 关闭I2C设备 */
//   int (*i2c_read_reg)(SR_DEVICE_T *dev, int slaveAddr, SR_I2C_FLAG_E flag, uint32_t reg, uint8_t *buff, uint32_t buffLen);  /*!< 从I2C设备读取寄存器 */
//   int (*i2c_write_reg)(SR_DEVICE_T *dev, int slaveAddr, SR_I2C_FLAG_E flag, uint32_t reg, uint8_t *buff, uint32_t buffLen); /*!< 向I2C设备写入寄存器 */
// } SR_I2C_OPS_T;

/**
 * @brief I2C设备结构体
 */
typedef struct SR_I2C_DEVICE
{
  SR_DEVICE_T parent; /*!< 继承设备公共父类 */
  // const SR_I2C_OPS_T *i2cOps; /*!< 指向I2C操作函数的指针 */

} SR_I2C_DEVICE_T;

/*--------------------------------抽象接口------------------------------*/

/**
 * @brief 打开I2C设备
 *
 * @param[in] i2cId 指定的I2C设备ID，SR_I2C_ID_E类型
 *
 * @return 成功返回I2C设备指针(SR_DEVICE_T *类型)，失败返回SR_NULL
 */
#define SR_HalI2cOpen(i2cId) BspI2cOpen(i2cId)

/**
 * @brief 关闭I2C设备
 *
 * @param[in] dev I2C设备指针,SR_DEVICE_T *类型
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalI2cClose(dev) BspI2cClose(dev)

/**
 * @brief I2C读寄存器
 *
 * @param[in] dev       IIC设备指针，SR_DEVICE_T *类型
 * @param[in] slaveAddr 目标从设备地址
 * @param[in] flag      标识位，可选值SR_I2C_ADDR_10BIT、SR_I2C_REG_16BIT，可进行或操作
 * @param[in] reg       待读取寄存器地址
 * @param[out] buff     存储读取到的数据的缓冲区指针
 * @param[in] buffLen   数据长度
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalI2cReadReg(dev, slaveAddr, flag, reg, buff, buffLen) BspI2cReadReg(dev, slaveAddr, flag, reg, buff, buffLen)

/**
 * @brief I2C写寄存器
 *
 * @param[in] dev       IIC设备指针，SR_DEVICE_T *类型
 * @param[in] slaveAddr 从机设备的I2C地址。
 * @param[in] flag      标识位，可选值SR_I2C_ADDR_10BIT、SR_I2C_REG_16BIT，可进行或操作。
 * @param[in] reg       寄存器地址。
 * @param[in] buff      数据缓冲区。
 * @param[in] buffLen   数据长度。
 *
 * @return 成功返回0，发生错误则返回负数错误码。
 */
#define SR_HalI2cWriteReg(dev, slaveAddr, flag, reg, buff, buffLen) BspI2cWriteReg(dev, slaveAddr, flag, reg, buff, buffLen)


#endif
