📄 ext2.c
字号:
{
DoorRingPre=DoorRingRd; //更新寄存值 OutsideRingRd: 1=Nothing 0=Ring
return;
}
if(DoorRingRd)
{
Ext2_FunPt=5; // fnExt2_Err
Writesoundway(Connect_Busy,cX_Ext2,ON);
CallCenterState=0;
SetBit(PORTB,HoldDoor);
fnCutOffY4Y5(Ext2_LineY4Y5Num);
Ext2_LineY4Y5Num=0;
return;
}
if(bit_is_clear(ExtTelStateCheck,cExt2Num))
{
Ext2_FunPt=0; //0 fnExt2_Free 内线空闲
fnCutOffY4Y5(Ext2_LineY4Y5Num);
Ext2_LineY4Y5Num=0;
SetBit(PORTB,HoldDoor);
CallCenterState=0;
return;
}
}
void fnExt2_FlashDTMF(void) //10
{
if(!(ExtTelStateCheck & cExt2Bit))
{
if(!(ExtTelFlashState & cExt2Bit)) //挂机
{
Ext2_FunPt=0; //0 fnExt2_Free 内线空闲
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
fnCutOffDTMF(mExt2_Link[1]);
Writesoundway(Connect_Flash,(mExt2_Link[1]+13),OFF); //连接模拟电信音
Writesoundway(Connect_Flash,cX_Ext2,OFF); //连接模拟电信音
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
fnCutOffY4Y5(Ext2_LineY4Y5Num);
if(fnFindExtStillSong())
{
fnCutOffExtLineAndLinkToBusy(Ext2_LineY4Y5Num);
}
Ext2_LineY4Y5Num=0;
return;
}
else
{
fnCutOffLineIn(mExt2_Link[0]);
}
}
}
else
{
if((ExtTelFlashState & cExt2Bit )|| !Ext2_dialtime) //转接
{
goto Ext_Flashback1;
}
Ext2_dialtime--;
}
mDTMF_In=DTMF_Decode(mExt2_Link[1]);
if (!mDTMF_In) return;
if (mDTMF_In== cExt2Num+1 ){ goto Ext_Flashback1; }
if(MulTalkState)
{
if (mDTMF_In==cXin){ goto Ext_Flashback1; } //再次按“ * ”则为出错
}
else
{
if (mDTMF_In==cXin){ MulTalkState=1;return; } //按“ * ”设置三方通话标志 MulTalkState=1
}
fnCutOffDTMF(mExt2_Link[1]);
Writesoundway(Connect_Flash,(mExt2_Link[1]+13),OFF); //连接模拟电信音
if(fnExt_DTMFIN1(mDTMF_In,Ext2_LineY4Y5Num,cExt2Num,Ext2_NumdialOut))
{
goto Ext_FlashWaitRing;
}
else
{
goto Ext_Flashback1;
}
Ext_FlashWaitRing:
Ext2_FunPt=11;//本内线回铃
Ext2_dialtime=30000;
Writesoundway(Connect_Flash,WaitRing,ON); //连接回铃声
Ext2_FlashNumdialOut=mDTMF_In;
Ext2_MusicNumdialIn=Ext2_NumdialOut;
return;
Ext_Flashback1:
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
Ext2_dialtime=0;
fnCutOffDTMF(mExt2_Link[1]);
Writesoundway(Connect_Flash,(mExt2_Link[1]+13),OFF); //连接模拟电信音
Writesoundway(Connect_Flash,cX_Ext2,OFF); //连接模拟电信音
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
if(fnFindExtStillSong())
{
Ext2_FunPt=7;
fnExtCutOffMusic(7,Ext2_NumdialOut);
Writesoundway(Ext2_LineY4Y5Num,cExt2Num,ON);
}
else
{
Ext2_FunPt=5; //5 fnExt2_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音
}
return;
}
else
{
Ext2_FunPt=2;
Writesoundway(mExt2_Link[0]-1,cX_Music,OFF);
Writesoundway(mExt2_Link[0]-1,cExt2Num,ON);
return;
}
}
void fnExt2_FlashWaitRing(void) //11
{
if(!(ExtTelStateCheck & cExt2Bit))
{
if(!(ExtTelFlashState & cExt2Bit)) //挂机
{
Ext2_FunPt=0; //0 fnExt2_Free 内线空闲
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
fnCutOffFlash();
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
fnConnectMtoRExt(Ext2_MusicNumdialIn, Ext2_FlashNumdialOut);
}
else
{
fnConnectMtoROut(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
}
}
}
else
{
if((ExtTelFlashState & cExt2Bit )|| !Ext2_dialtime) //
{
Ext2_dialtime=0;
FlashtimeState=0; //只允许一次拍打
MulTalkState=0;
fnCutOffFlash();
fnStopExtRing(Ext2_FlashNumdialOut);
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
if(fnFindExtStillSong())
{
fnExtCutOffMusic(7,Ext2_NumdialOut);
Ext2_FunPt=7;
Writesoundway(Ext2_LineY4Y5Num,cExt2Num,ON);
return;
}
else
{
Ext2_FunPt=5; //5 fnExt2_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音
return;
}
}
else
{
Ext2_FunPt=2;
Writesoundway(mExt2_Link[0]-1,cX_Music,OFF);
Writesoundway(mExt2_Link[0]-1,cExt2Num,ON);
return;
}
}
Ext2_dialtime--;
}
}
void fnExt2_FlashRing(void) //12
{
if (bit_is_clear(ExtTelStateCheck,cExt2Num)) return; //本内线提机
Writesoundway(SigCallID,cX_Ext2,OFF); //断开响铃
ClrBit(ExtTelRingState,cExt2Num);
Writesoundway(Connect_Flash,WaitRing,OFF);
if(MulTalkState)
{
Writesoundway(Ext2_LineY4Y5Num,cX_Ext2,ON);
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
Ext2_FunPt=7;
fnConnectMtoExt(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
}
else
{
Ext2_FunPt=15;
fnConnectMtoOut(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
}
}
else
{
Ext2_FunPt=18; //7 fnExt2_LinkExtPhone 内线连内线
fnStopExtWaitRing(Ext2_FunPt,Ext2_FlashNumdialOut);
Writesoundway(Connect_Flash,cX_Ext2,ON); //提机接听
}
Ext2_dialtime = cTelTm50ms;
}
void fnExt2_FlashLinkExtPhone(void)
{
if (Ext2_dialtime) { Ext2_dialtime--; return; } // 10ms Delay
if (bit_is_set(ExtTelStateCheck,cExt2Num)) return;
Ext2_FunPt=0; //0 fnExt2_Free 内线空闲
fnCutOffFlash();
if(Flash_For_Out_Ext) //0 For Out 1 For Ext
{
fnConnectMtoExt(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
}
else
{
fnConnectMtoOut(Ext2_MusicNumdialIn,Ext2_FlashNumdialOut);
}
}
void fnExt2_LinkMusic(void) //13 连音乐 11->0,
{
if(!(ExtTelStateCheck & cExt2Bit)) //挂机
{
Ext2_FunPt=0; //0 fnExt2_Free 内线空闲
fnCutOffY4Y5(Ext2_LineY4Y5Num);
}
}
void fnExt2_LinkDTMF_InputExtNm(void) //14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6
{
unsigned char i;
if(bit_is_clear(ExtTelStateCheck,cExt2Num))
{
Ext2_FunPt=0; //0 fnExt2_Free 内线空闲
fnCutOffY4Y5(mExt2_Link[0]);
fnCutOffDTMF(mExt2_Link[1]);
return;
}
if(!Ext2_dialtime)
{
Ext2_FunPt=5; // fnExt2_Err
fnCutOffY4Y5(mExt2_Link[0]);
fnCutOffDTMF(mExt2_Link[1]);
Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音
return;
}
Ext2_dialtime--;
mDTMF_In=DTMF_Decode(mExt2_Link[1]);
if (!mDTMF_In) return;
Writesoundway(mExt2_Link[0],(mExt2_Link[0]+10),OFF); //断开模拟电信音
fnCutOffDTMF(mExt2_Link[1]);
if (mDTMF_In== cExt2Num+1 ) goto Lb_Warring; //拨打本机为出错
if(mDTMF_In==0x07) //呼叫中心
{
if(Doorphone_FunPt){ goto Lb_Warring; } //门口机在使用中
if(CallCenterState){ goto Lb_Warring; } //只允许一台分机呼叫中心
ClrBit(PORTB,HoldDoor);
CallCenterState=1;
Ext2_FunPt=19;
Ext2_dialtime =1000;
Ext2_LineY4Y5Num = mExt2_Link[0];
Writesoundway(Ext2_LineY4Y5Num,Doorphone,ON);
return;
}
if(mDTMF_In==cJing)//代接
{
if( !ExtTelRingState) goto Lb_Warring;
fnCutOffY4Y5(mExt2_Link[0]);
if (fnFindRingOutLine()) //代接外线
{
Ext2_FunPt=20; //fnExt2_4_RingForLineIn
return;
}
if (Doorphone_FunPt==1)
{
Ext2_FunPt=20;
return;
}
i=fnFindRingExtLine(cExt2Num);
if(i) //代接内线
{
Ext2_FunPt=9;
Ext2_NumdialIn =i;
Ext2_LineY4Y5Num=fnFindRingExtY4Y5();
return;
}
}
if(fnExt_DTMFIN2(mDTMF_In,cExt2Num,mExt2_Link[0]))
{
goto Ext_dialOut;
}
else
{
goto Lb_Warring;
}
Ext_dialOut:
Writesoundway(mExt2_Link[0],WaitRing,ON); //连接回铃声
Ext2_FunPt=6; //本内线回铃
Ext2_dialtime=30000; //20s
Ext2_NumdialOut=mDTMF_In;
Ext2_NumdialIn =Ext2_NumdialOut;
Ext2_LineY4Y5Num = mExt2_Link[0];
return;
Lb_Warring:
fnCutOffY4Y5(mExt2_Link[0]);
Ext2_FunPt=5; //5 fnExt2_Err Dial Wong Extension Numer / LintOut be TimeOut;
Writesoundway(Connect_Busy,cX_Ext2,ON); //;连接忙音
return;
}
const void (*Ext2_FunTab[]) PROGMEM=
{
fnExt2_Free, //0 内线空闲 - Check Hook 0-> 1,2,3,4
fnExt2_LinkLineOut_DTMF, //1 内线连外线 + DTMF 1-> 0,14,5(TimeOut) mExt2_Link[0] = Line In Num mExt2_Link[1]=DTMF Num
fnExt2_LinkLineOut, //2 内线连外线 2 ->0 mExt2_Link[x]
fnExt2_LinkDTMF, //3 内线连DTMF 3 ->14,5,6 mExt2_Link[0]=Y4Y5 mExt2_Link[1]=DTMF Num
fnExt2_NotLinkAnyThing, //4 内线没连任何线 4 -> 0 mExt2_Link[x]
fnExt2_Err, //5 Dial Wong Extension Numer / LintOut be TimeOut
fnExt2_WaitRing, //6 mExt2_Link[0]=Y4Y5 mExt2_Link[1]= Calling To Ext Number
fnExt2_LinkExtPhone, //7 内线连内线N 7 ->0, 8 mExt2_Link[0]=Y4Y5 mExt2_Link[1]= Calling To Ext Number
fnExt2_LinkBuzzSong, //8
fnExt2_Ringing, //9 响铃 9->2,7 mExt2_Link[0]=Y4Y5/Line In Num mExt2_Link[1]: 0=Line In 1=Ext Phone
fnExt2_FlashDTMF, //10
fnExt2_FlashWaitRing, //11
fnExt2_FlashRing, //12
fnExt2_LinkMusic, //13 连音乐 11->0,
fnExt2_LinkDTMF_InputExtNm, //14 内线连DTMF Wait Input (1-6,7,#) 3 ->5,6 mExt2_Link[0]=Y4Y5 mExt2_Link[1]=DTMF Num
fnExt2_RingingForLineIn, //15 Line In Call ->响铃
fnExt2_RingingForDoorphone, //16 Doorphone In Call ->响铃
fnExt2_LinkDoorphone, //17
fnExt2_FlashLinkExtPhone, //18
fnExt2_CenterWaitRing, //19
fnExt2_4_RingForLineIn //20 外线拨打分机,四台分机响铃
};
void fnTelRountineExt2(void)
{
void (*pp)(void);
pp= (void *) pgm_read_word_near(Ext2_FunTab+Ext2_FunPt);
pp();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -