⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dial.c

📁 pstn实用拨号规则
💻 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 + -