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

📄 c_trkout.c

📁 这是电信语音聊天设备的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
			{
				user_e1[user_num].mfc_state = SEND_NEXT;//转到发送下一位电话号码
				for(trk_j = 0;trk_j < 2;trk_j++)//清空接收数据 
				{
					chat_mfc_resource[user_e1[user_num].mfc].buf[trk_j] = IDLE;
				}
				chat_mfc_resource[user_e1[user_num].mfc].buf_p = 0;//清空接收指针
			}
		}
		break;
		default:
		break;
	}
}

trk_out_ctrl()// 数字中继线路信令处理
{
	unsigned char xdata trk_i,trk_j;
	for(trk_i = 0;trk_i < TRK_MAX;trk_i++)
	{
		if(user_e1[trk_i].type == CALL_OUT)//该用户为呼出
		{
			if(user_e1[trk_i].flag == OCCUPY)//该用户处于工作状态
			{
				switch(user_e1[trk_i].lc_state)//以该用户的线路状态来处理
				{
					case SEND_OCCUPY://准备呼出,发占用信令
					{
						no_sound(trk_i);//无音处理
						if(mfc_req(trk_i,CALL_OUT) != IDLE)//申请MFC
						{
							if(user_test_num == trk_i)
							{
								trk_j = dtmf_req(trk_i,2);
							}
							else
							{
								trk_j = dtmf_req(trk_i,1);
							}
							if(trk_j != IDLE)
							{
								sig_req(SS_HOLD,trk_i);//给此通道发占用		
								if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口 
								{
									//往后台回应监视信息
									command(1,0,trk_i,FORWARD_LINE_SIGNAL,1,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
								}
								user_e1[trk_i].lc_state = WAIT_PROVE;//转为等待占用证实
								user_e1[trk_i].delay = 30;//设置等待时间为1.5秒			
							}
							else
							{
								mfc_release(user_e1[trk_i].mfc);
							}
						}
					}
					break;
					case WAIT_PROVE://等待交换机回占用证实
					{
						user_e1[trk_i].delay--;//等待时间减1
						if(user_e1[trk_i].delay == 0)//1.5秒内没有回应占用证实或测试结束
						{
							sig_req(SS_RELEASE,trk_i);//发送前项释放
							if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
							{
								//往后台回应监视信息
								command(1,0,trk_i,FORWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[trk_i].lc_state = WAIT_RELEASE;//等待后项释放
							user_e1[trk_i].delay = 3;//设置等待150毫秒等待时间
							user_e1[trk_i].control = 50;//设置2.5秒控制时间
						}
						else
						{
							if(user_e1[trk_i].backward_signal == RSD_CONFIRM)//有没有收到占用证实
							{
								user_e1[trk_i].backward_signal = IDLE;//将后项线路信号置为空
								if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
								{
									//往后台回应监视信息
									command(1,0,trk_i,BACKWARD_LINE_SIGNAL,1,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
								}
								user_e1[trk_i].mfc_state = MFC_START;//开始MFC互控处理
								for(trk_j = 0;trk_j < 2;trk_j++)//清空接收数据 
								{
									chat_mfc_resource[user_e1[trk_i].mfc].buf[trk_j] = IDLE;
								}
								chat_mfc_resource[user_e1[trk_i].mfc].buf_p = 0;//清空接收指针
								user_e1[trk_i].lc_state = MANAGE_MFC;//转为等待MFC结束
							}
						}
					}
					break;	
					case MANAGE_MFC://处理MFC
					{
						out_mfc_line(trk_i);
					}	
					break;	
					case WAIT_RELEASE://等待后项释放
					{
						user_e1[trk_i].control--;//控制时间减1
						if(user_e1[trk_i].backward_signal == RSD_IDLE)//判断是否收到后项释放
						{
							if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
							{
									//往后台回应监视信息
									command(1,0,trk_i,BACKWARD_LINE_SIGNAL,3,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[trk_i].backward_signal = IDLE;//请线路信令
							user_e1[trk_i].lc_state = SEND_OCCUPY;//转为发送占用
							false_p(trk_i);//失败处理
							no_sound(trk_i);//无音处理
						}
						else
						{
							if(user_e1[trk_i].control == 0)//判断控制时间到了吗?
							{
								sig_req(SS_HOLD,trk_i);//发送占用
								if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
								{
									//往后台回应监视信息
									command(1,0,trk_i,FORWARD_LINE_SIGNAL,1,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
								}
								user_e1[trk_i].lc_state = RELEASE_FAILURE;//转为后项释放失败处理
								user_e1[trk_i].control = 5;//设置250毫秒的控制时间
							}
						}
					}
					break;
					case RELEASE_FAILURE://后项释放失败
					{
						user_e1[trk_i].control--;//控制时间减1
						if(user_e1[trk_i].control == 0)//控制时间到了
						{
							sig_req(SS_OHANG,trk_i);//发送主叫挂机
							if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
							{
								//往后台回应监视信息
								command(1,0,trk_i,FORWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[trk_i].lc_state = WAIT_RELEASE;//转为等待后项释放
							user_e1[trk_i].control = 50;//设置2.5秒控制时间
						}
					}
					break;
					case WAIT_TALK://等待被叫摘机
					{
						if(user_e1[trk_i].control == 0)
						{
							no_sound(trk_i);//无音处理
							sig_req(SS_OHANG,trk_i);//发送主叫挂机
							if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
							{
								//往后台回应监视信息
								command(1,0,trk_i,FORWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[trk_i].delay = 3;//设置150毫秒的等待时间
							user_e1[trk_i].control = 50;//设置2.5秒的控制时间
							user_e1[trk_i].lc_state = WAIT_RELEASE;//转为等待后项释放
						}
						else
						{
							if(user_e1[trk_i].backward_signal == RSD_TALK)//判断被叫是否摘机
							{
								if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
								{
									//往后台回应监视信息
									command(1,0,trk_i,BACKWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
								}
								user_e1[trk_i].backward_signal = IDLE;//清空线路信令
								user_e1[trk_i].false = 3;//被叫挂机后停止呼叫
								connect(audio_dtmf_resource[user_e1[trk_i].dtmf].slot,trk_i);//连接提示音
								if((trk_i == user_test_num) || (trk_i == user_monitor_num))
								{
									connect(audio_dtmf_resource[user_e1[trk_i].dtmf].slot,CHAIRMAN_SLOT);//连接提示音
								}
								audio_play(user_e1[trk_i].dtmf,audio_dtmf_resource[user_e1[trk_i].dtmf].num[audio_dtmf_resource[user_e1[trk_i].dtmf].index]);
								//放提示音
								audio_dtmf_resource[user_e1[trk_i].dtmf].index++;//提示音索引号加1
								audio_dtmf_resource[user_e1[trk_i].dtmf].auto_flag = OCCUPY;
								user_e1[trk_i].lc_state = SCAN_HANG;//转为扫描被叫挂机
							}
							else
							{
								if(user_e1[trk_i].backward_signal == RSD_IDLE)//判断被叫是否拒绝接听(主要是手机用户)
								{
									if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
									{
										//往后台回应监视信息
										command(1,0,trk_i,BACKWARD_LINE_SIGNAL,3,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
									}
									user_e1[trk_i].backward_signal = IDLE;//清空线路信令
									sig_req(SS_OHANG,trk_i);//发主叫挂机
									if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
									{
										//往后台回应监视信息
										command(1,0,trk_i,FORWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
									}
									user_e1[trk_i].delay = 3;//设置150毫秒的等待时间
									user_e1[trk_i].control = 50;//设置2.5秒的控制时间
									user_e1[trk_i].lc_state = WAIT_RELEASE;//转到线路信令的处理
								}
								else
								{
									user_e1[trk_i].delay--;//等待时间减1
									if(user_e1[trk_i].delay == 0)
									{
										user_e1[trk_i].delay = 10;//设置500毫秒的等待时间
										user_e1[trk_i].control--;//控制时间减1
									}
								}
							}
						}
					}
					break;
					case SCAN_HANG://扫描被叫挂机
					{
						if(user_e1[trk_i].backward_signal == RSD_CONFIRM)//判断被叫是否挂机
						{
							if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
							{
								//往后台回应监视信息
								command(1,0,trk_i,BACKWARD_LINE_SIGNAL,3,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[trk_i].backward_signal = IDLE;//清空线路信令
							connect(CHAIRMAN_SLOT,CHAIRMAN_SLOT);//连接提示音
							no_sound(trk_i);//无音处理
							audio_stop(user_e1[trk_i].dtmf);
							audio_dtmf_resource[user_e1[trk_i].dtmf].auto_flag = LEISURE;
							sig_req(SS_OHANG,trk_i);//发主叫挂机
							if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
							{
								//往后台回应监视信息
								command(1,0,trk_i,FORWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
							}
							user_e1[trk_i].delay = 3;//设置150毫秒的等待时间
							user_e1[trk_i].control = 50;//设置2.5秒的控制时间
							user_e1[trk_i].lc_state = WAIT_RELEASE;//转到线路信令的处理
						}
						else
						{
							if(audio_dtmf_resource[user_e1[trk_i].dtmf].count > 2)//提示音放了三遍了吗?
							{
								connect(CHAIRMAN_SLOT,CHAIRMAN_SLOT);//连接提示音
								no_sound(trk_i);//无音处理
								audio_stop(user_e1[trk_i].dtmf);
								audio_dtmf_resource[user_e1[trk_i].dtmf].auto_flag = LEISURE;
								sig_req(SS_OHANG,trk_i);//发主叫挂机
								if((user_monitor_num == trk_i) || (user_test_num == trk_i))//判断此端口是否为呼出测试端口或监视端口
								{
									//往后台回应监视信息
									command(1,0,trk_i,FORWARD_LINE_SIGNAL,2,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE,IDLE);
								}
								user_e1[trk_i].delay = 3;//设置150毫秒的等待时间
								user_e1[trk_i].control = 50;//设置2.5秒的控制时间
								user_e1[trk_i].lc_state = WAIT_RELEASE;//转到线路信令的处理
							}
						}
					}
					break;
					default:
					break;
				}	
			}
		}
	}
}

⌨️ 快捷键说明

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