|
@@ -9,6 +9,7 @@
|
|
#define MON_DELAY 1000
|
|
#define MON_DELAY 1000
|
|
|
|
|
|
osMessageQId menu_event;
|
|
osMessageQId menu_event;
|
|
|
|
+osMutexId menu_mutex;
|
|
osThreadId menu_update_handle;
|
|
osThreadId menu_update_handle;
|
|
osThreadId menu_control_handle;
|
|
osThreadId menu_control_handle;
|
|
|
|
|
|
@@ -17,6 +18,8 @@ bool update_flag = false;
|
|
|
|
|
|
static void vControl(void const *params);
|
|
static void vControl(void const *params);
|
|
static void vUpdate(void const *params);
|
|
static void vUpdate(void const *params);
|
|
|
|
+static osStatus menu_block(uint32_t ms);
|
|
|
|
+static void menu_unblock(void);
|
|
|
|
|
|
|
|
|
|
//
|
|
//
|
|
@@ -32,9 +35,14 @@ void menu_init(void)
|
|
v_task_event_handle = osThreadCreate(osThread(M_Event_Thread), NULL);
|
|
v_task_event_handle = osThreadCreate(osThread(M_Event_Thread), NULL);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+ // Очередь для управляющих сигналов меню
|
|
osMessageQDef(vButEventQueue, 1, uint8_t);
|
|
osMessageQDef(vButEventQueue, 1, uint8_t);
|
|
menu_event = osMessageCreate(osMessageQ(vButEventQueue), NULL);
|
|
menu_event = osMessageCreate(osMessageQ(vButEventQueue), NULL);
|
|
|
|
|
|
|
|
+ // Mutex для блокировки меню
|
|
|
|
+ osMutexDef(menu_mut);
|
|
|
|
+ menu_mutex = osMutexCreate(osMutex(menu_mut));
|
|
|
|
+
|
|
// События. Сигналы энкодера
|
|
// События. Сигналы энкодера
|
|
osThreadDef(control_thr, vControl, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
|
|
osThreadDef(control_thr, vControl, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
|
|
menu_control_handle = osThreadCreate(osThread(control_thr), NULL);
|
|
menu_control_handle = osThreadCreate(osThread(control_thr), NULL);
|
|
@@ -43,6 +51,7 @@ void menu_init(void)
|
|
osThreadDef(menu_up_thr, vUpdate, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
|
|
osThreadDef(menu_up_thr, vUpdate, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
|
|
menu_update_handle = osThreadCreate(osThread(menu_up_thr), NULL);
|
|
menu_update_handle = osThreadCreate(osThread(menu_up_thr), NULL);
|
|
|
|
|
|
|
|
+ // Начальный экран
|
|
selectedMenuItem = (menuItem *) &m_main;
|
|
selectedMenuItem = (menuItem *) &m_main;
|
|
(*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
|
|
(*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
|
|
|
|
|
|
@@ -69,17 +78,34 @@ static void vControl(void const *params)
|
|
for (;;)
|
|
for (;;)
|
|
{
|
|
{
|
|
event = osMessageGet(menu_event, 100);
|
|
event = osMessageGet(menu_event, 100);
|
|
|
|
+
|
|
if (event.status != osEventMessage)
|
|
if (event.status != osEventMessage)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
switch (event.value.v)
|
|
switch (event.value.v)
|
|
{
|
|
{
|
|
case CONTROL_FWD :
|
|
case CONTROL_FWD :
|
|
- printf("Encoder forward\r\n");
|
|
|
|
|
|
+ DBG printf("Encoder forward\r\n");
|
|
|
|
+ if (menu_block(0) == osOK) {
|
|
|
|
+ button_right();
|
|
|
|
+
|
|
|
|
+ //(*(selectedMenuItem->func_button_down))();
|
|
|
|
+ //(*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
|
|
|
|
+
|
|
|
|
+ menu_unblock();
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
|
|
|
|
case CONTROL_BACK :
|
|
case CONTROL_BACK :
|
|
- printf("Encoder back\r\n");
|
|
|
|
|
|
+ DBG printf("Encoder back\r\n");
|
|
|
|
+ if (menu_block(0) == osOK) {
|
|
|
|
+ button_left();
|
|
|
|
+
|
|
|
|
+ //(*(selectedMenuItem->func_button_down))();
|
|
|
|
+ //(*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
|
|
|
|
+
|
|
|
|
+ menu_unblock();
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
|
|
|
|
case CONTROL_PUSH :
|
|
case CONTROL_PUSH :
|
|
@@ -103,4 +129,17 @@ static void vUpdate(void const *params)
|
|
|
|
|
|
osDelay(MON_DELAY);
|
|
osDelay(MON_DELAY);
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//
|
|
|
|
+static osStatus menu_block(uint32_t ms)
|
|
|
|
+{
|
|
|
|
+ return osMutexWait(menu_mutex, ms);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+//
|
|
|
|
+static void menu_unblock(void)
|
|
|
|
+{
|
|
|
|
+ osMutexRelease(menu_mutex);
|
|
}
|
|
}
|