📄 phonedrv.c
字号:
/****************************************************************
** *
** 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 + -