This commit is contained in:
cfif 2025-06-02 13:26:39 +03:00
commit 8e3d24bf48
3 changed files with 275 additions and 0 deletions

225
SubsystemSwitcher.c Normal file
View File

@ -0,0 +1,225 @@
#include <stdint-gcc.h>
#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,
"=====================================================================")
}
}
}

37
SubsystemSwitcher.h Normal file
View File

@ -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

13
modular.json Normal file
View File

@ -0,0 +1,13 @@
{
"dep": [
],
"cmake": {
"inc_dirs": [
"./"
],
"srcs": [
"./**.c"
]
}
}