📄 panel.c
字号:
/*@# Multiplexer device dirver:panel.c */
/*------------------------------------------------------------------------------*/
/* */
/* MODULE: panel.c */
/* DATE: 2000/9/20 */
/* PURPOSE: Front panel communication module */
/* AUTHOR: JohnnyLing */
/* */
/*------------------------------------------------------------------------------*/
/* */
/* Copyright 2000,HighSun Dvision Inc. */
/* ALL RIGHTS RESERVED */
/*------------------------------------------------------------------------------*/
#include "psos.h"
#include "constant.h"
#include "structure.h"
#include "command.h"
#include "tspack.h"
#include "sys_conf.h"
extern unsigned char PanelOK;
extern SelfTest_Result *presult;
extern void my_Delay(unsigned long int dly_ms);
/*------------------------------------------------------------------------------*/
/* 前面板测试函数,用于测试前面板是否自检成功 */
/* 860给前面板发送一个测试包,等待面板在2秒钟内应答,无应答则返回失败. */
/*------------------------------------------------------------------------------*/
unsigned long TestPanel(void)
{
MESSAGE Msg;
Packet *The_Packet;
int i;
unsigned long TestResult=0xFFFFFFFF;
The_Packet=(Packet *)MemAlloc(RNG1ID,TN_PANELSEND,sizeof(Packet));
if(The_Packet!=NULL)
{
The_Packet->Command =CMD_PANEL_TEST_MESSAGE;
The_Packet->DeviceType =DEVICE_TYPE_MULTIPLEXER;
The_Packet->Result =0;
The_Packet->PacketHeadLength=sizeof(Packet);
The_Packet->PacketLength=sizeof(Packet);
Msg.Flag=0x00;
Msg.MsgType=MSG_PANEL;
Msg.Length=The_Packet->PacketLength;
Msg.Pdata=(unsigned char *)The_Packet;
SendQueue(QN_PANELSEND,&Msg);
}
return 0;
}
void TK_PanelTest(void)
{
unsigned char buf[256];
UARTBLOCK Uart;
unsigned long ret;
unsigned long rc;
int i;
unsigned char Val=0;
buf[0]=0xA5;
buf[1]=0xA5;
buf[2]=0x00;
buf[3]=0xFB;
for(i=4;i<255;i++)
{
buf[i]=i-4;
}
for(i=0;i<255;i++)
Val^=buf[i];
buf[255]=Val;
for(;;)
{
Uart.port=2;
Uart.pData=(unsigned char *)buf;
Uart.length=256;
rc=de_write(DEV_RS232,&Uart,&ret);
if(rc)
{
Display("de_write error, errno=0x%x \n",rc);
my_Delay(100);/*by xu*/
continue;
}
else
{
Display("Panel data send! \n");
}
my_Delay(100);/*by xu*/
}
}
void TK_PanelSend(void)
{
unsigned long rc;
MESSAGE Msg;
UARTBLOCK uart;
unsigned long ret;
int i;
unsigned char Val;
unsigned char* buf = NULL;
for(;;)
{
Val=0;
rc=ReceiveQueue(QN_PANELSEND,Q_WAIT,0,&Msg);
if(rc)
{
Display("TK_PanelSend: Receive message error! \n");
continue;
}
else
{
buf=(unsigned char *)MemAlloc(RNG0ID,"PANELSEND",Msg.Length + 5);
if(buf!=NULL)
{
*(unsigned short *)buf=0xA5A5;
*(unsigned short *)(buf + 2) = Msg.Length;
if(Msg.Pdata == NULL)
{
MemFree(buf);
continue;
}
MemCopy((unsigned char *)(buf + 4),Msg.Pdata,Msg.Length);
for(i=0;i<Msg.Length+4;i++)
Val^=*(unsigned char *)(buf+i);
*(unsigned char *)(buf + Msg.Length + 4)=Val;
}
if((Msg.MsgType!=MSG_MONI)&&(Msg.MsgType!=MSG_ALRM))
MemFree(Msg.Pdata);
uart.port=2;
uart.length=Msg.Length + 5;
uart.pData=buf;
de_write(DEV_RS232,(void *)&uart,&ret);
MemFree(buf);
}
my_Delay(100);/*by xu*/
}
}
void TK_PanelRecv(void)
{
unsigned long rc;
MESSAGE Msg;
UARTBLOCK uart;
unsigned long ret;
Packet *P;
unsigned char *buf;
unsigned char val;
unsigned char RightVal;
int i;
int Flag=0;
buf=(unsigned char *)MemAlloc(RNG1ID,TN_PANELRECV,MAX_MESSAGE_LENGTH_FROM_FRONT_PANEL);
if(buf!=NULL)
{
uart.port=2;
uart.pData=buf;
for(;;)
{
val=0;
rc=de_read(DEV_RS232,(void *)&uart,&ret);
if(rc)
{
Display(" TK_PanelRecv: de_read error! \n");
continue;
}
else
{
/*
if(Flag)
Display(" Original Panel data received, length=%d \n",uart.length);
*/
/*----------------------------------------------------------------------------*/
/* 收到的数据长度必须大于5 */
/*----------------------------------------------------------------------------*/
if(uart.length<=5)
{
Display("Panel data received error, length= %d <=5. \n",uart.length);
continue;
}
if(*(unsigned short *)buf!=0xA5A5)
{
Display("Panel data received error, no synchronous. \n");
continue;
}
if(*(unsigned short *)(buf+2)!=(uart.length - 5))
{
Display("Panel data received error, length mismatches, expected len= %d, actual length=%d \n",*(unsigned short *)(buf+2),uart.length - 5);
continue;
}
/*----------------------------------------------------------------------------*/
/* 对收到的数据进行校验 */
/*----------------------------------------------------------------------------*/
for(i=0;i<uart.length - 1;i++)
val^=*(buf + i);
RightVal=*(unsigned char *)(buf + uart.length - 1);
if(val==RightVal)
{
P=(Packet *)MemAlloc(RNG1ID,TN_PANELRECV,uart.length -5 );
if(P!=NULL)
{
MemCopy((unsigned char *)P,(unsigned char *)(buf + 4),uart.length - 5);
Display("Panel data received succesfully, len= %d \n ", uart.length);
Cmd_Proc(P);
/*
Msg.Flag =0x00;
Msg.Length =uart.length;
Msg.MsgType=MSG_PANEL;
Msg.Pdata =(unsigned char *)P;
SendQueue(QN_CMDPROC,&Msg);
*/
}
}
else
{
Display("Data from panel verify failed! \n");
}
}
my_Delay(1);/*by xu*/
}
}
}
void TK_PanelInit(void)
{
UARTBLOCK uart;
void *dummy;
unsigned long ret;
unsigned long rc;
int i;
Packet *The_Packet;
uart.BaudRate=9600;
uart.CharSize=8;
uart.StopBits=1;
uart.Verify =0;
uart.port=2;
rc=de_init(DEV_RS232,(void *)&uart,&ret,&dummy);
if(rc)
{
Display("Panel init error, errcode=0x%x \n",rc);
}
else
{
rc=de_open(DEV_RS232,(void *)&uart,&ret);
if(rc)
{
Display("Panel open error, errcode=0x%x \n",rc);
}
else
{
/*----------------------------------------------------------------------*/
/* 创建面板接收任务和面板处理任务 */
/*----------------------------------------------------------------------*/
CreateStartTask(TN_PANELRECV,TASKPRIO1,SUPERSTACK,USERSTACK,0,TK_PanelRecv,0);
CreateStartTask(TN_PANELSEND,TASKPRIO1,SUPERSTACK,USERSTACK,0,TK_PanelSend,0);
/* CreateStartTask("PTST",TASKPRIO2,SUPERSTACK,USERSTACK,0,TK_PanelTest,0); */
my_Delay(2);
The_Packet=(Packet *)MemAlloc(RNG1ID,TN_PANELSEND,sizeof(Packet));
for(;;)
{
if(PanelOK)
break;
/* TestPanel(); */
/*---------------------------------------------------------------------*/
/* 直接上报当前配置。收到面板的应答后设置PanelOK=1 */
/* 这样减少了与面板的通信次数,可以让面板较快的显示系统正常 */
/*---------------------------------------------------------------------*/
if(The_Packet!=NULL)
{
The_Packet->PacketType =0x01; /* 预置消息来自面板 */
The_Packet->DeviceType =DEVICE_TYPE_MULTIPLEXER;
The_Packet->DeviceIdt =0;
The_Packet->PacketIdt =0;
The_Packet->Result =0;
ReportCurrentConfig(The_Packet);
}
my_Delay(100);/*by xu*/
}
if(The_Packet!=NULL)
MemFree(The_Packet);
/*------------------------------------------------------------*/
/* 上报自检状态给面板 */
/*------------------------------------------------------------*/
my_Delay(10);/*by xu*/
/* ReportPIDRemap(1); */
my_Delay(10);/*by xu*/
ReportSelftestState(presult,1);
}
}
t_suspend(0L);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -