Răsfoiți Sursa

Работаю над навигацией по меню. Работает переход между экранами.

TelenkovDmitry 2 săptămâni în urmă
părinte
comite
eef22ace01

+ 41 - 2
desk/modules/menu/menu.cpp

@@ -9,6 +9,7 @@
 #define MON_DELAY           1000
 
 osMessageQId    menu_event;
+osMutexId   menu_mutex;
 osThreadId  menu_update_handle;
 osThreadId  menu_control_handle;
 
@@ -17,6 +18,8 @@ bool update_flag = false;
 
 static void vControl(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);
 #endif
     
+    // Очередь для управляющих сигналов меню
     osMessageQDef(vButEventQueue, 1, uint8_t);
     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);
     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);
     menu_update_handle = osThreadCreate(osThread(menu_up_thr), NULL);
     
+    // Начальный экран
     selectedMenuItem = (menuItem *) &m_main;
     (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
 
@@ -69,17 +78,34 @@ static void vControl(void const *params)
     for (;;)
     {
         event = osMessageGet(menu_event, 100);
+        
         if (event.status != osEventMessage)
             continue;
         
         switch (event.value.v)
         {
             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;
             
             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;
             
             case CONTROL_PUSH :
@@ -103,4 +129,17 @@ static void vUpdate(void const *params)
         
         osDelay(MON_DELAY);
     }
+}
+
+//
+static osStatus menu_block(uint32_t ms)
+{
+    return osMutexWait(menu_mutex, ms);
+}
+
+
+//
+static void menu_unblock(void)
+{
+    osMutexRelease(menu_mutex);
 }

+ 23 - 2
desk/modules/menu/menu.h

@@ -54,12 +54,33 @@ extern menuItem* selectedMenuItem;
     
 // Главное меню. Отрисовка.
 void draw_main(uint8_t sel);
-    
+
+// Экран с настройкми. Отрисовка.
+void draw_settings(uint8_t sel);
+
+//
+void button_left(void);
+
+//
+void button_right(void);
+
+//
+void button_enter(void);
+
+//
+void menuFocus(void);
+
+//
+extern void menuChange(void* NewMenu, bool direction);
+
+
+
+
 
 //
 void empty_func_bool(bool);
     
- 
+
     
     
     

+ 3 - 3
desk/modules/menu/menu_functions.cpp

@@ -15,19 +15,19 @@ extern bool update_flag;
 //
 void button_left(void)
 {
-    //menuChange(PREVIOUS, false);
+    menuChange(PREVIOUS, false);
 }
 
 
 //
 void button_right(void)
 {
-    //menuChange(NEXT, true);
+    menuChange(NEXT, true);
 }
 
 
 //
 void button_enter(void)
 {
-    //menuFocus();
+    menuFocus();
 }

+ 41 - 1
desk/modules/menu/menu_items.cpp

@@ -1,7 +1,9 @@
 #include "stm32g4xx_hal.h"
 #include "menu_items.h"
+//#include "menu_tree.h"
 #include "FreeRTOS.h"
 #include "task.h"
+#include "menu.h"
 #include <string.h>
 #include <stdio.h>
 
@@ -17,11 +19,49 @@ void draw_main(uint8_t sel)
     update_flag = true;
     
     DBG printf("\033c");
-    DBG printf("This is mani screen\r\n");
+    DBG printf("This is main screen\r\n");
     DBG printf("Test counter: %u\r\n", counter++);
     
 }
 
+//
+void draw_settings(uint8_t sel)
+{
+    static int counter = 0;
+    update_flag = true;
+    
+    DBG printf("\033c");
+    DBG printf("This is settings screen\r\n");
+}
+
+//
+void menuChange(void* NewMenu, bool direction) 
+{
+    if ((void *) NewMenu == NULL)
+        return;
+
+    if (selectedMenuItem->Focus) {
+        selectedMenuItem->func_change(direction);
+    }
+    else {
+        selectedMenuItem = (menuItem*)NewMenu;
+        (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
+    }
+    
+#if 0    
+    // Если элемент меню уже выбран - меняем его значение
+    if (selectedMenuItem->Focus) {
+        if (m_meas.Focus != 1)
+            selectedMenuItem->func_change(direction);
+        (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
+    }
+    else {
+        selectedMenuItem = (menuItem*)NewMenu;
+        (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
+    }
+#endif    
+}
+
 
 //
 void empty_func_bool(bool) {}

+ 3 - 1
desk/modules/menu/menu_tree.h

@@ -21,9 +21,11 @@ MAKE_MENU(NULL_ENTRY, NULL_MENU, NULL_MENU, NULL_MENU, NULL_MENU, MCELL_NULL, fa
 //MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Focus, func_draw, func_change)
 
 // Главный экран. Отображает пройденный путь, статус и т.п
-MAKE_MENU(m_main, 		NULL_ENTRY,		NULL_ENTRY,		NULL_ENTRY,		NULL_ENTRY,
+MAKE_MENU(m_main, 		m_k1,   		m_k1,		    NULL_ENTRY,		NULL_ENTRY,
           MCELL_MAIN,   false,          &draw_main,     &empty_func_bool);
 
+MAKE_MENU(m_k1, 		m_main,		    m_main,		    m_main,		    NULL_ENTRY,
+          MCELL_K1,     false,          &draw_settings,     &empty_func_bool);
 
 
 // Экран настроек. Пока отобразим один условный коэффициент.

Fișier diff suprimat deoarece este prea mare
+ 2 - 2
project/ewarm/settings/tuber.wsdt


Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff