//************************************************************
//  Copyright (c) 深圳市赛元微电子有限公司
//	文件名称	: main.c
//	作者		: 
//	模块功能	:  触控Demo
//	局部函数列表:
//  最后更正日期: 2020/10/16
// 	版本		: V1.0   
//*************************************************************

#include "stdio.h"
#include "SensorMethod.h"
#include "SC95F8X6X_C.H"
//#include "SOC_DebugTouchKey.h"

#define LED1_TurnOver (P17 =~ P17)
#define LED2_TurnOver (P14 =~ P14)
#define LED3_TurnOver (P15 =~ P15)
#define LED4_TurnOver (P20 =~ P20)
#define LED5_TurnOver (P16 =~ P16)
#define LED6_TurnOver (P21 =~ P21)

#define SLIDELED1_ON P03 = 1;
#define SLIDELED2_ON P02 = 1;
#define SLIDELED3_ON P01 = 1;
#define SLIDELED4_ON P00 = 1;
#define SLIDELED5_ON P55 = 1;
#define SLIDELED6_ON P54 = 1;
#define SLIDELED7_ON P53 = 1;
#define SLIDELED8_ON P52 = 1;

#define SLIDELED1_OFF P03 = 0;
#define SLIDELED2_OFF P02 = 0;
#define SLIDELED3_OFF P01 = 0;
#define SLIDELED4_0FF P00 = 0;
#define SLIDELED5_OFF P55 = 0;
#define SLIDELED6_OFF P54 = 0;
#define SLIDELED7_OFF P53 = 0;
#define SLIDELED8_OFF P52 = 0;

#define KEYTIME 150      //长按时间设置 例如当前使用的是9个按键，长按时间关系：9*150 + 5*9（9是按键个数）
						 //长按时间控制在默认的最长按键输出时间内（长按时间小于等于4秒，最长按键时间可修改）

unsigned long int TK_exKeyValueFlag = 0; //当前轮按键标志
unsigned char exKeyValue = 0;
unsigned char gTkIsValid = 0;
unsigned char KeyValue = 0;
unsigned int touchKeyFlag = 0;

 /**************************************************
*函数名称：void  UartInit(void) 
*函数功能：uart初始化
*入口参数：void
*出口参数：void  
**************************************************/
void UartInit(unsigned char Fsys, unsigned long baud)
{
	OTCON |= 0XC0;
	
	US1CON0 |= 0X40;
	US1CON1 = (Fsys*1000000/baud) %256;
	US1CON2 = (Fsys*1000000/baud) /256;
	//函数实现，用于打印输出滑轮滑条值
}

 /**************************************************
*函数名称：void  putchar(void) 
*函数功能：发送一个字符
*入口参数：void
*出口参数：void  
**************************************************/
char putchar(char c)
{
	US1CON3 = c;
	while(!(US1CON0&0x02));
	US1CON0 = US1CON0; 
	//函数实现，实现printf函数，用于打印输出滑轮滑条值
	return c;
}

 /**************************************************
*函数名称：void  Sys_Init(void) 
*函数功能：系统初始化
*入口参数：void
*出口参数：void  
**************************************************/
void  Sys_Init(void)
{
	//LED灯初始化
	P0CON |= 0X0F;
	P0PH &= ~0X0F;
	
	P1CON |= 0XF0;
	P1PH &= ~0XF0;
	
	P2CON |= 0X03;
	P2PH &= ~0X03;
	
	P5CON |= 0X3C;
	P5PH &= ~0X3C;
}


void TouchKeyLed_TurnOver(void)   //按键LED IO口翻转
{
	LED1_TurnOver;
	LED2_TurnOver;
	LED3_TurnOver;
	LED4_TurnOver;
	LED5_TurnOver;
	LED6_TurnOver;
}

void ChangeTouchKeyvalue(void)
{
	switch(TK_exKeyValueFlag)
    {        
        case 0x00000004:
		{
			touchKeyFlag++;
			if(touchKeyFlag >= KEYTIME)   //判断是否达到长按条件
			{
				touchKeyFlag = 0;
				exKeyValue = 8;    //长按
			}
		}
		break;    
        case 0x00000008:exKeyValue = 3;break; 
        case 0x00000010:exKeyValue = 4;break;
		case 0x00000020:exKeyValue = 5;break;    
        case 0x00000040:exKeyValue = 6;break; 
        case 0x00000080:exKeyValue = 7;break;
		
        default:
		{
			if((touchKeyFlag<KEYTIME) && (touchKeyFlag!=0))
			{
				
				exKeyValue = 2;   //短按
			}
			else
			{
				exKeyValue = 0xff;
			}
			touchKeyFlag = 0;
		}
		break;             
    }
}

void UpdateDisplay(void)
{
	if(exKeyValue != 0xff)
    {
		if(gTkIsValid == 0)    //松手前只出一次键
		{			
			gTkIsValid = 1;
			KeyValue=exKeyValue;					
			if(KeyValue != 0)
			{
				switch(KeyValue)
				{
					case 2:LED1_TurnOver;break;    
					case 3:LED2_TurnOver;break; 
					case 4:LED3_TurnOver;break;
					case 5:LED4_TurnOver;break;    
					case 6:LED5_TurnOver;break; 
					case 7:LED6_TurnOver;break;
					case 8:TouchKeyLed_TurnOver();break;
					
					default:exKeyValue = 0xff;break;             
				}
			}
		}                             
    }
    else
    {
        gTkIsValid = 0;        
    }
}


void SlideLED_ALLOFF(void)
{
	SLIDELED1_OFF;
	SLIDELED2_OFF;
	SLIDELED3_OFF;
	SLIDELED4_0FF;
	SLIDELED5_OFF;
	SLIDELED6_OFF;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}
void level1()
{
	SLIDELED1_ON;
	SLIDELED2_OFF;
	SLIDELED3_OFF;
	SLIDELED4_0FF;
	SLIDELED5_OFF;
	SLIDELED6_OFF;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}

void level2()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_OFF;
	SLIDELED4_0FF;
	SLIDELED5_OFF;
	SLIDELED6_OFF;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}

void level3()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_ON;
	SLIDELED4_0FF;
	SLIDELED5_OFF;
	SLIDELED6_OFF;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}

void level4()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_ON;
	SLIDELED4_ON;
	SLIDELED5_OFF;
	SLIDELED6_OFF;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}

void level5()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_ON;
	SLIDELED4_ON;
	SLIDELED5_ON;
	SLIDELED6_OFF;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}

void level6()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_ON;
	SLIDELED4_ON;
	SLIDELED5_ON;
	SLIDELED6_ON;
	SLIDELED7_OFF;
	SLIDELED8_OFF;
}

void level7()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_ON;
	SLIDELED4_ON;
	SLIDELED5_ON;
	SLIDELED6_ON;
	SLIDELED7_ON;
	SLIDELED8_OFF;
}

void level8()
{
	SLIDELED1_ON;
	SLIDELED2_ON;
	SLIDELED3_ON;
	SLIDELED4_ON;
	SLIDELED5_ON;
	SLIDELED6_ON;
	SLIDELED7_ON;
	SLIDELED8_ON;
}

/**************************************************
*函数名称：void DataProcessing(unsigned long int value)
*函数功能：对触控按键、滑轮、滑条扫描值处理
*入口参数：value
*出口参数：void  
**************************************************/
void DataProcessing()
{
	if(TKSlideModulePCBArray[0].OutValue != 0)		//判断是否被按下
	{
		//输出S1滑条滑动位置值
//		printf("Bar：%d\n",TKSlideModulePCBArray[0].OutValue);
		/*不同挡位对应不同的LED灯 亮起*/
		if((TKSlideModulePCBArray[0].OutValue>0) && (TKSlideModulePCBArray[0].OutValue<=4))
		{
			level1();
		}
		if((TKSlideModulePCBArray[0].OutValue>4) && (TKSlideModulePCBArray[0].OutValue<=8))
		{
			level2();
		}
		if((TKSlideModulePCBArray[0].OutValue>8) && (TKSlideModulePCBArray[0].OutValue<=12))
		{
			level3();
		}
		if((TKSlideModulePCBArray[0].OutValue>12) && (TKSlideModulePCBArray[0].OutValue<=16))
		{
			level4();
		}
		if((TKSlideModulePCBArray[0].OutValue>16) && (TKSlideModulePCBArray[0].OutValue<=20))
		{
			level5();
		}
		if((TKSlideModulePCBArray[0].OutValue>20) && (TKSlideModulePCBArray[0].OutValue<=24))
		{
			level6();
		}
		if((TKSlideModulePCBArray[0].OutValue>24) && (TKSlideModulePCBArray[0].OutValue<=28))
		{
			level7();
		}
		if((TKSlideModulePCBArray[0].OutValue>28) && (TKSlideModulePCBArray[0].OutValue<=32))
		{
			level8();
		}
	}
}


/**************************************************
*函数名称：void  Sys_Scan(void) 
*函数功能：扫描TK和显示
*入口参数：void
*出口参数：void  
**************************************************/
void Sys_Scan(void)
{      		
	if(SOCAPI_TouchKeyStatus&0x80)	    //重要步骤2:  触摸键扫描一轮标志，是否调用TouchKeyScan()一定要根据此标志位置起后
	 {		 
		SOCAPI_TouchKeyStatus &= 0x7f;	//清除标志位
				

		TK_exKeyValueFlag = TouchKeyScan();		//扫描处理，获取触控按键等状态数据
		DataProcessing();						//扫描TK更新数据并处理
		ChangeTouchKeyvalue();					//按键键值转换
		UpdateDisplay();						//拿到键值 亮起对应LED
		 
		TouchKeyRestart();				//启动下一轮转换																												 			
	}		  	   
}


/**************************************************
*函数名称：void main(void) 
*函数功能：
*入口参数：void
*出口参数：void
*功能说明：
**************************************************/
void main(void)
{   	
	Sys_Init();	//系统初始化	
	
	TouchKeyInit();	  //触控按键初始化

	while(1)
	{
		Sys_Scan();	//扫描
	}
}
