//PMC153
//=========================================================================
//         PB5 |1    14| PB2
//         PB6 |2    13| PB1
//         PB7 |3    12| PB0/INT1
//         VDD |4    11| GND
//         PA7 |5    10| PA0
//         PA6 |6     9| PA4
//   PA5/PRST# |7     8| PA3
//==========================================================================
#include	"extern.h"
#include    "WirlessApp.h"

//=================================局部变量===================================
.ramadr 0							//地址定义为0
word 	gw_Point;
.ramadr system						//以后变量地址由系统自行决定
word    gw_T16Cnt;	

extern byte PackId;
extern byte DelayCnt;

//byte	ColorCnt;
byte 	gb_Flag;
//bit     b_sleep		:	gb_Flag.7	//睡眠模式
//bit		KeyBit		:	gb_Flag.5	//按键长按标志
bit     RX_DR_F		:	gb_Flag.4
bit     Time4ms_F	:   gb_Flag.3
bit     Key_Press_F :   gb_Flag.2
bit     TX_MODE_F   :   gb_Flag.1
bit     TX_RD_F		:   gb_Flag.0

byte MARK0;
bit     Keep_Flash_Enable_F : MARK0.0	//保持一直闪烁, 1->保持闪烁
bit 	Flash_Enable_F		: MARK0.1	//闪烁几次
bit     Enable_Send_Data_F	: MARK0.2	//允许发送数据
bit     Key_Short_Press_F	: MARK0.3	//按键短按

byte Flash_Time_Cnt_R;	//闪烁计时
byte Flash_Time_R; 		//闪烁时间
byte Flash_Num_R;		//闪烁次数
//byte Flash_Cnt_R;		//闪烁计数

//word	T16_TICK;
 byte RegAddr;
 byte RegData;
 byte SPIDDR;
 byte rf_Mode;
 byte rf_rwBuf[WIRLESS_CMD_PACKLEN];
 byte pl_long;

 //byte DriverID[4];

//byte KEY_NOW_STATUS_R;
BYTE KEY_LAST_STATUS_R;
BYTE KEY_STATUS_R;
BYTE KEY_PRESS_DEBOUNC_R;
//BYTE KEY_LOOSEN_DEBOUNC_R;
BYTE TEST_MODE_R;
byte No_Operation_Timing_R;		//没有按键操作计时
byte Into_Sleep_Time_R;			//进入睡觉时间
byte Freq_Change_R;				//频率变化
//byte Freq_Chnage_Num_R;			//变化次数
byte Hold_Freq_Num_R;			//保持一个频率次数
//byte Send_Num_R;				//发送次数

#define PairingPayload 0x55
#define ControlPayload 0xAA


//=================================局部函数====================================注意！！！！！！D

void  SystemStop(void);
void	SysInit(void);
EXTERN void	RW1600_RecivePack(void);
void Key_Scan(void);
void KEY_FUNC(void);
void Match_Code(void);
void TEST_MODE(void);
void Test_Func(void);
void Send_Data(void);
void Freq_Change(void);
//==============================函数主体========================================



/*******************************************************************************
* 名称: FPPA0
* 功能: 主函数开始
* 形参:       
* 返回: 无
* 说明: 
*******************************************************************************/
void FPPA0(void)
{

	.ADJUST_IC	SYSCLK=IHRC/8,IHRC=16MHZ,Vdd=3.3V;
	//清除RAM
	gw_Point = _SYS(RAM_SIZE)-1;
	a = 0;
	do 
	{
		*gw_Point = a;
	}while(--gw_Point$0);	

	SysInit();
    Wirless_Init();
	LED_PIN = 0;
	while(1)	// Loop for Main Process
	{
		if(Time4ms_F)
		{
			Time4ms_F = 0;
			Key_Scan();
			KEY_FUNC();
			Send_Data();
		}
    }

}

/***************************************************
*@ 函数功能: 按键扫描
*
*****************************************************/
void Key_Scan(void)
{
	BYTE BUF0;
	BUF0 = 0;

	if(!KEY_R)
		BUF0 = 0x01;
	if(!KEY_L)
		BUF0 |= 0x02;
	if(!KEY_B)
		BUF0 |= 0x04;
	if(!KEY_F)
		BUF0 |= 0x08;
	
	if(BUF0 == KEY_LAST_STATUS_R)
	{
		KEY_PRESS_DEBOUNC_R++;
		if(5 < KEY_PRESS_DEBOUNC_R)
		{
			KEY_PRESS_DEBOUNC_R = 0;
			KEY_STATUS_R = BUF0;
		}
	}
	else 
	{
		KEY_LAST_STATUS_R = BUF0;
		KEY_PRESS_DEBOUNC_R = 0;
	}
}

/**********************************************************
*@ 函数功能: 按键功能实现
*@
***********************************************************/
void KEY_FUNC(void)
{
	if(KEY_STATUS_R)				//有按键操作则发码
	{
		if(!Key_Short_Press_F)
		{
			Key_Short_Press_F = 1;
			No_Operation_Timing_R = 0;
			Into_Sleep_Time_R = 0;
			Enable_Send_Data_F = 1;
		}
	}
	else 							//没有按键操作2s，则进入睡觉
	{
		No_Operation_Timing_R++;
		if(4 < No_Operation_Timing_R)	//20ms无按键停止发码
		{
			No_Operation_Timing_R = 0;
			Key_Short_Press_F = 0;
			Enable_Send_Data_F = 0;
			Into_Sleep_Time_R++;
			if(99 < Into_Sleep_Time_R)	//2s无按键进入睡觉
			{
				Into_Sleep_Time_R = 0;
				LED_OFF;
				SystemStop();
				LED_ON;
			}
		}
	}
}

/**********************************************************
*@ 函数功能: 发送数据
***********************************************************/
void Send_Data(void)
{
	
	if(Enable_Send_Data_F)
	{
		pl_long = WIRLESS_CMD_PACKLEN;
		rf_rwBuf[0] = KEY_STATUS_R;
		rf_rwBuf[1] = ~KEY_STATUS_R;
		
		RW1600_start_TXsend_data();   //没有接收端，发射15次需要1ms
	}
}
/*******************************************************************************
* 名称: SystemStop
* 功能: 睡眠
* 形参:       
* 返回: 无
* 说明: 
*******************************************************************************/

void SystemStop(void)
{
	Wirless_Sleep();
	.disgint;
	$  T16M   STOP;			// 关闭T16
	.CLKMD.2 =   1;			// 启动低时钟
    .CLKMD   =   0B1101_0100;// IHRC/8 -> ILRC/4;
	.CLKMD.4 =   0;          // 关闭 IHRC，以达省电效果
	engint;
    stopsys;				// 进入低耗电状态
	nop;nop;nop;nop;
	nop;nop;nop;nop;
    CLKMD.4 =   1;			// 启动高速时钟
	nop;nop;nop;nop;
    .CLKMD   =   0B0011_1100;// ILRC/4 -> IHRC/8;
	.CLKMD.2 =   0;          
	nop;nop;nop;nop;
	Wirless_WeakUp();
	$ t16m SYSCLK,/4,bit13;  // 打开T16
}

/*******************************************************************************
* 名称: Interrupt
* 功能: 中断处理函数
* 形参:       
* 返回: 无
* 说明: 
*******************************************************************************/
void Interrupt(void)
{
	pushaf;

	if (Intrq.PA0)
	{
		Intrq.PA0	=	0;

	}
	if(intrq.t16)		//1MS
	{
		intrq.t16 = 0;
		stt16 gw_T16Cnt;
		Time4ms_F = 1;
		if(Flash_Enable_F)
		{
			Flash_Time_Cnt_R++;
			if(Flash_Time_R < Flash_Time_Cnt_R)
			{
				Flash_Time_Cnt_R = 0;
				PB ^= 0x20;
				if(!Keep_Flash_Enable_F)
					{
						Flash_Num_R--;
						if(0 == Flash_Num_R)
						{
							Flash_Enable_F = 0;
						}
					}
			}
		}
	}
	popaf;
}
/*******************************************************************************
* 名称: SysInit
* 功能: 系统初始化
* 形参:       
* 返回: 无
* 说明: 
*******************************************************************************/
void	SysInit(void)
{
	pac     = 0b_0110_0111;   //0->输入， 1->输出
	paph 	= 0b_1001_1000;	  //1->开上拉
	pa      = 0b_0000_0000;
	padier = 0b_1001_1000;	  //PA0,PA3,PA4配置为唤醒脚, 1->使能唤醒
	
	
	PBC  = 0B0011_0011;       //输出-[ CLK SS MOSI], 0->输入，1->输出
	PB    = 0B0010_1000;      //拉高-[SS]			拉低-[CLK CE]
  	PBPH = 0B0100_1100;       //上拉-[MISO R3 R2]	0->禁用， 1->启用
//	PBDIER = 0B0000_0100;	  //PB2配置为唤醒脚， 1->使能唤醒
//	pbdier = 0x04;

/*
	.if	_SYS(AT_ICE)
	DriverID[0] = 0x01;
	DriverID[1] = 0x00;
	DriverID[2] = 0x00;
	DriverID[3] = 0x00;
	.else
	call    _SYS(ADR.ROLL);     //  读取 Roll:0
	DriverID[0] =   A;
	call    _SYS(ADR.ROLL) +1;  //  读取 Roll:1
	DriverID[1]=   A;
	call    _SYS(ADR.ROLL) +2;  //  读取 Roll:2
	DriverID[2] =   A;
	call    _SYS(ADR.ROLL) +3;  //  读取 Roll:3
	DriverID[3] =   A;
	.endif
*/
	//定时4MS/2us = 2*2000 = 4000
	gw_T16Cnt = 8192 - 2000;		
	stt16 gw_T16Cnt;
	$ t16m SYSCLK,/4,bit13;

	intrq = 0;
	inten.2 = 1;
	engint;
}














