📄 df9000wh.c
字号:
/*------------------------------------------------------------------------
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 + -