📄 gpsdrv.c
字号:
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 + -