/***********************************************************************************************************
 * Copyright (c)  2021 - 2022, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : app.c
 * Description : app source file
 * Author(s)   : yanhaihua
 * version     : V1.0
 * Modify date : 2021-09-24
 ***********************************************************************************************************/
#include "app.h"
#include "delay.h"
#include "gpio.h"
#include "uart.h"
#include "adc.h"
#include "gpio.h"

#define ADC_IRQ_EN

uint8_t app_adc_ch3_flag = 0;
uint8_t app_adc_ch4_flag = 0;
uint8_t app_adc_ch5_flag = 0;

uint16_t app_adc_ch3_value = 0;
uint16_t app_adc_ch4_value = 0;
uint16_t app_adc_ch5_value = 0;

/***********************************************************************************************************
 * Function		: app_adc_ch3_irq
 * Description	: 通道3中断处理
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_ch3_irq(void)
{
	app_adc_ch3_value = adc_get_data(ADC_3);
	app_adc_ch3_flag = 1;
}

/***********************************************************************************************************
 * Function		: app_adc_ch4_irq
 * Description	: 通道4中断处理
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_ch4_irq(void)
{
	app_adc_ch4_value = adc_get_data(ADC_4);
	app_adc_ch4_flag = 1;
}


/***********************************************************************************************************
 * Function		: app_adc_ch5_irq
 * Description	: 通道5中断处理
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_ch5_irq(void)
{
	app_adc_ch5_value = adc_get_data(ADC_5);
	app_adc_ch5_flag = 1;
}

/***********************************************************************************************************
 * Function		: app_adc_single_to_single_test
 * Description	: 单通道单次采集
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_single_to_single_test(void)
{
	/* ADC初始化，选择ADC参考电压源、ADCCLK分频和采样模式 */
	adc_init(ADC_REF_VDDH,ADC_SAMPL_RATE_50K_SPS,ADC_SINGLE_MODE);
	gpio_set_ads(PB1,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_3);
	
	print2Debug("************* app_adc_single_to_single_test ************* !!!\r\n");
	
#ifdef ADC_IRQ_EN	
	adc_irq_init(ENABLE,ADC_IRQ_CH3_INT_EN,app_adc_ch3_irq);	
	for(uint8_t i=0; i<10; i++)
	{
		adc_convert_start();
		while(app_adc_ch3_flag == 0);
		app_adc_ch3_flag = 0;
		adc_convert_stop();
		
		print2Debug("ch3[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
	}
#else
	for(uint8_t i=0; i<10; i++)
	{
		adc_convert_start();
		app_adc_ch3_value = adc_get_data(ADC_3);
		adc_convert_stop();
		print2Debug("ch3[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
	}
#endif
}

/***********************************************************************************************************
 * Function		: app_adc_single_to_single_test
 * Description	: 单通道连续采集
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_single_to_continuity_test(void)
{
	/* ADC初始化，选择ADC参考电压源、ADCCLK分频(2~65535)和采样模式 */
	adc_init(ADC_REF_VDDH,ADC_SAMPL_RATE_50K_SPS,ADC_CONTINUOUS_MODE);

	gpio_set_ads(PB1,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_3);

	print2Debug("************* app_adc_single_to_continuity_test ************* !!!\r\n");
#ifdef ADC_IRQ_EN						
	adc_irq_init(ENABLE,ADC_IRQ_CH3_INT_EN,app_adc_ch3_irq);	
	
	adc_convert_start();
	
	while(app_adc_ch3_flag == 0); 																			/* 等待连续10次采样结束 */
	app_adc_ch3_flag = 0;

	for(uint8_t i=0; i<10; i++)
	{
		print2Debug("ch3[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
	}
	adc_convert_stop();
	
#else
	adc_convert_start();
	for(uint8_t i=0; i<10; i++)
	{
		app_adc_ch3_value = adc_get_data(ADC_3);
		print2Debug("ch3[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
	}
	adc_convert_stop();
#endif
}

/***********************************************************************************************************
 * Function		: app_adc_single_to_single_test
 * Description	: 多通道单次采集
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_multichannel_to_single_test(void)
{	
	/* ADC初始化，选择ADC参考电压源、采样频率 和 采样模式 */
	adc_init(ADC_REF_VDDH,ADC_SAMPL_RATE_50K_SPS,ADC_SINGLE_MODE);							
	
	gpio_set_ads(PB1,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_3);
	
	gpio_set_ads(PB2,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_4);
	
	gpio_set_ads(PB3,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_5);
	

	print2Debug("************* app_adc_multichannel_to_single_test ************* !!!\r\n");
#ifdef ADC_IRQ_EN												
	adc_irq_init(ENABLE,ADC_IRQ_CH3_INT_EN,app_adc_ch3_irq);
	adc_irq_init(ENABLE,ADC_IRQ_CH4_INT_EN,app_adc_ch4_irq);
	adc_irq_init(ENABLE,ADC_IRQ_CH5_INT_EN,app_adc_ch5_irq);
	
	for(uint8_t i=0; i<10; i++)
	{
		adc_convert_start();
		
		while(app_adc_ch3_flag == 0); 																	
		app_adc_ch3_flag = 0;
		print2Debug("ch3[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
		
		while(app_adc_ch4_flag == 0); 																		
		app_adc_ch4_flag = 0;
		print2Debug("ch4[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch4_value,(float)app_adc_ch4_value/4095*(float)3.3);
		
		while(app_adc_ch5_flag == 0); 														
		app_adc_ch5_flag = 0;
		print2Debug("ch5[%dth] adc_value = %d, adc_vol = %.3fV\r\n",i+1,app_adc_ch5_value,(float)app_adc_ch5_value/4095*(float)3.3);
		
		adc_convert_stop();
	}
#else	
	for(i=0; i<10; i++)
	{
		adc_convert_start();
		app_adc_ch3_value = adc_get_data(3);    															/* 通道3取数 */
		app_adc_ch4_value = adc_get_data(4);    															/* 通道4取数 */
		app_adc_ch5_value = adc_get_data(5);    															/* 通道5取数 */
		
		print2Debug("\r\nmultichannel [%dth]\r\n",i+1);
		print2Debug("ch3 adc_value = %d, adc_vol = %.3fV\r\n",app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
		print2Debug("ch4 adc_value = %d, adc_vol = %.3fV\r\n",app_adc_ch4_value,(float)app_adc_ch4_value/4095*(float)3.3);
		print2Debug("ch5 adc_value = %d, adc_vol = %.3fV\r\n",app_adc_ch5_value,(float)app_adc_ch5_value/4095*(float)3.3);
		
		adc_convert_stop();
	}

#endif
}

/***********************************************************************************************************
 * Function		: app_adc_single_to_single_test
 * Description	: 多通道连续采集
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_adc_multichannel_to_continuity_test(void)
{
	/* ADC初始化，选择ADC参考电压源、ADCCLK分频(2~65535)和采样模式 */
	adc_init(ADC_REF_VDDH,ADC_SAMPL_RATE_50K_SPS,ADC_CONTINUOUS_MODE);									
	
	gpio_set_ads(PB1,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_3);
	
	gpio_set_ads(PB2,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_4);
	
	gpio_set_ads(PB3,GPIO_ADS_ANALOG);
	adc_chn_enable(ADC_5);

	print2Debug("************* app_adc_multichannel_to_continuity_test ************* !!!\r\n");
	
	adc_convert_start();
	for(uint8_t i=0; i<10; i++)
	{
		app_adc_ch3_value = adc_get_data(3);    															/* 通道3取数 */
		app_adc_ch4_value = adc_get_data(4);    															/* 通道4取数 */
		app_adc_ch5_value = adc_get_data(5);    															/* 通道5取数 */
		
		print2Debug("\r\nmultichannel [%dth]\r\n",i+1);
		print2Debug("ch3 adc_value = %d, adc_vol = %.3fV\r\n",app_adc_ch3_value,(float)app_adc_ch3_value/4095*(float)3.3);
		print2Debug("ch4 adc_value = %d, adc_vol = %.3fV\r\n",app_adc_ch4_value,(float)app_adc_ch4_value/4095*(float)3.3);
		print2Debug("ch5 adc_value = %d, adc_vol = %.3fV\r\n",app_adc_ch5_value,(float)app_adc_ch5_value/4095*(float)3.3);
		
	}
	
	adc_convert_stop();
}

/***********************************************************************************************************
 * Function		: app_init
 * Description	: app init
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_init(void)
{
	delay_init();
	
	gpio_set_sel(PC1,0x02);																					/* PC1->UART1 TX */
	gpio_set_sel(PC2,0x02);																					/* PC2->UART1 RX */
	uart1_init(115200);

	print2Debug("ADC test...\r\n");
	
//	app_adc_single_to_single_test();
//	app_adc_single_to_continuity_test();
//	app_adc_multichannel_to_single_test();
	app_adc_multichannel_to_continuity_test();
	
}

/***********************************************************************************************************
 * Function		: app_run
 * Description	: app run
 * Input		: none
 * Output		: none
 * Return		: none
 ***********************************************************************************************************/
void app_run(void)
{
	
}
