📄 dial.c
字号:
//***************************************************************
// Dial.c
// By: SG 2003/12/30
//***************************************************************
#define Modul_Dial 1
#include "805xall.h" //包含的头文件集合
//---------------------------------------------------------------
// 变量定义
//---------------------------------------------------------------
BOOL bHaveKeyPressed; // =1 之前有按键
BOOL bIsTalking; // =1 进入通话
BOOL bDialVTSBit;
BYTE data DialLen; // 按键个数
BYTE data *DialBufPtr; // 按键缓存区写指针
BYTE data DialVTSLen; // 拨VTS的个数
BYTE data *DialVTSPtr; // 拨VTS读指针
BYTE data DialBuf[cnDialBufLen]; // 拨号缓存
WORD data AutoDialTmr; // 智能拨号定时器
//===============================================================
WORD code EepDialParaAddr_Tab[] = {
(cnNoDialLocalLen<<8) + cnNoDialLocalNum,
cnNoDialLocalAddr,
(cnChargeHeadCharLen<<8) + cnChargeHeadCharNum,
cnChargeHeadCharAddr,
(cnDialLenghLen<<8) + cnDialLenghNum,
cnDialLenghAddr,
(cnForbitDialCodeLen<<8) + cnForbitDialCodeNum,
cnForbitDialCodeAddr,
(cnLocalLen<<8) + cnLocalNum,
cnLocalAddr
};
//------------------------------
BYTE code SpecialCall_Tab[][4] = {
0x96,0x16,0x8F, 5, // 96168
0x19,0x38,0x8F, 5, // 19388
0x17,0x95,0x1F,16, // 17951
0x17,0x93,0x0F, 5, // 17930
0x17,0x92,0x0F, 5, // 17920
0x17,0x91,0x1F,16, // 17911
0x17,0x91,0x0F, 5, // 17910
0x17,0x90,0x9F,16, // 17909
0x17,0x90,0x8F, 5, // 17908
0x10,0x00,0x0F, 5, // 10000
0x18,0x61,0xFF, 4, // 1861
0x18,0x60,0xFF, 4, // 1860
0x10,0x01,0xFF, 4, // 1001
0x10,0x00,0xFF, 4, // 1000
0x20,0x0F,0xFF, 3, // 200
0x19,0x9F,0xFF,11, // 199
0x19,0x8F,0xFF, 3, // 198
0x19,0x3F,0xFF,14, // 193
0x19,0x1F,0xFF, 3, // 191
0x17,0x0F,0xFF, 3, // 170
0x12,0x9F,0xFF,10, // 129
0x12,0x8F,0xFF, 3, // 128
0x12,0x7F,0xFF,10, // 127
0x12,0x6F,0xFF, 3, // 126
0x12,0x2F,0xFF, 3, // 122
0x12,0x0F,0xFF, 3, // 120
0x11,0x9F,0xFF, 3, // 119
0x11,0x7F,0xFF, 3, // 117
0x11,0x4F,0xFF, 3, // 114
0x11,0x2F,0xFF, 3, // 112
0x11,0x0F,0xFF, 3, // 110
0x13,0xFF,0xFF,11, // 13
0x00,0xFF,0xFF,12, // 00
0x9F,0xFF,0xFF, 7, // 9
0x8F,0xFF,0xFF, 7, // 8
0x7F,0xFF,0xFF, 7, // 7
0x6F,0xFF,0xFF, 7, // 6
0x5F,0xFF,0xFF, 7, // 5
0x4F,0xFF,0xFF, 7, // 4
0x3F,0xFF,0xFF, 7, // 3
0x2F,0xFF,0xFF, 7, // 2
0x1F,0xFF,0xFF, 7, // 1
0x0F,0xFF,0xFF,11, // 0
0xFF
};
//***************************************************************
// void FillDialBuf(void)
//
// Func: 复位拨号缓存
//***************************************************************
void FillDialBuf(void)
{
BYTE i;
DialLen = 0x00;
DialBufPtr = DialVTSPtr = &DialBuf;
for(i=0; i<cnDialBufLen; i++) DialBuf[i] = 0xFF;
}
//***************************************************************
// void StoreDialNumKey(BYTE)
//
// Func: 存储按键值
//***************************************************************
void StoreDialNumKey(BYTE KeyValue)
{
BYTE i;
if(!bHaveKeyPressed)
{ // 之前没有按键
bHaveKeyPressed = TRUE;
DialVTSLen = 0x00;
bDialVTSBit = FALSE;
DialVTSPtr = DialBufPtr;
FillDialBuf();
}
if(DialBufPtr >= (&DialBuf+cnDialBufLen))
{ // 按键长度是否溢出
for(i=0; i<cnDialBufLen; i++)
{
DialBuf[i] = DialBuf[i+1];
}
DialBufPtr = &DialBuf + cnDialBufLen - 1;
--DialVTSPtr;
}
++DialLen;
if(DialLen & 0x01)
{ // 按键存储顺序: 13 80 01 38 00 0F FF FF FF
*DialBufPtr = (KeyValue<<4) | 0x0F;
}
else
{
*DialBufPtr &= (0xF0 | KeyValue);
++DialBufPtr;
}
}
//***************************************************************
// WORD EepMatchString(BYTE MatchNo,BYTE idata *SrcPtr)
//
// Func: 比较SrcPtr中的数据是否符合Eep中定义的数据
//***************************************************************
WORD EepMatchString(BYTE MatchNo,BYTE idata *SrcPtr)
{
BYTE i;
BYTE DialParaLen,DialParaNum;
WORD wDialParaAddr;
DialParaNum = (BYTE)(EepDialParaAddr_Tab[2*MatchNo]); // "拨号规则"参数组数
DialParaLen = (BYTE)(EepDialParaAddr_Tab[2*MatchNo] >> 8); // "拨号规则"参数每组长度
wDialParaAddr = EepDialParaAddr_Tab[2*MatchNo+1]; // "拨号规则"参数Eep存储起始地址
for(; DialParaNum>0; DialParaNum--)
{
EepromRead(DialParaLen,TempBuf,wDialParaAddr);
if(TempBuf[0] != 0xFF)
{
for(i=0; i<DialParaLen; i++)
{
if(TempBuf[i] != *(SrcPtr+i))
{
if(((((TempBuf[i]>>4) == (*(SrcPtr+i)>>4)) && (TempBuf[i]&0x0F) == 0x0F)) || ((TempBuf[i]&0xF0) == 0xF0))
{ // 匹配成功
if(MatchNo == cnDialLengh) return((TempBuf[5]<<8) | cnMatchSucc);
else
{
if((TempBuf[i]>>4) == 0x0F) return(((2*i)<<8) | cnMatchSucc);
else return(((2*i+1)<<8) | cnMatchSucc);
}
}
else
{ // 拨号长度不够
if(((*(SrcPtr+i)&0x0F) == 0x0F) || ((*(SrcPtr+i)&0xF0) == 0xF0)) return(cnMatchNoLen);
else break;
}
}
else
{
if(((TempBuf[i]>>4) == 0x0F) || ((TempBuf[i] & 0x0F) == 0x0F))
{
if(MatchNo == cnDialLengh) return((TempBuf[5]<<8) | cnMatchSucc);
else
{
if((TempBuf[i]>>4) == 0x0F) return(((2*i)<<8) | cnMatchSucc);
else return(((2*i+1)<<8) | cnMatchSucc);
}
}
}
}
}
wDialParaAddr += DialParaLen; // 下一组参数首地址
}
// 匹配失败
return(cnMatchFail);
}
//***************************************************************
// void AutoDialLen(void)
//
// Func: 判断拨号长度
//***************************************************************
#define cnOut 0xAA
//------------------------------
void AutoDialLen(void)
{
BYTE i,j;
BYTE AutoDialPara;
BYTE AutoDialLenMin;
if((BYTE)EepMatchString(cnDialLengh,DialBuf) == cnMatchSucc) AutoDialLenMin = (BYTE)(EepMatchString(cnDialLengh,DialBuf) >> 8);
else
{
for(i=0; ; i++)
{
if(SpecialCall_Tab[i][0] == 0xFF)
{ // 搜索到定义表的尾部
AutoDialLenMin = 0xFA;
break;
}
for(j=0; j<4; j++)
{
AutoDialPara = SpecialCall_Tab[i][j];
if(DialBuf[j] != AutoDialPara)
{ // (13800138000F<---->13FFFF04) 或 (1795 10 755F<---->1795 1F 10)
if(((AutoDialPara & 0xF0) == 0xF0) || (((AutoDialPara & 0xF0) == (DialBuf[j]&0xF0)) && ((AutoDialPara & 0x0F) == 0x0F)))
{
AutoDialLenMin = SpecialCall_Tab[i][3];
j = cnOut;
}
break;
}
else
{ // (1861FFFF<---->1861FF04) 或 (110FFFFF<---->110FFF03)
if(((AutoDialPara & 0xF0) == 0xF0) || ((AutoDialPara & 0x0F) == 0x0F))
{
AutoDialLenMin = SpecialCall_Tab[i][3];
j = cnOut;
break;
}
}
}
if(j == cnOut) break;
}
}
if(DialLen >= AutoDialLenMin)
{ // 拨号长度到
if(AutoDialLenMin <= 0x05) AutoDialTmr = cnDialTimer0s5; // 特服号码
else AutoDialTmr = cnDialTimer1s5; // 普通号码
}
else AutoDialTmr = cnDialTimer6s; // 不满足定义的拨号长度
}
//***************************************************************
// BYTE HdlDialData(BYTE DialData)
//
// Func: 拨号数据处理
//***************************************************************
BYTE HdlDialData(BYTE DialData)
{ // 拨号数据变换为"ASCII"码
if(DialData == cnKeyXing) return('*');
else if(DialData == cnKeyJin) return('#');
else return('0' + DialData);
}
//***************************************************************
// void AutoDialCall(void)
//
// Func: 智能拨号
//***************************************************************
void AutoDialCall(void)
{
BOOL bAutoDialBit;
BYTE i,j;
BYTE AutoDialCallData;
if(!AutoDialTmr) return;
if(--AutoDialTmr) return;
if(DialLen < cnDialLenMin) return;
// 判断是否是禁拨号码
if((BYTE)EepMatchString(cnForbitDial,DialBuf) == cnMatchSucc)
{ // 禁拨号码
PlayBusyTone(cnOn); // 放忙音
return;
}
if((BYTE)EepMatchString(cnLocalCall,DialBuf) == cnMatchFail)
{ // 没有包含有本地区号
if((BYTE)EepMatchString(cnChangeHead,DialBuf) == cnMatchSucc)
{ // 字头替换: 01 3F FF FF FF 17 95 11 3F FF
j = (BYTE)(EepMatchString(cnChangeHead,DialBuf) >> 8);
F0 = FALSE;
for(i=5; i<10; i++)
{
if((TempBuf[i] >> 4) == 0x0F) break;
else if((TempBuf[i] & 0x0F) == 0x0F)
{
F0 = TRUE;
break;
}
}
if(j & 0x01) bAutoDialBit = TRUE;
else bAutoDialBit = FALSE;
j = j / 2;
for(AutoDialCallData=0; j<(cnDialLenMax/2); ++AutoDialCallData)
{
if(F0)
{
if(bAutoDialBit)
{ // 01 3F FF FF FF 17 95 11 3F FF
TempBuf[i] = TempBuf[i] & (DialBuf[j] | 0xF0);
}
else
{ // 07 FF FF FF FF 17 95 10 7F FF
++j;
TempBuf[i] = TempBuf[i] & ((DialBuf[j] >> 4) | 0xF0);
}
++i;
}
else
{
TempBuf[i] = 0xFF;
if(bAutoDialBit)
{ // 01 3F FF FF FF 17 95 10 13 FF
TempBuf[i] = TempBuf[i] & ((DialBuf[j] << 4) | 0x0F);
}
else
{ // 18 60 FF FF FF 05 92 18 60 FF
++j;
TempBuf[i] = TempBuf[i] & (DialBuf[j] | 0x0F);
}
}
F0 = !F0;
bAutoDialBit = !bAutoDialBit;
}
for(i=0,j=5; i<cnDialBufLen; i++,j++)
{
DialBuf[i] = TempBuf[j];
}
}
if((BYTE)EepMatchString(cnNoDialLocal,DialBuf) == cnMatchFail)
{ // 加拨区号
FillTempBuf();
EepromRead(cnLocalLen,TempBuf,cnLocalAddr);
F0 = FALSE;
for(i=0; i<cnLocalLen; i++)
{
if((TempBuf[i]>>4) == 0x0F) break;
else if((TempBuf[i] & 0x0F) == 0x0F)
{
F0 = TRUE;
break;
}
}
bAutoDialBit = FALSE;
for(j=AutoDialCallData=0; j<(cnDialLenMax/2); ++AutoDialCallData)
{
if(F0)
{ // 01 0F FF FF FF
if(bAutoDialBit)
{
TempBuf[i] = TempBuf[i] & (DialBuf[j] | 0xF0);
++j;
}
else TempBuf[i] = TempBuf[i] & ((DialBuf[j] >> 4) | 0xF0);
++i;
}
else
{ // 05 92 FF FF FF
if(bAutoDialBit)
{
TempBuf[i] = TempBuf[i] & ((DialBuf[j]<<4) | 0x0F);
++j;
}
else TempBuf[i] = TempBuf[i] & (DialBuf[j] | 0x0F);
}
F0 = !F0;
bAutoDialBit = !bAutoDialBit;
}
for(i=j=0; i<cnDialBufLen; i++,j++)
{
DialBuf[i] = TempBuf[j];
}
}
}
bDialVTSBit = FALSE;
FillTempBuf();
for(i=0; i<(cnDialLenMax/2); i++)
{
AutoDialCallData = DialBuf[i] >> 4;
if(AutoDialCallData == 0x0F)
{
TempBuf[2*i] = 0xFF;
break;
}
else TempBuf[2*i] = HdlDialData(AutoDialCallData);
AutoDialCallData = DialBuf[i] & 0x0F;
if(AutoDialCallData == 0x0F)
{
bDialVTSBit = TRUE;
TempBuf[2*i+1] = 0xFF;
break;
}
else TempBuf[2*i+1] = HdlDialData(AutoDialCallData);
}
PostATcmd(cnATcmd_ATD);
DialVTSLen = 0x00;
DialVTSPtr = DialBufPtr;
}
//***************************************************************
// void DialVTS(void)
//
// Func: 通话中的按键拨号
//***************************************************************
void DialVTS(void)
{
if(bConfigureG4 && bIsTalking)
{ // 普通接入设备的通话中
if(!DialVTSLen) return; // 没有VTS按键
--DialVTSLen;
bDialVTSBit = !bDialVTSBit;
if(bDialVTSBit) TempBuf[0] = HdlDialData(*DialVTSPtr >> 4);
else
{
TempBuf[0] = HdlDialData(*DialVTSPtr & 0x0F);
++DialVTSPtr;
}
TempBuf[1] = 0xFF;
PostATcmd(cnATcmd_VTS);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -