📄 extsystem.c
字号:
WP_EVENT, TAL_EVENT, BufSize);//用户主动挂机,被叫撤铃
}
break;
case event6_SExtHookOn: //被叫用户摘机,进入通话态
STOP_EXT_Signal(Ext_No); //关回铃音
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
Micro_Switch_8816(Ext_No, Channel, 1); //接续
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param[Ext_No].Num_Switch_Cable &= 0x0f; //绳路占用
Ext_Param[Ext_No].Num_Call_Me = 0xff; //主叫浮空
Ext_Param[Ext_No].RecDTMF_Data = 0xff; //接收的数据浮空
Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec; //收号器不可用
Ext_Param[Ext_No].Ext_EVENT = 0xff; //用户事件浮空
if( Ext_Param[Ext_No].Num_MeetGroup < TAL_CABLE )
{
Ext_Param[Ext_No].Ext_State = state8_MeetTalk; //改变用户状态
}
else
{
if(FlagSystemType)//如果是指令就进入指令呼叫状态
Ext_Param[Ext_No].Ext_State = state10_TroopRing;
else//如果普通电话就普通呼叫状态
Ext_Param[Ext_No].Ext_State = state5_TalkTo; //改变用户状态
}
break;
case event9_ExtCallWaitOver: //被叫用户无人接听,听忙音
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Troop_Param[temp].Troopstate )
{
Troop_Param[temp].Troopstate--;
}
}
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
if( Ext_Param[Ext_No].Num_MeetGroup < 7 )
{
Release_MeetGroup(Ext_Param[Ext_No].Num_MeetGroup);
}
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state21_ResRingOver; //改变用户状态
break;
case event14_HostCallingExt: //总机会议中,再次被呼叫进入
for(temp=1;temp<MAX_Ext;temp++)
{
if(HostExt_Calling_List[temp]==0x0f)
{
Ext_Timer_Reset(Ext_No);
Ext_Param_Reset(Ext_No);
HostCreat_MeetGroup(Host_Ext,temp);
HostExt_Calling_List[temp] = 0xf0;
break;
}
else if(HostExt_Calling_List[temp]==0xf0)
{
break;
}
else
{
continue;
}
}
break;
case event15_HostCalledExt: //普通用户呼叫总机
for(temp=1;temp<MAX_Ext;temp++)
{
if(HostExt_Called_List[temp]==0x0f)
{
HostCreat_MeetGroup(temp,Host_Ext );
HostExt_Called_List[temp] = 0xf0;
break;
}
}
break;
default:
break;
}
break; //非法状态,报告错误,恢复原态
case state5_TalkTo:
switch(Event_matter) //用户终止通话,恢复原态
{
case event2_ExtHookOff:
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Troop_Param[temp].Troopstate )
{
Troop_Param[temp].Troopstate--;
}
}
SExt_No = Ext_Param[Ext_No].Num_Call_Other; //取被叫用户
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
Micro_Switch_8816(Ext_No, Channel, 0); //断开接续
Release_Cable(Channel); //释放绳路
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize); //用户对方挂机
break;
case event7_SExtHookOff: //对方挂机,进入忙音态
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Troop_Param[temp].Troopstate )
{
Troop_Param[temp].Troopstate--;
}
}
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
Micro_Switch_8816(Ext_No, Channel, 0); //断开接续
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
if( Ext_Param[Ext_No].Bit_Param >= 0x80 )//如果中继是主叫,需要直接释放
{
CLOSE_Trk(Ext_No);
Release_Trk(Ext_No);
}
else
{
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state22_OppHookOff; //改变用户状态
}
break;
case event15_HostCalledExt: //调度事件进入,双方直接进入会议中
break;
default:
break;
}
break; //非法状态,报告错误,恢复原态
case state6_Ring:
switch(Event_matter) //用户摘机
{
case event1_ExtHookOn:
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
if(FlagSystemType)
{
Ext_Param[Ext_No].Ext_EVENT = event16_TroopRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);//组呼用户有摘机
break;
}
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
for(member = 0;member<MAX_Ext;member++)
{
SExt_No = Troop_Param[temp].Troop_Member[member];
if(SExt_No<TAL_EXT_PORT)
{
if(SExt_No == Ext_No)
continue;
if(Ext_Param[SExt_No].Ext_State == state6_Ring)
{
if(Ext_Param[SExt_No].Temp_Troop_Call ==
Ext_Param[Ext_No].Temp_Troop_Call )
{
Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize); //组呼用户有摘机,其他撤消振铃
}
}
}
}
SExt_No = Ext_Param[Ext_No].Num_Call_Me;
Ext_Param[SExt_No].Num_Call_Other = Ext_No;
}
STOP_EXT_Ring(Ext_No); //关振铃
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
if( Channel >= TAL_CABLE )
{
SExt_No = Ext_Param[Ext_No].Num_Call_Me;
Ext_Param[SExt_No].Ext_EVENT = event12_CableBusy;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize); //用户对方摘机
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No);
Ext_Param[Ext_No].Ext_State = state1_DailNo; //改变用户状态
}
else
{
Micro_Switch_8816(Ext_No, Channel, 1); //接续
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param[Ext_No].Num_Switch_Cable &= 0x0f; //绳路占用
Ext_Param[Ext_No].RecDTMF_Data = 0xff; //接收的数据浮空
Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec; //收号器不可用
Ext_Param[Ext_No].Ext_EVENT = 0xff; //用户事件浮空
group = Ext_Param[Ext_No].Num_MeetGroup;
if( group < TAL_CABLE )
{
if( Temp_MeetGroup[group].MeetGroup < TAL_CABLE )
{
SExt_No = Temp_MeetGroup[group].Manager_Ext; //取主叫用户
}
else
{
if(Ext_Param[Ext_No].Num_Call_Other <MAX_Ext )
{
SExt_No = Ext_Param[Ext_No].Num_Call_Other;
HostExt_Called_List[SExt_No] = 0xff;
}
}
Ext_Param[Ext_No].Ext_State = state8_MeetTalk; //改变用户状态
}
else
{
SExt_No = Ext_Param[Ext_No].Num_Call_Me; //取主叫用户
Ext_Param[Ext_No].Ext_State = state7_TalkFrom; //改变用户状态
Ext_Param[SExt_No].Num_Switch_Cable=Ext_Param[Ext_No].Num_Switch_Cable;
}
Ext_Param[SExt_No].Ext_EVENT = event6_SExtHookOn;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize); //用户对方摘机
}
break;
case event5_ExtReleaseRing: //用户撤消振铃
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Troop_Param[temp].Troopstate )
{
Troop_Param[temp].Troopstate--;
}
}
if( Ext_Param[Ext_No].Num_Call_Me == 0xfe )
{
group = Ext_Param[Ext_No].Num_MeetGroup; //取被叫用户会议组
SExt_No = Temp_MeetGroup[group].Manager_Ext; //取主叫用户
Temp_MeetGroup[group].Num_Member--;
if(SExt_No != Ext_No)
{//如果被撤销的是总机,不需要告诉别人挂机处理
Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);//会议成员挂机,主席判断是否结束会议
}
}
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
if( Ext_Param[Ext_No].Bit_Param >= 0x80 )//如果中继是被叫,需要直接释放
{
CLOSE_Trk(Ext_No);
Release_Trk(Ext_No);
}
else
{
if( Ext_No == Host_Ext )
{
for(temp=1;temp<MAX_Ext;temp++)
{
if(HostExt_Called_List[temp] == 0xf0 )
{
Ext_Param[Ext_No].Num_Call_Other = temp;//写入对方标志号码
Ext_Param[Ext_No].Num_MeetGroup = Ext_Param[temp].Num_MeetGroup; //写入会议组号
Ext_Param[Ext_No].Num_Call_Me= 0XFE; //写入会议组号
Ext_Param[Ext_No].Num_Switch_Cable = Ext_Param[temp].Num_Switch_Cable; //写用户绳路
Use_Cable(Ext_Param[Ext_No].Num_Switch_Cable&0x0f);
Ext_Param[Ext_No].Ext_EVENT= event4_ExtRing; //用户进入会议振铃状态
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
break;
}
}
}
else
{
STOP_EXT_Ring(Ext_No); //关铃
}
}
break;
case event15_HostCalledExt: //多次呼叫总机进入
for(temp=1;temp<MAX_Ext;temp++)
{
if(HostExt_Called_List[temp]==0x0f)
{//00,是空闲态,0f是呼叫态,f0是等待再次连接态,ff是连接中态
HostCreat_MeetGroup(temp, Host_Ext);
HostExt_Called_List[temp] = 0xf0;
break;
}
}
break;
case event16_TroopRing:
STOP_EXT_Ring(Ext_No);//关振铃
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
group = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Channel >= TAL_CABLE )
{
SExt_No = Ext_Param[Ext_No].Num_Call_Me;
Ext_Param[SExt_No].Ext_EVENT = event12_CableBusy;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize); //用户对方摘机
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No);
Ext_Param[Ext_No].Ext_State = state1_DailNo; //改变用户状态
}
else
{
Micro_Switch_8816(Ext_No, Channel, 1); //接续
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param[Ext_No].Num_Switch_Cable &= 0x0f; //绳路占用
Ext_Param[Ext_No].RecDTMF_Data = 0xff; //接收的数据浮空
Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec; //收号器不可用
Ext_Param[Ext_No].Ext_EVENT = 0xff; //用户事件浮空
SExt_No = Ext_Param[Ext_No].Num_Call_Me; //取主叫用户
Ext_Param[Ext_No].Ext_State = state7_TalkFrom; //改变用户状态
Ext_Param[SExt_No].Num_Switch_Cable=Ext_Param[Ext_No].Num_Switch_Cable;
Ext_Param[SExt_No].Ext_EVENT = event6_SExtHookOn;
Ext_Param[SExt_No].Num_Call_Other = 0xa0+group; //表示是呼叫指令群呼
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize); //用户对方摘机
}
break;
default:
break;
}
break; //非法状态,报告错误,恢复原态
case state7_TalkFrom:
switch(Event_matter ) //用户终止通话,恢复原态
{
case event2_ExtHookOff:
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Troop_Param[temp].Troopstate )
{
Troop_Param[temp].Troopstate--;
}
}
SExt_No = Ext_Param[Ext_No].Num_Call_Me; //取主叫用户
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
Micro_Switch_8816(Ext_No, Channel, 0); //断开接续
Release_Cable(Channel); //释放绳路
Ext_Param[SExt_No].Ext_EVENT = event7_SExtHookOff;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
//用户对方挂机
break;
case event7_SExtHookOff: //对方挂机,进入忙音态
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
if( Troop_Param[temp].Troopstate )
{
Troop_Param[temp].Troopstate--;
}
}
Channel = Ext_Param[Ext_No].Num_Switch_Cable&0x0f;//取绳路
Micro_Switch_8816(Ext_No, Channel, 0); //断开接续
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
if( Ext_Param[Ext_No].Bit_Param >= 0x80 )//如果中继是被叫,需要直接释放
{
CLOSE_Trk(Ext_No);
Release_Trk(Ext_No);
}
else
{
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state22_OppHookOff; //改变用户状态
}
break;
case event15_HostCalledExt: //调度事件进入,双方直接进入会议中
break;
case event17_ExtFlash:
if( Ext_Param[Ext_No].Temp_Troop_Call > 7 )//(1111 xxxx)是群呼标志,所以标志大于7就是正在使用
{
temp = Ext_Param[Ext_No].Temp_Troop_Call&0x0f;
Channel = Ext_Param[Ext_No].Num_Call_Me;
if(FlagSystemType)
{
for(member = 0;member<MAX_Ext;member++)
{
SExt_No = Troop_Param[temp].Troop_Member[member];
if(SExt_No<TAL_EXT_PORT)
{
if(SExt_No == Ext_No)
continue;
if(Channel == SExt_No)
{
Ext_Param[SExt_No].Ext_State = state5_TalkTo;
Ext_Param[SExt_No].Num_Call_Other = Ext_No;
continue;
}
if(Ext_Param[SExt_No].Temp_Troop_Call ==
Ext_Param[Ext_No].Temp_Troop_Call )
{
if(Ext_Param[SExt_No].Ext_State == state6_Ring)
{
Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -