📄 extsystem.c
字号:
/***************************
Name:Extsystem.c
author:RPJ
version:V0.1
description:
用户交换系统模块
***************************/
#include "reg52.h"
#include "absacc.h"
#include "clock.h"
#include "define.h"
#include "uartmodule.h"
#include "extsystem.h"
#include "drive.h"
#define GLOBALS
#include "variable.h"
/***************************
Name:EXT_Event_Analy
input:none
output:none
description:
**************************/
void Ext_Event_Analyse(void)
{
unchar Ext_No,SExt_No;
unchar Event_State,Event_matter,Channel,group;
bool ring;
unchar member,temp;
if( TAL_EVENT == 0 )
{
return;//如果用户事件未发生退出分析
}
MICRO_GetFromBuf(EXT_EVENT_QUEUE[RP_EVENT],
Ext_No, RP_EVENT, TAL_EVENT, BufSize);
//取发生事件变化的用户号
Event_State = Ext_Param[Ext_No].Ext_State;
Event_matter = Ext_Param[Ext_No].Ext_EVENT;
if((FlagHeartSkip==2)||(FlagHeartSkip==3)||(FlagHeartSkip==9))
{
BaseDataComm(RepState, Ext_No);
}
//取用户的事件
ring = 0; //给出测试标志位复位
if( (Event_State >= 20)&&(Event_State <= 29))
{
Event_State = 20; //忙音事件进行统一处理
}
if( (Event_State >= 30)&&(Event_State <= 39))
{
if( Event_State == 36 )
ring = 1; //测试事件统一处理,排除测试铃流
Event_State = 30;
}
switch(Event_State) //根据用户状态分析用户事件
{
case state0_Free:
switch(Event_matter) //用户主动摘机事件
{
case event1_ExtHookOn:
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
if( Ext_Param[Ext_No].Bit_Param >= 0x80 )
{//得到模拟中继振铃,然后直接打开中继,占用,找寻绳路
OPEN_Trk(Ext_No);
Reign_Trk(Ext_No);
Channel = Scan_Ext_Cable();
if( Channel >= 0x0f )
{
Release_Trk(Ext_No);
CLOSE_Trk(Ext_No);
break;
}
Channel |= 0xf0; //启动绳路占用,但是未接续
OPEN_EXT_Signal(Ext_No,5); //听回铃
Ext_Timer_Reset(Ext_No); //计数器清空
SExt_No = Ext_Param[Ext_No].Num_Hot_Call;
if( SExt_No >= TAL_EXT_PORT )
{
SExt_No = 0;
}
else
{
if(Ext_Param[SExt_No].Bit_Param >= 0x80 )
{
SExt_No = 0;
}
}
if((Ext_Param[SExt_No].Bit_Param & 0x02)==0) //如果热线不是总机
{
if( Ext_Param[SExt_No].Ext_State > state0_Free) //如果热线忙
{
Ext_Param[Ext_No].Ext_State = state4_DailOk; //改变用户状态为4
Ext_Param[Ext_No].Ext_EVENT = event7_SExtHookOff; //用户进入被叫挂机
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
break;
}
}
Ext_Param[Ext_No].Num_Call_Other = SExt_No; //填写被叫(从热线中取被叫)
Ext_Param[Ext_No].Num_Call_Me = 0xff; //主叫浮空
Ext_Param[Ext_No].Num_Switch_Cable = Channel; //填写绳路
Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec; //收号器不可用
Ext_Param[Ext_No].Ext_State = state4_DailOk; //改变用户状态为4
Ext_Param[Ext_No].Num_MeetGroup = 0xff; //用户会议组浮空
Ext_Param[SExt_No].Num_Call_Me = Ext_No; //填写被叫的主叫
Ext_Param[SExt_No].Num_Switch_Cable = Channel; //填写被叫绳路
Ext_Param[SExt_No].Ext_EVENT = event4_ExtRing; //被叫用户进入被呼叫事件
Ext_Param[SExt_No].Num_MeetGroup = 0xff; //改变用户状态
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
WP_EVENT, TAL_EVENT, BufSize);
}
else
{
#if ExtSameTrk
if((Ext_No>=20)&&(Ext_No<MAX_Ext))
{
Ext_Param[Ext_No].RecDTMF_En = MT8870_EnRec; //收号器可用
Ext_Param[Ext_No].Ext_State = state3_RecTwoDtmf; //改变用户状态为1
Ext_Param[Ext_No].Ext_EVENT= event3_ExtRecDtmf; //改变用户状态为1
Ext_Param[Ext_No].Ext_RecDtmf_List[0]= First_Troop_Head>>4; //改变用户状态为1
Ext_Param[Ext_No].Ext_RecDtmf_List[1] = 0;
Ext_Timer[Ext_No].Counter_Rec_DTMF = 2;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
break;
}
#endif
if((Ext_Param[Ext_No].Bit_Param & 0x20)==0)
{
OPEN_EXT_Signal(Ext_No, 1); //听拨号音
Ext_Param[Ext_No].RecDTMF_En = MT8870_EnRec; //收号器可用
Ext_Param[Ext_No].Ext_State = state1_DailNo; //改变用户状态为1
}
else
{
OPEN_EXT_Signal(Ext_No, 1); //听拨号音
Ext_Param[Ext_No].RecDTMF_En = MT8870_EnRec; //收号器可用
Ext_Param[Ext_No].Ext_State = state1_DailNo; //改变用户状态为1
}
}
break;
case event4_ExtRing: //用户作为被叫,听振铃
OPEN_EXT_Ring(Ext_No); //听振铃
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param[Ext_No].RecDTMF_Data = 0xff; //接收的数据浮空
Ext_Param[Ext_No].RecDTMF_En = MT8870_NoRec; //收号器不可用
Ext_Param[Ext_No].Ext_EVENT = 0xff; //用户事件浮空
Ext_Param[Ext_No].Ext_State = state6_Ring; //改变用户状态
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 state1_DailNo:
switch(Event_matter) //用户放弃拨号,恢复原态0
{
case event2_ExtHookOff:
STOP_EXT_Signal(Ext_No); //关信号音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
if( Ext_No == Host_Ext )
{
for(temp=0;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; //写用户绳路
Ext_Param[Ext_No].Ext_EVENT= event4_ExtRing; //用户进入会议振铃状态
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
break;
}
}
}
break;
case event3_ExtRecDtmf: //用户收到号码,关信号音,进入字头分析
//如果分析正常进入2态或者3态或者4态
STOP_EXT_Signal(Ext_No);
Head_Analyse(Ext_No);
break;
case event8_DailOver: //用户拨号超时,恢复原态
SExt_No = Ext_Param[Ext_No].Num_Hot_Call;
if((SExt_No<TAL_EXT_PORT)&&( Ext_Param[Ext_No].Bit_Param & 0x20))
{
STOP_EXT_Signal(Ext_No);
Connect_Analyse(Ext_No, SExt_No);
break;
}
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state20_DailOver; //改变用户状态
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;
}
}
default:
break;
}
break; //非法状态,报告错误,恢复原态
case state2_RecOneDtmf:
case state3_RecTwoDtmf:
switch(Event_matter) //用户放弃拨号,恢复原态
{
case event2_ExtHookOff:
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
if( Ext_No == Host_Ext )
{
for(temp=0;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; //写用户绳路
Ext_Param[Ext_No].Ext_EVENT= event4_ExtRing; //用户进入会议振铃状态
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], Ext_No,
WP_EVENT, TAL_EVENT, BufSize);
break;
}
}
}
break;
case event3_ExtRecDtmf: //用户收到号码,进入字段分析
STOP_EXT_Signal(Ext_No);
Ext_Call_Analyse(Ext_No);
break;//用户在该字段分析是正常后,需要直接修改状态,修改事件,进入4态处理
case event8_DailOver: //用户拨号超时,恢复原态
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state20_DailOver; //改变用户状态
break;
case event10_NoRightCall: //用户无权呼叫号码听忙音
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state24_NoRightCall; //改变用户状态
break;
case event11_CallFreeNo: //用户呼叫空号码听忙音
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state23_CallFreeNo; //改变用户状态
break;
case event12_CableBusy: //系统绳路忙听忙音
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state26_CableBusy; //改变用户状态
break;
case event13_SExtBusy: //用户对方忙听忙音
STOP_EXT_Signal(Ext_No); //关音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
Ext_Param_Reset(Ext_No); //用户参数复位
OPEN_EXT_Signal(Ext_No, 2); //听忙音
Ext_Param[Ext_No].Ext_State = state25_OppBusy; //改变用户状态
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 state4_DailOk:
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;
for(member = 0;member<MAX_Ext;member++)
{
SExt_No = Troop_Param[temp].Troop_Member[member];
if(SExt_No<TAL_EXT_PORT)
{
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); //用户对方摘机
}
}
}
}
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;//取用户绳路
Release_Cable(Channel);
STOP_EXT_Signal(Ext_No); //关回铃音
Ext_Timer_Reset(Ext_No); //用户计时器参数复位
if( Ext_Param[Ext_No].Num_MeetGroup < 7 )
{
group = Ext_Param[Ext_No].Num_MeetGroup;
Release_MeetGroup(group); //使用统一绳路,必须考虑是否释放了
Ext_Param_Reset(Ext_No); //用户参数复位
}
else
{//判断被叫是否是会议呼叫,如果不是就用户处理
Ext_Param_Reset(Ext_No); //用户参数复位
Ext_Param[SExt_No].Ext_EVENT = event5_ExtReleaseRing;
MICRO_SendToBuf(EXT_EVENT_QUEUE[WP_EVENT], SExt_No,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -