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

#define     FLASH_NAME   "flashx:bank0"

void task_FLASH(uint32_t initial_data)
{
    MQX_FILE_PTR    flash_file;    //用于管理FLASH设备的文件指针
    uint8_t         i;             //循环变量
    uint8_t         lenth = 0;     //存放FLASH帧长度
    uint8_t FLASH_Buff[40];        //存放FLASH数据
    
    //打开FLASH设备
	flash_file = fopen(FLASH_NAME, NULL);
	
    //使能扇区缓存
    ioctl(flash_file, FLASH_IOCTL_ENABLE_SECTOR_CACHE, NULL);    
	   
    for(;;)
    {
        //1.无限等待UART的事件位置位
    	_lwevent_wait_for(&lwevent_group, Event_FLASH, FALSE, NULL);  
        
    	//2.数据类型转换，32位转为8位
    	lenth=(uint8_t)gFLASH_Buff[1];
    	for(i=0;i<lenth;i++)   
		{
			FLASH_Buff[i]=(uint8_t)gFLASH_Buff[i];
		}
    	
    	//3.根据帧头、帧尾判断FLASH帧的正确性
    	if((FLASH_Buff[0]==FrameHead)&&(FLASH_Buff[lenth-1]==FrameTail))
    	{
    		//(1)FLASH写命令
    		if(FLASH_Buff[3]==0x01) 
    		{
    			//FLASH写操作
    			fseek(flash_file, -lenth, IO_SEEK_END);
    			write(flash_file, FLASH_Buff, lenth);
    		}
    		//(2)FLASH读命令
    		else if(FLASH_Buff[3]==0x02) 
    		{
    			//FLASH读操作
    			fseek(flash_file, -lenth, IO_SEEK_END);
    			read(flash_file, FLASH_Buff, lenth);
    			
    			//数据类型转换，8位转为32位
    			for(i=0;i<lenth;i++)  
				{
					gFLASH_Buff[i]=(uint32_t)FLASH_Buff[i];
				}
    			
    			//将待回发给PC的数据放入到轻量级消息队列中，_lwmsgq_send的第二个参数为32位数组指针	
    			DISABLE_INTERRUPTS;   			
    			_lwmsgq_send((pointer)send_queue, gFLASH_Buff, 
    					           LWMSGQ_SEND_BLOCK_ON_FULL);	
    			ENABLE_INTERRUPTS;
    		}
    	}
    	else
    	{
    		fclose(flash_file);
    		flash_file=NULL;
    	}
    	
		//4.清除FLASH事件位
		_lwevent_clear(&lwevent_group, Event_FLASH); 
 			
		//5.延时
		_time_delay(500);
    }
}
