#include "config.h"
#include "STC8G_H_GPIO.h"
#include "STC8G_H_Delay.h"
#include "STC8G_H_Switch.h"
#include "STC8H_PWM.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_UART.h"

#define LED1		P12
#define LED2		P14
#define LED3		P16
#define LED4        P54

#define FREQ		1000

#define PERIOD 	((MAIN_Fosc / FREQ) - 1)	// 周期

PWMx_Duty dutyA;
PWMx_Duty dutyB;

/**
 * @brief 	GPIO初始化
 * 
 * @param 	无
 * 
 * @return  无
 * 
 */
void GPIO_config(void) {
    GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义
    // P1.2 P1.4 P1.6 输出
    GPIO_InitStructure.Pin  = GPIO_Pin_2 | GPIO_Pin_4 | GPIO_Pin_6;		//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);//初始化
	// P5.4 输出
    GPIO_InitStructure.Pin  = GPIO_Pin_4;		//指定要初始化的IO,
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);//初始化

	//P3.6 P3.7 初始化
	GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;		//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);	//初始化

}

/**
 * @brief 	UART初始化
 * 
 */
void UART_config(void)
{
    COMx_InitDefine		COMx_InitStructure;					//结构定义

    COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
    COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
    COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200
    COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLE
    COMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLE
    UART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4
    NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    
    UART1_SW(UART1_SW_P36_P37);		//UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}

/**
 * @brief 	PWM初始化
 * 
 * @param   无
 * 
 * @return 	无
 */
void	PWM_config(void)
{
    PWMx_InitDefine		PWMx_InitStructure;
		
	// 配置PWM2
    PWMx_InitStructure.PWM_Mode    =  CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
    PWMx_InitStructure.PWM_Duty    =  0;								//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect  = ENO2P | ENO2N;	//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM2, &PWMx_InitStructure);

	// 配置PWM3
	PWMx_InitStructure.PWM_Mode    =  CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
    PWMx_InitStructure.PWM_Duty    =  0;								//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect  = ENO3P | ENO3N;	//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM3, &PWMx_InitStructure);

	// 配置PWM4
	PWMx_InitStructure.PWM_Mode    =  CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
	PWMx_InitStructure.PWM_Duty    =  0;								//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect  = ENO4P | ENO4N;	//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM4, &PWMx_InitStructure);

	// 配置PWM6_2
	PWMx_InitStructure.PWM_Mode    =  CCMRn_PWM_MODE1;	//模式,		CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
	PWMx_InitStructure.PWM_Duty    =  0;								//PWM占空比时间, 0~Period
    PWMx_InitStructure.PWM_EnoSelect  = ENO6P | ENO7P;	//输出通道选择,	ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
    PWM_Configuration(PWM6, &PWMx_InitStructure);

	// 配置PWMA
    PWMx_InitStructure.PWM_Period   = PERIOD;					//周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMA, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

	// 配置PWMB
	PWMx_InitStructure.PWM_Period   = PERIOD;					//周期时间,   0~65535
    PWMx_InitStructure.PWM_DeadTime = 0;					//死区发生器设置, 0~255
    PWMx_InitStructure.PWM_MainOutEnable= ENABLE;			//主输出使能, ENABLE,DISABLE
    PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;			//使能计数器, ENABLE,DISABLE
    PWM_Configuration(PWMB, &PWMx_InitStructure);			//初始化PWM通用寄存器,  PWMA,PWMB

	// 切换PWM4选择PWM4_SW_P26_P27
    PWM2_SW(PWM2_SW_P12_P13);			//PWM4_SW_P16_P17,PWM4_SW_P26_P27,PWM4_SW_P66_P67,PWM4_SW_P34_P33
	PWM3_SW(PWM3_SW_P14_P15);
	PWM4_SW(PWM4_SW_P16_P17);
	PWM6_SW(PWM6_SW_P54);
	// 初始化PWMA的中断
    NVIC_PWM_Init(PWMA,DISABLE,Priority_0);
	// 初始化PWMB的中断
    NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}


/**
 * @brief 	LDE1PWM100%
 * 
 * 
 */
void LED1_BrightNess100()
{
	dutyA.PWM2_Duty = PERIOD * 100 / 100;
	UpdatePwm(PWM2, &dutyA);
}


/**
 * @brief 	LDE1PWM25%
 * 
 * 
 */
void LED1_BrightNess25()
{
	dutyA.PWM2_Duty = PERIOD * 25 / 100;
	UpdatePwm(PWM2, &dutyA);
}


/**
 * @brief 	LDE1PWM闪烁两次
 * 
 */
void LED1_BlinkTwice()
{
	LED1_BrightNess25();
	os_wait2(K_IVL, 20);
	os_wait2(K_IVL, 20);
	// os_wait2(K_IVL, 200);
	// os_wait2(K_IVL, 200);
	LED1_BrightNess100();
	os_wait2(K_IVL, 20);
	os_wait2(K_IVL, 20);
	// os_wait2(K_IVL, 200);
	// os_wait2(K_IVL, 200);
}


/**
 * @brief LED2PWM100%
 * 
 */
void LED2_BrightNess100()
{
	dutyA.PWM3_Duty = PERIOD * 100 / 100;
	UpdatePwm(PWM3, &dutyA);
}


/**
 * @brief LED2PWM25%
 * 
 */
void LED2_BrightNess25()
{
	dutyA.PWM3_Duty = PERIOD * 25 / 100;
	UpdatePwm(PWM3, &dutyA);
}


/**
 * @brief LED2PWM闪烁两次
 * 
 */
void LED2_BlinkTwice()
{
	LED2_BrightNess25();
	os_wait2(K_IVL, 20);
	os_wait2(K_IVL, 20);
	// os_wait2(K_IVL, 200);
	// os_wait2(K_IVL, 200);
	LED2_BrightNess100();
	os_wait2(K_IVL, 20);
	os_wait2(K_IVL, 20);
	// os_wait2(K_IVL, 200);
	// os_wait2(K_IVL, 200);
}


/**
 * @brief LED3PWM100%
 * 
 */
void LED3_BrightNess100()
{
	dutyA.PWM4_Duty = PERIOD * 100 / 100;
	UpdatePwm(PWM4, &dutyA);
}


/**
 * @brief LED3PWM25%
 * 
 */
void LED3_BrightNess25()
{
	dutyA.PWM4_Duty = PERIOD * 25 / 100;
	UpdatePwm(PWM4, &dutyA);
}


/**
 * @brief LED3PWM呼吸灯
 * 
 */
void LED3_Breath()
{
	u8 i = 0;
	for(i = 0; i < 100; i++)
	{
		dutyA.PWM4_Duty = PERIOD * i / 100;
		UpdatePwm(PWM4, &dutyA);
		os_wait2(K_TMO, 10);
		}
	for(i = 100; i > 0; i--)
	{
		dutyA.PWM4_Duty = PERIOD * i / 100;
		UpdatePwm(PWM4, &dutyA);
		os_wait2(K_TMO, 10);
	}
}


/**
 * @brief LED4PWM100%
 * 
 */
void LED4_BrightNess100()
{
	dutyB.PWM6_Duty = PERIOD * 100 / 100;
	UpdatePwm(PWM6, &dutyB);
}


/**
 * @brief LED4PWM25%
 * 
 */
void LED4_BrightNess25()
{
	dutyB.PWM6_Duty = PERIOD * 25 / 100;
	UpdatePwm(PWM6, &dutyB);
}


/**
 * @brief LED4PWM呼吸灯
 * 
 */
void LED4_Breath()
{
	u8 i = 0;
	for(i = 0; i < 100; i++)
	{
		dutyB.PWM6_Duty = PERIOD * i / 100;
		UpdatePwm(PWM6, &dutyB);
		os_wait2(K_TMO, 10);
		}
	for(i = 100; i > 0; i--)
	{
		dutyB.PWM6_Duty = PERIOD * i / 100;
		UpdatePwm(PWM6, &dutyB);
		os_wait2(K_TMO, 10);
	}
}



/**
 * @brief    串口1接收中断服务函数
 * 
 */
void on_uart1_recv() {
    u8 i, dat;
    // RX_Cnt收到的数据个数（字节u8 - unsigned char）
    // 将收到的数据, 按字节逐个循环
    for(i=0; i<COM1.RX_Cnt; i++) {
        dat = RX1_Buffer[i]; //  1 1 1 1  0 0 0 0 -> 0xF0
        //TX1_write2buff(dat);	//收到的数据原样返回
    }

	if (dat == 0x10)
	{
		LED1_BrightNess25();
	} 
	if (dat == 0x11)
	{
		LED1_BrightNess100();
	}
}


/**
 * @brief 	主函数
 * 
 * @param 	无
 * 
 * @return  无
 * 
 * @note 	无
 * 
 */
void main_app() _task_ 0 {
	
    EAXSFR();		/* 扩展寄存器访问使能， 必写！ */
    GPIO_config();
	//UART_config();
    PWM_config();

	// 开启中断（全局）必须要写！
    EA = 1;

	// 总开关
    LED1 = 0; 
    LED2 = 0;
	LED3 = 0;
	LED4 = 0;
	// 创建任务
	// os_create_task(1);
	os_create_task(2);
	os_create_task(3);
	os_create_task(4);
	// os_create_task(5);
	// 结束任务 0
	os_delete_task(0);
	
}


/**
 * @brief 	任务1 LED1状态
 * 
 */
void task_0() _task_ 1 {
	while (1)
	{
		LED1_BlinkTwice();
		os_wait2(K_TMO, 20);
	}
}


/**
 * @brief   任务2 LED2状态
 * 
 */
void task_1() _task_ 2 {
	while (1)
	{
		LED2_BlinkTwice();
		os_wait2(K_TMO, 20);
	}
}


/**
 * @brief   任务3 LED3状态
 * 
 */
void task_2() _task_ 3 {
	while (1)
	{
		LED3_Breath();
		os_wait2(K_TMO, 200);
	}
}

/**
 * @brief    任务4 LED4状态
 * 
 */
void task_3() _task_ 4 {
	while (1)
	{
		LED4_Breath();
		os_wait2(K_TMO, 200);
	}
}


/**
 * @brief    任务5 接收数据
 * 
 */
void task_4() _task_ 5 {
	while (1)
	{
        // 超时计数
        // 一旦收到了一个字节数据，RX_TimeOut会初始化一个值（例如：5）
        if((COM1.RX_TimeOut > 0) && (--COM1.RX_TimeOut == 0))
        {            
            if(COM1.RX_Cnt > 0)
            {
                // 收到数据了，on_uart1_recv();
                on_uart1_recv();
            }
            // 处理完数据，将数据个数清零
            COM1.RX_Cnt = 0;
        }
    	// 注意这里os_wait2代码的位置，属于while
        os_wait2(K_TMO, 100);	
	}
}



