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

📄 path_switch.c

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

	if(start_flg[0] == 0){
		if ((f2rc7860_rd(F2Ia0_a) & 0xD0 | f2rc7860_rd(F2Ia2_a) & 0xE0 | f2rc7860_rd(F2Ia3_a) & 0x80) == 0){			//OTB A口全0
			if (init_recover[2] == 1){
				for (temp = 0; temp <= 62; temp++){
					if (path_switch_state[temp] == 2){							//如果处于自动倒换状态
						for (tport = 0; tport <= 3; tport++){					//轮循查找哪个光口的备用光口是OTB光口1
							if (tport != 2){
							if (path_switch_array[tport][temp][0] == 2){
								quotient = temp >> 3;							//得到该时隙所在的字节值(同timeid / 8运算)
								residue = temp & 0x07;							//同timeid % 8运算
								residue = 7 - residue;                      	//得到该时隙所在的bit位
								outport = path_switch_array[tport][temp][1];
//					    		value = path_switch_function(2,temp,outport);	//进行该时隙的通道倒换
								switch(tport){
									case 0: valueid = (quotient + 0x88A6);
							    	        value = ((*valueid) >> residue) & 0x01;       	//如果该时隙出现AIS
											if (value != 0){                                //该时隙不能倒换
							            		PTUN(outport,temp) = 2;
											   	value = 0;
											}
											else{
								            	value = 2; 
							    	        }
											break;
								    case 1: valueid = (quotient + 0x8AA6);
							            	value = ((*valueid) >> residue) & 0x01;
							    	        if (value != 0){
							    	        	PTUN(outport,temp) = 2;
							        	    	value = 0;
											}
								            else{
							        	    	value = 2;
							            	}
											break;
//							    	case 2: value = f2rc7860_rd(quotient + 0x00A6);
//											value = (value >> residue) & 0x01;
//							        	    if (value != 0){
//							        	    	PTUN(outport,temp) = 2;
//							            	   	value = 0;
//											}
//							    	        else{
//							            		value = 2; 
//								            }
//											break;
								    case 3: value = f2rc7860_rd(quotient + 0x02A6);
											value = (value >> residue) & 0x01;
							    	        if (value != 0){
							    	        	PTUN(outport,temp) = 2;
							        	       	value = 0;
											}
								            else{
							        	    	value = 2;
							            	}
											break;                    
								   default: value = 2;
							   				break;
								}
								if ((value == 0) & (outport < 4)){				//光口处于时隙的保换倒换状态
									switch (outport){							//对光口进行并发配置
										case 0: value = PTUN(1,temp) = 2;
//														path_switch_function(2,temp,1);
												break;
										case 1: value = PTUN(0,temp) = 2;
//														path_switch_function(2,temp,0);
												break;
										case 2: value = PTUN(3,temp) = 2;
//														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;
			}
//	   		if (init_recover[2] == 2){
//				init_recover[2] = 1;
//			}
//			SetExtRdyTbl(15);											//改写2M盘的AIS速率
		}

		if ((f2rc7860_rd(F2Ia0_b) & 0xD0 | f2rc7860_rd(F2Ia2_b) & 0xE0 | f2rc7860_rd(F2Ia3_b) & 0x80) == 0){			//MCB B口全0
			if (init_recover[3] == 1){
				for (temp = 0; temp <= 62; temp++){
					if (path_switch_state[temp] == 2){							//如果处于自动倒换状态
						for (tport = 0; tport <= 2; tport++){					//轮循查找哪个光口的备用光口是OTB光口2
							if (path_switch_array[tport][temp][0] == 3){
								quotient = temp >> 3;							//得到该时隙所在的字节值(同timeid / 8运算)
								residue = temp & 0x07;							//同timeid % 8运算
								residue = 7 - residue;                      	//得到该时隙所在的bit位
								outport = path_switch_array[tport][temp][1];
//					    		value = path_switch_function(3,temp,outport);	//进行该时隙的通道倒换
								switch(tport){
									case 0: valueid = (quotient + 0x88A6);
							    	        value = ((*valueid) >> residue) & 0x01;       	//如果该时隙出现AIS
											if (value != 0){                                //该时隙不能倒换
							            		PTUN(outport,temp) = 3;
											   	value = 0;
											}
											else{
								            	value = 2; 
							    	        }
											break;
								    case 1: valueid = (quotient + 0x8AA6);
							            	value = ((*valueid) >> residue) & 0x01;
							    	        if (value != 0){
							    	        	PTUN(outport,temp) = 3;
							        	    	value = 0;
											}
								            else{
							        	    	value = 2;
							            	}
											break;
							    	case 2: value = f2rc7860_rd(quotient + 0x00A6);
											value = (value >> residue) & 0x01;
							        	    if (value != 0){
							        	    	PTUN(outport,temp) = 3;
							            	   	value = 0;
											}
							    	        else{
							            		value = 2; 
								            }
											break;
//								    case 3: value = f2rc7860_rd(quotient + 0x02A6);
//											value = (value >> residue) & 0x01;
//							    	        if (value != 0){
//							    	        	PTUN(outport,temp) = 3;
//							        	       	value = 0;
//											}
//								            else{
//							        	    	value = 2;
//							            	}
//											break;                    
								   default: value = 2;
							   				break;
							   }
								if ((value == 0) & (outport < 4)){				//光口处于时隙的保换倒换状态
									switch (outport){							//对光口进行并发配置
										case 0: value = PTUN(1,temp) = 3;
//														path_switch_function(3,temp,1);
												break;
										case 1: value = PTUN(0,temp) = 3;
//														path_switch_function(3,temp,0);
												break;
//										case 2: value = path_switch_function(3,temp,3);
//												break;
										case 3: value = PTUN(2,temp) = 3;
//														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;
			}
//	   		if (init_recover[3] == 2){
//				init_recover[3] = 1;
//			}
//		SetExtRdyTbl(15);											//改写2M盘的AIS速率
		}
	}

}

/***************************************************************************************************
void path_switch_recover(void){
//每秒查询是否信号恢复,进行通道倒换函数

unsigned char xdata temp;
unsigned char xdata tport;
unsigned char xdata outport;
unsigned char xdata value;

	if (((Ia0_a & 0xD0) | (Ia2_a & 0xE0) | (Ia3_a & 0x80)) == 0){			//MCB A口全0
		Intmask_ts0to7_a   = Tu12ais_0to7_a;
		Intmask_ts8to15_a  = Tu12ais_8to15_a;
		Intmask_ts16to23_a = Tu12ais_16to23_a;
		Intmask_ts24to31_a = Tu12ais_24to31_a;
		Intmask_ts32to39_a = Tu12ais_32to39_a;
		Intmask_ts40to47_a = Tu12ais_40to47_a;
		Intmask_ts48to55_a = Tu12ais_48to55_a;
		Intmask_ts56to62_a = Tu12ais_56to62_a;
   		if (init_recover[0] & init_recover[1]){
	 		for (temp = 0; temp <= 62; temp++){
				if (path_switch_state[temp] == 2){							//如果处于自动倒换状态
					for (tport = 0; tport <= 3; tport++){					//轮循查找哪个光口的备用光口是MCB光口1
						if (path_switch_array[tport][temp][0] == 0){
							outport = path_switch_array[tport][temp][1];
				    		value = path_switch_function(0,temp,outport);	//进行该时隙的通道倒换
							if (outport < 4){								//光口处于时隙的保换倒换状态
								switch (outport){							//对光口进行并发配置
									case 0: value = path_switch_function(0,temp,1);
											break;
									case 1: value = path_switch_function(0,temp,0);
											break;
									case 2: value = path_switch_function(0,temp,3);
											break;
									case 3: value = path_switch_function(0,temp,2);
											break;
									default:break;
								}
							}
							if (value == 0){								//如果倒换成功
								path_switch_array[tport][temp][3] = 0;		//倒换成功改写当前时隙所用端口
								path_switch_array[0][temp][3] = 1;
							}
						}
					}
				}
			}
			init_recover[0] = 0;
		}
		SetExtRdyTbl(15);											//改写2M盘的AIS速率
	}

	if ((Ia0_b & 0xD0 | Ia2_b & 0xE0 | Ia3_b & 0x80) == 0){			//MCB B口全0
		Intmask_ts0to7_b   = Tu12lop_0to7_b;
		Intmask_ts8to15_b  = Tu12lop_8to15_b;
		Intmask_ts16to23_b = Tu12lop_16to23_b;
		Intmask_ts24to31_b = Tu12lop_24to31_b;
		Intmask_ts32to39_b = Tu12lop_32to39_b;
		Intmask_ts40to47_b = Tu12lop_40to47_b;
		Intmask_ts48to55_b = Tu12lop_48to55_b;
		Intmask_ts56to62_b = Tu12lop_56to62_b;
   		if (init_recover[0] & init_recover[1]){
			for (temp = 0; temp <= 62; temp++){
				if (path_switch_state[temp] == 2){							//如果处于自动倒换状态
					for (tport = 0; tport <= 3; tport++){					//轮循查找哪个光口的备用光口是MCB光口2
						if (path_switch_array[tport][temp][0] == 1){
							outport = path_switch_array[tport][temp][1];
				    		value = path_switch_function(1,temp,outport);	//进行该时隙的通道倒换
							if (outport < 4){								//光口处于时隙的保换倒换状态
								switch (outport){							//对光口进行并发配置
									case 0: value = path_switch_function(1,temp,1);
											break;
									case 1: value = path_switch_function(1,temp,0);
											break;
									case 2: value = path_switch_function(1,temp,3);
											break;
									case 3: value = path_switch_function(1,temp,2);
											break;
									default:break;
								}
							}
							if (value == 0){								//如果倒换成功
								path_switch_array[tport][temp][3] = 0;		//倒换成功改写当前时隙所用端口
								path_switch_array[1][temp][3] = 1;
							}
						}
					}
				}
			}
			init_recover[1] = 0;
		}
		SetExtRdyTbl(15);											//改写2M盘的AIS速率
	}

	if(start_flg[0] == 0){
		if ((f2rc7860_rd(F2Ia0_a) & 0xD0 | f2rc7860_rd(F2Ia2_a) & 0xE0 | f2rc7860_rd(F2Ia3_a) & 0x80) == 0){			//OTB A口全0
			f2rc7860_wr(F2Intmask_ts0to7_a,0x00);
		    f2rc7860_wr(F2Intmask_ts8to15_a,0x00);
		    f2rc7860_wr(F2Intmask_ts16to23_a,0x00);
		    f2rc7860_wr(F2Intmask_ts24to31_a,0x00);
		    f2rc7860_wr(F2Intmask_ts32to39_a,0x00);
		    f2rc7860_wr(F2Intmask_ts40to47_a,0x00);
		    f2rc7860_wr(F2Intmask_ts48to55_a,0x00);
		    f2rc7860_wr(F2Intmask_ts56to62_a,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光口1
							if (path_switch_array[tport][temp][0] == 2){

⌨️ 快捷键说明

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