📄 communication.c
字号:
WriteExtTelState(telnum,exttel_hold);//改变分机状态
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}
else
{//分机非空闲状态
exttel_switch_dialing_error_deal(telnum);
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}
}
}
}
}//解码消息
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//分机线消息
}//消息查询
}//是否有消息
}//函数
void exttel_switch_dialing_error_deal(UCHAR telnum)
{
idata UCHAR extcomgroupID;
extcomgroupID=findextcomgroupbyorigin(telnum);
if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
{//该挂机分机为内部通话主叫方
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100); //断开音乐
Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),extcomgroupID,OFF);//切断通话
SetExtTelErrorSound(ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID); //给出错误提示音
WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_object)-EXTTEL_ID),exttel_error);//改变分机状态
ClearAComGroup(extcomgroupID);//撤消通话组
}
if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
{//该挂机分机为外部通话
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100); //断开音乐
HoldOutsideLine(extcomgroupID);//挂机
WriteOutTelState(extcomgroupID,outtel_hold);//改变外线状态
ClearAComGroup(extcomgroupID);//撤消通话组
}
extcomgroupID=findextcomgroupbyobject(telnum);
if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
{//该挂机分机为内部通话被叫方
ReleaseDTMFRes(MACHINE_ID[telnum]);//释放DTMF解码资源
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
CutTowPoint_CD22100(extcomgroupID+1,MUSIC_22100); //断开音乐
Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),extcomgroupID,OFF);//切断通话
SetExtTelErrorSound(ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID); //给出错误提示音
WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_error);//改变分机状态
ClearAComGroup(extcomgroupID);//撤消通话组
}
}
void exttel_error_deal(UCHAR telnum)
{
idata UCHAR i;
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)
{ //挂机消息
WriteExtTelState(telnum,exttel_hold); //改变分机状态
SetExtTelQuietSound(telnum); //停止错误提示音
RawMessageNum--; //释放消息资源
ClearAMessage(i);
return;
}
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
}//分机线消息
}//消息查询
}//是否有消息
}//函数
void ClearAMessage(UCHAR messageID)
{
idata UCHAR i;
for(i=0;i<MessageGroup_length;i++)
{
WriteMessageGroup(messageID,i,0);
}
}
void ClearAComGroup(UCHAR comgroupID)
{
idata UCHAR i;
for(i=0;i<ExtComGroup_length;i++)
{
WriteExtComGroup(comgroupID,i,0);
}
}
void SendUnholdMessage(UCHAR exttelnum)
{//发送摘机检测消息
idata UCHAR i;
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_type)==0)
{
WriteMessageGroup(i,MessageGroup_type,EXTTEL_UNHOLD_MESSAGETYPE);
WriteMessageGroup(i,MessageGroup_origin,MACHINE_ID[exttelnum]);
RawMessageNum++;
return;
}
}
//暂时没有消息资源
}
void SendHoldMessage(UCHAR exttelnum)
{//发送挂机检测消息
idata UCHAR i;
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_type)==0)
{
WriteMessageGroup(i,MessageGroup_type,(EXTTEL_HOLD_MESSAGETYPE));
WriteMessageGroup(i,MessageGroup_origin,(MACHINE_ID[exttelnum]));
RawMessageNum++;
return;
}
}
//暂时没有消息资源
}
UCHAR findextcomgroupbyorigin(UCHAR telnum)
{
idata UCHAR i;
for(i=0;i<COMMUNICATIONGROUPNUM;i++)
{ //查找通话组资源
if(ReadExtComGroup(i,ExtComGroup_origin)==MACHINE_ID[telnum])
{
return i;
}
}
return 0xff;
}
UCHAR findextcomgroupbyobject(UCHAR telnum)
{
idata UCHAR i;
for(i=0;i<COMMUNICATIONGROUPNUM;i++)
{ //查找通话组资源
if(ReadExtComGroup(i,ExtComGroup_object)==MACHINE_ID[telnum])
{
return i;
}
}
return 0xff;
}
UCHAR testextcomgroup_inside()
{
idata UCHAR i;
for(i=OUTSIDETELNUM;i<4;i++)
{
if(ReadExtComGroup(i,ExtComGroup_state)==0)
{return i;}
}
return 0xff;
}
UCHAR testoutline(UCHAR outtelnum)
{
if(ReadExtComGroup(outtelnum,ExtComGroup_state)==0)
{
return outtelnum;
}
else
{
return 0xff;
}
}
void CreatExtComGroupByID(UCHAR extcomgroupID,UCHAR origin, UCHAR object, UCHAR type)
{
WriteExtComGroup(extcomgroupID,ExtComGroup_state,1); //通话组开始启动
WriteExtComGroup(extcomgroupID,ExtComGroup_origin,origin);
WriteExtComGroup(extcomgroupID,ExtComGroup_object,object);
WriteExtComGroup(extcomgroupID,ExtComGroup_type,type);
}
UCHAR CreateExtComGroup(UCHAR origin_call) //origin_call 为分机号码 0,1,2,3,4,5,6,7
{
idata UCHAR i;
for(i=0;i<COMMUNICATIONGROUPNUM;i++)
{ //查找通话组资源
if(ReadExtComGroup(i,ExtComGroup_state)==0)
{
WriteExtComGroup(i,ExtComGroup_state,1); //通话组开始启动
WriteExtComGroup(i,ExtComGroup_origin,MACHINE_ID[origin_call]); //源分机
if(i>=OUTSIDETELNUM)
{//外线已使用完毕,只能进行内部通话 通话类型位内部通话
WriteExtComGroup(i,ExtComGroup_type,INSIDECOMTYPE); //初始化为内部通话
}
else
{//先定义为外部通话类型
WriteExtComGroup(i,ExtComGroup_type,OUTSIDECOMTYPE);//初始化为外部通话类型
}
return i;
}
}
//暂时没有可用资源时的处理方法
return 0xFF; //出错标志
}
void SendDecodeMessage(UCHAR exttelnum,UCHAR decode_data_length, UCHAR dtmfnum) //
{//发送解得DTMF码消息
idata UCHAR i;
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_type)==0)
{
WriteMessageGroup(i,MessageGroup_type,DECODE_DTMF_MESSAGETYPE);
WriteMessageGroup(i,MessageGroup_origin,(exttelnum));
WriteMessageGroup(i,MessageGroup_datastar,(dtmfnum));
WriteMessageGroup(i,(MessageGroup_datastar+1),decode_data_length);
RawMessageNum++;
return;
}
}
//暂时没有消息资源
}
void SendOutsideCallInMessage(UCHAR linenum, UCHAR ringnum)
{//发送外线振铃消息
idata UCHAR i;
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_type)==0)
{
WriteMessageGroup(i,MessageGroup_type,(OUTSIDE_CALL_IN_MESSAGETYPE));
WriteMessageGroup(i,MessageGroup_origin,OUTSIDELINE_ID[linenum]);
WriteMessageGroup(i,MessageGroup_datastar,ringnum);
RawMessageNum++;
return;
}
}
//暂时没有消息资源
}
void TakeTheRingPhone(UCHAR telnum)
{
idata UCHAR i,temp,extcomgroupID;
for(i=0;i<ExtTelNum;i++)
{//查找是否有正在振铃的电话
if(ReadExtTelState(i)==exttel_ring)
{//存在正在振铃的分机
temp=i; //保存此分机号
break;
}
else{temp=0xff;}
}
extcomgroupID=findextcomgroupbyorigin(telnum);//取得通话组编号
ClearAComGroup(extcomgroupID);//撤消通话组
if(temp==0xff)
{//无振铃分机
SetExtTelErrorSound(telnum); //给出错误提示音
WriteExtTelState(telnum,exttel_error);//改变分机状态
return;
}
else
{//存在振铃分机,进行代街动作
extcomgroupID=findextcomgroupbyobject(temp);
if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==INSIDECOMTYPE))
{//该挂机分机为内部通话
ExtTelStopRing(temp);//停止原振铃分机振铃
WriteExtTelState(temp,exttel_hold);//改变分机状态
WriteExtComGroup(extcomgroupID,ExtComGroup_object,MACHINE_ID[telnum]);//改变通话组通话成员
SetExtTelQuietSound(ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID);//停止主叫方的等待提示音
Writesoundway((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),extcomgroupID,ON);//建立通话连接通路
Writesoundway(telnum,extcomgroupID,ON);//建立通话连接通路
WriteExtTelState((ReadExtComGroup(extcomgroupID,ExtComGroup_origin)-EXTTEL_ID),exttel_useing);//改变分机状态
WriteExtTelState(telnum,exttel_useing);//改变分机状态
return;
}
extcomgroupID=findextcomgroupbyorigin(temp);
if((extcomgroupID!=0xff)&(ReadExtComGroup(extcomgroupID,ExtComGroup_type)==OUTSIDECOMTYPE))
{//该挂机分
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -