📄 path_switch.c
字号:
#include <REG54.H>
#include "f2rc7860.h"
#include "rc7860.h"
#include "ep1k50.h"
#include "cmd_para_save.h"
unsigned char xdata path_switch_state[63] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
//通道倒换标志位,0主用到备用强制倒换,1备用到主用强制倒换,2自动倒换状态
unsigned char xdata path_switch_array[4][63][4] = {{{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}},
{{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}},
{{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}},
{{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}};
//光口保护倒换数组,第一维4表示哪个主用光口,第二维63表示时隙值,
//第三维倒换信息:第1位表示备用光口、第2位表示被保护光口、第3位表示上行并发光口、第4位表示该主用光口连接状态
unsigned char xdata port_reg[63];
unsigned char xdata bboardid; //备用盘号
unsigned char xdata bportid; //备用端口号
unsigned char xdata btimeid; //备用时隙号
unsigned char xdata mboardid; //主用盘号
unsigned char xdata mportid; //主用端口号
unsigned char xdata mtimeid; //主用时隙号
unsigned char xdata auto_path_port = 0xFF;
extern unsigned long int xdata commandid;
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern void SetExtRdyTbl(Uchar prio) 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 xdata start_flg[4];
extern unsigned char ais_reg[4][8];
extern unsigned char xdata test_reg[24];
extern unsigned char xdata init_temp; //初始化完成标志位(即C82命令完成)
unsigned char path_switch_function(unsigned char inport,unsigned char TU12ID,unsigned char outport) large reentrant {
//通道倒换子函数
volatile unsigned char return_value;
unsigned char xdata *valueid;
unsigned char xdata value;
unsigned char xdata quotient;
unsigned char xdata residue;
quotient = TU12ID >> 3; //得到该时隙所在的字节值(同timeid / 8运算)
residue = TU12ID & 0x07; //同timeid % 8运算
residue = 7 - residue; //得到该时隙所在的bit位
switch(inport){ //判断被倒换的光口是否正常,可以倒换
case 0: valueid = (quotient + 0x88A6);
value = ((*valueid) >> residue) & 0x01; //如果该时隙出现AIS
if (value != 0){ //该时隙不能倒换
return_value = 2;
}
else{
PTUN(outport,TU12ID)=0;
return_value = 0;
}
break;
case 1: valueid = (quotient + 0x8AA6);
value = ((*valueid) >> residue) & 0x01;
if (value != 0){
return_value = 2;
}
else{
PTUN(outport,TU12ID) = 1;
return_value = 0;
}
break;
case 2: value = f2rc7860_rd(quotient + 0x00A6);
value = (value >> residue) & 0x01;
if (value != 0){
return_value = 2;
}
else{
PTUN(outport,TU12ID)=2;
return_value = 0;
}
break;
case 3: value = f2rc7860_rd(quotient + 0x02A6);
value = (value >> residue) & 0x01;
if (value != 0){
return_value = 2;
}
else{
PTUN(outport,TU12ID)=3;
return_value = 0;
}
break;
default: return_value = 2;
break;
}
/* if (inport >= 0 & inport < 4){
PTUN(outport,TU12ID) = inport;
return_value = 0;
}
else return_value = 2;
*/ return (return_value);
}
unsigned char get_solt_working(unsigned char out_board,unsigned char out_port,unsigned char out_time){
//取得所要查询的时隙的当前连接
unsigned char xdata port; //1K50中的输出端口
unsigned char xdata mport; //1K50中的输入端口
switch(out_board){ //将输出盘号端口号转换成为1K50中的输出端口号
case 1: port = 5;
break;
case 2: port = 6;
break;
case 3: port = 4;
break;
case 4: if(out_port == 1){
port = 2;
}
else port = 3;
break;
case 5: if(out_port == 1){
port = 0;
}
else port = 1;
break;
default: break;
}
switch (port){ //得到1K50中的当前输入端口
case 0: mport = XBYTE[0x8C00 + out_time - 1];
break;
case 1: mport = XBYTE[0x8C40 + out_time - 1];
break;
case 2: mport = XBYTE[0x8C80 + out_time - 1];
break;
case 3: mport = XBYTE[0x8CC0 + out_time - 1];
break;
case 4: mport = XBYTE[0x8D00 + out_time - 1];
break;
case 5: mport = XBYTE[0x8D40 + out_time - 1];
break;
case 6: mport = XBYTE[0x8D80 + out_time - 1];
break;
default: break;
}
return (mport);
}
unsigned char get_path_switch(struct cmd_para_save *path_switch){
//C50 MCP读取通道倒换情况
unsigned char xdata boardid;
unsigned char xdata portid;
unsigned char xdata timeid;
unsigned char xdata mport;
unsigned char xdata return_value;
boardid = path_switch -> path_table_swget_board; //输出盘号
portid = path_switch -> path_table_swget_port; //输出端口号
timeid = path_switch -> path_table_swget_slot; //输出时隙
btimeid = timeid;
if (timeid > 0 & timeid < 64){
mport = get_solt_working(boardid,portid,timeid); //得到所保护的输出时隙的输入端口
switch (path_switch_array[mport][timeid - 1][0]){ //转换主用表中的端口信息上报MCP
case 0: bboardid = 5;
bportid = 1;
return_value = 0;
break;
case 1: bboardid = 5;
bportid = 2;
return_value = 0;
break;
case 2: bboardid = 4;
bportid = 1;
return_value = 0;
break;
case 3: bboardid = 4;
bportid = 2;
return_value = 0;
break;
case 0xff: bboardid = 0;
bportid = 0;
return_value = 0;
break;
default:bboardid = 0;
bportid = 0;
return_value = 0;
break;
}
}
else return_value = 2;
if (!GetResRdyTbl(21))
SetResRdyTbl(21);
return (return_value);
}
void report_path_switch_table(unsigned char value,unsigned char bboard,unsigned char bport,unsigned char btime){
//C50回应函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x43;
tx_buf[4] = 0x35;
tx_buf[5] = 0x30;
tx_buf[6] = '0';
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = '7';
tx_buf[10] = value + 0x30;
tx_buf[11] = bboard + 0x30;
if (bboard == 5){
tx_buf[12] = '1';
}
else if(bboard == 4){
tx_buf[12] = '4';
}
else tx_buf[12] = '0';
tx_buf[13] = '0';
tx_buf[14] = bport + 0x30;
tx_buf[15] = (btime / 10) + 0x30;
tx_buf[16] = (btime % 10) + 0x30;
tx_buf[17] = '*';
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;
}
unsigned char set_path_switch(struct cmd_para_save *path_switch){
//C51 设置通道倒换表
unsigned char xdata boardid;
unsigned char xdata portid;
unsigned char xdata timeid;
unsigned char xdata port;
unsigned char xdata bboardid2;
unsigned char xdata bportid2;
unsigned char xdata btimeid2;
unsigned char xdata mport;
unsigned char xdata return_value;
commandid = 0x00433531;
boardid = path_switch -> path_table_swset_board; //输出盘号
portid = path_switch -> path_table_swset_port; //输出端口号
timeid = path_switch -> path_table_swset_slot; //输出时隙号
bboardid = path_switch -> path_table_swset_Bboard; //备用盘号(下行光口发2M收)
bportid = path_switch -> path_table_swset_Bport; //备用端口号(下行光口发2M收)
btimeid = path_switch -> path_table_swset_Bslot; //备用时隙号(下行光口发2M收)
bboardid2 = path_switch -> path_table_swset_Bboard2; //备用盘号(上行2M发光口收)
bportid2 = path_switch -> path_table_swset_Bport2; //备用端口号(上行2M发光口收)
btimeid2 = path_switch -> path_table_swset_Bslot2; //备用时隙号(上行2M发光口收)
if (timeid > 0 & timeid < 64){
mport = get_solt_working(boardid,portid,timeid); //得到所保护的输出时隙的输入端口
switch (bboardid){ //得到备用端口在1K50上的端口值
case 0: bportid = 0xff;
break;
case 4: if (bportid == 1){
bportid = 2;
}
else bportid = 3;
break;
case 5: if (bportid == 1){
bportid = 0;
}
else bportid = 1;
break;
default: break;
}
switch (bboardid2){ //得到备用端口在1K50上的端口值
case 0: bportid2 = 0xff;
break;
case 4: if (bportid2 == 1){
bportid2 = 2;
}
else bportid2 = 3;
break;
case 5: if (bportid2 == 1){
bportid2 = 0;
}
else bportid2 = 1;
break;
default: break;
}
switch(boardid){ //将输出盘号端口号转换成为1K50中的输出端口号
case 1: port = 5;
break;
case 2: port = 6;
break;
case 3: port = 4;
break;
case 4: if(portid == 1){
port = 2;
}
else port = 3;
break;
case 5: if(portid == 1){
port = 0;
}
else port = 1;
break;
default: break;
}
switch (mport){ //填写光口保护倒换表
case 0: path_switch_array[0][timeid - 1][0] = bportid; //填写MCB光口1的供倒换光口
path_switch_array[0][timeid - 1][1] = port; //填写MCB光口1的被保护光口
path_switch_array[0][timeid - 1][2] = bportid2; //填写被保护光口的上行并发光口
path_switch_array[0][timeid - 1][3] = 1; //光口是否连接的标志位,1表示有连接
if (bportid != 0xff){
path_switch_array[bportid][timeid - 1][0] = 0; //填写供倒换光口
path_switch_array[bportid][timeid - 1][1] = port;
path_switch_array[bportid][timeid - 1][2] = 0;
path_switch_array[bportid][timeid - 1][3] = 0;
}
else {
path_switch_array[bportid2][timeid - 1][0] = 0xff; //填写供倒换光口
path_switch_array[bportid2][timeid - 1][1] = port;
path_switch_array[bportid2][timeid - 1][2] = 0xff;
path_switch_array[bportid2][timeid - 1][3] = 0;
}
break;
case 1: path_switch_array[1][timeid - 1][0] = bportid; //填写MCB光口2的供倒换光口
path_switch_array[1][timeid - 1][1] = port; //填写MCB光口2的被保护光口
path_switch_array[1][timeid - 1][2] = bportid2; //填写被保护光口的上行并发光口
path_switch_array[1][timeid - 1][3] = 1;
if (bportid != 0xff){
path_switch_array[bportid][timeid - 1][0] = 1;
path_switch_array[bportid][timeid - 1][1] = port;
path_switch_array[bportid][timeid - 1][2] = 1;
path_switch_array[bportid][timeid - 1][3] = 0;
}
else {
path_switch_array[bportid2][timeid - 1][0] = 0xff; //填写供倒换光口
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -