📄 nib.c
字号:
/*-------------------------------------------------------*/
/* nib.c */
/*-------------------------------------------------------*/
#include "nib.h"
#include "structure.h"
#include "command.h"
#include "psos.h"
#define SBOX_BASE_ADDR 0x100
unsigned char BufToReportNibStatePanel[64];
unsigned char BufToReportNibStateNM[64];
extern System_Data SystemData;
extern void my_Delay(unsigned long int dly_ms);
extern unsigned char PanelOK;
extern unsigned char Connected;
static unsigned char Sbox[256] =
{ 58, 234, 104, 254, 51, 233, 136, 26,
131, 207, 225, 127, 186, 226, 56, 18,
232, 39, 97, 149, 12, 54, 229, 112,
162, 6, 130, 124, 23, 163, 38, 73,
190, 122, 109, 71, 193, 81, 143, 243,
204, 91, 103, 189, 205, 24, 8, 201,
255, 105, 239, 3, 78, 72, 74, 132,
63, 180, 16, 4, 220, 245, 92, 198,
22, 171, 172, 76, 241, 106, 47, 60,
59, 212, 213, 148, 208, 196, 99, 98,
113, 161, 249, 79, 46, 170, 197, 86,
227, 57, 147, 206, 101, 100, 228, 88,
108, 25, 66, 121, 221, 238, 150, 246,
138, 236, 30, 133, 83, 69, 222, 187,
126, 10, 154, 19, 42, 157, 194, 94,
90, 31, 50, 53, 156, 168, 115, 48,
41, 61, 231, 146, 135, 27, 43, 75,
165, 87, 151, 64, 21, 230, 188, 14,
235, 195, 52, 45, 184, 68, 37, 164,
28, 199, 35, 237, 144, 110, 80, 0,
153, 158, 77, 217, 218, 141, 111, 95,
62, 215, 33, 116, 134, 223, 107, 5,
142, 93, 55, 17, 210, 40, 117, 214,
167, 119, 36, 191, 240, 176, 2, 183,
248, 252, 129, 9, 177, 1, 118, 145,
125, 15, 200, 160, 242, 203, 120, 96,
209, 247, 224, 181, 152, 34, 179, 32,
29, 166, 219, 123, 89, 159, 174, 49,
251, 211, 182, 202, 67, 114, 7, 244,
216, 65, 20, 85, 13, 84, 139, 185,
173, 70, 11, 175, 128, 82, 44, 250,
140, 137, 102, 253, 178, 169, 155, 192};
void WriteSBox(void)
{
int i;
for(i=0;i<256;i++)
{
NIB_ADDRESS_LOW_REG =i;
NIB_ADDRESS_HIGH_REG=1;
NIB_DATA_LOW_REG =Sbox[i];
NIB_DATA_HIGH_REG =0;
NIB_ACTION_REG =0;
}
NIB_ADDRESS_LOW_REG =16;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =1;
NIB_DATA_HIGH_REG =0;
NIB_ACTION_REG =0;
}
int TestNib(void)
{
unsigned char volatile TestVal;
NIB_TEST_REG=0x55;
TestVal=NIB_TEST_REG;
if(TestVal!=0x55)
return -1;
NIB_TEST_REG=0xAA;
TestVal=NIB_TEST_REG;
if(TestVal!=0xAA)
return -1;
return 0;
}
void ResetNib(void)
{
int volatile i;
NIB_RESET_REG=0;
/*for(i=0;i<10000;i++);*/
my_Delay(10);/*by xu*/
NIB_RESET_REG=1;
}
unsigned char GetNibVer(void)
{
return NIB_VERSION_REG;
/*return 0x20;*/
/*return 0x10;*/
}
void Config_Nib(void)
{
int i;
unsigned short Reg;
unsigned char RegChar;
unsigned short DeltaList[]={0,20,40,80,160,320};
/*-------------------------------------------------------*/
/* E3/DS3接口 */
/*-------------------------------------------------------*/
RegChar =SystemData.NetworkPort.E3DS3Type;
NIB_ADDRESS_LOW_REG =3;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =RegChar;
NIB_DATA_HIGH_REG =0;
NIB_ACTION_REG =0;
/*-------------------------------------------------------*/
/* ASI 码率 */
/*-------------------------------------------------------*/
/*Reg=27000 * 8 * 188 / (SystemData.NetworkPort.ASIRate*100) - 1;*/
/*Reg=27000 * 8 * 188 / (SystemData.NetworkPort.ASIRate*100);*/
Reg=(unsigned short)(270UL * 8 * 188 / SystemData.NetworkPort.ASIRate);
NIB_ADDRESS_LOW_REG =0;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =(unsigned char)(Reg&0xFF);
NIB_DATA_HIGH_REG =(unsigned char)((Reg&0xFF00)>>8);
NIB_ACTION_REG =0;
/*-------------------------------------------------------*/
/* 2004-12-20 修改,适应baco的扰码器 */
/*-------------------------------------------------------*/
if(SystemData.NetworkPort.ASIRate>500)
{
NIB_ADDRESS_LOW_REG =0x11;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =1; /*NIB_DATA_LOW_REG =0; by xu*/
NIB_DATA_HIGH_REG =0;
NIB_ACTION_REG =0;
}
else
{
NIB_ADDRESS_LOW_REG =0x11;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =1;
NIB_DATA_HIGH_REG =0;
NIB_ACTION_REG =0;
}
/*-------------------------------------------------------*/
/* PCR 延时 */
/*-------------------------------------------------------*/
i=SystemData.NetworkPort.PCRDelay / 20;
Reg= 27000 * DeltaList[i] /300;
NIB_ADDRESS_LOW_REG =2;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =(unsigned char)(Reg&0xFF);;
NIB_DATA_HIGH_REG =(unsigned char)((Reg&0xFF00)>>8);
NIB_ACTION_REG =0;
/*------------------------------------------------------*/
/* 半帧数据量 */
/*------------------------------------------------------*/
Reg= 20 * SystemData.NetworkPort.ASIRate * 100 / 8 / 188;
NIB_ADDRESS_LOW_REG =1;
NIB_ADDRESS_HIGH_REG=0;
NIB_DATA_LOW_REG =(unsigned char)(Reg&0xFF);;
NIB_DATA_HIGH_REG =(unsigned char)((Reg&0xFF00)>>8);
NIB_ACTION_REG =0;
WriteSBox();
ResetNib();
}
unsigned char GetNibState(void)
{
NIB_ADDRESS_LOW_REG =4;
NIB_ADDRESS_HIGH_REG=0;
return NIB_ACTION_REG;
}
unsigned short GetMaxRate(void)
{
unsigned char volatile t1,t2;
unsigned short TmpRate;
NIB_ADDRESS_LOW_REG =7;
NIB_ADDRESS_HIGH_REG=0;
t1=NIB_ACTION_REG;
NIB_ADDRESS_LOW_REG =8;
NIB_ADDRESS_HIGH_REG=0;
t2=NIB_ACTION_REG;
TmpRate=(unsigned short)(t2<<8) + t1;
TmpRate=TmpRate*188*44.736*4*10/(4096*193);
/*
if(GetNibVer()>=0x12)
TmpRate/=2;
*/
return TmpRate;
}
unsigned short GetAverageRate(void)
{
unsigned char volatile t1,t2;
unsigned short TmpRate;
NIB_ADDRESS_LOW_REG =5;
NIB_ADDRESS_HIGH_REG=0;
t1=NIB_ACTION_REG;
NIB_ADDRESS_LOW_REG =6;
NIB_ADDRESS_HIGH_REG=0;
t2=NIB_ACTION_REG;
TmpRate=(unsigned short)(t2<<8) + t2;
TmpRate=TmpRate*SystemData.NetworkPort.ASIRate/65535;
return TmpRate;
}
unsigned short GetPort7InputRate(void)
{
unsigned short Port7InRate;
unsigned char Rate_H,Rate_L;
unsigned short Rate1,Rate2,Rate3;
float Val,t1,t2;
unsigned char Tmp;
Tmp=*(unsigned char *)0x04020B0A;
Rate_L=*(unsigned char *)0x04020B04;
Rate_H=*(unsigned char *)0x04020B05;
Rate1=(((unsigned short)Rate_H)<<8) + Rate_L;
Rate_L=*(unsigned char *)0x04020B08;
Rate_H=*(unsigned char *)0x04020B09;
Rate3=(((unsigned short)Rate_H)<<8) + Rate_L;
if(Rate3==0)
Port7InRate =0;
else
{
t1=(float)Rate1;
t2=(float)Rate3;
Val=t1 / t2;
if(GetNibVer()>=0x12)
Port7InRate = (unsigned short )(Val * 1743) * 447 / 1103 * 100 / 81;
else
Port7InRate = (unsigned short )(Val * 1743) * 447 / 1103;
}
*(unsigned char *)0x04020B0A=0;
*(unsigned char *)0x04020B0A=1;
return Port7InRate;
}
void TK_NibMonitor(void)
{
MESSAGE Msg,PanelMsg;
Packet *PanelPck,*NmPck;
Cmd_Report_Network_Info Cmd;
unsigned char NibState;
unsigned short TmpRate;
unsigned short MaxRate=0;
unsigned short AverageRate;
unsigned short Port7InRate;
int i;
int ThreadHold;
int Alarm;
int CloseAlarm=1;
for(;;)
{
MaxRate=0;
/*------------------------------------------------------------------------*/
/*提取一秒钟内的最大的瞬时码率 */
/*------------------------------------------------------------------------*/
for(i=0;i<29;i++)
{
TmpRate=GetMaxRate();
if(TmpRate>MaxRate)
MaxRate=TmpRate;
my_Delay(10);/*by xu*/
}
/*-----------------------------------------------------------------------*/
/*读取NIB状态 */
/*-----------------------------------------------------------------------*/
NibState=GetNibState();
/*-----------------------------------------------------------------------*/
/*统计平均码率 */
/*-----------------------------------------------------------------------*/
AverageRate=GetAverageRate();
/*-----------------------------------------------------------------------*/
/*统计端口7的输入码率 */
/*-----------------------------------------------------------------------*/
Port7InRate=GetPort7InputRate();
Cmd.Port7InRate = Port7InRate;
Cmd.NetworkState = NibState;
Cmd.MaxOutputRate = MaxRate;
Cmd.AverageOutputRate = AverageRate;
#if SC_SD_DEBUG_MODE==DBG_XN
/*Display("nibstate=0x%x,av=%dK,mv=%dK,p7=%dK\n",NibState,AverageRate*100,MaxRate*100,Port7InRate*100);*/
#endif
#if 1
/*-----------------------------------------------------------*/
/*判断是否需要上报告警 */
/*-----------------------------------------------------------*/
Alarm=0;
if(~NibState&0xE0) /*高三位为0 */
{
Alarm=1;
}
else
{
ThreadHold=SystemData.NetworkPort.PCRDelay/20;
for(i=ThreadHold;i<5;i++)
{
if(~NibState&(0x01<<i))
{
Alarm=1;
break;
}
}
}
if(Alarm)
{
/*-------------------------------------------------------*/
/*屏蔽第一次的告警 */
/*-------------------------------------------------------*/
if(CloseAlarm)
CloseAlarm=0;
else
{
Msg.Flag =0x55185518;
Msg.Length =16;
Msg.MsgType=(~NibState&0x000000FF); /* 位为1表示告警 */
Msg.Pdata =0;
SendQueue(QN_ALARM,(unsigned long *)&Msg);
}
}
#endif
/*-----------------------------------------------------------*/
/* report the information to panel and NM */
/*-----------------------------------------------------------*/
if(PanelOK)
{
/*PanelPck=(Packet *)MemAlloc(RNG2ID,"TK_NibMonitor",sizeof(Packet) - 4 + sizeof(Cmd_Report_Network_Info));*/
PanelPck=(Packet *)BufToReportNibStatePanel;
if(PanelPck!=NULL)
{
PanelPck->Command =COMMAND_REPORT_NIBINFO;
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_Network_Info);
MemCopy((unsigned char *)&PanelPck->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_Network_Info));
PanelMsg.Flag=0x00;
PanelMsg.MsgType=MSG_MONI;
PanelMsg.Length=PanelPck->PacketLength;
PanelMsg.Pdata=(unsigned char *)PanelPck;
SendQueue(QN_PANELSEND,&PanelMsg);
}
}
if(Connected)
{
/*NmPck=(Packet *)MemAlloc(RNG2ID,"TK_NibMonitor",sizeof(Packet) - 4 + sizeof(Cmd_Report_Network_Info));*/
NmPck=(Packet *)BufToReportNibStateNM;
if(NmPck!=NULL)
{
NmPck->Command =COMMAND_REPORT_NIBINFO;
NmPck->DeviceType =DEVICE_TYPE_MULTIPLEXER;
NmPck->DeviceIdt =SystemData.EthernetPara.IP;
NmPck->PacketIdt =0;
NmPck->Result =0;
NmPck->PacketHeadLength=sizeof(Packet)- 4;
NmPck->PacketLength=sizeof(Packet)- 4 + sizeof(Cmd_Report_Network_Info);
MemCopy((unsigned char *)&NmPck->Data,(unsigned char *)&Cmd,sizeof(Cmd_Report_Network_Info));
Msg.Flag=0x00;
Msg.MsgType=MSG_MONI;
Msg.Length=NmPck->PacketLength;
Msg.Pdata=(unsigned char *)NmPck;
SendQueue(QN_TCPIPSEND,&Msg);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -