📄 phonedrv.c
字号:
if(ch==PHONE_GPRS) HangupPhone(ch,0);
else HangupPhone(ch,PRI_CHUP);
}
}
}
static void DiagnoseProc(void)
{
INT8U i;
for (i = 0; i < NUM_PHONE; i++) {
if (phones[i].status > PHONE_INITPARA) ErrExit(ERR_PHONEDRV_STATUS);
if (phones[i].status != PHONE_FREE) {
if (GetTmrSwitch(phones[i].monitortmr) != ON) ErrExit(ERR_PHONEDRV_TMR);
} else {
}
}
}
void InitPhoneDrv(void)
{
INT8U i;
InitMicSelectPort(); /* initialize Mic select port */
for (i = 0; i < NUM_PHONE; i++) {
phones[i].waittmr = CreateTimer(WaitTmrProc, i);
phones[i].clocktmr = CreateTimer(ClockTmrProc, i);
phones[i].monitortmr = CreateTimer(MonitorTmrProc, i);
MovStr((INT8U *)phones[i].APN, "CMNET");
}
ResetPhoneDrv();
InstallDiagProc(DiagnoseProc);
}
static void PhoneInitParaTmrProc(void)
{
SetAudioGain(0,SIDETONEPATH,'0'); //关掉侧音
SetAudioEcho(0,ECHO_PARA_STR);
SetAudioLevelMax(0,LEVEL_MAX_PARA);
SetAudioVAD(0);
SetAudioABS(0);
RemoveTmr(PhoneInitParaTmr);
return ;
}
void InitPhoneCOMPara(void)
{
PhoneInitParaTmr = CreateTimer(PhoneInitParaTmrProc,0);
Init_ControlPath();
SelAudioPath(0, MAIN_PATH);
StartTmr(PhoneInitParaTmr,SECOND,5);
}
void ResetPhoneDrv(void)
{
INT8U i;
Init_PIN_RS232(); /* initialize RS232 PIN */
SelectMic_HandsFree();
ClosePowerAmp_Speaker();
for (i = 0; i < NUM_PHONE; i++) {
phones[i].ingain[CHA_LCD] = 5;
#if GSM_BENQ
phones[i].ingain[CHA_HANDSET] = 6;
phones[i].ingain[CHA_HANDSFREE] = 6;
#else
phones[i].ingain[CHA_HANDSET] = 4;
phones[i].ingain[CHA_HANDSFREE] = 4;
#endif
phones[i].ingain[CHA_DTMF] = 4;
phones[i].ingain[CHA_VOICECHIP] = 4;
phones[i].ingain[CHA_LISTEN] = 7;
phones[i].outgain[CHA_HANDSET] = 7;
phones[i].outgain[CHA_LCD] = 7;
phones[i].outgain[CHA_HANDSFREE] = 7;
phones[i].outgain[CHA_DTMF] = 5;
phones[i].outgain[CHA_VOICECHIP] = 5;
phones[i].outgain[CHA_LISTEN] = 6;
phones[i].status = PHONE_FREE;
phones[i].hooker = 0;
phones[i].ct_clog = 0;
phones[i].audmode = 3;
phones[i].channel = CHA_HANDSET;
phones[i].modem_req = MODEM_REQ_FREE;
StopTmr(phones[i].waittmr);
StopTmr(phones[i].clocktmr);
StopTmr(phones[i].monitortmr);
}
}
BOOLEAN RegistPhoneHooker(INT8U ch, void (*hooker)(INT8U))
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_FREE) return FALSE;
phones[ch].hooker = hooker;
return TRUE;
}
BOOLEAN HangupPhone(INT8U ch,INT8U Privil)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_FREE || phones[ch].status == PHONE_DISCONNECTING) return FALSE;
#if GSM_BENQ
if((ch == PHONE_COM) && (Privil == 0) && (phones[ch].status != PHONE_TALKING) && (phones[ch].status != PHONE_RINGING)){
Privil = PRI_CHUP;
}
#endif
if (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM) {
AbandonVoiceCmd(ch);
TurnintoDisconnect(ch);
return TRUE;
}
if (SendHangupCmd(ch, Informer_Disconnect,Privil)) {
TurnintoDisconnect(ch);
return TRUE;
} else {
return FALSE;
}
}
BOOLEAN PickupPhone(INT8U ch, INT8U channel, void (*hooker)(INT8U))
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status != PHONE_RINGING || channel > CHA_LISTEN) return FALSE;
if (channel == CHA_DATA || channel == CHA_MODEM) return FALSE;
if (SendPickupCmd(ch, Informer_Connect)) {
phones[ch].hooker = hooker;
TurnintoConnect(ch);
SelectChannel(ch, channel);
return TRUE;
} else {
return FALSE;
}
}
INT8U RingupPhone(INT8U ch, INT8U channel, INT8U *telptr, INT8U tellen, void (*hooker)(INT8U))
{
INT8U networkstatus;
INT8U mode;
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (!SIMCardInserted()) return PHONE_NOSIM;
networkstatus = GetNetworkStatus();
if (networkstatus == NETWORK_NotRegistered) return PHONE_NONETWORK;
if (networkstatus == NETWORK_NotRegistered_Searching) return PHONE_SEARCHINGNETWORK;
if (networkstatus == NETWORK_Denied) return PHONE_NONETWORK;
if (networkstatus == NETWORK_Unknown) return PHONE_NONETWORK;
if (networkstatus != NETWORK_HomeNetwork && networkstatus != NETWORK_Roaming) return PHONE_NONETWORK;
if (phones[ch].status != PHONE_FREE) return PHONE_BUSY;
if (channel > CHA_LISTEN) return PHONE_ERROR;
if (channel == CHA_DATA || channel == CHA_MODEM)
mode = MODE_DATA;
else
mode = MODE_VOICE;
if (ch == PHONE_GPRS){
//SetPDPContext(0, '1', phones[ch].APN, "0.0.0.0");
SetPDPContext2('1', phones[ch].APN, "0.0.0.0");
}
if (SendRingupCmd(ch, Informer_Connect, telptr, tellen, mode)) {
phones[ch].hooker = hooker;
TurnintoConnect(ch);
SelectChannel(ch, channel);
return PHONE_ACCEPT;
} else {
return PHONE_BUSY;
}
}
BOOLEAN DialDTMF(INT8U ch, char dtmfchar)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_TALKING) {
if (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM)
return FALSE;
else
return SendDTMFCmd(0, dtmfchar);
} else {
return FALSE;
}
}
INT8U GetPhoneStatus(INT8U ch)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
return phones[ch].status;
}
void ChangeVoiceChannel(INT8U ch, INT8U channel)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].channel != CHA_DATA && phones[ch].channel != CHA_MODEM
&& channel != CHA_DATA && channel != CHA_MODEM)
SelectChannel(ch, channel);
}
INT8U GetVoiceChannel(INT8U ch)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
return phones[ch].channel;
}
void GetClockTime(INT8U ch, CLOCKTIME_STRUCT *curclocktime)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
curclocktime->second = phones[ch].clocktime.second;
curclocktime->minute = phones[ch].clocktime.minute;
}
BOOLEAN SetTalkTime(INT8U ch, INT16U time)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_TALKING || phones[ch].status == PHONE_CONNECTING) {
if (time > 0) {
phones[ch].talktime = time;
if ((phones[ch].channel != CHA_DATA && phones[ch].channel != CHA_MODEM) && phones[ch].status == PHONE_TALKING)
StartTmr(phones[ch].monitortmr, MINUTE, time);
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
}
BOOLEAN TurnupVoiceVolume(INT8U ch)
{
INT8U channel;
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
channel = phones[ch].channel;
if (phones[ch].status == PHONE_TALKING) {
if (channel != CHA_HANDSET && channel != CHA_LCD && channel != CHA_HANDSFREE)
return FALSE;
else {
if (phones[ch].outgain[channel] < MAX_STEP)
phones[ch].outgain[channel]++;
TurnChannelVolume(ch);
return TRUE;
}
} else {
return FALSE;
}
}
BOOLEAN TurndownVoiceVolume(INT8U ch)
{
INT8U channel;
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
channel = phones[ch].channel;
if (phones[ch].status == PHONE_TALKING) {
if (channel != CHA_HANDSET && channel != CHA_LCD && channel != CHA_HANDSFREE)
return FALSE;
else {
if (phones[ch].outgain[channel] > 0)
phones[ch].outgain[channel]--;
TurnChannelVolume(ch);
return TRUE;
}
} else {
return FALSE;
}
}
INT8U GetVoiceVolume(INT8U ch)
{
INT8U channel;
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
channel = phones[ch].channel;
return phones[ch].outgain[channel];
}
void SetGprsAPN(char *APN)
{
memcpy(phones[PHONE_GPRS].APN, APN, sizeof(phones[PHONE_GPRS].APN));
}
void DetectNoCarrier(INT8U ch)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_DISCONNECTING && (phones[ch].channel == CHA_DATA || phones[ch].channel == CHA_MODEM)) {
#if GSM_BENQ
HangupPhone(ch,0);
#else
TurnintoFree(ch);
#endif
} else {
#if GSM_BENQ
HangupPhone(ch,PRI_CHUP);
#else
HangupPhone(ch,0);
#endif
}
}
void DetectRing(INT8U ch)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_FREE) {
if (GetTmrSwitch(phones[ch].waittmr) == ON) TurnintoRing(ch);
else {
RingPara[ch].len = 0;
StartTmr(phones[ch].waittmr, PERIOD_WAIT);
}
} else if (phones[ch].status == PHONE_RINGING) {
StartTmr(phones[ch].monitortmr, PERIOD_RING);
}
}
void DetectCLIP(INT8U ch, INT8U *telptr, INT8U tellen)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].status == PHONE_FREE) {
if (tellen > sizeof(RingPara[ch].tel)) tellen = sizeof(RingPara[ch].tel);
RingPara[ch].len = tellen;
memcpy(RingPara[ch].tel, telptr, tellen);
TurnintoRing(ch);
} else if (phones[ch].status == PHONE_RINGING) {
if (RingPara[ch].len == 0 && tellen > 0) {
if (tellen > sizeof(RingPara[ch].tel)) tellen = sizeof(RingPara[ch].tel);
RingPara[ch].len = tellen;
memcpy(RingPara[ch].tel, telptr, tellen);
TurnintoRing(ch);
} else {
StartTmr(phones[ch].monitortmr, PERIOD_RING);
}
}
}
BOOLEAN modem_RingupPhone(INT8U ch, INT8U *telptr, INT8U tellen)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].modem_req != MODEM_REQ_FREE) return FALSE;
else {
phones[ch].modem_req = MODEM_REQ_DIAL;
phones[ch].modem_reqlen = tellen;
memcpy(phones[ch].modem_reqtel, telptr, tellen);
phones[ch].modem_reqlen = sizeof("*99***1#") - 1;
MovStr(phones[ch].modem_reqtel, "*99***1#");
OSQPost(GsmTaskMsgQue, MSG_PHONEDRV_MODEMREQ, 0, 0);
return TRUE;
}
}
void modem_HangupPhone(INT8U ch)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
phones[ch].modem_req = MODEM_REQ_HANG;
OSQPost(GsmTaskMsgQue, MSG_PHONEDRV_MODEMREQ, 0, 0);
}
INT8U modem_GetPhoneStatus(INT8U ch)
{
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
if (phones[ch].channel == CHA_MODEM) {
return phones[ch].status;
} else {
return phones[ch].modem_req;
}
}
BOOLEAN modem_CanRingupPhone(INT8U ch)
{
INT8U status;
if (ch >= NUM_PHONE) ErrExit(ERR_PHONEDRV_NUM);
status = GetNetworkStatus();
if ((status == NETWORK_HomeNetwork || status == NETWORK_Roaming) //change 2005.04.22
&& (modem_GetPhoneStatus(ch) == PHONE_FREE)
&& (GetPhoneStatus(ch) == PHONE_FREE)
&& (GetPhoneStatus(PHONE_COM) == PHONE_FREE))
return TRUE;
else
return FALSE;
}
void HdlMsg_modem_req(void)
{
INT8U i;
for (i = 0; i < NUM_PHONE; i++) {
if (phones[i].modem_req == MODEM_REQ_DIAL) {
RingupPhone(i, CHA_MODEM, phones[i].modem_reqtel, phones[i].modem_reqlen, 0);
} else if (phones[i].modem_req == MODEM_REQ_HANG) {
if (phones[i].channel == CHA_MODEM) {
HangupPhone(i,0);
}
}
phones[i].modem_req = MODEM_REQ_FREE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -