196 lines
6.9 KiB
C
196 lines
6.9 KiB
C
//
|
||
// Created by cfif on 11.04.2024.
|
||
//
|
||
#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();
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
//конец ---------------------------------Обработка команд-------------------------------------------------------
|
||
//конец ---------------------------------Обработка команд-------------------------------------------------------
|
||
//конец ---------------------------------Обработка команд-------------------------------------------------------
|
||
|
||
}
|
||
}
|
||
|
||
|