// // Created by xemon on 09.01.23. // #include "EraGlonassUveos_Private.h" #include #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; }