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

📄 callerid.c

📁 m80320 VoIP DSP驱动源码
💻 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 + -