📄 alarm.c.bak
字号:
#include <REG54.H>
#include "rc7820.h"
#include "rc7860.h"
#include "f2rc7820.h"
#include "f2rc7860.h"
#include "se0111.h"
#include "se0121.h"
#include "cmd_para_save.h"
extern unsigned long int xdata commandid; //表示命令代码的变量
extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern unsigned char f2rc7860_rd(unsigned int f2addr) large reentrant;
extern void f2rc7860_wr(unsigned int f2addr,unsigned char value) large reentrant;
extern unsigned char se0111_reg_rd(unsigned char Haddr,unsigned char Laddr,unsigned char slot);
extern unsigned char se0121_reg_rd(unsigned char Laddr,unsigned char slot);
extern unsigned char get_clock_state(unsigned char clksource);
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
extern unsigned char xdata start_flg[4];
extern unsigned char xdata start_flg_EOS[4];
extern unsigned char xdata board_type[4][2]; //定义插盘类型数组,第一位表示槽号,第二位表示盘号
extern unsigned char xdata clk_source;
extern unsigned char xdata timeslot_2M[3][21]; //2M时隙配置标志位,1表示配置时隙,0表示该时隙删除
unsigned char xdata LOS_TU_2M[3][21]; //硬件电路检测的支路信号LOS
unsigned char xdata int_alarm[4][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};
//保存中断告警数组,行表示某光口,列表示该光口的告警值
unsigned char xdata check_alarm_mcb[5] = {0,0,0,0,0}; //查询MCB盘的其他非中断告警
unsigned char xdata check_alarm_otb[3] = {0,0,0}; //查询OTB盘的其他非中断告警
unsigned char xdata check_alarm_2M[3][21][2] = {{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}},{{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}};
//保存2M盘告警数组,[3]表示3个2M盘,[21]表示21个支路,[2]表示告警值
unsigned char xdata frame_flg_before[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //告警标志位,一秒前的
unsigned char xdata frame_flg_work[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //告警标志位,当前一秒的
unsigned char xdata check_alarm_Eos[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
//保存Eos盘的告警数组,第一个[3]表示3个Eos盘,后一个[3]表示告警的内容
unsigned char xdata frame_flg_before_eos[3] = {0,0,0};
unsigned char xdata frame_flg_work_eos[3] = {0,0,0};
void get_2M_reg(unsigned char tnum,unsigned char addrh1,unsigned char addrl1,unsigned char addrh2,unsigned char addrl2,unsigned char slot){
//取2M盘的告警寄存器值存入数组,tnum表示支路号,slot表示2M盘号
if (timeslot_2M[slot][tnum]){
check_alarm_2M[slot][tnum][0] = se0111_reg_rd(addrh1,addrl1,slot + 1) & 0xCC; //得到2M盘支路1的AIS、LOP、RDI、RFI
if (check_alarm_2M[slot][tnum][0] >= 0x80){
check_alarm_2M[slot][tnum][0] = 0x80;
}
else if (check_alarm_2M[slot][tnum][0] >= 0x40){
check_alarm_2M[slot][tnum][0] = 0x40;
}
if (se0111_reg_rd(addrh2,addrl2,slot + 1) == 0){ //判断V5字节的bit7-5,是否有未装载信号
check_alarm_2M[slot][tnum][0] |= 0x20;
}
if (LOS_TU_2M[slot][tnum] != 0){ //判断硬件是否出现该支路的LOS
check_alarm_2M[slot][tnum][0] |= 0x10;
}
}
else check_alarm_2M[slot][tnum][0] = 0;
}
void get_alarm_value(void){
//每秒收集各类告警函数
unsigned char xdata temp;
unsigned char xdata bnum;
unsigned char xdata i;
unsigned char xdata j;
unsigned char xdata k;
int_alarm[0][3] = (Ia3_a >> 4) & 0x03;
Intmask3_a = Ia3_a;
int_alarm[0][2] = Ia2_a & 0xF8;
Intmask2_a = Ia2_a;
int_alarm[0][1] = Ia1_a & 0xF0;
Intmask1_a = Ia1_a;
int_alarm[0][0] = Ia0_a; //光口0中断写入数组
Intmask0_a = Ia0_a; //同时将中断值写入屏蔽寄存器
frame_flg_work[0] = int_alarm[0][0] | int_alarm[0][1] | int_alarm[0][2] | int_alarm[0][3]; //当前是否有告警
int_alarm[1][3] = (Ia3_b >> 4) & 0x03;
Intmask3_b = Ia3_b;
int_alarm[1][2] = Ia2_b & 0xF8;
Intmask2_b = Ia2_b;
int_alarm[1][1] = Ia1_b & 0xF0;
Intmask1_b = Ia1_b;
int_alarm[1][0] = Ia0_b; //光口1中断
Intmask0_b = Ia0_b;
frame_flg_work[1] = int_alarm[1][0] | int_alarm[1][1] | int_alarm[1][2] | int_alarm[1][3];
if (start_flg[0] == 0){
temp = f2rc7860_rd(F2Ia0_a); //光口2中断,即光分支盘光口1
f2rc7860_wr(F2Intmask0_a,temp);
int_alarm[2][0] = temp;
temp = f2rc7860_rd(F2Ia1_a);
f2rc7860_wr(F2Intmask1_a,temp);
int_alarm[2][1] = temp & 0xF0;
temp = f2rc7860_rd(F2Ia2_a);
f2rc7860_wr(F2Intmask2_a,temp);
int_alarm[2][2] = temp & 0xF8;
temp = f2rc7860_rd(F2Ia3_a);
f2rc7860_wr(F2Intmask3_a,temp);
int_alarm[2][3] = (temp >> 4) & 0x03;
frame_flg_work[2] = int_alarm[2][0] | int_alarm[2][1] | int_alarm[2][2] | int_alarm[2][3];
temp = f2rc7860_rd(F2Ia0_b); //光口3中断,即光分支盘光口2
f2rc7860_wr(F2Intmask0_b,temp);
int_alarm[3][0] = temp;
temp = f2rc7860_rd(F2Ia1_b);
f2rc7860_wr(F2Intmask1_b,temp);
int_alarm[3][1] = temp & 0xF0;
temp = f2rc7860_rd(F2Ia2_b);
f2rc7860_wr(F2Intmask2_b,temp);
int_alarm[3][2] = temp & 0xF8;
temp = f2rc7860_rd(F2Ia3_b);
f2rc7860_wr(F2Intmask3_b,temp);
int_alarm[3][3] = (temp >> 4) & 0x03;
frame_flg_work[3] = int_alarm[3][0] | int_alarm[3][1] | int_alarm[3][2] | int_alarm[3][3];
f2rc7860_wr(F2Rdint_clr,0x40);
}
check_alarm_mcb[0] = (Reflos_reg1 >> 4) & 0x0C; //MCB盘其它告警查询,时钟丢失查询
check_alarm_mcb[1] = Reflos_reg2 & 0x0A;
check_alarm_mcb[2] &= 0x02; //清除MCB盘时钟源丢失
temp = get_clock_state(clk_source);
if (temp >> 4 == 0){
check_alarm_mcb[2] |= 0x01; //将时钟源状态写入数组
}
frame_flg_work[4] = check_alarm_mcb[0] | check_alarm_mcb[1] | check_alarm_mcb[2] |check_alarm_mcb[3] | check_alarm_mcb[4];
temp = (f2rc7820_rd(F2Reflos_reg1) >> 4) & 0x08; //OTB盘其它告警查询,时钟丢失查询
temp |= (f2rc7820_rd(F2Reflos_reg1) >> 4) & 0x04;
check_alarm_otb[0] = temp;
frame_flg_work[5] = check_alarm_otb[0] |check_alarm_otb[1] |check_alarm_otb[2];
P1 = 0x20; //得到2M盘1的21个支路los信号
for (temp = 0; temp <= 7; temp++){
LOS_TU_2M[0][temp] = (XBYTE[0xA000] >> temp) & 0x01;
LOS_TU_2M[0][temp + 8] = (XBYTE[0xAC00] >> temp) & 0x01;
}
LOS_TU_2M[0][16] = XBYTE[0xB000] & 0x01;
LOS_TU_2M[0][17] = (XBYTE[0xB000] >> 1) & 0x01;
LOS_TU_2M[0][18] = (XBYTE[0xB000] >> 2) & 0x01;
LOS_TU_2M[0][19] = (XBYTE[0xB000] >> 3) & 0x01;
LOS_TU_2M[0][20] = (XBYTE[0xB000] >> 4) & 0x01;
P1 = 0x60; //得到2M盘2的21个支路los信号
for (temp = 0; temp <= 7; temp++){
LOS_TU_2M[1][temp] = (XBYTE[0xA000] >> temp) & 0x01;
LOS_TU_2M[1][temp + 8] = (XBYTE[0xAC00] >> temp) & 0x01;
}
LOS_TU_2M[1][16] = XBYTE[0xB000] & 0x01;
LOS_TU_2M[1][17] = (XBYTE[0xB000] >> 1) & 0x01;
LOS_TU_2M[1][18] = (XBYTE[0xB000] >> 2) & 0x01;
LOS_TU_2M[1][19] = (XBYTE[0xB000] >> 3) & 0x01;
LOS_TU_2M[1][20] = (XBYTE[0xB000] >> 4) & 0x01;
P1 = 0x40; //得到2M盘3的21个支路los信号
for (temp = 0; temp <= 7; temp++){
LOS_TU_2M[2][temp] = (XBYTE[0xA000] >> temp) & 0x01;
LOS_TU_2M[2][temp + 8] = (XBYTE[0xAC00] >> temp) & 0x01;
}
LOS_TU_2M[2][16] = XBYTE[0xB000] & 0x01;
LOS_TU_2M[2][17] = (XBYTE[0xB000] >> 1) & 0x01;
LOS_TU_2M[2][18] = (XBYTE[0xB000] >> 2) & 0x01;
LOS_TU_2M[2][19] = (XBYTE[0xB000] >> 3) & 0x01;
LOS_TU_2M[2][20] = (XBYTE[0xB000] >> 4) & 0x01;
P1 = 0xFF;
for (bnum = 0; bnum <= 2; bnum++){
if (start_flg[bnum + 1] == 0){ //判断2M盘是否在盘位上
k = 0;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 4; j++)
{
get_2M_reg(k,Stat_Arx_0H + (i * 8),Stat_Arx_0L + (j * 0x30),V5_Arx_0H + (i * 8),V5_Arx_0L + (j * 0x30),bnum);
k += 1;
}
}
get_2M_reg(20,Stat_Arx_20H,Stat_Arx_20L,V5_Arx_20H,V5_Arx_20L,bnum);
/***************************************************************************
get_2M_reg(0,Stat_Arx_0H,Stat_Arx_0L,V5_Arx_0H,V5_Arx_0L,bnum);
get_2M_reg(1,Stat_Arx_1H,Stat_Arx_1L,V5_Arx_1H,V5_Arx_1L,bnum);
get_2M_reg(2,Stat_Arx_2H,Stat_Arx_2L,V5_Arx_2H,V5_Arx_2L,bnum);
get_2M_reg(3,Stat_Arx_3H,Stat_Arx_3L,V5_Arx_3H,V5_Arx_3L,bnum);
get_2M_reg(4,Stat_Arx_4H,Stat_Arx_4L,V5_Arx_4H,V5_Arx_4L,bnum);
get_2M_reg(5,Stat_Arx_5H,Stat_Arx_5L,V5_Arx_5H,V5_Arx_5L,bnum);
get_2M_reg(6,Stat_Arx_6H,Stat_Arx_6L,V5_Arx_6H,V5_Arx_6L,bnum);
get_2M_reg(7,Stat_Arx_7H,Stat_Arx_7L,V5_Arx_7H,V5_Arx_7L,bnum);
get_2M_reg(8,Stat_Arx_8H,Stat_Arx_8L,V5_Arx_8H,V5_Arx_8L,bnum);
get_2M_reg(9,Stat_Arx_9H,Stat_Arx_9L,V5_Arx_9H,V5_Arx_9L,bnum);
get_2M_reg(10,Stat_Arx_10H,Stat_Arx_10L,V5_Arx_10H,V5_Arx_10L,bnum);
get_2M_reg(11,Stat_Arx_11H,Stat_Arx_11L,V5_Arx_11H,V5_Arx_11L,bnum);
get_2M_reg(12,Stat_Arx_12H,Stat_Arx_12L,V5_Arx_12H,V5_Arx_12L,bnum);
get_2M_reg(13,Stat_Arx_13H,Stat_Arx_13L,V5_Arx_13H,V5_Arx_13L,bnum);
get_2M_reg(14,Stat_Arx_14H,Stat_Arx_14L,V5_Arx_14H,V5_Arx_14L,bnum);
get_2M_reg(15,Stat_Arx_15H,Stat_Arx_15L,V5_Arx_15H,V5_Arx_15L,bnum);
get_2M_reg(16,Stat_Arx_16H,Stat_Arx_16L,V5_Arx_16H,V5_Arx_16L,bnum);
get_2M_reg(17,Stat_Arx_17H,Stat_Arx_17L,V5_Arx_17H,V5_Arx_17L,bnum);
get_2M_reg(18,Stat_Arx_18H,Stat_Arx_18L,V5_Arx_18H,V5_Arx_18L,bnum);
get_2M_reg(19,Stat_Arx_19H,Stat_Arx_19L,V5_Arx_19H,V5_Arx_19L,bnum);
get_2M_reg(20,Stat_Arx_20H,Stat_Arx_20L,V5_Arx_20H,V5_Arx_20L,bnum);
**********************************************************************************/
}
if (start_flg_EOS[bnum + 1] == 0){
check_alarm_Eos[bnum][0] = se0121_reg_rd(A_AIS,bnum + 1);
check_alarm_Eos[bnum][0] &= 0x1F;
check_alarm_Eos[bnum][1] = se0121_reg_rd(A_LOP,bnum + 1);
check_alarm_Eos[bnum][1] &= 0x1F;
check_alarm_Eos[bnum][2] = se0121_reg_rd(FIFO_flg,bnum + 1);
check_alarm_Eos[bnum][2] &= 0xC0;
}
}
if (!GetResRdyTbl(19)) //设置每秒钟向MCP发送告警事件表
SetResRdyTbl(19);
}
void report_int_alarm(unsigned char portid,unsigned char bufnum){
//发送某一光口的中断告警函数
unsigned char xdata value;
unsigned char xdata num;
for (num = 0; num <= 3; num++){
value = (int_alarm[portid][num] >> 4) & 0x0F;
if (value > 9){
tx_buf[bufnum + 2 * num] = value + 0x37;
}
else tx_buf[bufnum + 2 * num] = value + 0x30;
value = int_alarm[portid][num] & 0x0F;
if (value > 9){
tx_buf[bufnum + 2 * num + 1] = value + 0x37;
}
else tx_buf[bufnum + 2 * num + 1] = value + 0x30;
}
}
void report_int_mcb0(void){
//发送MCB盘的光口1 中断告警函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x46; //送命令符F00
tx_buf[4] = 0x30;
tx_buf[5] = 0x30;
tx_buf[6] = '0'; //信息域长度11
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = 'B';
tx_buf[10] = '5';
tx_buf[11] = '1';
tx_buf[12] = '1';
report_int_alarm(0,13);
tx_buf[21] = '*';
tx_buf_pointer = 0;
while(tx_buf[tx_buf_pointer] != '*'){
SBUF = tx_buf[tx_buf_pointer];
while(tx_done == 0);
tx_done = 0;
tx_buf_pointer++;
}
SBUF = tx_buf[tx_buf_pointer]; //发送最后一个字符'*'
while(tx_done == 0);
tx_done = 0;
}
void report_int_mcb1(void){
//发送MCB盘的光口2中断告警函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x46; //送命令符F00
tx_buf[4] = 0x30;
tx_buf[5] = 0x30;
tx_buf[6] = '0'; //信息域长度11
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = 'B';
tx_buf[10] = '5';
tx_buf[11] = '1';
tx_buf[12] = '2';
report_int_alarm(1,13);
tx_buf[21] = '*';
tx_buf_pointer = 0;
while(tx_buf[tx_buf_pointer] != '*'){
SBUF = tx_buf[tx_buf_pointer];
while(tx_done == 0);
tx_done = 0;
tx_buf_pointer++;
}
SBUF = tx_buf[tx_buf_pointer]; //发送最后一个字符'*'
while(tx_done == 0);
tx_done = 0;
}
void report_int_otb2(void){
//发送OTB盘光口1的中断告警函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x46; //送命令符F00
tx_buf[4] = 0x30;
tx_buf[5] = 0x30;
tx_buf[6] = '0'; //信息域长度11
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = 'B';
tx_buf[10] = '4';
tx_buf[11] = '4';
tx_buf[12] = '1';
report_int_alarm(2,13);
tx_buf[21] = '*';
tx_buf_pointer = 0;
while(tx_buf[tx_buf_pointer] != '*'){
SBUF = tx_buf[tx_buf_pointer];
while(tx_done == 0);
tx_done = 0;
tx_buf_pointer++;
}
SBUF = tx_buf[tx_buf_pointer]; //发送最后一个字符'*'
while(tx_done == 0);
tx_done = 0;
}
void report_int_otb3(void){
//发送OTB盘的光口2中断告警函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x46; //送命令符F00
tx_buf[4] = 0x30;
tx_buf[5] = 0x30;
tx_buf[6] = '0'; //信息域长度11
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = 'B';
tx_buf[10] = '4';
tx_buf[11] = '4';
tx_buf[12] = '2';
report_int_alarm(3,13);
tx_buf[21] = '*';
tx_buf_pointer = 0;
while(tx_buf[tx_buf_pointer] != '*'){
SBUF = tx_buf[tx_buf_pointer];
while(tx_done == 0);
tx_done = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -