//===========================================================================
//文件名称：task_UART.c
//功能概要：定义task_UART任务,接收PC控制命令控制串口4回发接收到的数据
//版权所有：苏州大学飞思卡尔嵌入式中心(sumcu.suda.edu.cn)
//版本更新：2014-7-12  V2.0
//===========================================================================
#include "app_inc.h"

static uint8_t Transfer(uint32_t source[],uint8_t result[]);

void task_UART(uint32_t initial_data)
{
	uint8_t i,lenth,offset;
	uint32_t UART_Buff[40];    //存放UART数据
	uint8_t  Trans_Buff[40];   //存放转义过后的数据	
	uint_8   trans=0xA5;       //fwrite的第一个参数为一变量地址,不可把转义字符0xA5直接输出
	
	while (TRUE)
	{	
		//1.从服务器端消息队列中接收消息，若消息队列空，则阻塞任务，无限等待消息到来
	    _lwmsgq_receive((pointer) send_queue, UART_Buff,
	    		                       LWMSGQ_RECEIVE_BLOCK_ON_EMPTY, 0, 0);
		//2.增加转义字符
	    offset=Transfer(UART_Buff,Trans_Buff);
	    lenth=(uint8_t)UART_Buff[1]+offset;
	    
	    //3.通过串口4回发数据，fwrite的默认通道为串口4
	    DISABLE_INTERRUPTS;	
		for(i=0;i<lenth;i++) 
		{
			fwrite(&Trans_Buff[i],sizeof(uint8),1,stdout);
		}
	    ENABLE_INTERRUPTS;
	}
}

//===========================================================================
//函数名称：Transfer
//功能概要：增加转义字符，并作数据类型转换
//函数参数：source[]--未增加转义字符的原始数组；result[]--做增加转义字符处理操作的数组
//函数返回：增加的转移字符的个数
//===========================================================================
//加转义字符的函数
static uint8_t Transfer(uint32_t source[],uint8_t result[])
{   
	uint8_t i,count=0,j=0;
	
	result[0]= (uint8_t)source[0];		
	count = (uint8_t)source[1];
	for(i=1;i<count-1;i++)
	{
		if(source[i]==FrameHead||source[i]==0xA5||source[i]==FrameTail)
		{
			result[i+j]= 0xA5;
			j++;
		}
		result[i+j]= (uint8_t)source[i];
	}
	
	result[i+j]= (uint8_t)source[i];
	return j;
}
