UveosOnNation_VEGA_MainMode.../MainModesArbiter.c

804 lines
32 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
#ifdef UVEOS_ADD_TELEMATICA
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);
}
}
}
#endif
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 {
#ifdef UVEOS_ADD_TELEMATICA
if (env->storage.runtime.EGTS_FLEET_ON == false)
TELEMATICA_START(env);
#endif
}
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 void checkLastInMemTransmit(tMma *env) {
if (env->uveos.timings.lastInMemTransmit < SystemGetMs()) {
LoggerInfoStatic(LOGGER, LOG_SIGN, "Периодическая проверка необходимости повторной отправки МНД");
volatile uint32_t 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, "Время периодическая проверки повторной отправки МНД обновлено");
}
}
static _Noreturn void Mma_Thread(tMma *env) {
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE);
PWR_BackupAccessEnable(ENABLE);
RCC_EnableBackupReset(DISABLE);
//Запуск устройства
Mma_InitStage(env);
#ifdef UVEOS_ADD_TELEMATICA
EgtsProcessing_Init(
&env->egtsProcessing,
&env->storage,
&env->power.pins->main.ignition,
&env->gsmWithGnss,
&env->rtc->rtcIo,
&env->slog
);
EgtsProcessing_Start(&env->egtsProcessing);
#endif
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 {
#ifdef UVEOS_ADD_TELEMATICA
TELEMATICA_START(env);
#endif
}
Pwm_AudioDisable(&env->power);
LoggerTraceStatic(LOGGER, LOG_SIGN, "Звуковой усилитель отключён")
// Mma_StartTestThreadStart(env);
for (;;) {
Mma_ColorBip(env);
#ifdef UVEOS_ADD_TELEMATICA
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)")
}
}
#endif
#ifndef UVEOS_ADD_TELEMATICA
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)")
}
#endif
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);
// }
#ifdef UVEOS_ADD_TELEMATICA
if (env->storage.runtime.EGTS_FLEET_ON == false) {
checkLastInMemTransmit(env);
}
#endif
#ifndef UVEOS_ADD_TELEMATICA
checkLastInMemTransmit(env);
#endif
// 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
)) {
#ifdef UVEOS_ADD_TELEMATICA
TELEMATICA_STOP(env);
#endif
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
)) {
#ifdef UVEOS_ADD_TELEMATICA
TELEMATICA_STOP(env);
#endif
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) {
#ifdef UVEOS_ADD_TELEMATICA
TELEMATICA_STOP(env);
#endif
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
)) {
#ifdef UVEOS_ADD_TELEMATICA
TELEMATICA_STOP(env);
#endif
LoggerInfoStatic(LOGGER, LOG_SIGN, "Нажата кнопка экстренного вызова_2")
Mma_EcallManual(env);
} else if (UserInputButtonEventIsBetween(buttonEvent, UI_BUTTON_ADDITIONAL, RAISE, 3000, 10000)) {
#ifdef UVEOS_ADD_TELEMATICA
TELEMATICA_STOP(env);
#endif
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 не достоверны!");
}
}
}
#ifdef UVEOS_ADD_TELEMATICA
if (env->storage.runtime.EGTS_FLEET_ON == false) {
if (EraGlonassUveos_IsAllowInCall(&env->uveos) && GsmWithGnss_IsRing(&env->gsmWithGnss)) {
Mma_ProcessCallAnswer(env);
}
Mma_CheckIncomingSms(env);
}
#endif
#ifndef UVEOS_ADD_TELEMATICA
if (EraGlonassUveos_IsAllowInCall(&env->uveos) && GsmWithGnss_IsRing(&env->gsmWithGnss)) {
Mma_ProcessCallAnswer(env);
}
Mma_CheckIncomingSms(env);
#endif
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);
}
}