//*****************************Copyright (c)************************************
//                            Radioway Technology Co., Ltd.
//
//                            http://www.radioway.cn
//
//深圳无线道科技有限公司所提供的所有服务内容旨在协助客户加速产品的研发进度，在服
//务过程中所提供的任何程序、文档、测试结果、方案、支持等资料和信息，都仅供参考，
//客户有权不使用或自行参考修改，本公司不提供任何的完整性、可靠性等保证，若在客户使
//用过程中因任何原因造成的特别的、偶然的或间接的损失，本公司不承担任何责任。
//                                                     ——深圳无线道科技有限公司
//------------------------------------------------------------------------------

//==========================================================================
#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;
	PAC.4=0;
	.DELAY 100
	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_0010_0111;   //0->输入， 1->输出
	paph 	= 0b_1101_1000;	  //1->开上拉
	pa      = 0b_1101_1000;
	padier  = 0b_1101_1000;	  //PA0,PA3,PA4配置为唤醒脚, 1->使能唤醒
//	pa=0;	
	
	PBC    = 0B1111_0111;       //输出-[ CLK SS MOSI], 0->输入，1->输出
  	PBPH   = 0B0000_1000;       //上拉-[MISO R3 R2]	0->禁用， 1->启用
	PB     = 0B0100_0000;      //拉高-[SS]			拉低-[CLK CE]--
	PBDIER = 0B0000_1000;	  //PB2配置为唤醒脚， 1->使能唤醒
//	PB=0;

/*
	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;
}














