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

📄 df9000wh.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 3 页
字号:
/*------------------------------------------------------------------------
 Module:        ..\App\df9000wh.cpp
 Author:        zxd
 Project:       DF9311
 State:
 Creation Date:
 Description:   DF9000维护规约.
------------------------------------------------------------------------*/
#include    "includes.h"
#define BufLength	350

extern struct DBConfig		*DBCfgs;
extern struct SysConfig		SysCfg;
extern struct SysPort		*SysPorts;
extern struct MyConfig		MyCfg;
extern INT8U TGSH;
extern INT32U	myding;
extern struct LB_t	Lb[MAXYCFD];
#ifdef BOOT_PROG
	extern INT16U	DefTick;
#endif
INT8U  VIEW_USART, WHYKMutex;
ProtocolBuf *COM1Buf, *COM2Buf;

INT16U StationAddr[PORTNUM];
static INT16U Rxc0_Rd,Rxc1_Rd,Txd0_Rd,Txd1_Rd;
static INT16U FilePacketNum = 0;
static INT32U Pos = 0,OldPos = 0;
	
/*------------------------------------------------------------------*/
/*函数名称:MainSecTask(void *pdata)								*/
/*函数功能:维护规约												*/
/*------------------------------------------------------------------*/
void MainSecTask(struct SysPort *info)
{
//zxd	OS_CPU_SR  cpu_sr;
  	INT8U	err;
  	INT8U UsartRxdBuf[WH_BUF_SIZE];
  	INT8U UsartTxdBuf[WH_BUF_SIZE];
 	INT16U bufrxdnum,buftxdnum,i, rc;
	void	(*pOnRx)(INT8U);
	void	*msg;
 	WHYKMutex = FALSE;
 	
 	pOnRx = WHOnRx;	
 				
	if ((info->PortID == PORT1) || (info->PortID == NET1))
	{
		COM1Buf = malloc (sizeof (ProtocolBuf));

		while (1)
		{
			RReadx(StationAddr[PORT1-1], PORT1);
//			if(USART_READ_LENGTH(COM1, 8))
//			{
			 	(*pOnRx)(COM1);
//			}
			OSTimeDlyHMSM(0, 0, 0, 50);
			if (!WHYKMutex)
			{
				rc = OSFlagPend (info->Event, FBOOP, OS_FLAG_WAIT_SET_ANY+OS_FLAG_CONSUME, 1, &err);
				if (rc & FBOOP)
				{
					msg = OSQPend(info->CommQ, 0, &err);
					if (err == OS_NO_ERR)
						WHYKRespond (info, (struct DBBOOPInfo*)msg, COM1);
				}
			}

			if(VIEW_USART == WH_VIEW_BUFF_USART1)
			{
				if((Usart1.Rxc_Wr != Rxc1_Rd) || (Usart1.Txc_Wr != Txd1_Rd))
				{
					if(Usart1.Rxc_Wr != Rxc1_Rd)
					{
						UsartRxdBuf[0] = 'R';
						UsartRxdBuf[1] = 'X';
						UsartRxdBuf[2] = 'D';
						UsartRxdBuf[3] = 'A';
						UsartRxdBuf[4] = 'T';
						UsartRxdBuf[5] = 'A';
						
//zxd						OS_ENTER_CRITICAL();	
						
						bufrxdnum = (Usart1.Rxc_Wr+WH_BUF_SIZE-Rxc1_Rd)%WH_BUF_SIZE;

						if(bufrxdnum > BufLength)
							bufrxdnum = BufLength;
							
						
						
						UsartRxdBuf[6] = LOW(bufrxdnum);
						UsartRxdBuf[7] = HIGH(bufrxdnum);
		
						for(i=0;i<bufrxdnum;i++)
						{
							UsartRxdBuf[8+i] = Usart1.Rxc_Buff[Rxc1_Rd];
							if(Rxc1_Rd<(WH_BUF_SIZE-1))
								Rxc1_Rd++;
							else
								Rxc1_Rd = 0;
						}
//zxd						OS_EXIT_CRITICAL();
						WriteX(UsartRxdBuf,8+bufrxdnum,COM1);
					}
//					OSTimeDlyHMSM(0, 0, 0, 10);
					if(Usart1.Txc_Wr != Txd1_Rd)
					{
						UsartTxdBuf[0] = 'T';
						UsartTxdBuf[1] = 'X';
						UsartTxdBuf[2] = 'D';
						UsartTxdBuf[3] = 'A';
						UsartTxdBuf[4] = 'T';
						UsartTxdBuf[5] = 'A';
						
//zxd						OS_ENTER_CRITICAL();
						buftxdnum = (Usart1.Txc_Wr+WH_BUF_SIZE-Txd1_Rd)%WH_BUF_SIZE;
							
						if(buftxdnum > BufLength)
							buftxdnum = BufLength;
						
						
						UsartTxdBuf[6] = LOW(buftxdnum);
						UsartTxdBuf[7] = HIGH(buftxdnum);
						for(i=0;i<buftxdnum;i++)
						{
							UsartTxdBuf[8+i] = Usart1.Txc_Buff[Txd1_Rd];
							if(Txd1_Rd<(WH_BUF_SIZE-1))
								Txd1_Rd++;
							else
								Txd1_Rd = 0;
						}
//zxd						OS_EXIT_CRITICAL();
						
						WriteX(UsartTxdBuf,8+buftxdnum,COM1);
					}
				}
			}
		}//while
	}
	
	else if ((info->PortID == PORT2) || (info->PortID == NET2))
	{
		COM2Buf = malloc (sizeof (ProtocolBuf));

		while (1)
		{
			RReadx(StationAddr[PORT2-1], PORT2);
//			if(USART_READ_LENGTH(COM2, 8))
//			{
			 	(*pOnRx)(COM2);
	
//			}
			
			OSTimeDlyHMSM(0, 0, 0, 50);
			if (WHYKMutex)
			{
				rc = OSFlagPend (info->Event, FBOOP, OS_FLAG_WAIT_SET_ANY+OS_FLAG_CONSUME, 1, &err);
				if (rc & FBOOP)
				{
					msg = OSQPend(info->CommQ, 0, &err);
					if (err == OS_NO_ERR)
						WHYKRespond (info, (struct DBBOOPInfo*)msg, COM2);
				}
//modify by zxd				WHYKMutex = FALSE;
			}

			if(VIEW_USART == WH_VIEW_BUFF_USART0)
			{
				if(Usart0.Rxc_Wr != Rxc0_Rd || Usart0.Txc_Wr != Txd0_Rd)
				{
					if(Usart0.Rxc_Wr != Rxc0_Rd)
					{
						UsartRxdBuf[0] = 'R';
						UsartRxdBuf[1] = 'X';
						UsartRxdBuf[2] = 'D';
						UsartRxdBuf[3] = 'A';
						UsartRxdBuf[4] = 'T';
						UsartRxdBuf[5] = 'A';
//zxd						OS_ENTER_CRITICAL();
						bufrxdnum = (Usart0.Rxc_Wr+WH_BUF_SIZE-Rxc0_Rd)%WH_BUF_SIZE;
							
						if(bufrxdnum > BufLength)
							bufrxdnum = BufLength;
							
											
						
						UsartRxdBuf[6] = LOW(bufrxdnum);
						UsartRxdBuf[7] = HIGH(bufrxdnum);
		
						for(i=0;i<bufrxdnum;i++)
						{
							UsartRxdBuf[8+i] = Usart0.Rxc_Buff[Rxc0_Rd];
							if(Rxc0_Rd<(WH_BUF_SIZE-1))
								Rxc0_Rd++;
							else
								Rxc0_Rd = 0;
						}
//zxd						OS_EXIT_CRITICAL();
						
						WriteX(UsartRxdBuf,8+bufrxdnum,COM2);
					}
//					OSTimeDlyHMSM(0, 0, 0, 10);
					if(Usart0.Txc_Wr != Txd0_Rd)
					{
						UsartTxdBuf[0] = 'T';
						UsartTxdBuf[1] = 'X';
						UsartTxdBuf[2] = 'D';
						UsartTxdBuf[3] = 'A';
						UsartTxdBuf[4] = 'T';
						UsartTxdBuf[5] = 'A';
						
//zxd						OS_ENTER_CRITICAL();
						buftxdnum = (Usart0.Txc_Wr+WH_BUF_SIZE-Txd0_Rd)%WH_BUF_SIZE;
							
						if(buftxdnum > BufLength)
							buftxdnum = BufLength;
						
						
						
						UsartTxdBuf[6] = LOW(buftxdnum);
						UsartTxdBuf[7] = HIGH(buftxdnum);
						for(i=0;i<buftxdnum;i++)
						{
							UsartTxdBuf[8+i] = Usart0.Txc_Buff[Txd0_Rd];
							if(Txd0_Rd<(WH_BUF_SIZE-1))
								Txd0_Rd++;
							else
								Txd0_Rd = 0;
						}
						
//zxd						OS_EXIT_CRITICAL();
						
						WriteX(UsartTxdBuf,8+buftxdnum,COM2);
					}
				}			
			}		
		}//while
	}

	else
	{
			OSTimeDlyHMSM(0, 0, 0, 100);
	}

}


/*------------------------------------------------------------------------
 Procedure:     CWH9320 ::OnRx 
 Purpose:       按DF9320维护规约进行帧校验. 抛弃前面的干扰字符
 Input:
 Output:
 Errors:        帧非法.假设帧连续,且会结束出现帧尾.
------------------------------------------------------------------------*/
void WHOnRx(INT8U port)
{
	ProtocolBuf *p=NULL;
	
	INT16U CRC16,count, head, len,i; 
	/*count:串口数据个数, head:偏移, len:帧数据长度*/
	INT8U frame_ok,CRC8;
	
	if(port == COM1)	
		p=COM1Buf;
	else if(port == COM2)
		p=COM2Buf;

	memset ((INT8U *)p->rxbuf, 0, WH_BUF_SIZE);
	count = Readx((INT8U *)p->rxbuf, WH_BUF_SIZE, port);  
	
	   
        head = 0; frame_ok = 0;
        while( (count-head) > 5)
        {
        	
        	if( (p->rxbuf[head+0] != 0xFF) && (p->rxbuf[head+0] != 0x01))		//开始标志
	        {
	            head++; 
	            continue;
	        }
	        CRC8 = SendVerifyHead(&p->rxbuf[head+0], 5);
	        if(p->rxbuf[head+5] != CRC8)		//
	        {
	        	head++;
	        	continue;
	        }
	              
	        len = MERGE(p->rxbuf[head+2], p->rxbuf[head+1]);
	        //判断帧长合法性
	        if( len > 1000 ) { head++; continue; }	//帧长不能超过1000字节;
	        //未接受到全部帧
	        if( (count-head) < (len+8) )		//可能没有收完,等待
	        {			
		     break;
	        }

	        //CRC校验
	       CRC16 = WHCRC16(&p->rxbuf[head+1], len+5);
	       if ( (p->rxbuf[head+len+7] != HIGH(CRC16)) || (p->rxbuf[head+len+6] != LOW(CRC16)))
	       {
		    head++; continue;
	       }
	       frame_ok = 1;
	       break;
       }
      
       if(frame_ok == 0)
       {
       		lseek(port, head);		/*更新串口缓存区的读指针*/
	        return ;
       }	
       else 
       {
	        lseek(port, head+len+8);	/*更新串口缓存区的读指针*/
                       
	        if(head != 0)   		   	           //移动缓冲区
            	for(i=0; i<len+8; i++)
		        	p->rxbuf[i] = p->rxbuf[i+head];

     		WHAppLayer(port);
     		return ;
       }
  
}
/*------------------------------------------------------------------------
 Procedure:     CWH9000::WHAppLayer ID:1
 Purpose:       df9000维护规约应用层解释.
 Input:
 Output:
 Errors:
------------------------------------------------------------------------*/
void  WHAppLayer(INT8U port)
{
	ProtocolBuf *p=NULL;
	struct FileInfo FileInformation;
	#ifdef BOOT_PROG
	INT8U i;
	#endif
	INT8U cmd, cmd_ext, portNo, PacketEnd;
	INT16U value,PacketLength,FileContentLength,FaultNo;


	if(port == COM1)	p=COM1Buf;
	else if(port == COM2)	p=COM2Buf;
	
	#ifdef BOOT_PROG
		DefTick = 0;
	#endif
	
	//功能码+扩展功能码
	PacketLength = MERGE(p->rxbuf[2], p->rxbuf[1]);
	cmd 	= p->rxbuf[3]; 
	cmd_ext = (p->rxbuf[4] & 0x7f); 
	
	
	switch(cmd) 
	{
		case WH_SQLPOLL:
			if(cmd_ext == WH_EXT_YC)
				WH_Send_YC(port);
			if(cmd_ext == WH_EXT_YX)
				WH_Send_YX(port);
			if(cmd_ext == WH_EXT_DD)
				WH_Send_DD(port);
									break;
		case WH_SELECT:
			if(cmd_ext == WH_EXT_BOOBJ_LOGIC)
				WH_YKSELECT(port);
			if(cmd_ext == WH_EXT_BOOBJ_REAL)
				WH_YKSELECT(port);
									break;
		case WH_EXE:
			if(cmd_ext == WH_EXT_BOOBJ_LOGIC)
				WH_YKEXE(port);
			if(cmd_ext == WH_EXT_BOOBJ_REAL)
				WH_YKEXE(port);
									break;
		case WH_TIME:						
			if(cmd_ext == WH_EXT_TIME_COUNTERPOISE)
				WH_WRITE_CLOCK(port);
			if(cmd_ext == WH_EXT_TIME_READ)
				WH_READ_CLOCK(port);
									break;
		case WH_RESET:
			if(cmd_ext == WH_EXT_RESET_HEAT)
			{
				//热复位函数或标志
				KillProg(RESET_RETAIN, RESET_DD, TRUE);
			}
			if(cmd_ext == WH_EXT_ERSET_COLD)
			{
				//冷复位函数或标志
				KillProg(RESET_CLR, RESET_DD, TRUE);
			}
				WHACK(port);
									break;
		case WH_FAULT_RECORD:
			FaultNo = MERGE(p->rxbuf[PacketLength+5], p->rxbuf[PacketLength+5-1]);
			if (!Lb[FaultNo - 1].State)
				Lb[FaultNo - 1].State = LBSTART;
									break;
		case WH_VIEW_BUFF:
			if(cmd_ext == WH_EXT_VIEW_BUFF_START)
			{
				portNo = p->rxbuf[6];
				WH_READ_BUFF(port,portNo);
			}
			if(cmd_ext == WH_EXT_VIEW_BUFF_STOP)
			{
				WH_STOP_READ_BUFF(port);
			}
									break;
		case WH_VARPOLL:
			if((p->rxbuf[13] == 'E') && (p->rxbuf[12] == 'R') && (p->rxbuf[11] == 'R') &&(p->rxbuf[10] == 'O'))
				WH_Send_SYSINFO(port);
			else
				WHACK(port);
									break;
		case WH_FILESYS:				//文件系统操作
			switch(cmd_ext)
			{
				case WH_EXT_FILE_INIT:		//初始化
					memset((INT8U *)&FileInformation,0,sizeof(struct FileInfo));
					strcpy(FileInformation.Name,(char*)p->rxbuf+6);
					FReadInfo(&FileInformation);
					WH_FileHead(port,&FileInformation);
					FilePacketNum = 0;
									break;
				case WH_EXT_FILE_READ:		//读文件
					strcpy(FileInformation.Name,(char*)p->rxbuf+6);
					Pos = DMERGE(p->rxbuf[42],p->rxbuf[41],p->rxbuf[40],p->rxbuf[39]);
					FilePacketNum = Pos/WH_DATA_MAXLENGTH;
					WH_FileRead(port,FilePacketNum,&FileInformation);
									break;
				case WH_EXT_FILE_CONTENT:	//文件内容
					strcpy(FileInformation.Name,(char*)p->rxbuf+6);
					Pos = DMERGE(p->rxbuf[42],p->rxbuf[41],p->rxbuf[40],p->rxbuf[39]);

					PacketEnd = p->rxbuf[43];
					FileContentLength = PacketLength - 38;
					
					if(PacketEnd)
					{
						if(Pos != 0 && FileContentLength != 0)
							FilePacketNum = FilePacketNum + 1;
							
						FilePacketNum |= 0x8000;//最后一包
					}
					else
					{
						FilePacketNum = Pos/FileContentLength;
					}
					
					if(OldPos == Pos)
					{
						
						if(FWrite(p->rxbuf+44, FilePacketNum, FileContentLength, &FileInformation) != FileContentLength)
						{
							at91_irq_open ( WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR );	
							//FilePacketNum = 0;
							//Pos = 0;
							//WHNAK(port,1);
						}
						else
						{
							at91_irq_open ( WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR );	
							
							OldPos = Pos + FileContentLength;
							
							if(PacketEnd)
							{
								FilePacketNum = 0;
								Pos = 0;
								OldPos = 0;
							}
							WHACK(port);
						}
					}
					else if (OldPos > Pos)
					{
						WHACK(port);
					}
					else
					{
						WHNAK(port,1);
					}
					break;
				case WH_EXT_FILE_CANCEL:	//退出文件操作
					WHACK(port);
									break;
				case WH_EXT_FILE_DELETE:	//删除文件
					strcpy(FileInformation.Name,(char*)p->rxbuf+6);
					if(FDelete(&FileInformation))
					{
						at91_irq_open ( WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR ) ;

						WHACK(port);
					}
					else
					{
						at91_irq_open ( WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR ) ;

						WHNAK(port,1);
					}
									break;
				case WH_EXT_FILE_LISTDIR:	//列表所有目录

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -