📄 ext3.c
字号:
{
DoorRingPre=DoorRingRd; //更新寄存值 OutsideRingRd: 1=Nothing 0=Ring
return;
}
if(DoorRingRd)
{
Ext3_FunPt=5; // fnExt3_Err
Writesoundway(Connect_Busy,cX_Ext3,ON);
CallCenterState=0;
SetBit(PORTB,HoldDoor);
fnCutOffY4Y5(Ext3_LineY4Y5Num);
Ext3_LineY4Y5Num=0;
return;
}
if(bit_is_clear(ExtTelStateCheck,cExt3Num))
{
Ext3_FunPt=0; //0 fnExt3_Free 内线空闲
fnCutOffY4Y5(Ext3_LineY4Y5Num);
Ext3_LineY4Y5Num=0;
SetBit(PORTB,HoldDoor);
CallCenterState=0;
return;
}
}
void fnExt3_FlashDTMF(void) //10
{
if(!(ExtTelStateCheck & cExt3Bit))
{
if(!(ExtTelFlashState & cExt3Bit)) //挂机
{
Ext3_FunPt=0; //0 fnExt3_Free 内线空闲
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
fnCutOffDTMF(mExt3_Link[1]);
Writesoundway(Connect_Flash,(mExt3_Link[1]+13),OFF); //连接模拟电信音
Writesoundway(Connect_Flash,cX_Ext3,OFF); //连接模拟电信音
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
fnCutOffY4Y5(Ext3_LineY4Y5Num);
if(fnFindExtStillSong())
{
fnCutOffExtLineAndLinkToBusy(Ext3_LineY4Y5Num);
}
Ext3_LineY4Y5Num=0;
return;
}
else
{
fnCutOffLineIn(mExt3_Link[0]);
}
}
}
else
{
if((ExtTelFlashState & cExt3Bit )|| !Ext3_dialtime) //转接
{
goto Ext_Flashback1;
}
Ext3_dialtime--;
}
mDTMF_In=DTMF_Decode(mExt3_Link[1]);
if (!mDTMF_In) return;
if (mDTMF_In== cExt3Num+1 ){ goto Ext_Flashback1; }
if(MulTalkState)
{
if (mDTMF_In==cXin){ goto Ext_Flashback1; } //再次按“ * ”则为出错
}
else
{
if (mDTMF_In==cXin){ MulTalkState=1;return; } //按“ * ”设置三方通话标志 MulTalkState=1
}
fnCutOffDTMF(mExt3_Link[1]);
Writesoundway(Connect_Flash,(mExt3_Link[1]+13),OFF); //连接模拟电信音
if(fnExt_DTMFIN1(mDTMF_In,Ext3_LineY4Y5Num,cExt3Num,Ext3_NumdialOut))
{
goto Ext_FlashWaitRing;
}
else
{
goto Ext_Flashback1;
}
Ext_FlashWaitRing:
Ext3_FunPt=11;//本内线回铃
Ext3_dialtime=30000;
Writesoundway(Connect_Flash,WaitRing,ON); //连接回铃声
Ext3_FlashNumdialOut=mDTMF_In;
Ext3_MusicNumdialIn=Ext3_NumdialOut;
return;
Ext_Flashback1:
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
Ext3_dialtime=0;
fnCutOffDTMF(mExt3_Link[1]);
Writesoundway(Connect_Flash,(mExt3_Link[1]+13),OFF); //连接模拟电信音
Writesoundway(Connect_Flash,cX_Ext3,OFF); //连接模拟电信音
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
if(fnFindExtStillSong())
{
Ext3_FunPt=7;
fnExtCutOffMusic(7,Ext3_NumdialOut);
Writesoundway(Ext3_LineY4Y5Num,cExt3Num,ON);
}
else
{
Ext3_FunPt=5; //5 fnExt3_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
}
return;
}
else
{
Ext3_FunPt=2;
Writesoundway(mExt3_Link[0]-1,cX_Music,OFF);
Writesoundway(mExt3_Link[0]-1,cExt3Num,ON);
return;
}
}
void fnExt3_FlashWaitRing(void) //11
{
if(!(ExtTelStateCheck & cExt3Bit))
{
if(!(ExtTelFlashState & cExt3Bit)) //挂机
{
Ext3_FunPt=0; //0 fnExt3_Free 内线空闲
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
fnCutOffFlash();
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
fnConnectMtoRExt(Ext3_MusicNumdialIn, Ext3_FlashNumdialOut);
}
else
{
fnConnectMtoROut(Ext3_MusicNumdialIn,Ext3_FlashNumdialOut);
}
}
}
else
{
if((ExtTelFlashState & cExt3Bit )|| !Ext3_dialtime) //
{
Ext3_dialtime=0;
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
fnCutOffFlash();
fnStopExtRing(Ext3_FlashNumdialOut);
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
if(fnFindExtStillSong())
{
fnExtCutOffMusic(7,Ext3_NumdialOut);
Ext3_FunPt=7;
Writesoundway(Ext3_LineY4Y5Num,cExt3Num,ON);
return;
}
else
{
Ext3_FunPt=5; //5 fnExt3_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
return;
}
}
else
{
Ext3_FunPt=2;
Writesoundway(mExt3_Link[0]-1,cX_Music,OFF);
Writesoundway(mExt3_Link[0]-1,cExt3Num,ON);
return;
}
}
Ext3_dialtime--;
}
}
void fnExt3_FlashRing(void) //12
{
if (bit_is_clear(ExtTelStateCheck,cExt3Num)) return; //本内线提机
Writesoundway(SigCallID,cX_Ext3,OFF); //断开响铃
ClrBit(ExtTelRingState,cExt3Num);
Writesoundway(Connect_Flash,WaitRing,OFF);
if(MulTalkState)
{
Writesoundway(Ext3_LineY4Y5Num,cX_Ext3,ON);
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
Ext3_FunPt=7;
fnConnectMtoExt(Ext3_MusicNumdialIn,Ext3_FlashNumdialOut);
}
else
{
Ext3_FunPt=15;
fnConnectMtoOut(Ext3_MusicNumdialIn,Ext3_FlashNumdialOut);
}
}
else
{
Ext3_FunPt=18; //7 fnExt2_LinkExtPhone 内线连内线
fnStopExtWaitRing(Ext3_FunPt,Ext3_FlashNumdialOut);
Writesoundway(Connect_Flash,cX_Ext3,ON); //提机接听
}
Ext3_dialtime = cTelTm50ms;
}
void fnExt3_FlashLinkExtPhone(void)
{
if (Ext3_dialtime) { Ext3_dialtime--; return; } // 10ms Delay
if (bit_is_set(ExtTelStateCheck,cExt3Num)) return;
Ext3_FunPt=0; //0 fnExt3_Free 内线空闲
fnCutOffFlash();
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
fnConnectMtoExt(Ext3_MusicNumdialIn,Ext3_FlashNumdialOut);
}
else
{
fnConnectMtoOut(Ext3_MusicNumdialIn,Ext3_FlashNumdialOut);
}
}
void fnExt3_LinkMusic(void) //13 连音乐 11->0,
{
if(!(ExtTelStateCheck & cExt3Bit)) //挂机
{
Ext3_FunPt=0; //0 fnExt3_Free 内线空闲
fnCutOffY4Y5(Ext3_LineY4Y5Num);
}
}
void fnExt3_LinkDTMF_InputExtNm(void) //14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6
{
unsigned char i;
if(bit_is_clear(ExtTelStateCheck,cExt3Num))
{
Ext3_FunPt=0; //0 fnExt3_Free 内线空闲
fnCutOffY4Y5(mExt3_Link[0]);
fnCutOffDTMF(mExt3_Link[1]);
return;
}
if(!Ext3_dialtime)
{
Ext3_FunPt=5; // fnExt3_Err
fnCutOffY4Y5(mExt3_Link[0]);
fnCutOffDTMF(mExt3_Link[1]);
Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
return;
}
Ext3_dialtime--;
mDTMF_In=DTMF_Decode(mExt3_Link[1]);
if (!mDTMF_In) return;
Writesoundway(mExt3_Link[0],(mExt3_Link[0]+10),OFF); //断开模拟电信音
fnCutOffDTMF(mExt3_Link[1]);
if (mDTMF_In== cExt3Num+1 ) goto Lb_Warring; //拨打本机为出错
if(mDTMF_In==0x07) //呼叫中心
{
if(Doorphone_FunPt){ goto Lb_Warring; } //门口机在使用中
if(CallCenterState){ goto Lb_Warring; } //只允许一台分机呼叫中心
ClrBit(PORTB,HoldDoor);
CallCenterState=1;
Ext3_FunPt=19;
Ext3_dialtime =1000;
Ext3_LineY4Y5Num = mExt3_Link[0];
Writesoundway(Ext3_LineY4Y5Num,Doorphone,ON);
return;
}
if(mDTMF_In==cJing)//代接
{
if( !ExtTelRingState) goto Lb_Warring;
fnCutOffY4Y5(mExt3_Link[0]);
if (fnFindRingOutLine()) //代接外线
{
Ext3_FunPt=20; //fnExt3_4_RingForLineIn
return;
}
if (Doorphone_FunPt==1)
{
Ext3_FunPt=20;
return;
}
i=fnFindRingExtLine(cExt3Num);
if(i) //代接内线
{
Ext3_FunPt=9;
Ext3_NumdialIn =i;
Ext3_LineY4Y5Num=fnFindRingExtY4Y5();
return;
}
}
if(fnExt_DTMFIN2(mDTMF_In,cExt3Num,mExt3_Link[0]))
{
goto Ext_dialOut;
}
else
{
goto Lb_Warring;
}
Ext_dialOut:
Writesoundway(mExt3_Link[0],WaitRing,ON); //连接回铃声
Ext3_FunPt=6; //本内线回铃
Ext3_dialtime=30000; //20s
Ext3_NumdialOut=mDTMF_In;
Ext3_NumdialIn =Ext3_NumdialOut;
Ext3_LineY4Y5Num = mExt3_Link[0];
return;
Lb_Warring:
fnCutOffY4Y5(mExt3_Link[0]);
Ext3_FunPt=5; //5 fnExt3_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext3,ON); //;连接忙音
return;
}
const void (*Ext3_FunTab[]) PROGMEM=
{
fnExt3_Free, //0 内线空闲 - Check Hook 0-> 1,2,3,4
fnExt3_LinkLineOut_DTMF, //1 内线连外线 + DTMF 1-> 0,14,5(TimeOut) mExt3_Link[0] = Line In Num mExt3_Link[1]=DTMF Num
fnExt3_LinkLineOut, //2 内线连外线 2 ->0 mExt3_Link[x]
fnExt3_LinkDTMF, //3 内线连DTMF 3 ->14,5,6 mExt3_Link[0]=Y4Y5 mExt3_Link[1]=DTMF Num
fnExt3_NotLinkAnyThing, //4 内线没连任何线 4 -> 0 mExt3_Link[x]
fnExt3_Err, //5 Dial Wong Extension Numer / LintOut be TimeOut
fnExt3_WaitRing, //6 mExt3_Link[0]=Y4Y5 mExt3_Link[1]= Calling To Ext Number
fnExt3_LinkExtPhone, //7 内线连内线N 7 ->0, 8 mExt3_Link[0]=Y4Y5 mExt3_Link[1]= Calling To Ext Number
fnExt3_LinkBuzzSong, //8
fnExt3_Ringing, //9 响铃 9->2,7 mExt3_Link[0]=Y4Y5/Line In Num mExt3_Link[1]: 0=Line In 1=Ext Phone
fnExt3_FlashDTMF, //10
fnExt3_FlashWaitRing, //11
fnExt3_FlashRing, //12
fnExt3_LinkMusic, //13 连音乐 11->0,
fnExt3_LinkDTMF_InputExtNm, //14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6 mExt3_Link[0]=Y4Y5 mExt3_Link[1]=DTMF Num
fnExt3_RingingForLineIn, //15 Line In Call ->响铃
fnExt3_RingingForDoorphone, //16 Doorphone In Call ->响铃
fnExt3_LinkDoorphone, //17
fnExt3_FlashLinkExtPhone, //18
fnExt3_CenterWaitRing, //19
fnExt3_4_RingForLineIn //20 外线拨打分机,四台分机响铃
};
void fnTelRountineExt3(void)
{
void (*pp)(void);
pp= (void *) pgm_read_word_near(Ext3_FunTab+Ext3_FunPt);
pp();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -