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

📄 loop.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
字号:
/*------------------------------------------------------------------------------*/
/* Project Name: Multiplexer of MPEG-II                                         */
/* Module  Name: Loop task                                                      */
/* Purpose     :                                                                */
/* Author      : LingYiChuan                                                    */
/* Date        : 2000/9/20                                                      */
/* Version     : 1.0                                                            */
/* Copyright HignSun Dvision, All Right Reservered.                             */
/*------------------------------------------------------------------------------*/

#include "psos.h"
#include "icontrol\mpc8xx.h"
#include "constant.h"
#include "structure.h"
#include "command.h"
#include "tspack.h"

extern void my_Delay(unsigned long int dly_ms);
unsigned char BufToReportIPAddress[64];
unsigned char BufToReportConStatePanel[64];
unsigned char BufToReportConStateNM[88];

extern    int     g_Emmg_connected[3];
extern    int     g_ecmg_connected[3];

extern unsigned char SystemState;
extern System_Data   SystemData;

extern unsigned char PanelOK;
extern unsigned char Connected; 

extern unsigned char Has_Report_Device_Type;         

extern unsigned long TestC54(void);
extern unsigned long TestFPGA(void);
extern void ResetC54(void);
extern void ResetFPGA(void);

/*
定时任务需要完成的任务有:
1.定时监测各端口(不含级连口)的IP地址的情况,如果有变化,需要通知网管;
2.定时监测各端口(含级连口)的连接情况,如果发生变化,需要通知网管;
*/

void GetIPAddr(unsigned long IPAddrList[])
{
	int i;
	unsigned char volatile B0,B1,B2,B3;

	for(i=0;i<8;i++)
	{
		B0=*(unsigned char *)( PORT_IPADDR_START_ADDR + i*0x100);
		B1=*(unsigned char *)( PORT_IPADDR_START_ADDR + i*0x100 + 1);
		B2=*(unsigned char *)( PORT_IPADDR_START_ADDR + i*0x100 + 2);
		B3=*(unsigned char *)( PORT_IPADDR_START_ADDR + i*0x100 + 3);

		IPAddrList[i]=(unsigned long)( (B0<<24) + (B1<<16) + (B2<<8) + B3);
	}

	/*--------------------------------------------------------------------*/
	/* 清除IP地址寄存器里的内容                                           */
	/*--------------------------------------------------------------------*/
	PORT_IPADDR_CLEAR_REG=0;
	PORT_IPADDR_CLEAR_REG=1;
}

/*-------------------------------------------------------------------------------------------------*/
/* 0: to SMCC                                                                                      */
/* 1: to PANEL                                                                                     */
/*-------------------------------------------------------------------------------------------------*/
void GetInputIP(void)
{
	unsigned long IPAddr[8];
	int           i,j;

	GetIPAddr(IPAddr);	
	for(j=0;j<8;j++)
		SystemData.PortConfig[j].IPAddr=IPAddr[j];
	
}

void ReportIPAddr(unsigned char Type)
{
	MESSAGE            Msg;
	Packet             *ThePacket;
	Packet             *PanelPck;
	Cmd_Report_IP_Addr Cmd;	

	if(Connected&&(Type==0))
	{
		/*ThePacket=(Packet *)MemAlloc(RNG2ID,TN_IPMONITOR, sizeof(Packet) - 4 + sizeof(Cmd_Report_IP_Addr));*/
		ThePacket=(Packet *)BufToReportIPAddress;

		if(ThePacket!=NULL)
		{
			ThePacket->Command=COMMAND_REPORT_IP_ADDRESS;
			ThePacket->DeviceType      =DEVICE_TYPE_MULTIPLEXER;
			ThePacket->DeviceIdt       =SystemData.EthernetPara.IP;
			ThePacket->PacketIdt       =0;
			ThePacket->Result          =0;

			ThePacket->PacketHeadLength=sizeof(Packet) - 4;
			ThePacket->PacketLength=sizeof(Packet) - 4 + sizeof(Cmd_Report_IP_Addr);
			
			Cmd.IP0=SystemData.PortConfig[7].IPAddr;
			Cmd.IP1=SystemData.PortConfig[6].IPAddr;
			Cmd.IP2=SystemData.PortConfig[5].IPAddr;
			Cmd.IP3=SystemData.PortConfig[4].IPAddr;
			Cmd.IP4=SystemData.PortConfig[3].IPAddr;
			Cmd.IP5=SystemData.PortConfig[2].IPAddr;
			Cmd.IP6=SystemData.PortConfig[1].IPAddr;
			Cmd.IP7=SystemData.PortConfig[0].IPAddr;

			MemCopy((unsigned char *)&ThePacket->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_IP_Addr));

			Msg.Flag=0x00;
			Msg.MsgType=MSG_MONI;
			Msg.Length=ThePacket->PacketLength;
			Msg.Pdata=(unsigned char *)ThePacket;

			SendQueue(QN_TCPIPSEND,&Msg);
			
			/* Display("Report port IP address command send out to Management System! \n");  */
		}
	}
}
/*------------------------------------------------------------------------------------------*/
/* 获得各端口的连接情况,包括级连口                                                          */
/*------------------------------------------------------------------------------------------*/
void GetConnectState(unsigned char *p)
{
	unsigned char State;
	int           i;


	/*-------------------------------------------------------------------------------------*/
	/* FPGA1_PORT_CONNECT_STATE_REG 的 DO 表示 TS0, D1 表示 TS1,其他位无效                 */
	/*-------------------------------------------------------------------------------------*/
	State=FPGA1_PORT_CONNECT_STATE_REG;

	if(State&0x01)
		*(unsigned char *)p=1;
	else
		*(unsigned char *)p=0;

	if(State&0x02)
		*(unsigned char *)(p+1)=1;
	else
		*(unsigned char *)(p+1)=0;


	/*-------------------------------------------------------------------------------------*/
	/* FPGA2_PORT_CONNECT_STATE_REG 的 DO 表示 TS2, D1 表示 TS3,D2 表示 TS4,其他位无效     */
	/*-------------------------------------------------------------------------------------*/
	State=FPGA2_PORT_CONNECT_STATE_REG;

	if(State&0x01)
		*(unsigned char *)(p+2)=1;
	else
		*(unsigned char *)(p+2)=0;

	if(State&0x02)
		*(unsigned char *)(p+3)=1;
	else
		*(unsigned char *)(p+3)=0;

	if(State&0x04)
		*(unsigned char *)(p+4)=1;
	else
		*(unsigned char *)(p+4)=0;
	/*-------------------------------------------------------------------------------------*/
	/* FPGA3_PORT_CONNECT_STATE_REG 的 DO 表示 TS5, D1 表示 TS6,D2 表示 TS7,其他位无效     */
	/*-------------------------------------------------------------------------------------*/
	State=FPGA3_PORT_CONNECT_STATE_REG;

	if(State&0x01)
		*(unsigned char *)(p+5)=1;
	else
		*(unsigned char *)(p+5)=0;

	if(State&0x02)
		*(unsigned char *)(p+6)=1;
	else
		*(unsigned char *)(p+6)=0;

	if(State&0x04)
		*(unsigned char *)(p+7)=1;
	else
		*(unsigned char *)(p+7)=0;

}

/*-------------------------------------------------------------------------------------------------*/
/* 0: to SMCC                                                                                      */
/* 1: to PANEL                                                                                     */
/*-------------------------------------------------------------------------------------------------*/
void ReportConnectState(unsigned char Type)
{
	MESSAGE              Msg;
	Packet               *ThePacket;
	Packet               *PanelPck;
	Cmd_Report_PortState Cmd;

	char                        strBuf[64];
	int                  i;
	int                       *p;


	if(Connected&&(Type==0))
	{
		/*ThePacket=(Packet *)MemAlloc(RNG2ID, TN_CONMONITOR, sizeof(Packet)- 4 + sizeof(Cmd_Report_PortState));*/
		ThePacket=(Packet *)BufToReportConStateNM;
		if(ThePacket!=NULL)
		{

			ThePacket->Command			=COMMAND_REPORT_PORTSTATE;
			ThePacket->DeviceType		=DEVICE_TYPE_MULTIPLEXER;
			ThePacket->DeviceIdt        =SystemData.EthernetPara.IP;
			ThePacket->PacketIdt        =0;
			ThePacket->Result           =0;


			ThePacket->PacketHeadLength=sizeof(Packet)- 4;
			ThePacket->PacketLength=sizeof(Packet)- 4 + sizeof(Cmd_Report_PortState)+sizeof(int)*3*2;

                     for(i=0;i<8;i++)
                     {
                         Cmd.PortState[i]=0;
                     }		 
			for(i=0;i<8;i++)
			{
                            if(SystemData.PortConfig[7-i].Connected)
                            {
                                Cmd.PortState[i]|=0x01;
                            }
				else
				{
				    Cmd.PortState[i]&=0xf0;
				}
			   /*	Cmd.PortState[i]=SystemData.PortConfig[7-i].Connected;*/
			}
			for(i=0;i<3;i++)
			{
                            if(g_Emmg_connected[i])
                            {
                                Cmd.PortState[i]|=0x10;
                            }
				else
				{
				   Cmd.PortState[i]&=0x0f;
				}
				
				if(g_ecmg_connected[i])
				{
				   Cmd.PortState[4+i]|=0x10;
				}
				else
				{
				   Cmd.PortState[4+i]&=0x0f;
				}
			}

			MemCopy((unsigned char *)&ThePacket->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_PortState));

			MemCopy((unsigned char *)(&ThePacket->Data)+sizeof(Cmd_Report_PortState),(unsigned char *) g_Emmg_connected,sizeof(int)*3);
			MemCopy((unsigned char *)(&ThePacket->Data)+sizeof(Cmd_Report_PortState)+sizeof(int)*3,(unsigned char *) g_ecmg_connected,sizeof(int)*3);

                 	Msg.Flag=0x00;
			Msg.MsgType=MSG_MONI;
			Msg.Length=ThePacket->PacketLength;
			Msg.Pdata=(unsigned char *)ThePacket;

	         	SendQueue(QN_TCPIPSEND,&Msg);			

			/* Display("Report port connect state command send out Mangement System! \n"); */
			}
		}

	if(PanelOK&&(Type==1))
	{
		/*PanelPck=(Packet *)MemAlloc(RNG2ID, TN_CONMONITOR, sizeof(Packet)- 4 + sizeof(Cmd_Report_PortState));*/
		PanelPck=(Packet *)BufToReportConStateNM;

		if(PanelPck!=NULL)
		{

			PanelPck->Command			=COMMAND_REPORT_PORTSTATE;
			PanelPck->DeviceType		=DEVICE_TYPE_MULTIPLEXER;
			PanelPck->DeviceIdt         =SystemData.EthernetPara.IP;
			PanelPck->PacketIdt         =0;

			PanelPck->Result            =0;

			PanelPck->PacketHeadLength=sizeof(Packet)- 4;
			PanelPck->PacketLength=sizeof(Packet)- 4 + sizeof(Cmd_Report_PortState);

			for(i=0;i<8;i++)
			{
				Cmd.PortState[i]=SystemData.PortConfig[7-i].Connected;
			}

			MemCopy((unsigned char *)&PanelPck->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_PortState));

			Msg.Flag=0x00;
			Msg.MsgType=MSG_MONI;
			Msg.Length=PanelPck->PacketLength;
			Msg.Pdata=(unsigned char *)PanelPck;

			SendQueue(QN_PANELSEND,&Msg);
			
			/* Display("Report port connect state command send out to Panel! \n"); */
		}
	}

}

void TK_IP_Monitor(void)
{		
	unsigned long IPAddr[8];
	unsigned long OldIPAddr[8];
	int           i,j;

	
	for(j=0;j<8;j++)
		OldIPAddr[j]=0;
			
	for(;;)
	{				
		GetIPAddr(IPAddr);
	
		for(i=0;i<8;i++)
		{
			/*==========================================================================*/
			/*IP地址有变化则上报,并保存现在各端口输入的IP地址                          */
			/*==========================================================================*/
			if(OldIPAddr[i]!=IPAddr[i])
			{
				for(j=0;j<8;j++)
				{
					SystemData.PortConfig[j].IPAddr=IPAddr[j];
					OldIPAddr[j]=IPAddr[j];
				}
					
				ReportIPAddr(0);
				break;
			}
		}
		
		my_Delay(5000);/*by xu*/
	}
}

void TK_Con_Monitor(void)
{
	MESSAGE       Msg;
	unsigned char msg[16];
	unsigned long rc;
	unsigned char ConState[8];	
	int i;		
	/*===========================================================================*/
	/*循环检测,定时上报给面板和网管                                             */
	/*===========================================================================*/
	for(;;)
	{
		GetConnectState(ConState);	

		for(i=0;i<8;i++)
			SystemData.PortConfig[i].Connected=ConState[i];

		/*-------------------------------------------------------------------*/
		/* 上报当前各端口的连接情况,变化了才报给面板                         */
		/*-------------------------------------------------------------------*/
		ReportConnectState(1);
		ReportConnectState(0);
		
		my_Delay(5000);/*by xu*/

		MemSet(msg,16,0x00);
		SendQueue(QN_ALARM,(unsigned long *)msg);
	}
}

⌨️ 快捷键说明

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