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

📄 at_core.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 4 页
字号:
{
    reason   = reason;
    atcmdack = atcmdack;
    Turninto_SetSMSAddr();
}

/* set SMS address */
static void Turninto_SetSMSAddr(void)
{
    opstep  = STEP_SetSMSAddr;
}

static void InitProc_SetSMSAddr(void)
{
    INT16U len;

    if (!CanSendATCmd(DLC_SM)) return;
    if (PubParaValid(SMSTEL_)) {
        len = AT_CSCA(sendbuf[DLC_SM], SmsTel.tel, SmsTel.len);
        SendATCmd(DLC_SM, &AT_CSCA_PARA, sendbuf[DLC_SM], len, InitInformer);
    } else {
	    #if SMSADDRDEBUG
	    memcpy(SmsTel.tel,(INT8U*)"+8613800592500",14);
	    SmsTel.len=14;
	    len = AT_CSCA(sendbuf[DLC_SM], SmsTel.tel, SmsTel.len);
	    SendATCmd(DLC_SM, &AT_CSCA_PARA, sendbuf[DLC_SM], len, InitInformer);
	    #endif
	    StopInitGsm();
    }
}

static void Informer_SetSMSAddr(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    reason   = reason;
    atcmdack = atcmdack;
    StopInitGsm();
}

static INT8U FailureInformer(INT8U step, const ATCMDACK_STRUCT *atcmdack)
{
   INT8U ret_result;

   atcmdack = atcmdack;

   ret_result = 0x00;

   switch(step){
       case  STEP_QueryAutocompon: 
            ret_result = NEED_INGORE;
	    Inform_QueryAutoCompon(AT_FAILURE, atcmdack);
            break;
       case  STEP_SetAutoCompon:
             ret_result = NEED_INGORE;
             Inform_SetAutoCompon(AT_FAILURE, atcmdack); 
	     break;
       case  STEP_SetSATC:
             ret_result = NEED_INGORE;
	     Inform_SetSatc(AT_FAILURE, atcmdack);
	     break;
       case STEP_CFUN:
             ret_result = NEED_INGORE;
	     Inform_SetCfun(AT_FAILURE, atcmdack);
	     break;
       case STEP_COPS:
           Inform_SetCops(AT_FAILURE, atcmdack);
            break;
       default:
            break;
       }
   
   return ret_result;
}

static void InitInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    if (reason == AT_SUCCESS) {
        ct_try = 0;
        switch (opstep)
        {
            case STEP_Test:                                         /* Test Gsm module */
                Informer_Test(reason, atcmdack);
                break;
            case STEP_SetBaud:                                      /* Set communication BAUD */
                Informer_SetBaud(reason, atcmdack);
                break;
            case STEP_QueryAutocompon:
		 Inform_QueryAutoCompon(reason, atcmdack);
	         break;
            case STEP_SetAutoCompon:
	         Inform_SetAutoCompon(reason, atcmdack);
	         break;
	    case STEP_SetSATC:
		 Inform_SetSatc(reason, atcmdack);
	         break;
	    case STEP_CFUN:
	         Inform_SetCfun(reason, atcmdack);
	         break;
	    case STEP_COPS:
	         Inform_SetCops(reason, atcmdack);
	         break;
            case STEP_NOSLEEP:
                 Informer_SetNoSleep(reason, atcmdack);
	         break;
            case STEP_QuerySIM:                                     /* Query SIM */
                Informer_QuerySIM(reason, atcmdack);
                break;
            case STEP_EnterMuxInit:
                 Informer_EnterMuxInit(reason, atcmdack);          /*  Close echo for mux mode */
                 break;
            case STEP_EnterMux:                                     /* enter multiplex mode */
                 Informer_EnterMux(reason, atcmdack);
                 break;
            case STEP_EchoON:                                       /* turn on echo */
                Informer_EchoON(reason, atcmdack);
                break;
            case STEP_SetCMEE:
                Informer_SetCMEE(reason, atcmdack);
                break;
            case STEP_SetCOLP:
	        Informer_SetCOLP(reason, atcmdack);
	        break;
	    case STEP_SetSMService:                                 /* Set SMS service mode */
                Informer_SetSMService(reason, atcmdack);
                break;
            case STEP_OpenCLIP:                                     /* Open CLIP */
                Informer_OpenCLIP(reason, atcmdack);
                break;
            case STEP_SetPDUMode:                                   /* Select PDU mode */
                Informer_SetPDUMode(reason, atcmdack);
                break;
            case STEP_OpenSMIndication:                             /* Enable new SMS message indication */
                Informer_OpenSMIndication(reason, atcmdack);
                break;
            case STEP_ListSM:                                       /* List SM */
                Informer_ListSM(reason, atcmdack);
                break;
            case STEP_SetSMSAddr:                                   /* Set SMS address */
                Informer_SetSMSAddr(reason, atcmdack);
                break;

            default:
                ErrExit(ERR_ATCORE_OPSTEP);
        }
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_INIT, 0, 0);
    } else {
        if(NEED_INGORE == FailureInformer(opstep, atcmdack)) return ;
        if (++ct_try > MAX_TRY) {
            if (opstep == STEP_SetSMSAddr) {
                StopInitGsm();
            } else {
                #if DEBUG_UARTNo_GSMSTATUS <= 3
                PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<reset gsm for init error>\n");
                #endif
	       //	if(opstep == STEP_SetSMSAddr) 
	       
                ResetGsm();
            }
        } else {
            status |= _InitWait;
            StartTmr(InitWaitTmr, PERIOD_INITWAIT);
        }
    }
}

static void InitProc(void)
{
    if (status & _InitWait) return;
    switch (opstep)
    {
        case STEP_Test:                                             /* Test Gsm module */
            InitProc_Test();
            break;
        case STEP_SetBaud:                                          /* Set communication BAUD */
            InitProc_SetBaud();
            break;
	case STEP_QueryAutocompon:
	     InitProc_QueryAutoCompon();
	    break;
        case STEP_SetAutoCompon:
	    InitProc_SetAutoCompon();
	    break;
	case STEP_SetSATC:
	    InitProc_SetSatc();
	    break;
	case STEP_CFUN:
            InitProc_SetCfun();
	    break;
        case STEP_COPS:
	     InitProc_SetCops();
	     break;
        case STEP_NOSLEEP:
	    InitProc_SetNoSleep();
	    break;
        case STEP_QuerySIM:                                         /* Query SIM */
            InitProc_QuerySIM();
            break;
        case STEP_EnterMuxInit:
             InitProc_EnterMuxInit();
             break;
        case STEP_EnterMux:                                         /* enter multiplex mode */
            InitProc_EnterMux();
            break;
        case STEP_EstablishDLC:                                     /* establish DLCS */
            InitProc_EstablishDLC();
            break;
        case STEP_EchoON:                                           /* turn on echo mode */
            InitProc_EchoON();
            break;
        case STEP_SetCMEE:
            InitProc_SetCMEE();
            break;
        case STEP_SetCOLP:
             InitProc_SetCOLP();				    /* Set CLOP  */
             break; 
        case STEP_OpenCLIP:                                         /* Open CLIP */
            InitProc_OpenCLIP();
            break;
        case STEP_SetPDUMode:                                       /* Select PDU mode */
            InitProc_SetPDUMode();
            break;
        case STEP_SetSMService:                                     /* Set SMS service mode */
            InitProc_SetSMService();
            break;
        case STEP_OpenSMIndication:                                 /* Enable new SMS message indication */
            InitProc_OpenSMIndication();
            break;
        case STEP_ListSM:                                           /* List SM */
            InitProc_ListSM();
            break;
        case STEP_SetSMSAddr:                                       /* Set SMS address */
            InitProc_SetSMSAddr();
            break;

        default:
            ErrExit(ERR_ATCORE_OPSTEP);
    }
}

static INT8U FindRecoveryCHA(void)
{
    INT8U i;

    for (i = 0; i < MAX_CHA; i++) {
        if (ch_recovery[i]) return i;
    }
    return 0xFF;
}

static void ClearAllRecoveryCHA(void)
{
    INT8U i;

    for (i = 0; i < MAX_CHA; i++) {
        ch_recovery[i] = FALSE;
        ct_recovery[i] = 0;
    }
}

static void StartInitGsm(INT8U step)
{
    status |= _Init;
    ct_try  = 0;
    opstep  = step;
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_INIT, 0, 0);
}

static void StopInitGsm(void)
{
    status &= ~_Init;
    status |= _QueryNetwork;
    OSQPost(GsmTaskMsgQue, MSG_ATCORE_ENDINIT, 0, 0);
}

static void StopResetProcess(void)
{
    status &= ~_Reset;
    StopTmr(ResetTmr);
    StartTmr(RestartTmr, PERIOD_Restart_NoNetwork);
    StartTmr(QueryNetworkTmr, SECOND, 1);
    StartTmr(QuerySignalTmr,  SECOND, 1);
    StartTmr(QueryConfigTmr,  SECOND, 1);
    StartInitGsm(STEP_Test);
}

#if 0
static void AckSMInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    atcmdack = atcmdack;
    status  &= ~_AckSM;
    if (reason != AT_SUCCESS)
        StartInitGsm(STEP_SetSMService);
}

#endif
static void AckSMProc(void)
{
    #if GSM_BENQ
    #else
    if (CanSendATCmd(DLC_SM)) {
        len = AT_CNMA(sendbuf[DLC_SM],0,0);
        SendATCmd(DLC_SM, &AT_CNMA_PARA, sendbuf[DLC_SM], len, AckSMInformer);
    }
    #endif
}

static void RecoveryInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    INT8U curcha;

    atcmdack = atcmdack;
    if ((curcha = FindRecoveryCHA()) == 0xFF) return;
    if (reason == AT_SUCCESS) {
        ch_recovery[curcha] = FALSE;
    } else {
        if (++ct_recovery[curcha] > MAX_RECOVERY) {
            #if DEBUG_UARTNo_GSMSTATUS <= 3
            PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<reset gsm for recovery error>\n");
            #endif
            if ((status & _Init) && opstep == STEP_Test) {
                if (tag_baud >= sizeof(GSMBAUD) / sizeof(GSMBAUD[0])) tag_baud = 0;
                uarts_init(UART_GSMIO, GSMBAUD[tag_baud++]);
            }
            ResetGsm();
        }
    }
}

static void RecoveryProc(void)
{
    INT8U  curcha;
    INT16U len;
    
    if ((curcha = FindRecoveryCHA()) == 0xFF) return;
    if (CanSendATCmd(curcha)) {
        len = AT_TEST(sendbuf[curcha]);
        SendATCmd(curcha, &AT_TEST_PARA, sendbuf[curcha], len, RecoveryInformer);
    }
}

static void EscapeInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    atcmdack = atcmdack;
    status  &= ~_Escape;
    if (reason != AT_SUCCESS) RecoveryATCmd(DLC_SM);
}

static void EscapeProc(void)
{
    INT16U len;

    if (CanSendATCmd(DLC_SM)) {
        len = AT_ESCAPE(sendbuf[DLC_SM]);
        SendATCmd(DLC_SM, &AT_ESCAPE_PARA, sendbuf[DLC_SM], len, EscapeInformer);
    }
}

static void DelSMInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    reason   = reason;
    atcmdack = atcmdack;
    if (curindex < sizeof(unreadsm)) {
        unreadsm[curindex] = FALSE;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
    }
}

static void DelSMProc(void)
{
    INT8U len;

    len = AT_CMGD(sendbuf[DLC_SM], curindex);
    SendATCmd(DLC_SM, &AT_CMGD_PARA, sendbuf[DLC_SM], len, DelSMInformer);
}

static void ReadSMInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    reason   = reason;
    atcmdack = atcmdack;
    DelSMProc();
}

static void ReadSMProc(void)
{
    INT8U i, len;

    if (CanSendATCmd(DLC_SM)) {
        for (i = 0; i < sizeof(unreadsm) - 1; i++) {
            if (unreadsm[i]) {
                curindex = i;
                len = AT_CMGR(sendbuf[DLC_SM], i);
                SendATCmd(DLC_SM, &AT_CMGR_PARA, sendbuf[DLC_SM], len, ReadSMInformer);
                return;
            }
        }
        status &= ~_ReadSM;
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_TSK, 0, 0);
    }
}

static void QuerySignalInformer(INT8U reason, const ATCMDACK_STRUCT *atcmdack)
{
    status &= ~_QuerySignal;
    if (reason == AT_SUCCESS) {
        if ((signalintensity = atcmdack->ackbuf[0]) > 31) signalintensity = 0;
        if (signalintensity > 2 && signalintensity < 28) {
            signalintensity = signalintensity / 6 + 1;
        } else {
            signalintensity = signalintensity / 6;
        }
        if ((status & _NetworkRegistered) == 0) {
            signalintensity = 0;
        }
        OSQPost(GsmTaskMsgQue, MSG_ATCORE_SIGNAL, signalintensity, 0);
    }
}

static void QuerySignalProc(void)
{
    INT16U len;

    if (CanSendATCmd(DLC_CFG)) {
        len = AT_CSQ(sendbuf[DLC_CFG]);
        SendATCmd(DLC_CFG, &AT_CSQ_PARA, sendbuf[DLC_CFG], len, QuerySignalInformer);
    }
}

⌨️ 快捷键说明

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