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

📄 at_core.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 4 页
字号:
static void QueryNetworkInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    status &= ~_QueryNetwork;
    if (reason == AT_SUCCESS) {
        networkregistration = atcmdack->ackbuf[1];
        if (networkregistration == NETWORK_HomeNetwork || networkregistration == NETWORK_Roaming) {
            if ((status & _NetworkRegistered) == 0) {
                if(NEED_SATC == needsatc) satcregstatut = NEED_SATC_NO;
    else if(NEED_SATC_NO == needsatc) satcregstatut = NEED_SATC;
    else satcregstatut = NEED_SATC_CLEAR;

                status |= (_NetworkRegistered | _QuerySignal);
                StartTmr(RestartTmr, PERIOD_Restart);
                OSQPost(GsmTaskMsgQue, MSG_ATCORE_SEARCHNETWORK, 0, 0);
            }
        } else {
            if (status & _NetworkRegistered) {
                status &= ~_NetworkRegistered;
                StartTmr(RestartTmr, PERIOD_Restart_NoNetwork);
                OSQPost(GsmTaskMsgQue, MSG_ATCORE_NONETWORK, 0, 0);

                signalintensity = 0;
                OSQPost(GsmTaskMsgQue, MSG_ATCORE_SIGNAL, signalintensity, 0);
            }
        }
    }
}

static void QueryNetworkProc(void)
{
    INT16U len;

    if (CanSendATCmd(DLC_CFG)) {
        len = AT_R_CREG(sendbuf[DLC_CFG]);
        SendATCmd(DLC_CFG, &AT_R_CREG_PARA, sendbuf[DLC_CFG], len, QueryNetworkInformer);
    }
}

static void QueryConfigInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    status &= ~_QueryConfig;
    if (reason == AT_SUCCESS) {
        if (atcmdack->ackbuf[0] == 1 && atcmdack->ackbuf[1] == 2) {
            ;
        } else {
            StartInitGsm(STEP_SetSMService);
        }
    } else {
        StartInitGsm(STEP_SetSMService);
    }
}

static void QueryConfigProc(void)
{
    INT16U len;

    if (CanSendATCmd(DLC_SM)) {
        len = AT_R_CNMI(sendbuf[DLC_SM]);
        SendATCmd(DLC_SM, &AT_R_CNMI_PARA, sendbuf[DLC_SM], len, QueryConfigInformer);
    }
}

static void InitWaitTmrProc(void)
{
    StopTmr(InitWaitTmr);
    status &= (~_InitWait);
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_INIT, 0, 0);
}

static void QuerySIMTmrProc(void)
{
    StopTmr(QuerySIMTmr);
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_INIT, 0, 0);
}

static void QueryNetworkTmrProc(void)
{
    StartTmr(QueryNetworkTmr, PERIOD_QueryNetwork);
    //StopTmr(QueryNetworkTmr);

    if ((status & _Init) == 0) {
        status |= _QueryNetwork;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
    }
}

static void QuerySignalTmrProc(void)
{
    //StopTmr(QuerySignalTmr);
    StartTmr(QuerySignalTmr, PERIOD_QuerySignal);
    if ((status & _Init) == 0) {
        status |= _QuerySignal;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
    }
}

static void QueryConfigTmrProc(void)
{
    StartTmr(QueryConfigTmr, PERIOD_QueryConfig);
    //StopTmr(QueryConfigTmr);
    if ((status & _Init) == 0) {
        status |= _QueryConfig;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
    }
}

static void ResetTmrProc(void)
{
    switch(opstep)
    {
        case STEP_Prewait:
            StartTmr(ResetTmr, PERIOD_Prewait);
            opstep = STEP_Powerdown;
            break;
        case STEP_Powerdown:
            InitGsmPort();

            PowerdownGsm();                                         /* powerdown gsm */
            PowerupGsm();
            StartTmr(ResetTmr, PERIOD_Powerdown);
            opstep = STEP_WaitPowerdown;
            break;
        case STEP_WaitPowerdown:
            ResetPowerdownGsm();                                    /* reset powerdown pin */
            StartTmr(ResetTmr, PERIOD_WaitPowerdown);
            opstep = STEP_Powerup;
            OSQPost(GsmTaskMsgQue, MSG_ATCORE_POWERDOWNGSM, 0, 0);
            break;
        case STEP_Powerup:
            InitGsmPort();

            PowerupGsm();                                           /* powerup gsm */
            StartTmr(ResetTmr, PERIOD_Powerup);
            opstep = STEP_WaitPowerup;
            break;
        case STEP_WaitPowerup:
            ResetPowerupGsm();                                      /* reset powerup pin */
            StartTmr(ResetTmr, PERIOD_WaitPowerup);
            opstep = STEP_StopPowerup;
            OSQPost(GsmTaskMsgQue, MSG_ATCORE_POWERUPGSM, 0, 0);

            /* open DLC_CFG */
            if (!EstablishDLC(DLC_CFG, TRUE, 0)) {
                ErrExit(ERR_ATCORE_ESTABLISHDLC);
            } else {
                OpenATTrans(DLC_CFG);
                EchoOnATTrans(DLC_CFG);
            }
            break;
        case STEP_StopPowerup:
            StopResetProcess();
            break;
        default:
            ErrExit(ERR_ATCORE_OPSTEP);
    }
}

static void RestartTmrProc(void)
{
    StartTmr(RestartTmr, PERIOD_Restart);
    if ((status & (_VoiceConnect | _DataMode)) == 0){
        #if DEBUG_UARTNo_GSMSTATUS <= 3
        PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<reset gsm for restart>\n");
        #endif
        ResetGsm();
    }
}

static void DiagnoseProc(void)
{
    if (status & _InitWait) {
        if (GetTmrSwitch(InitWaitTmr) != ON) ErrExit(ERR_ATCORE_TMR);
    }
    if (status & _Reset) {
        if (GetTmrSwitch(ResetTmr) != ON) ErrExit(ERR_ATCORE_TMR);
    } else {
        if (GetTmrSwitch(RestartTmr) != ON) ErrExit(ERR_ATCORE_TMR);
    }
}

void InitAT_Core(void)
{
    ResetTmr        = CreateTimer(ResetTmrProc, 0);                 /* install reset timer */
    InitWaitTmr     = CreateTimer(InitWaitTmrProc, 0);              /* install init wait timer */
    RestartTmr      = CreateTimer(RestartTmrProc, 0);               /* install restart timer */
    QuerySIMTmr     = CreateTimer(QuerySIMTmrProc, 0);              /* install query SIM card timer */
    QuerySignalTmr  = CreateTimer(QuerySignalTmrProc, 0);           /* install query signal timer */
    QueryConfigTmr  = CreateTimer(QueryConfigTmrProc, 0);           /* install query config timer */
    QueryNetworkTmr = CreateTimer(QueryNetworkTmrProc, 0);          /* install query network timer */
    InstallDiagProc(DiagnoseProc);

    #if DEBUG_UARTNo_GSMSTATUS <= 3
    PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<reset gsm for init>\n");
    #endif
    satcregstatut = NEED_SATC;
    SetCopsMode(RESET_MANUAL_MODE);  
    tag_baud = 0;
    status = _DetectSIM;
    ResetGsm();
}

void ResetGsm(void)
{
    AbandonAllATCmd();                                              /* abandon current AT command */
    CloseAllATTrans();                                              /* close all at trans */
    #if GSM_BENQ
    Init_PIN_RS232();
    #endif
    ResetPowerupGsm();                                              /* reset powerup pin */
    PowerdownGsm();                                                 /* powerdown pin */
    StopTmr(InitWaitTmr);                                           /* stop init wait timer */
    StopTmr(RestartTmr);                                            /* stop restart timer */
    StopTmr(QuerySignalTmr);                                        /* stop querysignal timer */
    StopTmr(QueryNetworkTmr);                                       /* stop query network timer */
    StopTmr(QueryConfigTmr);                                        /* stop queryconfig timer */
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_RESET, 0, 0);                 /* send MSG_ATCORE_RESET */

    
    status &= _DetectSIM;
    status |= _Reset;
    ClearAllRecoveryCHA();                                          /* clear recovery flag */
    networkregistration = NETWORK_NotRegistered_Searching;
    ct_smfailure    = 0;
    signalintensity = 0;
   
    InitBuf(unreadsm, FALSE, sizeof(unreadsm));
    if((NEED_SATC == satcregstatut) || (NEED_SATC_NO == satcregstatut)) needsatc = satcregstatut;
    if((NEED_SATC != needsatc) && (NEED_SATC_NO != needsatc)) needsatc = NEED_SATC;
    ConvertCopsMode(RESET_CONVERT);
    SetCopsModeByResetMode();
    OpenATTrans(DLC_GPRS);
    ClearDLCDataMode(DLC_GPRS);
    opstep = STEP_Prewait;
    ResetTmrProc();
}

void AT_CoreEntry(void)
{
    if (status & _Reset) return;

    if (status & _RequestReset) {
        if ((status & _VoiceConnect) == 0) ResetGsm();
    }
    if (FindRecoveryCHA() != 0xFF) RecoveryProc();
    if (status & _Escape) EscapeProc();
    if (status & _AckSM)  AckSMProc();
    if (status & _Init)   InitProc();
    if (status & _ReadSM) ReadSMProc();
    if (status & _QueryNetwork) QueryNetworkProc();
    if (status & _QueryConfig)  QueryConfigProc();
    if (status & _QuerySignal)  QuerySignalProc();
}

BOOLEAN AT_CoreHaveTask(void)
{
    INT16U mask;

    if (FindRecoveryCHA() != 0xFF) return TRUE;

    mask = _Reset | _AckSM | _Init | _QueryConfig | _QuerySignal | _QueryNetwork | _Escape | _ReadSM;
    if ((status & mask) == 0) {
        return FALSE;
    } else {
        return TRUE;
    }
}

void NotifySendSMSuccess(void)
{
    ct_smfailure = 0;
    SetDefSMSuspendTime();
}

void NotifySendSMFailure(void)
{
    SetErrSMSuspendTime();
    if (++ct_smfailure >= MAX_SMFAILURE) {
        if ((status & (_VoiceConnect | _DataMode)) == 0) {
            #if DEBUG_UARTNo_GSMSTATUS <= 3
            PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<reset gsm for sending SM error>\n");
            #endif
            ResetGsm();
        } else {
            ct_smfailure = 0;
        }
    }
}

void NotifyVoiceConnect(void)
{
    if ((status & _Reset) == 0) status |= _VoiceConnect;
}

void NotifyVoiceDisconnect(void)
{
    status &= (~_VoiceConnect);
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_VOICEDISCONNECT, 0, 0);
}

void NotifyDataConnect(void)
{
    if ((status & _Reset) == 0) {
        status |= _DataMode;
        CloseATTrans(DLC_GPRS);
        SetDLCDataMode(DLC_GPRS);
    }
}

void NotifyDataDisconnect(void)
{
    status &= ~_DataMode;
    OpenATTrans(DLC_GPRS);
    ClearDLCDataMode(DLC_GPRS);
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
}

void RequestResetGSM(void)
{
    if ((status & _Reset) == 0) {
        status |= _RequestReset;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
    }
}

void NotifyRecvSM(void)
{

    #if GSM_BENQ
    status |= _QueryConfig;
    #else
    status |= (_AckSM | _QueryConfig);
    #endif
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
}


void NotifyUnReadSM(INT8U index)
{
    if (index < sizeof(unreadsm)) {
        unreadsm[index] = TRUE;
        if ((status & _ReadSM) == 0) {
            status |= _ReadSM;
            OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
        }
    }
}

void RecoveryATCmd(INT8U ch)
{
    if (ch >= MAX_CHA) return;
    if (!ch_recovery[ch]) {
        ch_recovery[ch] = TRUE;
        ct_recovery[ch] = 0;
    }
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
}

void EscapeATCmd(void)
{
    status |= _Escape;
    StopATCmd(DLC_SM, AT_FAILURE);
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
}

void ProhibitSM(void)
{
    if ((status & _ProhibitSM) == 0) {
       status |= _ProhibitSM;
    }
}

void UnprohibitSM(void)
{
    if (status & _ProhibitSM) {
        status &= ~_ProhibitSM;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_UNPROHIBITSM, 0, 0);
    }
}

void DetectGsmSysStart(void)
{
    //opstep = STEP_StopPowerup;
    //StartTmr(ResetTmr, PERIOD_WaitPowerup);
}

INT8U GetSignalIntensity(void)
{
    return signalintensity;
}

INT8U GetNetworkStatus(void)
{
    return networkregistration;
}

BOOLEAN NetworkRegisted(void)
{
    if (networkregistration == NETWORK_HomeNetwork || networkregistration == NETWORK_Roaming) return TRUE;
    else return FALSE;
}


BOOLEAN SIMCardInserted(void)
{
    if (status & _DetectSIM) return TRUE;
    else return FALSE;
}

BOOLEAN VoiceConnected(void)
{
    if (status & _VoiceConnect) return TRUE;
    else return FALSE;
}

BOOLEAN DataConnected(void)
{
    if (status & _DataMode) return TRUE;
    else return FALSE;
}

BOOLEAN SMIsProhibited(void)
{
    if (status & _ProhibitSM) return TRUE;
    else return FALSE;
}

⌨️ 快捷键说明

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