diff options
-rw-r--r-- | apps/features.txt | 4 | ||||
-rw-r--r-- | apps/lang/english-us.lang | 17 | ||||
-rw-r--r-- | apps/lang/english.lang | 17 | ||||
-rw-r--r-- | apps/menus/settings_menu.c | 7 | ||||
-rw-r--r-- | apps/settings.c | 4 | ||||
-rw-r--r-- | apps/settings.h | 4 | ||||
-rw-r--r-- | apps/settings_list.c | 8 | ||||
-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 |
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 @@ -10606,6 +10606,23 @@ </voice> </phrase> <phrase> + id: LANG_DEADZONE + desc: touchpad deadzone setting + user: core + <source> + *: none + sansafuzeplus: "Touchpad Dead Zone" + </source> + <dest> + *: none + sansafuzeplus: "Touchpad Dead Zone" + </dest> + <voice> + *: none + sansafuzeplus: "Touchpad Dead Zone" + </voice> +</phrase> +<phrase> id: LANG_HIGH desc: in settings_menu user: core 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 @@ -10693,6 +10693,23 @@ </voice> </phrase> <phrase> + id: LANG_DEADZONE + desc: touchpad deadzone setting + user: core + <source> + *: none + sansafuzeplus: "Touchpad Dead Zone" + </source> + <dest> + *: none + sansafuzeplus: "Touchpad Dead Zone" + </dest> + <voice> + *: none + sansafuzeplus: "Touchpad Dead Zone" + </voice> +</phrase> +<phrase> id: LANG_HIGH desc: in settings_menu user: core 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 <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 */ |