📄 hpi.c
字号:
#include "SL811.H"
#include "TPBULK.H"
#include "HPI.H"
#include "RBCCMD.H"
//#include "HAL.H"
//#include "Fat.h"
extern XXGFLAGS bXXGFlags;
extern BYTE DBUF[BUFFER_LENGTH];
//////////////////////////////////////////
//UART_CMD_BLOCK xdata inblock;
BYTE UARTBUF[UARTBUF_LENGTH];
BYTE BUFTEMP[32];
SYS_INFO_BLOCK DeviceInfo;
UART_CMD_BLOCK UartCmdBlock;
UART_RSP_BLOCK UartRspBlock;
FILE_INFO ThisFile;
//////////////////////////////////////////
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));
}
}
unsigned char UartHandler(void)
{
unsigned char retStatus;
unsigned int len;
unsigned long pointer;
BYTE DBU[]="hello";
//unsigned char *pBuf=(unsigned char *)&UartRspBlock;
UartCmdBlock.cmd = CMD_LIST;
//for(i=0;i<64;i++)
//*(pBuf+i)=0;
//UartRspBlock.result=1;
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 = FileList();
retStatus = FileWrite("Ilike",6,DBU);//FileList();
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;
return FALSE;
}
///////////////////////////////
UartRspBlock.result=retStatus;
UartRspBlock.pbuffer=UARTBUF;
UartSendRsp();
return TRUE;
//return retStatus;
}
unsigned char DetectDevice(void)
{
#define RspBlockDetectDevice UartRspBlock.RspBlock.Rsp_DetectDevice
return bXXGFlags.bits.SLAVE_IS_ATTACHED;
#undef RspBlockDetectDevice
}
unsigned char List(void)
{
#define RspBlockList UartRspBlock.RspBlock.Rsp_List
unsigned int item,i;
unsigned char j,k,bstop,sector;
BYTE DBUFTEMP[32];
INT32 fsstartsector;
//RspBlockList.errcode=ERC_NODEVICE;
if(!bXXGFlags.bits.SLAVE_IS_ATTACHED)
{
UartRspBlock.errcode=ERC_NODEVICE;
return FALSE;
}
///////////////////////////////////////////////////////////
item=0;
bstop=0;
//RspBlockList.result=0x1;
fsstartsector = 2;
while(1)
{
RBC_Read(DeviceInfo.RootStartSector + fsstartsector - 2,1,DBUF);//读取第二簇内容
for(i=0;i<512;i=i+32)
{
if((DBUF[i]==0x00)||(DBUF[i])==0xe5)
continue;
//else if((DBUF[i]&0x40==0x40)&&(DBUF[i+11]==0x0f))
else if((DBUF[i+11]==0x0f)||(DBUF[i+11]==0x02))
{
continue;
/* for(j=1;j<11;j++)
if(DBUF[i+j]!=0x00)
DBUFTEMP[j/2]=DBUF[i+j];
for(j=14;j<32;j++)
if(DBUF[i+j]!=0x00)
DBUFTEMP[j/2-2]=DBUF[i+j];*/
}
else
{
// if(DBUF[6]!='~')
// {
for(j=0;j<8;j++)
Uart_SendByte(DBUF[i+j]);
Uart_SendByte('.');Uart_SendByte(DBUF[i+8]);Uart_SendByte(DBUF[i+9]);
Uart_SendByte(DBUF[i+10]);Uart_SendByte('\n');
/* }
else
{
for(j=0;j<6;j++)
Uart_SendByte(DBUF[i+j]);
}
*/
}
}
i = fsstartsector / 128;
RBC_Read(DeviceInfo.FatStartSector + i,1,DBUF);
i = fsstartsector % 128;
i = i * 4;
fsstartsector = DBUF[i+3]<<24 | DBUF[i+2]<<16 | DBUF[i+1]<<8 | DBUF[i];
if(fsstartsector == 0x0fffffff)
break;
}
RBC_Read(DeviceInfo.RootStartSector,1,DBUF);
// RBC_Read(DeviceInfo.RootStartSector - 1,1,DBUF);
// RBC_Read(DeviceInfo.DataStartSector+0xe12-2,1,DBUF);
/* if(!RBC_Read(DeviceInfo.FatStartSector,1,DBUF))
{
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
*/
//fsstartsector = DBUF[11]<<24 | DBUF[10]<<16 | DBUF[9]<<8 | DBUF[8];
fsstartsector = 2;
while(1)
{
RBC_Read(DeviceInfo.DataStartSector+fsstartsector-2,1,DBUF);//读取第二簇内容
DBUF[374]=0x64;
RBC_Write(DeviceInfo.DataStartSector+fsstartsector-2,1,DBUF);
for(i = 0;i<512;i++)
Uart_SendByte(DBUF[i]);
Uart_SendByte('\n');
i = fsstartsector / 128;
RBC_Read(DeviceInfo.FatStartSector + i,1,DBUF);
i = fsstartsector % 128;
i = i * 4;
fsstartsector = DBUF[i+3]<<24 | DBUF[i+2]<<16 | DBUF[i+1]<<8 | DBUF[i];
if(fsstartsector == 0x0fffffff)
break;
}
if(!RBC_Read(DeviceInfo.RootStartSector,1,DBUF))
{
//item=0;
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
for(i = 384;i<392;i++)
Uart_SendByte(DBUF[i]);
Uart_SendByte('.');Uart_SendByte(DBUF[392]);Uart_SendByte(DBUF[393]);Uart_SendByte(DBUF[394]);
Uart_SendByte('\n');
i=DBUF[384+0x15]<<24 | DBUF[384+0x14]<<16 | DBUF[384+0x1B]<<8 | DBUF[384+0x1A];
RBC_Read(DeviceInfo.DataStartSector+i-2,1,DBUF);
for(i = 0;i<512;i++)
Uart_SendByte(DBUF[i]);
if(!RBC_Read(DeviceInfo.FatStartSector,1,DBUF))
{
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
fsstartsector = DBUF[15]<<24 | DBUF[14]<<16 | DBUF[13]<<8 | DBUF[12];
while(fsstartsector!=0x0fffffff)
{
RBC_Read(DeviceInfo.DataStartSector+fsstartsector-2,1,DBUF);//读取第二簇内容
for(i = 0;i<512;i++)
Uart_SendByte(DBUF[i]);
i = fsstartsector / 128;
RBC_Read(DeviceInfo.FatStartSector + i,1,DBUF);
i = fsstartsector % 128;
i = i * 4;
fsstartsector = DBUF[i+3]<<24 | DBUF[i+2]<<16 | DBUF[i+1]<<8 | DBUF[i];
}
RBC_Read(DeviceInfo.DataStartSector,1,DBUF);
while(1);
if(!RBC_Read(DeviceInfo.FatStartSector+4,1,DBUF))
{
//item=0;
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
if(!RBC_Read(DeviceInfo.RootStartSector,1,DBUF))
{
//item=0;
UartRspBlock.errcode=ERC_DEVICEERR;
return FALSE;
}
for(sector=0;sector<DeviceInfo.BPB_RootEntCnt;sector++)
{
//////////////////////////////////////////////////
if(!RBC_Read(DeviceInfo.RootStartSector+sector,1,DBUF))
{
//item=0;
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;
}
//pBuf=(PREAD_CAPACITY_RSP)DBUF;
///////////////////////////////////////////
RspBlockList.len=SwapINT16(item*32);
UartRspBlock.len=item*32;
return TRUE;
#undef RspBlockList
}
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;
//RspBlockOpenFile.result=0x0;
//RspBlockOpenFile.errcode=ERC_OK;
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;
//UartRspBlock.errcode=ERC_DEVICEERR;
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];
//RspBlockOpenFile.result=0x1;
ThisFile.bFileOpen=1;
bstop=1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -