📄 communication.c
字号:
/***************************************************************************
//Actpro International (SZ) Ltd
//Project :
//File :SoundInTel.c Compiler:Keil
//Editor: LIUYI
//Data: 06-01-04 Ver:
//General Function
*/
#include <switch.h>
xdata UCHAR ExtComGroup[COMMUNICATIONGROUPNUM][ExtComGroup_length] _at_ 0;
xdata UCHAR MessageGroup[MESSAGEGROUPNUMBER][MessageGroup_length] _at_ 80;
xdata UCHAR ExtTelState[ExtTelNum] _at_ 130;
xdata UCHAR ExtTelTime [ExtTelNum] _at_ 140;
xdata UCHAR OutTelState[OUTSIDETELNUM ] _at_ 150;
xdata UCHAR CID[CIDLENGTH] _at_ 230;
void CommunicationInit();
void WriteExtComGroup(UCHAR x,UCHAR y,UCHAR wData);
UCHAR ReadExtComGroup(UCHAR x,UCHAR y);
void WriteMessageGroup(UCHAR x,UCHAR y,UCHAR wData);
UCHAR ReadMessageGroup(UCHAR x,UCHAR y);
void SendUnholdMessage(UCHAR exttelnum);
void MessageDeal();
UCHAR CreateExtComGroup(UCHAR origin_call);
void ClearAMessage(UCHAR messageID);
void SendDecodeMessage(UCHAR exttelnum,UCHAR decode_data_length, UCHAR dtmfnum);
void SendHoldMessage(UCHAR exttelnum);
void ClearAComGroup(UCHAR comgroupID);
void SendOutsideCallInMessage(UCHAR linenum, UCHAR ringnum);
void WriteExtTelState(UCHAR num, UCHAR teldata);
UCHAR ReadExtTelState(UCHAR num);
void WriteCID(UCHAR num, UCHAR teldata);
UCHAR ReadCID(UCHAR num);
void ResResume(); //系统资源归原
UCHAR ReadExtTelTime(UCHAR num);
void WriteExtTelTime(UCHAR num, UCHAR time);
void ExtTimeDeal();
void exttel_hold_deal(UCHAR telnum);
void exttel_unhold_deal(UCHAR telnum);
void exttel_dialing_deal(UCHAR telnum);
UCHAR findextcomgroupbyorigin(UCHAR telnum);
UCHAR findextcomgroupbyobject(UCHAR telnum);
UCHAR testextcomgroup_inside();
void CreatExtComGroupByID(UCHAR extcomgroupID,UCHAR origin, UCHAR object, UCHAR type);
void exttel_sendCID_deal(UCHAR telnum);
void exttel_waiting_deal(UCHAR telnum);
void exttel_ring_deal(UCHAR telnum);
void exttel_error_deal(UCHAR telnum);
void exttel_useing_deal(UCHAR telnum);
UCHAR ReadOutTelState(UCHAR num);
void WriteOutTelState(UCHAR num, UCHAR teldata);
void outtel_hold_deal(UCHAR outtelnum);
UCHAR testoutline(UCHAR outtelnum);
void outtel_ring_deal(UCHAR outtelnum);
void outtel_using_deal(UCHAR outtelnum);
void time_exttel_unhold_deal(UCHAR telnum);
void exttel_flash_deal(UCHAR telnum);
void exttel_switch_deal(UCHAR telnum);
void time_exttel_flash_deal(UCHAR telnum);
void exttel_switch_dialing_deal(UCHAR telnum);
void exttel_switch_dialing_error_deal(UCHAR telnum);
void TakeTheRingPhone(UCHAR telnum);
idata UCHAR PORT_STORE;
idata UCHAR RawMessageNum; //记忆未处理的消息数目
const UCHAR MACHINE_ID[8]=
{
1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 , //分机编号
};
const UCHAR OUTSIDELINE_ID[2]=
{
0x11,0x12 //外线ID编号
};
#define EXTTELTIME_30S 150
#define EXTTELTIME_5S 25
#define EXTTELTIME_1S 5
void CommunicationInit()
{
idata UCHAR i,j;
dialog_open=0; //楼宇对讲初始化
dialog_take=0;
dialog_call=0;
WriteExtTelState(DIALOG_STATE,DIALOG_STATE_NONE); //初始化楼宇对讲状态
for(i=0;i<COMMUNICATIONGROUPNUM;i++)
{
for(j=0;j<ExtComGroup_length;j++)
{
WriteExtComGroup(i,j,0);
}
}
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
for(j=0;j<MessageGroup_length;j++)
{
WriteMessageGroup(i,j,0);
}
}
RawMessageNum=0;
for(i=0;i<ExtTelNum;i++)
{
WriteExtTelState(i,exttel_hold);
ReadExtTelTime(i); //分机时间初始化
WriteExtTelTime(i,0);
}
for(i=0;i<OUTSIDETELNUM;i++)
{
WriteOutTelState(i,outtel_hold);
ReadOutTelState(i);
}
for(i=0;i<CIDLENGTH;i++)
{
WriteCID(i,0x00);
}
WriteCID(CID_ptr,(CID_ptr+1));//初始化指针
}
void WriteExtComGroup(UCHAR x,UCHAR y,UCHAR wData)
{
PORT_STORE=PORT;
RCON=RCON_Bank0;
ExtComGroup[x][y]=wData;
PORT=PORT_STORE;
}
UCHAR ReadExtComGroup(UCHAR x,UCHAR y)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank0;
temp=ExtComGroup[x][y];
PORT=PORT_STORE;
return(temp);
}
void WriteMessageGroup(UCHAR x,UCHAR y,UCHAR wData)
{
PORT_STORE=PORT;
RCON=RCON_Bank0;
MessageGroup[x][y]=wData;
PORT=PORT_STORE;
}
UCHAR ReadMessageGroup(UCHAR x,UCHAR y)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank0;
temp=MessageGroup[x][y];
PORT=PORT_STORE;
return(temp);
}
void WriteExtTelTime(UCHAR num, UCHAR time)
{
PORT_STORE=PORT;
RCON=RCON_Bank0;
ExtTelTime[num]=time;
PORT=PORT_STORE;
return;
}
UCHAR ReadExtTelTime(UCHAR num)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank0;
temp=ExtTelTime[num];
PORT=PORT_STORE;
return(temp);
}
void WriteOutTelState(UCHAR num, UCHAR teldata)
{
PORT_STORE=PORT;
RCON=RCON_Bank0;
OutTelState[num]=teldata;
PORT=PORT_STORE;
return;
}
UCHAR ReadOutTelState(UCHAR num)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank0;
temp=OutTelState[num];
PORT=PORT_STORE;
return(temp);
}
void WriteExtTelState(UCHAR num, UCHAR teldata)
{
PORT_STORE=PORT;
RCON=RCON_Bank0;
ExtTelState[num]=teldata;
PORT=PORT_STORE;
return;
}
UCHAR ReadExtTelState(UCHAR num)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank0;
temp=ExtTelState[num];
PORT=PORT_STORE;
return(temp);
}
void WriteCID(UCHAR num, UCHAR teldata)
{
PORT_STORE=PORT;
RCON=RCON_Bank0;
CID[num]=teldata;
PORT=PORT_STORE;
return;
}
UCHAR ReadCID(UCHAR num)
{
idata UCHAR temp;
PORT_STORE=PORT;
RCON=RCON_Bank0;
temp=CID[num];
PORT=PORT_STORE;
return(temp);
}
void MessageDeal()
{
idata UCHAR i;
for(i=0;i<OUTSIDETELNUM;i++)
{
switch(ReadOutTelState(i))
{
case outtel_hold :outtel_hold_deal(i);break;
case outtel_ring :outtel_ring_deal(i);break;
case outtel_using :outtel_using_deal(i);break;
default:break;
}
}
for(i=0;i<ExtTelNum;i++) //内线处理
{
switch(ReadExtTelState(i))
{
case exttel_hold :exttel_hold_deal(i); break; //内线状态
case exttel_unhold :exttel_unhold_deal(i);break; //摘机空闲态
case exttel_dialing :exttel_dialing_deal(i);break; //拨号状态
case exttel_sendCID :exttel_sendCID_deal(i);break; //发送来电显示信号
case exttel_waiting :exttel_waiting_deal(i);break; //主叫方振铃等待状态
case exttel_ring :exttel_ring_deal(i);break; //振铃状态
case exttel_useing :exttel_useing_deal(i);break; //通话状态
case exttel_flash :exttel_flash_deal(i);break; //闪断状态
case exttel_switch :exttel_switch_deal(i);break; //转接状态
case exttel_switch_dialing:exttel_switch_dialing_deal(i);break; //转接拨号中
case exttel_error :exttel_error_deal(i);break; //出错状态
default:break;
}
}
return;
}
void outtel_hold_deal(UCHAR outtelnum)
{
idata UCHAR i,j,temp;
if(RawMessageNum!=0)
{
for(i=0;i<MESSAGEGROUPNUMBER;i++)
{
if(ReadMessageGroup(i,MessageGroup_origin)==OUTSIDELINE_ID[outtelnum])
{ //为本外线消息
if(ReadMessageGroup(i,MessageGroup_type)==OUTSIDE_CALL_IN_MESSAGETYPE)
{ //振铃消息
if(ReadMessageGroup(i,MessageGroup_datastar)==0x01)
{//第一声振铃
temp=testoutline(outtelnum);
if(temp==0xff)
{//此外线已占用
WriteOutTelState(outtelnum,outtel_used);
RawMessageNum--; //清楚已处理的消息
ClearAMessage(i);
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -