DIGILIGHT
menu.h
См. документацию.
1 
14 #ifndef MENU_H_
15 #define MENU_H_
16 
17 extern __flash const char VOL_NAME[];
18 
19 extern uint8_t lock_current_menu_item;
20 
22 typedef enum{
31 } item_t;
32 
34 typedef enum{
39 
41 typedef struct{
42  __flash const char *name;
44  union{
45  // MI_SUBMENU
46  __flash const void *submenu;
47  // MI_ONOFF
48  uint8_t *onoff;
49  // MI_SCALE, MI_U8
50  struct{
51  uint8_t step;
52  union{
53  struct{
54  uint8_t *u8;
55  uint8_t u8_min;
56  uint8_t u8_max;
57  };
58  // MI_U16
59  struct{
60  uint16_t *u16;
61  uint16_t u16_min;
62  uint16_t u16_max;
63  };
64  // MI_S8
65  struct{
66  int8_t *s8;
67  int8_t s8_min;
68  int8_t s8_max;
69  };
70  // MI_S16
71  struct{
72  int16_t *s16;
73  int16_t s16_min;
74  int16_t s16_max;
75  };
76  };
77  };
78  // MI_USER
79  struct{
80  void (*edit)(int8_t d, uint16_t data);
81  void (*paint)(int32_t d);
82  menu_result_t (*action)(uint16_t d);
83  uint16_t data;
84  };
85  };
86 } menu_item_t;
87 
88 #define _MI_SUBMENU(n,_sm) {.name = n, .type = MI_SUBMENU, .submenu = &_sm}
89 #define _MI_ONOFF(n,_onoff) {.name = n, .type = MI_ONOFF, .onoff = &_onoff}
90 #define _MI_SCALE(n,v,_min,_max,_step) {.name = n, .type = MI_SCALE, .u8 = &v, .u8_min = (_min), .u8_max = (_max), .step = (_step)}
91 #define _MI_U8(n,v,_min,_max,_step) {.name = n, .type = MI_U8, .u8 = &v, .u8_min = (_min), .u8_max = (_max), .step = (_step)}
92 #define _MI_S8(n,v,_min,_max,_step) {.name = n, .type = MI_S8, .s8 = &v, .s8_min = (_min), .s8_max = (_max), .step = (_step)}
93 #define _MI_U16(n,v,_min,_max,_step) {.name = n, .type = MI_U16, .u16 = &v, .u16_min = (_min), .u16_max = (_max), .step = (_step)}
94 #define _MI_S16(n,v,_min,_max,_step) {.name = n, .type = MI_S16, .s16 = &v, .s16_min = (_min), .s16_max = (_max), .step = (_step)}
95 #define _MI_USER(n,_edit,_paint,_action,_data) {.name = n, .type = MI_USER, .edit = _edit, .paint = _paint, .action = _action, .data = (uint16_t)(_data)}
96 
97 #define _MENU(mi) {.item_count = sizeof(mi) / sizeof(menu_item_t), .items = mi}
98 #define FLASH_MENU(id,mi) __flash const menu_t id = _MENU(mi)
99 #define RAM_MENU(id,mi) const menu_t id = _MENU(mi)
100 
102 typedef struct{
103  uint8_t item_count;
104  __flash const menu_item_t __flash const *items;
105 } menu_t;
106 
108 #define MENU_TIMEOUT 1500
109 
110 extern __flash const menu_t main_menu;
111 
113 menu_result_t do_menu(void);
114 
115 void reset_menu_timeout(void);
116 
117 void show_press_encoder_msg(int32_t d);
118 
119 extern __flash const menu_t *current_menu;
120 
121 #endif /* MENU_H_ */
uint8_t * u8
для байта без знака - ссылка на переменную
Definition: menu.h:54
item_t type
всегда - вариант пункта
Definition: menu.h:43
вариативный тип пункта меню
Definition: menu.h:41
uint16_t * u16
для int без знака - ссылка на переменную
Definition: menu.h:60
int16_t * s16
для int - ссылка на переменную
Definition: menu.h:72
__flash const void * submenu
для субменю - ссылка на субменю
Definition: menu.h:46
uint16_t u16_min
для int без знака - допустимый минимум
Definition: menu.h:61
uint16_t data
для пользовательского - дополнительные данные
Definition: menu.h:83
int8_t s8_min
для байта - допустимый минимум
Definition: menu.h:67
uint16_t u16_max
для int без знака - допустимый максимум
Definition: menu.h:62
uint8_t * onoff
для флажка - ссылка на флаг
Definition: menu.h:48
uint8_t u8_min
для байта без знака - допустимый минимум
Definition: menu.h:55
int16_t s16_max
для int - допустимый максимум
Definition: menu.h:74
uint8_t step
для чисел и шкалы - шаг изменения при редактировании
Definition: menu.h:51
__flash const char * name
всегда - название пункта
Definition: menu.h:42
int8_t * s8
для байта - ссылка на переменную
Definition: menu.h:66
меню
Definition: menu.h:102
uint8_t u8_max
для байта без знака - допустимый максимум
Definition: menu.h:56
int16_t s16_min
для int - допустимый минимум
Definition: menu.h:73
int8_t s8_max
для байта - допустимый максимум
Definition: menu.h:68