232 lines
7.6 KiB
C
232 lines
7.6 KiB
C
//
|
||
// Created by cfif on 20.06.2024.
|
||
//
|
||
#include "GsmWithGnss.h"
|
||
#include <AtCmdCommonProtected.h>
|
||
#include "string.h"
|
||
#include "AsciiStringParsingUtils.h"
|
||
#include "Gsm_SockInt.h"
|
||
#include "SystemMutexCmsis.h"
|
||
#include "ext_telematica.h"
|
||
#include "Gsm_SSL_SockInt.h"
|
||
|
||
extern tGsmWithGnss gsmWithGnss;
|
||
|
||
#define LOGGER &env->slog->logger
|
||
#define LOG_SIGN "EGTS_GSM"
|
||
|
||
static void rxGsm(tGsmWithGnss *env, osMessageQueueId_t rxDataQueue) {
|
||
if (AtCmdReceiveNextLine(env->gsmAt, 2000) == AT_OK) {
|
||
if (AtCmdRxBeginWithStatic(env->gsmAt, "+IPD")) {
|
||
uint16_t len = iAsciiStringParseUnsignedLongDecimalNumber(
|
||
env->gsmAt->rxBuffer.data + 4, env->gsmAt->rxBuffer.data + env->gsmAt->rxBuffer.len - 1
|
||
);
|
||
|
||
uint16_t bufferLen = SerialPortReceive(env->gsmAt->io, env->bufLog, len, 2000);
|
||
|
||
memset(env->bufLogHexString, 0, sizeof(env->bufLogHexString));
|
||
size_t lenLog = 0;
|
||
vAsciiStringAddBytesAsHex(env->bufLogHexString, &lenLog, (uint8_t *) env->bufLog, bufferLen);
|
||
LoggerFormatInfo(LOGGER, LOG_SIGN, "FROM (%d): %s", bufferLen, env->bufLogHexString);
|
||
|
||
if (bufferLen == len) {
|
||
for (uint16_t i = 0; i < bufferLen; ++i) {
|
||
osMessageQueuePut(rxDataQueue, &env->bufLog[i], 0x0, 0U);
|
||
}
|
||
} else {
|
||
LoggerFormatInfo(LOGGER, LOG_SIGN, "NO_FROM %d != %d", bufferLen, len);
|
||
}
|
||
|
||
} else {
|
||
LoggerFormatTrace(LOGGER, LOG_SIGN, "Не получен +IPD")
|
||
}
|
||
}
|
||
}
|
||
|
||
static void rxGsmSSL(tGsmWithGnss *env, osMessageQueueId_t rxDataQueue) {
|
||
|
||
uint16_t len = iAsciiStringParseUnsignedLongDecimalNumber(
|
||
env->gsmAt->rxBuffer.data + sizeof("+CCHRECV: DATA,X"),
|
||
env->gsmAt->rxBuffer.data + env->gsmAt->rxBuffer.len - 1
|
||
);
|
||
|
||
|
||
uint16_t bufferLen = SerialPortReceive(env->gsmAt->io, env->bufLog, len, 2000);
|
||
|
||
// memset(env->bufLogHexString, 0, sizeof(env->bufLogHexString));
|
||
// size_t lenLog = 0;
|
||
|
||
// if (bufferLen < 100) {
|
||
// vAsciiStringAddBytesAsHex(env->bufLogHexString, &lenLog, (uint8_t *) env->bufLog, bufferLen);
|
||
// LoggerFormatInfo(LOGGER, LOG_SIGN, "FROM (%d): %s", bufferLen, env->bufLogHexString);
|
||
// } else {
|
||
// vAsciiStringAddBytesAsHex(env->bufLogHexString, &lenLog, (uint8_t *) env->bufLog, 100);
|
||
// LoggerFormatInfo(LOGGER, LOG_SIGN, "FROM CUTE (%d): %s ...", bufferLen, env->bufLogHexString);
|
||
// }
|
||
|
||
if (bufferLen == len) {
|
||
for (uint16_t i = 0; i < bufferLen; ++i) {
|
||
osStatus_t status = osMessageQueuePut(rxDataQueue, &env->bufLog[i], 0x0, 0U);
|
||
|
||
if (status != osOK) {
|
||
LoggerFormatInfo(LOGGER, LOG_SIGN, "Ошибка добавления в очередь %d", status);
|
||
}
|
||
|
||
}
|
||
} else {
|
||
LoggerFormatInfo(LOGGER, LOG_SIGN, "NO_FROM %d != %d", bufferLen, len);
|
||
}
|
||
|
||
}
|
||
|
||
void GsmWithGnssTelematica_Urc(tAtBuffer *buff) {
|
||
|
||
if (AtBufferBeginWithStatic(buff, "+CCH_PEER_CLOSED")) {
|
||
LoggerInfoStatic(&gsmWithGnss.slog->logger, LOG_SIGN, "Обнаружен разрыв соединения")
|
||
gsmWithGnss.isDisconnect = true;
|
||
}
|
||
|
||
if (AtBufferBeginWithStatic(buff, "$GPGGA,")) {
|
||
gsmWithGnss.isNav = true;
|
||
|
||
if (osMutexAcquire(gsmWithGnss.gnssRmcGga.rmcAccess, 2000) == osOK) {
|
||
bNmea0183ParseGGA(buff->data + 7, buff->len - 7, &gsmWithGnss.gnssRmcGga.currentGgaRmc);
|
||
gsmWithGnss.gnssRmcGga.isGGA_Active = true;
|
||
osMutexRelease(gsmWithGnss.gnssRmcGga.rmcAccess);
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
if (AtBufferBeginWithStatic(buff, "$GPRMC,")) {
|
||
|
||
if (osMutexAcquire(gsmWithGnss.gnssRmcGga.rmcAccess, 2000) == osOK) {
|
||
|
||
if (bNmea0183IsRmcString(buff->data, buff->len)) {
|
||
if (bNmea0183IsValidString(buff->data, buff->len)) {
|
||
bNmea0183ParseRMC(buff->data + 7, buff->len - 7, &gsmWithGnss.gnssRmcGga.currentRmc);
|
||
gsmWithGnss.gnssRmcGga.isRMC_Active = true;
|
||
|
||
gsmWithGnss.gnssRmcGga.gsmWithGnssTimeStamp.status = gsmWithGnss.gnssRmcGga.currentRmc.status;
|
||
memcpy(&gsmWithGnss.gnssRmcGga.gsmWithGnssTimeStamp.date, &gsmWithGnss.gnssRmcGga.currentRmc.date,
|
||
sizeof(tNmeaDateRmc));
|
||
memcpy(&gsmWithGnss.gnssRmcGga.gsmWithGnssTimeStamp.time, &gsmWithGnss.gnssRmcGga.currentRmc.time,
|
||
sizeof(tNmeaTimeRmc));
|
||
|
||
}
|
||
}
|
||
|
||
osMutexRelease(gsmWithGnss.gnssRmcGga.rmcAccess);
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
if (AtBufferBeginWithStatic(buff, "+CCHRECV: DATA")) {
|
||
uint8_t linkNum = iAsciiStringParseUnsignedLongDecimalNumber(
|
||
gsmWithGnss.gsmAt->rxBuffer.data + sizeof("+CCHRECV: DATA"),
|
||
gsmWithGnss.gsmAt->rxBuffer.data + sizeof("+CCHRECV: DATA") + 1
|
||
);
|
||
|
||
tGsmSocketSlot *slot = gsmWithGnss.slots + linkNum;
|
||
|
||
if (!GsmSocketSlot_IsClear(slot)) {
|
||
rxGsmSSL(&gsmWithGnss, slot->rxDataQueue);
|
||
return;
|
||
} else {
|
||
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Соединение не создано")
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
if (AtBufferBeginWithStatic(buff, "RECV FROM:")) {
|
||
|
||
for (uint8_t i = 0; i < GSM_SLOTS_COUNT; ++i) {
|
||
tGsmSocketSlot *slot = gsmWithGnss.slots + i;
|
||
if (!GsmSocketSlot_IsClear(slot)) {
|
||
if (memcmp(slot->addr.data, buff->data + sizeof("RECV FROM:") - 1, slot->addr.length) == 0) {
|
||
rxGsm(&gsmWithGnss, slot->rxDataQueue);
|
||
return;
|
||
} else {
|
||
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Не совпадает адрес получателя")
|
||
}
|
||
}
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
}
|
||
|
||
int32_t GnssGgaGetAlt(tGsmWithGnss *env) {
|
||
int32_t Alt = 0;
|
||
|
||
if (osMutexAcquire(env->gnssRmcGga.rmcAccess, 2000) == osOK) {
|
||
Alt = (int32_t) env->gnssRmcGga.currentGgaRmc.altitude;
|
||
osMutexRelease(env->gnssRmcGga.rmcAccess);
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата доступа GnssGgaGetAlt")
|
||
}
|
||
|
||
return Alt;
|
||
}
|
||
|
||
uint8_t GnssGgaGetSat(tGsmWithGnss *env) {
|
||
uint8_t countSats = 0;
|
||
|
||
if (osMutexAcquire(env->gnssRmcGga.rmcAccess, 2000) == osOK) {
|
||
countSats = env->gnssRmcGga.currentGgaRmc.sats;
|
||
osMutexRelease(env->gnssRmcGga.rmcAccess);
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата доступа GnssGgaGetSat")
|
||
}
|
||
|
||
return countSats;
|
||
}
|
||
|
||
|
||
void Gnss_GetFullNavData(tGsmWithGnss *env, tNmeaRmc *nmeaRmc) {
|
||
|
||
if (osMutexAcquire(env->gnssRmcGga.rmcAccess, 2000) == osOK) {
|
||
|
||
memcpy(nmeaRmc, &env->gnssRmcGga.currentRmc, sizeof(tNmeaRmc));
|
||
|
||
osMutexRelease(env->gnssRmcGga.rmcAccess);
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата доступа Gnss_GetFullNavData")
|
||
}
|
||
|
||
}
|
||
|
||
/*
|
||
void Gnss_GetFullNavData(tGsmWithGnss *env, tNmeaRmc *nmeaRmc) {
|
||
|
||
if (osMutexAcquire(EXT_ENV_TELE.gnss.rmcAccess, 2000) == osOK) {
|
||
|
||
memcpy(nmeaRmc, EXT_ENV_TELE.gnss.currentRmc, sizeof(tNmeaRmc));
|
||
|
||
osMutexRelease(EXT_ENV_TELE.gnss.rmcAccess);
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка доступа (Gnss_GetFullNavData)")
|
||
}
|
||
|
||
}
|
||
*/
|
||
|
||
|
||
void GsmWithGnssInit(tGsmWithGnss *env) {
|
||
|
||
env->slog = EXT_ENV_TELE.loggerToSerialPort;
|
||
env->gsmAt = EXT_ENV_TELE.gsmAt;
|
||
env->Rtc = EXT_ENV_TELE.rtcIO;
|
||
|
||
env->gnssRmcGga.isRMC_Active = true;
|
||
env->gnssRmcGga.isGGA_Active = true;
|
||
|
||
env->gnssRmcGga.rmcAccess = osMutexNew(NULL);
|
||
|
||
Gsm_SSL_InitSocket(env,1024*12);
|
||
Gsm_InitIO(env);
|
||
} |