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

📄 phonedrv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
            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 + -