Browse Source

Menu: item callback function context, event osWaitForever timeouts.

Aleksandr Kutuzov 5 years ago
parent
commit
e213954d2d

+ 14 - 16
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);
     }
 }
 

+ 2 - 2
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);
 }

+ 22 - 5
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);
 }

+ 3 - 3
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);