[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:
Skorpionm
2021-08-31 00:05:09 +04:00
committed by GitHub
parent 8b9210704a
commit 6f7bcdf9a7
21 changed files with 147 additions and 366 deletions

39
applications/gui/view_dispatcher.c Executable file → Normal file
View 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) {