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