198 lines
10 KiB
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;
|
|
} |