⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hpi.c

📁 基于Embest开发环境
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -