/*************************************************************************************
* 项目名: 
* 开发环境：ChipON IDE
* 软件版本：
* 硬件：
* 使用芯片：
* 作者：上海芯旺微电子有限公司
* 功能简述: 
*************************************************************************************/

#include "main.h"

volatile unsigned char touch_process_flag; // 触摸采样完毕标记
volatile unsigned int  Touch_Watch; //  触摸功能监听

unsigned  char NEED_CAL_IN_LINE;	// 校准的标志


/***********************************************************************
 * 函数名称 AdjustFun
 * 输入： MODE  MODE_UP  MODE_DOWN
 * 输出:  无
 * 功能：MODE_UP 数据AD_V还在追频阶段上升   MODE_DOWN  AD_V下滑，超频
 * *****************************************************************/
void	AdjustFun()
{
	if(AD_I>CurrentAdjustNum)
	{
		if(OSCCAL0<250)OSCCAL0++;
		SubNum--;


		LED1=LED_ON;
	}
	else if(AD_I<CurrentAdjustNum-I_ADJUST_NUM_CHANGE_NUM)
	{
		if(OSCCAL0)OSCCAL0--;	///AD_V增加  减小OSCCAL
		SubNum++;
		LED1=LED_OFF;
	}

	//电压检测无水
	if(AD_V>V_NO_WATER_MAX)//+(SubNum<<4))
	{

		if(V_NoWatercnt++>V_NoWatercnt_MAX)
		{
			LEDFre=LEDFre_INIT/LED_V_ERROR;
			NoWaterFlag=1;
			LED2=LED_OFF;
			LED1=LED_ON;
		}
	}
	if((AD_I<I_ERROR_MIN)&&(AD_V>V_threshold_INIT))			//拔掉雾化片，电流迅速变小；上电时无雾化片，电流值持续比较小
	{
		if(I_NoWatercnt++>V_NoWatercnt_MAX)
		{
			LEDFre=LEDFre_INIT/LED_I_ERROR;
			NoWaterFlag=1;
			LED2=LED_OFF;
			LED1=LED_ON;
		}

	}

}
//;************************************************************************************
//;* 函 数 名:  delay_ms
//;* 函数功能: 延时函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void delay_ms(uint ms_data)
{
	uint j=0;
	while(ms_data--)
	{
		j=200;
		_CWDT();
		while(j--)
		{
			_CWDT();
		}
	}
}
//;************************************************************************************
//;* 函 数 名:  delay_us
//;* 函数功能: 延时函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void delay_us(uint us_data)
{
	while(us_data--)
	{
		_CWDT();
	}
}
//;************************************************************************************
//;* 函 数 名:  INT_FUN() __interrupt
//;* 函数功能: 中断函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void INT_FUN() __interrupt  (0)
{
	if(T0IF)
	{
		T0IF = 0;
		T0 = T0_MAX;
		if(main_cnt<250)main_cnt++;

		Time20MScnt++;
		if(Time20MScnt>=80)
		{
			Time20MScnt=0;

			if(KEY)
			{
				if(KeyDownNum<2000)
					KeyDownNum++;
				if(KeyDownNum>LONG_KEY_MAX && !KeyReadFlag)
				{
					LongKeyFlag=1;
				}
			}
			else
			{
				if(KeyDownNum>SHORT_KEY_MIN && KeyDownNum<SHORT_KEY_MAX && !KeyReadFlag)
				{
					ShortKeyFlag=1;
					keycnt++;
					keycnttime=0;
					if(keycnt>=3)
					{
						keycnt=0;
						LongKeycacFlag=1;
					}
				}
				KeyDownNum=0;
				KeyReadFlag=0;

				if(keycnttime<250)keycnttime++;
				if(keycnttime>25)keycnt=0;
			}



			if(NoWaterTimecnt<250)
				NoWaterTimecnt++;

		}


	}

	// 定时标记结束
	//============触摸中断标志===============//
	if(T3IF)
	{
		//使用同步T4作为计时
		T4ON=0;
		//------------
		T3IF = 0;
		Touch_Watch=0;
		touch_process_flag = 0xff;
	}// end CTIF

}
//;************************************************************************************
//;* 函 数 名:  Water_Judge
//;* 函数功能: 判断水位
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void Water_Judge()
{
		if(_KF8_LIBi_channel_flag_&0x00000001)// key0  CT0
		{

		}
		else
		{

			LEDFre=LEDFre_INIT/LED_TOUCH_ERROR;
			NoWaterFlag=1;
			LED2=LED_OFF;
			LED1=LED_OFF;
		}

}


/***********************************************************************
 * 名称： Init_ram
 * 输入： 无
 * 输出:  无
 * 功能：清除指定RAM空间
 * *****************************************************************/
void Init_ram()
{
	__asm
	MOV		R3,#0X00
	MOV		_BANK,R3
LADR_0x009B:
	MOV 	R2 ,#0XFF
	MOV 	R1 ,#0X80		//起始地址0x80
	JMP 	LADR_0x00F3
LADR_0x009C:
	XOR R0 ,R2
	CLR R0
	ST [R1],R0
	INC R1
LADR_0x00F3:
	MOV R0 ,R1
	XOR R0 ,R2			//;R2xor R0----R2
	JB _PSW,_Z
	JMP LADR_0x009C			//;RESULT !=0，Z=0

	INC	R3
	MOV	R0,#0X04
	XOR	R0,R3
	JNB	_PSW,_Z
	JMP	LADR_0x00F5

	MOV	_BANK,R3
	JMP	LADR_0x009B
LADR_0x00F5:
	NOP
	__endasm;
}

void Init_data()
{
	Flag.AllByte=0;
	AlarmFlag.AllByte=0;
	CurrentAdjustNum=0;
	KeyDownNum;

	Time20MScnt=0;
	V_NoWatercnt=0;
	I_NoWatercnt=0;
	AdjustOvercnt=0;
	NoWaterTimecnt=0;
	main_cnt=0;
	SubNum=0;
	AD_temp_V=0;
	AD_temp_I=0;
	AD_V=0;
	AD_I=0;
	AD_cnt=0;
	Power=0;
	LEDFre=0;
	CurrentShortCnt=0;
}

/***********************************************************************
 * 名称：KeyFun
 * 输入： LongKeyFlag ShortKeyFlag
 * 输出:  无
 * 功能：按键处理函数
 * *****************************************************************/
void KeyFun()
{

	if(LongKeyFlag)
	{
		LongKeyFlag=0;

		KeyReadFlag=1;

		WorkOn=!WorkOn;

		Power=Max;

		CurrentAdjustNum=I_ADJUST_NUM;

		LEDFre=LEDFre_INIT;

		if(!WorkOn)
		{
			Init_data();
		}
	}

	if(LongKeycacFlag && !WorkOn)			//校正水位
	{
		LongKeycacFlag=0;
		KeyReadFlag=1;
		WorkOn=0;
		Init_data();
		NEED_CAL_IN_LINE=1;
		cnt=0;
	}

	if(ShortKeyFlag)
	{
		ShortKeyFlag=0;

		KeyReadFlag=1;

		if(WorkOn && !NoWaterFlag)
		{

#if		DEBUG_HAND
			if(Power==Max)
			{
				Power=Min;
			}
			else if(Power==Min)
			{
				Power=Mid;
			}
			else if(Power==Mid)
			{
				Power=Max;
			}
			else
			{
				Power=Mid;
			}


#else
			if(OSCCAL0>0)OSCCAL0--;
			SubNum++;

			_NOP();
			_NOP();

			LED2=!LED2;
#endif
		}
	}
}

/**********************************************************************
* 名     称: ADCFun
* 功     能: AD采样单元函数
* 输     入：无
*返      回： 单个AD采样值 result
*************************************************************************/
uint ADCRead(uchar channel)
{
	unsigned int result=0;

	ADCCTL0=channel;
	delay_us(10);

	START = 1;  //AD正在进行转换
	while(START);
	result = ADCDATA0H*256 + ADCDATA0L;
	return	result;
}

//;************************************************************************************
//;* 函 数 名:  void main()
//;* 函数功能: 主函数，入口函数
//;* 入口参数: 无
//;* 返    回:   无
//;************************************************************************************
void main()
{
	unsigned char i;
	init_mcu();
	VRECTL=VRECTL1_INIT;
	Pmw1InitFun();
	T0InitFun();
	Init_ram();
	LED1=LED_ON;
	LED2=LED_ON;
	delay_ms(1500);	   //等待电源稳定
	LED1=LED_OFF;
	LED2=LED_OFF;

	//----------------------------------------------------------
//普通触摸控制
	   CTCTL1 = 0x81;	             	//分频和源    0/4/8/C & 1，结果触摸频率低于等于2M为佳
	   VDAC=0x90;				       //公式0.05Vdd（N+1)    N=0--15
//内置参考电压控制
//		CTCTL1 	= 0x80;           	//分频和源    0/4/8/C & 1 VDD  0 Vref//
//		VRECTL	=0x92;  			//  电压值 6/A/E 	2V 3V 4V  &	 2 使能
//		VDAC=0x80;					// 0.45VDAC       公式0.05Vdac（N+1)    N=0--15
//		VDACS=0x40; （0x01A set bit 6）
	//----------------------------------------------------------
	 _CWDT();
	 delay_ms(500);
	 _KF8spts2w_Lib_SET_MCU_Parameter(2);	//功能模式，参数见kf8spts2w_lib_touch.h 中说明
	 _KF8spts2w_LIBf_init_touch_();		//调用电容触摸库函数的初始化

	while(1)
	{
		_CWDT();
		KeyFun();
		if(WorkOn)
		{
			IO_FAN=1;///gy
			_CWDT();
			if(!NoWaterFlag)
			{
				if(main_cnt<Power)
				{

					if(!PWM1ON)
					{
						PWM1ON=1;			//开PWM
					}

					AD_temp_V +=ADCRead(ANSE_V);

					AD_temp_I +=ADCRead(ANSE_I);

					AD_cnt++;
					if(AD_cnt>=AVEG_NUM_MIN)
					{

						AD_V=AD_temp_V/AD_cnt;
						AD_I=AD_temp_I/AD_cnt;
						AD_temp_V=0;
						AD_temp_I=0;
						data_ok=1;
						AD_cnt=0;
					}

#if		DEBUG_HAND
					if(AD_I>I_ERROR_MAX)			//过流和短路检测
					{
						CurrentShortCnt++;
						if(CurrentShortCnt>5)
						{
							PWM1ON=0;
							PWM_IO=0;
							LEDFre=LEDFre_INIT/LED_I_ERROR;
							NoWaterFlag=1;
							LED2=LED_ON;
							LED1=LED_ON;
						}
					}
#endif

				}
				else
				{
					if(PWM1ON)
					{
						PWM1ON=0;
						PWM_IO=0;
					}

					if(data_ok)
					{
						data_ok=0;
#if		DEBUG_HAND
						AdjustFun();
						if(SubNum>=SubNum_INIT_MAX)		//步进超调,雾化片异常
						{

							if(AdjustOvercnt++>ADJUST_OVER_CNT_MAX)		//超频3次则进入超频
							{
								NoWaterFlag=1;

								LEDFre=LEDFre_INIT/LED_NUM_ERROR;
								LED1=LED_ON;
								LED2=LED_ON;
							}
							else			//下调电流比较
							{
								CurrentAdjustNum = CurrentAdjustNum-I_ADJUST_NUM_CHANGE_NUM;
								SubNum = SubNum-40;
								OSCCAL0 = OSCCAL0+40;
							}
						}
#endif
//						I2C(AD_V);
//						I2C(AD_I);
//						I2C(AlarmFlag.AllByte);
//						I2C(SubNum);

					}
					if(main_cnt>=Time)
					{
						main_cnt=0;
					}
				}
			}
			else
			{
				if(NoWaterTimecnt>LEDFre)
				{
					NoWaterTimecnt=0;
					LED2=!LED2;
					LED1=!LED1;
				}
			}
		}
		else
		{
			IO_FAN=0;///gy

			if(!WorkOffFlag)
			{
				WorkOffFlag=1;

				PWM1ON=0;
				PWM_IO=0;

				LED1=LED_OFF;
				LED2=LED_OFF;

				__asm
				CALL    0XFFF
				MOV    OSCCAL0, R0

				CALL   0XFFE
				MOV   OSCCAL1, R0

				CALL   0XFFD
				MOV   OSCCAL2, R0

				CALL   0XFFC
				MOV   OSCCAL3, R0
				__endasm;
				OSCCAL0 = OSCCAL0+10;
				while(KEY)		//等待按键释放
				{
					_CWDT();
					KeyDownNum=0;
				}

				if(NEED_CAL_IN_LINE)
				{
					LED1=LED_ON;
					delay_ms(2000);
					touch_process_flag=0;
				}
			}
		}

		if(touch_process_flag && !PWM1ON)
		{
			touch_process_flag = 0;

			if(NoWaterFlag || !WorkOn)TOUCH_DEBUG_TRS_DEAL();   // 约320条指令

			_KF8spts2w_LIBf_touch_process_();

			if(!NoWaterFlag && WorkOn)Water_Judge();

			// 满足在线校准的条件时执行校准代码，这样不依靠每次下完程序的首次减小采样的限制。
			if(NEED_CAL_IN_LINE)
			{
				if(cnt++>200)
				{
					NEED_CAL_IN_LINE=0;
					for(i=0;i<CHS_AMOUNT;i++)
					{
						_KF8_LIBi_buff_baseline_[i]=_KF8_LIBi_buff_hit_[i];
						_KF8_LIBi_buff_refline_[i]=_KF8_LIBi_buff_hit_[i];
						Arr_erom_TS2W_[2*i+1]=(unsigned char)(_KF8_LIBi_buff_hit_[i]>>8);
						Arr_erom_TS2W_[2*i+0]=(unsigned char)(_KF8_LIBi_buff_hit_[i]);
					}
					write_eep_ts2w_();

					for(i=0;i<10;i++)
					{
						LED1=!LED1;
						delay_ms(200);
					}
					LED1=LED_OFF;
				}
			}
		}
		// 监听处理
		Touch_Watch++;
		if(Touch_Watch>=50000) // 可细调粗略时间
		{
			Touch_Watch=0;
			_KF8spts2w_LIBf_init_touch_();
		}
	}
}
