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

📄 panel.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 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 + -