UveosOnNation_VEGA_MainMode.../MainModesArbiter.c

741 lines
31 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 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 "EgtsProcessing.h"
//#include "testCan.h"
#define LOG_SIGN "Главн."
#define LOGGER &env->slog.logger
void TELEMATICA_START(tMma *env) {
env->storage.runtime.EGTS_FLEET_ON = true;
}
void TELEMATICA_STOP(tMma *env) {
if (env->storage.runtime.EGTS_FLEET_ON == true) {
env->storage.runtime.EGTS_FLEET_ON = false;
for (uint8_t i = 0; i < 30; ++i) {
if (env->storage.runtime.telematicaCloseConnect)
break;
SystemDelayMs(100);
}
}
}
size_t str_len = 0;
char step[5];
void Mma_Init(
tMma *env,
tGpios *gpios,
tSerialPorts *serialPorts,
tI2cPorts *i2cPorts,
tSpiPorts *spiPorts,
tAdcs *adcs,
tStorageOnFlash *flash,
tRtc *rtc
) {
env->gpios = gpios;
env->serialPorts = serialPorts;
env->i2cPorts = i2cPorts;
env->spiPorts = spiPorts;
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 = 0;
env->flIgn = false;
env->kzModeBloc = false;
}
void Mma_Shutdown(tMma *env) {
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, "Возможно произошло повторное включение пользователем")
SystemDelayMs(5000);
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 = AdcGet(&env->adcs->batteryIo, 10);
volt = (float) single / 1000;
if (volt < 2.8) {
Mma_Shutdown(env);
}
}
}
}
void Mma_CheckShutdown(tMma *env, bool fastBlackOut) {
bool statShutdown = Pwm_IsShutdownRequired(&env->power);
bool statStandUp = EraGlonassUveos_IsStandby(&env->uveos);
if (statShutdown && (!statStandUp)) {
Mma_Shutdown(env);
} else {
if (env->storage.runtime.EGTS_FLEET_ON == false)
TELEMATICA_START(env);
}
Mma_CheckShutdownIsBattary(env);
}
static void Mma_SetNetworkRegistration(tMma *env, bool value) {
#ifdef USE_GSM_AND_GNSS_TELIT
GsmWithGnss_SetNetworkRegistration(&env->gsmWithGnss, value);
#endif
#ifdef USE_GSM_AND_GNSS_SIMCOM
Gsm_SetNetworkRegistration(&env->gsm, value);
#endif
}
static bool Mma_WaitNetworkRegistration(tMma *env) {
#ifdef USE_GSM_AND_GNSS_TELIT
return GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 35000);
#endif
#ifdef USE_GSM_AND_GNSS_SIMCOM
return Gsm_WaitNetworkRegistration(&env->gsm);
#endif
}
void Mma_AudioSignal(tMma *env, uint8_t count, uint16_t timeout) {
#ifdef USE_GSM_AND_GNSS_TELIT
for (uint8_t i = 0; i < count; i++) {
if (AtGsmSetOpenAudioLoop(&env->gsmWithGnss.gsmAt, 1)) {
SystemDelayMs(timeout);
AtGsmSetOpenAudioLoop(&env->gsmWithGnss.gsmAt, 0);
}
SystemDelayMs(timeout);
}
#endif
#ifdef USE_GSM_AND_GNSS_SIMCOM
for (uint8_t i = 0; i < count; i++) {
if (AtGsmSetOpenAudioLoop(&env->gsm.gsmAt, 1)) {
SystemDelayMs(timeout);
AtGsmSetOpenAudioLoop(&env->gsm.gsmAt, 0);
}
SystemDelayMs(timeout);
}
#endif
}
void Mma_GarageMode(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим Гараж")
GpioPinEnable(&env->power.pins->main.garage);
env->storage.nvm.device.garageMode = true;
DeviceStorage_ForceDump(&env->storage);
EraGlonassUveos_GarageStarted(&env->uveos);
tUserInputButtonEvent buttonEvent;
while (1) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Режим Гараж")
if (env->storage.runtime.enableGnssUpdate) {
// GsmWithGnss_GetNevData(&env->gsmWithGnss, 600);
AtGsm_Gsnss_GetNMEA_Pack(&env->gsmWithGnss, 400);
EraGlonassUveos_DoNothingModeDistance(&env->uveos, false);
}
if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_DISABLED) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Автоматический выход из режима Гараж")
GpioPinDisable(&env->power.pins->main.garage);
env->storage.nvm.device.garageMode = false;
DeviceStorage_ForceDump(&env->storage);
EraGlonassUveos_DoNotingReset(&env->uveos);
return;
}
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIsBetween(buttonEvent, UI_BUTTON_ADDITIONAL, RAISE, 10000, 0xFFFF)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пользовательский выход из режима Гараж")
GpioPinDisable(&env->power.pins->main.garage);
env->storage.nvm.device.garageMode = false;
DeviceStorage_ForceDump(&env->storage);
EraGlonassUveos_DoNotingReset(&env->uveos);
return;
}
}
if (DeviceTesting_Always(&env->testing)) {
Mma_SetMode(env, DEVICE_MODE_FAILURE);
} else {
Mma_SetMode(env, DEVICE_MODE_UVEOS_GARAG);
}
Mma_CheckShutdown(env, true);
SystemDelayMs(1000);
}
}
void Mma_NetworkAndAudioRequireKz(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включаем звук");
Pwm_AudioEnable(&env->power);
//todo пока что включен всегда
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поднимаем сигнал MUTE");
Pwm_SetMute(&env->power, true);
}
void Mma_NetworkAndAudioRequire(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включаем звук");
Pwm_AudioEnable(&env->power);
//todo пока что включен всегда
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поднимаем сигнал MUTE");
Pwm_SetMute(&env->power, true);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включаем регистрацию в сети");
Mma_SetNetworkRegistration(env, true);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Ждем сеть...");
if (Mma_WaitNetworkRegistration(env)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "зарегестрировались");
} else {
LoggerErrorStatic(LOGGER, LOG_SIGN, "нет сети");
};
}
static void Mma_NetworkAndAudioRelease(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Выключаем сигнал MUTE");
Pwm_SetMute(&env->power, false);
uint32_t t = SystemGetMs() + 200;
while (t > SystemGetMs()) {}
}
void Mma_EcallManual(tMma *env) {
EraGlonassUveos_SetTimings(&env->uveos);
Mma_SetMode(env, DEVICE_MODE_UVEOS_CALL_INITIATE);
Mma_NetworkAndAudioRequire(env);
GpioPinEnable(&env->power.pins->main.ecall);
env->uveos.currentMsd->msd.MSD_Data.msgId = 1;
EraGlonassUveos_ManualEmergencyCall(&env->uveos, false);
GpioPinDisable(&env->power.pins->main.ecall);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 0);
SystemDelayMs(500);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 1);
Mma_NetworkAndAudioRelease(env);
}
void Mma_EcallManualKZ(tMma *env) {
EraGlonassUveos_SetTimings(&env->uveos);
Mma_SetMode(env, DEVICE_MODE_UVEOS_CALL_INITIATE);
Mma_NetworkAndAudioRequireKz(env);
GpioPinEnable(&env->power.pins->main.ecall);
env->uveos.currentMsd->msd.MSD_Data.msgId = 1;
EraGlonassUveos_ManualEmergencyCall(&env->uveos, true);
GpioPinDisable(&env->power.pins->main.ecall);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 0);
SystemDelayMs(500);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 1);
Mma_NetworkAndAudioRelease(env);
}
void Mma_gnssUpdate(tMma *env, eDeviceModes *deviceModes) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обновление ГНСС")
if (env->storage.runtime.enableGnssUpdate == true) {
EraGlonassUveosNavData location;
if ((*deviceModes != DEVICE_MODE_TESTING) && (*deviceModes != DEVICE_MODE_UVEOS_GARAG)) {
GsmWithGnss_GetNevData(&env->gsmWithGnss, 600);
AtGsm_Gsnss_GetLastActualNavData(&env->gsmWithGnss, &location, 1);
if (env->gsmWithGnss.gnss.currentRmc.status == 'A') {
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;
}
*deviceModes = GsmWithGnss_IsGnssReady(&env->gsmWithGnss) ?
DEVICE_MODE_UVEOS_ERA_GNSS_READY :
DEVICE_MODE_UVEOS_ERA_WAIT_GNSS;
} else {
AtGsm_Gsnss_GetLastActualNavData(&env->gsmWithGnss, &location, 0);
}
} else {
*deviceModes = DEVICE_MODE_UVEOS_ERA_WAIT_GNSS;
}
}
void Mma_EcallAutomatic(tMma *env, tUveosEmergencyEvent emergencyEvent) {
EraGlonassUveos_SetTimings(&env->uveos);
Pwm_AudioEnable(&env->power);
Mma_SetMode(env, DEVICE_MODE_UVEOS_CALL_INITIATE);
Mma_NetworkAndAudioRequire(env);
GpioPinEnable(&env->power.pins->main.ecall);
Mma_AudioSignal(env, 1, 500);
GsmWithGnss_GetNevData(&env->gsmWithGnss, 600);
eEraGlonassUveos_EcallProcessingResult res = EraGlonassUveos_ProcessingEmergencyEvent(&env->uveos, &emergencyEvent);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 0);
SystemDelayMs(1000);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 1);
GpioPinDisable(&env->power.pins->main.ecall);
Mma_NetworkAndAudioRelease(env);
}
static void Mma_UserTestMode(tMma *env) {
Mma_NetworkAndAudioRequire(env);
Mma_SetNetworkRegistration(env, true);
AtGsm_Gsnss_GetNMEA_Pack(&env->gsmWithGnss, 500);
EraGlonassUveos_TestingStarted(&env->uveos);
if (DeviceTesting_RunUserTests(&env->testing) == true) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пользовательское тестирование завершено");
DeviceTesting_ExitTestPlay(&env->testing);
}
env->gsmWithGnss.isBusy = false;
Mma_NetworkAndAudioRelease(env);
}
static void Mma_ProcessCallAnswer(tMma *env) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Включаем звук");
Pwm_AudioEnable(&env->power);
GpioPinEnable(&env->power.pins->main.ecall);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Поднимаем сигнал MUTE");
Pwm_SetMute(&env->power, true);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Получен вызов от оператора");
AudioPlayer_PlayStatic(&env->gsmWithGnss.audioPlayer, "audio_on", 8 * 1000);
SystemDelayMs(500);
AtGsmAnswer(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов от оператора принят");
Mma_SetMode(env, DEVICE_MODE_UVEOS_CALL_ACTIVE);
bool wasNewSetMsd = false;
bool wasResent = false;
bool mndSendFlag = true;
// tMsdEncoded msdEncoded;
// env->uveos.currentMsd->msd.MSD_Data.msgId = 1;
// setMsdToPull(&env->uveos, &mndSendFlag, &wasNewSetMsd, &wasResent, &msdEncoded);
while (GsmWithGnss_isInpCallActive(&env->gsmWithGnss)) {
SystemDelayMs(500);
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Вызов от оператора завершён");
while (AtGsmHangUpCall(&env->gsmWithGnss.gsmAt) == AT_OK) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "поднят HangUp");
GsmWithGnss_ResetRing(&env->gsmWithGnss);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Выполнен сброс Ринга");
Pwm_AudioDisable(&env->power);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Питание УНЧ отключено");
Mma_NetworkAndAudioRelease(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сигнал MUTE бортовой сети отключен");
Pwm_SetMute(&env->power, false);
GpioPinDisable(&env->power.pins->main.ecall);
SystemDelayMs(500);
break;
}
}
void Mma_TestingThread(tMma *env) {
eDeviceModes indicationState;
while (1) {
// Mma_gnssUpdate(env, &indicationState);
if (DeviceTesting_Always(&env->testing)) {
indicationState = DEVICE_MODE_FAILURE;
};
if (DeviceTesting_Periodical(&env->testing)) {
indicationState = DEVICE_MODE_FAILURE;
};
Mma_SetMode(env, indicationState);
SystemDelayMs(10);
}
}
static _Noreturn void Mma_Thread(tMma *env) {
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE);
PWR_BackupAccessEnable(ENABLE);
RCC_EnableBackupReset(DISABLE);
//Запуск устройства
Mma_InitStage(env);
EgtsProcessing_Init(
&env->egtsProcessing,
&env->storage,
&env->power.pins->main.ignition,
&env->gsmWithGnss,
&env->rtc->rtcIo,
&env->slog
);
EgtsProcessing_Start(&env->egtsProcessing);
volatile size_t size = xPortGetMinimumEverFreeHeapSize();
uint32_t sizeStorage = sizeof(tDeviceDataNonVolatile);
LoggerStrFormatInfo(LOGGER, LOG_SIGN, "Свободно %u байт в куче. Размер хранилища %u", size, sizeStorage);
eDeviceModes indicationState;
tUserInputButtonEvent buttonEvent;
tUveosEmergencyEvent emergencyEvent;
if (env->storage.nvm.device.garageMode) {
Mma_GarageMode(env);
}
while (!EraGlonassUveos_IsEraAllowed(&env->uveos)) {
Mma_SetMode(env, DEVICE_MODE_UVEOS_PASSIVE);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Пассивный режим, сконфигурируйте устройство!")
if (DeviceTesting_Always(&env->testing)) {
Mma_SetMode(env, DEVICE_MODE_FAILURE);
} else {
Mma_SetMode(env, DEVICE_MODE_UVEOS_PASSIVE);
}
LoggerTraceStatic(LOGGER, LOG_SIGN, "Проверяем нажатия кнопок")
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIsBetween(buttonEvent, UI_BUTTON_ADDITIONAL, RAISE, 3000, 10000)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Переход в режим пользовательского тестирования")
Mma_SetMode(env, DEVICE_MODE_TESTING);
Mma_UserTestMode(env);
}
}
if (!GpioPinGet(&env->power.pins->main.ignition) && (env->indication.mode == DEVICE_MODE_UVEOS_PASSIVE)) {
env->power.shutdownDelay = 2000;
Mma_Shutdown(env);
}
Mma_CheckShutdown(env, true);
SystemDelayMs(1000);
}
LoggerInfoStatic(LOGGER, LOG_SIGN, "Запуск главного цикла")
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обработка режима ЭРА внутри УВЭОС")
// Mma_SetNetworkRegistration(env, true);
// EraGlonassUveos_ProcessingEra(&env->uveos);
// Mma_SetNetworkRegistration(env, false);
volatile uint32_t noSendMsdCount = EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable);
if (noSendMsdCount > 0) {
if (GsmWithGnss_NetworkEnableInnaterups(&env->gsmWithGnss, 4, 10000) == AT_OK) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Сеть включена")
EraGlonassUveos_ProcessingEra(&env->uveos);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
SystemDelayMs(5000);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
AtGsm_OperatorSelectionDeregister(&env->gsmWithGnss.gsmAt);
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует");
}
} else {
TELEMATICA_START(env);
}
Pwm_AudioDisable(&env->power);
LoggerTraceStatic(LOGGER, LOG_SIGN, "Звуковой усилитель отключён")
SystemDelayMs(100);
// Mma_StartTestThreadStart(env);
for (;;) {
Mma_ColorBip(env);
if (env->storage.runtime.EGTS_FLEET_ON == false) {
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
Mma_gnssUpdate(env, &indicationState);
osMutexRelease(env->gsmWithGnss.gsmAt.access);
} else {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Ошибка доступа (1)")
}
} else {
if (osMutexAcquire(env->gsmWithGnss.gsmAt.access, 1000) == osOK) {
AtGsm_Gsnss_GetNMEA_Pack(&env->gsmWithGnss, 400);
osMutexRelease(env->gsmWithGnss.gsmAt.access);
SystemDelayMs(1000);
} else {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Ошибка доступа (2)")
}
}
LoggerTraceStatic(LOGGER, LOG_SIGN, "Начало итерации главного цикла")
LoggerTraceStatic(LOGGER, LOG_SIGN, "Проверяем нужна ли сеть...")
if (EraGlonassUveos_IsRequireNetwork(&env->uveos)) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Нужна, подключаемся")
Mma_SetNetworkRegistration(env, true);
} else {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Ненужна, отключаемся")
Mma_SetNetworkRegistration(env, false);
}
LoggerTraceStatic(LOGGER, LOG_SIGN, "Выполняем постоянный тест")
if (DeviceTesting_Always(&env->testing)) {
indicationState = DEVICE_MODE_FAILURE;
};
LoggerTraceStatic(LOGGER, LOG_SIGN, "Выполняем периодическое тестирование")
if (DeviceTesting_Periodical(&env->testing)) {
indicationState = DEVICE_MODE_FAILURE;
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обновляем статус индикации")
};
Mma_SetMode(env, indicationState);
// if(env->uveos.timings.lastInMemTransmit < SystemGetMs()){
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Периодическая проверка необходимости повторной отправки МНД");
// tEraGlonassMsdTableItem *item = NULL;
//
// volatile uint8_t noSendMsdCount = EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable);
// if(noSendMsdCount > 0) {
// GsmWithGnss_InvalidateNetworkEnable(&env->gsmWithGnss, 0, true);
// }
//// GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 5000);
//// EraGlonassUveos_ProcessingCheckNoSendMSD(&env->uveos);
// if ( GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 20000) ) {
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует");
// EraGlonassUveos_ProcessingCheckNoSendMSD(&env->uveos);
// } else {
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Периодическая проверка необходимости повторной отправки МНД не выполнена");
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует");
// }
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Время периодическая проверки повторной отправки МНД обновлено");
// env->uveos.timings.lastInMemTransmit =
// SystemGetMs() + (env->uveos.settings->INT_MEM_TRANSMIT_INTERVAL * 60 * 1000);
// }
if (env->uveos.timings.lastInMemTransmit < SystemGetMs()) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Периодическая проверка необходимости повторной отправки МНД");
noSendMsdCount = EraGlonassMsdTable_GetNoSendDataCount(env->uveos.msdTable);
if (noSendMsdCount > 0) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Проверка регистрации в сети");
if (GsmWithGnss_WaitNetworkRegistration(&env->gsmWithGnss, 2000)) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть присутствует");
EraGlonassUveos_ProcessingCheckNoSendMSD(&env->uveos);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление всех СМС...");
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
SystemDelayMs(500);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление СМС выполнено");
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует, попытка регистрации...");
if (GsmWithGnss_NetworkEnableInnaterups(&env->gsmWithGnss, 5, 40000) == AT_OK) {
LoggerTraceStatic(LOGGER, LOG_SIGN, "Сеть присутствует")
EraGlonassUveos_ProcessingCheckNoSendMSD(&env->uveos);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление всех СМС...");
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
SystemDelayMs(500);
AtGsmSms_DeleteAll(&env->gsmWithGnss.gsmAt);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Удаление СМС выполнено");
} else {
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Периодическая проверка необходимости повторной отправки МНД не выполнена");
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сеть или сим-чип отсутствует");
}
}
LoggerTraceStatic(LOGGER, LOG_SIGN, "Обработка не отправленных МНД выполнена")
}
env->uveos.timings.lastInMemTransmit =
SystemGetMs() + (env->uveos.settings->INT_MEM_TRANSMIT_INTERVAL * 60 * 1000);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Время периодическая проверки повторной отправки МНД обновлено");
}
// LoggerTraceStatic(LOGGER, LOG_SIGN, "Проверяем экстренное событие")
// if (UveosEmergencyEvent_GetNext(&env->crashDetect.emergencyEvents, &emergencyEvent, 0)) {
// if(env->storage.nvm.gost.CRASH_SIGNAL_INTERNAL == 1) {
// LoggerInfoStatic(LOGGER, LOG_SIGN, "Экстренное событие получено");
// Mma_EcallAutomatic(env, emergencyEvent);
// }
// }
LoggerTraceStatic(LOGGER, LOG_SIGN, "Проверяем экстренное событие")
if (UveosEmergencyEvent_GetNext(&env->crashDetect.emergencyEvents, &emergencyEvent, 0)) {
if (env->storage.nvm.gost.CRASH_SIGNAL_INTERNAL == 1) {
Mma_EcallManualKZ(env);
// DeviceTesting_EcallKZ1(&env->testing);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Экстренное событие получено");
// Mma_EcallAutomatic(env, emergencyEvent);
}
}
LoggerTraceStatic(LOGGER, LOG_SIGN, "Проверяем нажатия кнопок")
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (env->kzModeBloc == false) {
if (UserInputButtonEventIsBetween(
buttonEvent, UI_BUTTON_EMERGENCY, RAISE, env->storage.nvm.gost.SOS_BUTTON_TIME, 0xFFFF
)) {
TELEMATICA_STOP(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Нажата кнопка экстренного вызова KZ 1")
uint32_t tmt = SystemGetMs() + 10000;
UserButtons_Clear(&env->userInput.buttonsInterface);
while (tmt > SystemGetMs()) {
if (UserButtons_GetNext(&env->userInput.buttonsInterface, &buttonEvent, 10)) {
if (UserInputButtonEventIsBetween(
buttonEvent, UI_BUTTON_EMERGENCY, RAISE, env->storage.nvm.gost.SOS_BUTTON_TIME,
0xFFFF
)) {
TELEMATICA_STOP(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Нажата кнопка экстренного вызова KZ 2")
EraGlonassUveos_SetTimings(&env->uveos);
Mma_SetMode(env, DEVICE_MODE_UVEOS_CALL_INITIATE);
Mma_NetworkAndAudioRequireKz(env);
GpioPinEnable(&env->power.pins->main.ecall);
env->uveos.currentMsd->msd.MSD_Data.msgId = 1;
DeviceTesting_EcallKZ(&env->testing);
// Mma_EcallManualKZ(env);
env->kzModeBloc = true;
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 0);
SystemDelayMs(500);
AtGsmTelitLe910_Gnss_ReStartReceiver(&env->gsmWithGnss.gsmAt, 1);
Mma_NetworkAndAudioRelease(env);
}
}
SystemDelayMs(10);
}
if (env->kzModeBloc == false) {
TELEMATICA_STOP(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Нажата кнопка экстренного вызова_1")
Mma_EcallManual(env);
}
UserButtons_Clear(&env->userInput.buttonsInterface);
}
} else if (UserInputButtonEventIsBetween(
buttonEvent, UI_BUTTON_EMERGENCY, RAISE, env->storage.nvm.gost.SOS_BUTTON_TIME, 0xFFFF
)) {
TELEMATICA_STOP(env);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Нажата кнопка экстренного вызова_2")
Mma_EcallManual(env);
} else if (UserInputButtonEventIsBetween(buttonEvent, UI_BUTTON_ADDITIONAL, RAISE, 3000, 10000)) {
TELEMATICA_STOP(env);
vAsciiStringInit(step, &str_len, 5);
vAsciiStringAddDecimalInt64(step, &str_len, env->uveos.doNothing.movDist, 5);
if (env->uveos.doNothing.mode == UVEOS_DO_NOTHING_DISABLED) {
Mma_SetMode(env, DEVICE_MODE_TESTING);
LoggerInfoStatic(LOGGER, LOG_SIGN,
"Переход в режим пользовательского тестирования, отклонение дистанции = ");
LoggerInfo(LOGGER, LOG_SIGN, step, str_len);
Mma_UserTestMode(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 не достоверны!");
}
} else if (UserInputButtonEventIsBetween(buttonEvent, UI_BUTTON_ADDITIONAL, RAISE, 10000, 30000)) {
vAsciiStringInit(step, &str_len, 5);
vAsciiStringAddDecimalInt64(step, &str_len, env->uveos.doNothing.movDist, 5);
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 не достоверны!");
}
}
}
if (env->storage.runtime.EGTS_FLEET_ON == false) {
if (EraGlonassUveos_IsAllowInCall(&env->uveos) && GsmWithGnss_IsRing(&env->gsmWithGnss)) {
Mma_ProcessCallAnswer(env);
}
Mma_CheckIncomingSms(env);
}
Mma_CheckShutdown(env, false);
SystemDelayMs(10);
}
}
void Mma_StartTestThreadStart(tMma *env) {
if (!env->threadTesting.id) {
env->threadTesting.id = osThreadNew(
(osThreadFunc_t) (Mma_TestingThread),
(void *) (env),
&env->threadTesting.attr
);
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сопроводительный поток запущен")
}
}
void Mma_StopTestThreadStart(tMma *env) {
if (env->threadTesting.id != NULL) {
if (osThreadTerminate(env->threadTesting.id) == osOK) {
SystemDelayMs(100);
env->threadTesting.id = NULL;
LoggerInfoStatic(LOGGER, LOG_SIGN, "Сопроводительный поток остановлен")
SystemDelayMs(500);
}
}
}
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);
}
}