menu.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "stm32g4xx_hal.h"
  2. #include "cmsis_os.h"
  3. #include "menu_tree.h"
  4. #include "control.h"
  5. #include <stdio.h>
  6. #define DBG if(0)
  7. #define MON_DELAY 1000
  8. osMessageQId menu_event;
  9. osThreadId menu_update_handle;
  10. osThreadId menu_control_handle;
  11. menuItem* selectedMenuItem;
  12. bool update_flag = false;
  13. static void vControl(void const *params);
  14. static void vUpdate(void const *params);
  15. //
  16. void menu_init(void)
  17. {
  18. #if 0
  19. // Очередь для событий кнопок
  20. osMessageQDef(vButEventQueue, 1, uint8_t);
  21. v_queue_event = osMessageCreate(osMessageQ(vButEventQueue), NULL);
  22. // Обработка событий
  23. osThreadDef(M_Event_Thread, vMenuEvent, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
  24. v_task_event_handle = osThreadCreate(osThread(M_Event_Thread), NULL);
  25. #endif
  26. osMessageQDef(vButEventQueue, 1, uint8_t);
  27. menu_event = osMessageCreate(osMessageQ(vButEventQueue), NULL);
  28. // События. Сигналы энкодера
  29. osThreadDef(control_thr, vControl, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
  30. menu_control_handle = osThreadCreate(osThread(control_thr), NULL);
  31. // Обновление меню
  32. osThreadDef(menu_up_thr, vUpdate, osPriorityNormal, 0, 6*configMINIMAL_STACK_SIZE);
  33. menu_update_handle = osThreadCreate(osThread(menu_up_thr), NULL);
  34. selectedMenuItem = (menuItem *) &m_main;
  35. (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
  36. #if 0
  37. osTimerDef(vSoundTimer, v_sound_tim);
  38. v_sound_timer_handle = osTimerCreate(osTimer(vSoundTimer), osTimerOnce, NULL);
  39. osMutexDef(menu_mut);
  40. v_menu_mutex_id = osMutexCreate(osMutex(menu_mut));
  41. #endif
  42. }
  43. //
  44. void menu_send_event(control_t but)
  45. {
  46. osMessagePut(menu_event, but, 0);
  47. }
  48. //
  49. static void vControl(void const *params)
  50. {
  51. osEvent event;
  52. for (;;)
  53. {
  54. event = osMessageGet(menu_event, 100);
  55. if (event.status != osEventMessage)
  56. continue;
  57. switch (event.value.v)
  58. {
  59. case CONTROL_FWD :
  60. printf("Encoder forward\r\n");
  61. break;
  62. case CONTROL_BACK :
  63. printf("Encoder back\r\n");
  64. break;
  65. case CONTROL_PUSH :
  66. printf("Encoder push");
  67. break;
  68. }
  69. }
  70. }
  71. //
  72. static void vUpdate(void const *params)
  73. {
  74. for (;;)
  75. {
  76. // Текущий экран меню нужно перерисовать
  77. if (update_flag)
  78. {
  79. (*(selectedMenuItem->func_draw))(selectedMenuItem->Select);
  80. }
  81. osDelay(MON_DELAY);
  82. }
  83. }