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
 | ||||
|     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); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov