diff options
| author | Amaury Pouly <amaury.pouly@gmail.com> | 2013-12-01 18:25:42 +0000 |
|---|---|---|
| committer | Amaury Pouly <amaury.pouly@gmail.com> | 2014-09-08 11:21:54 +0200 |
| commit | 8146b40e73bb999001787fbf414c96acf5dce2a8 (patch) | |
| tree | e3a1b2f951fd439c71d82e387d04df10d926b4e9 /firmware | |
| parent | 847106cdb20a0297dc9a10f212f0e3c8e6f3d58c (diff) | |
| download | rockbox-8146b40e73bb999001787fbf414c96acf5dce2a8.zip rockbox-8146b40e73bb999001787fbf414c96acf5dce2a8.tar.gz rockbox-8146b40e73bb999001787fbf414c96acf5dce2a8.tar.bz2 rockbox-8146b40e73bb999001787fbf414c96acf5dce2a8.tar.xz | |
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 <foolshperson@gmail.com>
Tested: Benjamin Brown <foolshperson@gmail.com>
Reviewed-by: Amaury Pouly <amaury.pouly@gmail.com>
Diffstat (limited to 'firmware')
| -rw-r--r-- | firmware/export/config/sansafuzeplus.h | 8 | ||||
| -rw-r--r-- | firmware/target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c | 66 | ||||
| -rw-r--r-- | firmware/target/arm/imx233/sansa-fuzeplus/button-target.h | 1 |
3 files changed, 47 insertions, 28 deletions
diff --git a/firmware/export/config/sansafuzeplus.h b/firmware/export/config/sansafuzeplus.h index c6f30ab..270060d 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 f4166d0..ea4aa08 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 ce5ffe4..7a4396e 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 <stdbool.h> 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 */ |