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

📄 callrht.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  CallRHT.C                                   *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.1.15                                          *
****************************************************************/
#include "includes.h"
#include "tools.h"
#include "public.h"
#include "callrht.h"



/*
********************************************************************************
*                  DEFINE RETMASK_STRUCT
********************************************************************************
*/
typedef struct {
    BOOLEAN     retmask;
    INT8U       mask1;
    INT8U       mask2;
} RHTMASK_STRUCT;


/*
********************************************************************************
*                  DEFINE MODULE VARIANTS
********************************************************************************
*/
static RHTMASK_STRUCT Dialed_Mask[4] = {{TRUE,  0x80, 0x80},
                                        {FALSE, 0x80, 0x80},
                                        {FALSE, 0x00, 0x10},
                                        {TRUE,  0x10, 0x00}
                                       };
static RHTMASK_STRUCT Recved_Mask[4] = {{TRUE,  0x80, 0x80},
                                        {FALSE, 0x80, 0x80},
                                        {FALSE, 0x20, 0x30},
                                        {TRUE,  0x30, 0x20}
                                       };


static void ClearCallRHT(INT8U type)
{
    INT8U i, mask;
    
    if (type == CALLRHT_DIALED) mask = 0x00;
    else mask = 0x20;
    
    for (i = 0; i < MAX_CALLRHT; i++) {
        if ((CallRHT.tel[i].attrib & 0x20) == mask) CallRHT.tel[i].attrib = 0;
    }
}

static INT8S FindBlank(void)
{
    INT8U i;
    
    for (i = 0; i < MAX_CALLRHT; i++) {
        if ((CallRHT.tel[i].attrib & 0x0f) == 0) return i;
    }
    return -1;
}

static BOOLEAN FindCall(INT8U mask, INT8U tellen, INT8U *tel)
{
    INT8U i, len;
    
    if (mask & 0x80) return TRUE;
    for (i = 0; i < MAX_CALLRHT; i++) {
        if ((CallRHT.tel[i].attrib & 0x30) == (mask & 0x30)) {
            len = CallRHT.tel[i].attrib & 0x0f;
            if (len > 0 && len <= tellen) {
                if (CmpString(tel, CallRHT.tel[i].tel, len) == STR_EQUAL) return TRUE;
            }
        }
    }
    return FALSE;
}

static char str_10086[] = {"10086"};
static char str_1861[]  = {"1861"};
static char str_1860[]  = {"1860"};
static char str_110[]   = {"110"};
static char str_112[]   = {"112"};
static char str_119[]   = {"119"};
static char str_120[]   = {"120"};
static char *pgtel[]    = {str_10086, str_1861, str_1860, str_110, str_112, str_119, str_120};

BOOLEAN CallRHTPass(INT8U type, INT8U tellen, INT8U *tel)
{
    RHTMASK_STRUCT *mask;
    INT8U   tag, i;
    BOOLEAN ret;
    
    for (i = 0; i < sizeof(pgtel) / sizeof(pgtel[0]); i++) {
        if (ACmpString(FALSE, tel, (INT8U *)pgtel[i], tellen, strlen(pgtel[i])) == STR_EQUAL)
            return TRUE;
    }

    if (type == CALLRHT_DIALED) {
        mask = Dialed_Mask;
        tag  = CallRHT.attrib >> 2;
    } else {
        mask = Recved_Mask;
        tag  = CallRHT.attrib;
    }
    tag &= 0x03;

    ret = mask[tag].retmask;
    if (!FindCall(mask[tag].mask1, tellen, tel)) {
        return ret;
    } else {
        if (FindCall(mask[tag].mask2, tellen, tel)) 
            return ret;
        else 
            return (!ret);
    }
}

BOOLEAN SetCallRHT(INT8U *ptr)
{
    INT8U num, len, i;
    INT8S blanknum;
    
    CallRHT.attrib = *ptr++;
    if (CallRHT.attrib & 0x20) 
        ClearCallRHT(CALLRHT_DIALED);
    if (CallRHT.attrib & 0x10)
        ClearCallRHT(CALLRHT_RECVED);
    CallRHT.attrib &= 0x0f;
    num = *ptr++;
    if (num == 0x7f) num = 0;
    for (i = 1; i <= num; i++) {
        if ((blanknum = FindBlank()) == -1) {
            StorePubPara(CALLRHT_);
            return FALSE;
        } else {
            CallRHT.tel[blanknum].attrib = len = *ptr++;
            len &= 0x0f;
            memcpy(CallRHT.tel[blanknum].tel, ptr, len);
            ptr += len;
        }
    }
    StorePubPara(CALLRHT_);
    return TRUE;
}

void InitCallRHT(void)
{
    if (!PubParaValid(CALLRHT_)) {
        memset(&CallRHT, 0, sizeof(CallRHT));
        StorePubPara(CALLRHT_);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -