📄 communication.c
字号:
}
else
{
for(j=0;j<ExtTelNum;j++)
{ //查找振铃空闲分机
if(ReadExtTelState(j)==exttel_hold)
{
CreatExtComGroupByID(outtelnum,MACHINE_ID[j],OUTSIDELINE_ID[outtelnum],OUTSIDECOMTYPE);
//建立通话组
WriteOutTelState(outtelnum,outtel_ring);//改变外线状态
WriteExtTelState(j,exttel_sendCID);//接受来电显示
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}
}
//不存在空闲分机
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}
}//第一声振铃
}//振铃消息
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//本外线消息
}//消息查询
}//是否有消息
}//函数
void outtel_ring_deal(UCHAR outtelnum)
{
idata UCHAR i;
if(RawMessageNum!=0)
{
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_origin)==OUTSIDELINE_ID[outtelnum])
{ //为本外线消息
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//本外线消息
}//消息查询
}//是否有消息
}//函数
void outtel_using_deal(UCHAR outtelnum)
{
idata UCHAR i;
if(RawMessageNum!=0)
{
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_origin)==OUTSIDELINE_ID[outtelnum])
{ //为本外线消息
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//本外线消息
}//消息查询
}//是否有消息
}//函数
void exttel_hold_deal(UCHAR telnum) //telnum 为分机号码 0,1,2,3,4,5,6,7
{
idata UCHAR i,temp;
if(RawMessageNum!=0)
{
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_origin)==MACHINE_ID[telnum])
{ //为本分机消息
if(ReadMessageGroup(i,MessageGroup_type)==EXTTEL_UNHOLD_MESSAGETYPE)
{ //摘机消息
temp=CreateExtComGroup(telnum);
if(temp==0xff)
{//没有通话组资源出错
SetExtTelErrorSound(telnum); //给出出错提示
WriteExtTelState(telnum,exttel_error);
}
else if(ReadExtComGroup(temp,ExtComGroup_type)==INSIDECOMTYPE)
{//内部通话
SetExtTelQuietSound(telnum);//初始化提示音
Writesoundway(telnum,HINTSOUND,ON);//给出450HZ可拨号提示音
StarDecordDTMF(MACHINE_ID[telnum]);//开始检测DTMF
}
else
{//外部通话
SetExtTelQuietSound(telnum);//初始化提示音
WriteExtComGroup(temp,ExtComGroup_object,OUTSIDELINE_ID[temp]);//选择通道连接
TakeOutsideLine(temp);//拿线
StarDecordDTMF(MACHINE_ID[telnum]); //开始检测DTMF
Writesoundway(telnum,temp,ON);//连接外线
}
WriteExtTelState(telnum,exttel_unhold);//改变分机状态
WriteExtTelTime(telnum,EXTTELTIME_30S);//启动时间功能
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}
else
{//其它的消息类型不处理,进行防错动作
WriteExtTelState(telnum,exttel_hold);
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//本分机消息
}//消息查询
}//是否有消息
}//函数
void exttel_unhold_deal(UCHAR telnum)
{
idata UCHAR i,extcomgroupID,temp;
if(RawMessageNum!=0)
{
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_origin)==MACHINE_ID[telnum])
{//为本分机消息
if(ReadMessageGroup(i,MessageGroup_type)==EXTTEL_HOLD_MESSAGETYPE)
{ //挂机消息
extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)
{//内部通话类型
Writesoundway(telnum,HINTSOUND,OFF);//停止可拨号信号提示音
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
}
else
{//外部通话类型
Writesoundway(telnum,extcomgroupID,OFF);//断开外线连接
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
HoldOutsideLine(extcomgroupID);//挂线
}
WriteExtTelState(telnum,exttel_hold); //改变分机状态
WriteExtTelTime(telnum,0);//关闭时间功能
ClearAComGroup(extcomgroupID); //释放通话组资源
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}//挂机消息
if(ReadMessageGroup(i,MessageGroup_type)==DECODE_DTMF_MESSAGETYPE)
{//DTMF解码消息
if(ReadMessageGroup(i,(MessageGroup_datastar+1))==1)
{//第一个拨号信息
extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)
{//原定为内部通话组
if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar)==0x0C)
{//实为内线拨号
Writesoundway(telnum,HINTSOUND,OFF);//停止可拨号信号提示音
WriteExtTelState(telnum,exttel_dialing); //改变分机状态
WriteExtTelTime(telnum,0);//关闭时间功能
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
else
{//实为外部通话组
//因为外线已经被占用,无法开启外部通话 给出错提示音
Writesoundway(telnum,HINTSOUND,OFF);//停止可拨号信号提示音
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
WriteExtTelTime(telnum,0);//关闭时间功能
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
}
else
{//原定为外部通话组
if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar)==0x0C)
{//实为内线拨号
Writesoundway(telnum,extcomgroupID,OFF);//断开外线连接
HoldOutsideLine(extcomgroupID);//挂断外线
temp=testextcomgroup_inside();//若还有空闲内部通话组,返回通话组编号
if(temp!=0xff)
{//还存在空闲的内部通话时 将外部通话转移到内部通话组来
ClearAComGroup(extcomgroupID);//消除原有通话组
CreatExtComGroupByID(temp,MACHINE_ID[telnum],0,INSIDECOMTYPE); //新建空闲通话组
}
else
{//仍然使用原通话组
WriteExtComGroup(extcomgroupID,ExtComGroup_type,INSIDECOMTYPE); //修改通话类型
WriteExtComGroup(extcomgroupID,ExtComGroup_object,0); //修改通话目标
}
WriteExtTelState(telnum,exttel_dialing); //改变分机状态
WriteExtTelTime(telnum,0);//关闭时间功能
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
else
{//实为外部通话组
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
WriteExtTelState(telnum,exttel_dialing); //改变分机状态
WriteExtTelTime(telnum,0);//关闭时间功能
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
}
}//第一个拨号信息
else
{//如果不是第一个拨号信息 给出出错提示
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
}//解码消息
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//本外线消息
}//消息查询
}//是否有消息
}//函数
void exttel_dialing_deal(UCHAR telnum)
{
idata UCHAR i,extcomgroupID;
if(RawMessageNum!=0)
{
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_origin)==MACHINE_ID[telnum])
{//为本分机消息
if(ReadMessageGroup(i,MessageGroup_type)==EXTTEL_HOLD_MESSAGETYPE)
{//挂机消息
extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
if(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE)
{//内部通话类型
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
}
else
{//外部通话类型
Writesoundway(telnum,extcomgroupID,OFF);//断开外线连接
HoldOutsideLine(extcomgroupID);//挂线
}
ClearAComGroup(extcomgroupID); //释放通话组资源
WriteExtTelState(telnum,exttel_hold); //改变分机状态
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
} //挂机消息
if(ReadMessageGroup(i,MessageGroup_type)==DECODE_DTMF_MESSAGETYPE)
{//DTMF解码消息
if(ReadMessageGroup(i,(MessageGroup_datastar+1))==2)
{//收到2个拨号信息
if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+1)==0x01)
{//戴接电话功能
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
TakeTheRingPhone(telnum);
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
else if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+1)==0x08)
{//符合分机拨号标准
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
else
{//不符合分机拨号标准
extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
ClearAComGroup(extcomgroupID);//撤消通话组
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
}
if(ReadMessageGroup(i,(MessageGroup_datastar+1))==3)
{//收到3个拨号信息
if(ReadDTMF_Decord((ReadMessageGroup(i,MessageGroup_datastar)),dtmfdecord_datastar+2)==0x00)
{//符合分机拨号标准
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
else
{//不符合分机拨号标准
extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
ClearAComGroup(extcomgroupID);//撤消通话组
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -