[FL-1755, FL-1756] added LL_DeInit timers, removed Analyze scene, redesigned astomatic frequency change mechanism, updated subghz read scene interface (#677)
* SubGhz: Fix Timer hopping * SubGhz: add display of received packages and their maximum number. redesigned interface, the maximum number of received packages increased to 50 * SubGhz: add clearing history on exit read scene, jump after saving the key into the history of received signals * SubGhz: Fix honoring the width of the icon for transmitter scene * RFID: Fix [FL-1755] freeze after key emulation * SubGhz: drop analyze scene and views * SubGhz: fix save scene * Input, GUI: new event delivery scheme that groups event for complementarity. * Gui: update View Dispatcher documentation * Gui: remove dead code, wait till all input events are delivered in ViewDispatcher in queue mode. * Gui: update comment in ViewDispatcher * FuriHal: fix incorrect clock disable invocation * FuriHal: proper include * SubGhz: properly reset history in receiver view * Gui: correct view switch order and non-complementary events discarding Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
39
applications/gui/view_dispatcher.c
Executable file → Normal file
39
applications/gui/view_dispatcher.c
Executable file → Normal file
@@ -91,6 +91,18 @@ void view_dispatcher_run(ViewDispatcher* view_dispatcher) {
|
||||
view_dispatcher_handle_custom_event(view_dispatcher, message.custom_event);
|
||||
}
|
||||
}
|
||||
|
||||
// Wait till all input events delivered
|
||||
while(view_dispatcher->ongoing_input_events_count > 0) {
|
||||
osMessageQueueGet(view_dispatcher->queue, &message, NULL, osWaitForever);
|
||||
if(message.type == ViewDispatcherMessageTypeInput) {
|
||||
if(message.input.type == InputTypePress) {
|
||||
view_dispatcher->ongoing_input_events_count++;
|
||||
} else if(message.input.type == InputTypeRelease) {
|
||||
view_dispatcher->ongoing_input_events_count--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void view_dispatcher_stop(ViewDispatcher* view_dispatcher) {
|
||||
@@ -153,12 +165,15 @@ void view_dispatcher_switch_to_view(ViewDispatcher* view_dispatcher, uint32_t vi
|
||||
if(view_id == VIEW_NONE) {
|
||||
view_dispatcher_set_current_view(view_dispatcher, NULL);
|
||||
} else if(view_id == VIEW_IGNORE) {
|
||||
} else if(view_id == VIEW_DESTROY) {
|
||||
view_dispatcher_free(view_dispatcher);
|
||||
} else {
|
||||
View** view_pp = ViewDict_get(view_dispatcher->views, view_id);
|
||||
furi_check(view_pp != NULL);
|
||||
view_dispatcher_set_current_view(view_dispatcher, *view_pp);
|
||||
if(view_dispatcher->ongoing_input_events_count > 0) {
|
||||
view_dispatcher->delayed_next_view = *view_pp;
|
||||
} else {
|
||||
view_dispatcher->delayed_next_view = NULL;
|
||||
view_dispatcher_set_current_view(view_dispatcher, *view_pp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,6 +217,16 @@ void view_dispatcher_input_callback(InputEvent* event, void* context) {
|
||||
}
|
||||
|
||||
void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* event) {
|
||||
// Ongoing input events counting
|
||||
if(event->type == InputTypeRelease && view_dispatcher->ongoing_input_events_count > 0) {
|
||||
view_dispatcher->ongoing_input_events_count--;
|
||||
} else if(event->type == InputTypePress) {
|
||||
view_dispatcher->ongoing_input_events_count++;
|
||||
} else if(view_dispatcher->ongoing_input_events_count == 0) {
|
||||
FURI_LOG_E("ViewDispatcher", "non-complementary input, discarding");
|
||||
return;
|
||||
}
|
||||
|
||||
bool is_consumed = false;
|
||||
if(view_dispatcher->current_view) {
|
||||
is_consumed = view_input(view_dispatcher->current_view, event);
|
||||
@@ -219,13 +244,17 @@ void view_dispatcher_handle_input(ViewDispatcher* view_dispatcher, InputEvent* e
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else if(event->key == InputKeyOk) {
|
||||
view_id = view_next(view_dispatcher->current_view);
|
||||
}
|
||||
if(!is_consumed) {
|
||||
view_dispatcher_switch_to_view(view_dispatcher, view_id);
|
||||
}
|
||||
}
|
||||
|
||||
// Delayed view switch
|
||||
if(view_dispatcher->delayed_next_view && view_dispatcher->ongoing_input_events_count == 0) {
|
||||
view_dispatcher_set_current_view(view_dispatcher, view_dispatcher->delayed_next_view);
|
||||
view_dispatcher->delayed_next_view = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void view_dispatcher_handle_tick_event(ViewDispatcher* view_dispatcher) {
|
||||
|
Reference in New Issue
Block a user