/*******************************Copyright (c)***************************************
桑海为实业发展有限公司
自 动 化 钢 琴 研 究 所
http://www.pianoshw.com
E-mail:shw@pianoshw.com
----------------------------------文件信息-------------------------------------------
文 件 名 : HPI.C
创 建 人 : 吴应斌
创 建 日 期: 2004-6-7 9:30
功 能 描 述: SL811人机接口文件
************************************************************************************/
#include <COMMON.H>
#include <TPBULK.H>
#include <HPI.H>
#include <HAL.H>
#include <FAT.H>
extern XXGFLAGS bdata bXXGFlags;
extern unsigned char xdata DBUF[BUFFER_LENGTH];
unsigned char xdata UARTBUF[UARTBUF_LENGTH];
SYS_INFO_BLOCK xdata DeviceInfo;
UART_CMD_BLOCK xdata UartCmdBlock;
UART_RSP_BLOCK xdata UartRspBlock;
FILE_INFO xdata ThisFile;
extern FREE_FAT_INFO xdata FreeFat;
void UartSendRsp(void)
{
unsigned int i;
unsigned char *pBuf=(unsigned char *)&UartRspBlock;
for(i=0;i<64;i++)
ComSendByte(*(pBuf+i));
if(UartRspBlock.len!=0)
{
for(i=0;i<UartRspBlock.len;i++)
ComSendByte(*(UartRspBlock.pbuffer+i));
}
}
/*-----------------------------------------------------------------------------------
名称: void UartHandler(void)
功能: Uart命令管理.
-----------------------------------------------------------------------------------*/
void UartHandler(void)
{
unsigned char retStatus;
unsigned int len;
unsigned long pointer;
UartRspBlock.errcode=ERC_OK;
UartRspBlock.len=0;
switch(UartCmdBlock.cmd)
{
case CMD_RESET:
break;
case CMD_DETECT_DEVICE:
ThisFile.bFileOpen=0;
retStatus=DetectDevice();
UartRspBlock.cmd=CMD_DETECT_DEVICE_RSP;
break;
case CMD_OPEN_FILE:
retStatus=OpenFile(UartCmdBlock.CmdBlock.Cmd_OpenFile.filename);
UartRspBlock.cmd=CMD_OPEN_FILE_RSP;
break;
case CMD_CREATE_FILE:
retStatus=OpenFile(UartCmdBlock.CmdBlock.Cmd_OpenFile.filename);
if(UartRspBlock.errcode==ERC_FILENOTFOUND)
{
retStatus=CreateFile(UartCmdBlock.CmdBlock.Cmd_CreateFile.item);
}
UartRspBlock.cmd=CMD_CREATE_FILE_RSP;
break;
case CMD_READ_FILE:
len=SwapINT16(UartCmdBlock.CmdBlock.Cmd_ReadFile.readLength);
retStatus=ReadFile(len,UARTBUF);
UartRspBlock.cmd=CMD_READ_FILE_RSP;
break;
case CMD_WRITE_FILE:
len=SwapINT16(UartCmdBlock.CmdBlock.Cmd_WriteFile.writeLength);
retStatus=WriteFile(len,UARTBUF);
UartRspBlock.cmd=CMD_WRITE_FILE_RSP;
break;
case CMD_LIST:
ThisFile.bFileOpen=0;
retStatus=List();
UartRspBlock.cmd=CMD_LIST_RSP;
break;
case CMD_REMOVE_FILE:
ThisFile.bFileOpen=0;
retStatus=RemoveFile(UartCmdBlock.CmdBlock.Cmd_RemoveFile.filename);
UartRspBlock.cmd=CMD_REMOVE_FILE_RSP;
break;
case CMD_GET_CAPACITY:
ThisFile.bFileOpen=0;
retStatus=GetCapacity();
UartRspBlock.cmd=CMD_GET_CAPACITY_RSP;
break;
case CMD_GET_FREE_CAPACITY:
ThisFile.bFileOpen=0;
retStatus=GetFreeCapacity();
UartRspBlock.cmd=CMD_GET_FREE_CAPACITY_RSP;
break;
case CMD_SET_FILE_POINTER:
pointer=SwapINT32(UartCmdBlock.CmdBlock.Cmd_SetFilePointer.pointer);
retStatus=SetFilePointer(pointer);
UartRspBlock.cmd=CMD_SET_FILE_POINTER_RSP;
break;
case CMD_GET_VERSION:
ThisFile.bFileOpen=0;
retStatus=GetFirmwareVersion();
UartRspBlock.cmd=CMD_GET_VERSION_RSP;
break;
default:
bXXGFlags.bits.bCOM_ERR=1;
break;
}
UartRspBlock.result=retStatus;
UartRspBlock.pbuffer=UARTBUF;
UartSendRsp();
}
/*-----------------------------------------------------------------------------------
名称: unsigned char DetectDevice(void)
功能: 磁盘有无检测.
-----------------------------------------------------------------------------------*/
unsigned char DetectDevice(void)
{
#define RspBlockDetectDevice UartRspBlock.RspBlock.Rsp_DetectDevice
return bXXGFlags.bits.SLAVE_IS_ATTACHED;
#undef RspBlockDetectDevice
}
/*-----------------------------------------------------------------------------------
名称: unsigned char List(void)
功能: 列出目录中所有文件.
-----------------------------------------------------------------------------------*/
unsigned char List(void)
{
#define RspBlockList UartRspBlock.RspBlock.Rsp_List
unsigned int item,i;
unsigned char j,k,bstop,sector;
if(!bXXGFlags.bits.SLAVE_IS_ATTACHED)
{
UartRspBlock.errcode=ERC_NODEVICE;
return FALSE;
}
item=0;
bstop=0;
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
{
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,DBUF))
{
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
{
bstop=1;
break;
}
else if(DBUF[i]==0xE5)
continue;
else if((DBUF[i]&0x40==0x40)&&(DBUF[i+11]==0xff))
{
j=DBUF[i]&0x0F;
j=j+1;
for(k=0;k<j*32;k++)
UARTBUF[item*32+k]=DBUF[i+k];
i=i+(j-1)*32;
item=item+j;
}
else
{
for(k=0;k<32;k++)
UARTBUF[item*32+k]=DBUF[i+k];
item=item+1;
}
}
if(bstop==1) break;
}
RspBlockList.len=SwapINT16(item*32);
UartRspBlock.len=item*32;
return TRUE;
#undef RspBlockList
}
/*-----------------------------------------------------------------------------------
名称: unsigned char OpenFile(unsigned char *pBuffer)
功能: 打开文件.
-----------------------------------------------------------------------------------*/
unsigned char OpenFile(unsigned char *pBuffer)
{
#define RspBlockOpenFile UartRspBlock.RspBlock.Rsp_OpenFile
unsigned int i;
unsigned char j,bstop,sector;
PDIR_INFO pDirInfo;
if(!bXXGFlags.bits.SLAVE_IS_ATTACHED)
{
UartRspBlock.errcode=ERC_NODEVICE;
return FALSE;
}
ThisFile.bFileOpen=0;
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
{
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,DBUF))
{
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
{
UartRspBlock.errcode=ERC_FILENOTFOUND;
return FALSE;
}
j=0;
while(DBUF[i+j]==*(pBuffer+j))
{
j=j+1;
if(j>10) break;
}
if(j>10)
{
for(j=0;j<32;j++)
RspBlockOpenFile.item[j]=DBUF[i+j];
ThisFile.bFileOpen=1;
bstop=1;
break;
}
}
if(bstop==1) break;
}
if(sector>=DeviceInfo.BPB_RootEntCnt)
{
UartRspBlock.errcode=ERC_FILENOTFOUND;
return FALSE;
}
pDirInfo=(PDIR_INFO)RspBlockOpenFile.item;
ThisFile.StartCluster=SwapINT16(pDirInfo->startCluster);
ThisFile.LengthInByte=SwapINT32(pDirInfo->length);
ThisFile.ClusterPointer=ThisFile.StartCluster;
ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
ThisFile.OffsetofSector=0;
ThisFile.SectorofCluster=0;
ThisFile.FatSectorPointer=0;
ThisFile.pointer=0;
FreeFat.SectorNum=DeviceInfo.FatStartSector;
FreeFat.OldSectorNum=DeviceInfo.FatStartSector;
FreeFat.OffsetofSector=2;
return TRUE;
#undef RspBlockOpenFile
}
/*-----------------------------------------------------------------------------------
名称: unsigned char ReadFile(unsigned int readLength,unsigned char *pBuffer)
功能: 读取文件.
-----------------------------------------------------------------------------------*/
unsigned char ReadFile(unsigned int readLength,unsigned char *pBuffer)
{
#define RspBlockRea