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

📄 virphone.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
        PromptEntry.TextPtr  = dplytime;
        PromptEntry.TextLen  = sizeof(dplytime) - 1;
    } else {
        PromptEntry.TextPtr  = (INT8U *)str;
        PromptEntry.TextLen  = strlen(str);
    }
    if (time > 0)
        ActivatePrompt(&PromptEntry);
#if EN_HSTSMON > 0
    if(CmpString(TalkRecord.tel,GuestSmon.GuestTel,TalkRecord.tellen)!=STR_EQUAL)//判断是否为召车乘客电话 add by qzc
#endif
    	StoreTalkRecord();                                                  /* store talk record */
}

static void InitProc_Dial(void) //change 2004.03.31
{
    INT8U *tel, tellen, result;

    EntryTel.attrib = TALK_DIAL;
    InitTalkRecord();
    status = VIR_FREE;

    tel    = EntryTel.tel;
    tellen = EntryTel.tellen;
    if (tellen > 3 && tel[0] == '+') {
        tel    += 3;
        tellen -= 3;
    }
    if ((result = RingupPhone(PHONE_COM, EntryTel.channel, tel, tellen, 0)) != PHONE_ACCEPT) {
        switch (result)
        {
            case PHONE_NOSIM:
                ExitVirPhone("  无SIM卡", 1);
                break;
            case PHONE_NONETWORK:
            case PHONE_SEARCHINGNETWORK:
                ExitVirPhone("   无网络", 1);
                break;
            default:
                ExitVirPhone("  通话结束", 1);
                break;
        }
    } else {
	    status = VIR_CALLING;
        Display_CALLING_INIT();
    }

}

static void InitProc_Ring(void)
{
    EntryTel.attrib = TALK_MISS;
    InitTalkRecord();

    RequestRing(HstCfg.CallRing);                           /* request ring beeper */
    status = VIR_RINGING;
    Display_RINGING();
    StartTmr(waittmr, PERIOD_WAIT_AUTOPICK);
}

static void DestroyProc(void)
{
    CLOCKTIME_STRUCT clocktime;

    activated = FALSE;
    StopTmr(waittmr);
    if (status == VIR_TALKING) {
        GetClockTime(PHONE_COM, &clocktime);
        TalkRecord.talktime[0] = clocktime.minute;
        TalkRecord.talktime[1] = clocktime.second;
    }
    if (status != VIR_FREE) HangupPhone(PHONE_COM,0);

    TurnoffTalkIndicator();                                /* turn off talk indicator */
}

static void Handler_CALLING(INT8U phonestatus)
{
    if (phonestatus == PHONE_TALKING) {
        status = VIR_TALKING;
        RegisterTime();
        InitDtmfBuf();
        Display_TALKING();
    } else if (phonestatus == PHONE_FREE || curkey.key == KEY_END) {
        status = VIR_FREE;
        if (curkey.key == KEY_END) HangupPhone(PHONE_COM,0);
    }

}

static void Handler_TALKING(INT8U phonestatus)
{
    CLOCKTIME_STRUCT clocktime;

    if (phonestatus == PHONE_FREE || curkey.key == KEY_END) {
        if (curkey.key == KEY_END && HaveDtmfChar()) {
            DelDtmfChar();
            Display_TALKING();
        } else {
            status = VIR_FREE;
            RegisterTime();
            GetClockTime(PHONE_COM, &clocktime);
            TalkRecord.talktime[0] = clocktime.minute;
            TalkRecord.talktime[1] = clocktime.second;
            if (curkey.key == KEY_END) HangupPhone(PHONE_COM,0);
        }
    } else if ((curkey.key >= '0' && curkey.key <= '9') ||
    curkey.key == '*' || curkey.key == '#' || curkey.key == '+') {
        if (curkey.key == '+') curkey.key = '*';
        DialDTMF(PHONE_COM, curkey.key);
        AddDtmfChar(curkey.key);
        Display_TALKING();
    } else if (curkey.key == KEY_CLRALL && HaveDtmfChar()) {
        InitDtmfBuf();
        Display_TALKING();
    } else if (curkey.key == KEY_UP) {
        TurnupVoiceVolume(PHONE_COM);
        Display_VOLUME();
    } else if (curkey.key == KEY_DOWN) {
        TurndownVoiceVolume(PHONE_COM);
        Display_VOLUME();
    } else if (curkey.key == KEY_VOICE) {
        if (GetVoiceChannel(PHONE_COM) == CHA_HANDSET)
            ChangeVoiceChannel(PHONE_COM, CHA_HANDSFREE);
        else
            ChangeVoiceChannel(PHONE_COM, CHA_HANDSET);
        Display_CHANNEL();
    }

}

static void Handler_RINGING(INT8U phonestatus)
{
    INT8U channel;

    if (phonestatus == PHONE_FREE || curkey.key == KEY_END) {
        CancelRing();
        if (curkey.key == KEY_END) {
            status          = VIR_FREE;
            EntryTel.attrib = TALK_RECV;
            HangupPhone(PHONE_COM,PRI_REJECT);
        } else {
            HstMiss.NumTel++;
            ExitVirPhone(0, 0);
        }
    } else if (phonestatus == PHONE_CONNECTING ||
    phonestatus == PHONE_TALKING || phonestatus == PHONE_DISCONNECTING) {
        status = VIR_FREE;
        CancelRing();
    } else if (curkey.key == KEY_SND) {
        status          = VIR_CALLING;
        EntryTel.attrib = TALK_RECV;
        CancelRing();
        OSQPost(SysTaskMsgQue, MSG_HANDSET_PICKUP, 0, 0);            /* send message to systask */

        if (HstCfg.HandsfreeChannel) {
            channel = CHA_HANDSFREE;
        } else {
            channel = CHA_HANDSET;
        }
        if (!PickupPhone(PHONE_COM, channel, 0)) ExitVirPhone(0, 3);
    }

}

static void HdlEventProc(INT8U phonestatus)
{
    if (status > VIR_RINGING || (!activated)) {
        ActivateLowestWinStack();
        return;
    }
    switch (status)
    {
        case VIR_CALLING:
            Handler_CALLING(phonestatus);
            break;
        case VIR_TALKING:
            Handler_TALKING(phonestatus);
            break;
        case VIR_RINGING:
            Handler_RINGING(phonestatus);
            break;
        default:
            break;
    }
    if (status == VIR_FREE) ExitVirPhone(0, 3);
}

static void HdlKeyProc(void)
{
    GetKeyMsg(&curkey);
    HdlEventProc(0xff);
}

static WINSTACKENTRY_STRUCT WinStackEntry = {0, DestroyProc, 0, 0, HdlKeyProc};

void ActivateVirPhone_Dial(BOOLEAN findsk, INT8U tellen, INT8U *tel)
{
    if (activated) return;

    if (HstCfg.HandsfreeChannel) {
        EntryTel.channel = CHA_HANDSFREE;
    } else {
        EntryTel.channel = CHA_HANDSET;
    }
    EntryTel.tellen = 0;
    if (findsk && tellen == 1 && *tel >= '0' && *tel <= '9') {
        EntryTel.tellen = GetSKRecTel(*tel - '0', EntryTel.tel);
    }
    if (EntryTel.tellen == 0) {
        if (tellen > sizeof(EntryTel.tel)) tellen = sizeof(EntryTel.tel);
        EntryTel.tellen  = tellen;
        memcpy(EntryTel.tel, tel, tellen);
    }

    if (!CallRHTPass(CALLRHT_DIALED, EntryTel.tellen, EntryTel.tel)) {
        ActivateStringPrompt("对不起\n呼叫被限制");
        return;
    }
    if (!AlarmerPermitTalk()) {
        ActivateStringPrompt("对不起\n现正忙…");
        return;
    }

    activated = TRUE;
    WinStackEntry.InitProc = InitProc_Dial;
    PushWinStack(&WinStackEntry);
}

void ActivateVirPhone_DialSuccor(INT8U tellen, INT8U *tel)
{
    if (activated) return;

    EntryTel.channel = CHA_HANDSFREE;
    if (tellen > sizeof(EntryTel.tel)) tellen = sizeof(EntryTel.tel);
    EntryTel.tellen  = tellen;
    memcpy(EntryTel.tel, tel, tellen);

    activated = TRUE;
    WinStackEntry.InitProc = InitProc_Dial;
    PushWinStack(&WinStackEntry);
}

void ActivateVirPhone_Ring(void)
{
    if (activated) return;
    EntryTel.tellen = RingPara[PHONE_COM].len;
    if (EntryTel.tellen > sizeof(EntryTel.tel))
        EntryTel.tellen = sizeof(EntryTel.tel);
    memcpy(EntryTel.tel, RingPara[PHONE_COM].tel, EntryTel.tellen);

    activated = TRUE;
    WinStackEntry.InitProc = InitProc_Ring;
    PushWinStack(&WinStackEntry);
}

void HangupVirPhone(void)
{
    if (activated) HangupPhone(PHONE_COM,0);

}

void ResetVirPhone(void)
{
    activated = FALSE;
}

void InitVirPhone(void)
{
    status    = VIR_FREE;
    activated = FALSE;
    waittmr   = CreateTimer(WaitTmrProc, 0);
}

void InformVirPhone(INT8U phonestatus)
{
    if (activated) {
        curkey.key = KEY_NULL;
        HdlEventProc(phonestatus);
    }
}

BOOLEAN VirPhoneIsActivated(void)
{
    return activated;
}
#endif

⌨️ 快捷键说明

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