Добавлена Проверка навигации на сбой приемника и перенесен прием навигации в другой поток

This commit is contained in:
cfif 2024-12-19 14:34:54 +03:00
parent 263b152442
commit 0a3c8470dc
2 changed files with 137 additions and 0 deletions

23
Inc/AtGsmGNSS.h Normal file
View File

@ -0,0 +1,23 @@
//
// Created by cfif on 19.12.2024.
//
#ifndef UVEOS_ON_NATION_ATGSMGNSS_H
#define UVEOS_ON_NATION_ATGSMGNSS_H
#include "AtCmdBase.h"
AtCommandResult AtGsm_ReceiverGnssStartStop(
tAtCmd *env,
bool isStartStop
);
AtCommandResult AtGsm_ReceiverGnssClearBuffer(
tAtCmd *env
);
AtCommandResult AtGsm_ReceiverGnssResetColdstart(
tAtCmd *env
);
#endif //UVEOS_ON_NATION_ATGSMGNSS_H

114
Src/AtGsmGNSS.c Normal file
View File

@ -0,0 +1,114 @@
//
// Created by cfif on 19.12.2024.
//
#include <SystemDelayInterface.h>
#include "AtCmdCommonProtected.h"
#include "AsciiStringParsingUtils.h"
#include "AtGsmQuerySignalQuality.h"
#include "stdlib.h"
AtCommandResult AtGsm_ReceiverGnssStartStop(
tAtCmd *env,
bool isStartStop
) {
AtCmdTxClear(env);
AtCmdTxAddStatic(env, "AT$GPSP=");
AtCmdTxAddChar(env, isStartStop ? '1' : '0');
AtCmdTxSendLn(env);
uint32_t timeout = 1000;
uint32_t endMs = SystemGetMs() + timeout;
uint32_t leftMs = timeout;
while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) {
leftMs = endMs - SystemGetMs();
if (AtCmdRxBeginWithStatic(env, "OK")) {
AtCmdRxClear(env);
return AT_OK;
} else if (AtCmdRxBeginWithStatic(env, "ERROR")) {
AtCmdRxClear(env);
return AT_ERROR;
} else if (AtCmdRxBeginWithStatic(env, "+CME ERROR: ")) {
AtCmdRxClear(env);
return AT_ERROR;
} else {
AtCmdProcessUnresolvedLine(env);
AtCmdRxClear(env);
continue;
}
}
return AT_TIMEOUT;
}
AtCommandResult AtGsm_ReceiverGnssResetColdstart(
tAtCmd *env
) {
AtCmdPrepare(env);
AtCmdTxClear(env);
AtCmdSendStatic(env, "AT$GPSR=1\r\n");
uint32_t timeout = 1000;
uint32_t endMs = SystemGetMs() + timeout;
uint32_t leftMs = timeout;
while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) {
leftMs = endMs - SystemGetMs();
if (AtCmdRxBeginWithStatic(env, "OK")) {
AtCmdRxClear(env);
return AT_OK;
} else if (AtCmdRxBeginWithStatic(env, "ERROR")) {
AtCmdRxClear(env);
return AT_ERROR;
} else if (AtCmdRxBeginWithStatic(env, "+CME ERROR: ")) {
AtCmdRxClear(env);
return AT_ERROR;
} else {
AtCmdProcessUnresolvedLine(env);
AtCmdRxClear(env);
continue;
}
}
return AT_TIMEOUT;
}
AtCommandResult AtGsm_ReceiverGnssClearBuffer(
tAtCmd *env
) {
AtCmdPrepare(env);
AtCmdTxClear(env);
AtCmdSendStatic(env, "AT$GPSNVRAM=15,0\r\n");
uint32_t timeout = 1000;
uint32_t endMs = SystemGetMs() + timeout;
uint32_t leftMs = timeout;
while ((AtCmdReceiveNextLine(env, leftMs) == AT_OK) && (SystemGetMs() < endMs)) {
leftMs = endMs - SystemGetMs();
if (AtCmdRxBeginWithStatic(env, "OK")) {
AtCmdRxClear(env);
return AT_OK;
} else if (AtCmdRxBeginWithStatic(env, "ERROR")) {
AtCmdRxClear(env);
return AT_ERROR;
} else if (AtCmdRxBeginWithStatic(env, "+CME ERROR: ")) {
AtCmdRxClear(env);
return AT_ERROR;
} else {
AtCmdProcessUnresolvedLine(env);
AtCmdRxClear(env);
continue;
}
}
return AT_TIMEOUT;
}