// // Created by cfif on 11.04.2024. // #ifdef UVEOS_ADD_TELEMATICA #include "EgtsInputCommands.h" #include "EgtsOutputCommands.h" #include "Rtc.h" #include "string.h" #include "SystemDelayInterface.h" #include "n32g45x.h" #define LOG_SIGN "EGTS_COM" #define LOGGER &env->slog->logger egtsAurusCommandResult egtsAurusSetTimestamp(tEgtsProcessing *env) { time_t timestamp = *((uint32_t *) env->egtsCommandSent.data); LoggerFormatInfo(LOGGER, LOG_SIGN, "Получена временная метка (1681246800): %u", timestamp) timestamp = timestamp + 1681246800 + 3600 * 3; RtcSet(env->rtc, ×tamp); //1681246800 if (env->egtsCommandSent.dataSize >= 5) { uint8_t isRunTelematica = env->egtsCommandSent.data[4]; LoggerFormatInfo(LOGGER, LOG_SIGN, "Получен статус удаленного включения (не перманентного) телематики: %u", isRunTelematica) if (isRunTelematica) { return EGTS_AURUS_COMMAND_RESULT_TIMESTAMP_TELE_RUN_OK; } } else { env->store->runtime.telematicaWaitConnect = true; } return EGTS_AURUS_COMMAND_RESULT_TIMESTAMP_TELE_STOP_OK; } egtsAurusCommandResult egtsAurusGetReport(tEgtsProcessing *env) { uint16_t command = *((uint16_t *) (env->egtsCommandSent.data + 2)); uint16_t block = *((uint16_t *) env->egtsCommandSent.data); bool isResponseCommand = false; if (command == 101) { LoggerFormatInfo(LOGGER, LOG_SIGN, "Получена команда сброса ошибок, код команды: %u, код блока: %u", command, block) isResponseCommand = true; } if (command == 102) { LoggerFormatInfo(LOGGER, LOG_SIGN, "Получена команда обновления отчета, код команды: %u, код блока: %u", command, block) isResponseCommand = true; } if (!isResponseCommand) { LoggerFormatInfo(LOGGER, LOG_SIGN, "Получена команда, код команды: %u, код блока: %u", command, block) } return EGTS_AURUS_COMMAND_RESULT_OK; } egtsAurusCommandResult egtsAurusSetRestart(tEgtsProcessing *env) { LoggerInfoStatic(LOGGER, LOG_SIGN, "Получена команда перезагрузки устройства") return EGTS_AURUS_COMMAND_RESULT_RESTART_OK; } egtsAurusCommandResult egtsAurusAnalizCommands(tEgtsProcessing *env) { env->egtsCommandSent.commandConfirmationType = CC_OK; if (env->egtsCommandSent.cmd == EGTS_SET_TIME) { return egtsAurusSetTimestamp(env); } if (env->egtsCommandSent.cmd == EGTS_SET_PERMANENT_TELEMATICA) { } // if (env->egtsCommandSent.cmd == EGTS_GET_REPORT) { // return egtsAurusGetReport(env); // } if (env->egtsCommandSent.cmd == EGTS_SET_RESTART) { return egtsAurusSetRestart(env); } env->egtsCommandSent.commandConfirmationType = CC_ILL; return EGTS_AURUS_COMMAND_RESULT_UNKNOWN; } void addCommandQueue(tEgtsProcessing *env, tEgtsCommand *egtsCommand) { osStatus_t status = osMessageQueuePut(env->egtsCommandConfirmationAdditionalData.queue, egtsCommand, 0x0, 0U); if (status != osOK) { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка добавления в очередь addCommandQueue") } } bool extractCommandQueue(tEgtsProcessing *env, tEgtsCommand *egtsCommandSent, uint32_t timeout) { osStatus_t status = osMessageQueueGet(env->egtsCommandConfirmationAdditionalData.queue, egtsCommandSent, 0, timeout); if ((status != osOK) && (status != osErrorTimeout)) { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка извлечения из очереди extractCommandQueue") } if (status == osOK) { return true; } return false; } _Noreturn void EgtsProcessing_TransmitterTaskInputCommand(tEgtsProcessing *env) { bool oneOn = true; bool oneOff = true; for (;;) { if (onOffTelematica(env, &oneOn, &oneOff, "Задача обработки команд")) continue; //начало ---------------------------------Обработка команд------------------------------------------------------ //начало ---------------------------------Обработка команд------------------------------------------------------ //начало ---------------------------------Обработка команд------------------------------------------------------ if (!isAuth(env)) { // LoggerInfoStatic(LOGGER, LOG_SIGN, "Ожидание аутентификации на сервере") SystemDelayMs(1000); continue; } if (extractCommandQueue(env, &env->egtsCommandSent, 1000)) { egtsAurusCommandResult resultCom = egtsAurusAnalizCommands(env); if (env->egtsCommandSent.commandConfirmationType == CC_ILL) { LoggerFormatInfo(LOGGER, LOG_SIGN, "Получен неизвестный код команды: %d", env->egtsCommandSent.cmd); } EgtsProcessing_SendCommandConfirmation(env, CT_COMCONF, env->egtsCommandSent.commandConfirmationType, env->egtsCommandSent.cmdId, 0, 0, 0, 0, env->egtsCommandSent.cmd, env->egtsCommandSent.data, env->egtsCommandSent.dataSize); if (resultCom == EGTS_AURUS_COMMAND_RESULT_ERROR) { env->egtsIdentityAdditionalData.isReceivedResultCode = false; LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Принудительный разрыв соединения с сервером, ИД: %d", env->socketId); EgtsProcessingCloseConnection(env); } if (resultCom == EGTS_AURUS_COMMAND_RESULT_RESTART_OK) { SystemDelayMs(1000); NVIC_SystemReset(); } } //конец ---------------------------------Обработка команд------------------------------------------------------- //конец ---------------------------------Обработка команд------------------------------------------------------- //конец ---------------------------------Обработка команд------------------------------------------------------- } } #endif