📄 loop.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 + -