VSF Documented
vsf_menusys.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_MENUSYS_H__
19#define __VSF_MENUSYS_H__
20
21/*============================ INCLUDES ======================================*/
22
23#include "../vsf_ui_cfg.h"
24
25#if VSF_USE_MENUSYS == ENABLED
26
27#if defined(__VSF_MENUSYS_IMPLEMENT)
28# define __PLOOC_CLASS_IMPLEMENT
29# undef VSF_MENUSYS_IMPLEMENT
30#elif defined(VSF_MENUSYS_INHERIT)
31# define __PLOOC_CLASS_INHERIT
32# undef VSF_MENUSYS_INHERIT
33#endif
34
35#include "utilities/ooc_class.h"
36
37/********************************************************************************
38* vsf_menusys_t *
39*********************************************************************************
40* vsf_menusys_screen_t * vsf_menusys_screen_t *
41*********************************************************************************
42* vsf_menusys_menu_t * vsf_menusys_screen_t * vsf_menusys_menu_t *
43* vsf_menu_item_t * vsf_menu_item_t * vsf_menu_item_t *
44* vsf_menu_item_t * vsf_menu_item_t * vsf_menu_item_t *
45* vsf_menu_item_t * vsf_menu_item_t * vsf_menu_item_t *
46*********************************************************************************
47*
48* vsf_menusys_t represents the menu system, which has a screen stack and some
49* screens. Current screen is at the top of the screen stack. A screen consists of
50* some menus displaying at the same time. A menu has some items.
51*/
52
53/*============================ MACROS ========================================*/
54/*============================ MACROFIED FUNCTIONS ===========================*/
55
56#define __describe_menu(__name, __idx, __id, __x, __y, __w, __h, __item_num, __user_type, ...)\
57 typedef struct __##__name##_menu##__idx##_info_t { \
58 implement(vsf_menusys_menu_info_t) \
59 vsf_menusys_menu_item_t __items[(__item_num)]; \
60 } __##__name##_menu##__idx##_info_t; \
61 __##__name##_menu##__idx##_info_t __##__name##_menu##__idx##_info = { \
62 .x = (__x), \
63 .y = (__y), \
64 .w = (__w), \
65 .h = (__h), \
66 .item_num = (__item_num), \
67 .id = (__id), \
68 .user_type = (__user_type), \
69 .__items = { \
70 __VA_ARGS__ \
71 }, \
72 };
73
74#define __describe_menu_item(__idx, __ui_data) \
75 [__idx] = { .ui_data = (void *)(__ui_data), .anchor_type = VSF_MENU_ITEM_ANCHOR_TYPE_NONE, }
76#define __describe_menu_item_anchor_menu(__idx, __ui_data, __screen) \
77 [__idx] = { .ui_data = (void *)(__ui_data), .anchor_type = VSF_MENU_ITEM_ANCHOR_TYPE_MENU, .anchor.screen = (vsf_menusys_screen_t *)(__screen), }
78#define __describe_menu_item_anchor_callback(__idx, __ui_data, __callback) \
79 [__idx] = { .ui_data = (void *)(__ui_data), .anchor_type = VSF_MENU_ITEM_ANCHOR_TYPE_CALLBACK, .anchor.callback = (__callback), }
80
81#define __end_describe_menu(__n, __value) \
82 { .info = &__##__value##_menu##__n##_info.use_as__vsf_menusys_menu_info_t, },
83
84#define __end_describe_menu_screen(__name, __menu_num) \
85 typedef struct __##__name##_menu_screen_t { \
86 implement(vsf_menusys_screen_t) \
87 vsf_menusys_menu_t __menus[(__menu_num)]; \
88 } __##__name##_menu_screen_t; \
89 __##__name##_menu_screen_t __name = { \
90 .menu_num = (__menu_num), \
91 .__menus = { \
92 VSF_MREPEAT(__menu_num, __end_describe_menu, __name) \
93 }, \
94 };
95
96#define describe_menu_screen(__name)
97#define describe_menu(__name, __idx, __id, __x, __y, __w, __h, __item_num, __user_type, ...)\
98 __describe_menu(__name, __idx, (__id), (__x), (__y), (__w), (__h), (__item_num), (__user_type), __VA_ARGS__)
99#define describe_menu_item(__idx, __ui_data) \
100 __describe_menu_item(__idx, (__ui_data))
101#define describe_menu_item_anchor_menu(__idx, __ui_data, __screen) \
102 __describe_menu_item_anchor_menu((__idx), (__ui_data), (__screen))
103#define describe_menu_item_anchor_callback(__idx, __ui_data, __callback) \
104 __describe_menu_item_anchor_callback((__idx), (__ui_data), (__callback))
105#define end_describe_menu_screen(__name, __menu_num) \
106 __end_describe_menu_screen(__name, __menu_num)
107
108#define describe_menusys(__name, __screen_stack_size) \
109 typedef struct __##__name##_menusys_t { \
110 implement(vsf_menusys_t) \
111 vsf_menusys_screen_t * __screen_stack[(__screen_stack_size)]; \
112 } __##__name##_menusys_t; \
113 __##__name##_menusys_t __name = { \
114 .screen_stack_size = (__screen_stack_size), \
115 };
116
117/*============================ TYPES =========================================*/
118
120declare_simple_class(vsf_menusys_screen_t)
121declare_simple_class(vsf_menusys_menu_t)
122
124 VSF_MENU_ITEM_ANCHOR_TYPE_NONE,
125 VSF_MENU_ITEM_ANCHOR_TYPE_MENU,
126 VSF_MENU_ITEM_ANCHOR_TYPE_CALLBACK,
128
129typedef void (*vsf_menusys_menu_anchor_callback_t)(vsf_menusys_menu_t *menu, uint_fast16_t idx);
131 void * ui_data;
133 union {
134 vsf_menusys_screen_t *screen;
138
139// vsf_menu_info_t must be followed by actual vsf_menu_item_t array
150
151def_simple_class(vsf_menusys_menu_t) {
153 uint16_t item_pos;
154 uint16_t item_pos_pre;
155 bool is_switching;
156 bool is_updating;
157 uint8_t update_state;
158};
159
160def_simple_class(vsf_menusys_screen_t) {
161 uint8_t menu_num;
162 vsf_menusys_menu_t menus[0];
163};
164
165def_simple_class(vsf_menusys_t) {
166 public_member(
167 uint8_t screen_stack_size;
168 )
169
170 private_member(
171 int8_t screen_stack_pos;
172 vsf_menusys_screen_t * screen_stack[0];
173 )
174};
175
176/*============================ GLOBAL VARIABLES ==============================*/
177/*============================ PROTOTYPES ====================================*/
178
179extern void vsf_menusys_init(vsf_menusys_t *screen);
180
181extern void vsf_menusys_move_item_relative(vsf_menusys_t *menusys, uint_fast8_t menu_idx, int_fast8_t step);
182extern void vsf_menusys_move_item_absolute(vsf_menusys_t *menusys, uint_fast8_t menu_idx, uint_fast8_t item_idx);
183extern void vsf_menusys_select_cur_item(vsf_menusys_t *menusys, uint_fast8_t menu_idx);
184
185extern void vsf_menusys_enter_screen(vsf_menusys_t *menusys, vsf_menusys_screen_t *screen);
186extern void vsf_menusys_leave_screen(vsf_menusys_t *menusys);
187
188extern vsf_menusys_menu_t * vsf_menusys_poll(vsf_menusys_t *menusys, int_fast16_t *idx);
189extern void vsf_menusys_menu_updated(vsf_menusys_t *menusys, vsf_menusys_menu_t *menu);
190
191#endif // VSF_USE_MENUSYS
192#endif // __VSF_MENUSYS_H__
193/* EOF */
unsigned short uint16_t
Definition stdint.h:7
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned short uint_fast16_t
Definition stdint.h:25
unsigned char uint8_t
Definition stdint.h:5
signed char int8_t
Definition stdint.h:4
char int_fast8_t
Definition stdint.h:22
short int_fast16_t
Definition stdint.h:24
Definition vsf_menusys.h:140
uint16_t w
Definition vsf_menusys.h:143
uint16_t x
Definition vsf_menusys.h:141
uint16_t item_num
Definition vsf_menusys.h:145
uint8_t user_type
Definition vsf_menusys.h:147
uint16_t h
Definition vsf_menusys.h:144
uint8_t id
Definition vsf_menusys.h:146
vsf_menusys_menu_item_t items[0]
Definition vsf_menusys.h:148
uint16_t y
Definition vsf_menusys.h:142
Definition vsf_menusys.h:130
void * ui_data
Definition vsf_menusys.h:131
vsf_menusys_item_anchor_type_t anchor_type
Definition vsf_menusys.h:132
union vsf_menusys_menu_item_t::@134 anchor
vsf_menusys_screen_t * screen
Definition vsf_menusys.h:134
vsf_menusys_menu_anchor_callback_t callback
Definition vsf_menusys.h:135
vsf_menusys_item_anchor_type_t
Definition vsf_menusys.h:127
declare_simple_class(vsf_menusys_t) declare_simple_class(vsf_menusys_screen_t) declare_simple_class(vsf_menusys_menu_t) typedef enum vsf_menusys_item_anchor_type_t
Definition vsf_menusys.h:119
def_simple_class(vsf_menusys_menu_t)
Definition vsf_menusys.h:151
void vsf_menusys_select_cur_item(vsf_menusys_t *menusys, uint_fast8_t menu_idx)
Definition vsf_menusys.c:152
void vsf_menusys_enter_screen(vsf_menusys_t *menusys, vsf_menusys_screen_t *screen)
Definition vsf_menusys.c:131
void(* vsf_menusys_menu_anchor_callback_t)(vsf_menusys_menu_t *menu, uint_fast16_t idx)
Definition vsf_menusys.h:129
void vsf_menusys_move_item_relative(vsf_menusys_t *menusys, uint_fast8_t menu_idx, int_fast8_t step)
Definition vsf_menusys.c:101
void vsf_menusys_move_item_absolute(vsf_menusys_t *menusys, uint_fast8_t menu_idx, uint_fast8_t item_idx)
Definition vsf_menusys.c:83
void vsf_menusys_menu_updated(vsf_menusys_t *menusys, vsf_menusys_menu_t *menu)
Definition vsf_menusys.c:70
void vsf_menusys_init(vsf_menusys_t *screen)
Definition vsf_menusys.c:37
void vsf_menusys_leave_screen(vsf_menusys_t *menusys)
Definition vsf_menusys.c:142
vsf_menusys_menu_t * vsf_menusys_poll(vsf_menusys_t *menusys, int_fast16_t *idx)
Definition vsf_menusys.c:43