#ifndef __DRV_ADC_H_
#define __DRV_ADC_H_  

#include "tmp75.h"
#include "drv_i2c.h"
#include "stdlib.h"
#include "stdbool.h"
#include "string.h"
#include "gd32f4xx.h"
#include "delay.h"


/* 自定义宏，方便修改通道和引脚 */
#define ADCX                        ADC1
#define VOLTAGE_ADC_CHANNEL         ADC_CHANNEL_12
#define CURRENT_ADC_CHANNEL         ADC_CHANNEL_13

#define ADC_GPIO_PORT               GPIOC
#define VOLTAGE_ADC_PIN             GPIO_PIN_2
#define CURRENT_ADC_PIN             GPIO_PIN_3

#define LB_V_TIMES                  6 	//电压采样、滤波次数
#define LB_I_TIMES                  6	//电流采样、滤波次数
#define LB_T_TIMES                  3 	//温度采样、滤波次数

#define LB_V_DEL					1 	//电压滤波最高最低各删除个数
#define LB_I_DEL					2 	//电流滤波最高最低各删除个数
#define LB_T_DEL					1	//温度滤波最高最低各删除个数

#define ADC_MODE_0						//规则组、单次转换、非扫描
// #define ADC_MODE_1					//注入组、单次转换、扫描、转换结束标志位采集
// #define ADC_MODE_2					//注入组、单次转换、扫描、中断转换结束标志位采集
// #define ADC_MODE_3					//规则组、连续转换、扫描、DMA采集

/* adc模式配置参数：ENABLE；DISABLE */

#ifdef ADC_MODE_0

#define CONTINUOUS_STATUS			DISABLE					// 是否开启连续转换
#define SEQUENCE_CHANNEL			ADC_REGULAR_CHANNEL		// 规则组
#define SCAN_STATUS					DISABLE					// 是否开启扫描模式
#define	CHANNEL_LENGTH				1						// 通道数量:1~16

#endif

#ifdef ADC_MODE_1

#define CONTINUOUS_STATUS			DISABLE					// 是否开启连续转换
#define SEQUENCE_CHANNEL			ADC_INSERTED_CHANNEL	// 注入组
#define SCAN_STATUS					ENABLE					// 是否开启扫描模式
#define	CHANNEL_LENGTH				2						// 通道数量:1~16

#endif

#ifdef ADC_MODE_2

#define CONTINUOUS_STATUS			DISABLE					// 不开启连续转换
#define SEQUENCE_CHANNEL			ADC_INSERTED_CHANNEL	// 注入组
#define SCAN_STATUS					ENABLE					// 是否开启扫描模式
#define	CHANNEL_LENGTH				2						// 通道数量:1~16
#define ADCX_IRQn					ADC_IRQn

#endif

#ifdef ADC_MODE_3

#define CONTINUOUS_STATUS			ENABLE					// 开启连续转换
#define SEQUENCE_CHANNEL			ADC_REGULAR_CHANNEL		// 规则组
#define SCAN_STATUS					ENABLE					// 是否开启扫描模式
#define	CHANNEL_LENGTH				2						// 通道数量:1~16
#define DMAX						DMA1

#endif


/* adc dma */

#ifdef DMAX
#define USER_DMA_ADC_CHANNEL		DMA_CH3					//DMA通道：ADC0:DMA_CH0 DMA_CH4 
															//         ADC1:DMA_CH2 DMA_CH3 
															//         ADC2:DMA_CH0 DMA_CH3
#define USER_DMA_ADC_SUBPERI		DMA_SUBPERI1			//DMA外设源:ADC0:DMA_SUBPERI0 
                                                            //          ADC1:DMA_SUBPERI1
															//          ADC2:DMA_SUBPERI2		  
#define DMA_ADC_IRQn				DMA1_Channel0_IRQn		//DMA1_Channel0_IRQn         
                                                            //DMA1_Channel1_IRQn       
                                                            //DMA1_Channel2_IRQn 
				                                            //DMA1_Channel3_IRQn 
                                                            //DMA1_Channel4_IRQn       									 
#define DMA_ADC_PRIORITY_PRE		0						//抢占优先级
#define DMA_ADC_PRIORITY_SUB		1						//子优先级

#endif


#ifdef ADCX_IRQn
#define ADCX_PRIORITY_PRE			2U						//抢占优先级
#define ADCX_PRIORITY_SUB			0U						//子优先级
#endif

void adc_init(void);
void adc_rcu_config(void);
void adc_gpio_config(void);
void adc_config(void);
float ptz_Voltage_collect_adc1_task();
float ptz_Current_collect_adc1_task();
float ptz_temperature_collect_tmp75_task();
float Filtering(float *filter, uint8_t filterlens, uint8_t filterdel);

#ifdef ADCX_IRQn
void adc_interrupt_int(void);
#endif

#ifdef DMAX
void adc_dma_config(void);
__weak void DMA1_Channel0_IRQHandler(void);
uint16_t BSP_ADCDataAcquire(uint8_t _index);
#endif

#endif

