198 lines
6.6 KiB
C
198 lines
6.6 KiB
C
/*
|
|
* UserIndication.c
|
|
*
|
|
* Created on: Jun 3, 2021
|
|
* Author: zemon
|
|
*/
|
|
|
|
#include "UserIndication.h"
|
|
#include <SystemDelayInterface.h>
|
|
#include <CmsisRtosThreadUtils.h>
|
|
|
|
//static void UserIndication_SetModeUveos(tUserIndication *env, tEraGlonassUveosStatus mode);
|
|
|
|
static void UserIndication_OnBoard(tUserIndication *env, uint8_t flags);
|
|
|
|
static void UserIndication_Update(tUserIndication *env);
|
|
|
|
static const uint8_t BOARD_OFF = (0);
|
|
static const uint8_t BOARD_RED = (0x1 << 0);
|
|
static const uint8_t BOARD_GREEN = (0x1 << 1);
|
|
static const uint8_t BOARD_BLUE = (0x1 << 2);
|
|
|
|
void UserIndication_Init(
|
|
tUserIndication *env,
|
|
eDeviceModes initMode
|
|
// tRedGreenLed *uiuLed,
|
|
// tOnBoardLed *onBoardLed
|
|
) {
|
|
// env->uiuLed = uiuLed;
|
|
// env->onBoardLed = onBoardLed;
|
|
env->mode = initMode;
|
|
UserIndication_Update(env);
|
|
|
|
// env->uveosIndicator.env = env;
|
|
// env->uveosIndicator.show = (void *) UserIndication_SetModeUveos;
|
|
|
|
InitThreadAtrStatic(&env->thread.attr, "Indication", env->thread.controlBlock, env->thread.stack, osPriorityNormal);
|
|
env->thread.id = 0;
|
|
}
|
|
|
|
void UserIndication_SetMode(tUserIndication *env, eDeviceModes mode) {
|
|
if (env->mode != mode) {
|
|
env->mode = mode;
|
|
UserIndication_Update(env);
|
|
}
|
|
}
|
|
|
|
#define UVEOS_TO_DEV_MODE(NAME) case UVEOS_STATUS_##NAME: UserIndication_SetMode(env, DEVICE_MODE_UVEOS_##NAME); return;
|
|
/*
|
|
static void UserIndication_SetModeUveos(tUserIndication *env, tEraGlonassUveosStatus mode) {
|
|
switch (mode) {
|
|
UVEOS_TO_DEV_MODE(CALL_INITIATE)
|
|
UVEOS_TO_DEV_MODE(DIALING)
|
|
UVEOS_TO_DEV_MODE(MSD_TRANSMIT)
|
|
UVEOS_TO_DEV_MODE(SMS_TRANSMIT)
|
|
UVEOS_TO_DEV_MODE(CALL_ACTIVE)
|
|
UVEOS_TO_DEV_MODE(CALL_FAILURE)
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
*/
|
|
//
|
|
////лучше использовать конкретные значения UIU_GREEN/UIU_RED/UIU_ORANGE
|
|
////одновременное использование через | даст оражевый цвет индикатора БИП в любом случае
|
|
//void UserIndication_Uiu(tUserIndication *env, uint8_t value) {
|
|
// GpioPinSet(&env->uiuLed->red, value & BOARD_RED);
|
|
// GpioPinSet(&env->uiuLed->green, value & BOARD_GREEN);
|
|
//}
|
|
//
|
|
////можно использовать несколько флагов через | чтобы включит одновремнно разные светодиоды
|
|
////например BOARD_GREEN| BOARD_RED включит красный и зеленый светодиоды на блоке
|
|
//static void UserIndication_OnBoard(tUserIndication *env, uint8_t flags) {
|
|
// GpioPinSet(&env->onBoardLed->red, flags & BOARD_RED);
|
|
// GpioPinSet(&env->onBoardLed->green, flags & BOARD_GREEN);
|
|
// GpioPinSet(&env->onBoardLed->blue, flags & BOARD_BLUE);
|
|
//}
|
|
|
|
|
|
void UserIndication_UiuError(tUserIndication *env) {
|
|
UserIndication_Uiu(env, UIU_RED);
|
|
}
|
|
|
|
tStringStatic eDeviceModesNames[] = {
|
|
StringStaticInit("Запуск"),
|
|
StringStaticInit("Тестирование"),
|
|
StringStaticInit("Ожидание загрузки GSM"),
|
|
|
|
StringStaticInit("Ошибка памяти"),
|
|
StringStaticInit("Ошибка GSM"),
|
|
StringStaticInit("Ошибка Кодека"),
|
|
|
|
StringStaticInit("Обнаружен сбой"),
|
|
StringStaticInit("Ошибка начального тестирования 1"),
|
|
StringStaticInit("Ошибка начального тестирования 2"),
|
|
|
|
StringStaticInit("ЭРА (нет ГНСС)"),
|
|
StringStaticInit("ЭРА"),
|
|
|
|
StringStaticInit("Экстренный вызов (подготовка)"),
|
|
StringStaticInit("Дозвон"),
|
|
StringStaticInit("Отправка МНД"),
|
|
StringStaticInit("Отправка SMS"),
|
|
StringStaticInit("Голосовое соединение"),
|
|
StringStaticInit("Ошибка соединения"),
|
|
|
|
StringStaticInit("Пассивный режим"),
|
|
StringStaticInit("Входящий вызов"),
|
|
StringStaticInit("Режим гараж"),
|
|
};
|
|
|
|
|
|
//void UserIndicationUpdateLed(tUserIndication *env) {
|
|
//
|
|
// switch (env->mode) {
|
|
// case DEVICE_MODE_STARTUP: {
|
|
// bool blink = env->tick < 5;
|
|
// UserIndication_Uiu(env, blink ? UIU_RED : UIU_OFF);
|
|
// UserIndication_OnBoard(env, blink ? (BOARD_RED) : BOARD_OFF);
|
|
// break;
|
|
// }
|
|
//
|
|
// case DEVICE_MODE_ERROR_GSM: {
|
|
// UserIndication_Uiu(env, UIU_RED);
|
|
// UserIndication_OnBoard(env, BOARD_BLUE);
|
|
// break;
|
|
// }
|
|
// case DEVICE_MODE_ERROR_CODEC: {
|
|
// UserIndication_Uiu(env, UIU_RED);
|
|
// UserIndication_OnBoard(env, BOARD_GREEN);
|
|
// break;
|
|
// }
|
|
// case DEVICE_MODE_ERROR_FLASH: {
|
|
// UserIndication_Uiu(env, UIU_RED);
|
|
// UserIndication_OnBoard(env, BOARD_RED);
|
|
// break;
|
|
// }
|
|
//
|
|
// case DEVICE_MODE_WAIT_GSM_BOOT: {
|
|
// UserIndication_Uiu(env, UIU_GREEN);
|
|
// UserIndication_OnBoard(env, BOARD_GREEN | ((env->tick < 5) ? BOARD_BLUE : BOARD_OFF));
|
|
// break;
|
|
// }
|
|
//
|
|
// case DEVICE_MODE_UVEOS_ERA_WAIT_GNSS: {
|
|
// bool blink = env->tick < 5;
|
|
// UserIndication_Uiu(env, blink ? UIU_GREEN : UIU_OFF);
|
|
// UserIndication_OnBoard(env, blink ? (BOARD_GREEN) : BOARD_OFF);
|
|
// break;
|
|
// }
|
|
//
|
|
// case DEVICE_MODE_UVEOS_ERA_GNSS_READY: {
|
|
// bool blink = env->tick < 5;
|
|
// UserIndication_Uiu(env, UIU_GREEN);
|
|
// UserIndication_OnBoard(env, BOARD_BLUE | (blink ? (BOARD_GREEN) : BOARD_OFF));
|
|
// break;
|
|
// }
|
|
//
|
|
// default: {
|
|
// bool blink = env->tick < 5;
|
|
// UserIndication_Uiu(env, blink ? UIU_RED : UIU_OFF);
|
|
// UserIndication_OnBoard(env, blink ? (BOARD_RED) : BOARD_OFF);
|
|
// }
|
|
// }
|
|
//
|
|
//}
|
|
|
|
static void UserIndication_Update(tUserIndication *env) {
|
|
env->currentModeName = StringStaticGetLink(&eDeviceModesNames[env->mode]);
|
|
|
|
// UserIndicationUpdateLed(env);
|
|
|
|
env->tick = ((env->tick + 1) % 10);
|
|
}
|
|
|
|
static _Noreturn void UserIndication_Thread(tUserIndication *env) {
|
|
|
|
for (;;) {
|
|
UserIndication_Update(env);
|
|
|
|
SystemDelayMs(100);
|
|
}
|
|
}
|
|
|
|
void UserIndication_StartThread(tUserIndication *env) {
|
|
if (!env->thread.id) {
|
|
env->thread.id = osThreadNew((osThreadFunc_t) (UserIndication_Thread), (void *) (env), &env->thread.attr);
|
|
} else {
|
|
osThreadResume(env->thread.id);
|
|
}
|
|
}
|
|
|
|
void UserIndication_StopThread(tUserIndication *env) {
|
|
if (env->thread.id) {
|
|
osThreadSuspend(env->thread.id);
|
|
}
|
|
}
|