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"
+
+
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"
+
+
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 */