commit 8e3d24bf4899b44cd41143c4732c280a54534568 Author: cfif Date: Mon Jun 2 13:26:39 2025 +0300 Init diff --git a/SubsystemSwitcher.c b/SubsystemSwitcher.c new file mode 100644 index 0000000..235c151 --- /dev/null +++ b/SubsystemSwitcher.c @@ -0,0 +1,225 @@ +#include +#include "SystemSelector.h" +#include "ModemDataCollector.h" +#include "SystemDelayInterface.h" +#include "SubsystemSwitcher.h" +#include "ext_telematica.h" +#include "TelematicaConnectStatus.h" + +#define LOG_SIGN "Селектор подсистем основной" +#define LOGGER env->logger + +// +// Created by zemon on 28.08.24. +// + +void SystemSwitcherInit( + tSystemSwitcher *env, + tSystemSelector *systemSelector, + tModemDataColl *modemDataCollector, + tLoggerInterface *logger, + tDeviceStorage *storage, + eUveosDoNothing *uveosDoNothingMode, + eTelematicaIsConnect *telematicaIsConnect, + bool *fl_iniSysIsDone +){ + env->systemSelector = systemSelector; + env->logger = logger; + env->storage = storage; + env->modemDataCollector = modemDataCollector; + env->uveosDoNothingMode = uveosDoNothingMode; + env->telematicaIsConnect = telematicaIsConnect; + env->fl_iniSysIsDone = fl_iniSysIsDone; +} + +void Mma_SystemSelectEra(tSystemSwitcher *env, eSubSystems subSystems) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Инициировано запуск подсистемы УВЭОС") + if (env->storage->runtime.EGTS_FLEET_ON == true) { + uint32_t tm = SystemGetMs() + 4000; + env->storage->runtime.EGTS_FLEET_ON = false; + while (tm > SystemGetMs()) { + if (env->storage->runtime.telematicaCloseConnect == true) { + break; + } + SystemDelayMs(1); + } + } + + LoggerInfoStatic(LOGGER, LOG_SIGN, "Отключение телематической системы выполнено") + eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(env->systemSelector); + if (subSystemsTmp != subSystems) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Инициализировано переключение SIM чипов") + ModemDataCollector_SelectionSimChip(env->systemSelector, CHIP_ERA); + LoggerInfoStatic(LOGGER, LOG_SIGN, "Текущая подсистема установлена УВЭОС") + ModemDataCollector_SetThisSubSystem(env->systemSelector, subSystems); + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Запуск подсистемы УВЭОС не требуется, система в режиме ЭРА") + } +} + +void Mma_SystemSelectTelematica(tSystemSwitcher *env, eSubSystems subSystems) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Инициировано запуск подсистемы ТЕЛЕМАТИКА") + *env->uveosDoNothingMode = UVEOS_DO_NOTHING_DISABLED; + ModemDataCollector_SelectionSimChip(env->systemSelector, CHIP_COMERS); + ModemDataCollector_SetThisSubSystem(env->systemSelector, subSystems); + if (env->storage->runtime.EGTS_FLEET_ON == false) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Запуск телематической системы") + env->storage->runtime.EGTS_FLEET_ON = true; + LoggerInfoStatic(LOGGER, LOG_SIGN, "Телематическая система запущена") + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Запуск телематическая системы не проведён, телематика находится в активном состоянии") + } +} + +void Mma_SelectorOneSystem(tSystemSwitcher *env, eSubSystems subSystems) { + if (subSystems == UNDEFANDET) { + ModemDataCollector_SetThisSubSystem(env->systemSelector, UNDEFANDET); + return; + } + + eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(env->systemSelector); + + if (subSystems == UVEOS) { + if (subSystemsTmp != subSystems) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "ИНИЦИАЛИЗИРОВАНО ПЕРЕКЛЮЧЕНИЕ ПОДСИСТЕМ КОД 1") + if (env->modemDataCollector->modemVersionRevision.valid_CCID == MOD_READY) { + Mma_SystemSelectEra(env, subSystems); + } + if (env->modemDataCollector->modemVersionRevision.valid_CCID == MOD_UNDEFANDED) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Сим чип ЭРА не считан, ожидание ответа чипа 10 сек") + uint32_t tm = SystemGetMs() + 10000; + while (tm > SystemGetMs()) { + if (env->modemDataCollector->modemVersionRevision.valid_CCID == MOD_READY) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Сим чип ЭРА подключен") + Mma_SystemSelectEra(env, subSystems); + return; + } + } + } + if (env->telematicaIsConnect != TELE_ACSESS_DENATED) { + if (env->modemDataCollector->modemVersionRevision.valid_CCID == MOD_ERROR) { + + if (env->systemSelector->timeng < SystemGetMs()) { + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Включение системы УВЭОС не возможно, НЕ ИСПРАВЕН СИМ ЧИП ЭРА") + env->systemSelector->timeng = SystemGetMs() + 10000; + } + + if (!env->storage->nvm->device.factoryMode) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Выполняется запуск подсистемы ТЕЛЕМАТИКА") + Mma_SystemSelectTelematica(env, TELEMATICA); + return; + } else { + Mma_SystemSelectEra(env, subSystems); + ModemDataCollector_SelectionSimChip(env->systemSelector, CHIP_COMERS); + return; + } + + } + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Запуск подсистемы ТЕЛЕМАТИКА запрещён текущей конфигурацией оборудования код 1") + } + } + } else { + if (subSystemsTmp != subSystems) { + if (env->telematicaIsConnect != TELE_ACSESS_DENATED) { + if ((subSystems == TELEMATICA) && (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE)) { + if (env->modemDataCollector->modemVersionRevision.valid_CCIDComer == MOD_READY) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "ИНИЦИАЛИЗИРОВАНО ПЕРЕКЛЮЧЕНИЕ ПОДСИСТЕМ КОД 2") + Mma_SystemSelectTelematica(env, subSystems); + } + if (env->modemDataCollector->modemVersionRevision.valid_CCIDComer == MOD_UNDEFANDED) { + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Коммерческий сим чип не считан, ожидание ответа чипа 10 сек") + uint32_t tm = SystemGetMs() + 10000; + while (tm > SystemGetMs()) { + if (env->modemDataCollector->modemVersionRevision.valid_CCIDComer == MOD_READY) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "ИНИЦИАЛИЗИРОВАНО ПЕРЕКЛЮЧЕНИЕ ПОДСИСТЕМ КОД 3") + LoggerInfoStatic(LOGGER, LOG_SIGN, "Коммерческий сим чип подключен") + Mma_SystemSelectTelematica(env, subSystems); + return; + } + } + } + if (env->modemDataCollector->modemVersionRevision.valid_CCIDComer == MOD_ERROR) { + if (env->modemDataCollector->systemSelector->thisSsubSystem != UVEOS) { + LoggerInfoStatic(LOGGER, LOG_SIGN, "ИНИЦИАЛИЗИРОВАНО ПЕРЕКЛЮЧЕНИЕ ПОДСИСТЕМ КОД 4") + Mma_SystemSelectEra(env, UVEOS); + } else { + return; + } + + LoggerInfoStatic(LOGGER, LOG_SIGN, "Выполнен запуск подсистемы УВЭОС") + if (env->systemSelector->timeng < SystemGetMs()) { + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Включение телематической системы не возможно, НЕ ИСПРАВЕН КОММЕРЧЕСКИЙ СИМ ЧИП") + env->systemSelector->timeng = SystemGetMs() + 10000; + } + } + } + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Запуск подсистемы ТЕЛЕМАТИКА запрещён текущей конфигурацией оборудования код 2") + } + } + SystemDelayMs(500); + } +} + +void SelectSubSys(tSystemSwitcher *env, eSubSystems subSystems) { + if(env->systemSelector->thisSsubSystem != subSystems) { + for (uint8_t i = 0; i < 3; i++) { + Mma_SelectorOneSystem(env, subSystems); + env->modemDataCollector->modemVersionRevision.resIsChipSelect = ModemDataCollector_ChekSelectSimChips(env->modemDataCollector, &subSystems); + if (env->modemDataCollector->modemVersionRevision.resIsChipSelect == true) { + break; + } + } + } + if(env->modemDataCollector->modemVersionRevision.resIsChipSelect == false){ + if(subSystems == TELEMATICA){ + env->modemDataCollector->modemVersionRevision.valid_CCIDComer = MOD_ERROR; + } + if(subSystems == UVEOS){ + env->modemDataCollector->modemVersionRevision.valid_CCID = MOD_ERROR; + } + } +} + +void SystemSelector(tSystemSwitcher *env, eSubSystems subSystems) { + if (*env->fl_iniSysIsDone == true) { + SelectSubSys(env, subSystems); + } else { + volatile bool fl = false; + uint32_t timeWaitInitSystem = SystemGetMs() + 15000; + while (timeWaitInitSystem > SystemGetMs()){ + if (*env->fl_iniSysIsDone == true) { + SelectSubSys(env, subSystems); + fl = true; + break; + } + SystemDelayMs(500); + } + if ((*env->fl_iniSysIsDone == false)&&(fl == false)) { + LoggerTraceStatic(LOGGER, LOG_SIGN, + "=====================================================================") + LoggerTraceStatic(LOGGER, LOG_SIGN, + "=====================================================================") + LoggerTraceStatic(LOGGER, LOG_SIGN, "") + LoggerTraceStatic(LOGGER, LOG_SIGN, "") + LoggerTraceStatic(LOGGER, LOG_SIGN, " ВНИМАНИЕ!") + LoggerTraceStatic(LOGGER, LOG_SIGN, + " БЫЛА ПОПЫТКА ПЕРЕКЛЮЧЕНИЯ РЕЖИМОВ РАБОТЫ (УВЭОС - ТЕЛЕМАТИКА)") + LoggerTraceStatic(LOGGER, LOG_SIGN, + " ДО ТОГО, КАК БЫЛИ ИНИЦИАЛИИЗИРОВАНЫ И ЗАПУЩЕНЫ ВСЕ ДРУГИЕ ПОДСИСТЕМЫ") + LoggerTraceStatic(LOGGER, LOG_SIGN, "") + LoggerTraceStatic(LOGGER, LOG_SIGN, "") + LoggerTraceStatic(LOGGER, LOG_SIGN, + "=====================================================================") + LoggerTraceStatic(LOGGER, LOG_SIGN, + "=====================================================================") + } + } +} \ No newline at end of file diff --git a/SubsystemSwitcher.h b/SubsystemSwitcher.h new file mode 100644 index 0000000..88bb355 --- /dev/null +++ b/SubsystemSwitcher.h @@ -0,0 +1,37 @@ +// +// Created by zemon on 28.08.24. +// + +#ifndef SMART_COMPONENTS_V2_SUBSYSTEMSWITCHER_H +#define SMART_COMPONENTS_V2_SUBSYSTEMSWITCHER_H + +#include "SystemSelector.h" +#include "DeviceStorage.h" +#include "ModemDataCollector.h" +#include "TelematicaConnectStatus.h" + +typedef struct { + tSystemSelector *systemSelector; + tModemDataColl *modemDataCollector; + eUveosDoNothing *uveosDoNothingMode; + tLoggerInterface *logger; + tDeviceStorage *storage; + eTelematicaIsConnect *telematicaIsConnect; + bool *fl_iniSysIsDone; +} tSystemSwitcher; + + +void SystemSwitcherInit( + tSystemSwitcher *env, + tSystemSelector *systemSelector, + tModemDataColl *modemDataCollector, + tLoggerInterface *logger, + tDeviceStorage *storage, + eUveosDoNothing *uveosDoNothingMode, + eTelematicaIsConnect *telematicaIsConnect, + bool *fl_iniSysIsDone +); + +void SystemSelector(tSystemSwitcher *env, eSubSystems subSystems); + +#endif //SMART_COMPONENTS_V2_SUBSYSTEMSWITCHER_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..9589ff8 --- /dev/null +++ b/modular.json @@ -0,0 +1,13 @@ +{ + "dep": [ + + ], + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file