239 lines
9.1 KiB
C
239 lines
9.1 KiB
C
//
|
||
// 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);
|
||
} |