//===========================================================================
//文件名称：task_rf_recv.c
//功能概要：放置RF接收数据帧任务
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新：可根据项目需要对函数放置位置进行调整、增加command_proc()函数功能
//===========================================================================
#include "01_app_include.h"    //应用任务公共头文件

//内部函数声明
uint_8 FrameCheck(uint_8 *rec_buf);


//----------------------以下为内部函数存放处---------------------------------------
//============================================================================
//函数名称: FrameCheck
//功能概要: 数据帧帧格式校验,对接收到的数据的帧头,帧长,硬件地址,帧尾进行校验,如果都正确则返回0,否则
//返回1
//参数说明: 将接收到的一帧数据作为参数传入:rec_buf,接收到的一帧数据
//函数返回: 返回帧格式校验的结果
//============================================================================
uint_8 FrameCheck(uint_8 *rec_buf)
{
	uint_8 ret = 0;                                 //置全部校验正确返回0
	//帧头
	if(rec_buf[0] != HEAD_PC)                   //帧头校验
	{
		ret = 1;
		goto Exit_FrameCheck;
	}
	//长度
	if(rec_buf[1] > 61)                        //帧长校验
	{
		ret = 1;
		goto Exit_FrameCheck;
	}
	//硬件地址
	if(rec_buf[2] != (uint_8)g_tinfo.hd_addr)  //硬件地址校验
	{
		ret = 1;
		goto Exit_FrameCheck;
	}
	//帧尾
	if(rec_buf[2 + rec_buf[1]] != END_PC)  //帧尾校验
	{
		ret = 1;
		goto Exit_FrameCheck;
	}

Exit_FrameCheck:
	return ret;      //返回校验结果
}

//----------------------------内部函数结束-------------------------------------

//===========================================================================
//任务名称：task_rf_recv
//功能概要：判断RF接收事件位EVENT_RF_RECV，置一后调用FrameCheck()、
//         FrameDataCheck()函数对数据帧进行校验，校验成功后调用command_proc()函数
//         对帧命令解析与处理，并对需要回发数据的帧进行组帧、置RF发送事件位，然后
//         清除RF接收事件位，继续等待RF接收事件位置一。
//参数说明：未使用
//===========================================================================
void task_rf_recv(uint32_t initial)
{	
	//1. 声明任务使用的变量
	uint_8 i;

	//2. 给有关变量赋初值

	//3. 进入任务循环体
	while(TRUE) 
	{
		//以下加入用户程序---  -----------------------------------------------------
		//1） 无限等待RF接收事件位置一
		_lwevent_wait_for(&lwevent_group, EVENT_RF_RECV, FALSE, NULL);

		//2）数据帧帧格式、节点信息校验
		if(FrameCheck(&g_rf_recvBuf[0])== 0 )
		{
			//启动对rf接收到的信息处理，将接收到的帧数据放入发送数组，具体处理过程可能会对其中数据修改
			g_rf_sentBuf[0]=HEAD_TERMINAL;
			g_rf_recvBufLength=g_rf_recvBuf[1]+3;    //共有g_rf_sentBuf[1]+3个字节，去除帧头帧尾
			for(i=1;i<g_rf_recvBufLength-1;i++)

				g_rf_sentBuf[i]=g_rf_recvBuf[i];

			g_rf_sentBuf[g_rf_recvBufLength-1]=END_TERMINAL;
			g_rf_sentBufLength=g_rf_recvBufLength;
			_lwevent_set(&lwevent_group,EVENT_PROCESS);
		}
		//3）清除RF接收事件位
		_lwevent_clear(&lwevent_group, EVENT_RF_RECV);
	}//任务循环体end_while
}
