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
	 Aleksandr Kutuzov
						Aleksandr Kutuzov