SMART_COMPONENTS_MainModesA.../MainModesArbiter.c

1634 lines
70 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// flash sector
// uint8_t packet[] = "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
// env->signature.atCmd = &env->gsmWithGnss.gsmAt;
// env->signature.slog = &env->slog;
//// while (1){
// EraTSK_GetPackSignature(&env->signature,packet,sizeof(packet));
// SystemDelayMs(10);
// // SystemDelayMs(1);
//// }
// return;
//
// Created by xemon on 19.09.22.
//
//+79419776358
// +79418100029
#include "MainModesArbiter_Private.h"
#include "BootJump.h"
#include "DeviceTesting_TestsWithUser.h"
#include "AtGsmOpenAudioLoop.h"
#include "egts.h"
#include "AsciiStringAssmeblingUtils.h"
#include "AtGsmSms_DeleteAll.h"
#include "DeviceTesting.h"
#include "stream.h"
//#include "PointEvent.h"
#include "DeviceTesting_TestingMethods.h"
#include "Accel.h"
#define LOG_SIGN "Главн."
#define LOGGER &env->slog.logger
size_t str_len = 0;
char step[5] = {0};
void Mma_Init(
tMma *env,
tGpios *gpios,
tSerialPorts *serialPorts,
tI2cPorts *i2cPorts,
tSpiPorts *spiPorts,
tAdcs *adcs,
tStorageOnFlash *flash,
tRtcs *rtc,
tCanPorts *canPorts
) {
env->accel = &ACCEL;
env->gpios = gpios;
env->serialPorts = serialPorts;
env->i2cPorts = i2cPorts;
env->spiPorts = spiPorts;
env->canPorts = canPorts;
env->adcs = adcs;
env->flash = flash;
env->rtc = rtc;
InitThreadAtrStatic(&env->thread.attr, "Mma", env->thread.controlBlock, env->thread.stack, osPriorityNormal);
env->thread.id = 0;
env->lastSmsCheckTime = SystemGetMs() + 8000;
env->flIgn = false;
env->userInputSubstart = 0;
env->mux_factoryMode = osMutexNew(NULL);
env->tmt = SystemGetMs() + 5000;
env->tm_FactoryMessage = SystemGetMs() + 5000;
env->fl_iniSysIsDone = false;
env->checNetDeGeg = false;
env->eolAcsess = false;
env->fl_isFacrotyMode = false;
env->telematicaIsConnect = TELE_ACSESS_TEMPORARY;
}
/*
void Mma_SetAccessProtection(){
flash_status_type status = FLASH_OPERATE_DONE;
if(flash_fap_status_get() == RESET) {
flash_unlock();
status = flash_operation_wait_for(OPERATION_TIMEOUT);
if (status != FLASH_OPERATE_TIMEOUT) {
if ((status == FLASH_PROGRAM_ERROR) || (status == FLASH_EPP_ERROR))
flash_flag_clear(FLASH_PRGMERR_FLAG | FLASH_EPPERR_FLAG);
status = flash_fap_enable(TRUE);
if (status == FLASH_OPERATE_DONE){
//nvic_system_reset();
}
flash_lock();
}
flash_lock();
}
}
*/
static _Noreturn void Mma_AccompanModeThread(tMma *env) {
while (1) {
Mma_AccompanMode(env);
SystemDelayMs(40);
}
}
void AccompanModeStartThread(tMma *env) {
if (!env->threadAccompanMode.id) {
env->threadAccompanMode.id = osThreadNew(
(osThreadFunc_t) (Mma_AccompanModeThread),
(void *) (env),
&env->threadAccompanMode.attr
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сопроводительный поток запущен")
}
}
void AccompanModeStopThread(tMma *env) {
if (env->threadAccompanMode.id != NULL) {
if (osThreadTerminate(env->threadAccompanMode.id) == osOK) {
SystemDelayMs(100);
env->threadAccompanMode.id = NULL;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сопроводительный поток остановлен")
SystemDelayMs(500);
}
}
}
// не трогать дэлэи !!!
void Mma_AudioSubSystemStart(tPowerManagement *power, tAmplifier *amplifier) {
Pwm_SetMuteInCar(power, true);
SystemDelayMs(100);
Mma_AudioTestSetMode(power, false);
SystemDelayMs(200);
Pwm_AmpOn(power);
SystemDelayMs(800);
Amplifier_StartUp(amplifier);
SystemDelayMs(1600);
}
/*
void Mma_ShortShutdown(tMma *env) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
EXT_ENV_ADR_TELE.tele_func(env, TELE_MODULE_SHUTDOWN);
}
Pwm_GsmAndGnssShutDown(&env->power);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Завершение работы")
VarsTabDumpObserver_Flush(&env->storage.dumpObserver);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отключение питания через 4 с")
SystemDelayMs(4000);
Pwm_Blackout(&env->power);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Питание осталось, обратите внимание!!")
LoggerInfoStatic(LOGGER, LOG_SIGN, "Возможно произошло повторное включение пользователем")
env->eolAcsess = false;
SystemDelayMs(500);
nvic_system_reset();
//BootJumpToAddress(0x8000000);
LoggerErrorStatic(LOGGER, LOG_SIGN, "Этой строчки не должно быть! Критическая ошибка!")
}
*/
void Mma_Shutdown(tMma *env) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
EXT_ENV_ADR_TELE.tele_func(env, TELE_MODULE_SHUTDOWN);
}
Pwm_GsmAndGnssShutDown(&env->power);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Завершение работы")
VarsTabDumpObserver_Flush(&env->storage.dumpObserver);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отключение питания через 4 с")
SystemDelayMs(4000);
Pwm_Blackout(&env->power);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Питание осталось, обратите внимание!!")
LoggerInfoStatic(LOGGER, LOG_SIGN, "Возможно произошло повторное включение пользователем")
env->eolAcsess = false;
SystemDelayMs(500);
nvic_system_reset();
//BootJumpToAddress(0x8000000);
LoggerErrorStatic(LOGGER, LOG_SIGN, "Этой строчки не должно быть! Критическая ошибка!")
}
void Mma_CheckShutdownIsBattary(tMma *env) {
bool statShutdown = Pwm_IsShutdownRequired(&env->power);
if ((env->indication.mode != DEVICE_MODE_TESTING) && (env->indication.mode != DEVICE_MODE_UVEOS_GARAG)) {
if (statShutdown) {
uint16_t single;
float volt;
single = env->power.powerSusystem->battery.currentBatVoltage;
volt = (float) single / 1000;
if (volt < 2.0) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "===================================================")
LoggerTraceStatic(LOGGER, LOG_SIGN, "ОТКЛЮЧЕНИЕ УСТРОЙСТВА ПО ДОСТИЖЕНИЮ КРИТИЧЕСКИ НИЗКОГО")
LoggerTraceStatic(LOGGER, LOG_SIGN, " УРОВНЯ ЗАРЯДА РЕЗЕРВНОГО ИСТОЧНИКА ПИТАНИЯ")
LoggerTraceStatic(LOGGER, LOG_SIGN, "===================================================")
Mma_Shutdown(env);
}
}
}
}
void Mma_AudioTestSetMode(tPowerManagement *env, bool fl) {
env->powerSusystem->SpekTestPower.speakTestAcsess = fl;
}
void Mma_CheckShutdown(tMma *env) {
if (env->fl_iniSysIsDone == false) {
return;
}
bool statIgnition = Pwm_IsShutdownRequired(&env->power); // ignition
bool statIsNetwork = EraGlonassUveos_IsStandby(&env->uveos); // timings.requireNetwork
bool statStandFulPower = EraGlonassUveos_IsAllowInCall(&env->uveos); // timings.allowInCall
bool statTestTimer = EraGlonassUveos_IsStandbyTestTimer(&env->uveos);
if ((statIsNetwork && statTestTimer) && (statStandFulPower) && (!statIgnition)) {
SystemSelector(&env->systemSwitcher, UVEOS);
}
if ((statIgnition) && (!statIsNetwork) && (!statStandFulPower)) {
Mma_Shutdown(env);
}
Mma_CheckShutdownIsBattary(env);
}
void Mma_SetNetworkRegistration(tMma *env, bool value) {
if (value == true) {
if (env->gsmWithGnss.isRegToGSM == false) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Инициализирована автоматическая регистрация из сети наземной связи")
if (GsmWithGnss_NetworkSetStateInnaterups(&env->gsmWithGnss, 4, 4000) == AT_ERROR) {
env->tmpTm = SystemGetMs() + 10000;
while (
(GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 1500) == false) &&
(env->tmpTm > SystemGetMs())
) {
SystemDelayMs(1000);
}
} else {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Регистрация в сети присутствует, код 4")
}
}
} else {
if (env->gsmWithGnss.isRegToGSM == true) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Инициализирована автоматическая деригистрация из сети наземной связи")
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsm_OperatorSelectionDeregister(&env->gsmWithGnss.gsmAt);
SystemDelayMs(1000);
AtGsm_OperatorSelectionDeregister(&env->gsmWithGnss.gsmAt);
osMutexRelease(env->gsmWithGnss.gsmAt.access);
}
if (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 1500) == true) {
env->tmpTm = SystemGetMs() + 10000;
while (
(GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 1500) == true) &&
(env->tmpTm > SystemGetMs())
) {
SystemDelayMs(1000);
}
} else {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Деригистрация в сети выполнена, код 4")
}
}
}
}
void Mma_CanProcRunTests(tMma *env) {
tDeviceModes indicationState = env->indication.mode;
// eSubSystems eSubSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
if (env->queryUDSState.source != SPEAK_MICR_TEST) {
SystemSelector(&env->systemSwitcher, UVEOS);
}
Mma_RunUserTests(env, true);
env->indication.mode = indicationState;
Mma_SetMode(env, indicationState);
}
tDeviceModes *UserIndication_GetMode(tMma *env) {
return &env->indication.mode;
}
void Mma_GarageMode(tMma *env) {
AccompanModeStopThread(env);
Mma_AudioSubSystemStart(&env->power, &env->amplifier);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим Гараж")
GpioPinEnable(&env->power.powerSusystem->main.garage);
SystemDelayMs(40);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "servise_mode.mp3", 4 * 1000);
Mma_AudioSubSystemRelease(env);
env->storage.nvm->device.serviseMode = true;
DeviceStorage_ForceDump(&env->storage);
EraGlonassUveos_GarageStarted(&env->uveos);
tUserInputButtonEvent buttonEvent = {0};
while (1) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Режим Гараж")
if (DeviceTesting_Periodical(&env->testing)) {
Mma_SetMode(env, DEVICE_MODE_FAILURE);
} else {
Mma_SetMode(env, DEVICE_MODE_UVEOS_GARAG);
}
if (env->storage.runtime.enableGnssUpdate) {
EraGlonassUveos_DoNothingModeDistance(&env->uveos, true);
}
if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_DISABLED) {
Mma_SetMode(env, DEVICE_MODE_UVEOS_UNDEFINDET);
AccompanModeStartThread(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Автоматический выход из режима Гараж")
GpioPinDisable(&env->power.powerSusystem->main.garage);
env->storage.nvm->device.serviseMode = false;
DeviceStorage_ForceDump(&env->storage);
EraGlonassUveos_DoNotingReset(&env->uveos);
Mma_AudioSubSystemRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4 * 1000);
Mma_AudioSubSystemRelease(env);
uint32_t tm = SystemGetMs() + 1000;
while (tm < SystemGetMs()) {}
return;
}
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIsBetween(buttonEvent, UI_VIRT_BUTTON_ADDITIONAL, RAISE, SERVICE_MODE_MIN, SERVICE_MODE_MAX)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пользовательский выход из режима Гараж")
Mma_SetMode(env, DEVICE_MODE_UVEOS_UNDEFINDET);
AccompanModeStartThread(env);
GpioPinDisable(&env->power.powerSusystem->main.garage);
env->storage.nvm->device.serviseMode = false;
DeviceStorage_ForceDump(&env->storage);
EraGlonassUveos_DoNotingReset(&env->uveos);
Mma_AudioSubSystemRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4 * 1000);
uint32_t tm = SystemGetMs() + 1000;
while (tm < SystemGetMs()) {}
Mma_AudioSubSystemRelease(env);
return;
}
}
Mma_CheckShutdown(env);
SystemDelayMs(500);
}
}
void Mma_SubstartTelematica(tMma *env) {
env->uveos.doNothing.mode = UVEOS_DO_NOTHING_DISABLED;
bool statIgnition = Pwm_IsShutdownRequired(&env->power); // ignition
bool statIsNetwork = EraGlonassUveos_IsStandby(&env->uveos); // timings.requireNetwork
bool statStandFulPower = EraGlonassUveos_IsAllowInCall(&env->uveos); // timings.allowInCall
bool statTestTimer = EraGlonassUveos_IsStandbyTestTimer(&env->uveos);
if (env->fl_iniSysIsDone == true) {
if ((!statIsNetwork && !statTestTimer) && (!statStandFulPower) && (!statIgnition)) {
if ((env->telematicaIsConnect == TELE_ACSESS_LOCAL) || (env->telematicaIsConnect == TELE_ACSESS_SERVER)) {
SystemSelector(&env->systemSwitcher, TELEMATICA);
}
if (env->telematicaIsConnect == TELE_ACSESS_TEMPORARY) {
SystemSelector(&env->systemSwitcher, TELEMATICA);
}
if (env->storage.nvm->device.telematicaIsActive) {
env->telematicaIsConnect = TELE_ACSESS_LOCAL;
}
if (env->storage.runtime.telematicaServerIsActive) {
env->telematicaIsConnect = TELE_ACSESS_SERVER;
}
if (env->telematicaIsConnect == TELE_ACSESS_DENATED) {
SystemSelector(&env->systemSwitcher, UVEOS);
}
} else {
SystemSelector(&env->systemSwitcher, UVEOS);
}
if (
(env->storage.runtime.telematicaWaitConnect == true) &&
(env->storage.nvm->device.telematicaIsActive == false) &&
(env->storage.runtime.telematicaServerIsActive == false)
) {
env->telematicaIsConnect = TELE_ACSESS_DENATED;
}
}
}
bool flSubSys = false;
bool flCrashDetectionStat = false;
uint32_t tmt = 0;
void Mma_AccompanMode(tMma *env) {
if (env->eolAcsess == true) {
Mma_ClearParams(env);
DeviceStorage_ForceDump(&env->storage);
Mma_Shutdown(env);
}
if ((env->threadSubstartChekButton.id == NULL) && (flSubSys == false)) {
Mma_UserInputSubstartButtonThreadStart(env);
flSubSys = true;
}
if (!env->storage.nvm->device.factoryMode) {
if ((*env->comInt.Amplifier.playMode == true)&&(env->ModemDataCollector.fl_IsLoad == true)) {
Mma_AudioSubSystemRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
*env->comInt.Amplifier.playMode = false;
Mma_AudioSubSystemRelease(env);
}
if (env->comInt.TestButton.run == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование из сервисного ПО")
env->testing.audioHintsMode = HINTS_NORMAL;
Mma_RunShortTest(env, true);
env->testing.audioHintsMode = HINTS_FULL;
env->comInt.TestButton.run = false;
}
if (env->crashDetect.carCrashDetection.isStarted == false) {
if (Mma_StartCrachDetectSubsystem(env) == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Подсистема Crash Detect запущена, запуск инициализирован из сопроводительно потока")
} else {
if(tmt < SystemGetMs()) {
tmt = SystemGetMs()+10000;
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Опорные данные для работы акселерометра не установлены, повторная попытка запуска Crash Detect")
}
}
} else {
if (flCrashDetectionStat == false) {
flCrashDetectionStat = true;
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Запуск Crash Detect не требуется, подсистема уже запущена")
}
}
tDeviceModes *deviceModes = UserIndication_GetMode(env);
if (DeviceTesting_Always(&env->testing)) {
if ((*deviceModes != DEVICE_MODE_TESTING) &&
(*deviceModes != DEVICE_MODE_UVEOS_PASSIVE)
) {
*deviceModes = DEVICE_MODE_FAILURE;
}
} else {
if (env->fl_iniSysIsDone == true) {
if ((*deviceModes != DEVICE_MODE_TESTING) &&
(*deviceModes != DEVICE_MODE_UVEOS_PASSIVE)&&
(*deviceModes != DEVICE_MODE_UVEOS_GARAG)
){
*deviceModes = DEVICE_MODE_UVEOS_UNDEFINDET;
}
}
}
if (*deviceModes != DEVICE_MODE_FAILURE) {
if (DeviceTesting_Periodical(&env->testing)) {
if ((*deviceModes != DEVICE_MODE_TESTING) && (*deviceModes != DEVICE_MODE_UVEOS_PASSIVE)) {
*deviceModes = DEVICE_MODE_FAILURE;
}
} else {
if ((*deviceModes != DEVICE_MODE_TESTING) &&
(*deviceModes != DEVICE_MODE_UVEOS_PASSIVE)&&
(*deviceModes != DEVICE_MODE_UVEOS_GARAG)
) {
*deviceModes = DEVICE_MODE_UVEOS_UNDEFINDET;
}
}
}
if ((env->fl_iniSysIsDone) &&
(*deviceModes != DEVICE_MODE_TESTING) &&
(*deviceModes != DEVICE_MODE_UVEOS_PASSIVE) &&
(*deviceModes != DEVICE_MODE_UVEOS_GARAG)
)
{
Mma_SetMode(env, *deviceModes);
Mma_gnssUpdateIndication(env);
}
SystemDelayMs(500);
return;
}
///=============================================================================================
// раскерпичиватель модема
if (env->storage.nvm->device.factoryMode) {
if (DeviceTestsTable_MakeTest(env->testing.namedTests.vin) == DEVICE_TESTING_CODE_PASSED) {
env->storage.nvm->device.factoryMode = false;
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
uint32_t tmtt = SystemGetMs() + 4000;
while (tmtt > SystemGetMs()) {
SystemDelayMs(40);
}
}
}
env->playMode = true;
if (
(env->storage.nvm->device.factoryMode) &&
(osMutexAcquire(env->mux_factoryMode, 5000))
) {
tDeviceModes *deviceModes;
DeviceTesting_SetTelematicaTestMode(&env->testing, true);
Mma_UserInputSubstartButtonThreadStop(env);
#ifdef FIRMWARE_TEST
if ((env->playMode == true) && (env->ModemDataCollector.fl_IsLoad == true)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим производственного контроля")
env->playMode = false;
}
#else
if ((env->playMode == true) && (env->ModemDataCollector.fl_IsLoad == true)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим производственного контроля")
SystemDelayMs(1000);
Mma_AudioSubSystemRequire(env);
SystemDelayMs(1000);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
env->playMode = false;
Mma_AudioSubSystemRelease(env);
}
#endif
bool fl_triger = true;
while (1) {
SystemSelector(&env->systemSwitcher, TELEMATICA);
if (env->tm_FactoryMessage < SystemGetMs()) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Режим производственного контроля")
env->tm_FactoryMessage = SystemGetMs() + 15000;
}
deviceModes = UserIndication_GetMode(env);
if (!env->storage.nvm->device.factoryMode) {
osMutexRelease(env->mux_factoryMode);
return;
}
#ifdef FIRMWARE_TEST
if ((env->playMode == true) && (env->ModemDataCollector.fl_IsLoad == true)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим производственного контроля")
env->playMode = false;
}
#else
if ((env->playMode == true) && (env->ModemDataCollector.fl_IsLoad == true)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим производственного контроля")
SystemDelayMs(1000);
Mma_AudioSubSystemRequire(env);
SystemDelayMs(1000);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
env->playMode = false;
Mma_AudioSubSystemRelease(env);
}
#endif
if ((*env->comInt.Amplifier.playMode == true)&&(env->ModemDataCollector.fl_IsLoad == true)) {
Mma_AudioSubSystemRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
*env->comInt.Amplifier.playMode = false;
Mma_AudioSubSystemRelease(env);
}
if (env->comInt.TestButton.run == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование из сервисного ПО")
env->testing.audioHintsMode = HINTS_NORMAL;
Mma_RunShortTest(env, true);
env->testing.audioHintsMode = HINTS_FULL;
env->comInt.TestButton.run = false;
}
if (fl_triger == true) {
SystemSelector(&env->systemSwitcher, TELEMATICA);
fl_triger = false;
}
if (DeviceTesting_Always(&env->testing)) {
if (*deviceModes != DEVICE_MODE_TESTING) {
*deviceModes = DEVICE_MODE_FAILURE;
}
} else {
if (env->fl_iniSysIsDone == true) {
if (*deviceModes != DEVICE_MODE_TESTING) {
*deviceModes = DEVICE_MODE_UVEOS_UNDEFINDET;
}
}
}
if (*deviceModes != DEVICE_MODE_FAILURE) {
if (DeviceTesting_Periodical(&env->testing)) {
if (*deviceModes != DEVICE_MODE_TESTING) {
*deviceModes = DEVICE_MODE_FAILURE;
}
} else {
if (*deviceModes != DEVICE_MODE_TESTING) {
*deviceModes = DEVICE_MODE_UVEOS_UNDEFINDET;
}
}
}
if (
(env->fl_iniSysIsDone) &&
(*deviceModes != DEVICE_MODE_TESTING) &&
(*deviceModes != DEVICE_MODE_UVEOS_GARAG)
) {
Mma_SetMode(env, *deviceModes);
Mma_gnssUpdateIndication(env);
}
if (!env->storage.nvm->device.factoryMode) {
DeviceTestsTable_MakeTest(env->testing.namedTests.modemSimEra);
DeviceTestsTable_MakeTest(env->testing.namedTests.modemSimComers);
DeviceTestsTable_MakeTest(env->testing.namedTests.modemSoftRevision);
DeviceTesting_SetTelematicaTestMode(&env->testing, false);
SystemDelayMs(1000);
Mma_AudioSubSystemRequire(env);
SystemDelayMs(1000);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4 * 1000);
Mma_AudioSubSystemRelease(env);
if ((env->userInputSubstart == 1) || (env->userInputSubstart == 2)) {
SystemSelector(&env->systemSwitcher, UVEOS);
ModemDataCollector_SelectionSimChip(&env->systemSelector, CHIP_ERA);
} else {
SystemSelector(&env->systemSwitcher, TELEMATICA);
}
if (env->threadSubstartChekButton.id == NULL) {
Mma_UserInputSubstartButtonThreadStart(env);
}
osMutexRelease(env->mux_factoryMode);
env->fl_isFacrotyMode = true;
EraGlonassUveosDumper_ForceDump(&env->storage.uveosDumper);
SystemDelayMs(100);
return;
}
Mma_RunTests(env);
#ifdef FIRMWARE_TEST
if ((*env->comInt.Amplifier.playMode == true)&&(env->ModemDataCollector.fl_IsLoad == true)) {
*env->comInt.Amplifier.playMode = false;
}
#else
if ((*env->comInt.Amplifier.playMode == true)&&(env->ModemDataCollector.fl_IsLoad == true)) {
Mma_AudioSubSystemRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
*env->comInt.Amplifier.playMode = false;
Mma_AudioSubSystemRelease(env);
}
#endif
if (env->comInt.TestButton.run == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование из сервисного ПО")
env->testing.audioHintsMode = HINTS_NORMAL;
Mma_RunShortTest(env, true);
env->testing.audioHintsMode = HINTS_FULL;
env->comInt.TestButton.run = false;
}
Mma_CheckShutdown(env);
SystemDelayMs(100);
}
}
}
void Mma_RunTests(tMma *env) {
if (env->testing.queryUDSState->commands == COM_RUN) {
Mma_CanProcRunTests(env);
if (env->storage.nvm->device.factoryMode == true) {
SystemSelector(&env->systemSwitcher, TELEMATICA);
}
}
}
void Mma_AudioSubSystemRelease(tMma *env) {
if (!env->storage.nvm->gost.notGost.ECALL_DEBUG_MODE) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Инициализировано освобождение аудио подсистемы")
Pwm_SetMuteInCar(&env->power, false);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сигнал MUTE снят с борт. сети")
Pwm_AmpOff(&env->power);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отключение УНЧ выполнено")
SystemDelayMs(200);
Mma_AudioTestSetMode(&env->power, true);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Тест наличия громкоговорителя включен код 2")
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "СИСТЕМА В РЕЖИМЕ ОТЛАДКИ, ОТКЛЮЧЕНИЕ АУДИО ПОДСИСТЕМЫ НЕ ВОЗМОЖЕН")
}
}
void Mma_AudioSubSystemRequire(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включение аудио тракта")
Mma_AudioSubSystemStart(&env->power, &env->amplifier);
}
void Mma_NetworkRequire(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Проверка регистрацию в сети")
if (!GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 1500)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует, попытка регистрации код 2")
Mma_SetMode(env, DEVICE_MODE_UVEOS_WAIT_NETWORK);
if (GsmWithGnss_NetworkSetStateInnaterups(&env->gsmWithGnss, 4, 20000) == AT_OK) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Сеть присутствует")
return;
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "нет сети")
}
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "Регистрация в сети присутствует")
}
}
void Mma_gnssUpdateIndicationGetGnssState(tMma *env) {
if ((env->storage.runtime.enableGnssUpdate == true) && (env->indication.mode != DEVICE_MODE_TESTING) &&
(env->indication.mode != DEVICE_MODE_UVEOS_GARAG)) {
if (env->gsmWithGnss.gnss.currentRmc.status == 'A') {
if (ModemDataCollector_GetThisSubSystem(&env->systemSelector) == UVEOS) {
EraGlonassUveos_DoNothingModeDistance(&env->uveos, true);
}
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
} else {
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_WAIT_GNSS);
env->uveos.doNothing.mode = UVEOS_DO_NOTHING_DISABLED;
SystemDelayMs(10);
}
if (GsmWithGnss_IsGnssReady(&env->gsmWithGnss)) {
env->indication.mode = DEVICE_MODE_UVEOS_ERA_GNSS_READY;
} else {
env->indication.mode = DEVICE_MODE_UVEOS_ERA_WAIT_GNSS;
}
} else {
if (env->gsmWithGnss.gnss.currentRmc.status == 'A') {
if (ModemDataCollector_GetThisSubSystem(&env->systemSelector) == UVEOS) {
EraGlonassUveos_DoNothingModeDistance(&env->uveos, true);
}
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
} else {
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_WAIT_GNSS);
}
}
}
void Mma_gnssUpdateIndication(tMma *env) {
// Mma_gnssUpdateIndicationGetGnssState(env);
if (env->indication.mode != DEVICE_MODE_FAILURE) {
Mma_gnssUpdateIndicationGetGnssState(env);
}
if (env->indication.mode == DEVICE_MODE_UVEOS_UNDEFINDET) {
Mma_gnssUpdateIndicationGetGnssState(env);
}
}
static void Mma_UserTestMode(tMma *env,bool exitTestPlay) {
if (env->testing.queryUDSState->source == GSM_TEST) {
Mma_NetworkRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "reg_to_net.mp3", 4 * 1000);
}
EraGlonassUveos_DoNotingTestingStarted(&env->uveos);
if (DeviceTesting_RunUserTests(&env->testing) == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пользовательское тестирование завершено")
if (!env->storage.nvm->device.factoryMode) {
SystemDelayMs(500);
Mma_AudioSubSystemRequire(env);
SystemDelayMs(500);
if(exitTestPlay == true) {
DeviceTesting_ExitTestPlay(&env->testing);
}
}
}
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
}
void Mma_RunUserTests(tMma *env, bool releaseAudioSubSystem) {
if (env->indication.mode == DEVICE_MODE_TESTING) {
return;
}
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_ACTIVE
);
Mma_SetMode(env, DEVICE_MODE_TESTING);
Mma_AudioSubSystemRequire(env);
#if (AURUS_CAR_UI == 1)
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "runTestAurus.mp3", 4 * 1000);
#endif
vAsciiStringInit(step, &str_len, 5);
vAsciiStringAddDecimalInt64(step, &str_len, env->uveos.doNothing.movDist, 5);
eSubSystems subSystemsBuf = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_DISABLED) {
if (env->testing.queryUDSState->source != LEDS_TEST) {
#if (AURUS_CAR_UI == 1)
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "autoDiagnost.mp3", 5 * 1000);
#endif
#if (AURUS_CAR_UI == 0)
if (
(env->testing.audioHintsMode != HINTS_MINIMAL) &&
(env->testing.audioHintsMode != HINTS_NOT_ERA_EXIT)) {
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
}
if (env->testing.audioHintsMode == HINTS_NOT_ERA_EXIT) {
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
env->testing.audioHintsMode = HINTS_MINIMAL;
}
#endif
}
SystemSelector(&env->systemSwitcher, UVEOS);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Режим пользовательского тестирования, отклонение дистанции=")
LoggerInfo(LOGGER, LOG_SIGN, step, str_len)
Mma_UserTestMode(env,releaseAudioSubSystem);
if(releaseAudioSubSystem == true) {
Mma_AudioSubSystemRelease(env);
}
env->testing.queryUDSState->commands = COM_INIT;
SystemSelector(&env->systemSwitcher, subSystemsBuf);
} else if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_MOVE_TO) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Переход в режим тестирования не возможен, Т.С. находится в движении, отклонение дистанции=")
LoggerInfo(LOGGER, LOG_SIGN, step, str_len)
} else if (env->uveos.doNothing.movePosition.valid == 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Данные GNSS не достоверны!")
}
env->testing.queryUDSState->state = QUERY_STOP;
if(releaseAudioSubSystem == true) {
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_NOT_ACTIVE
);
}
Mma_SetMode(env, DEVICE_MODE_UVEOS_UNDEFINDET);
}
void Mma_CheckingChangesGNSS_Antena(tMma *env) {
if (env->storage.nvm->device.useInternalAnt != env->power.interAntBufVal) {
Pwm_LNA_setMode(&env->power, env->storage.nvm->device.useInternalAnt);
}
env->power.interAntBufVal = env->storage.nvm->device.useInternalAnt;
}
void Mma_RunServiceMode(tMma *env) {
vAsciiStringInit(step, &str_len, 5);
vAsciiStringAddDecimalInt64(step, &str_len, env->uveos.doNothing.movDist, 5);
eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
if (subSystemsTmp != TELEMATICA) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
///* переключение в режим телематики
SystemSelector(&env->systemSwitcher, TELEMATICA);
EXT_ENV_ADR_TELE.tele_func(env, TELE_MODULE_START);
}
}
if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_DISABLED) {
Mma_SetMode(env, DEVICE_MODE_UVEOS_GARAG);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в сервисный режим, отклонение дистанции = ")
LoggerInfo(LOGGER, LOG_SIGN, step, str_len)
Mma_GarageMode(env);
} else if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_MOVE_TO) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Переход в сервисный режим не возможен, Т.С. находится в движении, отклонение дистанции=")
LoggerInfo(LOGGER, LOG_SIGN, step, str_len)
} else if (env->uveos.doNothing.movePosition.valid == 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Данные GNSS не достоверны!")
}
}
void Mma_UserInputSubstartButtonThreadStart(tMma *env) {
if (!env->threadSubstartChekButton.id) {
env->threadSubstartChekButton.id = osThreadNew(
(osThreadFunc_t) (Mma_UserInputSubstartButtonThread),
(void *) (env),
&env->threadSubstartChekButton.attr
);
}
}
void Mma_UserInputSubstartButtonThreadStop(tMma *env) {
if (osThreadTerminate(env->threadSubstartChekButton.id) == osOK) {
SystemDelayMs(100);
env->threadSubstartChekButton.id = NULL;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поток предстартового опроса БИПа остановлен")
}
}
static _Noreturn void Mma_UserInputSubstartButtonThread(tMma *env) {
tUserInputButtonEvent buttonEvent = {0};
bool fl_isSend = false;
while (1) {
if (fl_isSend == false) {
if (EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable) > 0) {
Mma_SetMode(env, DEVICE_MODE_UVEOS_SMS_TRANSMIT);
env->userInputSubstart = SUB_START_MODE_NOT_SEND_MSD;
}
fl_isSend = true;
}
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIs(buttonEvent, UI_CUSTOM_BUTTON_TEST_MODE, FALL)) {
Mma_SetMode(env, DEVICE_MODE_TESTING);
env->userInputSubstart = SUB_START_MODE_TESTING;
} else {
if (UserInputButtonEventIs(buttonEvent, UI_CUSTOM_BUTTON_EMERGENCY, FALL)) {
Mma_SetMode(env, DEVICE_MODE_UVEOS_MANUAL_BEGIN);
env->userInputSubstart = SUB_START_MODE_EMER;
}
}
}
SystemDelayMs(4);
}
}
void Mma_ClearParams(tMma *env) {
String32CopyStatic(&env->storage.nvm->gost.VIN, "00000000000000000");
}
void Mma_RunShortTest(tMma *env, bool blocEcall) {
eSubSystems eSubSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
SystemSelector(&env->systemSwitcher, UVEOS);
if(blocEcall == false) {
AccompanModeStopThread(env);
}
// GsmWithGnss_InvalidateNetworkEnable(&env->gsmWithGnss, 0, true);
// Mma_NetworkRequire(env);
Mma_AudioSubSystemRequire(env);
env->queryUDSState.source = SPEAK_MICR_TEST;
env->testing.audioHintsMode = HINTS_NOT_ERA_EXIT;
SystemDelayMs(500);
Mma_RunUserTests(env, false);
SystemDelayMs(500);
// if(blocEcall == true) {
// env->queryUDSState.source = LEDS_TEST;
// env->testing.audioHintsMode = HINTS_MINIMAL;
// Mma_RunUserTests(env, false);
// }
env->testing.audioHintsMode = HINTS_NORMAL;
env->lastEventDevice = LAST_EVENT_TEST;
if(blocEcall == false) {
uint16_t bufTime = env->uveos.settings->TEST_REGISTRATION_PERIOD;
uint16_t bufManDialAttems = env->uveos.settings->ECALL_MANUAL_DIAL_ATTEMPTS;
env->uveos.settings->TEST_REGISTRATION_PERIOD = 1;
env->uveos.settings->ECALL_MANUAL_DIAL_ATTEMPTS = 1;
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
Mma_AudioSubSystemRequire(env);
DeviceTesting_TestingECool(&env->testing);
env->uveos.settings->TEST_REGISTRATION_PERIOD = bufTime;
env->uveos.settings->ECALL_MANUAL_DIAL_ATTEMPTS = bufManDialAttems;
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
}
if(env->storage.nvm->device.factoryMode != true){
DeviceTesting_ExitTestPlay(&env->testing);
}
Mma_AudioSubSystemRelease(env);
env->testing.audioHintsMode = HINTS_FULL;
SystemSelector(&env->systemSwitcher, eSubSystemsTmp);
AccompanModeStartThread(env);
}
void Mma_PassedMode(tMma *env) {
SystemSelector(&env->systemSwitcher, UNDEFANDET);
tUserInputButtonEvent buttonEvent = {0};
bool checStartEOL = false;
while ((DeviceTesting_VIN(&env->storage) != DEVICE_TESTING_CODE_PASSED) || (env->eolAcsess == true)) {
if (*env->comInt.Amplifier.playMode == true) {
Mma_AudioSubSystemRequire(env);
AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "test_mode.mp3", 5 * 1000);
*env->comInt.Amplifier.playMode = false;
Mma_AudioSubSystemRelease(env);
}
Mma_SetMode(env, DEVICE_MODE_UVEOS_PASSIVE);
if (env->tm_FactoryMessage < SystemGetMs()) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пассивный режим, сконфигурируйте устройство!")
// if (env->fl_isFacrotyMode == true) {
// LoggerInfoStatic(LOGGER, LOG_SIGN,
// "Устройство было в режиме производственного контроля, для отключения устройства отключите линию питания и зажигания")
// }
env->tm_FactoryMessage = SystemGetMs() + 8000;
}
if (env->checNetDeGeg == false) {
if (env->threadSubstartChekButton.id != NULL) {
Mma_UserInputSubstartButtonThreadStop(env);
}
env->checNetDeGeg = true;
}
if (env->state.GsmRegistartionStateMem == 0) {
SystemSelector(&env->systemSwitcher, UVEOS);
// if(checNetReg == false) {
// if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 4000) == osOK) {
// AtGsm_OperatorSelectionDeregister(&env->gsmWithGnss.gsmAt);
// osMutexRelease(env->gsmWithGnss.gsmAt.access);
// }
// }
checStartEOL = true;
// if( (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss,1000) == true) && (checNetReg == false) ){
// env->state.GsmRegistartionStateMem = 2;
// env->state.GsmRegistrationState = 2;
// }
//
// if( (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss,1000) == false) && (checNetReg == false) ){
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Выполнен запрос регистрации в сети, инициализатор - процедура EOL")
// checNetReg = true;
// if(GsmWithGnss_NetworkReconnect(&env->gsmWithGnss.gsmAt , 5) == AT_OK){
// if(GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss,2000) == true){
// env->state.GsmRegistartionStateMem = 2;
// env->state.GsmRegistrationState = 2;
// }
// }
//
// } else if(checNetReg == true) {
// if(tm_tt > SystemGetMs()){
// if(GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss,2000) == true){
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Регистрация в сети инициализированная EOL получена")
// env->state.GsmRegistartionStateMem = 2;
// env->state.GsmRegistrationState = 2;
// }
// tm_tt = SystemGetMs()+10000;
// }
env->state.GsmRegistartionStateMem = 2;
env->state.GsmRegistrationState = 2;
// }
}
/**
* Проверка вызова тестирования
*/
/** НАЧАЛО **/
/** Проверка на вызов тестирования по кнопка **/
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIs(buttonEvent, UI_CUSTOM_BUTTON_TEST_MODE, FALL)) {
UserButtons_Clear(env->testing.input);
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Получен сигнал перехода в режим пользовательского тестирования код 1")
if (checStartEOL == true) {
checStartEOL = false;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование в режиме EOL")
eSubSystems eSubSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
SystemSelector(&env->systemSwitcher, UVEOS);
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_ACTIVE
);
env->testing.audioHintsMode = HINTS_NORMAL;
Mma_RunShortTest(env, false);
env->testing.audioHintsMode = HINTS_FULL;
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_NOT_ACTIVE
);
EraGlonassMsdTable_Init(env->uveos.msdTable);
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Данные о экстренных вызовах очищены из ПЗУ устройства")
if (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 2000) == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Регистрация в сети инициализированная EOL получена")
env->state.GsmRegistartionStateMem = 2;
env->state.GsmRegistrationState = 2;
}
SystemSelector(&env->systemSwitcher, eSubSystemsTmp);
env->state.GsmRegistartionStateMem = 0;
env->eolAcsess = false;
} else {
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_ACTIVE
);
Mma_RunShortTest(env, false);
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_NOT_ACTIVE
);
}
env->userInputSubstart = SUB_START_MODE_UNDEF;
UserButtons_Clear(env->testing.input);
}
}
/** Иначе очищаем полученные события нажатий и проверяем
* флаг предстартовой проверки событий на вызов тестирования по кнопкам
*/
else {
UserButtons_Clear(env->testing.input);
if (env->userInputSubstart == SUB_START_MODE_TESTING) {
env->userInputSubstart = SUB_START_MODE_UNDEF;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование в режиме EOL 2")
if (checStartEOL == true) {
checStartEOL = false;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование в режиме EOL 3")
eSubSystems eSubSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
SystemSelector(&env->systemSwitcher, UVEOS);
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_ACTIVE
);
env->testing.audioHintsMode = HINTS_NORMAL;
Mma_RunShortTest(env, false);
env->testing.audioHintsMode = HINTS_FULL;
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_NOT_ACTIVE
);
EraGlonassMsdTable_Init(env->uveos.msdTable);
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Данные о экстренных вызовах очищены из ПЗУ устройства")
if (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 2000) == true) {
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Регистрация в сети инициализированная EOL получена")
env->state.GsmRegistartionStateMem = 2;
env->state.GsmRegistrationState = 2;
}
SystemSelector(&env->systemSwitcher, eSubSystemsTmp);
env->state.GsmRegistartionStateMem = 0;
env->eolAcsess = false;
} else {
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_ACTIVE
);
Mma_RunShortTest(env, false);
setGeneralGNSS(env,
CAN_GNSS_NO_CALL,
CAN_GNSS_NO_MALFUNCTIONS,
CAN_GNSS_NO_ROLLOVER_DETECT,
CAN_GNSS_CALL_TEST_NOT_ACTIVE
);
}
}
}
/**
* Проверка вызова тестирования
*/
/** КОНЕЦ **/
Mma_RunTests(env);
if (checStartEOL == false) {
Mma_SubstartTelematica(env);
}
/**
* Проверка отключения для производственного контроля или после выхода из него
* Если зажигание отключено и
* Напряжение сети меньше 7 Вольт
* Переходим к процедуре отключения
*/
if (env->fl_isFacrotyMode == true) {
if (
(GpioPinGet(&env->power.powerSusystem->main.ignition) == false) &&
(env->power.powerSusystem->boardPower.currentBoardVoltage < 7000)
) {
Mma_Shutdown(env);
}
}
/**
* Если мы не в режиме производственного контроля
* и не были в нем в текущем включении
* Осуществляется стандартная проверка отключения
*/
if ((env->fl_isFacrotyMode != true) /* && (checStartEOL == false) */) {
Mma_CheckShutdown(env);
}
SystemDelayMs(100);
}
}
void setGeneralGNSS(tMma *env,
eCanGnssCallByButton GNSS_Call_By_button,
eCanGnssStatus GNSS_Status,
eCanGnssCallAuto GNSS_Call_Auto,
eCanGnssCallTest GNSS_Call_Test
) {
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
env->GNSS_General.GNSS_Call_By_button = GNSS_Call_By_button;
env->GNSS_General.GNSS_Status = GNSS_Status;
env->GNSS_General.GNSS_Call_Auto = GNSS_Call_Auto;
env->GNSS_General.GNSS_Call_Test = GNSS_Call_Test;
}
}
static _Noreturn void Mma_Thread(tMma *env) {
env->tmStart = SystemGetMs();
uint32_t bufTm = 0;
//Запуск устройства
Mma_InitStage(env);
AccompanModeStartThread(env);
size_t size = xPortGetMinimumEverFreeHeapSize();
uint32_t sizeStorage = sizeof(tDeviceDataNonVolatile);
LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Свободно %u байт в куче. Размер хранилища %u", size, sizeStorage)
tDeviceModes *indicationState = UserIndication_GetMode(env);
tUserInputButtonEvent buttonEvent = {0};
tUveosEmergencyEvent emergencyEvent = {0};
while (env->storage.nvm->device.factoryMode) {
SystemDelayMs(100);
}
if (env->storage.nvm->device.serviseMode) {
Mma_UserInputSubstartButtonThreadStop(env);
Mma_RunServiceMode(env);
Mma_UserInputSubstartButtonThreadStart(env);
}
if (!env->storage.nvm->device.factoryMode) {
Mma_PassedMode(env);
env->userInputSubstart = SUB_START_MODE_UNDEF;
UserButtons_Clear(env->testing.input);
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_WAIT_GNSS);
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
}
uint32_t noSendMsdCount = EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable);
if (env->storage.nvm->gost.notGost.ECALL_DEBUG_MODE) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "ДОСТУП ЗАБЛОКИРОВАН, СИСТЕМА В РЕЖИМЕ ОТЛАДКИ")
noSendMsdCount = 0;
}
if (
(noSendMsdCount > 0) &&
(osMutexAcquire(env->mux_factoryMode, 5000) == osOK)
) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обнаружены не обработанные МНД, инициализирована процедура переотправки")
SystemSelector(&env->systemSwitcher, UVEOS);
uint32_t tm_t = SystemGetMs() + 10000;
while ((env->fl_iniSysIsDone != true) && (tm_t > SystemGetMs())) {
LoggerTraceStatic(LOGGER, LOG_SIGN,
"Обнаружены не обработанные МНД, ожидание инициализации системы для дальнейшей их обработки")
SystemDelayMs(2000);
}
uint8_t bufUserInputSubstart = env->userInputSubstart;
eSubSystems eSubSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
if (GsmWithGnss_NetworkSetStateInnaterups(&env->gsmWithGnss, 4, 40) == AT_OK) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Регистрация в сети выполнена")
AccompanModeStopThread(env);
EraGlonassUveos_ProcessingEra(&env->uveos);
AccompanModeStartThread(env);
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление всех СМС")
osMutexRelease(env->gsmWithGnss.gsmAt.access);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления GsmWithGnss_NetworkSetStateInnaterups 0")
}
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsm_OperatorSelectionDeregister(&env->gsmWithGnss.gsmAt);
LoggerTraceStatic(LOGGER, LOG_SIGN, "Регистрация в сети отключена")
osMutexRelease(env->gsmWithGnss.gsmAt.access);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления GsmWithGnss_NetworkSetStateInnaterups 1")
}
noSendMsdCount = EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable);
if (noSendMsdCount == 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Не отправленные экстренные события обработаны полностью, данные из ПЗУ очищены")
EraGlonassMsdTable_Init(env->uveos.msdTable);
EraGlonassUveosDumper_ForceDump(env->uveos.dumper);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Остались не обработанные МНД в хранилище")
}
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует")
}
ModemDataCollector_SetThisSubSystem(&env->systemSelector, eSubSystemsTmp);
env->userInputSubstart = bufUserInputSubstart;
osMutexRelease(env->mux_factoryMode);
}
Mma_UserInputSubstartButtonThreadStop(env);
if (env->userInputSubstart == SUB_START_MODE_EMER) {
env->userInputSubstart = SUB_START_MODE_UNDEF;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Экстренный вызов, предстартовый поток")
Mma_EcallManual(env);
} else {
if (env->userInputSubstart == SUB_START_MODE_TESTING) {
env->userInputSubstart = SUB_START_MODE_UNDEF;
env->testing.queryUDSState->state = QUERY_BUSY;
env->queryUDSState.source = FULL_TESTS;
AccompanModeStopThread(env);
Mma_RunUserTests(env, true);
AccompanModeStopThread(env);
env->testing.queryUDSState->state = QUERY_STOP;
}
}
if (env->storage.nvm->gost.notGost.ECALL_DEBUG_MODE) {
SystemSelector(&env->systemSwitcher, UVEOS);
Mma_AudioSubSystemRequire(env);
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Запуск главного цикла")
for (;;) {
Mma_SubstartTelematica(env);
while (env->storage.nvm->device.factoryMode) {
SystemDelayMs(1000);
}
Mma_UserInputSubstartButtonThreadStop(env);
AccompanModeStartThread(env);
Mma_SetMode(env, *indicationState);
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обновляем индикацию")
Mma_CheckingChangesGNSS_Antena(env);
if ((env->uveos.timings.lastInMemTransmit < SystemGetMs()) && (env->uveos.settings->notGost.ECALL_DEBUG_MODE)) {
if (bufTm < SystemGetMs()) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Периодическая проверка необходимости повторной отправки МНД НЕ ВЫПОЛНЕНА, СИСТЕМА В ДЭБАГ РЕЖИМЕ")
bufTm = SystemGetMs() + 4000;
}
}
if ((env->uveos.timings.lastInMemTransmit < SystemGetMs()) &&
(!env->uveos.settings->notGost.ECALL_DEBUG_MODE)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Периодическая проверка необходимости повторной отправки МНД")
noSendMsdCount = EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable);
if (env->storage.nvm->gost.notGost.ECALL_DEBUG_MODE) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "ДОСТУП ЗАБЛОКИРОВАН, СИСТЕМА В РЕЖИМЕ ОТЛАДКИ")
noSendMsdCount = 0;
}
if ((noSendMsdCount > 0) && (osMutexAcquire(env->mux_factoryMode, 5000) == osOK)) {
eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
if (subSystemsTmp != UVEOS) {
SystemSelector(&env->systemSwitcher, UVEOS);
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обнаружены не обработанные МНД, проверка регистрации в сети")
if (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 2000)) {
AccompanModeStopThread(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует")
LoggerTraceStatic(LOGGER, LOG_SIGN,
"Производится обработка не переданных МНД, передача по средствам PDU пакетов")
EraGlonassUveos_ProcessingCheckNoSendMSD(&env->uveos);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление всех СМС")
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
SystemDelayMs(500);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление СМС выполнено")
osMutexRelease(env->gsmWithGnss.gsmAt.access);
}
AccompanModeStartThread(env);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует, попытка регистрации код 3")
if (GsmWithGnss_NetworkSetStateInnaterups(&env->gsmWithGnss, 5, 5000) == AT_OK) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Сеть присутствует")
LoggerTraceStatic(LOGGER, LOG_SIGN,
"Производится обработка не переданных МНД, передача по средствам PDU пакетов")
EraGlonassUveos_ProcessingCheckNoSendMSD(&env->uveos);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление всех СМС")
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
SystemDelayMs(500);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление СМС выполнено")
osMutexRelease(env->gsmWithGnss.gsmAt.access);
}
SystemDelayMs(500);
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
SystemDelayMs(500);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление СМС выполнено")
osMutexRelease(env->gsmWithGnss.gsmAt.access);
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление СМС выполнено")
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Периодическая проверка необходимости повторной отправки МНД не выполнена, сеть отсутствует")
}
}
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обработка не отправленных МНД выполнена")
SystemSelector(&env->systemSwitcher, subSystemsTmp);
osMutexRelease(env->mux_factoryMode);
}
env->uveos.timings.lastInMemTransmit =
SystemGetMs() + (env->uveos.settings->INT_MEM_TRANSMIT_INTERVAL * 60 * 1000);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Время периодическая проверки повторной отправки МНД обновлено")
}
if (UveosEmergencyEvent_GetNext(&env->crashDetect.emergencyEvents, &emergencyEvent, 0)) {
if (env->storage.nvm->gost.CRASH_SIGNAL_INTERNAL == 1) {
if (osMutexAcquire(env->mux_factoryMode, 5000) == osOK) {
if (env->crashDetect.carCrashDetection.asi15.impactDetected) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Тип события - столкновение")
env->lastEventDevice = LAST_EVENT_IMPACT;
}
if (env->crashDetect.carCrashDetection.flip.flipDetected) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Тип события - переворот")
env->lastEventDevice = LAST_EVENT_FLIP;
}
Mma_EcallAutomatic(env, emergencyEvent);
Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY);
osMutexRelease(env->mux_factoryMode);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата Mma_EcallAutomatic")
}
}
}
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIs(buttonEvent, UI_CUSTOM_BUTTON_TEST_MODE, FALL)) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Получен сигнал перехода в режим пользовательского тестирования код 3")
if (osMutexAcquire(env->mux_factoryMode, 5000) == osOK) {
#if (AURUS_CAR_UI == 1)
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование")
bool fl_audioHids = env->uveos.fl_audioHids;
env->uveos.fl_audioHids = false;
env->testing.queryUDSState->state = QUERY_BUSY;
env->queryUDSState.source = INTERNAL_ONE_TEST;
env->lastEventDevice = LAST_EVENT_TEST;
Mma_RunUserTests(env,true);
osMutexRelease(env->mux_factoryMode);
env->testing.queryUDSState->state = QUERY_STOP;
env->uveos.fl_audioHids = fl_audioHids;
#endif
#if (AURUS_CAR_UI == 0)
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов режима пользовательского тестирование")
env->testing.queryUDSState->state = QUERY_BUSY;
env->queryUDSState.source = FULL_TESTS;
env->lastEventDevice = LAST_EVENT_TEST;
AccompanModeStopThread(env);
Mma_RunUserTests(env,true);
AccompanModeStartThread(env);
osMutexRelease(env->mux_factoryMode);
env->testing.queryUDSState->state = QUERY_STOP;
#endif
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата ( Mma_RunUserTests )")
}
}
if (UserInputButtonEventIs(buttonEvent, UI_CUSTOM_BUTTON_EMERGENCY, FALL)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Нажата кнопка экстренного вызова")
if (osMutexAcquire(env->mux_factoryMode, 5000) == osOK) {
env->lastEventDevice = LAST_EVENT_MANUAL;
//начало-----------------Обновление счетчиков телематики (для отладки)--------------------------------------
if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) {
EXT_ENV_ADR_TELE.tele_func(env, TELE_MODULE_COUNTER_2);
}
//конец------------------Обновление счетчиков телематики (для отладки)--------------------------------------
Mma_EcallManual(env);
osMutexRelease(env->mux_factoryMode);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата Mma_EcallManual")
}
} else if (UserInputButtonEventIsBetween(buttonEvent, UI_VIRT_BUTTON_ADDITIONAL, RAISE, SERVICE_MODE_MIN, SERVICE_MODE_MAX)) {
if (osMutexAcquire(env->mux_factoryMode, 5000) == osOK) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов сервисного режима ")
Mma_RunServiceMode(env);
osMutexRelease(env->mux_factoryMode);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата Mma_RunServiceMode")
}
}
}
if (env->fl_iniSysIsDone == true) {
if ((EraGlonassUveos_IsAllowInCall(&env->uveos) == true) && (env->gsmWithGnss.urc.ring)) {
if (GsmWithGnss_isInpCallActive(&env->gsmWithGnss)) {
if (osMutexAcquire(env->mux_factoryMode, 5000) == osOK) {
Mma_ProcessCallAnswer(env);
env->gsmWithGnss.urc.ring = false;
osMutexRelease(env->mux_factoryMode);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата Mma_ProcessCallAnswer 1")
}
}
}
if ((EraGlonassUveos_IsAllowInCall(&env->uveos) == false) && (env->gsmWithGnss.urc.ring)) {
if (osMutexAcquire(env->mux_factoryMode, 5000) == osOK) {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Была попытка дозвона на устройство с завершённым таймером ожидания входящего вызова")
AtGsmHangUpCall(&env->gsmWithGnss.gsmAt);
env->gsmWithGnss.urc.ring = false;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Попытка дозвона прекращена принудительно")
osMutexRelease(env->mux_factoryMode);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата Mma_ProcessCallAnswer 2")
}
}
}
eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector);
if (subSystemsTmp == UVEOS) {
if (EraGlonassUveos_IsRequireNetwork(&env->uveos)) {
Mma_SetNetworkRegistration(env, true);
} else {
Mma_SetNetworkRegistration(env, false);
}
}
if (subSystemsTmp == UVEOS) {
if (Mma_CheckIncomingSms(env) == AT_TIMEOUT) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Проведена проверка входящих PDU пакетов")
}
}
// Mma_Shutdown(env);
Mma_CheckShutdown(env);
Mma_RunTests(env);
SystemDelayMs(40);
}
}
void Mma_StartThread(tMma *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (Mma_Thread), (void *) (env), &env->thread.attr);
} else {
osThreadResume(env->thread.id);
}
}