From 8146b40e73bb999001787fbf414c96acf5dce2a8 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Sun, 1 Dec 2013 18:25:42 +0000 Subject: [PATCH] Fuze+: add a configurable deadzone area for touchpad buttons To stop erroneous button presses, allow users to add a deadzone between the button via the Settings > General > System menu > Touch Dead Zone. The configuration was chosen this way: the touchpad has the same DPI in both direction so the setting applies the same on both the X and Y axis. The setting ranges from 0 to 100 and is internally multiplied by 2 giving a maximum deadzone of 2*100 = 200 around each button, which account for 400 total (once around each button), effectively reducing each virtual button from 1000x600 to 600x200 when using the maximum value. Change-Id: I8683c63d2950200eb32d1dda0a00bbd92d83d5be Reviewed-on: http://gerrit.rockbox.org/677 Reviewed-by: Benjamin Brown Tested: Benjamin Brown Reviewed-by: Amaury Pouly --- apps/features.txt | 4 ++ apps/lang/english-us.lang | 17 +++++ apps/lang/english.lang | 17 +++++ apps/menus/settings_menu.c | 7 ++ apps/settings.c | 4 ++ apps/settings.h | 4 ++ apps/settings_list.c | 8 +++ firmware/export/config/sansafuzeplus.h | 8 +++ .../imx233/sansa-fuzeplus/button-fuzeplus.c | 66 +++++++++++-------- .../arm/imx233/sansa-fuzeplus/button-target.h | 1 + 10 files changed, 108 insertions(+), 28 deletions(-) diff --git a/apps/features.txt b/apps/features.txt index 63f023458f..d9ca1a3ece 100644 --- a/apps/features.txt +++ b/apps/features.txt @@ -199,6 +199,10 @@ lineout_poweroff touchscreen #endif +#if defined(HAVE_TOUCHPAD_DEADZONE) +touchpad_deadzone +#endif + #if defined(HAVE_IMX233_CODEC) || defined(HAVE_WM8750) || defined(HAVE_WM8978) depth_3d #endif diff --git a/apps/lang/english-us.lang b/apps/lang/english-us.lang index a6549dafd5..4a316cedca 100644 --- a/apps/lang/english-us.lang +++ b/apps/lang/english-us.lang @@ -10605,6 +10605,23 @@ gigabeatfx,sansafuzeplus: "Touchpad Sensitivity" + + id: LANG_DEADZONE + desc: touchpad deadzone setting + user: core + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + id: LANG_HIGH desc: in settings_menu diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 9914b160f1..113570522c 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -10692,6 +10692,23 @@ gigabeatfx,sansafuzeplus: "Touchpad Sensitivity" + + id: LANG_DEADZONE + desc: touchpad deadzone setting + user: core + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + id: LANG_HIGH desc: in settings_menu diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c index 0d2a7febf1..130f5be1a2 100644 --- a/apps/menus/settings_menu.c +++ b/apps/menus/settings_menu.c @@ -317,6 +317,10 @@ MENUITEM_SETTING(buttonlight_brightness, &global_settings.buttonlight_brightness MENUITEM_SETTING(touchpad_sensitivity, &global_settings.touchpad_sensitivity, NULL); #endif +#ifdef HAVE_TOUCHPAD_DEADZONE +MENUITEM_SETTING(touchpad_deadzone, &global_settings.touchpad_deadzone, NULL); +#endif + #ifdef HAVE_QUICKSCREEN MENUITEM_SETTING(shortcuts_replaces_quickscreen, &global_settings.shortcuts_replaces_qs, NULL); #endif @@ -363,6 +367,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM), #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING &touchpad_sensitivity, #endif +#ifdef HAVE_TOUCHPAD_DEADZONE + &touchpad_deadzone, +#endif #ifdef USB_ENABLE_HID &usb_hid, &usb_keypad_mode, diff --git a/apps/settings.c b/apps/settings.c index 819924a421..515e7cb5f3 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -1061,6 +1061,10 @@ void settings_apply(bool read_disk) touchpad_set_sensitivity(global_settings.touchpad_sensitivity); #endif +#ifdef HAVE_TOUCHPAD_DEADZONE + touchpad_set_deadzone(global_settings.touchpad_deadzone); +#endif + #ifdef HAVE_USB_CHARGING_ENABLE usb_charging_enable(global_settings.usb_charging); #endif diff --git a/apps/settings.h b/apps/settings.h index 60658f6857..3ec5ee6207 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -460,6 +460,10 @@ struct user_settings int touchpad_sensitivity; #endif +#ifdef HAVE_TOUCHPAD_DEADZONE + int touchpad_deadzone; +#endif + int pause_rewind; /* time in s to rewind when pausing */ #ifdef HAVE_HEADPHONE_DETECTION int unplug_mode; /* pause on headphone unplug */ diff --git a/apps/settings_list.c b/apps/settings_list.c index 53acb78d98..cddc062d40 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -2024,6 +2024,14 @@ const struct settings_list settings[] = { ID2P(LANG_NORMAL), ID2P(LANG_HIGH)), #endif /* boolean or analogig values */ #endif /* HAVE_TOUCHPAD_SENSITIVITY_SETTING */ + +#ifdef HAVE_TOUCHPAD_DEADZONE + INT_SETTING(F_NO_WRAP, touchpad_deadzone, LANG_DEADZONE, + DEFAULT_TOUCHPAD_DEADZONE_SETTING, "touchpad deadzone", UNIT_INT, + MIN_TOUCHPAD_DEADSPACE_SETTING, MAX_TOUCHPAD_DEADSPACE_SETTING, 1, + NULL, NULL, touchpad_set_deadzone), +#endif + #ifdef HAVE_QUICKSCREEN CUSTOM_SETTING(0, qs_items[QUICKSCREEN_TOP], LANG_TOP_QS_ITEM, NULL, "qs top", diff --git a/firmware/export/config/sansafuzeplus.h b/firmware/export/config/sansafuzeplus.h index c6f30ab00e..270060d594 100644 --- a/firmware/export/config/sansafuzeplus.h +++ b/firmware/export/config/sansafuzeplus.h @@ -80,6 +80,14 @@ #define MAX_TOUCHPAD_SENSITIVITY_SETTING 25 #define DEFAULT_TOUCHPAD_SENSITIVITY_SETTING 13 +/* Define this to enable dead zone on touchpad */ +#ifndef SIMULATOR +#define HAVE_TOUCHPAD_DEADZONE +#define DEFAULT_TOUCHPAD_DEADZONE_SETTING 30 +#define MIN_TOUCHPAD_DEADSPACE_SETTING 0 +#define MAX_TOUCHPAD_DEADSPACE_SETTING 100 +#endif + /* Define this to enable morse code input */ #define HAVE_MORSE_INPUT diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c index f4166d0c2c..ea4aa083e5 100644 --- a/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c +++ b/firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c @@ -192,33 +192,22 @@ bool button_debug_screen(void) return true; } -struct button_area_t +/* we emulate a 3x3 grid, this gives the button mapping */ +int button_mapping[3][3] = { - /* define a rectangle region */ - int lx, ly; - int rx, ry; - int button; -}; - -static struct button_area_t button_areas[] = -{ - {1003, 658, 2006, 1316, BUTTON_SELECT}, - {0, 658, 1003, 1316, BUTTON_LEFT}, - {2006, 658, 3009, 1316, BUTTON_RIGHT}, - {1003, 0 , 2006, 658, BUTTON_DOWN}, - {1003, 1316, 2006, 1974, BUTTON_UP}, - {2006, 1316, 3009, 1974, BUTTON_PLAYPAUSE}, - {0, 1316, 1003, 1974, BUTTON_BACK}, - {0, 0 , 1003, 658, BUTTON_BOTTOMLEFT}, - {2006, 0 , 3009, 658, BUTTON_BOTTOMRIGHT}, - {0, 0, 0, 0, 0}, + {BUTTON_BOTTOMLEFT, BUTTON_LEFT, BUTTON_BACK}, + {BUTTON_DOWN, BUTTON_SELECT, BUTTON_UP}, + {BUTTON_BOTTOMRIGHT, BUTTON_RIGHT, BUTTON_PLAYPAUSE}, }; #define RMI_INTERRUPT 1 #define RMI_SET_SENSITIVITY 2 #define RMI_SET_SLEEP_MODE 3 /* timeout before lowering touchpad power from lack of activity */ -#define ACTIVITY_TMO (5 * HZ) +#define ACTIVITY_TMO (5 * HZ) +#define TOUCHPAD_WIDTH 3010 +#define TOUCHPAD_HEIGHT 1975 +#define DEADZONE_MULTIPLIER 2 /* deadzone multiplier */ static int touchpad_btns = 0; static long rmi_stack [DEFAULT_STACK_SIZE/sizeof(long)]; @@ -226,17 +215,38 @@ static const char rmi_thread_name[] = "rmi"; static struct event_queue rmi_queue; static unsigned last_activity = 0; static bool t_enable = true; +static int deadzone; + +/* Ignore deadzone function. If outside of the pad, project to border. */ +static int find_button_no_deadzone(int x, int y) +{ + /* compute grid coordinate */ + int gx = MAX(MIN(x * 3 / TOUCHPAD_WIDTH, 2), 0); + int gy = MAX(MIN(y * 3 / TOUCHPAD_HEIGHT, 2), 0); + + return button_mapping[gx][gy]; +} static int find_button(int x, int y) { - struct button_area_t *area = button_areas; - for(; area->button != 0; area++) - { - if(area->lx <= x && x <= area->rx && - area->ly <= y && y <= area->ry) - return area->button; - } - return 0; + /* find button ignoring deadzones */ + int btn = find_button_no_deadzone(x, y); + /* To check if we are in a deadzone, we try to shift the coordinates + * and see if we get the same button. Not that we do not want to apply + * the deadzone in the borders ! The code works even in the borders because + * the find_button_no_deadzone() project out-of-bound coordinates to the + * borders */ + if(find_button_no_deadzone(x + deadzone, y) != btn || + find_button_no_deadzone(x - deadzone, y) != btn || + find_button_no_deadzone(x, y + deadzone) != btn || + find_button_no_deadzone(x, y - deadzone) != btn) + return 0; + return btn; +} + +void touchpad_set_deadzone(int touchpad_deadzone) +{ + deadzone = touchpad_deadzone * DEADZONE_MULTIPLIER; } static int touchpad_read_device(void) diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/button-target.h b/firmware/target/arm/imx233/sansa-fuzeplus/button-target.h index ce5ffe464a..7a4396e0f2 100644 --- a/firmware/target/arm/imx233/sansa-fuzeplus/button-target.h +++ b/firmware/target/arm/imx233/sansa-fuzeplus/button-target.h @@ -24,6 +24,7 @@ #include bool button_debug_screen(void); void touchpad_set_sensitivity(int level); +void touchpad_set_deadzone(int touchpad_deadzone); void touchpad_enable_device(bool en); /* Main unit's buttons */