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

📄 gpsdrv.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
📖 第 1 页 / 共 2 页
字号:
    
    for (i = 0; i < sizeof(HEAD_GPGSA) - 1; i++) {
        if (msgbuf[i] != HEAD_GPGSA[i]) return FALSE;
    }

    if (!GpsMsgValid() || !CharSetValid(&msgbuf[6], msglen - 8)) {  /* 8 = $GPGSA, 0x0d, 0x0a */
#if DEBUG_GPS > 0
        printf("<receive error GPGSA message>\n");
#endif
        return TRUE;
    }

    if ((status & SLEEP_) == 0) {                                   /* 表示接收到GPS模块输出的GSA数据 */
        ct_gsa = 0;
        isnormal = TRUE;
    }
    
    isnormal = TRUE;
    StartTmr(monitortmr, PERIOD_MONITOR);
    ResolveGPGSA(msgbuf, msglen);
    return TRUE;
}

static BOOLEAN HdlMsg_PUBX04(void)
{
    INT8U i;
   
    for (i = 0; i < sizeof(HEAD_PUBX04) - 1; i++) {
        if (msgbuf[i] != HEAD_PUBX04[i]) return FALSE;
    }

    if (!GpsMsgValid() || !CharSetValid(&msgbuf[9], msglen - 11)) {/* 11 = $PUBX,04, 0x0d, 0x0a */
#if DEBUG_GPS > 0
        printf("<receive error PUBX04 message>\n");
#endif
        return TRUE;
    }
    
    if ((status & SLEEP_) == 0) {                                   /* 表示接收到GPS模块输出的PUBX04数据 */
        ct_pubx04 = 0;
        isnormal = TRUE;
    }
   
    isnormal = TRUE;
    StartTmr(monitortmr, PERIOD_MONITOR); 
    ResolvePUBX04(msgbuf, msglen);
    return TRUE;
}
#if EN_GSV>0////////////////////////////////////////////BEGIN
static BOOLEAN HdlMsg_GPGSV(void)
{
    INT8U i;
    
    for (i = 0; i < sizeof(HEAD_GPGSV) - 1; i++) {
        if (msgbuf[i] != HEAD_GPGSV[i]) return FALSE;
    }

    if (!GpsMsgValid() || !CharSetValid(&msgbuf[6], msglen - 8)) { /* 8 = $GPGSV 0x0d, 0x0a */
#if DEBUG_GPS > 0
        printf("<receive error GPGSV message>\n");
#endif
        return TRUE;
    }

    if ((status &SLEEP_) == 0) {                                   /* 表示接收到GPS模块输出的GSV数据 */
        ct_gsv = 0;
        isnormal = TRUE;
    }
    isnormal = TRUE;
    StartTmr(monitortmr, PERIOD_MONITOR);
    ResolveGPGSV(msgbuf, msglen);
    return TRUE;
}
#endif
static void ScanTmrProc(void)
{
    INT16S recv;
    BOOLEAN err_recv;

    StartTmr(scantmr, PERIOD_SCAN);
    
    if ((status & (RESET_ | INIT_ | SLEEP_)) == 0) {
        err_recv = FALSE;
        if (++ct_rmc > MAX_RMC) {
            err_recv = TRUE;
        }

        if (++ct_gga > MAX_GGA) {
            err_recv = TRUE;
        }
        if (++ct_gsa > MAX_GSA) {
            err_recv = TRUE;
        }
        if (++ct_gsv > MAX_GSV) {
            err_recv = TRUE;
        }
        if (++ct_pubx04 > MAX_PUBX04) {
            err_recv = TRUE;
        }

        if (err_recv) {
#if DEBUG_GPS
            printf("<no receive message form GPS module>\n");
#endif
            isnormal  = FALSE;
            coldstart = TRUE;                                   /* 长时间接收不到GPS模块输出数据,冷启动GPS模块 */
            ResetGps();
        }
    }
   
    for (;;) 
    {
        if ((recv = uarts_read(UARTNo_GPS)) == -1) break;       
        if (msglen == 0) 
        {
            if (recv == '$') 
            {
                msgbuf[0] = '$';
                msglen    = 1;
            }
        } 
        else 
        {
            if (msglen >= sizeof(msgbuf)) 
            {
                msglen = 0;
            }
            else 
            {
                msgbuf[msglen++] = recv;
                
                if (recv == 0x0a) 
                {              
                    if(!HdlMsg_GPRMC())
                    {
#if EN_GGA > 0
                       if(!HdlMsg_GPGGA())
                       {
#endif
                          if (!HdlMsg_GPGSA()) 
                          {
                          
                              if (!HdlMsg_PUBX04()) 
                              {   
#if EN_GSV>0
                                  HdlMsg_GPGSV();
#endif 
                              }                  
                          }
#if EN_GGA > 0      
  
                      }
#endif 
                   }
                   
                   msglen = 0;
               }
          }
     }
  }
}

static void MonitorTmrProc(void)
{
    #if DEBUG_UARTNo_GPS <= 3
    PrintFromUART(DEBUG_UARTNo_GPS, "<no receive message form GPS module>\n");
    PrintFromUART(DEBUG_UARTNo_GPS, "ct_nomsg=");
    SendFromUART_HEX(DEBUG_UARTNo_GPS, ct_nomsg);
    #endif
    StartTmr(monitortmr, PERIOD_MONITOR);
    isnormal = FALSE;
   
    if (++ct_nomsg<MAX_NOMSG) 
    {
        uarts_init(UARTNo_GPS,SET_BAUD);
    } 
    else 
    {
    	ResetGps();
   	}
   
   	
}

static void OpTmrProc(void)
{
	#if DEBUG_UARTNo_GPS <= 3
	PrintFromUART(DEBUG_UARTNo_GPS, "\nopstep=");
	SendFromUART_HEX(DEBUG_UARTNo_GPS, opstep); 
	#endif   
    if (status & INIT_) {
        SetInit();
        return;
    }

    switch (opstep)
    {
        case STEP_POWERDOWN:
            StartTmr(optmr, PERIOD_POWERDOWN);
            UART_Close(UARTNo_GPS);
            PowerdownGps();
            opstep = STEP_POWERUP;
            #if DEBUG_UARTNo_GPS <= 3
        	PrintFromUART(DEBUG_UARTNo_GPS, "\nSTEP_POWERDOWN");            
            #endif
            break;
        case STEP_POWERUP:
        	#if DEBUG_UARTNo_GPS <= 3
        	PrintFromUART(DEBUG_UARTNo_GPS, "\nSTEP_POWERUP");
        	#endif
            StartTmr(optmr, PERIOD_POWERUP);
            PowerupGps();
            opstep = STEP_STOPRESET;
            break;
        case STEP_STOPRESET:
        	#if DEBUG_UARTNo_GPS <= 3
        	PrintFromUART(DEBUG_UARTNo_GPS, "\nSTEP_STOPRESET");
            #endif
            status = 0;
            StopTmr(optmr);
            StartInit();
            break;
        default:
            ;
    }
}



static void DiagnoseProc(void)
{
    if (status & (RESET_ | INIT_)) {
        if (GetTmrSwitch(optmr) != ON) ErrExit(ERR_GPSDRV_TMR);
    } else if (GpsIsWorking()) {
        if (GetTmrSwitch(scantmr) != ON) ErrExit(ERR_GPSDRV_TMR);
        if (GetTmrSwitch(monitortmr) != ON) ErrExit(ERR_GPSDRV_TMR);
    }
}

void InitGpsDrv(void)
{
    #if DEBUG_UARTNo_GPS <= 3
    InitUART(DEBUG_UARTNo_GPS, DEBUG_UART_BAUD);              /* initialize debug uart */
    Printu("InitGpsDrv\r\n");
    #endif

    InitOldPosition();
    status   = 0;
    numapply = 0;
    msglen   = 0;
    isnormal = TRUE;
    
   

    optmr      = CreateTimer(OpTmrProc, 0);
    scantmr    = CreateTimer(ScanTmrProc, 0);
    monitortmr = CreateTimer(MonitorTmrProc, 0);
        
    InstallDiagProc(DiagnoseProc);
    
    coldstart = FALSE;
    ResetGps();
}



void ResetGps(void)
{
    StopTmr(scantmr);
    StopTmr(monitortmr);
    status     = RESET_;
    ct_invalid = 0;
    ct_nomsg   = 0;
    opstep     = STEP_POWERDOWN;
   
#if EN_GPS_LEA_4A
    if (coldstart) 
    {
        coldstart =FALSE;
        uarts_writeblock(UARTNo_GPS,CFG_RST, sizeof(CFG_RST));            //    指令复位GPS
        StartTmr(optmr,SECOND, 5);                                        //    延时一段时间后复位GPS模块
        return;
    }
#endif
    OpTmrProc();
}

void SleepGps(void)
{
    #if DEBUG_UARTNo_GPS <= 3
    PrintFromUART(DEBUG_UARTNo_GPS, "\nSleepGps");
    #endif    
    StopTmr(optmr);
    StopTmr(scantmr);
    StopTmr(monitortmr);

    status = SLEEP_;
    UART_Close(UARTNo_GPS);
    PowerdownGps();
   
}

void WakeupGps(void)
{
    if (GpsIsSleep()) {
        status &= ~SLEEP_;
        ResetGps();
    }
}

void ApplyGps(void)
{
    if (numapply >= MAX_APPLY) ErrExit(ERR_GPSDRV_APPLY);
    numapply++;
    WakeupGps();
}

void ReleaseGps(void)
{
    #if DEBUG_UARTNo_GPS <= 3
    PrintFromUART(DEBUG_UARTNo_GPS, "\nReleaseGps");
    #endif    
    if (numapply == 0) ErrExit(ERR_GPSDRV_APPLY);
    if (--numapply == 0) OSQPost(SysTaskMsgQue, MSG_GPSDRV_NOAPPLY, 0, 0);
}

BOOLEAN GpsIsApplied(void)
{
    if (numapply > 0) return TRUE;
    else return FALSE;
}

BOOLEAN GpsIsNormal(void)
{
    return isnormal;
}

BOOLEAN GpsIsSleep(void)
{
    if (status & SLEEP_) return TRUE;
    else return FALSE;
}

BOOLEAN GpsIsWorking(void)
{
    if (((status & (SLEEP_ | RESET_)) == 0) && GpsIsNormal()) return TRUE;
    else return FALSE;
}

⌨️ 快捷键说明

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