📄 callerid.c
字号:
/*-----------------------------
* callerId.c - 来电显示相关功能源文件
*
* Description:
*
* Author: ZhengQishan
*
* Modified history
*------------------------------
* 2006-6-1 15:13 ZhengaQishan Created.
*
**/
#include "m803xx.h"
#include "ctype.h"
#include "sysLib.h"
#include "bootLib.h"
#include "fioLib.h"
#include "private/vmLibP.h"
#include "inetLib.h"
#include "ioLib.h"
#include "t38fax.h"
#include "globalVarDef.h"
UINT16 gCallerIdArg[21] = {0x0801, 0x00b6, 0x0101, 0x002c, 0xb400, 0x0602, 0x00d4, 0x0001, 0x0064, 0x0a03,
0x5208, 0xbe0a, 0x0050, 0x00d4, 0x00d4, 0x0a04, 0x6461, 0x0028, 0x00c8, 0x0101, 0x002c};
void M80320_CID_Digit_Set(UINT8 PortNo, char *digit, UINT8 Len)
{
UINT8 i;
if((PortNo >= 64)||(Len == 0))return;
m_port[PortNo].CID_Len = Len;
for(i=0; i<Len; i++)
{
m_port[PortNo].CID_digit[i] = digit[i];
if(VoIP_CID_Printf == 1)printf("Digit Num %d = %d\n", i, m_port[PortNo].CID_digit[i]);
}
printf("Digit Len = %d\n",m_port[PortNo].CID_Len);
}
char VoIP_CID_Default_Digit = 48; /*初始化为0,ASC*/
void Set_CID_Default_Digit(char digit)
{
VoIP_CID_Default_Digit = digit;
}
#if 0
void getSysDateTime(char *pDateTime)
{
ABSClock_STRUC ABSClock;
Ros_GetCurrentClockwithTimeZone(&ABSClock);
*pDateTime++ = ABSClock.mon / 10;
*pDateTime++ = ABSClock.mon % 10;
*pDateTime++ = ABSClock.mday / 10;
*pDateTime++ = ABSClock.mday % 10;
*pDateTime++ = ABSClock.hour/ 10;
*pDateTime++ = ABSClock.hour % 10;
*pDateTime++ = ABSClock.min / 10;
*pDateTime++ = ABSClock.min % 10;
}
#endif
void M80320_CID_Digit(UINT32 Port, char *digit, UINT8 Len)
{
UINT8 i,j = 0;
UINT8 PortNo, PinNum, Channel;
/*char dateTime[8];*/
PinNum = (UINT8)((Port>>24) & 0xFF) - 1;
Channel = (UINT8)((Port >> 16) & 0x0FF) - 1;
PortNo = Channel + (PinNum * M803XX_MAX_PORT_NUM);
/*如果端口号大于等于64或者电话号码长度等于0或者电话号码长度大于32则返回*/
if((PortNo >= 64)||(Len == 0) || (Len > 32))
return;
/*DTMF 来电显示方式要求caller ID 不少于4位,如果少于就在号码前加0*/
if(Len <= 3)
{
m_port[PortNo].CID_Len = 5;
for(j = 0; j < (4 - Len); j++)
{
m_port[PortNo].CID_digit[j] = VoIP_CID_Default_Digit;
}
}
else
m_port[PortNo].CID_Len = (UINT8)Len+1;
for(i=0; i<Len; i++)
{
if(digit[i] == 10)
m_port[PortNo].CID_digit[j + i] = digit[i] + 38;
else
m_port[PortNo].CID_digit[j + i] = digit[i] + 48;
}
#if 0
/*获取系统时间*/
getSysDateTime(&dateTime);
for(i = 0; i < 8; i++)
m_port[PortNo].CID_digit[i + Len] = dateTime[i] + 48;
#endif
/*为什么根在最后回一个0?*/
m_port[PortNo].CID_digit[m_port[PortNo].CID_Len - 1] = 0;
if(VoIP_CID_Printf == 1)
{
/*输入号码的长度和每一位的内容*/
printf("Digit Len = %d\n",m_port[PortNo].CID_Len);
for(i = 0; i < m_port[PortNo].CID_Len; i++)
printf("%d ",m_port[PortNo].CID_digit[i]);
}
if(m_port[PortNo].CID_Len != 0)
{
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
m_port[PortNo].status = WaitCIDStatus;
semGive(M803xxQueueSem[PortNo/8]);
voipConnect(Port, 0);
OpenChannel(PortNo,2);/*Flag--2:Change Codec*/
}
}
void M80320_CID_Stop(UINT8 PortNo)
{
UINT8 i=0;
if((m_port[PortNo].status == CIDStatus)||(m_port[PortNo].status == WaitCIDStatus)||(m_port[PortNo].status == CIDTalkStatus))
{
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if(VoIP_CID_Printf == 1)
printf("Port %d CID_Stop, CID_Send_Len = %d\n", PortNo, m_port[PortNo].CID_Send_Len);
if(m_port[PortNo].status == CIDTalkStatus)
{
m_port[PortNo].status = TalkStatus;
}
else
{
m_port[PortNo].status = CIDWaitIdleStatus;
}
for(i=0; i<M80320_MAX_CID_NUMBER; i++)
{
m_port[PortNo].CID_digit[i]=0;
}
m_port[PortNo].CID_Send_Len = 0;
m_port[PortNo].CID_Time_Num = 0;
m_port[PortNo].CID_Len = 0;
semGive(M803xxQueueSem[PortNo/8]);
if(m_port[PortNo].status != CIDTalkStatus)
{
Disable_Channel_Processing(PortNo);
}
}
}
UINT32 CIDStartTime = 2;
UINT32 CIDNextTime = 4;
void M80320_CID_SendDtmf(UINT8 PortNo)
{
if((m_port[PortNo].status == CIDStatus)||(m_port[PortNo].status == CIDTalkStatus))
{
if((m_port[PortNo].CID_Send_Len) == (m_port[PortNo].CID_Len))
{
M80320_CID_Stop(PortNo);
return;
}
if(m_port[PortNo].CID_Send_Len == 0)
{
if(VoIP_CID_Printf == 1)
printf("Port %d Start Send CID\n", PortNo);
taskDelay(CIDStartTime);
}
else
{
taskDelay(CIDNextTime);
}
if(VoIP_CID_Printf == 1)
printf("Port %d Send CID %d\n", PortNo, m_port[PortNo].CID_digit[(m_port[PortNo].CID_Send_Len)]);
Dtmf_Generate_Process((UINT8)(m_port[PortNo].CID_digit[(m_port[PortNo].CID_Send_Len)]),PortNo);
m_port[PortNo].CID_Send_Len ++;
}
}
/*-----------------------------
* M80320_SndCallerID -
*
* Argument:
* UINT8 PortNo - 等于(slot - 1) * 8 (第一个槽位最多8个端口) + port - 1
*
* 说明:
*
* Return:
*
* Modified history
*------------------------------
* 2006-5-31 10:13 ZhengaQishan Created.
*
*
*/
void M80320_SndCallerID(UINT8 PortNo)
{
int loop;
int loopCnt;
UINT16 InCmd;
UINT8 Return_Flag = SENDTOM803xxOK;
M803xx_PORT_STATE *PortPtr = (M803xx_PORT_STATE *)NULL;
/*OpenChannel(PortNo, 1);
Disable_Channel_Processing(PortNo);*/
if ((m_port[PortNo].CID_Len < 1) ||
(m_port[PortNo].CID_Len > 200))
{
printf ("The length(%d) of CallerId is error",m_port[PortNo].CID_Len);
return;
}
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
#if 0
Send_VCEOPT_Cmd(PortNo, 0x1478,0x0040);
Enable_RTP_Encapsulation(PortNo);
Send_ECHOCAN_Cmd(PortNo);
Tone_Generate_Process(0,0);
Send_DGAIN_Cmd(PortNo, 0, 2);
Send_DTMF_Cmd(PortNo, 0x33);
Disable_Channel_Processing(PortNo);
#endif
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
/*1、配置Caller ID generator 参数*/
if (OK== M80320_checkOpenChanQueue(PortNo, 3, FUN_SET_CID_PAR))
{
InCmd = PortPtr->InCmd;
#if 0
for (loop = 0; loop < 21; loop++)
{
/* Parameter of Caller ID. */
PortPtr->tx_cmd_fifo[InCmd] = gCallerIdArg[loop];
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)
InCmd = 0;
}
#else
PortPtr->tx_cmd_fifo[InCmd] = 0x0101;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)
InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0xb600;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)
InCmd = 0;
#endif
PortPtr->InCmd = InCmd;
RemainedTxCmdNum[PortNo] += 2;
#if SendOpenChannelMsgFirst
Return_Flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, /*0x2a*/ 3, 0x0200, FUN_SET_CID_PAR, PortNo);
#else
Return_Flag = QueueTxBoxMsg(CMD_CMDDAT, 3 , 0x0200, FUN_SET_CID_PAR, PortNo);
#endif
/*2、发送主叫号码*/
if (OK== M80320_checkOpenChanQueue(PortNo, (m_port[PortNo].CID_Len + 1), FUN_CID_GENERATION))
{
InCmd = PortPtr->InCmd;
PortPtr->tx_cmd_fifo[InCmd] = 0x0104; /* 1: MODULATION TYPE 0x00 - BFSK Bel202 standard; 0x01 - CCITT V.23 standard. */
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)
InCmd = 0;
loopCnt = m_port[PortNo].CID_Len / 2;
for (loop = 0; loop < loopCnt; loop++)
{
/* 1 + loop: MASCII characters to be generated. */
PortPtr->tx_cmd_fifo[InCmd] = m_port[PortNo].CID_digit[2 * loop] << 8 | m_port[PortNo].CID_digit[2 * loop + 1];
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO)
InCmd = 0;
}
PortPtr->InCmd = InCmd;
RemainedTxCmdNum[PortNo] += loopCnt + 1;
#if SendOpenChannelMsgFirst
Return_Flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, (m_port[PortNo].CID_Len + 1), 0x0200, FUN_CID_GENERATION, PortNo);
#else
Return_Flag = QueueTxBoxMsg(CMD_CMDDAT, m_port[PortNo].CID_Len , 0x0200, FUN_CID_GENERATION, PortNo);
#endif
}
}
else
{
printf("Set (port = %d)Caller ID parameter failed!\n", PortNo);
}
semGive(M803xxQueueSem[PortNo/8]);
}
/*========================================DEBUG CODE==================================*/
void M80320_CID_Test(UINT32 Port, UINT8 Num)
{
UINT8 loop;
char digit[32] = {0};
UINT8 PortNo, PinNum, Channel;
PinNum = (UINT8)((Port>>24) & 0xFF) - 1;
Channel = (UINT8)((Port >> 16) & 0x0FF) - 1;
PortNo = Channel + (PinNum * M803XX_MAX_PORT_NUM);
for (loop = 0; loop < Num; loop ++)
digit[loop] = loop % 10;
M80320_CID_Digit(Port, digit, Num);
/*M80320_CID_SendDtmf(PortNo); */
M80320_SndCallerID(PortNo);
}
void M80320SendDtmfTest(UINT8 PortNo,char *dtmf, UINT8 Len, UINT8 Time)
{
UINT8 i;
UINT8 value;
if(VoIP_CID_Printf == 1)
printf("Dtmf = %s\n",dtmf);
for(i = 0; i < Len; i++)
{
taskDelay((int)Time);
value = *dtmf;
Dtmf_Generate_Process((UINT8)value, PortNo);
dtmf++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -