SMART_COMPONENTS_MainModesA.../MainModesArbiter_Ecalls.c

239 lines
9.1 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.

//
// 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);
}