📄 hpi.c
字号:
#include "FM3164.H"
#include "common.h"
#include "TPBULK.H"
#include "HPI.H"
#include "HAL.H"
#include "Fat.h"
//#include "INTRINS.H"
//bit SAVE_FLASH;
extern bit SLAVE_IS_ATTACHED;
extern bit SLAVE_FOUND; // Slave USB device found
extern bit TIMEOUT_ERR; // timeout error during data endpoint transfer
extern bit DATA_STOP; // device unplugged during data transfer
extern bit bData1;
extern bit NOW_READ; //确定当前的写操作是否要加延时,在执行了tpbulkread后=1,执行tpbulkwrite后=0
extern uchar xdata DBUF[2060]; //锁定缓冲区的大小为2048字节
extern uchar xdata CurFatSector[512]; //锁定每扇区的大小为512字节
extern uchar xdata flash_buf[128];
extern uchar xdata now_recorder[4]; //now what the ic card pluged into,it series num will be record
extern UART_RECE_BLOCK xdata UartCmdBlock;
extern UART_SEND_BLOCK xdata UartRspBlock;
extern uchar xdata now_recorder[4]; //now what the ic card pluged into,it series num will be record
xdata uchar modify_time[6]; //文件修改时间
uchar xdata CurDirInfo[512] _at_ 0x0c00; //定义了当前文件项扇区信息
uchar xdata file_name[11];
SYS_INFO_BLOCK xdata DeviceInfo _at_ 0x180;
FILE_INFO xdata ThisFile _at_ 0x1D0;
extern data union
{
uint flash_page;
uchar flash_arr[2];
struct
{
uchar page_MSB;
uchar page_LSB;
}flash_byte;
}flash_address;
extern data union
{
uint add_word;
uchar add_byte[2];
}add_start; //I2C start address that need operate
extern bit compare_arr(uchar *source,uchar *target,uchar number);
extern void copy_ram_same(uchar *source,uchar *target,uchar number_of);
extern void time_to_fat(uchar *source_time_ptr,ulong *fat_style_ptr);
extern void read_page(void);
extern void read_realtime(uchar *old_time1);
extern void fm_write(uchar *load_add,uchar write_len);
void flash_reset_read(void);
void read_to_dbuf(uchar step,uint read_len); //将FM24C64的数据载入到USB缓冲区,参数为地址分辨码
extern void delay_1ms();
/*bit DetectDevice(void)
{
return SLAVE_IS_ATTACHED;
}
*/
//void test_read(void)
// {
// idata ulong count1;
// for(count1=0;count1<1024;count1++)
// {
// RBC_Read(count1,2,DBUF);
// }
// }
void get_file_name(void) //把记录仪编号转化为文件名(11字节ASCII)存放在file_name
{
uchar i;
for(i=0;i<4;i++)
{
file_name[2*i]=(now_recorder[i]>>4)+0x30; //转为ASCII
file_name[2*i+1]=(now_recorder[i]&0x0f)+0x30; //转为ASCII
}
for(i=0;i<8;i++)
if(file_name[i]>'9')
file_name[i]=file_name[i]+7;
file_name[8]='H';
file_name[9]='A';
file_name[10]='N'; //扩展名都定为*.HAN
}
bit OpenFile(void)
{
uint data i;
uchar idata sector;
PDIR_INFO xdata pDirInfo;
if(!SLAVE_IS_ATTACHED) //如果没有连接的设备
{
UartRspBlock.uart_rsp_block_usb.errcode=ERC_NODEVICE; //用串口返回文件未打开的信息并退出
return FALSE;
}
//设备已经连接
ThisFile.bFileOpen=0;
////////由记录仪编号得到文件名////////
get_file_name();
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt>>4;sector++) //从根目录项的扇区中找出一个区域是和参数代表的文件名重合的
{
//////////////////////////////////////////////////
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,CurDirInfo))
{
UartRspBlock.uart_rsp_block_usb.errcode=ERC_DEVICEERR; //读入时出错,直接返回
return FALSE;
}
///////////////////////////////////////////
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32) //在扇区的每个目录项中找前11个字节(短文件名和扩展名)相同的文件项
{
if(CurDirInfo[i]==0x00)
{
UartRspBlock.uart_rsp_block_usb.errcode=ERC_FILENOTFOUND; //到了目录项的结束还没找到就说明本文件并不存在
return FALSE;
}
///////////////////////////////////////////
if(compare_arr(CurDirInfo+i,file_name,11)) //如果找到了所要的文件
{
// ThisFile.bFileOpen=1; //文件名匹配,找到了
pDirInfo=(PDIR_INFO)(CurDirInfo+i);
ThisFile.StartCluster=SwapINT16(pDirInfo->startCluster);
//zyf 编 START 2005。05。18
if(ThisFile.StartCluster==0) //如果起始簇为0,是系统未分配存储空间与之,要在此处为其分配,只有在文件长度为0的时候才允许
{
check_free_capacity(0); //检查空间是否足够写文件
ThisFile.ClusterPointer=ThisFile.StartCluster=DeviceInfo.FirstFreeClu;
ThisFile.SectorPointer=0;
}
//zyf 编END
ThisFile.LengthInByte=SwapINT32(pDirInfo->length);
ThisFile.ClusterPointer=ThisFile.StartCluster;
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
ThisFile.SectorofCluster=0;
copy_ram_same(CurDirInfo+i,ThisFile.FileName,11); //载入当前文件名
ThisFile.NowFatSecNum=ThisFatSecNum(ThisFile.StartCluster); //当前簇在当前FAT表项中的绝对扇区号
ThisFile.NowFatEntOffset=ThisFatEntOffset(ThisFile.StartCluster); //当前簇在当前FAT表项中的相对指针
ThisFile.NowDirItem=i; //得到在当前文件项的序号
ThisFile.NowDirSec=sector; //得到在当前文件项的所在扇区
// 读入本文件所在FAT表的第一个扇区 ////////////////////
if(!RBC_Read(ThisFile.NowFatSecNum,1,CurFatSector)) //将当前被打开文件的FAT16扇区加载到CurFatSector
return FALSE;
ThisFile.bFileOpen=1;
return TRUE;
}
}
}
return FALSE;
}
bit CreateFile(void) //建立文件,插入文件表项32字节的数据,修正FAT的内容
{
unsigned int data sector,i;
PDIR_INFO xdata pDirInfo;
if(!SLAVE_IS_ATTACHED) //如果优盘未插入则给出回应
{
UartRspBlock.uart_rsp_block_usb.errcode=ERC_NODEVICE;
return FALSE;
}
/////// Search a free space in the root dir space and build the item ///
ThisFile.bFileOpen=0;
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt>>4;sector++) //在根目录区查找是否有用来存放新文件的文件表项的位置
{
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,CurDirInfo)) //读取失败则终止
{
UartRspBlock.uart_rsp_block_usb.errcode=ERC_DEVICEERR;
return FALSE;
}
///////////////////////////////////////////////////
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32) //在读出的每个扇区中查找
{
if((CurDirInfo[i]==0x00)||(CurDirInfo[i]==0xE5)) //文件表项的首字节为00或E5表示此项为空或者已经删除的文件表项,可以用来写新的文件表项
{
ThisFile.NowDirItem=i; //得到在当前文件项的序号
ThisFile.NowDirSec=sector; //得到在当前文件项的所在扇区
pDirInfo=(PDIR_INFO)(CurDirInfo+i); //将要建立的表项内容复制放在该搜索到的位置上
copy_ram_same(file_name,pDirInfo->name,11); //文件名和扩展名一起拷贝8+3byte
// pDirInfo->startCluster=SwapINT16(FindFirstFreeClus()); //起始扇区先设置为第1个闲簇,FAT16只有低位簇号
pDirInfo->startCluster=SwapINT16(DeviceInfo.FirstFreeClu); //起始扇区先设置为第1个闲簇,FAT16只有低位簇号
pDirInfo->startCluster_msb=0; //起始扇区先设置为第1个闲簇,FAT16只有低位簇号,高位为0
pDirInfo->length=0; //插入的文件长度暂时定为0字节
time_to_fat(modify_time,(ulong *)(&pDirInfo->lastUpdateTime)); //pDirInfo->lastUpdateTime,将时间和日期都转换为FAT的格式
pDirInfo->Dir_CrtTime=pDirInfo->lastUpdateTime; //创建时间即最后写时间
pDirInfo->Dir_CrtDate=pDirInfo->lastUpdateDate; //创建日期即最后写日期
NOW_READ=1;
if(!RBC_Write(DeviceInfo.RootStartSector+sector,1,CurDirInfo)) //回写到该扇区
{
UartRspBlock.uart_rsp_block_usb.errcode=ERC_DEVICEERR; //回写失败
return FALSE;
}
// else
// return(OpenFile());
//--------------------Naoki 060720 Update------------------------------------------------------
ThisFile.StartCluster=SwapINT16(pDirInfo->startCluster);
if(ThisFile.StartCluster==0) //如果起始簇为0,是系统未分配存储空间与之,要在此处为其分配,只有在文件长度为0的时候才允许
{
check_free_capacity(0); //检查空间是否足够写文件
ThisFile.ClusterPointer=ThisFile.StartCluster=DeviceInfo.FirstFreeClu;
ThisFile.SectorPointer=0;
}
ThisFile.LengthInByte=SwapINT32(pDirInfo->length);
ThisFile.ClusterPointer=ThisFile.StartCluster;
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
ThisFile.SectorofCluster=0;
ThisFile.NowFatSecNum=ThisFatSecNum(ThisFile.StartCluster); //当前簇在当前FAT表项中的绝对扇区号
ThisFile.NowFatEntOffset=ThisFatEntOffset(ThisFile.StartCluster); //当前簇在当前FAT表项中的相对指针
if(!RBC_Read(ThisFile.NowFatSecNum,1,CurFatSector)) //将当前被打开文件的FAT16扇区加载到CurFatSector
return FALSE;
ThisFile.bFileOpen=1;
return TRUE;
//---------------------------------------------------------------------------------------------
}
}
}
}
//此时还需要将文件的最后修改时间与编号连同文件名进行加密数据存储,以备校验文件的合法性
void save_file_modify_time(void)
{
uchar i;
flash_buf[0]=now_recorder[0]+modify_time[0];
flash_buf[1]=now_recorder[1]+modify_time[1];
flash_buf[2]=now_recorder[2]+modify_time[2];
flash_buf[3]=now_recorder[3]+modify_time[3];
flash_buf[4]=file_name[0]+modify_time[4];
flash_buf[5]=file_name[1]+modify_time[5];
flash_buf[6]=file_name[2]+modify_time[0];
flash_buf[7]=file_name[3]+modify_time[1];
flash_buf[8]=file_name[4]+modify_time[2];
flash_buf[9]=file_name[5]+modify_time[3];
flash_buf[10]=file_name[6]+modify_time[4];
flash_buf[11]=file_name[7]+modify_time[5];
for(i=8;i<12;i++)
{
flash_buf[i]^=flash_buf[i-4];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -