Эх сурвалжийг харах

Добавил очередь для менюшного энкодера.

unknown 2 долоо хоног өмнө
parent
commit
7eaada61ad

+ 13 - 6
desk/modules/menu/control.cpp

@@ -5,7 +5,6 @@
 //#include "buzzer.h"
 #include <stdio.h>
 
-#define ENC_SOFT_FILTER_CNT     3 //2
 #define BEEP_TIME               1000
 
 //SemaphoreHandle_t  semphEncoder;
@@ -34,7 +33,7 @@ void init_encoder(void)
     htim2.Init.RepetitionCounter = 0;
     htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
     
-    sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
+    sConfig.EncoderMode = TIM_ENCODERMODE_TI1; //TIM_ENCODERMODE_TI12;
     
     sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
     sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
@@ -56,8 +55,9 @@ void init_encoder(void)
     
     HAL_NVIC_SetPriority(TIM2_IRQn, 6, 0);
     HAL_NVIC_EnableIRQ(TIM2_IRQn);
-    
-    HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_ALL);
+        
+    HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_1);  
+    //HAL_TIM_Encoder_Start_IT(&htim2, TIM_CHANNEL_ALL);
 }
 
 
@@ -80,7 +80,15 @@ void init_gpio_encoder(void)
     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 }
 
-
+//
+//static void vUpdate(void const *params)
+void vControl(void const *params)
+{
+    for (;;)
+    {
+        vTaskDelay(1000);
+    }
+}
 
 
 extern "C" {
@@ -91,7 +99,6 @@ void TIM2_IRQHandler(void)
 }
 
 
-
 #if 0
 //
 void MENU_ControlInit(void)

+ 26 - 25
desk/modules/menu/control.h

@@ -1,25 +1,26 @@
-#ifndef __CONTROL_H
-#define __CONTROL_H
-   
-
-//
-void init_encoder(void);
-
-//
-void init_gpio_encoder(void);
-
-
-
-
-#if 0
-void MENU_ControlInit(void);
-
-void MENU_EncoderInit(void);
-void MENU_ButtonInit(void);
-
-//
-void vEncoder(void *params);
-#endif
-
-#endif /* #ifndef __CONTROL_H */
-
+#ifndef __CONTROL_H
+#define __CONTROL_H
+   
+
+//
+void init_encoder(void);
+
+//
+void init_gpio_encoder(void);
+
+//
+void vControl(void const *params);
+
+
+#if 0
+void MENU_ControlInit(void);
+
+void MENU_EncoderInit(void);
+void MENU_ButtonInit(void);
+
+//
+void vEncoder(void *params);
+#endif
+
+#endif /* #ifndef __CONTROL_H */
+

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

@@ -1,17 +1,21 @@
 #include "stm32g4xx_hal.h"
 #include "cmsis_os.h"
 #include "menu_tree.h"
+#include "control.h"
 #include <stdio.h>
 
+#define DBG if(0)
+
 #define MON_DELAY           1000
 
+osMessageQId    menu_event;
 osThreadId  menu_update_handle;
 osThreadId  menu_control_handle;
 
 menuItem* selectedMenuItem;
 bool update_flag = false;
 
-//static void vMenuEvent(void const *params);
+static void vControl(void const *params);
 static void vUpdate(void const *params);
 
 
@@ -28,8 +32,12 @@ 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);
+    
+    // События. Сигналы энкодера
     osThreadDef(control_thr, vControl, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
-    menu_update_handle = osThreadCreate(osThread(control_thr), NULL);
+    menu_control_handle = osThreadCreate(osThread(control_thr), NULL);
     
     // Обновление меню
     osThreadDef(menu_up_thr, vUpdate, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
@@ -47,6 +55,41 @@ void menu_init(void)
 #endif    
 }
 
+//
+void menu_send_event(control_t but)
+{
+    osMessagePut(menu_event, but, 0);  
+}
+
+//
+static void vControl(void const *params)
+{
+    osEvent event;
+    
+    for (;;)
+    {
+        event = osMessageGet(menu_event, 100);
+        if (event.status != osEventMessage)
+            continue;
+        
+        switch (event.value.v)
+        {
+            case CONTROL_FWD :
+                printf("Encoder forward\r\n");
+            break;
+            
+            case CONTROL_BACK :
+                printf("Encoder back\r\n");
+            break;
+            
+            case CONTROL_PUSH :
+                printf("Encoder push");
+            break;
+        }
+    
+    }
+}
+
 //
 static void vUpdate(void const *params)
 {

+ 11 - 0
desk/modules/menu/menu.h

@@ -2,9 +2,20 @@
 #define __MENU_H
 
 
+typedef enum 
+{
+    CONTROL_FWD = 0,
+    CONTROL_BACK,
+    CONTROL_PUSH,
+    
+} control_t;
+
+
 //
 void menu_init(void);
 
+//
+void menu_send_event(control_t but);
 
 //
 uint8_t menu_get_current_id(void);

+ 37 - 5
desk/user/hal_callback.cpp

@@ -2,8 +2,15 @@
 #include "hal_callback.h"
 #include "terminal_usartbridge.h"
 #include "uart_bridge.h"
+#include "menu.h"
 #include <stdio.h>
 
+#define DBG if (0)
+
+#define ENC_SOFT_FILTER_CNT     3
+
+static void encoder_handler(void);
+
 // -------------------------------------------------------------------------- //
 //                                  UART                                      //
 // -------------------------------------------------------------------------- //
@@ -41,8 +48,6 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
     }
 }
 
-//__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
-
 // -------------------------------------------------------------------------- //
 //                                  TIM                                      //
 // -------------------------------------------------------------------------- //
@@ -50,14 +55,41 @@ void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
 //
 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
 {
-    static int cnt = 0;
-
     switch((uint32_t)htim->Instance)
     {
         case TIM2_BASE :
-            printf("Encoder: %d\r\n", cnt++);
+            encoder_handler();
         break;
           
         default : break;
     }
+}
+
+//
+static void encoder_handler(void)
+{
+    static uint8_t frw_cnt = 0;
+    static uint8_t back_cnt = 0;
+    
+    if (TIM2->CR1 & TIM_CR1_DIR) 
+    {
+        if (++back_cnt > ENC_SOFT_FILTER_CNT)
+        {
+            menu_send_event(CONTROL_BACK);
+            DBG printf("Encoder back\r\n");
+            back_cnt = 0;
+            return;
+        }
+        back_cnt++;
+    }
+    else 
+    {
+        if (++frw_cnt > ENC_SOFT_FILTER_CNT) {
+            menu_send_event(CONTROL_FWD);
+            DBG printf("Encoder forward\r\n");
+            frw_cnt = 0;
+            return;
+        }
+        frw_cnt++;
+    }
 }

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 1
project/ewarm/settings/tuber.wsdt


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно