Gui: refactor buttons remapping (#1949)

* Gui: refactor buttons remapping
  Instead of calling 3 separate functions with a ton of switch/case statements,
  use a 2-dimensional lookup table to remap buttons based on the orientation.
* Gui: cleanup input mapping and fix incorrect asserts
* SnakeGame: handle input special case

Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
Vasyl "vk" Kaigorodov 2022-11-02 15:36:17 +01:00 committed by GitHub
parent 104a1998a5
commit abfa804ae0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 51 additions and 67 deletions

View File

@ -380,6 +380,8 @@ int32_t snake_game_app(void* p) {
case InputKeyBack: case InputKeyBack:
processing = false; processing = false;
break; break;
default:
break;
} }
} }
} else if(event.type == EventTypeTick) { } else if(event.type == EventTypeTick) {

View File

@ -7,61 +7,51 @@
// TODO add mutex to view_port ops // TODO add mutex to view_port ops
static void view_port_remap_buttons_vertical(InputEvent* event) { _Static_assert(ViewPortOrientationMAX == 4, "Incorrect ViewPortOrientation count");
switch(event->key) { _Static_assert(
case InputKeyUp: (ViewPortOrientationHorizontal == 0 && ViewPortOrientationHorizontalFlip == 1 &&
event->key = InputKeyRight; ViewPortOrientationVertical == 2 && ViewPortOrientationVerticalFlip == 3),
break; "Incorrect ViewPortOrientation order");
case InputKeyDown: _Static_assert(InputKeyMAX == 6, "Incorrect InputKey count");
event->key = InputKeyLeft; _Static_assert(
break; (InputKeyUp == 0 && InputKeyDown == 1 && InputKeyRight == 2 && InputKeyLeft == 3 &&
case InputKeyRight: InputKeyOk == 4 && InputKeyBack == 5),
event->key = InputKeyDown; "Incorrect InputKey order");
break;
case InputKeyLeft:
event->key = InputKeyUp;
break;
default:
break;
}
}
static void view_port_remap_buttons_vertical_flip(InputEvent* event) { /** InputKey directional keys mappings for different screen orientations
switch(event->key) { *
case InputKeyUp: */
event->key = InputKeyLeft; static const InputKey view_port_input_mapping[ViewPortOrientationMAX][InputKeyMAX] = {
break; {InputKeyUp,
case InputKeyDown: InputKeyDown,
event->key = InputKeyRight; InputKeyRight,
break; InputKeyLeft,
case InputKeyRight: InputKeyOk,
event->key = InputKeyUp; InputKeyBack}, //ViewPortOrientationHorizontal
break; {InputKeyDown,
case InputKeyLeft: InputKeyUp,
event->key = InputKeyDown; InputKeyLeft,
break; InputKeyRight,
default: InputKeyOk,
break; InputKeyBack}, //ViewPortOrientationHorizontalFlip
} {InputKeyRight,
} InputKeyLeft,
InputKeyDown,
InputKeyUp,
InputKeyOk,
InputKeyBack}, //ViewPortOrientationVertical
{InputKeyLeft,
InputKeyRight,
InputKeyUp,
InputKeyDown,
InputKeyOk,
InputKeyBack}, //ViewPortOrientationVerticalFlip
};
static void view_port_remap_buttons_horizontal_flip(InputEvent* event) { // Remaps directional pad buttons on Flipper based on ViewPort orientation
switch(event->key) { static void view_port_map_input(InputEvent* event, ViewPortOrientation orientation) {
case InputKeyUp: furi_assert(orientation < ViewPortOrientationMAX && event->key < InputKeyMAX);
event->key = InputKeyDown; event->key = view_port_input_mapping[orientation][event->key];
break;
case InputKeyDown:
event->key = InputKeyUp;
break;
case InputKeyRight:
event->key = InputKeyLeft;
break;
case InputKeyLeft:
event->key = InputKeyRight;
break;
default:
break;
}
} }
static void view_port_setup_canvas_orientation(const ViewPort* view_port, Canvas* canvas) { static void view_port_setup_canvas_orientation(const ViewPort* view_port, Canvas* canvas) {
@ -170,19 +160,7 @@ void view_port_input(ViewPort* view_port, InputEvent* event) {
if(view_port->input_callback) { if(view_port->input_callback) {
ViewPortOrientation orientation = view_port_get_orientation(view_port); ViewPortOrientation orientation = view_port_get_orientation(view_port);
switch(orientation) { view_port_map_input(event, orientation);
case ViewPortOrientationHorizontalFlip:
view_port_remap_buttons_horizontal_flip(event);
break;
case ViewPortOrientationVertical:
view_port_remap_buttons_vertical(event);
break;
case ViewPortOrientationVerticalFlip:
view_port_remap_buttons_vertical_flip(event);
break;
default:
break;
}
view_port->input_callback(event, view_port->input_callback_context); view_port->input_callback(event, view_port->input_callback_context);
} }
} }

View File

@ -19,6 +19,7 @@ typedef enum {
ViewPortOrientationHorizontalFlip, ViewPortOrientationHorizontalFlip,
ViewPortOrientationVertical, ViewPortOrientationVertical,
ViewPortOrientationVerticalFlip, ViewPortOrientationVerticalFlip,
ViewPortOrientationMAX, /**< Special value, don't use it */
} ViewPortOrientation; } ViewPortOrientation;
/** ViewPort Draw callback /** ViewPort Draw callback

View File

@ -60,8 +60,9 @@ const char* input_get_type_name(InputType type) {
return "Long"; return "Long";
case InputTypeRepeat: case InputTypeRepeat:
return "Repeat"; return "Repeat";
default:
return "Unknown";
} }
return "Unknown";
} }
int32_t input_srv(void* p) { int32_t input_srv(void* p) {

View File

@ -22,6 +22,7 @@ typedef enum {
InputTypeShort, /**< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */ InputTypeShort, /**< Short event, emitted after InputTypeRelease done withing INPUT_LONG_PRESS interval */
InputTypeLong, /**< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */ InputTypeLong, /**< Long event, emmited after INPUT_LONG_PRESS interval, asynchronouse to InputTypeRelease */
InputTypeRepeat, /**< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */ InputTypeRepeat, /**< Repeat event, emmited with INPUT_REPEATE_PRESS period after InputTypeLong event */
InputTypeMAX, /**< Special value for exceptional */
} InputType; } InputType;
/** Input Event, dispatches with FuriPubSub */ /** Input Event, dispatches with FuriPubSub */

View File

@ -20,6 +20,7 @@ typedef enum {
InputKeyLeft, InputKeyLeft,
InputKeyOk, InputKeyOk,
InputKeyBack, InputKeyBack,
InputKeyMAX, /**< Special value */
} InputKey; } InputKey;
/* Light */ /* Light */