From e213954d2da3d3cbefc81559032ebb2059b0d39a Mon Sep 17 00:00:00 2001 From: Aleksandr Kutuzov Date: Fri, 16 Oct 2020 15:18:36 +0300 Subject: [PATCH] Menu: item callback function context, event osWaitForever timeouts. --- applications/menu/menu.c | 30 ++++++++++++++---------------- applications/menu/menu_event.c | 4 ++-- applications/menu/menu_item.c | 27 ++++++++++++++++++++++----- applications/menu/menu_item.h | 6 +++--- 4 files changed, 41 insertions(+), 26 deletions(-) diff --git a/applications/menu/menu.c b/applications/menu/menu.c index 156e7f60..0ef37d67 100644 --- a/applications/menu/menu.c +++ b/applications/menu/menu.c @@ -49,22 +49,21 @@ void menu_build_main(Menu* menu) { // Root point 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("125 kHz RFID", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("Infrared", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("I-Button", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("USB", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("Bluetooth", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("GPIO / HW", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("NFC", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("U2F", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("Tamagotchi", NULL, NULL)); - menu_item_add(menu, menu_item_alloc_function("Plugins", 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, 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, NULL)); + menu_item_add(menu, menu_item_alloc_function("USB", NULL, 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, NULL)); + menu_item_add(menu, menu_item_alloc_function("U2F", NULL, NULL, NULL)); + menu_item_add(menu, menu_item_alloc_function("Tamagotchi", NULL, NULL, NULL)); + menu_item_add(menu, menu_item_alloc_function("Plugins", NULL, NULL, 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("two", 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("one", NULL, 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, NULL)); menu_item_add(menu, menu->settings); } @@ -149,8 +148,7 @@ void menu_ok(Menu* menu) { menu->position = 0; menu_update(menu); } else if(type == MenuItemTypeFunction) { - MenuItemCallback function = menu_item_get_function(item); - if(function) function(); + menu_item_function_call(item); } } diff --git a/applications/menu/menu_event.c b/applications/menu/menu_event.c index 82b32f8f..bd479972 100644 --- a/applications/menu/menu_event.c +++ b/applications/menu/menu_event.c @@ -19,7 +19,7 @@ void MenuEventimeout_callback(void* arg) { MenuEvent* menu_event = arg; MenuMessage message; message.type = MenuMessageTypeIdle; - osMessageQueuePut(menu_event->mqueue, &message, 0, 0); + osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever); } MenuEvent* menu_event_alloc() { @@ -92,5 +92,5 @@ void menu_event_input_callback(InputEvent* input_event, void* context) { message.type = MenuMessageTypeUnknown; } - osMessageQueuePut(menu_event->mqueue, &message, 0, 0); + osMessageQueuePut(menu_event->mqueue, &message, 0, osWaitForever); } diff --git a/applications/menu/menu_item.c b/applications/menu/menu_item.c index 57072bc2..e4d3143f 100644 --- a/applications/menu/menu_item.c +++ b/applications/menu/menu_item.c @@ -10,6 +10,8 @@ struct MenuItem { void* icon; MenuItem* parent; void* data; + MenuItemCallback callback; + void* callback_context; }; MenuItem* menu_item_alloc() { @@ -31,27 +33,34 @@ MenuItem* menu_item_alloc_menu(const char* label, void* icon) { 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(); menu_item->type = MenuItemTypeFunction; menu_item->label = label; menu_item->icon = icon; - menu_item->data = function; + menu_item->callback = callback; + menu_item->callback_context = context; return 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); } MenuItem* menu_item_get_parent(MenuItem* menu_item) { + assert(menu_item); return menu_item->parent; } void menu_item_subitem_add(MenuItem* menu_item, MenuItem* sub_item) { + assert(menu_item); assert(menu_item->type == MenuItemTypeMenu); MenuItemArray_t* items = menu_item->data; 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) { + assert(menu_item); return menu_item->type; } void menu_item_set_label(MenuItem* menu_item, const char* label) { + assert(menu_item); menu_item->label = label; } const char* menu_item_get_label(MenuItem* menu_item) { + assert(menu_item); return menu_item->label; } void menu_item_set_icon(MenuItem* menu_item, void* icon) { + assert(menu_item); menu_item->icon = icon; } void* menu_item_get_icon(MenuItem* menu_item) { + assert(menu_item); return menu_item->icon; } MenuItemArray_t* menu_item_get_subitems(MenuItem* menu_item) { + assert(menu_item); assert(menu_item->type == MenuItemTypeMenu); 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); - return menu_item->data; + + if(menu_item->callback) menu_item->callback(menu_item->callback_context); } diff --git a/applications/menu/menu_item.h b/applications/menu/menu_item.h index 57b81124..19f1a38e 100644 --- a/applications/menu/menu_item.h +++ b/applications/menu/menu_item.h @@ -9,13 +9,13 @@ typedef enum { } MenuItemType; typedef struct MenuItem MenuItem; -typedef void (*MenuItemCallback)(); +typedef void (*MenuItemCallback)(void *context); ARRAY_DEF(MenuItemArray, MenuItem*, M_PTR_OPLIST); 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); @@ -33,4 +33,4 @@ void* menu_item_get_icon(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);