📄 ext5.c
字号:
#include "main.h"
void fnExt5_Free(void) //0 内线空闲
{
unsigned char i,j;
if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return; //本内线提机
Writesoundway(SigCallID,cExt5Num,OFF); //
i = fnLinkLineIn_Ext(cExt5Num); // Get Line Out
if (!i)
{
i= fnLinkExtLineY4Y5(cExt5Num);
if (!i) // Have not Y4Y5
{
Ext5_FunPt=4;//4 内线没连任何线
return;
}else // Get One of Y4 / Y5
{
j = fnLinkDTMF_Ext(i); // Get DTMF
if (!j) // No any DTMF
{
fnCutOffY4Y5(i);
Ext5_FunPt=4;//4 内线没连任何线
return;
}
}
mExt5_Link[0] =i;
mExt5_Link[1] =j;
Ext5_FunPt=3; //3 内线连DTMF
Ext5_dialtime=10000; //10s操作
}else
{
j = fnLinkDTMF_Ext(i-1); // Get DTMF
mExt5_Link[0] =i;
mExt5_Link[1] =j;
if (!j)
{
Ext5_FunPt=2; //2 内线连外线
Ext5_dialtime = 0;
}else
{
Ext5_FunPt=1; //1 内线连外线 + DTMF
Ext5_dialtime=10000; //10s操作
return;
}
}
}
void fnExt5_LinkLineOut_DTMF(void) //1 内线连外线 + DTMF
{
unsigned char i,j;
if (bit_is_clear(ExtTelStateCheck,cExt5Num))
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
fnCutOffLineIn(mExt5_Link[0]);
fnCutOffDTMF(mExt5_Link[1]);
return;
}
if(!Ext5_dialtime)
{
Ext5_FunPt=5; // fnExt5_Err
fnCutOffLineIn(mExt5_Link[0]);
fnCutOffDTMF(mExt5_Link[1]);
Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
return;
}
Ext5_dialtime--;
mDTMF_In=DTMF_Decode(mExt5_Link[1]);
if (!mDTMF_In) return;
if (mDTMF_In == cXin)
{
fnCutOffLineIn(mExt5_Link[0]);
fnCutOffDTMF(mExt5_Link[1]);
i= fnLinkExtLineY4Y5(cExt5Num);
if (!i)
{
Ext5_FunPt=5; //5 fnExt5_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
return;
}else
{
j = fnLinkDTMF_Ext(i); // Get DTMF
if (!j) // No any DTMF
{
Ext5_FunPt=5; //5 fnExt5_Err Dial Wong Extension Numer / LintOut be TimeOut;
fnCutOffY4Y5(i);
Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
return;
}
mExt5_Link[0] =i;
mExt5_Link[1] =j;
Ext5_FunPt=14; //14 fnExt5_LinkDTMF_InputExtNm 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6
Ext5_dialtime=10000; //10s操作
Writesoundway(mExt5_Link[0],(mExt5_Link[0]+10),ON); //连接模拟电信音
Writesoundway(mExt5_Link[0],cX_Ext5,ON); //连接模拟电信音
}
}
else // Not Key "*"
{
Ext5_FunPt=2; //fnExt5_LinkLineOut, //2 内线连外线 2 ->0
Ext5_dialtime=0;
fnCutOffDTMF(mExt5_Link[1]);
}
}
void fnExt5_LinkLineOut(void) //2 内线连外线 2 ->0
{
if (Ext5_dialtime) { Ext5_dialtime--; return; } // 10ms Delay
if(!(ExtTelStateCheck & cExt5Bit) && !(ExtTelFlashState & cExt5Bit)) //挂机
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
if(MulTalkState)
{
MulTalkState=0;
Writesoundway((mExt5_Link[0]-1),cExt5Num,OFF);
mExt5_Link[0]=0;
return;
}
fnCutOffLineIn(mExt5_Link[0]);
mExt5_Link[0]=0;
}
else if(ExtTelStateCheck & ExtTelFlashState & cExt5Bit) //转接
{
if(FlashtimeState) return; //只允许一次拍打
mExt5_Link[1]=fnLinkDTMF_Ext(Connect_Flash); //查找DTMF
if(mExt5_Link[1]) //有DTMF
{
FlashtimeState=1; //禁止其他分机拍打
Flash_For_Out_Ext=0; //0 For Out 1 For Ext
Ext5_NumdialOut=mExt5_Link[0];
Ext5_LineY4Y5Num=mExt5_Link[0];
Writesoundway(mExt5_Link[0]-1,cExt5Num,OFF);
Writesoundway(mExt5_Link[0]-1,cX_Music,ON);
Writesoundway(Connect_Flash,cX_Ext5,ON); //连接模拟电信音
Writesoundway(Connect_Flash,(mExt5_Link[1]+13),ON); //连接模拟电信音
Ext5_FunPt=10;
Ext5_dialtime=10000;
}
}
}
void fnExt5_LinkDTMF(void) //3 内线连DTMF 3 ->14,5,6
{
if (bit_is_clear(ExtTelStateCheck,cExt5Num))
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
fnCutOffY4Y5(mExt5_Link[0]);
fnCutOffDTMF(mExt5_Link[1]);
return;
}
if(!Ext5_dialtime)
{
Ext5_FunPt=5; // fnExt5_Err
fnCutOffY4Y5(mExt5_Link[0]);
fnCutOffDTMF(mExt5_Link[1]);
Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
return;
}
Ext5_dialtime--;
mDTMF_In=DTMF_Decode(mExt5_Link[1]);
if (!mDTMF_In) return;
if (mDTMF_In == cXin)
{
Ext5_FunPt=14; //14 fnExt5_LinkDTMF_InputExtNm 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6
Ext5_dialtime=10000; //10s操作
Writesoundway(mExt5_Link[0],(mExt5_Link[0]+10),ON); //连接模拟电信音
Writesoundway(mExt5_Link[0],cX_Ext5,ON); //连接模拟电信音
}else // Not Key "*"
{
Ext5_FunPt=5; //5 fnExt5_Err Dial Wong Extension Numer / LintOut be TimeOut; fnCutOffDTMF(mExt5_Link[1]);
fnCutOffY4Y5(mExt5_Link[0]);
Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
}
}
void fnExt5_NotLinkAnyThing(void) // //4 内线没连任何线 4 -> 0
{
if (bit_is_clear(ExtTelStateCheck,cExt5Num))
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
}
}
void fnExt5_Err(void) //5 Dial Wong Extension Numer / LintOut be TimeOut
{
if (bit_is_clear(ExtTelStateCheck,cExt5Num))
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
Writesoundway(Connect_Busy,cX_Ext5,OFF); //;断开忙音
return;
}
}
void fnExt5_WaitRing(void) //6 mExt5_Link[0]=Y4Y5 mExt5_Link[1]= Calling To Ext Number
{
if(bit_is_clear(ExtTelStateCheck,cExt5Num))
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
fnCutOffY4Y5(Ext5_LineY4Y5Num);
fnStopExtRing(Ext5_NumdialOut);
return;
}
if(!Ext5_dialtime)
{
Ext5_FunPt=5; // fnExt5_Err
fnCutOffY4Y5(Ext5_LineY4Y5Num);
fnStopExtRing(Ext5_NumdialOut);
Writesoundway(Connect_Busy,cX_Ext5,ON); //;连接忙音
return;
}
Ext5_dialtime--;
}
// mExt5_Link[1] = DTMF
// FlashtimeState =1
// Y7 -> cExt5Num + 450Hz(For DTMF)
// Ext5_LineY4Y5Num
void fnExt5_LinkExtPhone(void) //7 内线连内线N 7 ->0, 8 mExt5_Link[0]=Y4Y5 mExt5_Link[1]= Calling To Ext Number
{
if (Ext5_dialtime) { Ext5_dialtime--; return; } // 10ms Delay
if(!(ExtTelStateCheck & cExt5Bit) && !(ExtTelFlashState & cExt5Bit)) //挂机
{
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
if(MulTalkState)
{
MulTalkState=0;
Writesoundway(Ext5_LineY4Y5Num,cExt5Num,OFF);
Ext5_LineY4Y5Num=0;
return;
}
fnCutOffY4Y5(Ext5_LineY4Y5Num);
fnCutOffExtLineAndLinkToBusy(Ext5_LineY4Y5Num);
Ext5_LineY4Y5Num=0;
}
else if(ExtTelStateCheck & ExtTelFlashState & cExt5Bit) //转接
{
if(FlashtimeState) return; //只允许一次拍打
mExt5_Link[1]=fnLinkDTMF_Ext(Connect_Flash);
if(mExt5_Link[1])//有DTMF
{
FlashtimeState=1;
Flash_For_Out_Ext=1; //0 For Out 1 For Ext
Writesoundway(Ext5_LineY4Y5Num,cExt5Num,OFF);
Writesoundway(Connect_Flash,cExt5Num,ON);
Writesoundway(Connect_Flash,(mExt5_Link[1]+13),ON); //连接模拟电信音
Ext5_FunPt=10;
Ext5_dialtime=10000;
fnExtLinkMusic(Ext5_NumdialOut);
}
}
}
void fnExt5_LinkBuzzSong(void) //8
{
}
void fnExt5_Ringing(void) //9 分机拨打分机,响铃 9->2,7 mExt5_Link[0]=Y4Y5/Line In Num mExt5_Link[1]: 0=Line In 1=Ext Phone
{
if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return; //本内线提机
Writesoundway(SigCallID,cX_Ext5,OFF); //断开响铃
ClrBit(ExtTelRingState,cExt5Num);
Ext5_FunPt=7; //7 fnExt2_LinkExtPhone 内线连内线
fnStopExtWaitRing(Ext5_FunPt,Ext5_NumdialIn);
Ext5_NumdialOut=Ext5_NumdialIn;
Writesoundway(Ext5_LineY4Y5Num,cX_Ext5,ON); //提机接听
Ext5_dialtime = cTelTm50ms;
}
void fnExt5_RingingForLineIn(void) //15 外线拨打分机,响铃
{
if(bit_is_set(ExtTelStateCheck,cExt5Num))
{
Writesoundway(SigCallID,cX_Ext5,OFF); //断开响铃
ClrBit(ExtTelRingState,cExt5Num);
Ext5_FunPt=2; //2 内线连外线
mExt5_Link[0] = Ext5_NumdialIn;
Writesoundway((Ext5_NumdialIn-1),WaitRing,OFF);
fnConnectionOutLine(Ext5_NumdialIn,cX_Ext5);
Ext5_dialtime = cTelTm50ms;
return;
}
if(Ext5_dialtime)
{
if(!--Ext5_dialtime)
{
fnStopExtRing(cExt5Num+1);
fnCutOffLineIn(Ext5_NumdialIn);
}
}
}
void fnExt5_4_RingForLineIn(void) //20 外线拨打分机,四台分机响铃
{
unsigned char i;
if(bit_is_set(ExtTelStateCheck,cExt5Num))
{
Writesoundway(SigCallID,cX_Ext5,OFF); //断开响铃
ClrBit(ExtTelRingState,cExt5Num);
i=fnFindWhichLineInRingFirst();
if (!i) // It is a Fault
{
Ext5_FunPt=0;
}
else if (i==3) // Door Phone Dial In
{
Ext5_FunPt=17;
ClrBit(PORTB,HoldDoor);
Writesoundway(SigCallID,cX_Ext5,OFF); //连接响铃
ClrBit(ExtTelRingState,cExt5Num);
Writesoundway(Door_LineY4Y5Num,cExt5Num,ON);
Writesoundway(Door_LineY4Y5Num,Doorphone,ON);
Doorphone_FunPt=3;
}
else // Line In Dial In
{
Ext5_FunPt=2; //2 内线连外线
Ext5_NumdialIn = i;
mExt5_Link[0] = Ext5_NumdialIn;
Writesoundway((Ext5_NumdialIn-1),WaitRing,OFF);
fnConnectionOutLine(Ext5_NumdialIn,cX_Ext5);
Ext5_dialtime = cTelTm50ms;
}
fnStopAllExtRingFor_OutLine(); // 停止 内机响铃
}
}
void fnExt5_RingingForDoorphone(void) //16
{
if (bit_is_clear(ExtTelStateCheck,cExt5Num)) return; //本内线提机
Ext5_FunPt=17;
ClrBit(PORTB,HoldDoor);
Writesoundway(SigCallID,cX_Ext5,OFF); //连接响铃
ClrBit(ExtTelRingState,cExt5Num);
Writesoundway(Door_LineY4Y5Num,cExt5Num,ON);
Writesoundway(Door_LineY4Y5Num,Doorphone,ON);
}
void fnExt5_LinkDoorphone(void) //17
{
if (bit_is_set(ExtTelStateCheck,cExt5Num)) return; //本内线提机
Ext5_FunPt=0; //0 fnExt5_Free 内线空闲
SetBit(PORTB,HoldDoor);
fnCutOffY4Y5(Door_LineY4Y5Num);
}
void fnExt5_CenterWaitRing(void)
{
if (Ext5_dialtime) { Ext5_dialtime--; return; } // 10ms Delay
DoorRingRd=PINB & 0x04; //PB4:HoldDoor PB2:CheckDoorRing PB1:Out PB0:In
if(DoorRingPre!=DoorRingRd) //去抖动
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -