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

📄 at_set.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  AT_SET.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 "list.h"
#include "errcode.h"
#include "errtask.h"
#include "gsmtask.h"
#include "at_cmd.h"
#include "at_trans.h"
#include "at_core.h"
#include "at_set.h"
#include "zprint.h"


/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define NUM_CMD                         7
#define SIZE_BUF                        50


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


/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static struct {
    NODE              reserve;
    SETCMD_STRUCT     command;
} CmdMem[NUM_CMD];

static LIST FreeList, UsedList;
static SETCMD_STRUCT *curcmd;



static SETCMD_STRUCT *AllocCmdMem(void)
{
    return (SETCMD_STRUCT *)DelListHead(&FreeList);
}

static void StoreCmdMem(SETCMD_STRUCT *ptr, void (*fp)(INT8U, INT8U *))
{
    ptr->fp = fp;
    AppendListEle(&UsedList, (LISTMEM *)ptr);               /* append to used list */
    OSQPost(GsmTaskMsgQue, MSG_ATSET_TSK, 0, 0);            /* send message */
}

static void FreeCurCmd(void)
{
    AppendListEle(&FreeList, (LISTMEM *)curcmd);
    curcmd = 0;
    OSQPost(GsmTaskMsgQue, MSG_ATSET_TSK, 0, 0);
}

static void InformerProc(INT8U result, const ATCMDACK_STRUCT *ATCmdAck)
{
    void (* fp)(INT8U, INT8U *);

    if (curcmd == 0) return;
    fp = curcmd->fp;
    FreeCurCmd();
    if (fp != 0) {
        if (result == AT_SUCCESS) fp(_SUCCESS, ATCmdAck->ackbuf);
        else fp(_FAILURE, ATCmdAck->ackbuf);
    }
}

static void DiagnoseProc(void)
{
    INT8U temp;
    
    if (!CheckList(&FreeList) || !CheckList(&UsedList)) ErrExit(ERR_ATSET_MEM);
    temp = ListItem(&UsedList) + ListItem(&FreeList);
    if (curcmd != 0) temp++;
    if (temp != sizeof(CmdMem)/sizeof(CmdMem[0])) ErrExit(ERR_ATSET_MEM);
}

void InitAT_Set(void)
{
    curcmd = 0;
    InitList(&UsedList);
    InitMemList(&FreeList, (LISTMEM *)CmdMem, sizeof(CmdMem)/sizeof(CmdMem[0]), sizeof(CmdMem[0]));
    InstallDiagProc(DiagnoseProc);
}

BOOLEAN SetCSCA(void (* fp)(INT8U, INT8U *), INT8U *telptr, INT8U tellen)
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted()) return FALSE;
    if (tellen > 30) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_CSCA(ptr->buffer, telptr, tellen);
    ptr->cmdptr = &AT_CSCA_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN OpenCLIP(void (* fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted()) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_CLIP(ptr->buffer, CLIP_ENABLE);
    ptr->cmdptr = &AT_CLIP_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN CloseCLIP(void (* fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted()) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_CLIP(ptr->buffer, CLIP_DISABLE);
    ptr->cmdptr = &AT_CLIP_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}


BOOLEAN SelAudioPath(void (* fp)(INT8U, INT8U *), char path)
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted()) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AUPath(ptr->buffer, path);
    ptr->cmdptr = &AT_AUPATH_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}
/*
 ====================================================================================
 Description:   Set audiogain
 note:          0:sidetone 1:mic 2:speaker
 ====================================================================================
*/
BOOLEAN SetAudioGain(void (* fp)(INT8U, INT8U *), char path,char gain)
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted()) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AUGain(ptr->buffer, path,gain);
    ptr->cmdptr = &AT_AUGAIN_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}
BOOLEAN SetAudioVolPara(void (* fp)(INT8U, INT8U *), char step)
{
    SETCMD_STRUCT *ptr;
    if (!SIMCardInserted()) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AUVol(ptr->buffer, step);
    ptr->cmdptr = &AT_AUVOL_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;


}
BOOLEAN SetAudioEcho(void (* fp)(INT8U, INT8U *),INT8U *DataPtr)
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AUAec(ptr->buffer,DataPtr);
    ptr->cmdptr = &AT_AUAEC_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN SetAudioLevelMax(void (* fp)(INT8U, INT8U *),INT8U *DataPtr)
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AULEVELMAX(ptr->buffer,DataPtr);
    ptr->cmdptr = &AT_AULEVELMAX_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}
BOOLEAN SetAudioABS(void (* fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AUABS(ptr->buffer);
    ptr->cmdptr = &AT_AUABS_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN SetAudioVAD(void (* fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_AUVAD(ptr->buffer);
    ptr->cmdptr = &AT_AUVAD_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}


static BOOLEAN SetDate(void (*fp)(INT8U, INT8U *), DATE_STRUCT *date)
{
    SETCMD_STRUCT *ptr;
    
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_Date(ptr->buffer, date);
    ptr->cmdptr = &AT_DATE_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}
static BOOLEAN SetTime(void (*fp)(INT8U, INT8U *),TIME_STRUCT *time)
{
    SETCMD_STRUCT *ptr;
    
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_Time(ptr->buffer, time);
    ptr->cmdptr = &AT_TIME_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;	
}
BOOLEAN SetRealTimeClock(void (*fp)(INT8U, INT8U *), void (*fp1)(INT8U, INT8U *),DATE_STRUCT *date, TIME_STRUCT *time)
{
	if((!SetDate(fp,date))||(!SetTime(fp1,time))) return FALSE;
	else return TRUE;
}
BOOLEAN ReadRealDate(void (*fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_R_Date(ptr->buffer);
    ptr->cmdptr = &AT_R_DATE_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}
BOOLEAN ReadReaTime(void (*fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_R_Time(ptr->buffer);
    ptr->cmdptr = &AT_R_TIME_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}
BOOLEAN ReadRealTimeClock(void (*fp)(INT8U, INT8U *),void (*fp1)(INT8U, INT8U *))
{
   if((!ReadRealDate(fp))||(!ReadReaTime(fp1))) return FALSE;
   else return TRUE;
}


BOOLEAN OpenCallForward(void (* fp)(INT8U, INT8U *), INT8U *tel, INT8U tellen)
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted() || !NetworkRegisted()) return FALSE;
    if (tellen > 30) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_CCFC(ptr->buffer, REAS_NOREPLY, FORWARD_REGISTRATION, tel, tellen, 20);
    ptr->cmdptr = &AT_CCFC_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN CloseCallForward(void (* fp)(INT8U, INT8U *))
{
    SETCMD_STRUCT *ptr;
    
    if (!SIMCardInserted() || !NetworkRegisted()) return FALSE;
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_CFG;
    ptr->len    = AT_CCFC(ptr->buffer, REAS_NOREPLY, FORWARD_ERASURE, 0, 0, 0);
    ptr->cmdptr = &AT_CCFC_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN SetPDPContext(void (*fp)(INT8U, INT8U *), char cid, char *APN, char *PDP_addr)
{
    SETCMD_STRUCT *ptr;
    
    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_GPRS;
    ptr->len    = AT_CGDCONT(ptr->buffer, cid, APN, PDP_addr);
    ptr->cmdptr = &AT_CGDCONT_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN SendDTMFCmd(void (* fp)(INT8U, INT8U*), char dtmfchar)
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_PHONE;
    ptr->len    = AT_VTS(ptr->buffer, dtmfchar);
    ptr->cmdptr = &AT_VTS_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

BOOLEAN QueryRingStatus(void (* fp)(INT8U, INT8U*))
{
    SETCMD_STRUCT *ptr;

    if ((ptr = AllocCmdMem()) == 0) return FALSE;
    ptr->ch     = DLC_PHONE;
    ptr->len    = AT_CLCC(ptr->buffer);
    ptr->cmdptr = &AT_CLCC_PARA;
    StoreCmdMem(ptr, fp);
    return TRUE;
}

void AT_SetEntry(void)
{
    SETCMD_STRUCT *headcmd;
    
    if (curcmd != 0) return;
    if (ListItem(&UsedList) == 0) return;

    headcmd = (SETCMD_STRUCT *)GetListHead(&UsedList);
    if (!CanSendATCmd(headcmd->ch)) return;
    
    if ((curcmd = (SETCMD_STRUCT *)DelListHead(&UsedList)) != 0)
        SendATCmd(curcmd->ch, curcmd->cmdptr, curcmd->buffer, curcmd->len, InformerProc);
}

⌨️ 快捷键说明

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