/**
 * \file
 * \brief sm6218模块驱动头文件
 * 
 * \internal
 * \par modification history:
 * - 1.00 25-03-28, first implementation.
 * \endinternal
 */

#include "main.h"

#define SM6218_FUN_OK        0                     //SM6218函数相关接口操作成功
#define SM6218_FUN_ERROR    -1                     //SM6218函数相关接口操作失败
#define SM6218_VALUE_ERROR  -2                     //SM6218函数的传入参数错误


/**
 * \broef SM6218设备通道
 */
#define SM6218_CHAN1         0                     //SM6218设备通道1
#define SM6218_CHAN2         1                     //SM6218设备通道2
#define SM6218_CHAN3         2                     //SM6218设备通道3
#define SM6218_CHAN4         3                     //SM6218设备通道4
#define SM6218_CHAN5         4                     //SM6218设备通道5
#define SM6218_CHAN6         5                     //SM6218设备通道6
#define SM6218_CHAN7         6                     //SM6218设备通道7
#define SM6218_CHAN8         7                     //SM6218设备通道8

/**
 * \broef SM6218配置寄存器
 */
 
/**
 * \broef SM6218设备通道使能
 */
#define SM6218_CHAN_EN          1 << 7                //SM6218通道使能

/**
 * \broef SM6218热电偶类型选择
 */
#define SM6218_TYPE_T           0 << 6                //T型热电偶
#define SM6218_TYPE_K           1 << 6                //K型热电偶

/**
 * \broef SM6218测温范围选择
 */
#define SM6218_TEMP_RANGE_0     0 << 5                //(-100~300)摄氏度
#define SM6218_TEMP_RANGE_1     1 << 5                //(-270~1300)摄氏度

/**
 * \broef SM6218冷端芯片选择
 */
#define SM6218_COLD_CHIP_TMP116 0 << 4                //TMP116
#define SM6218_COLD_CHIP_M117   1 << 4                //M117


 /**
 * \broef 子寄存器地址
 */
#define SM6218_TEMP_ADDR    (0X00)                     //温度子寄存器地址,3字节定点数类型数据
#define SM6218_TEMP_LEN     (0X18)                     //温度子寄存器长度

#define SM6218_CONFIG_ADDR  (0X01)                     //模块配置寄存器地址
#define SM6218_CONFIG_LEN   (0X08)                     //模块配置寄存器长度

#define SM6218_VOL_ADDR     (0X02)                     //电压子寄存器地址
#define SM6218_VOL_LEN      (0X18)                     //电压子寄存器长度

#define SM6218_COLD_ADDR    (0X03)                     //冷端温度子寄存器地址
#define SM6218_COLD_LEN     (0X18)                     //冷端温度子寄存器长度

#define SM6218_SPEED_ADDR   (0X0b)                     //模块采样率寄存器地址
#define SM6218_SPEED_LEN    (0X01)                     //模块采样率寄存器长度

#define SM6218_TEMP_4B_ADDR (0X0a)                     //温度子寄存器地址,4字节浮点型类型数据
#define SM6218_TEMP_4B_LEN  (0X20)                     //温度子寄存器长度


/**
 * \broef SM6218设备结构体
 */
typedef struct zlg_sm6218_device {
    I2C_HandleTypeDef *hi2c;                /* i2c设备的句柄 */
    uint16_t           sm6218_addr;         /* sm6218模块地址 */  
}zlg_sm6218_device_t;



/**
 * \brief 获取寄存器通道的温度值
 * 
 * 
 * \param[in] p_dev SM6218设备
 * \param[in] chan 通道 
 * \param[in] memaddr 子寄存器地址，
 * \param[out] p_data 存放温度数据的缓存区
 * 
 * \retval SM6218_FUN_OK       配置成功
 * \retval SM6218_FUN_ERROR    配置失败
 * \retval SM6218_VALUE_ERROR  参数错误
 */
int sm6218_get_temp(zlg_sm6218_device_t *p_dev, uint16_t memaddr, int8_t chan, float *p_data);



/**
 * \brief  设置配置寄存器
 * 
 * \param[in] p_dev   SM6218设备
 * \param[in] config  配置寄存器信息

 * 
 * \retval SM6218_FUN_OK    配置成功
 * \retval SM6218_FUN_ERROR 配置失败
 * \retval SM6218_VALUE_ERROR  参数错误
 */
int sm6218_config_set(zlg_sm6218_device_t *p_dev, uint8_t *config);


 /**
 * \brief 获取寄存器通道的冷端温度
 * 
 * 
 * \param[in] p_dev SM6218设备
 * \param[in] chan 通道 
 * \param[in] memaddr 子寄存器地址，
 * \param[out] p_data 存放温度数据的缓存区
 * 
 * \retval SM6218_FUN_OK       配置成功
 * \retval SM6218_FUN_ERROR    配置失败
 * \retval SM6218_VALUE_ERROR  参数错误
 */
int sm6218_get_cold_temp(zlg_sm6218_device_t *p_dev, uint16_t memaddr, int8_t chan, float *p_data);


  /**
 * \brief 获取寄存器通道的电压值
 * 
 * 
 * \param[in] p_dev SM6218设备
 * \param[in] chan 通道 
 * \param[in] memaddr 子寄存器地址，
 * \param[out] p_data 存放电压数据的缓存区
 * 
 * \retval SM6218_FUN_OK       配置成功
 * \retval SM6218_FUN_ERROR    配置失败
 * \retval SM6218_VALUE_ERROR  参数错误
 */
int sm6218_get_vol(zlg_sm6218_device_t *p_dev, uint16_t memaddr, int8_t chan, float *p_data);

/** end of file **/