Menu: item callback function context, event osWaitForever timeouts.
This commit is contained in:
parent
d715767cef
commit
e213954d2d
@ -49,22 +49,21 @@ void menu_build_main(Menu* menu) {
|
|||||||
// Root point
|
// Root point
|
||||||
menu->root = menu_item_alloc_menu(NULL, NULL);
|
menu->root = menu_item_alloc_menu(NULL, NULL);
|
||||||
|
|
||||||
menu_item_add(menu, menu_item_alloc_function("Sub 1 gHz", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("Sub 1 gHz", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("125 kHz RFID", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("125 kHz RFID", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("Infrared", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("Infrared", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("I-Button", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("I-Button", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("USB", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("USB", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("Bluetooth", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("Bluetooth", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("GPIO / HW", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("GPIO / HW", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("NFC", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("U2F", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("U2F", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("Tamagotchi", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("Tamagotchi", NULL, NULL));
|
menu_item_add(menu, menu_item_alloc_function("Plugins", NULL, NULL, NULL));
|
||||||
menu_item_add(menu, menu_item_alloc_function("Plugins", NULL, NULL));
|
|
||||||
|
|
||||||
menu->settings = menu_item_alloc_menu("Setting", NULL);
|
menu->settings = menu_item_alloc_menu("Setting", NULL);
|
||||||
menu_item_subitem_add(menu->settings, menu_item_alloc_function("one", NULL, NULL));
|
menu_item_subitem_add(menu->settings, menu_item_alloc_function("one", NULL, NULL, NULL));
|
||||||
menu_item_subitem_add(menu->settings, menu_item_alloc_function("two", NULL, NULL));
|
menu_item_subitem_add(menu->settings, menu_item_alloc_function("two", NULL, NULL, NULL));
|
||||||
menu_item_subitem_add(menu->settings, menu_item_alloc_function("three", NULL, NULL));
|
menu_item_subitem_add(menu->settings, menu_item_alloc_function("three", NULL, NULL, NULL));
|
||||||
|
|
||||||
menu_item_add(menu, menu->settings);
|
menu_item_add(menu, menu->settings);
|
||||||
}
|
}
|
||||||
@ -149,8 +148,7 @@ void menu_ok(Menu* menu) {
|
|||||||
menu->position = 0;
|
menu->position = 0;
|
||||||
menu_update(menu);
|
menu_update(menu);
|
||||||
} else if(type == MenuItemTypeFunction) {
|
} else if(type == MenuItemTypeFunction) {
|
||||||
MenuItemCallback function = menu_item_get_function(item);
|
menu_item_function_call(item);
|
||||||
if(function) function();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ void MenuEventimeout_callback(void* arg) {
|
|||||||
MenuEvent* menu_event = arg;
|
MenuEvent* menu_event = arg;
|
||||||
MenuMessage message;
|
MenuMessage message;
|
||||||
message.type = MenuMessageTypeIdle;
|
message.type = MenuMessageTypeIdle;
|
||||||
osMessageQueuePut(menu_event->mqueue, &message, 0, 0);
|
osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever);
|
||||||
}
|
}
|
||||||
|
|
||||||
MenuEvent* menu_event_alloc() {
|
MenuEvent* menu_event_alloc() {
|
||||||
@ -92,5 +92,5 @@ void menu_event_input_callback(InputEvent* input_event, void* context) {
|
|||||||
message.type = MenuMessageTypeUnknown;
|
message.type = MenuMessageTypeUnknown;
|
||||||
}
|
}
|
||||||
|
|
||||||
osMessageQueuePut(menu_event->mqueue, &message, 0, 0);
|
osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever);
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ struct MenuItem {
|
|||||||
void* icon;
|
void* icon;
|
||||||
MenuItem* parent;
|
MenuItem* parent;
|
||||||
void* data;
|
void* data;
|
||||||
|
MenuItemCallback callback;
|
||||||
|
void* callback_context;
|
||||||
};
|
};
|
||||||
|
|
||||||
MenuItem* menu_item_alloc() {
|
MenuItem* menu_item_alloc() {
|
||||||
@ -31,27 +33,34 @@ MenuItem* menu_item_alloc_menu(const char* label, void* icon) {
|
|||||||
return menu_item;
|
return menu_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
MenuItem* menu_item_alloc_function(const char* label, void* icon, MenuItemCallback function) {
|
MenuItem* menu_item_alloc_function(const char* label, void* icon, MenuItemCallback callback, void* context) {
|
||||||
MenuItem* menu_item = menu_item_alloc();
|
MenuItem* menu_item = menu_item_alloc();
|
||||||
|
|
||||||
menu_item->type = MenuItemTypeFunction;
|
menu_item->type = MenuItemTypeFunction;
|
||||||
menu_item->label = label;
|
menu_item->label = label;
|
||||||
menu_item->icon = icon;
|
menu_item->icon = icon;
|
||||||
menu_item->data = function;
|
menu_item->callback = callback;
|
||||||
|
menu_item->callback_context = context;
|
||||||
|
|
||||||
return menu_item;
|
return menu_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_item_release(MenuItem* menu_item) {
|
void menu_item_release(MenuItem* menu_item) {
|
||||||
if(menu_item->type == MenuItemTypeMenu) free(menu_item->data);
|
assert(menu_item);
|
||||||
|
if(menu_item->type == MenuItemTypeMenu) {
|
||||||
|
//TODO: iterate and release
|
||||||
|
free(menu_item->data);
|
||||||
|
}
|
||||||
free(menu_item);
|
free(menu_item);
|
||||||
}
|
}
|
||||||
|
|
||||||
MenuItem* menu_item_get_parent(MenuItem* menu_item) {
|
MenuItem* menu_item_get_parent(MenuItem* menu_item) {
|
||||||
|
assert(menu_item);
|
||||||
return menu_item->parent;
|
return menu_item->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
|
void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
|
||||||
|
assert(menu_item);
|
||||||
assert(menu_item->type == MenuItemTypeMenu);
|
assert(menu_item->type == MenuItemTypeMenu);
|
||||||
MenuItemArray_t* items = menu_item->data;
|
MenuItemArray_t* items = menu_item->data;
|
||||||
sub_item->parent = menu_item;
|
sub_item->parent = menu_item;
|
||||||
@ -59,31 +68,39 @@ void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint8_t menu_item_get_type(MenuItem* menu_item) {
|
uint8_t menu_item_get_type(MenuItem* menu_item) {
|
||||||
|
assert(menu_item);
|
||||||
return menu_item->type;
|
return menu_item->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_item_set_label(MenuItem* menu_item, const char* label) {
|
void menu_item_set_label(MenuItem* menu_item, const char* label) {
|
||||||
|
assert(menu_item);
|
||||||
menu_item->label = label;
|
menu_item->label = label;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* menu_item_get_label(MenuItem* menu_item) {
|
const char* menu_item_get_label(MenuItem* menu_item) {
|
||||||
|
assert(menu_item);
|
||||||
return menu_item->label;
|
return menu_item->label;
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_item_set_icon(MenuItem* menu_item, void* icon) {
|
void menu_item_set_icon(MenuItem* menu_item, void* icon) {
|
||||||
|
assert(menu_item);
|
||||||
menu_item->icon = icon;
|
menu_item->icon = icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* menu_item_get_icon(MenuItem* menu_item) {
|
void* menu_item_get_icon(MenuItem* menu_item) {
|
||||||
|
assert(menu_item);
|
||||||
return menu_item->icon;
|
return menu_item->icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
|
MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) {
|
||||||
|
assert(menu_item);
|
||||||
assert(menu_item->type == MenuItemTypeMenu);
|
assert(menu_item->type == MenuItemTypeMenu);
|
||||||
return menu_item->data;
|
return menu_item->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
MenuItemCallback menu_item_get_function(MenuItem* menu_item) {
|
void menu_item_function_call(MenuItem* menu_item) {
|
||||||
|
assert(menu_item);
|
||||||
assert(menu_item->type == MenuItemTypeFunction);
|
assert(menu_item->type == MenuItemTypeFunction);
|
||||||
return menu_item->data;
|
|
||||||
|
if(menu_item->callback) menu_item->callback(menu_item->callback_context);
|
||||||
}
|
}
|
||||||
|
@ -9,13 +9,13 @@ typedef enum {
|
|||||||
} MenuItemType;
|
} MenuItemType;
|
||||||
|
|
||||||
typedef struct MenuItem MenuItem;
|
typedef struct MenuItem MenuItem;
|
||||||
typedef void (*MenuItemCallback)();
|
typedef void (*MenuItemCallback)(void *context);
|
||||||
|
|
||||||
ARRAY_DEF(MenuItemArray, MenuItem*, M_PTR_OPLIST);
|
ARRAY_DEF(MenuItemArray, MenuItem*, M_PTR_OPLIST);
|
||||||
|
|
||||||
MenuItem* menu_item_alloc_menu(const char* label, void* icon);
|
MenuItem* menu_item_alloc_menu(const char* label, void* icon);
|
||||||
|
|
||||||
MenuItem* menu_item_alloc_function(const char* label, void* icon, MenuItemCallback function);
|
MenuItem* menu_item_alloc_function(const char* label, void* icon, MenuItemCallback callback, void* context);
|
||||||
|
|
||||||
void menu_item_release(MenuItem* menu_item);
|
void menu_item_release(MenuItem* menu_item);
|
||||||
|
|
||||||
@ -33,4 +33,4 @@ void* menu_item_get_icon(MenuItem* menu_item);
|
|||||||
|
|
||||||
MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item);
|
MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item);
|
||||||
|
|
||||||
MenuItemCallback menu_item_get_function(MenuItem* menu_item);
|
void menu_item_function_call(MenuItem* menu_item);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user