#define GLOBLE_VAR
#include "includes.h"

//----------------------------------------------------------------------
//声明使用到的内部函数
uint8_t GPIO_Tsc(uint16_t port_pin);
//main.c使用的内部函数声明处
//----------------------------------------------------------------------
//主函数，一般情况下可以认为程序从此开始运行（实际上有启动过程，参见书稿）
int main(void)
{
//（1）======启动部分（开头）==========================================
//（1.1）声明main函数使用的局部变量
	uint32_t mMainLoopCount;  //主循环次数变量
	uint8_t  mFlag;           //灯的状态标志
	uint32_t mLightCount;     //灯的状态切换次数
	uint16_t value;           //TSC通道的值
//（1.2）【不变】关总中断
	DISABLE_INTERRUPTS;

//（1.3）给主函数使用的局部变量赋初值
    mMainLoopCount=0;    //主循环次数变量
	mFlag='A';           //灯的状态标志
	mLightCount=0;       //灯的闪烁次数
	value=0;             //TSC通道的值
//（1.4）给全局变量赋初值

//（1.5）用户外设模块初始化
	gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON);	//初始化蓝灯
	uart_init(UART_User, 115200);                  //初始化UART
    tsc_init(1);
//（1.6）使能模块中断
	tsc_enable_re_int();
//（1.7）【不变】开总中断
    ENABLE_INTERRUPTS;
    
    printf("--------------------------------------------\n"); 
    printf("金葫芦提示：                                 \n"); 
    printf("（1）目的：TSC测试                           \n"); 
    printf("（2）采样电容：GEC引脚30（G1_IO2）           \n");
    printf("     通道1、3、4：GEC引脚31（G1_IO1）、GEC   \n");
    printf("       引脚28（G1_IO3）、GEC引脚29（G1_IO4） \n");
    printf("（3）测试方法：用杜邦线接上GEC引脚30          \n");
    printf("       触摸另一侧针头，观察value的变化情况    \n");
    printf("---------------------------------------------\n");
    
//（1）======启动部分（结尾）==========================================
	
//（2）======主循环部分（开头）========================================
	for(;;)   //for(;;)（开头）
	{	
//启动tsc扫描
		tsc_softsearch();
//（2.1）主循环次数变量+1
		mMainLoopCount++;
//（2.2）未达到主循环次数设定值，继续循环
		if (mMainLoopCount<=3000000)  continue;
//（2.3）达到主循环次数设定值，执行下列语句，进行灯的亮暗处理
//（2.3.1）清除循环次数变量
		mMainLoopCount=0; 
//（2.3.2）如灯状态标志mFlag为'L'，灯的闪烁次数+1并显示，改变灯状态及标志
//		if(GPIO_Tsc(GPIO_TSC)==1) //如果判断到有触摸动作
//        {
//        	printf("触摸GPIO_TSC\n");
//        }
		if (mFlag=='L')                    //判断灯的状态标志
		{
			mLightCount++;  
			printf("灯的闪烁次数mLightCount=%d\n",mLightCount);
			mFlag='A';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_ON);  //灯“亮”
			printf(" LIGHT_BLUE:ON--\n");   //串口输出灯的状态
			
		}
//（2.3.3）如灯状态标志mFlag为'A'，改变灯状态及标志
		else
		{
			mFlag='L';                       //灯的状态标志
			gpio_set(LIGHT_BLUE,LIGHT_OFF); //灯“暗”
			printf(" LIGHT_BLUE:OFF--\n");  //串口输出灯的状态
			
		}
		value = tsc_get_value();			 //得到电荷转移次数
		if(value > 3)
		{						//因为空气中也会产生电容，所以value会产生很小的值
			printf("value = %d\n", value);
		}
		

	}  //for(;;)结尾
//（2）======主循环部分（结尾）========================================	

	//OS_start(app_init);  //启动RTOS并执行主线程
}

//======以下为主函数调用的子函数===========================================
//======================================================================
//功能概要：连续判断三次GPIO的输入引脚，大部分为0，则认为有触摸
//参数说明：GPIO引脚
//函数返回：1：有触摸，0：无触摸
//原理概要：当GPIO引脚被定义为无上下拉输入功能时，容易收到外界干扰，本程序
//         把这个特性转为有用的功能，由于人体相当于一个大电阻，手触摸这个
//         引脚会使得引脚状态发生随机性改变，利用这种变化可以被视为有触摸，
//         实现了无触摸功能引脚的触摸功能
//======================================================================

uint8_t GPIO_Tsc(uint16_t port_pin)
{
    //（1）声明局部变量
    int i,j,m;
    //（2）初始化Tsi引脚
    gpio_init(port_pin,GPIO_INPUT,1);   
    //（3）判断是否有触摸
    for (j=0;j<3;j++)
    {
        for(uint32_t  i = 0; i < 5000*50; i++) __asm ("NOP");
        m=0;
        for (i=0;i<3000;i++) m=m+gpio_get(port_pin);
        if (m<2500)
        	continue;
        else
        	return 0;  	
    }
    return 1;
}
//========================================================================