//===========================================================================
//文件名称：task_ADC.c
//功能概要：定义task_ADC任务,接收PC控制命令控制ADC数据采集并回发采集到的数据
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新：2014-7-12  V2.0
//===========================================================================
#include "app_inc.h"
#include "mqx_adc.h"

ADC_CHANNEL_STRUCT adc_channel1_parameter; 

void task_ADC(uint_32 initial_data)
{
	MQX_FILE_PTR  fd_ptr;    //用于管理ADC设备的文件指针
	
	uint_16 ADValue =0 ;     //用于存放通过AD通道采集的16位数据
	uint_8 temp =0;          //存放16位数据的高八位
	uint_8 lenth=0,i=0;      //length用于存放帧长，i用于循环遍历
	
	 //注册ADC设备
	_io_adc_install("adc:channel1",&adc_channel1_parameter);
	
    //打开设备文件
	fd_ptr = fopen("adc:channel1", NULL);    
	
	//无限等待ADC事件位置位,一次置位可实现多次数据采样
	_lwevent_wait_for(&lwevent_group, Event_ADC, FALSE, NULL); 
	for(;;)
	{		
	    //1.根据帧头、帧尾判断ADC帧的正确性   
	    lenth=gADC_Buff[1];
	    if((gADC_Buff[0]==FrameHead)&&(gADC_Buff[lenth-1]==FrameTail))
	    {
	    	//(1)ADC通道初始化
	    	if(gADC_Buff[3]==0x01)
	    	{
	    		//参数配置
	    		adc_channel1_parameter.MODULE=gADC_Buff[4];
				adc_channel1_parameter.CHANNEL=gADC_Buff[5];
				adc_channel1_parameter.ACCURACY=16;
				adc_channel1_parameter.SAMPLETIMES=10;
	    	}
	    	//(2)ADC通道数据采集
			else if(gADC_Buff[3]==0x02)	
			{
				//使用AD采样命令采集相应通道数据
				ADValue = ioctl(fd_ptr, MADC_IOCTL_SAMPLE_ONCE,
						                &adc_channel1_parameter);  
				temp=ADValue>>8;
				
				gADC_Buff[4]=temp;
				gADC_Buff[5]=ADValue;	
				
				//将待回发给PC的数据放入到轻量级消息队列send_queue中
				DISABLE_INTERRUPTS;				
				_lwmsgq_send((pointer)send_queue, gADC_Buff, 
						                          LWMSGQ_SEND_BLOCK_ON_FULL);				
				ENABLE_INTERRUPTS;
			}			
	    }
		else  //关，停止采样
		{
			_lwevent_clear(&lwevent_group, Event_ADC); 
			
			fclose(fd_ptr);
			fd_ptr=NULL;
	    }
	    
		//2.延时
	    _time_delay(1500);
	}
}
