diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 2e3adc256e..757fa58bb6 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -11716,3 +11716,37 @@
recording: "Stop Recording And Shutdown"
+
+ id: LANG_TOUCHPAD_SENSITIVITY
+ desc: touchpad sensitivity setting
+ user:
+
+ *: none
+ gigabeatf: "Touchpad Sensitivity"
+
+
+ *: none
+ gigabeatf: "Touchpad Sensitivity"
+
+
+ *: none
+ gigabeatf: "Touchpad Sensitivity"
+
+
+
+ id: LANG_HIGH
+ desc: in settings_menu
+ user:
+
+ *: none
+ gigabeatf: "High"
+
+
+ *: none
+ gigabeatf: "High"
+
+
+ *: none
+ gigabeatf: "High"
+
+
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index 0dbea54496..05cfd23e32 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -361,6 +361,10 @@ MENUITEM_SETTING(buttonlight_timeout, &global_settings.buttonlight_timeout, NULL
MENUITEM_SETTING(buttonlight_brightness, &global_settings.buttonlight_brightness, NULL);
#endif
+#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
+MENUITEM_SETTING(touchpad_sensitivity, &global_settings.touchpad_sensitivity, NULL);
+#endif
+
MAKE_MENU(system_menu, ID2P(LANG_SYSTEM),
0, Icon_System_menu,
@@ -399,6 +403,9 @@ MAKE_MENU(system_menu, ID2P(LANG_SYSTEM),
#endif
#if CONFIG_CODEC == SWCODEC
&keyclick_menu,
+#endif
+#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
+ &touchpad_sensitivity,
#endif
);
diff --git a/apps/settings.c b/apps/settings.c
index 1a857eacd8..340adba5b8 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -929,6 +929,10 @@ void settings_apply(bool read_disk)
#endif
#endif /* HAVE_BACKLIGHT */
+#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
+ touchpad_set_sensitivity(global_settings.touchpad_sensitivity);
+#endif
+
/* This should stay last */
#if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC
enc_global_settings_apply();
diff --git a/apps/settings.h b/apps/settings.h
index 320e2b0517..a7772a6937 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -740,6 +740,9 @@ struct user_settings
unsigned char playlist_catalog_dir[MAX_FILENAME+1];
bool study_mode; /* study mode enabled */
int study_hop_step; /* hop step in study mode, in seconds */
+#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
+ int touchpad_sensitivity;
+#endif
};
/** global variables **/
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 8576c5b926..48e3758ef7 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1321,6 +1321,11 @@ const struct settings_list settings[] = {
#endif /* CONFIG_CODEC == SWCODEC */
FILENAME_SETTING(0, playlist_catalog_dir, "playlist catalog directory",
PLAYLIST_CATALOG_DEFAULT_DIR, NULL, NULL, MAX_FILENAME+1),
+#ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING
+ CHOICE_SETTING(0, touchpad_sensitivity, LANG_TOUCHPAD_SENSITIVITY, 0,
+ "touchpad sensitivity", "normal,high", touchpad_set_sensitivity, 2,
+ ID2P(LANG_NORMAL), ID2P(LANG_HIGH)),
+#endif
};
const int nb_settings = sizeof(settings)/sizeof(*settings);
diff --git a/firmware/export/config-gigabeat.h b/firmware/export/config-gigabeat.h
index 03cedd0049..cf64baab12 100644
--- a/firmware/export/config-gigabeat.h
+++ b/firmware/export/config-gigabeat.h
@@ -48,6 +48,8 @@
/* We don't use a setting but a fixed delay after the backlight has
* turned off */
#define LCD_SLEEP_TIMEOUT (5*HZ)
+
+#define HAVE_TOUCHPAD_SENSITIVITY_SETTING
#endif /* BOOTLOADER */
#define CONFIG_KEYPAD GIGABEAT_PAD
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c b/firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c
index 9f6d54df9d..c43d1884f4 100644
--- a/firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c
+++ b/firmware/target/arm/s3c2440/gigabeat-fx/button-meg-fx.c
@@ -30,6 +30,20 @@
static bool headphones_detect;
static bool hold_button = false;
+#define TOUCHPAD_SENS_NORMAL ((1 << 12) | /* right++ */ \
+ (1 << 7) | /* left++ */ \
+ (1 << 6) | /* down++*/ \
+ (1 << 0) | /* up++ */ \
+ (1 << 3)) /* center */
+
+#define TOUCHPAD_SENS_HIGH (((1 << 12) | (1 << 11)) | /* right++, right+ */ \
+ ((1 << 8) | (1 << 7)) | /* left+, left++ */ \
+ ((1 << 6) | (1 << 5)) | /* down++, down+ */ \
+ ((1 << 1) | (1 << 0)) | /* up+, up++ */ \
+ (1 << 3)) /* Center */
+
+static int touchpad_mask = TOUCHPAD_SENS_NORMAL;
+
static int const remote_buttons[] =
{
BUTTON_NONE, /* Headphones connected - remote disconnected */
@@ -123,30 +137,31 @@ int button_read_device(void)
}
/* the touchpad - only watch the lines we actually read */
- touchpad = GPJDAT & (((1 << 12) | (1 << 11)) | /* right++, right+ */
- ((1 << 8) | (1 << 7)) | /* left+, left++ */
- ((1 << 6) | (1 << 5)) | /* down++, down+ */
- ((1 << 1) | (1 << 0)) | /* up+, up++ */
- (1 << 3)); /* center */
+ touchpad = GPJDAT & touchpad_mask;
+
if (touchpad)
{
if (touchpad & (1 << 3))
{
btn |= BUTTON_SELECT;
- /* Desensitize middle (+) detectors one level */
- touchpad &= ~((1 << 11) | (1 << 8) | (1 << 5) | (1 << 1));
+ /* Desensitize all but outer detectors and still allow a combo if
+ * that's really intended. */
+ touchpad &= TOUCHPAD_SENS_NORMAL;
}
- if (touchpad & ((1 << 1) | (1 << 0)))
+ /* Simply include all lines in checks since "touchpad" has been
+ * masked to desired sensitivity already - allows any mask to be
+ * used without changing this code. */
+ if (touchpad & ((1 << 2) | (1 << 1) | (1 << 0)))
btn |= BUTTON_UP;
- if (touchpad & ((1 << 12) | (1 << 11)))
+ if (touchpad & ((1 << 12) | (1 << 11) | (1 << 10)))
btn |= BUTTON_RIGHT;
- if (touchpad & ((1 << 6) | (1 << 5)))
+ if (touchpad & ((1 << 6) | (1 << 5) | (1 << 4)))
btn |= BUTTON_DOWN;
- if (touchpad & ((1 << 8) | (1 << 7)))
+ if (touchpad & ((1 << 9) | (1 << 8) | (1 << 7)))
btn |= BUTTON_LEFT;
buttonlight_on();
@@ -155,6 +170,20 @@ int button_read_device(void)
return btn;
}
+void touchpad_set_sensitivity(int level)
+{
+ static const int masks[] =
+ {
+ TOUCHPAD_SENS_NORMAL,
+ TOUCHPAD_SENS_HIGH
+ };
+
+ if ((unsigned)level >= ARRAYLEN(masks))
+ level = 0;
+
+ touchpad_mask = masks[level];
+}
+
bool headphones_inserted(void)
{
return headphones_detect;
diff --git a/firmware/target/arm/s3c2440/gigabeat-fx/button-target.h b/firmware/target/arm/s3c2440/gigabeat-fx/button-target.h
index 7a39212de9..a5876aadde 100644
--- a/firmware/target/arm/s3c2440/gigabeat-fx/button-target.h
+++ b/firmware/target/arm/s3c2440/gigabeat-fx/button-target.h
@@ -27,6 +27,7 @@
bool button_hold(void);
void button_init_device(void);
int button_read_device(void);
+void touchpad_set_sensitivity(int level);
/* Toshiba Gigabeat specific button codes */