/*******************************************************************************
* Copyright (C) 2021-2025, All Rights Reserved.
*
* File:        hal_i2c_slave.h
* Description  hal i2c slave模块接口头文件
* Version      V0.1
* Date         2023-07-27
* Author       swx
*******************************************************************************/
#ifndef __HAL_I2C_SLAVE_H__
#define __HAL_I2C_SLAVE_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_device_datatype.h"
#include "tau_common.h"
#include "string.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/
/**
* @brief  i2cs event packet info
*/
typedef struct hal_i2cs_packet_info_t
{
    uint8_t           *rx_buffer;          /* 接收buffer   */
    uint32_t           rx_buffer_size;     /* 接收buffer size   */
    const uint8_t     *tx_buffer;          /* 发送buffer   */
    uint32_t           tx_buffer_size;     /* 发送buffer size   */
    bool               tx_circle;          /* 发送circle mode */
    uint32_t           packet_size;        /* packet size : READ、RST、STOP中断事件时整个传输过程中I2CM发送packet的总量 */
} hal_i2cs_packet_info_t;

/**
* @brief  i2cs event
*/
typedef enum
{
    I2CS_EVENT_READ = 0,             //发生 读请求 中断
    I2CS_EVENT_RST,                  //发生 restart 中断
    I2CS_EVENT_STOP                  //发生 stop 中断
} hal_i2cs_event_e;

typedef void (*hal_i2cs_cb)(i2c_index_e index, hal_i2cs_event_e event, size_t receive_num);

/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/
/**
* @brief  hal_i2cs_init
* @param  index: I2Cx index
* @param  slave_addr: 从机地址
* @param  addr_bits: 从机地址位数
* @retval none
*/
void hal_i2cs_init(i2c_index_e index, uint16_t slave_addr, uint8_t addr_bits);

/**
* @brief  hal_i2cs_deinit
* @param  index: I2Cx index
* @retval none
*/
void hal_i2cs_deinit(i2c_index_e index);

/**
* @brief  hal_i2cs_set_continue_transfer
* @param  index: I2Cx index
* @param  status: true/false
* @retval none
*/
void hal_i2cs_set_continue_transfer(i2c_index_e index, bool status);

/**
* @brief  获取i2c slave发送成功字节数
*         注意这是通信过程i2c slave发送的数据量，如果更新了i2c slave的tx_buffer，则清零
* @param  index: I2Cx index
* @retval 发送总字节数
*/
uint32_t hal_i2cs_get_tx_cnt(i2c_index_e index);

/**
* @brief  获取 i2c slave 接收数量
*         注意这是通信过程i2c slave接收的数据量，如果更新了i2c slave的rx_buffer，则清零
* @param  index: I2Cx index
* @retval 数据接收数量
*/
uint32_t hal_i2cs_get_rx_cnt(i2c_index_e index);

/**
* @brief  清零 i2c slave 接收数量
* @param  index: I2Cx index
* @retval none
*/
void hal_i2cs_rx_cnt_clear(i2c_index_e index);

/**
* @brief  获取 i2c slave 发送状态
* @param  index: I2Cx index
* @retval true：数据发送完成
*         false：数据还在发送
*/
bool hal_i2cs_get_write_complete(i2c_index_e index);

/**
* @brief  i2c slave 注册回调函数
* @param  index: I2Cx index
* @param  cb：call back
* @retval
*/
void hal_i2cs_register_callback(i2c_index_e index, hal_i2cs_cb cb);

/**
* @brief  i2c slave 配置接收buffer, 底层自动接收数据后调用callback
* @param  index: I2Cx index
* @param  rx_buffer：自动模式数据接收buffer
* @param  rx_size:   自动模式数据接收buffer size
* @retval none
*/
void hal_i2cs_update_rx_buffer(i2c_index_e index, uint8_t *rx_buffer, size_t rx_size);

/**
* @brief  i2c slave 配置自动发送buffer
* @param  index: I2Cx index
* @param  tx_buffer：自动模式数据发送buffer
* @param  tx_size：   自动模式数据发收buffer size
* @param  circle：circle mode，重复发送buffer的数据
* @retval none
*/
void hal_i2cs_update_tx_buffer(i2c_index_e index, const uint8_t *tx_buffer, uint32_t tx_size, bool circle);

/**
* @brief  i2c slave 启动
* @param  index: I2Cx index
* @retval none
*/
void hal_i2cs_start(i2c_index_e index);

/**
* @brief  i2c slave 停止
* @param  index: I2Cx index
* @retval none
*/
void hal_i2cs_stop(i2c_index_e index);

#endif /* __HAL_I2C_SLAVE_H__*/

