EraGlonassUveos/Src/EraGlonassUveos_Egts.c

198 lines
10 KiB
C

//
// Created by xemon on 09.01.23.
//
#include "EraGlonassUveos_Private.h"
#include <egtsWorker.h>
#define LOGGER env->logger
#define LOG_SIGN "УВЭОС,ЕГТС"
static void EraGlonassUveos_EgtsMsdReq(tEraGlonassUveos *env) {
uint32_t noSendMsdCount = EraGlonassMsdTable_GetCount(env->msdTable);
tEraGlonassMsdTableItem *item = NULL;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поиск МНД доступных для переотправки")
if(noSendMsdCount > 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Доступный МНД присутствует, поиск крайних...")
for (uint32_t id = 0; id < EraGlonassMsdTable_GetSize(); ++id) {
if (env->msdTable->items[id].msd.MSD_Data.timestamp > item->msd.MSD_Data.timestamp) {
item = &env->msdTable->items[id];
}
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Крайний МНД найден")
}
if ( item != NULL) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переотправка МНД")
env->currentMsd = item;
env->currentMsd->msd.MSD_Data.msgId++;
EraGlonassUveos_UpdateCurrentSettingsMsd(env, NOT_CHANGE_TIME);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Установка флагов МНД...")
EraGlonassMsdSetDataEmergencySituationFlags(&env->currentMsd->msd, env->currentMsd->msd.MSD_Data.msgId, MANUAL_ACTIVATION,
EMERGENCY_CALL);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переотправка МНД...")
EraGlonassUveos_ResentMsdTry(env, env->currentMsd);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Генерация нового МНД...")
EraGlonassUveos_GenCurrentMsd(env, MANUAL_ACTIVATION, EMERGENCY_CALL, RTC_TIME_SOURSE);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Установка флагов МНД...")
EraGlonassMsdSetDataEmergencySituationFlags(&env->currentMsd->msd, env->currentMsd->msd.MSD_Data.msgId, AUTOMATIC_ACTIVATION,
EMERGENCY_CALL);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Получение сгенерированного МНД...")
env->currentMsd = EraGlonassMsdTable_GetNextFree(env->msdTable);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отправка МНД...")
EraGlonassUveos_ResentMsdTry(env, env->currentMsd);
}
EraGlonassUveosDumper_ForceDump(env->dumper);
SystemDelayMs(500);
}
void EraGlonassUveos_setNewNumber(tEraGlonassUveos *env, uint16_t target, char *number, uint8_t lenghtNum) {
SystemDelayMs(500);
switch (target) {
case EGTS_ECALL_TEST_NUMBER:
env->settings->ECALL_TEST_NUMBER.length = lenghtNum;
memcpy(&env->settings->ECALL_TEST_NUMBER.data, number, lenghtNum);
EraGlonassUveosDumper_ForceDump(env->dumper);
SystemDelayMs(1000);
break;
case EGTS_ECALL_SMS_FALLBACK_NUMBER:
env->settings->ECALL_SMS_FALLBACK_NUMBER.length = lenghtNum;
memcpy(&env->settings->ECALL_SMS_FALLBACK_NUMBER.data, number, lenghtNum);
EraGlonassUveosDumper_ForceDump(env->dumper);
SystemDelayMs(1000);
break;
default:
break;
}
}
bool EraGlonassUveos_ProcessEgtsPacket(tEraGlonassUveos *env, uint8_t *binaryData, uint16_t dataSize) {
char egtsHexStr[dataSize * 2];
size_t egtsHexStrLen = 0;
vAsciiStringAddBytesAsHex(egtsHexStr, &egtsHexStrLen, binaryData, dataSize);
LoggerInfoStatic(LOGGER, LOG_SIGN, "EGTS PACK")
LoggerInfo(LOGGER, LOG_SIGN, egtsHexStr, egtsHexStrLen);
EgtsWorkerEnvironment egtsWorkerEnv;
memset(&egtsWorkerEnv.subRecMemAlloc, 0, sizeof(EgtsSubRecMemAlloc));
egtsWorkerEnv.workingBufferLength = dataSize;
egtsWorkerEnv.workingBuffer = binaryData;
if (EgtsIsTransportComplete(&egtsWorkerEnv)) {
EgtsParseHeader(&egtsWorkerEnv);
EgtsParseFrameData(&egtsWorkerEnv);
EgtsParseSrvRecord(&egtsWorkerEnv);
if (egtsWorkerEnv.srCommand) {
switch (egtsWorkerEnv.srCommand->cmd) {
case EGTS_ECALL_MSD_REQ:
LoggerInfoStatic(LOGGER, LOG_SIGN, "Получен запрос на повторную отправку МНД по средствам SMS сообщения")
EraGlonassUveos_EgtsMsdReq(env);
return true;
case EGTS_ECALL_REQ:
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отправка подтверждения на запрос эксренного вызова")
EraGlonassUveos_EgtsSmsConfirmation(env,
egtsWorkerEnv.srCommand->cmdType,
egtsWorkerEnv.srCommand->cmdConfirmationType,
egtsWorkerEnv.srCommand->cmdId,
egtsWorkerEnv.srCommand->srcId,
egtsWorkerEnv.srCommand->address,
egtsWorkerEnv.srCommand->size,
egtsWorkerEnv.srCommand->act,
EGTS_TEST_MODE
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Запрос эксренного вызова")
env->currentMsd->msd.MSD_Data.msgId++;
if (egtsWorkerEnv.srCommand->data.ecallReq.reqType == EGTS_ECALL_REQ_MANUAL) {
EraGlonassUveos_ManualEmergencyCall(env, false);
} else {
tUveosEmergencyEvent event = {.isImpact = true, .impactValue=0.0f};
EraGlonassUveos_ProcessingEmergencyEvent(env, &event);
}
return true;
case EGTS_ECALL_TEST_NUMBER:
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Получена команда на установку номера для тестового вызова "
"(EGTS_ECALL_TEST_NUMBER)")
EraGlonassUveos_EgtsSmsConfirmation(env,
egtsWorkerEnv.srCommand->cmdType,
egtsWorkerEnv.srCommand->cmdConfirmationType,
egtsWorkerEnv.srCommand->cmdId,
egtsWorkerEnv.srCommand->srcId,
egtsWorkerEnv.srCommand->address,
egtsWorkerEnv.srCommand->size,
egtsWorkerEnv.srCommand->act,
EGTS_TEST_MODE
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отправлено подтверждения на запрос установки номера для"
" тестового вызова")
SystemDelayMs(2000);
EraGlonassUveos_setNewNumber(
env,
EGTS_ECALL_TEST_NUMBER,
egtsWorkerEnv.srCommand->data.newFallbackNumber.data,
egtsWorkerEnv.srCommand->data.newFallbackNumber.length
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Установлен новый номер для тестового вызова")
LoggerInfo(
LOGGER,
LOG_SIGN,
egtsWorkerEnv.srCommand->data.newFallbackNumber.data,
egtsWorkerEnv.srCommand->data.newFallbackNumber.length
)
return true;
case EGTS_ECALL_SMS_FALLBACK_NUMBER:
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Получена команда на на установку номера для SMS (EGTS_ECALL_SMS_FALLBACK_NUMBER)")
EraGlonassUveos_EgtsSmsConfirmation(env,
egtsWorkerEnv.srCommand->cmdType,
egtsWorkerEnv.srCommand->cmdConfirmationType,
egtsWorkerEnv.srCommand->cmdId,
egtsWorkerEnv.srCommand->srcId,
egtsWorkerEnv.srCommand->address,
egtsWorkerEnv.srCommand->size,
egtsWorkerEnv.srCommand->act,
EGTS_TEST_MODE
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отправлено подтверждение на запрос установки номера для SMS")
SystemDelayMs(2000);
EraGlonassUveos_setNewNumber(
env,
EGTS_ECALL_SMS_FALLBACK_NUMBER,
egtsWorkerEnv.srCommand->data.newFallbackNumber.data,
egtsWorkerEnv.srCommand->data.newFallbackNumber.length
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Установлен новый номер для SMS")
LoggerInfo(
LOGGER,
LOG_SIGN,
egtsWorkerEnv.srCommand->data.newFallbackNumber.data,
egtsWorkerEnv.srCommand->data.newFallbackNumber.length
)
return true;
}
}
}
return false;
}