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

📄 at_voice.c

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


/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define NUM_VOICE                           2
#define SIZE_BUF                            50


/*
********************************************************************************
*                  DEFINE VOICE COMMAND STATUS
********************************************************************************
*/
#define _EXIST                              0x01
#define _READY                              0x02


/*
********************************************************************************
*                  DEFINE VOICE COMMAND STRUCTURE
********************************************************************************
*/
typedef struct {
    INT8U   status;
    INT8U   len;
    INT8U   buffer[SIZE_BUF];
    void    (*fp)(INT8U ch, INT8U result);
    ATCMDPARA_STRUCT *cmdptr;
} VOICECMD_STRUCT;


/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static VOICECMD_STRUCT voicecmd[NUM_VOICE];
static void (*InformProc[NUM_VOICE])(INT8U, const ATCMDACK_STRUCT *);



INT8U GetVoiceDLCI(INT8U ch)
{
    if (ch == VOICE_COM) return DLC_PHONE;
    else if (ch == VOICE_GPRS) return DLC_GPRS;
    else {
        ErrExit(ERR_ATVOICE_CHANNEL);
        return 0xFF;
    }
}

static void InformProc0(INT8U result, const ATCMDACK_STRUCT *atcmdack)
{
	atcmdack = atcmdack;
    if (voicecmd[0].status & _EXIST) {
        voicecmd[0].status = 0;
        if (voicecmd[0].fp != 0) {
            if (result == AT_SUCCESS) voicecmd[0].fp(0, _SUCCESS);
            else voicecmd[0].fp(0, _FAILURE);
        }
    }
}

static void InformProc1(INT8U result, const ATCMDACK_STRUCT *atcmdack)
{
	atcmdack = atcmdack;
    if (voicecmd[1].status & _EXIST) {
        voicecmd[1].status = 0;
        if (voicecmd[1].fp != 0) {
            if (result == AT_SUCCESS) voicecmd[1].fp(1, _SUCCESS);
            else voicecmd[1].fp(1, _FAILURE);
        }
    }
}

void InitAT_Voice(void)
{
    INT8U i;
    
    for (i = 0; i < NUM_VOICE; i++) voicecmd[i].status = 0;
}

void AbandonVoiceCmd(INT8U ch)
{
    if (ch >= NUM_VOICE) ErrExit(ERR_ATVOICE_CHANNEL);
    if ((voicecmd[ch].status & (_EXIST | _READY)) == _EXIST) {
        voicecmd[ch].status = 0;
        AbandonATCmd(GetVoiceDLCI(ch));
    } else {
        voicecmd[ch].status = 0;
    }
}

BOOLEAN SendHangupCmd(INT8U ch, void (* fp)(INT8U, INT8U),INT8U Privil)
{
    if (ch >= NUM_VOICE) {
        ErrExit(ERR_ATVOICE_CHANNEL);
        return FALSE;
    }
    if ((voicecmd[ch].status & (_EXIST | _READY)) == _EXIST) {
        AbandonATCmd(GetVoiceDLCI(ch));
    }
    
    if (ch != VOICE_GPRS) AbortCurSM();                             /* abort current shor message */ 
    voicecmd[ch].status  = _EXIST | _READY;
    voicecmd[ch].fp      = fp;
    #if GSM_BENQ
    if((ch!=VOICE_GPRS)&&(Privil == PRI_CHUP)){
       voicecmd[ch].len     = AT_Chup(voicecmd[ch].buffer);
       voicecmd[ch].cmdptr  = &AT_CHUP_PARA;
    }else{
       voicecmd[ch].len     = AT_ATH(voicecmd[ch].buffer);
       voicecmd[ch].cmdptr  = &AT_ATH_PARA;
    }
    #else
    voicecmd[ch].len     = AT_ATH(voicecmd[ch].buffer);
    voicecmd[ch].cmdptr  = &AT_ATH_PARA;
    #endif
    OSQPost(GsmTaskMsgQue, MSG_ATVOICE_TSK, 0, 0);
    return TRUE;
}

BOOLEAN SendPickupCmd(INT8U ch, void (* fp)(INT8U, INT8U))
{
    if (ch >= NUM_VOICE) {
        ErrExit(ERR_ATVOICE_CHANNEL);
        return FALSE;
    }
    if (voicecmd[ch].status & _EXIST) return FALSE;
    
    if (ch != VOICE_GPRS) AbortCurSM();                             /* abort current shor message */ 
    voicecmd[ch].status  = _EXIST | _READY;
    voicecmd[ch].fp      = fp;
    voicecmd[ch].len     = AT_ATA(voicecmd[ch].buffer);
    voicecmd[ch].cmdptr  = &AT_ATA_PARA;
    OSQPost(GsmTaskMsgQue, MSG_ATVOICE_TSK, 0, 0);
    return TRUE;
}

BOOLEAN SendRingupCmd(INT8U ch, void (* fp)(INT8U, INT8U), INT8U *telptr, INT8U tellen, INT8U mode)
{
    if (ch >= NUM_VOICE) {
        ErrExit(ERR_ATVOICE_CHANNEL);
        return FALSE;
    }
    if (!SIMCardInserted() || !NetworkRegisted()) return FALSE;
    if (tellen == 0 || tellen > 30) return FALSE;
    if (voicecmd[ch].status & _EXIST) return FALSE;
    
    if (ch != VOICE_GPRS) AbortCurSM();                             /* abort current shor message */ 
    voicecmd[ch].status      = _EXIST | _READY;
    voicecmd[ch].fp          = fp;
    if (mode == MODE_VOICE) {
        voicecmd[ch].len     = AT_ATD(voicecmd[ch].buffer, telptr, tellen, MODE_VOICE);
        voicecmd[ch].cmdptr  = &AT_ATD_PARA;
    } else {
        voicecmd[ch].len     = AT_ATD(voicecmd[ch].buffer, telptr, tellen, MODE_DATA);
        voicecmd[ch].cmdptr  = &AT_ATD_DATA_PARA;
    }
    OSQPost(GsmTaskMsgQue, MSG_ATVOICE_TSK, 0, 0);
    return TRUE;
}

void ResetAT_Voice(void)
{
    INT8U i;
    
    for (i = 0; i < NUM_VOICE; i++) {
        if (voicecmd[i].status & _EXIST) {
            voicecmd[i].status = 0;
            if (voicecmd[i].fp != 0) {
                voicecmd[i].fp(i, _FAILURE);
            }
        }
    }
}

void AT_VoiceEntry(void)
{
    INT8U i;
    
    /* initialize InformProc Array */
    {
        InformProc[0] = InformProc0;
        InformProc[1] = InformProc1;
    }
    for (i = 0; i < NUM_VOICE; i++) {
        if ((voicecmd[i].status & (_EXIST | _READY)) == (_EXIST | _READY)) {
            if (CanSendATCmd(GetVoiceDLCI(i))) {
                voicecmd[i].status &= ~_READY;
                SendATCmd(GetVoiceDLCI(i), voicecmd[i].cmdptr, voicecmd[i].buffer, voicecmd[i].len, InformProc[i]);
            }
        }
    }
}

⌨️ 快捷键说明

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