562 lines
24 KiB
C
562 lines
24 KiB
C
//
|
||
// Created by xemon on 30.11.22.
|
||
//
|
||
|
||
#include "EraGlonassUveos_Private.h"
|
||
//#include "UserInput.h"
|
||
#include "AsciiStringParsingUtils.h"
|
||
#include "egtsWorker.h"
|
||
#include "Rtc.h"
|
||
|
||
#define LOGGER env->logger
|
||
#define LOG_SIGN "УВЭОС,ЭВ"
|
||
#define DEVTST_PLAY_SAMPLE(SAMPLE) \
|
||
SystemDelayMs(150); \
|
||
AudioPlayer_PlayStatic(env->audioPlayerIO, SAMPLE, 25*1000);
|
||
|
||
#define DEVTST_PLAY_TONE(COUNT) \
|
||
AudioPlayer_PlayStaticTone(env->audioPlayerIO,COUNT);
|
||
|
||
eEraGlonassUveos_EcallProcessingResult smsTransmitFl = ERA_GLONASS_UVEOS_SEND_FAIL;
|
||
|
||
void EraGlonassUveos_UpdateMsd(tEraGlonassUveos *env, eEcallTimeSourse timeSourse) {
|
||
EraGlonassUveosNavData nav;
|
||
time_t time;
|
||
|
||
if (timeSourse == GNSS_TIME_SOURSE) {
|
||
NavDataProvider_GetTime(env->navDataProvider, (uint32_t*) &time);
|
||
}
|
||
if (timeSourse == RTC_TIME_SOURSE) {
|
||
RtcGet(env->timings.rtcIo, &time);
|
||
}
|
||
if (timeSourse == NOT_CHANGE_TIME) {
|
||
time = env->currentMsd->msd.MSD_Data.timestamp;
|
||
}
|
||
|
||
NavDataProvider_GetNavData(env->navDataProvider, &nav, true);
|
||
EraGlonassMsdSetTimeStamp(&env->currentMsd->msd, time);
|
||
|
||
if (nav.valid != 0) {
|
||
EraGlonassMsdSetPositionValue(&env->currentMsd->msd, nav.longitude, nav.latitude, nav.direction, nav.valid);
|
||
} else {
|
||
EraGlonassMsdNoGnssSetDefaults(&env->currentMsd->msd);
|
||
}
|
||
}
|
||
|
||
static void EraGlonassUveos_SignMsd(tEraGlonassUveos *env, eEcallActivationType type, bool test) {
|
||
EraGlonassMsdSetDataEmergencySituationFlags(
|
||
&env->currentMsd->msd,
|
||
env->currentMsd->msd.MSD_Data.msgId,
|
||
type,
|
||
test ? TEST_CALL : EMERGENCY_CALL
|
||
);
|
||
}
|
||
|
||
void EraGlonassUveos_CompileMsd(tEraGlonassUveos *env, tEraGlonassMsd *msd, tMsdEncoded *msdEncoded) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Собираем бинарный пакет МНД")
|
||
msdEncoded->len = EraGlonassMsdEncode(msd, MSD_V_2, msdEncoded->data);
|
||
|
||
char asciiMsd[msdEncoded->len * 2];
|
||
size_t asciiMsdLen = 0;
|
||
vAsciiStringAddBytesAsHex(asciiMsd, &asciiMsdLen, msdEncoded->data, msdEncoded->len);
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, "Бинарный пакет МНД сформирован: ")
|
||
LoggerInfo(LOGGER, LOG_SIGN, asciiMsd, asciiMsdLen)
|
||
}
|
||
|
||
|
||
eEraGlonassUveos_EcallProcessingResult EraGlonassUveos_ProcessingSms(
|
||
tEraGlonassUveos *env,
|
||
tMsdEncoded *msdEncoded
|
||
) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отправка смс...")
|
||
if (EraGlonassUveos_EmergencySendMsdSmsTry(env, msdEncoded)) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "МНД отправленно по средствам СМС")
|
||
env->currentMsd->attemptsLeft = 0;
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_SMS_TRANSMIT);
|
||
return ERA_GLONASS_UVEOS_SMS_SENT;
|
||
} else {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN, "Неудалось отпаравить МНД по средствам СМС")
|
||
return ERA_GLONASS_UVEOS_SEND_FAIL;
|
||
}
|
||
}
|
||
|
||
void reSetMsdToPull(tEraGlonassUveos *env, const bool *wasNewSetMsd, const bool *wasResent, tMsdEncoded *msdEncoded) {
|
||
if (
|
||
(*wasNewSetMsd == true) &&
|
||
(*wasResent == false) &&
|
||
(env->currentMsd->msd.MSD_Data.msgId > 1)
|
||
) {
|
||
env->currentMsd->msd.MSD_Data.msgId--;
|
||
|
||
EraGlonassUveos_UpdateMsd(env, RTC_TIME_SOURSE);
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, msdEncoded);
|
||
EraGlonassEcallProvider_SettingNewMsd(env->ecallProvider, msdEncoded->data, msdEncoded->len);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN,
|
||
"Переотправка МНД по PULL запросу от оператора НЕ была выполнена, не получен URC об отправке")
|
||
}
|
||
}
|
||
|
||
void setMsdToPull(tEraGlonassUveos *env, const bool *mndSendFlag, bool *wasNewSetMsd, bool *wasResent,
|
||
tMsdEncoded *msdEncoded) {
|
||
if (
|
||
(*mndSendFlag == true) &&
|
||
(*wasNewSetMsd == false)
|
||
) {
|
||
|
||
env->currentMsd->msd.MSD_Data.msgId++;
|
||
|
||
EraGlonassUveos_UpdateMsd(env, RTC_TIME_SOURSE);
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, msdEncoded);
|
||
EraGlonassEcallProvider_SettingNewMsd(env->ecallProvider, msdEncoded->data, msdEncoded->len);
|
||
*wasNewSetMsd = true;
|
||
} else if (EraGlonassEcallProvider_IsMsdReSent(env->ecallProvider)) {
|
||
*wasNewSetMsd = false;
|
||
*wasResent = true;
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN,
|
||
"Была выполнена переотправка МНД по PULL запросу от оператора, будет установлен новый МНД")
|
||
}
|
||
}
|
||
|
||
static eEraGlonassUveos_EcallProcessingResult EraGlonassUveos_EmergencyCallTry(
|
||
tEraGlonassUveos *env,
|
||
tMsdEncoded *msdEncoded,
|
||
eEcallActivationType activationType,
|
||
eEcallTestMode testMode,
|
||
uint32_t dialTimeoutEnd,
|
||
bool *mndSendFlag,
|
||
bool debugMode
|
||
) {
|
||
|
||
eEraGlonassUveos_EcallProcessingResult callResult = ERA_GLONASS_UVEOS_CALL_FAIL;
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пробуем совершить экстренный вызов")
|
||
|
||
// if(testMode != TEST_CALL) {
|
||
// EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_INITIATE);
|
||
// }
|
||
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, msdEncoded);
|
||
|
||
if (!EraGlonassEcallProvider_Ecall(
|
||
env->ecallProvider,
|
||
msdEncoded->data,
|
||
msdEncoded->len,
|
||
env->settings->ECALL_TEST_NUMBER.data,
|
||
env->settings->ECALL_TEST_NUMBER.length,
|
||
activationType,
|
||
testMode
|
||
)) {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN, "Неудалось инициировать экстренный вызов")
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_FAILURE);
|
||
}
|
||
env->currentMsd->attemptsLeft--;
|
||
return ERA_GLONASS_UVEOS_CALL_FAIL;
|
||
}
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Экстренный вызов успешно инициирован")
|
||
tUserInputButtonEvent buttonEvent = {0};
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, "Дозвон")
|
||
while (EraGlonassEcallProvider_IsDialing(env->ecallProvider)) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_INITIATE);
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, ".")
|
||
if (env->settings->ECALL_MANUAL_CAN_CANCEL) {
|
||
while (UserButtons_GetNext(env->buttons, &buttonEvent, 0)) {
|
||
if (UserInputButtonEventIsBetween(buttonEvent, env->buttonsIds.emergensy, RAISE, 500, 4000)) {
|
||
EraGlonassEcallProvider_HangupEcl(env->ecallProvider);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, ".")
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Звонок прерван пользователем")
|
||
return ERA_GLONASS_UVEOS_CALL_USER_BREAK;
|
||
}
|
||
}
|
||
}
|
||
SystemDelayMs(500);
|
||
if (SystemGetMs() > dialTimeoutEnd) {
|
||
EraGlonassEcallProvider_HangupEcl(env->ecallProvider);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Звонок прерван, превышена общая продолжительность дозвона")
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_FAILURE);
|
||
}
|
||
return ERA_GLONASS_UVEOS_CALL_FAIL;
|
||
}
|
||
}
|
||
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, ".")
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_MSD_TRANSMIT);
|
||
}
|
||
uint32_t msdSendTimeout = SystemGetMs() + (env->settings->MSD_MAX_TRANSMISSION_TIME * 1000);
|
||
|
||
if (EraGlonassEcallProvider_IsActiveOut(env->ecallProvider)) {
|
||
#if (AURUS_CAR_UI == 0)
|
||
DEVTST_PLAY_SAMPLE("audio_on.mp3")
|
||
#endif
|
||
}
|
||
|
||
bool fl = false;
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, "Попытка отправки МНД...")
|
||
|
||
|
||
#if (AURUS_CAR_UI == 1)
|
||
DEVTST_PLAY_TONE(1)
|
||
#endif
|
||
#if (AURUS_CAR_UI == 0)
|
||
DEVTST_PLAY_SAMPLE("msd_send.mp3")
|
||
#endif
|
||
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_MSD_TRANSMIT);
|
||
while (!EraGlonassEcallProvider_IsMsdSent(env->ecallProvider) &&
|
||
EraGlonassEcallProvider_IsActiveOut(env->ecallProvider) &&
|
||
(msdSendTimeout > SystemGetMs())) {
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, ".")
|
||
SystemDelayMs(500);
|
||
if(fl == false){
|
||
SystemDelayMs(4500);
|
||
fl = true;
|
||
}
|
||
}
|
||
if(!debugMode) {
|
||
if (EraGlonassEcallProvider_IsMsdSent(env->ecallProvider)) {
|
||
env->currentMsd->attemptsLeft = 0;
|
||
*mndSendFlag = true;
|
||
callResult = ERA_GLONASS_UVEOS_CALL_SUCCESS;
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "МНД передан по средствам тонального модема")
|
||
} else {
|
||
if (!EraGlonassEcallProvider_IsActiveOut(env->ecallProvider)) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов завершен принимающей стороной")
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Превышено время передачи МНД тональным модемом")
|
||
callResult = ERA_GLONASS_UVEOS_SEND_FAIL;
|
||
}
|
||
if (testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_FAILURE);
|
||
}
|
||
}
|
||
|
||
if ((callResult == ERA_GLONASS_UVEOS_CALL_FAIL) && (*mndSendFlag == false)) {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN, "Не удалось отправить МНД (цикл вызовов) ошибка установки соединения")
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN,
|
||
"Производиться проверка сети для передачи МНД по альтернативному каналу связи")
|
||
if (EraGlonassEcallProvider_CheckNetState(env->ecallProvider, 20000) == true) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует, попытка отправки МНД по средствам СМС")
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, msdEncoded);
|
||
|
||
if (EraGlonassUveos_ProcessingSms(env, msdEncoded) == ERA_GLONASS_UVEOS_SMS_SENT) {
|
||
*mndSendFlag = true;
|
||
callResult = ERA_GLONASS_UVEOS_CALL_SUCCESS;
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "МНД отправлен по средствам СМС")
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Не удалось выполнить отправку СМС")
|
||
*mndSendFlag = false;
|
||
callResult = ERA_GLONASS_UVEOS_CALL_FAIL;
|
||
}
|
||
|
||
EraGlonassEcallProvider_DelSms(env->ecallProvider);
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть отсутствует")
|
||
}
|
||
}
|
||
|
||
if ((callResult == ERA_GLONASS_UVEOS_SEND_FAIL) && (*mndSendFlag == false)) {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN,
|
||
"Не удалось отправить МНД (цикл вызовов) ошибка передачи МНД по средствам тональной связи")
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует, попытка отправки МНД по средсвам СМС")
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, msdEncoded);
|
||
if (EraGlonassUveos_ProcessingSms(env, msdEncoded) == ERA_GLONASS_UVEOS_SMS_SENT) {
|
||
EraGlonassEcallProvider_DelSms(env->ecallProvider);
|
||
*mndSendFlag = true;
|
||
callResult = ERA_GLONASS_UVEOS_CALL_SUCCESS;
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "МНД отправлен по средствам СМС")
|
||
} else {
|
||
EraGlonassEcallProvider_DelSms(env->ecallProvider);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Не удалось выполнить отправку СМС")
|
||
*mndSendFlag = false;
|
||
callResult = ERA_GLONASS_UVEOS_SEND_FAIL;
|
||
}
|
||
}
|
||
}
|
||
|
||
bool wasNewSetMsd = false;
|
||
bool wasResent = false;
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, "Звонок")
|
||
uint64_t times = SystemGetMs();
|
||
|
||
|
||
if(EraGlonassEcallProvider_IsActiveOut(env->ecallProvider)){
|
||
#if (AURUS_CAR_UI == 1)
|
||
DEVTST_PLAY_TONE(2)
|
||
if(testMode == TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_TESTING_BEGIN);
|
||
} else {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_ACTIVE);
|
||
}
|
||
#endif
|
||
#if (AURUS_CAR_UI == 0)
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_ACTIVE);
|
||
#endif
|
||
}
|
||
|
||
|
||
while (EraGlonassEcallProvider_IsActiveOut(env->ecallProvider)) {
|
||
EraGlonassEcallProvider_CheckSms(env->ecallProvider);
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, ".")
|
||
if (times < SystemGetMs() && (wasNewSetMsd == true)) {
|
||
setMsdToPull(env, mndSendFlag, &wasNewSetMsd, &wasResent, msdEncoded);
|
||
times = SystemGetMs() + 5000;
|
||
LoggerCnInfoStatic(LOGGER, LOG_SIGN, "Установлен новый пакет МНД для PUL запроса")
|
||
}
|
||
SystemDelayMs(500);
|
||
}
|
||
|
||
reSetMsdToPull(env, &wasNewSetMsd, &wasResent, msdEncoded);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Звонок завершен")
|
||
return callResult;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
///=====================================================================================================================
|
||
///=====================================================================================================================
|
||
///=====================================================================================================================
|
||
///=====================================================================================================================
|
||
///=====================================================================================================================
|
||
|
||
|
||
|
||
bool EraGlonassUveos_ResentMsdTry(tEraGlonassUveos *env, tEraGlonassMsdTableItem *msdItem) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переотправка МНД...")
|
||
tMsdEncoded msdEncoded;
|
||
EraGlonassUveos_CompileMsd(env, &msdItem->msd, &msdEncoded);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Отправка смс...")
|
||
|
||
if (EraGlonassUveos_EmergencySendMsdSmsTry(env, &msdEncoded)) {
|
||
EraGlonassEcallProvider_DelSms(env->ecallProvider);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "МНД отправлено по средствам СМС")
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
return true;
|
||
} else {
|
||
EraGlonassEcallProvider_DelSms(env->ecallProvider);
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN, "Не удалось отправить МНД по средствам СМС PERIODICAL")
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
void EraGlonassUveos_UpdateCurrentSettingsMsd(tEraGlonassUveos *env, eEcallTimeSourse timeSourse) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обнавляем настройки...")
|
||
EraGlonassUveos_InvalidateSettings(env);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обновляем МНД...")
|
||
EraGlonassUveos_UpdateMsd(env, timeSourse);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сохраняем изменения в ПЗУ")
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
}
|
||
|
||
void EraGlonassUveos_GenCurrentMsd(tEraGlonassUveos *env,
|
||
eEcallActivationType activationType,
|
||
eEcallTestMode testMode,
|
||
eEcallTimeSourse timeSourse) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обнавляем настройки...")
|
||
EraGlonassUveos_InvalidateSettings(env);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обновляем МНД...")
|
||
EraGlonassUveos_UpdateMsd(env, timeSourse);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Выделяем МНД ID в таблице")
|
||
EraGlonassUveos_SignMsd(env, activationType, testMode);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сохраняем изменения в ПЗУ")
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
}
|
||
|
||
void EraGlonassUveos_ClearSms(tEraGlonassUveos *env){
|
||
uint32_t t = SystemGetMs() + 1252;
|
||
while (t > SystemGetMs()){
|
||
EraGlonassEcallProvider_DelSms(env->ecallProvider);
|
||
SystemDelayMs(50);
|
||
}
|
||
}
|
||
|
||
uint16_t getAttemptsLeft(tEraGlonassUveos *env, eEcallActivationType activationType){
|
||
if(activationType == AUTOMATIC_ACTIVATION){
|
||
return env->settings->ECALL_AUTO_DIAL_ATTEMPTS;
|
||
} else if(activationType == MANUAL_ACTIVATION){
|
||
return env->settings->ECALL_MANUAL_DIAL_ATTEMPTS;
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "==== ВНИМАНИЕ, КОЛИЧЕСТВО ПОПЫТОК ВЫЗОВОВ НЕ СКОНВИГУРИРОВАНО, БУДЕТ ВЫПОЛНЕНА 1 ПОПЫТКА!!! ====")
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
eEraGlonassUveos_EcallProcessingResult EraGlonassUveos_ProcessingEmergency(
|
||
tEraGlonassUveos *env,
|
||
eEcallActivationType activationType,
|
||
eEcallTestMode testMode,
|
||
bool debugMode
|
||
) {
|
||
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Обработка экстреной ситуации...")
|
||
env->currentMsd->msd.MSD_Data.msgId = 1;
|
||
tMsdEncoded msdEncoded;
|
||
|
||
EraGlonassUveos_GenCurrentMsd(env, activationType, testMode, RTC_TIME_SOURSE);
|
||
uint16_t attemptsLeft = getAttemptsLeft(env, activationType);
|
||
env->currentMsd->attemptsLeft = env->settings->INT_MEM_TRANSMIT_ATTEMPTS;
|
||
uint32_t dialTimeout = SystemGetMs() + (env->settings->ECALL_DIAL_DURATION * 60 * 1000);
|
||
|
||
// if(testMode != TEST_CALL) {
|
||
// EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_INITIATE);
|
||
// }
|
||
|
||
eEraGlonassUveos_EcallProcessingResult resultSendEmergy = ERA_GLONASS_UVEOS_CALL_FAIL;
|
||
|
||
bool pr_mndSendFlag = false;
|
||
bool fl_audio = false;
|
||
|
||
while (((SystemGetMs() < dialTimeout)) && (attemptsLeft > 0)) {
|
||
|
||
if(fl_audio == true) {
|
||
#if (AURUS_CAR_UI == 1)
|
||
if(testMode != TEST_CALL) {
|
||
DEVTST_PLAY_SAMPLE("emerCool_aurus.mp3")
|
||
}
|
||
#endif
|
||
#if (AURUS_CAR_UI == 0)
|
||
DEVTST_PLAY_SAMPLE("ecall_on.mp3")
|
||
#endif
|
||
}
|
||
fl_audio = true;
|
||
|
||
// if(testMode != TEST_CALL) {
|
||
// EraGlonassUveos_Indicate(env, UVEOS_STATUS_DIALING);
|
||
// }
|
||
|
||
// EraGlonassUveos_Indicate(env, UVEOS_STATUS_WAIT_NETWORK);
|
||
// bool isReg = EraGlonassEcallProvider_NetRegistration(env->ecallProvider,1);
|
||
// if(isReg == false)
|
||
// {
|
||
// EraGlonassEcallProvider_NetRegistration(env->ecallProvider,1);
|
||
// SystemDelayMs(2000);
|
||
// }
|
||
|
||
resultSendEmergy = EraGlonassUveos_EmergencyCallTry(
|
||
env,
|
||
&msdEncoded,
|
||
activationType,
|
||
testMode,
|
||
dialTimeout,
|
||
&pr_mndSendFlag,
|
||
debugMode
|
||
);
|
||
EraGlonassEcallProvider_HangupEcl(env->ecallProvider);
|
||
if(debugMode) {
|
||
return resultSendEmergy;
|
||
}
|
||
|
||
if (resultSendEmergy == ERA_GLONASS_UVEOS_CALL_USER_BREAK) {
|
||
return resultSendEmergy;
|
||
}
|
||
|
||
if ((pr_mndSendFlag) && (resultSendEmergy == ERA_GLONASS_UVEOS_CALL_SUCCESS)) {
|
||
--attemptsLeft;
|
||
break;
|
||
}
|
||
--attemptsLeft;
|
||
EraGlonassEcallProvider_HangupEcl(env->ecallProvider);
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
env->currentMsd->msd.MSD_Data.msgId++;
|
||
if(env->currentMsd->msd.MSD_Data.msgId == (getAttemptsLeft(env, activationType)) +1 ) {
|
||
env->currentMsd->msd.MSD_Data.msgId = getAttemptsLeft(env, activationType);
|
||
}
|
||
dialTimeout = SystemGetMs() + (env->settings->ECALL_DIAL_DURATION * 60 * 1000);
|
||
}
|
||
if(debugMode) {
|
||
return resultSendEmergy;
|
||
}
|
||
if (resultSendEmergy == ERA_GLONASS_UVEOS_CALL_SUCCESS) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Произведен успешный экстренный вызов")
|
||
|
||
EraGlonassUveos_ClearSms(env);
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "СМС пакеты очищены из памяти коммуникационного модуля")
|
||
env->currentMsd->attemptsLeft = 0;
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
}
|
||
env->currentMsd = EraGlonassMsdTable_GetNextFree(env->msdTable);
|
||
return resultSendEmergy;
|
||
} else if ((resultSendEmergy == ERA_GLONASS_UVEOS_CALL_FAIL) || (resultSendEmergy == ERA_GLONASS_UVEOS_SEND_FAIL)) {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN,
|
||
"Не удалось совершить отправку МНД, производиться проверка сети и попытка отправки МНД по средствам СМС")
|
||
// bool isReg = EraGlonassEcallProvider_NetRegistration(env->ecallProvider,1);
|
||
if (EraGlonassEcallProvider_CheckNetState(env->ecallProvider, 5) == true) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует")
|
||
|
||
#if (AURUS_CAR_UI == 1)
|
||
DEVTST_PLAY_TONE(1)
|
||
#endif
|
||
#if (AURUS_CAR_UI == 0)
|
||
DEVTST_PLAY_SAMPLE("msd_send.mp3")
|
||
#endif
|
||
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_FAILURE);
|
||
}
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_MSD_TRANSMIT);
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, &msdEncoded);
|
||
resultSendEmergy = EraGlonassUveos_ProcessingSms(env, &msdEncoded);
|
||
} else {
|
||
bool isReg = EraGlonassEcallProvider_NetRegistration(env->ecallProvider,1);
|
||
if(isReg){
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует")
|
||
|
||
#if (AURUS_CAR_UI == 1)
|
||
DEVTST_PLAY_TONE(1)
|
||
#endif
|
||
#if (AURUS_CAR_UI == 0)
|
||
DEVTST_PLAY_SAMPLE("msd_send.mp3")
|
||
#endif
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_FAILURE);
|
||
}
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_MSD_TRANSMIT);
|
||
EraGlonassUveos_CompileMsd(env, &env->currentMsd->msd, &msdEncoded);
|
||
resultSendEmergy = EraGlonassUveos_ProcessingSms(env, &msdEncoded);
|
||
} else {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть отсутствует")
|
||
}
|
||
}
|
||
}
|
||
|
||
if ((pr_mndSendFlag) || ((int) resultSendEmergy == ERA_GLONASS_UVEOS_SMS_SENT)) {
|
||
LoggerInfoStatic(LOGGER, LOG_SIGN, "МНД отправлено по средствам СМС")
|
||
env->currentMsd->msd.MSD_Data.msgId ++;
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_MSD_TRANSMIT);
|
||
}
|
||
}
|
||
|
||
if ((!pr_mndSendFlag) || ((int) resultSendEmergy == ERA_GLONASS_UVEOS_SEND_FAIL)) {
|
||
LoggerErrorStatic(LOGGER, LOG_SIGN, "Не удалось отправить МНД по средствам СМС ECALL")
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveos_Indicate(env, UVEOS_STATUS_CALL_FAILURE);
|
||
}
|
||
}
|
||
|
||
if ((resultSendEmergy == ERA_GLONASS_UVEOS_SEND_FAIL) || (resultSendEmergy == ERA_GLONASS_UVEOS_CALL_FAIL)) {
|
||
env->currentMsd->attemptsLeft = env->settings->INT_MEM_TRANSMIT_ATTEMPTS;
|
||
} else {
|
||
env->currentMsd->attemptsLeft = 0;
|
||
}
|
||
|
||
EraGlonassUveos_ClearSms(env);
|
||
if(testMode != TEST_CALL) {
|
||
EraGlonassUveosDumper_ForceDump(env->dumper);
|
||
}
|
||
|
||
env->currentMsd = EraGlonassMsdTable_GetNextFree(env->msdTable);
|
||
|
||
return resultSendEmergy;
|
||
} |