#ifndef _TS_CFG_H
#define _TS_CFG_H

//-------------------------------------------------------------------------------------------------------------------
#define DEBUG 									0 		//1:打开在线调试功能;	0:关闭在线调试功能
//注意：只有触摸键应用才支持在线调试，滑条应用不支持在线调试。
/********************************************************************************************************
说明：
触摸在线调试功能可在PC端显示当前触摸值、基准值、门限值，可在PC端设置触摸灵敏度，并导出配置文件，
此功能需配合仿真下载器及上位机工具CACHIP_TOOL.exe才能使用。详细使用方法请参考相关文档说明。
********************************************************************************************************/

//-------------------------------------------------------------------------------------------------------------------
#define SUPPORT_KEY								1		//1:支持触摸按键;	0:不支持触摸按键
#define SUPPORT_WHEEL_SLIDER					1		//1:支持触摸触摸滑条或圆环；0:不支持触摸滑条或圆环
//-------------------------------------------------------------------------------------------------------------------


/***********触摸省电模式设置********************************************************************************************************/
#define SUPPORT_TOUCH_SLEEP_MODE				0		//1：支持  0：不支持  

#if SUPPORT_TOUCH_SLEEP_MODE
	#define ENTER_STOP_MODE_TIME				5		//进入触摸省电模式倒数时间，单位为0.5S，如定义为5，5*0.5=2.5秒，即2.5秒无触摸即进入省电模式。
	#define SLEEP_MODE_SCAN_INTERVAL_TIME		100		//扫描触摸的间隔时间，单位约为1ms，注意：此时间越长，芯片待机功耗越低，但触摸响应速度越慢。
	#define SLEEP_TOUTH_THD						5		//触摸省电模式下门限值设置，当触摸数据变化量大于此数值将退出省电模式。不同产品的门限值设置各不相同，请根据具体产品的实际情况进行相应设置。

	#define ENTER_SLEEP_PRINT_EN				0		//省电模式打印开关,主要是为了验证触摸是否正常进入省电模式。进入触摸省电模式时打印"sleep"，退出省电模式时打印"exit"

/*
	说明：
	SLEEP_TOUTH_THD为触摸省电模式下的公共门限值，即所有通道均采用此值。通常情况下，使用公共门限值即可满足需求。
	实际使用过程中，若产品各触摸按键手指按下时的数据变化量（差值）有较大差异时，建议对各按键分别设置独立的门限值。启用SET_THRESHOLD_EACH_CHANNEL后，TS_EnterSleepMode()函数中的门限判断将采用独立的门限值。
*/
	#define SET_THRESHOLD_EACH_CHANNEL			0			//各按键分别设置独立的门限值	0：关闭	1：启用
#if SET_THRESHOLD_EACH_CHANNEL
	#if (SUPPORT_KEY && SUPPORT_WHEEL_SLIDER)	  				
		#define SLEEP_CH_THD_SEQ   {9,8,5,7,7,5,5,7,5}		//门限值的设置，顺序应与KEY_SEQ触摸按键设置顺序 +（WHEEL_SLIDER0_SEQ+WHEEL_SLIDER1_SEQ+...）圆环或滑条通道设置顺序一致   							
	#elif SUPPORT_KEY													 
		#define SLEEP_CH_THD_SEQ   {9,8}					//门限值的设置，顺序应与KEY_SEQ触摸按键设置顺序一致	
	#elif SUPPORT_WHEEL_SLIDER											 
		#define SLEEP_CH_THD_SEQ   {5,7,7,5,5,7,5}     		//门限值的设置，顺序应与（WHEEL_SLIDER0_SEQ+WHEEL_SLIDER1_SEQ+...）圆环或滑条通道设置顺序一致				
	#endif     														
#endif

/*
	省电模式调试开关说明：
	1. 省电模式调试开关通过UART接口打印触摸按键的差值。通常情况下，建议将差值的75%作为门限值（门限值=差值×75%）。具体门限值的设定，请根据实际产品的用户体验感受进行适当调整。
	2. 请注意，当调试开关开启时，触发按键将不会退出省电模式，该功能仅用于调试目的。调试完成后，请务必关闭调试开关。
*/
	#define TS_SLEEP_MODE_DEBUG					0		//省电模式调试开关，此处通过UART接口打印，请同时在ca51f_config.h打开PRINT_EN。


//注意：使能触摸省电模式后，如在某些条件不需要进入省电模式，只需要把TS_SleepEn设为0，如需要进省电模式，把TS_SleepEn设为1。
#endif
//-------------------------------------------------------------------------------------------------------------------

#define TS_ACQ_TIMES							1		//该定义表示多少次采集数据相加进行运算

//-------------------------------------------------------------------------------------------------------------------
/********************触摸数据滤波设置*********************************************************/
#define FILTER_COUNT							5		
//说明：此数值越大，数据越平滑，但是按键响应速度越慢
//-------------------------------------------------------------------------------------------------------------------


//-------------------------------------------------------------------------------------------------------------------
/*******************触摸充电和比较器基准选择***********************************************************************/
#define SOURCE_VDD			0
#define SOURCE_INNER		1

#define TK_CHARGE_REF_SELECT		SOURCE_INNER		//SOURCE_VDD: 触摸充电电源选择为VDD,比较器基准为VDD分压 SOURCE_INNER：触摸充电电源为内部运放，比较器基准为内部基准			
//注意：一般在芯片供电存在低频干扰时选择为SOURCE_INNER， 当选择为SOURCE_INNER后， 芯片静态电流会增加1~2mA. 		

#if (TK_CHARGE_REF_SELECT == SOURCE_VDD)
	#define VRS_VAL			2			//比较器阈值，取值范围为：0~7，数值越大，比较器阈值电压越低。
#elif (TK_CHARGE_REF_SELECT == SOURCE_INNER)
	#define VDS_VAL			1			//触摸内部运放输出电压选择，可选范围：0~3，0：2V   1：2.5V  2：3V  3：4V
	#define VIRS_VAL		1		  	//触摸比较器阈值电压选择，可选范围：0~3，0：1V   1：1.5V  2：2V  3：2.5V
#endif
#define TKDIV_VAL			0			//触摸充放电时钟分频系数，取值范围为：0~7，对应的时钟频率为：4M~500K，此数值越大，频率越低。
#define TKTMS_VAL			10			//放电时间定义，取值范围为：1~31，数值越大，放电时间越长。

/*
	说明：
	1.	当设置为内部运放及内部基准时（即TK_CHARGE_REF_SELECT==SOURCE_INNER），内部运放电压要大于比较器阈值电压，即VDS_VAL定义的电压要大于VIRS_VAL定义的电压。
	2. 	当设置为内部运放及内部基准时（即TK_CHARGE_REF_SELECT==SOURCE_INNER），内部运放电压要比芯片供电电压低0.5V以上，否则运放电压可能不稳定。
	3.	当设置为内部运放及内部基准时（即TK_CHARGE_REF_SELECT==SOURCE_INNER），芯片供电至少要接10uF以上电容。
*/
//-------------------------------------------------------------------------------------------------------------------
#define POWER_ON_WAIT_TK_STABLE_EN				0			//上电后等待触摸稳定后再设置触摸环境值初值

//-------------------------------------------------------------------------------------------------------------------
#define SUPPORT_ANTI_WATER_FUNCTION				0			//防水补偿模式开关

#if SUPPORT_ANTI_WATER_FUNCTION
	#define TK_PC_VAL							2
#else
	#define TK_PC_VAL							1
#endif
/*
说明：
	1. 此功能只能在触摸按键时打开，触摸滑条或圆环不支持。
	2. 打开防水补偿模式时，触摸充电电源最好选择为VDD(即 TK_CHARGE_REF_SELECT == SOURCE_VDD)。
	3. 在此模式下，触摸走线对地间的寄生电容必须大于触摸通道间的寄生电容，否则触摸充电无法达到比较器阈值电压，建议PCB多铺地，触摸走线的间距尽可能宽
	4. 打开防水模式后，只能有一个按键响应（不支持复合键）。
*/

//---------------------------------------------------------------------------------------------------
#define TK_BASE_TRIM_WHILE_KEY_PRESSED			1	//在触摸按键按下时，该触摸通道仍以内部参考通道为参考实时更新环境值，此功能可解决某些应用中，因长时间连续快速触摸按键导致该触摸通道无法更新环境值，从而导致触摸按键无效或灵敏度发生改变的问题。
//注意： 如果TK_CAP引脚所接电容为普通电容（温度特性校差），触摸工作后长期快速按触摸键一段时间后，触摸键有可能会长期触发，打开此功能可解决这种情况。
//---------------------------------------------------------------------------------------------------


//-----------------触摸键应用设置--------------------------------------------------------------------------------------------------
#if SUPPORT_KEY
#define GENERATE_TS_KEY_EN						1			//根据KeysFlagSN状态产生触摸键消息TS_Key使能，如果不需要产生TS_Key，用户可直接根据KeysFlagSN来判断按键状态。
#if GENERATE_TS_KEY_EN
	#define GENERATE_DOUBLE_KEY_EN				0			//产生复合键
	#define PRINT_TS_KEY_EN						0			//打印触摸按键值开关
#endif

/***********上电再盖上触摸面板功能操作开关定义*******************************************************************************************************/
#define SUPPORT_COVER_PANAL_AFTER_POWERON		0			//1:支持上电再盖上触摸面板    0：不支持
#if SUPPORT_COVER_PANAL_AFTER_POWERON
	#define PANAL_COVER_JUDGE_TIME				2			//单位为15.625ms
	#define JUDGE_TK_NUM						(KEY_CH_COUNT-2)		
#endif
/*
说明：
	1.上电后再盖上触摸面板，一般情况下会有多个按键触摸数值变化量超过或接近触摸门限值，为了防止此类操作产生误动作，在检测到多个按键超过或接近触发门限值时，设置按键无效并重置触摸功能。
	2.使用该功能的条件：KEY_CH_COUNT要大于2
*/
/*******************************************************************************************************************************/

//-------------------------------------------------------------------------------------------------------------------
/********触摸按键通道及触发门限值定义***********************************************************/
 	#define KEY_CH_COUNT			2			//触摸按键数量，必须正确填写

	#define KEY_SEQ       \
	{TS_CH18, 110 },      \
	{TS_CH19, 100 },      \

/*********************************************************************
说明：
1：	{TS_CHx, XX}
	   |			 |
		 |			 |	
		 |			 ------------->对应触摸通道的门限值，当触摸数据变化量大于此数值时，按键触发。
		 --------------------->触摸通道序号。
	
2：	以上触摸门限值可在触摸在线调试模式下由上位机软件(CACHIP_TOOL.exe)导出。
*********************************************************************/
	
/***********NOISE门限值设置：NOISE门限值=(KEY_SEQ设置的触发门限值*TK_NOISE_THD_RATE)/100************************/
#define TK_NOISE_THD_RATE  						25		//TK_NOISE_THD_RATE为比例值，建议取值范围：20~50 。通常情况下，使用默认值即可满足需求。
//说明：TK_NOISE_THD_RATE为比例值，例如：TK_NOISE_THD_RATE=25时，NOISE门限值TSKey_NoiseThreshold[i] = (KEY_SEQ设置的触发门限值TS_KEY_CH_INFO_SEQ[i][1]*TK_NOISE_THD_RATE)/100
/***************************************************************************************************************/	
	
#define ANTI_SPEAKER_EN							0		//抗对讲机干扰使能开关，此功能主要是利用内部触摸参考通道来判断电源是否受对讲机干扰，如果是电源受对讲机干扰而误产生按键，则产生的按键丢弃。

#if ANTI_SPEAKER_EN
	#define REF_CH_ABNORMAL_THD					8		//定义内部参考通道数值变化多少才认为是有对讲机干扰
#endif

//-------------------------------------------------------------------------------------------------------------------


#define TOUCH_SENSITIVITY_AUTO_BALANCE_EN		0		//线长修正功能使能，此功能可以使各通道按键灵敏度基本一致

//-------------------------------------------------------------------------------------------------------------------
/***********触摸按键消抖及按键输出时间定义************************************************************************************/	
#define FINGER_TOUCH_CONFIRM_TIME				2 		//触摸按键按下确认时间，单位为15.625ms
#define FINGER_TOUCH_RELEASE_CONFIRM_TIME		2 		//触摸按键释放确认时间，单位为15.625ms
#define FINGER_LONG_TOUCH_TIME_LIMIT			60    	//限制按键输出时间，单位为0.5s，若定义为0，则关闭此功能	
//-------------------------------------------------------------------------------------------------------------------

//-------------------------------------------------------------------------------------------------------------------
/***********环境值更新速度设置********************************************************/
#define AREA_PNOISE_PLUS_CONFIRM_TIME			100 	//单位为15.625ms
#define AREA_PNOISE_CONFIRM_TIME				80 		//单位为15.625ms
#define AREA_NNOISE_CONFIRM_TIME				30 		//单位为15.625ms
#define AREA_OVERLOW_CONFIRM_TIME				30 		//单位为15.625ms

//说明：一般情况下，环境值更新速度设置用户不需要设置，保持默认值即可。
//-------------------------------------------------------------------------------------------------------------------
#else
#define KEY_CH_COUNT    0
#endif




//-----------------触摸滑条或圆环应用设置-------------------------------------------------------------------------------------------------
#if SUPPORT_WHEEL_SLIDER
//-----------------------------------------------------------------------------
	//此处采用串口调试方式，请同时在ca51f_config.h打开相应的UART_EN
	#define PRINT_WHEEL_SLIDER_POSITION_EN				0			//打印触摸圆环或滑条位置开关
	#define PRINT_WHEEL_SLIDER_DATA_EN					0			//打印触摸圆环或滑条触摸数据开关
	#define PRINT_WHEEL_SLIDER_RATE_EN					0			//打印比率值
	#if (PRINT_WHEEL_SLIDER_DATA_EN || PRINT_WHEEL_SLIDER_RATE_EN)
		#define PRINT_WHEEL_SLIDER_NUM					0			//打印哪个圆环或滑条
	#endif
	#define WHEEL_SLIDER_BASELINE_UPDATE_TIME			50 			//单位为15.625ms
	
//-----------------------------------------------------------------------------
	#define WHEEL_SLIDER_COUNT							2			//圆环或滑条数量，必须正确填写
	
	#define WHEEL_SLIDER_TOUCH_CONFIRM_TIME				2 			//圆环或滑条按下确认时间，单位为15.625ms
	#define WHEEL_SLIDER_TOUCH_RELEASE_CONFIRM_TIME		2 			//圆环或滑条释放确认时间，单位为15.625ms	
	#define WHEEL_SLIDER_LONG_TOUCH_TIME_LIMIT			60    		//限制圆环和滑条触发时间，单位为0.5s，若定义为0，则关闭此功能			
//------------------------------------------------------------------------------------	
	#if (WHEEL_SLIDER_COUNT > 0)

		#define WHEEL_OR_SLIDER_DEF0					WHEEL		//是滑条还是圆环，如果是滑条，定义为SLIDER,如果是圆环，定义为WHEEL

		#define WHEEL_SLIDER0_CH_COUNT					4			//第一个圆环或滑条通道数目，必须正确填写
		#define WHEEL_SLIDER0_SEQ						TS_CH3,TS_CH2,TS_CH1,TS_CH4			//通道列表，以顺时钟或从左到右的顺序填写
		#define WHEEL_SLIDER0_CH_MIN_RATE				32,		22,		48,	    45			//手指触摸某通道中间位置时，邻近通道与该通道变化量的比率，该数值与上述通道定义一一对应。该数值可通过打开宏定义PRINT_WHEEL_SLIDER_RATE_EN通过UART打印。


		#define WHEEL_SLIDER0_TOUCH_THD					0x18			
		#define WHEEL_SLIDER0_NOISE_THD					0x05								//噪声门限值定义
	#endif

		
//以下第二、第三、第四个圆环或滑条的说明参考第一个圆环或滑条的描述，不再赘述
		
//------------------------------------------------------------------------------------		
	#if (WHEEL_SLIDER_COUNT > 1)
		#define WHEEL_OR_SLIDER_DEF1					SLIDER		//是滑条还是圆环，如果是滑条，定义为SLIDER,如果是圆环，定义为WHEEL
	
		#define WHEEL_SLIDER1_CH_COUNT					3			//第二个圆环或滑条通道数目，必须正确填写
		#define WHEEL_SLIDER1_SEQ						TS_CH0,TS_CH6,TS_CH5		//通道列表，以顺时钟或从左到右的顺序填写	
		#define WHEEL_SLIDER1_CH_MIN_RATE				90,		38,		39			//手指触摸某通道中间位置时，邻近通道与该通道变化量的比率，该数值与上述通道定义一一对应。该数值可通过打开宏定义PRINT_WHEEL_SLIDER_RATE_EN通过UART打印。
		
		
		#define WHEEL_SLIDER1_TOUCH_THD					0x10	
		#define WHEEL_SLIDER1_NOISE_THD					0x05
	#else
		#define WHEEL_SLIDER1_CH_COUNT					0
	#endif
//------------------------------------------------------------------------------------		
	#if (WHEEL_SLIDER_COUNT > 2)
		#define WHEEL_OR_SLIDER_DEF2					SLIDER		//是滑条还是圆环，如果是滑条，定义为SLIDER,如果是圆环，定义为WHEEL
	
		#define WHEEL_SLIDER2_CH_COUNT					3			//第三个转盘或滑条通道数目，必须正确填写	
		#define WHEEL_SLIDER2_SEQ						TS_CH10,TS_CH11,TS_CH12		//通道列表，以顺时钟或从左到右的顺序填写	
		#define WHEEL_SLIDER2_CH_MIN_RATE				44,		44,		44			//手指触摸某通道中间位置时，邻近通道与该通道变化量的比率，该数值与上述通道定义一一对应。该数值可通过打开宏定义PRINT_WHEEL_SLIDER_RATE_EN通过UART打印。	
		
		#define WHEEL_SLIDER2_TOUCH_THD					0x18
		#define WHEEL_SLIDER2_NOISE_THD					0x05
	#else
		#define WHEEL_SLIDER2_CH_COUNT			0
	#endif
//------------------------------------------------------------------------------------	
	#if (WHEEL_SLIDER_COUNT > 3)
		#define WHEEL_OR_SLIDER_DEF3					SLIDER		//是滑条还是圆环，如果是滑条，定义为SLIDER,如果是圆环，定义为WHEEL	
	
		#define WHEEL_SLIDER3_CH_COUNT					3								
		#define WHEEL_SLIDER3_SEQ	 					TS_CH15,TS_CH14,TS_CH13		//通道列表，以顺时钟或从左到右的顺序填写	
		#define WHEEL_SLIDER3_CH_MIN_RATE				44,		44,		44			//手指触摸某通道中间位置时，邻近通道与该通道变化量的比率，该数值与上述通道定义一一对应。该数值可通过打开宏定义PRINT_WHEEL_SLIDER_RATE_EN通过UART打印。	
		
		#define WHEEL_SLIDER3_TOUCH_THD					0x18
		#define WHEEL_SLIDER3_NOISE_THD					0x05
	#else
		#define WHEEL_SLIDER3_CH_COUNT			0
	#endif
	#if !SUPPORT_KEY
	#define NOISE_THRESHOLD WHEEL_SLIDER0_NOISE_THD
	#endif
//------------------------------------------------------------------------------------
#else
		#define WHEEL_SLIDER0_CH_COUNT	0
		#define WHEEL_SLIDER1_CH_COUNT	0
		#define WHEEL_SLIDER2_CH_COUNT	0
		#define WHEEL_SLIDER3_CH_COUNT	0
#endif

//-------------------------------------------------------------------------------------------------------------------		
#define OPENED_TS_COUNT				(KEY_CH_COUNT+WHEEL_SLIDER0_CH_COUNT+WHEEL_SLIDER1_CH_COUNT+WHEEL_SLIDER2_CH_COUNT+WHEEL_SLIDER3_CH_COUNT)
		
#if (!SUPPORT_KEY)		
	#undef DEBUG		
	#define DEBUG 0
#endif
#if DEBUG

// 	#define I2C_SELECT_P36_P37
	#define I2C_SELECT_P30_P31
// 	#define I2C_SELECT_P66_P67
// 	#define I2C_SELECT_P61_P60
	
	#ifdef I2C_SELECT_P30_P31
		#ifdef UART0_EN
		 #error	"请在ca51f_config.h中关闭宏定义UART0_EN!"
		#endif
	#elif defined I2C_SELECT_P66_P67
		#ifdef UART1_EN
		 #error	"请在ca51f_config.h中关闭宏定义UART1_EN!"
		#endif
	#elif defined I2C_SELECT_P61_P60
		#ifdef UART2_EN
		 #error	"请在ca51f_config.h中关闭宏定义UART2_EN!"
		#endif
	#endif

	#undef SUPPORT_TOUCH_SLEEP_MODE				//省电模式不支持触摸在线调试，所以要关闭省电模式
	#define SUPPORT_TOUCH_SLEEP_MODE			0
#endif

#define TOUCH_PRINT_USE_UART0
// #define TOUCH_PRINT_USE_UART1
// #define TOUCH_PRINT_USE_UART2

/*注意：所选择的UART端口需在ca51f_config.h中使能。*/

#ifdef TOUCH_PRINT_USE_UART0
	#define TK_Debug_UartPutChar			Uart0_PutChar
#elif defined TOUCH_PRINT_USE_UART1
	#define TK_Debug_UartPutChar			Uart1_PutChar
#elif defined TOUCH_PRINT_USE_UART2
	#define TK_Debug_UartPutChar			Uart2_PutChar
#endif
#endif
//-------------------------------------------------------------------------------------------------------------------
