📄 loop.c
字号:
#include <REG54.H>
#include "ep1k50.h"
#include "se0111.h"
#include "rc7820.h"
#include "f2rc7820.h"
#include "cmd_para_save.h"
#include "se0121.h"
extern unsigned char f2rc7820_rd(unsigned char f2addr) large reentrant;
extern void f2rc7820_wr(unsigned char f2addr,unsigned char value) large reentrant;
unsigned char xdata lparrayf[4]={0,0,0,0}; //光口环回状态存储数组
unsigned char xdata lparray_EOS[3] = {0,0,0};
unsigned char xdata lparray2m[3][21]={{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盘1的21路支路环回状态存储数组
extern void se0111_reg_wr(unsigned char Haddr,unsigned char Laddr,unsigned char value,unsigned char slot);
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 void se0121_reg_wr(unsigned char Laddr,unsigned char value,unsigned char slot);
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
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 long int xdata commandid; //表示命令代码的变量
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
unsigned char get_port_lpstat(struct cmd_para_save *get_portloop){
//C40读取环回状态函数,返回值0无环回、1近端环回、2远端环回、3以太网接口环回、4SDH接口环回、5命令无法执行
unsigned char xdata boardid; //盘号
unsigned char xdata portid; //端口号
unsigned char xdata timeid; //时隙号
unsigned char xdata returnvalue; //返回值
unsigned char xdata i;
boardid = get_portloop -> lpget_stat_board;
portid = get_portloop -> lpget_stat_port;
timeid = get_portloop -> lpget_stat_slot;
i = boardid;
switch (boardid){
case 1:
case 2:
case 3: if (start_flg[i] == 0){
returnvalue = lparray2m[i-1][portid-1]; //得到2M盘的端口的环回状态
}
else if (start_flg_EOS[i] == 0){
returnvalue = lparray_EOS[i-1];
}
else returnvalue = 5;
break;
/* case 1: if (start_flg[1] == 0){
returnvalue = lparray2m[0][portid-1]; //得到2M盘1的端口的环回状态
}
else returnvalue = 5;
break;
case 2: if (start_flg[2] == 0){
returnvalue = lparray2m[1][portid-1];
}
else returnvalue = 5;
break;
case 3: if (start_flg[3] == 0){
returnvalue = lparray2m[2][portid-1];
}
else returnvalue = 5;
break;
*/ case 4: if (start_flg[0] == 0){
if (portid == 1){ //得到光分支盘光口1的环回状态
returnvalue = lparrayf[2];
}
else if (portid == 2){ //得到光分支盘光口2的环回状态
returnvalue = lparrayf[3];
}
else returnvalue = 3;
}
else returnvalue = 3;
break;
case 5: if (portid == 1){
returnvalue = lparrayf[0];
}
else if (portid == 2){
returnvalue = lparrayf[1];
}
else returnvalue = 5;
break;
default:returnvalue = 5;
break;
}
if (!GetResRdyTbl(20))
SetResRdyTbl(20);
return (returnvalue);
}
void report_port_lpstat(unsigned char lp_state){
//C40回应函数
tx_buf[0] = '$';
tx_buf[1] = '2';
tx_buf[2] = '1';
tx_buf[3] = 0x43;
tx_buf[4] = 0x34;
tx_buf[5] = 0x30;
tx_buf[6] = '0';
tx_buf[7] = '0';
tx_buf[8] = '0';
tx_buf[9] = '2';
if (lp_state >= 5){
tx_buf[10] = '2';
}
else tx_buf[10] = '0';
tx_buf[11] = lp_state + 0x30;
tx_buf[12] = '*';
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_port_loopback(struct cmd_para_save *set_portloop){
//C41配置端口环回函数
unsigned char xdata outporth; //Mapper中支路的高8位地址
unsigned char xdata outportl; //Mapper中支路的低8位地址
unsigned char xdata value;
unsigned char xdata boardid; //盘号
unsigned char xdata board_type; //盘类型
unsigned char xdata portid; //端口号
unsigned char xdata timeid; //时隙号
unsigned char xdata lpstat; //设置环回类型值
unsigned char xdata returnvalue; //返回值
unsigned char xdata i;
commandid = 0x00433431;
boardid = set_portloop -> lpset_stat_board;
board_type = set_portloop -> lpset_stat_board_type;
portid = set_portloop -> lpset_stat_port;
timeid = set_portloop -> lpset_stat_slot;
lpstat = set_portloop -> lpset_stat_type;
i = boardid;
switch (portid){ //得出Mapper中的支路号
case 1: outporth=0; //??无法确定0050在新片中的地址
outportl=0x50;
break;
case 2: outporth=0;
outportl=0x80;
break;
case 3: outporth=0;
outportl=0xB0;
break;
case 4: outporth=0;
outportl=0xE0;
break;
case 5: outporth=0x08;
outportl=0x50;
break;
case 6: outporth=0x08;
outportl=0x80;
break;
case 7: outporth=0x08;
outportl=0xB0;
break;
case 8: outporth=0x08;
outportl=0xE0;
break;
case 9: outporth=0x10;
outportl=0x50;
break;
case 10: outporth=0x10;
outportl=0x80;
break;
case 11: outporth=0x10;
outportl=0xB0;
break;
case 12: outporth=0x10;
outportl=0xE0;
break;
case 13: outporth=0x18;
outportl=0x50;
break;
case 14: outporth=0x18;
outportl=0x80;
break;
case 15: outporth=0x18;
outportl=0xB0;
break;
case 16: outporth=0x18;
outportl=0xE0;
break;
case 17: outporth=0x20;
outportl=0x50;
break;
case 18: outporth=0x20;
outportl=0x80;
break;
case 19: outporth=0x20;
outportl=0xB0;
break;
case 20: outporth=0x20;
outportl=0xE0;
break;
case 21: outporth=0x28;
outportl=0x50;
break;
default: break;
}
switch (boardid){
case 1:
case 2:
case 3: if((start_flg[i] == 0) & (board_type == 2)){
value = se0111_reg_rd(outporth,outportl,i); //2M盘1
value &= 0x3F;
switch (lpstat){
case 0: se0111_reg_wr(outporth,outportl,value,i);//??0050地址对应问题 //环回清除
lparray2m[i-1][portid-1] = 0;
returnvalue = 0;
break;
case 1: value |= 0x80; //近端环回
se0111_reg_wr(outporth,outportl,value,i);
lparray2m[i-1][portid-1] = 1;
returnvalue = 0;
break;
case 2: value |= 0x40; //远端环回
se0111_reg_wr(outporth,outportl,value,i);
lparray2m[i-1][portid-1] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else if ((start_flg_EOS[i] == 0) & (board_type == 3))
{
switch (lpstat){
case 0: value = se0121_reg_rd(E_cortrol,i); //取消以太网接口部分环回
value &= 0xBF;
se0121_reg_wr(E_cortrol,value,i);
value = se0121_reg_rd(Eos_loop_AIS,i); //取消SDH接口部分环回
value &= 0xEF;
se0121_reg_wr(Eos_loop_AIS,value,i);
lparray_EOS[i-1] = 0;
returnvalue = 0;
break;
case 3: value = se0121_reg_rd(E_cortrol,i); //以太网接口部分环回
value |= 0x40;
se0121_reg_wr(E_cortrol,value,i);
lparray_EOS[i-1] = 3;
returnvalue = 0;
break;
case 4: value = se0121_reg_rd(Eos_loop_AIS,i); //SDH接口部分环回
value |= 0x10;
se0121_reg_wr(Eos_loop_AIS,value,i);
lparray_EOS[i-1] = 4;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else returnvalue = 2;
break;
/* case 1: if (start_flg[1] ==0){
value = se0111_reg_rd(outporth,outportl,1); //2M盘1
value &= 0x3F;
switch (lpstat){
case 0: //value &= 0x3F; //环回清除
se0111_reg_wr(outporth,outportl,value,1);
lparray2m[0][portid-1] = 0;
returnvalue = 0;
break;
case 1: value |= 0x80; //近端环回
se0111_reg_wr(outporth,outportl,value,1);
lparray2m[0][portid-1] = 1;
returnvalue = 0;
break;
case 2: value |= 0x40; //远端环回
se0111_reg_wr(outporth,outportl,value,1);
lparray2m[0][portid-1] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else returnvalue = 2;
break;
case 2: if (start_flg[2] ==0){
value = se0111_reg_rd(outporth,outportl,2);
value &= 0x3F;
switch (lpstat){
case 0: //value &= 0x3F;
se0111_reg_wr(outporth,outportl,value,2);
lparray2m[1][portid-1] = 0;
returnvalue = 0;
break;
case 1: value |= 0x80;
se0111_reg_wr(outporth,outportl,value,2);
lparray2m[1][portid-1] = 1;
returnvalue = 0;
break;
case 2: value |= 0x40;
se0111_reg_wr(outporth,outportl,value,2);
lparray2m[1][portid-1] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else returnvalue = 2;
break;
case 3: if (start_flg[3] ==0){
value = se0111_reg_rd(outporth,outportl,3);
value &= 0x3F;
switch (lpstat){
case 0: //value &= 0x3F;
se0111_reg_wr(outporth,outportl,value,3);
lparray2m[2][portid-1] = 0;
returnvalue = 0;
break;
case 1: value |= 0x80;
se0111_reg_wr(outporth,outportl,value,3);
lparray2m[2][portid-1] = 1;
returnvalue = 0;
break;
case 2: value |= 0x40;
se0111_reg_wr(outporth,outportl,value,3);
lparray2m[2][portid-1] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else returnvalue = 2;
break;
*/ case 4: if (start_flg[0] ==0){
if (portid == 1){ //光分支盘
switch (lpstat){
case 0: if (lparrayf[2] == 2){
for (value = 0; value <=62; value++){
PTUN(2,value) = 0xFF;
}
}
else {
value = f2rc7820_rd(F2Loopback_reg) & 0x0F;
f2rc7820_wr(F2Loopback_reg,value);
}
lparrayf[2] = 0; //保存环回类型为无环回
returnvalue = 0;
break;
case 1: value = f2rc7820_rd(F2Loopback_reg) & 0x0F;
value |= 0x30;
f2rc7820_wr(F2Loopback_reg,value);
lparrayf[2] = 1; //保存环回类型为近端环回
returnvalue = 0;
break;
case 2: for (value = 0; value <=62; value++){ //设置保存环回类型为远端环回
PTUN(2,value) = 2;
}
lparrayf[2] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else if (portid == 2){
switch (lpstat){
case 0: if (lparrayf[3] == 2){
for (value = 0; value <=62; value++){
PTUN(3,value) = 0xFF;
}
}
else {
value = f2rc7820_rd(F2Loopback_reg) & 0xF0;
f2rc7820_wr(F2Loopback_reg,value);
}
lparrayf[3] = 0; //保存环回类型为无环回
returnvalue = 0;
break;
case 1: value = f2rc7820_rd(F2Loopback_reg) & 0xF0;
value |= 0x03;
f2rc7820_wr(F2Loopback_reg,value);
lparrayf[3] = 1; //保存环回类型为近端环回
returnvalue = 0;
break;
case 2: for (value = 0; value <=62; value++){
PTUN(3,value) = 3;
}
lparrayf[3] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else returnvalue = 2;
}
else returnvalue = 2;
break;
case 5: if (portid == 1){
switch (lpstat){
case 0: if (lparrayf[0] == 2){
for (value = 0; value <=62; value++){
PTUN(0,value) = 0xFF;
}
}
else {
value = Loopback_reg & 0x0F;
Loopback_reg = value;
}
lparrayf[0] = 0; //保存环回类型为无环回
returnvalue = 0;
break;
case 1: value = Loopback_reg & 0x0F;
value |= 0x30;
Loopback_reg = value;
lparrayf[0] = 1; //保存环回类型为近端环回
returnvalue = 0;
break;
case 2: for (value = 0; value <=62; value++){
PTUN(0,value) = 0;
}
lparrayf[0] = 2;
returnvalue = 0;
break;
default: returnvalue = 2;
break;
}
}
else if (portid == 2){
switch (lpstat){
case 0: if (lparrayf[1] == 2){
for (value = 0; value <=62; value++){
PTUN(1,value) = 0xFF;
}
}
else {
value = Loopback_reg & 0xF0;
Loopback_reg = value;
}
lparrayf[1] = 0; //保存环回类型为无环回
returnvalue = 0;
break;
case 1: value = Loopback_reg & 0xF0;
value |= 0x03;
Loopback_reg = value;
lparrayf[1] = 1; //保存环回类型为近端环回
returnvalue = 0;
break;
case 2: for (value = 0; value <=62; value++){
PTUN(1,value) = 1;
}
lparrayf[1] = 2;
returnvalue = 0;
break;
default:returnvalue = 2;
break;
}
}
else returnvalue = 2;
break;
default:returnvalue = 2;
break;
}
if (!GetResRdyTbl(1))
SetResRdyTbl(1);
return (returnvalue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -