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

📄 phonedrv.c

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


/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
//#define PERIOD_CONNECTING                       SECOND, 240
#define PERIOD_CONNECTING                       SECOND, 60
#define PERIOD_DISCONNECTING                    SECOND, 3
#define PERIOD_DISCONNECTING_DATA               SECOND, 10
#define PERIOD_RING                             SECOND, 7
#define PERIOD_CLOCK                            SECOND, 1
#define PERIOD_WAIT                             SECOND, 1
#define PERIOD_DETECT_PIN                       MILTICK,1

#define DEF_TALKTIME							120                 /* UNIT: MINUTE */


#define MAX_STEP                               10



/*
********************************************************************************
*                  DEFINE modem_req
********************************************************************************
*/
#define MODEM_REQ_FREE                          PHONE_FREE
#define MODEM_REQ_DIAL                          PHONE_CONNECTING
#define MODEM_REQ_HANG                          PHONE_DISCONNECTING

/*
********************************************************************************
*                  DEFINE PHONE_STRUCT
********************************************************************************
*/
typedef struct {
    INT8U               status;                     /* phone status */
    void                (*hooker)(INT8U);           /* hooker */
    INT8U               ct_clog;                    /* short message clog count */
    INT16U              talktime;                   /* talk time */
    CLOCKTIME_STRUCT    clocktime;                  /* clock time */
    TMR_TSK            *monitortmr;                 /* monitor timer */
    TMR_TSK            *clocktmr;                   /* clock timer */
    TMR_TSK            *waittmr;                    /* wait timer */
    INT8U               channel;                    /* current channel */
    INT8U               audmode;                    /* current audio mode */
    char                ingain[8];                  /* audio input gain */
    char                outgain[8];                 /* audio output gain */
    char                APN[30];                    /* APN for GPRS */
    INT8U               modem_req;                  /* modem request status */
    INT8U               modem_reqlen;               /* modem request tellen */
    INT8U               modem_reqtel[50];           /* modem request telphone */
} PHONE_STRUCT;

/*
********************************************************************************
*                  DEFINE SPKPARA_STRUCT
********************************************************************************
*/
typedef struct {
    char                gain;
    char                step;
} SPKPARA_STRUCT;

/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static PHONE_STRUCT     phones[NUM_PHONE];
static TMR_TSK *PhoneInitParaTmr;
static SPKPARA_STRUCT   SPKPARA[MAX_STEP + 1] =

{{1, 0}, {1,1}, {2, 1}, {2, 2}, {3, 2},{3,3},{4,3},{6,3},{4,4},{5,4},{7,4}};   //HandFree speaker parament

static SPKPARA_STRUCT SPKPARA_HANDSET[MAX_STEP + 1] =
{{1, 0}, {1,3}, {1, 4}, {2, 4}, {3, 4},{5,4},{1,5},{3,5},{5,5},{7,5},{9,5}};   //Handset speaker parament

#define MAIN_PATH      ('3')
#define SPEAKERPATH    ('2')
#define MICPATH	       ('1')
#define SIDETONEPATH   ('0')
#define ECHO_PARA_STR  ((INT8U*)"54")	                      //echo and noise parament
#define LEVEL_MAX_PARA ((INT8U*)"15000")                     //aulevelmax


static void ClogOP(INT8U ch)
{
    phones[ch].ct_clog++;
    ClogSM();
}

static void UnclogOP(INT8U ch)
{
    for (; phones[ch].ct_clog > 0; ) {
        phones[ch].ct_clog--;
        UnclogSM();
    }
}

static void SetChannelAudoMode(INT8U ch)
{
    INT8U channel, audmode;

    channel = phones[ch].channel;

    audmode = '3';   
    phones[ch].audmode = audmode;
}

static void SelectMode(INT8U ch)
{

    SelAudioPath(0, phones[ch].audmode);
    
}

static void TurnChannelVolume(INT8U ch)
{
    INT8U channel, gain;

    channel = phones[ch].channel;
    gain    = phones[ch].outgain[channel];

    if((channel == CHA_LCD)||(channel == CHA_HANDSET)){
       SetAudioGain(0, SPEAKERPATH, SPKPARA_HANDSET[gain].gain + '0');
       SetAudioVolPara(0,SPKPARA_HANDSET[gain].step + '0');
    }else{
       SetAudioGain(0, SPEAKERPATH, SPKPARA[gain].gain + '0');
       SetAudioVolPara(0,SPKPARA[gain].step + '0');
    }
   
}

static void TurnChannelMic(INT8U ch)
{
    INT8U channel;

    channel = phones[ch].channel;

    SetAudioGain(0, MICPATH, phones[ch].ingain[channel]+'0'); /*设置BENQ MIC增益*/
}

static void SelectChannel(INT8U ch, INT8U channel)
{
    if (channel > CHA_LISTEN) return;
    phones[ch].channel = channel;
    switch (channel)
    {
        case CHA_MODEM:
        case CHA_DATA:
           {
              MSCCtrDTROff();                     // CLEAR_PIN_DTR(); CLEAR_PIN_RTS();
	       }
	                                             /* set DTR signal */
            break;
        case CHA_HANDSET:
            SelectVoice_Handset();
            ClosePowerAmp_Speaker();

            Init_ControlPath();
            SelectHandSet();

            break;
        case CHA_LCD:
            ////SelectVoice_LCD();
            SelectVoice_Handset();
            ClosePowerAmp_Speaker();

            Init_ControlPath();
            SelectHandSet();

            break;
        case CHA_HANDSFREE:
            SelectMic_HandsFree();
            OpenPowerAmp_Speaker();
 
            Init_ControlPath();
            SelectHandFree();

            break;
        case CHA_LISTEN:

            Init_ControlPath();
            SelectHandFree();

            SelectMic_Listen();
            ClosePowerAmp_Speaker();
            break;
        case CHA_DTMF:
            SelectMic_DTMF();
            ClosePowerAmp_Speaker();
            break;
        case CHA_VOICECHIP:
            SelectMic_VoiceChip();
            ClosePowerAmp_Speaker();
            break;
        default:
            ;
    }
    if (channel != CHA_MODEM && channel != CHA_DATA) {
        SetChannelAudoMode(ch);
        SelectMode(ch);
        TurnChannelVolume(ch);
        TurnChannelMic(ch);
    }
}

static void TurnintoFree(INT8U ch)
{
    INT8U  prestatus;
    void   (*hooker)(INT8U);


    StopTmr(phones[ch].waittmr);
    StopTmr(phones[ch].clocktmr);
    StopTmr(phones[ch].monitortmr);
    UnclogOP(ch);                                   /* NOTE: unclog short message channel */

    if (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM) {
        {
          MSCCtrDTROn();                            // CLEAR_PIN_DTR(); CLEAR_PIN_RTS();
        }

        NotifyDataDisconnect();
    } else {
        ClosePowerAmp_Speaker();
        NotifyVoiceDisconnect();                    /* NOTE: notify AT_CORE voice disconnect */
        if (phones[ch].status != PHONE_FREE)
            OSQPost(SysTaskMsgQue, MSG_PHONEDRV_FREE, 0, 0);
    }

    prestatus          = phones[ch].status;
    hooker             = phones[ch].hooker;
    phones[ch].status  = PHONE_FREE;
    phones[ch].hooker  = 0;
    phones[ch].audmode = 3;
    phones[ch].channel = CHA_HANDSET;
    if (prestatus != PHONE_FREE && hooker != 0) hooker(PHONE_FREE);
}

static void TurnintoConnect(INT8U ch)
{
    phones[ch].status   = PHONE_CONNECTING;
    phones[ch].talktime = DEF_TALKTIME;


    StartTmr(phones[ch].monitortmr, PERIOD_CONNECTING);
    ClogOP(ch);                                     /* NOTE: clog short message channel */
}

static void TurnintoDisconnect(INT8U ch)
{
    phones[ch].status = PHONE_DISCONNECTING;
    if (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM) {
        MSCCtrDTROn();                            //celear dtr rts
        NotifyDataDisconnect();
        StartTmr(phones[ch].monitortmr, PERIOD_DISCONNECTING_DATA);
    } else {
        StartTmr(phones[ch].monitortmr, PERIOD_DISCONNECTING);
        ClogOP(ch);                                /* NOTE: clog short message channel */
    }
}

static void TurnintoTalk(INT8U ch)
{
    phones[ch].status = PHONE_TALKING;
    UnclogOP(ch);                                   /* NOTE: unclog short message channel */
    if (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM)
        NotifyDataConnect();
    else
        NotifyVoiceConnect();                       /* NOTE: Notify AT_CORE voice connect */

    phones[ch].clocktime.second = 0;
    phones[ch].clocktime.minute = 0;
    if (phones[ch].talktime == 0) phones[ch].talktime = DEF_TALKTIME;

    StartTmr(phones[ch].clocktmr, PERIOD_CLOCK);
    if (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM) {
        StartTmr(phones[ch].monitortmr, PERIOD_DETECT_PIN);
    } else {
        StartTmr(phones[ch].monitortmr, MINUTE, phones[ch].talktime);
        OSQPost(SysTaskMsgQue, MSG_PHONEDRV_CONNECT, 0, 0);
    }
    if (phones[ch].hooker != 0) phones[ch].hooker(PHONE_TALKING);
}

static void TurnintoRing(INT8U ch)
{
    phones[ch].status = PHONE_RINGING;
    ClogOP(ch);                                     /* NOTE: clog short message channel */


    StartTmr(phones[ch].waittmr, PERIOD_WAIT);
    StartTmr(phones[ch].monitortmr, PERIOD_RING);
    if (phones[ch].channel != CHA_DATA && phones[ch].channel != CHA_MODEM)
        OSQPost(SysTaskMsgQue, MSG_PHONEDRV_RING, 0, 0);
}

static void Informer_Connect(INT8U ch, INT8U reason)
{
    if (phones[ch].status == PHONE_CONNECTING) {
        if (reason == _SUCCESS){

          if(ch == PHONE_COM) SelAudioPath(0, MAIN_PATH);

          TurnintoTalk(ch);

        }
        else TurnintoFree(ch);
    }
}

static void Informer_Disconnect(INT8U ch, INT8U reason)
{
    reason = reason;

    if((PHONE_GPRS == ch) && (reason != _SUCCESS))  return ;

    TurnintoFree(ch);

}

static void Informer_QueryRingStatus(INT8U result, INT8U *ptr)
{
    if (result == _SUCCESS) {
        if (phones[PHONE_COM].status == PHONE_RINGING) {
            if (*ptr)
                StartTmr(phones[PHONE_COM].monitortmr, PERIOD_RING);
            else
                HangupPhone(PHONE_COM,0);
        }
    }
}

static void WaitTmrProc(void)
{
    INT8U ch;

    ch = GetCurTmrIndex();
    if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
    if (phones[ch].status == PHONE_FREE) {
        StopTmr(phones[ch].waittmr);
        RingPara[ch].len = 0;
        TurnintoRing(ch);
    } else if (phones[ch].status == PHONE_RINGING) {
        if (ch == PHONE_COM)
            QueryRingStatus(Informer_QueryRingStatus);
        else
            StopTmr(phones[ch].waittmr);
    }
}

static void ClockTmrProc(void)
{
    INT8U ch;

    ch = GetCurTmrIndex();
    if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
    StartTmr(phones[ch].clocktmr, PERIOD_CLOCK);
    if (++phones[ch].clocktime.second >= 60) {
        phones[ch].clocktime.second = 0;
        phones[ch].clocktime.minute++;
    }
}

static void MonitorTmrProc(void)
{
    INT8U ch;

    ch = GetCurTmrIndex();
    if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);

    if (phones[ch].status == PHONE_TALKING && (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM)) {
        StartTmr(phones[ch].monitortmr, PERIOD_DETECT_PIN);
    } else if (phones[ch].status == PHONE_DISCONNECTING && (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM)) {
        StopTmr(phones[ch].monitortmr);
       	SendHangupCmd(ch, Informer_Disconnect,0);
       	StartTmr(phones[ch].monitortmr, SECOND,2);

    } else {
        if (phones[ch].status != PHONE_DISCONNECTING) {
            StopTmr(phones[ch].monitortmr);

⌨️ 快捷键说明

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