// // Created by zemon on 18.10.24. // #include "MainModesArbiter_Private.h" #include "PointEvent.h" #define LOG_SIGN "Главн." #define LOGGER &env->slog.logger void Mma_ProcessCallAnswer(tMma *env) { env->testing.queryUDSState->state = QUERY_BUSY; eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector); if(subSystemsTmp != UVEOS) { SystemSelector(&env->systemSwitcher, UVEOS); } LoggerInfoStatic(LOGGER, LOG_SIGN, "Получен вызов от оператора"); LoggerInfoStatic(LOGGER, LOG_SIGN, "Включение аудио подсистемы"); Mma_AudioSubSystemStart(&env->power, &env->amplifier); LoggerInfoStatic(LOGGER, LOG_SIGN, "Включение линии ecall в бортовой сети ТС"); GpioPinEnable(&env->power.powerSusystem->main.ecallOut); AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "audio_on.mp3", 4*1000); if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) { AtGsmAnswer(&env->gsmWithGnss.gsmAt); osMutexRelease(env->gsmWithGnss.gsmAt.access); } else { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления AtGsmAnswer") } LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов от оператора принят"); env->uveos.currentMsd->msd.MSD_Data.msgId = 1; Mma_SetMode(env, DEVICE_MODE_UVEOS_IN_CALL); while (GsmWithGnss_isInpCallActive(&env->gsmWithGnss)) { env->uveos.fl_ecallState = true; SystemDelayMs(500); } LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов от оператора завершён"); AtCommandResult res = AtGsmHangUpCall(&env->gsmWithGnss.gsmAt); while (res != AT_OK) { if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) { res = AtGsmHangUpCall(&env->gsmWithGnss.gsmAt); LoggerInfoStatic(LOGGER, LOG_SIGN, "Освобождение управления 21"); osMutexRelease(env->gsmWithGnss.gsmAt.access); } else { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления AtGsmHangUpCall") } LoggerInfoStatic(LOGGER, LOG_SIGN, "Поднят HangUp"); if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) { GsmWithGnss_resetInputCall(&env->gsmWithGnss); osMutexRelease(env->gsmWithGnss.gsmAt.access); } else { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления GsmWithGnss_resetInputCall") } LoggerInfoStatic(LOGGER, LOG_SIGN, "Выполнен сброс Ринга"); AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4*1000); LoggerInfoStatic(LOGGER, LOG_SIGN, "Питание УНЧ отключено"); Mma_AudioSubSystemRelease(env); LoggerInfoStatic(LOGGER, LOG_SIGN, "Сигнал MUTE отключен от бортовой сети "); Pwm_SetMuteInCar(&env->power, false); GpioPinDisable(&env->power.powerSusystem->main.ecallOut); env->uveos.fl_ecallState = false; env->testing.queryUDSState->state = QUERY_STOP; Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY); return; } } void Mma_ReleaseEcallSubSystems(tMma *env) { GpioPinDisable(&env->power.powerSusystem->main.ecallOut); EraGlonassEcallProvider_HangupEcl(env->uveos.ecallProvider); StopResiver(&env->gsmWithGnss); HotStartGNSS(&env->gsmWithGnss); GpioPinDisable(&env->power.powerSusystem->main.ecallOut); #if (AURUS_CAR_UI == 1) AudioPlayer_PlayStaticTone(env->uveos.audioPlayerIO,1); #endif #if (AURUS_CAR_UI == 0) AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "era_mode.mp3", 4 * 1000); #endif EraGlonassUveos_SetTimings(&env->uveos); SystemDelayMs(4000); Mma_AudioSubSystemRelease(env); LoggerInfoStatic(LOGGER, LOG_SIGN, "Обработка экстренной ситуации завершена") } void Mma_EcallManual(tMma *env) { ///* fix GNSS_General AccompanModeStopThread(env); EraGlonassUveos_SetTimings(&env->uveos); env->testing.queryUDSState->state = QUERY_BUSY; setGeneralGNSS(env, CAN_GNSS_CALL, CAN_GNSS_NO_MALFUNCTIONS, CAN_GNSS_NO_ROLLOVER_DETECT, CAN_GNSS_CALL_TEST_NOT_ACTIVE ); env->uveos.fl_ecallState = true; Mma_SetMode(env, DEVICE_MODE_UVEOS_MANUAL_BEGIN); Mma_AudioSubSystemRequire(env); #if (AURUS_CAR_UI == 1) AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "emerCool_aurus.mp3", 5*1000); #endif #if (AURUS_CAR_UI == 0) AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "ecall_on.mp3", 5*1000); #endif if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) { eEgtsEventTetedata egtsEventTetedata = EVENT_USER_CALL; EXT_ENV_ADR_TELE.tele_func(&egtsEventTetedata, TELE_MODULE_ADD_EVENT); } SystemSelector(&env->systemSwitcher, UVEOS); eSubSystems subSystemsTmp = ModemDataCollector_GetThisSubSystem(&env->systemSelector); if(subSystemsTmp != UVEOS) { LoggerInfoStatic(LOGGER, LOG_SIGN, "ОШИБКА ВЫПОЛНЕНИЯ ПРОЦЕДУРЫ ЭКСТРЕННОГО ВЫЗОВА"); if(env->ModemDataCollector.modemVersionRevision.valid_CCID != MOD_READY) { LoggerInfoStatic(LOGGER, LOG_SIGN, "ОШИБКА СИМ ЧИПА"); return; } } Mma_NetworkRequire(env); GpioPinEnable(&env->power.powerSusystem->main.ecallOut); env->uveos.currentMsd->msd.MSD_Data.msgId = 1; /// Очистка нажатий перед началом ECALL /// для избежания случайной отмены вызова UserButtons_Clear(&env->userInput.buttonsInterface); eEraGlonassUveos_EcallProcessingResult res = EraGlonassUveos_ManualEmergencyCall(&env->uveos); if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) { GsmWithGnss_ResetRing(&env->gsmWithGnss); LoggerInfoStatic(LOGGER, LOG_SIGN, "Сброс URC RING выполнен 2"); osMutexRelease(env->gsmWithGnss.gsmAt.access); } else { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления, сброс URC RING 2") } env->uveos.fl_ecallState = false; Mma_ReleaseEcallSubSystems(env); /// Очистка нажатий после ECALL /// для избежания случайного вызова UserButtons_Clear(&env->userInput.buttonsInterface); setGeneralGNSS(env, CAN_GNSS_NO_CALL, CAN_GNSS_NO_MALFUNCTIONS, CAN_GNSS_NO_ROLLOVER_DETECT, CAN_GNSS_CALL_TEST_NOT_ACTIVE ); env->testing.queryUDSState->state = QUERY_STOP; Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY); AccompanModeStartThread(env); } void Mma_EcallAutomatic(tMma *env, tUveosEmergencyEvent emergencyEvent) { AccompanModeStopThread(env); EraGlonassUveos_SetTimings(&env->uveos); env->testing.queryUDSState->state = QUERY_BUSY; if(emergencyEvent.isFlip) { setGeneralGNSS(env, CAN_GNSS_NO_CALL, CAN_GNSS_NO_MALFUNCTIONS, CAN_GNSS_ROLLOVER_DETECT, CAN_GNSS_CALL_TEST_NOT_ACTIVE ); } else { setGeneralGNSS(env, CAN_GNSS_NO_CALL, CAN_GNSS_NO_MALFUNCTIONS, CAN_GNSS_NO_ROLLOVER_DETECT, CAN_GNSS_CALL_TEST_NOT_ACTIVE ); } env->uveos.fl_ecallState = true; Mma_SetMode(env, DEVICE_MODE_UVEOS_AUTOMATIC_BEGIN); Mma_AudioSubSystemRequire(env); AudioPlayer_PlayToWait(env->uveos.audioPlayerIO, "ecall_on.mp3", 5*1000); if (EXT_ENV_ADR_TELE.META_EXT_ENV_TELE) { eEgtsEventTetedata egtsEventTetedata = EVENT_EMERGENCY_CALL; EXT_ENV_ADR_TELE.tele_func(&egtsEventTetedata, TELE_MODULE_ADD_EVENT); if(emergencyEvent.isFlip){ EXT_ENV_ADR_TELE.tele_func(NULL, TELE_MODULE_FUEL_CUT_OFF); } } SystemSelector(&env->systemSwitcher, UVEOS); Mma_NetworkRequire(env); GpioPinEnable(&env->power.powerSusystem->main.ecallOut); eEraGlonassUveos_EcallProcessingResult res = EraGlonassUveos_ProcessingEmergencyEvent(&env->uveos, &emergencyEvent); if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) { GsmWithGnss_ResetRing(&env->gsmWithGnss); LoggerInfoStatic(LOGGER, LOG_SIGN, "Сброс URC RING выполнен 3"); osMutexRelease(env->gsmWithGnss.gsmAt.access); } else { LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления, сброс URC RING 3") } Mma_ReleaseEcallSubSystems(env); env->uveos.fl_ecallState = false; setGeneralGNSS(env, CAN_GNSS_NO_CALL, CAN_GNSS_NO_MALFUNCTIONS, CAN_GNSS_NO_ROLLOVER_DETECT, CAN_GNSS_CALL_TEST_NOT_ACTIVE ); env->testing.queryUDSState->state = QUERY_STOP; Mma_SetMode(env, DEVICE_MODE_UVEOS_ERA_GNSS_READY); AccompanModeStartThread(env); }