#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, "=====================================================================") } } }