📄 at_voice.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 + -