📄 c_trkout.c
字号:
{
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 + -