#ifndef __LKS32MC09X_DAC_H__
#define __LKS32MC09X_DAC_H__

#include "lks32mc09x_reg.h"
/**
 * @brief DAC模块设置
 */
#define DAC_CHANNEL_0 0 // 12位dac，量程4.85V和1.2V可选
#define DAC_CHANNEL_1 1 // 8位dac，量程3V和1.2V可选
/**
 * @brief DAC量程
 * @see
 * SYS_AFE_REG1_DAC1_GAIN_BIT
 * SYS_AFE_REG1_DAC0_GAIN_BIT
 */
#define DAC_RANGE_0_4V76 0 ///< DAC0 4.76V量程
#define DAC_RANGE_0_1V2  1 ///< DAC0 1.2V量程
#define DAC_RANGE_1_3V   0 ///< DAC1 3V量程
#define DAC_RANGE_1_1V2  1 ///< DAC1 1.2V量程
/**
 * @brief DAC0步进
 */
#define DAC_STEP_TRG_NONE   (0)      ///< 不触发DAC步进
#define DAC_STEP_TRG_TIMER0 (1 << 0) ///< TIMER0 过零事件触发 DAC0 步进
#define DAC_STEP_TRG_TIMER1 (1 << 1) ///< TIMER1 过零事件触发 DAC0 步进
#define DAC_STEP_TRG_TIMER2 (1 << 2) ///< TIMER2 过零事件触发 DAC0 步进
#define DAC_STEP_TRG_TIMER3 (1 << 3) ///< TIMER3 过零事件触发 DAC0 步进
/**
 * @brief DAC0步进
 */
#define DAC_STEP__4 0x4 ///< DAC0 步进值 -4
#define DAC_STEP__3 0x5 ///< DAC0 步进值 -3
#define DAC_STEP__2 0x6 ///< DAC0 步进值 -2
#define DAC_STEP__1 0x7 ///< DAC0 步进值 -1
#define DAC_STEP__0 0x0 ///< DAC0 步进值 0
#define DAC_STEP_1  0x1 ///< DAC0 步进值 1
#define DAC_STEP_2  0x2 ///< DAC0 步进值 2
#define DAC_STEP_3  0x3 ///< DAC0 步进值 3

typedef struct
{
    uint8_t DAC_RANGE;      /**< DAC量程 可选参数: DAC_RANGE_0_4V76 DAC_RANGE_0_1V2 DAC_RANGE_1_3V DAC_RANGE_1_1V2 */
    uint8_t DACOUT_EN;      /**< DAC输出到IO使能 */
    int8_t DAC_STEP;        /**< 步进值， 3bit 有符号数，范围-4~3 */
    uint8_t DAC_STEP_TRG_x; /**< UTIMER0/1/2/3触发步进使能,DISABLE，不使能；ENABLE，使能 */
} DAC_InitTypeDef;

/**
 * @brief DAC初始化
 * @param DAC_Channel DAC通道选择
 * @param DAC_InitStruct DAC初始化结构体
 */
void DAC_Init(uint8_t DAC_Channel, DAC_InitTypeDef *DAC_InitStruct);

/**
 * @brief DAC初始化结构体初始化
 * @param DAC_InitStruct DAC初始化结构体
 */
void DAC_StructInit(DAC_InitTypeDef *DAC_InitStruct);
/**
 * @brief DAC输出数值设置（数字量）
 * @param DAC_Channel DAC通道选择
 * @param DACValue DAC输出数字量
 */
void DAC_OutputValue(uint8_t DAC_Channel, uint32_t DACValue);

/**
 * @brief 设置DAC量程
 * @param DAC_Channel DAC通道选择
 * @param DAC_RANGE_x DAC输出量程
 */
void DAC_SetRange(uint8_t DAC_Channel, uint32_t DAC_RANGE_x);

/**
 * @brief DAC输出模拟量，自动配置量程&同时自动使能对应的模块
 * @param DAC_Channel DAC通道选择
 * @param DACVoltage DAC输出模拟量 单位mV
 */
void DAC_OutputVoltage(uint8_t DAC_Channel, uint16_t DACVoltage);

/**
 * @brief DAC通道时钟使能
 * @param DAC_Channel DAC通道选择
 * @param state 使能状态，1模块使能 0 模块关闭
 */
void DAC_Cmd(uint8_t DAC_Channel, uint8_t state);

/**
 * @brief DAC使能
 * @param DAC_Channel DAC通道选择
 */
void DAC_Enable(uint8_t DAC_Channel);
/**
 * @brief DAC失能
 * @param DAC_Channel DAC通道选择
 */
void DAC_Disable(uint8_t DAC_Channel);
/**
 * @brief DAC复位
 * @param DAC_Channel DAC通道选择
 */
void DAC_Reset(uint8_t DAC_Channel);
/**
 * @brief DAC输出至IO口使能配置
 * @param DAC_Channel DAC通道选择
 * @param state 1Dac电压p0.0口 0停止输出到P0.0
 */
void DAC_Output(uint8_t DAC_Channel, uint8_t state);

/**
 * @brief 获取当前DAC输出值
 * @param DAC_Channel DAC通道选择
 * @return DAC输出值
 */
uint32_t DAC_Value(uint8_t DAC_Channel);
/**
 * @brief 获取当前DAC输出电压
 * @param DAC_Channel DAC通道选择
 * @return DAC输出电压 单位mV
 */
uint16_t DAC_Voltage(uint8_t DAC_Channel);
/**
 * @brief 获取当前DAC量程
 * @param DAC_Channel DAC通道选择
 * @return DAC量程 dac0 0:4.85V 1:1.2V dac1 0:3V 1:1.2V
 */
uint8_t DAC_Range(uint8_t DAC_Channel);
/**
 * @brief DAC0步进设置
 * @param DAC_Channel DAC通道选择
 * @param DAC_STEP_x DAC0步进值
 * @param DAC_STEP_TRG_x DAC0步进触发源
 */
void DAC_Step(uint8_t DAC_Channel, uint8_t DAC_STEP_x, uint8_t DAC_STEP_TRG_x);
#endif
