SubGhz: increase output power and. Dolphin scene: refactor. (#411)
* SubGhz: increase output power to max * Dolphin scene: refactor code.
This commit is contained in:
		
							parent
							
								
									3e281175da
								
							
						
					
					
						commit
						e0bc80cd8b
					
				| @ -71,13 +71,10 @@ typedef struct { | |||||||
| } Vec2; | } Vec2; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|  |     osMessageQueueId_t mqueue; | ||||||
|     Gui* gui; |     Gui* gui; | ||||||
|     ViewPort* view_port; |     ViewPort* view_port; | ||||||
|     ValueMutex* vm; |  | ||||||
|     osTimerId_t* timer; |     osTimerId_t* timer; | ||||||
|     osMessageQueueId_t mqueue; |  | ||||||
|     FuriThread* scene_app_thread; |  | ||||||
| 
 |  | ||||||
| } SceneAppGui; | } SceneAppGui; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
| @ -92,7 +89,6 @@ typedef struct { | |||||||
| } Item; | } Item; | ||||||
| 
 | 
 | ||||||
| typedef struct { | typedef struct { | ||||||
|     SceneAppGui ui; |  | ||||||
|     ///
 |     ///
 | ||||||
|     Vec2 player; |     Vec2 player; | ||||||
|     Vec2 player_global; |     Vec2 player_global; | ||||||
| @ -126,6 +122,8 @@ typedef struct { | |||||||
|     int8_t zoom_v; |     int8_t zoom_v; | ||||||
|     uint8_t scene_zoom; |     uint8_t scene_zoom; | ||||||
|     uint8_t dialog_progress; |     uint8_t dialog_progress; | ||||||
|  | 
 | ||||||
|  |     FuriThread* scene_app_thread; | ||||||
| } SceneState; | } SceneState; | ||||||
| 
 | 
 | ||||||
| void dolphin_scene_render(SceneState* state, Canvas* canvas, uint32_t t); | void dolphin_scene_render(SceneState* state, Canvas* canvas, uint32_t t); | ||||||
|  | |||||||
| @ -1,115 +1,114 @@ | |||||||
| #include <furi.h> | #include <furi.h> | ||||||
|  | #include <api-hal.h> | ||||||
| #include "dolphin_scene/dolphin_scene.h" | #include "dolphin_scene/dolphin_scene.h" | ||||||
| 
 | 
 | ||||||
| void dolphin_engine_tick_cb(void* p) { | static SceneAppGui* scene_app_gui = NULL; | ||||||
|  | static ValueMutex* scene_state_mutex = NULL; | ||||||
|  | 
 | ||||||
|  | static void dolphin_engine_tick_callback(void* p) { | ||||||
|     osMessageQueueId_t event_queue = p; |     osMessageQueueId_t event_queue = p; | ||||||
|     AppEvent tick_event; |     AppEvent event; | ||||||
|     tick_event.type = EventTypeTick; |     event.type = EventTypeTick; | ||||||
|     osMessageQueuePut(event_queue, (void*)&tick_event, 0, 0); |     osMessageQueuePut(event_queue, (void*)&event, 0, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void dolphin_engine_event_cb(InputEvent* input_event, void* ctx) { | static void dolphin_engine_input_callback(InputEvent* input_event, void* ctx) { | ||||||
|     osMessageQueueId_t event_queue = ctx; |     osMessageQueueId_t event_queue = ctx; | ||||||
| 
 |  | ||||||
|     AppEvent event; |     AppEvent event; | ||||||
|     event.type = EventTypeKey; |     event.type = EventTypeKey; | ||||||
|     event.value.input = *input_event; |     event.value.input = *input_event; | ||||||
|     osMessageQueuePut(event_queue, (void*)&event, 0, osWaitForever); |     osMessageQueuePut(event_queue, (void*)&event, 0, osWaitForever); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ValueMutex* scene_init() { | void scene_alloc() { | ||||||
|     SceneState* scene_state = furi_alloc(sizeof(SceneState)); |     printf("scene_alloc: start\r\n"); | ||||||
|     scene_state->ui.mqueue = osMessageQueueNew(2, sizeof(AppEvent), NULL); |     furi_assert(scene_app_gui == NULL); | ||||||
|  |     furi_assert(scene_state_mutex == NULL); | ||||||
| 
 | 
 | ||||||
|  |     // SceneAppGui
 | ||||||
|  |     scene_app_gui = furi_alloc(sizeof(SceneAppGui)); | ||||||
|  |     scene_app_gui->mqueue = osMessageQueueNew(2, sizeof(AppEvent), NULL); | ||||||
|  |     scene_app_gui->gui = furi_record_open("gui"); | ||||||
|  |     scene_app_gui->view_port = view_port_alloc(); | ||||||
|  |     scene_app_gui->timer = | ||||||
|  |         osTimerNew(dolphin_engine_tick_callback, osTimerPeriodic, scene_app_gui->mqueue, NULL); | ||||||
|  |     printf("scene_alloc: timer %p\r\n", scene_app_gui->timer); | ||||||
|  |     // Scene State
 | ||||||
|  |     SceneState* scene_state = furi_alloc(sizeof(SceneState)); | ||||||
|     scene_state->player.y = DOLPHIN_DEFAULT_Y; |     scene_state->player.y = DOLPHIN_DEFAULT_Y; | ||||||
|     scene_state->player.x = DOLPHIN_CENTER; |     scene_state->player.x = DOLPHIN_CENTER; | ||||||
| 
 |  | ||||||
|     //randomize position
 |  | ||||||
|     scene_state->player_global.x = random() % WORLD_WIDTH / 4; |     scene_state->player_global.x = random() % WORLD_WIDTH / 4; | ||||||
| 
 |  | ||||||
|     scene_state->screen.x = scene_state->player.x; |     scene_state->screen.x = scene_state->player.x; | ||||||
|     scene_state->screen.y = scene_state->player.y; |     scene_state->screen.y = scene_state->player.y; | ||||||
| 
 | 
 | ||||||
|     ValueMutex* scene_state_mutex = furi_alloc(sizeof(ValueMutex)); |     scene_state_mutex = furi_alloc(sizeof(ValueMutex)); | ||||||
|     if(scene_state_mutex == NULL || |     furi_check(init_mutex(scene_state_mutex, scene_state, sizeof(SceneState))); | ||||||
|        !init_mutex(scene_state_mutex, scene_state, sizeof(SceneState))) { |  | ||||||
|         printf("[menu_task] cannot create menu mutex\r\n"); |  | ||||||
|         furi_check(0); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // Open GUI and register view_port
 |  | ||||||
|     scene_state->ui.gui = furi_record_open("gui"); |  | ||||||
| 
 |  | ||||||
|     // Allocate and configure view_port
 |  | ||||||
|     scene_state->ui.view_port = view_port_alloc(); |  | ||||||
| 
 | 
 | ||||||
|     // Open GUI and register fullscreen view_port
 |     // Open GUI and register fullscreen view_port
 | ||||||
|     gui_add_view_port(scene_state->ui.gui, scene_state->ui.view_port, GuiLayerMain); |     view_port_draw_callback_set(scene_app_gui->view_port, dolphin_scene_redraw, scene_state_mutex); | ||||||
|     view_port_draw_callback_set( |  | ||||||
|         scene_state->ui.view_port, dolphin_scene_redraw, scene_state_mutex); |  | ||||||
|     view_port_input_callback_set( |     view_port_input_callback_set( | ||||||
|         scene_state->ui.view_port, dolphin_engine_event_cb, scene_state->ui.mqueue); |         scene_app_gui->view_port, dolphin_engine_input_callback, scene_app_gui->mqueue); | ||||||
|     view_port_enabled_set(scene_state->ui.view_port, true); |     gui_add_view_port(scene_app_gui->gui, scene_app_gui->view_port, GuiLayerMain); | ||||||
| 
 |     view_port_enabled_set(scene_app_gui->view_port, true); | ||||||
|     scene_state->ui.timer = |     printf("scene_alloc: complete\r\n"); | ||||||
|         osTimerNew(dolphin_engine_tick_cb, osTimerPeriodic, scene_state->ui.mqueue, NULL); |  | ||||||
| 
 |  | ||||||
|     return scene_state_mutex; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void scene_free(ValueMutex* scene_state_mutex) { | void scene_free() { | ||||||
|     furi_assert(scene_state_mutex); |     printf("scene_free: start\r\n"); | ||||||
|  |     view_port_enabled_set(scene_app_gui->view_port, false); | ||||||
|  |     gui_remove_view_port(scene_app_gui->gui, scene_app_gui->view_port); | ||||||
| 
 | 
 | ||||||
|     SceneState* scene_state = (SceneState*)acquire_mutex_block(scene_state_mutex); |     SceneState* scene_state = (SceneState*)acquire_mutex_block(scene_state_mutex); | ||||||
| 
 |     furi_assert(scene_state); | ||||||
|     osTimerDelete(scene_state->ui.timer); |  | ||||||
|     gui_remove_view_port(scene_state->ui.gui, scene_state->ui.view_port); |  | ||||||
|     view_port_free(scene_state->ui.view_port); |  | ||||||
|     furi_record_close("gui"); |  | ||||||
|     osMessageQueueDelete(scene_state->ui.mqueue); |  | ||||||
|     free(scene_state); |     free(scene_state); | ||||||
| 
 |  | ||||||
|     release_mutex(scene_state_mutex, scene_state); |     release_mutex(scene_state_mutex, scene_state); | ||||||
|     delete_mutex(scene_state_mutex); |     delete_mutex(scene_state_mutex); | ||||||
|     free(scene_state_mutex); |     free(scene_state_mutex); | ||||||
|  |     scene_state_mutex = NULL; | ||||||
|  | 
 | ||||||
|  |     furi_check(osTimerDelete(scene_app_gui->timer) == osOK); | ||||||
|  |     furi_record_close("gui"); | ||||||
|  |     view_port_free(scene_app_gui->view_port); | ||||||
|  |     furi_check(osMessageQueueDelete(scene_app_gui->mqueue) == osOK); | ||||||
|  |     free(scene_app_gui); | ||||||
|  |     scene_app_gui = NULL; | ||||||
|  |     printf("scene_free: complete\r\n"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int32_t dolphin_scene(void* p) { | int32_t dolphin_scene(void* p) { | ||||||
|     ValueMutex* scene_state_mutex = scene_init(); |     api_hal_power_insomnia_enter(); | ||||||
|  |     scene_alloc(); | ||||||
| 
 | 
 | ||||||
|     furi_record_create("scene", scene_state_mutex); |     osTimerStart(scene_app_gui->timer, 40); | ||||||
| 
 | 
 | ||||||
|     SceneState* _state = (SceneState*)acquire_mutex_block(scene_state_mutex); |  | ||||||
|     osTimerStart(_state->ui.timer, 40); |  | ||||||
|     uint32_t t = xTaskGetTickCount(); |     uint32_t t = xTaskGetTickCount(); | ||||||
|     uint32_t prev_t = 0; |     uint32_t prev_t = 0; | ||||||
|     osMessageQueueId_t q = _state->ui.mqueue; |  | ||||||
|     release_mutex(scene_state_mutex, _state); |  | ||||||
| 
 | 
 | ||||||
|     while(1) { |     while(1) { | ||||||
|         AppEvent event; |         AppEvent event; | ||||||
|         if(osMessageQueueGet(q, &event, 0, osWaitForever) == osOK) { |         if(osMessageQueueGet(scene_app_gui->mqueue, &event, 0, osWaitForever) == osOK) { | ||||||
|             SceneState* _state = (SceneState*)acquire_mutex_block(scene_state_mutex); |             SceneState* scene_state = (SceneState*)acquire_mutex_block(scene_state_mutex); | ||||||
|             if(event.type == EventTypeTick) { |             if(event.type == EventTypeTick) { | ||||||
|                 t = xTaskGetTickCount(); |                 t = xTaskGetTickCount(); | ||||||
|                 dolphin_scene_tick_handler(_state, t, (t - prev_t) % 1024); |                 dolphin_scene_tick_handler(scene_state, t, (t - prev_t) % 1024); | ||||||
|                 prev_t = t; |                 prev_t = t; | ||||||
|             } else if(event.type == EventTypeKey) { |             } else if(event.type == EventTypeKey) { | ||||||
|                 if(event.value.input.key == InputKeyBack && |                 if(event.value.input.key == InputKeyBack && | ||||||
|                    event.value.input.type == InputTypeShort) { |                    event.value.input.type == InputTypeShort) { | ||||||
|                     release_mutex(scene_state_mutex, _state); |                     release_mutex(scene_state_mutex, scene_state); | ||||||
|                     break; |                     break; | ||||||
| 
 | 
 | ||||||
|                 } else { |                 } else { | ||||||
|                     dolphin_scene_handle_input(_state, &event.value.input); |                     dolphin_scene_handle_input(scene_state, &event.value.input); | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             release_mutex(scene_state_mutex, _state); |             release_mutex(scene_state_mutex, scene_state); | ||||||
|             view_port_update(_state->ui.view_port); |             view_port_update(scene_app_gui->view_port); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     scene_free(scene_state_mutex); |     osTimerStop(scene_app_gui->timer); | ||||||
| 
 |     scene_free(); | ||||||
|  |     api_hal_power_insomnia_exit(); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | |||||||
| @ -53,15 +53,15 @@ static void dolphin_scene_start_app(SceneState* state, const FlipperApplication* | |||||||
|     furi_assert(state); |     furi_assert(state); | ||||||
|     furi_assert(flipper_app); |     furi_assert(flipper_app); | ||||||
| 
 | 
 | ||||||
|     state->ui.scene_app_thread = furi_thread_alloc(); |     state->scene_app_thread = furi_thread_alloc(); | ||||||
| 
 | 
 | ||||||
|     furi_assert(flipper_app->app); |     furi_assert(flipper_app->app); | ||||||
|     furi_assert(flipper_app->name); |     furi_assert(flipper_app->name); | ||||||
| 
 | 
 | ||||||
|     furi_thread_set_name(state->ui.scene_app_thread, flipper_app->name); |     furi_thread_set_name(state->scene_app_thread, flipper_app->name); | ||||||
|     furi_thread_set_stack_size(state->ui.scene_app_thread, flipper_app->stack_size); |     furi_thread_set_stack_size(state->scene_app_thread, flipper_app->stack_size); | ||||||
|     furi_thread_set_callback(state->ui.scene_app_thread, flipper_app->app); |     furi_thread_set_callback(state->scene_app_thread, flipper_app->app); | ||||||
|     furi_thread_start(state->ui.scene_app_thread); |     furi_thread_start(state->scene_app_thread); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const Item* is_nearby(SceneState* state) { | const Item* is_nearby(SceneState* state) { | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ static const uint8_t api_hal_subghz_preset_ook_async_regs[][2] = { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const uint8_t api_hal_subghz_preset_ook_async_patable[8] = { | static const uint8_t api_hal_subghz_preset_ook_async_patable[8] = { | ||||||
|     0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |     0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const uint8_t api_hal_subghz_preset_2fsk_packet_regs[][2] = { | static const uint8_t api_hal_subghz_preset_2fsk_packet_regs[][2] = { | ||||||
| @ -33,7 +33,7 @@ static const uint8_t api_hal_subghz_preset_2fsk_packet_regs[][2] = { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static const uint8_t api_hal_subghz_preset_2fsk_packet_patable[8] = { | static const uint8_t api_hal_subghz_preset_2fsk_packet_patable[8] = { | ||||||
|     0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |     0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void api_hal_subghz_init() { | void api_hal_subghz_init() { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく