⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 path_switch.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 5 页
字号:
								outport = path_switch_array[tport][temp][1];
					    		value = path_switch_function(2,temp,outport);	//进行该时隙的通道倒换
								if (outport < 4){								//光口处于时隙的保换倒换状态
									switch (outport){							//对光口进行并发配置
										case 0: value = path_switch_function(2,temp,1);
												break;
										case 1: value = path_switch_function(2,temp,0);
												break;
										case 2: value = path_switch_function(2,temp,3);
												break;
										case 3: value = path_switch_function(2,temp,2);
												break;
										default:break;
									}
								}
								if (value == 0){								//如果倒换成功
									path_switch_array[tport][temp][3] = 0;		//倒换成功改写当前时隙所用端口
									path_switch_array[2][temp][3] = 1;
								}
							}
						}
					}
				}
				init_recover[2] = 0;
			}
			SetExtRdyTbl(15);											//改写2M盘的AIS速率
		}

		if ((f2rc7860_rd(F2Ia0_b) & 0xD0 | f2rc7860_rd(F2Ia2_b) & 0xE0 | f2rc7860_rd(F2Ia3_b) & 0x80) == 0){			//MCB B口全0
			f2rc7860_wr(F2Intmask_ts0to7_b,0x00);
		    f2rc7860_wr(F2Intmask_ts8to15_b,0x00);
		    f2rc7860_wr(F2Intmask_ts16to23_b,0x00);
		    f2rc7860_wr(F2Intmask_ts24to31_b,0x00);
		    f2rc7860_wr(F2Intmask_ts32to39_b,0x00);
		    f2rc7860_wr(F2Intmask_ts40to47_b,0x00);
		    f2rc7860_wr(F2Intmask_ts48to55_b,0x00);
		    f2rc7860_wr(F2Intmask_ts56to62_b,0x00);
			if (init_recover[2] & init_recover[3]){
				for (temp = 0; temp <= 62; temp++){
					if (path_switch_state[temp] == 2){							//如果处于自动倒换状态
						for (tport = 0; tport <= 3; tport++){					//轮循查找哪个光口的备用光口是OTB光口2
							if (path_switch_array[tport][temp][0] == 3){
								outport = path_switch_array[tport][temp][1];
					    		value = path_switch_function(3,temp,outport);	//进行该时隙的通道倒换
								if (outport < 4){								//光口处于时隙的保换倒换状态
									switch (outport){							//对光口进行并发配置
										case 0: value = path_switch_function(3,temp,1);
												break;
										case 1: value = path_switch_function(3,temp,0);
												break;
										case 2: value = path_switch_function(3,temp,3);
												break;
										case 3: value = path_switch_function(3,temp,2);
												break;
										default:break;
									}
								}
								if (value == 0){								//如果倒换成功
									path_switch_array[tport][temp][3] = 0;		//倒换成功改写当前时隙所用端口
									path_switch_array[3][temp][3] = 1;
								}
							}
						}
					}
				}
				init_recover[3] = 0;
			}
		SetExtRdyTbl(15);											//改写2M盘的AIS速率
		}
	}

}
/*****************************************************************************************************/


void path_switch_mcba(void) large reentrant {
//MCB的A口自动倒换函数
volatile unsigned char timeid;
volatile unsigned char inport;
volatile unsigned char outport;
volatile unsigned char value;

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){							//如果处于自动倒换状态
			if (path_switch_array[0][timeid][3] == 1){					//如果该光口处于连接状态
				inport = path_switch_array[0][timeid][0];				//得到保护的备用光口
				outport = path_switch_array[0][timeid][1];				//得到被保护的光口
   				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
				if (outport < 4){										//光口处于时隙的保换倒换状态
					switch (outport){									//对光口进行并发配置
						case 0: value = path_switch_function(inport,timeid,1);
								break;
						case 1: value = path_switch_function(inport,timeid,0);
								break;
						case 2: value = path_switch_function(inport,timeid,3);
								break;
						case 3: value = path_switch_function(inport,timeid,2);
								break;
						default:break;
					}
				}
				if (value == 0){										//如果倒换成功
					path_switch_array[0][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
					path_switch_array[inport][timeid][3] = 1;
					SetResRdyTbl(28);
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 0;
}
 

void path_switch_mcbb(void) large reentrant {
//MCB的B口自动倒换函数
volatile unsigned char timeid;
volatile unsigned char inport;
volatile unsigned char outport;
volatile unsigned char value;

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){							//如果处于自动倒换状态
			if (path_switch_array[1][timeid][3] == 1){					//如果该光口处于连接状态
				inport = path_switch_array[1][timeid][0];				//得到保护的备用光口
				outport = path_switch_array[1][timeid][1];				//得到被保护的光口
   				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
				if (outport < 4){										//光口处于时隙的保换倒换状态
					switch (outport){									//对光口进行并发配置
						case 0: value = path_switch_function(inport,timeid,1);
								break;
						case 1: value = path_switch_function(inport,timeid,0);
								break;
						case 2: value = path_switch_function(inport,timeid,3);
								break;
						case 3: value = path_switch_function(inport,timeid,2);
								break;
						default:break;
					}
				}
				if (value == 0){										//如果倒换成功
					path_switch_array[1][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
					path_switch_array[inport][timeid][3] = 1;
					SetResRdyTbl(28);
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 1;
}


void path_switch_otba(void) large reentrant {
//OTB的A口自动倒换函数
volatile unsigned char timeid;
volatile unsigned char inport;
volatile unsigned char outport;
volatile unsigned char value;

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){							//如果处于自动倒换状态
			if (path_switch_array[2][timeid][3] == 1){					//如果该光口处于连接状态
				inport = path_switch_array[2][timeid][0];				//得到保护的备用光口
				outport = path_switch_array[2][timeid][1];				//得到被保护的光口
   				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
				if (outport < 4){										//光口处于时隙的保换倒换状态
					switch (outport){									//对光口进行并发配置
						case 0: value = path_switch_function(inport,timeid,1);
								break;
						case 1: value = path_switch_function(inport,timeid,0);
								break;
						case 2: value = path_switch_function(inport,timeid,3);
								break;
						case 3: value = path_switch_function(inport,timeid,2);
								break;
						default:break;
					}
				}
				if (value == 0){										//如果倒换成功
					path_switch_array[2][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
					path_switch_array[inport][timeid][3] = 1;
					SetResRdyTbl(28);
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 2;
}


void path_switch_otbb(void) large reentrant {
//OTB的B口自动倒换函数
volatile unsigned char timeid;									//时隙号
volatile unsigned char inport;
volatile unsigned char outport;
volatile unsigned char value;

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){							//如果处于自动倒换状态
			if (path_switch_array[3][timeid][3] == 1){					//如果该光口处于连接状态
				inport = path_switch_array[3][timeid][0];				//得到保护的备用光口
				outport = path_switch_array[3][timeid][1];				//得到被保护的光口
   				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
				if (outport < 4){										//光口处于时隙的保换倒换状态
					switch (outport){									//对光口进行并发配置
						case 0: value = path_switch_function(inport,timeid,1);
								break;
						case 1: value = path_switch_function(inport,timeid,0);
								break;
						case 2: value = path_switch_function(inport,timeid,3);
								break;
						case 3: value = path_switch_function(inport,timeid,2);
								break;
						default:break;
					}
				}
				if (value == 0){										//如果倒换成功
					path_switch_array[3][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
					path_switch_array[inport][timeid][3] = 1;
					SetResRdyTbl(28);
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 3;
}


void path_switch_mcba_tu(void) large reentrant {
//MCB的A口TU自动倒换函数
//volatile unsigned char xdata value1;										//记录TU-LOP值
//volatile unsigned char xdata value2;										//记录TU-AIS值
volatile unsigned char xdata value;									
volatile unsigned char xdata timeid;										//时隙号
volatile unsigned char xdata inport;
volatile unsigned char xdata outport;
volatile unsigned char xdata quotient;										//除8的商值
volatile unsigned char xdata residue;										//除8的余数值

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){								//如果处于自动倒换状态
			if (path_switch_array[0][timeid][3] == 1){						//当前时隙工作在A口上
				quotient = timeid >> 3;										//得到该时隙所在的字节值(同timeid / 8运算)
	  			residue = timeid & 0x07;									//同timeid % 8运算
	  			residue = 7 - residue;                     		 			//得到该时隙所在的bit位
	  			value = ais_reg[0][quotient] | XBYTE[quotient + 0x88A6];
	  			value = (value >> residue) & 0x01;
				if (value){
					inport = path_switch_array[0][timeid][0];				//得到保护的备用光口
					outport = path_switch_array[0][timeid][1];				//得到被保护的光口
    				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
//					test_reg[4] += 1;
					if (outport < 4){										//光口处于时隙的保换倒换状态
						switch (outport){									//对光口进行并发配置
							case 0: value = path_switch_function(inport,timeid,1);
									break;
							case 1: value = path_switch_function(inport,timeid,0);
									break;
							case 2: value = path_switch_function(inport,timeid,3);
									break;
							case 3: value = path_switch_function(inport,timeid,2);
									break;
							default:break;
						}
					}
					if (value == 0){										//如果倒换成功
						path_switch_array[0][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
						path_switch_array[inport][timeid][3] = 1;
						SetResRdyTbl(28);
					}
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 0;
//	for (timeid = 0; timeid <= 7; timeid++){
//		test_reg[8 + timeid] = XBYTE[timeid + 0x88A6];
//		test_reg[16 + timeid] = XBYTE[timeid + 0x8AA6];
//	}
}


void path_switch_mcbb_tu(void) large reentrant {
//MCB的B口TU自动倒换函数
//unsigned char xdata value1;												//记录TU-LOP值
//unsigned char xdata value2;												//记录TU-AIS值
unsigned char xdata value;									
unsigned char xdata timeid;													//时隙号
unsigned char xdata inport;
unsigned char xdata outport;
unsigned char xdata quotient;												//除8的商值
unsigned char xdata residue;												//除8的余数值

	for (timeid = 0; timeid <= 62; timeid++){
		if (path_switch_state[timeid] == 2){								//如果处于自动倒换状态
			if (path_switch_array[1][timeid][3] == 1){						//当前时隙工作在B口上
				quotient = timeid >> 3;										//得到该时隙所在的字节值(同timeid / 8运算)
	  			residue = timeid & 0x07;									//同timeid % 8运算
	  			residue = 7 - residue;                      				//得到该时隙所在的bit位
		  		value = ais_reg[1][quotient] | XBYTE[quotient + 0x8AA6];
	  			value = (value >> residue) & 0x01;
				if (value){
					inport = path_switch_array[1][timeid][0];				//得到保护的备用光口
					outport = path_switch_array[1][timeid][1];				//得到被保护的光口
    				value = path_switch_function(inport,timeid,outport);	//进行该时隙的通道倒换
//					test_reg[7] += 1;
					if (outport < 4){										//光口处于时隙的保换倒换状态
						switch (outport){									//对光口进行并发配置
							case 0: value = path_switch_function(inport,timeid,1);
									break;
							case 1: value = path_switch_function(inport,timeid,0);
									break;
							case 2: value = path_switch_function(inport,timeid,3);
									break;
							case 3: value = path_switch_function(inport,timeid,2);
									break;
							default:break;
						}
					}
					if (value == 0){										//如果倒换成功
						path_switch_array[1][timeid][3] = 0;				//倒换成功改写当前时隙所用端口
						path_switch_array[inport][timeid][3] = 1;
						SetResRdyTbl(28);
					}
				}
			}
		}
	}
//	SetResRdyTbl(28);
	auto_path_port = 1;
//	for (timeid = 0; timeid <= 7; timeid++){
//		test_reg[8 + timeid] = XBYTE[timeid + 0x88A6];
//		test_reg[16 + timeid] = XBYTE[timeid + 0x8AA6];
//	}
}


void path_switch_otba_tu(void) large reentrant {
//OTB的A口TU自动倒换函数
//unsigned char xdata value1;									//记录TU-LOP值
//unsigned char xdata value2;									//记录TU-AIS值
unsigned char xdata value;									
unsigned char xdata timeid;									//时隙号

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -