diff --git a/apps/action.h b/apps/action.h index e54d5de..5dd80b4 100644 --- a/apps/action.h +++ b/apps/action.h @@ -149,6 +149,15 @@ enum { ACTION_LIST_VOLUP, ACTION_LIST_VOLDOWN, #endif +#ifdef HAVE_PLAYBACK_CONTROL_IN_LIST + ACTION_LIST_PLAY, + ACTION_LIST_SKIPPREV, + ACTION_LIST_SKIPNEXT, + ACTION_LIST_NEXTDIR, + ACTION_LIST_SEEKBACK, + ACTION_LIST_SEEKFWD, + ACTION_LIST_STOPSEEK, +#endif /* tree */ ACTION_TREE_ROOT_INIT, diff --git a/apps/features.txt b/apps/features.txt index a65744f..8248bde 100644 --- a/apps/features.txt +++ b/apps/features.txt @@ -271,6 +271,10 @@ recording_digital lowmem #endif +#if defined(HAVE_BUTTONS_IN_HOLD_MODE) +buttons_in_hold +#endif + #if defined(HAVE_HARDWARE_CLICK) hardware_click #endif diff --git a/apps/gui/list.c b/apps/gui/list.c index 26b6ae3..a5e778c 100644 --- a/apps/gui/list.c +++ b/apps/gui/list.c @@ -42,6 +42,11 @@ #include "appevents.h" #include "statusbar-skinned.h" +#ifdef HAVE_PLAYBACK_CONTROL_IN_LIST +#include "playback.h" +#include "wps.h" /* for ffwd_rew() */ +#endif + /* The minimum number of pending button events in queue before starting * to limit list drawing interval. */ @@ -698,6 +703,40 @@ bool gui_synclist_do_button(struct gui_synclist * lists, setvol(); return true; #endif +#ifdef HAVE_PLAYBACK_CONTROL_IN_LIST + case ACTION_LIST_PLAY: + if (audio_status() & AUDIO_STATUS_PAUSE) { + audio_resume(); + } else { + audio_pause(); + } + return true; + + case ACTION_LIST_SKIPPREV: + audio_prev(); + return true; + + case ACTION_LIST_SKIPNEXT: + audio_next(); + return true; + + case ACTION_LIST_NEXTDIR: + audio_next_dir(); + return true; + + case ACTION_LIST_SEEKFWD: + ffwd_rew(ACTION_WPS_SEEKFWD); + return true; + + case ACTION_LIST_SEEKBACK: + ffwd_rew(ACTION_WPS_SEEKBACK); + return true; + + case ACTION_LIST_STOPSEEK: + ffwd_rew(ACTION_WPS_STOPSEEK); + return true; +#endif + case ACTION_STD_PREV: case ACTION_STD_PREVREPEAT: gui_list_select_at_offset(lists, -next_item_modifier); diff --git a/apps/keymaps/keymap-cowond2.c b/apps/keymaps/keymap-cowond2.c index 09d1712..cb90070 100644 --- a/apps/keymaps/keymap-cowond2.c +++ b/apps/keymaps/keymap-cowond2.c @@ -64,10 +64,35 @@ static const struct button_mapping button_context_wps[] = { { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU }, +#ifdef HAVE_BUTTONS_IN_HOLD_MODE + /* Make the player more usable whilst in your pocket, with the hold switch on */ + { ACTION_WPS_VOLDOWN, BUTTON_HOLDMINUS|BUTTON_REL, BUTTON_HOLDMINUS }, + { ACTION_WPS_VOLUP, BUTTON_HOLDPLUS|BUTTON_REL, BUTTON_HOLDPLUS }, + { ACTION_WPS_PLAY, BUTTON_HOLDMENU|BUTTON_REL, BUTTON_HOLDMENU }, + { ACTION_WPS_SKIPPREV, BUTTON_HOLDMINUS|BUTTON_REPEAT, BUTTON_HOLDMINUS }, + { ACTION_WPS_SKIPNEXT, BUTTON_HOLDPLUS|BUTTON_REPEAT, BUTTON_HOLDPLUS }, + { ACTION_WPS_ABSETB_NEXTDIR, BUTTON_HOLDMENU|BUTTON_REPEAT, BUTTON_HOLDMENU }, +#endif + LAST_ITEM_IN_LIST }; /* button_context_wps */ static const struct button_mapping button_context_list[] = { + + /* Make the player more usable whilst in your pocket, with the hold switch on */ +#ifdef HAVE_BUTTONS_IN_HOLD_MODE +#ifdef HAVE_VOLUME_IN_LIST + { ACTION_LIST_VOLDOWN, BUTTON_HOLDMINUS|BUTTON_REL, BUTTON_HOLDMINUS }, + { ACTION_LIST_VOLUP, BUTTON_HOLDPLUS|BUTTON_REL, BUTTON_HOLDPLUS }, +#endif +#ifdef HAVE_PLAYBACK_CONTROL_IN_LIST + { ACTION_LIST_PLAY, BUTTON_HOLDMENU|BUTTON_REL, BUTTON_HOLDMENU }, + { ACTION_LIST_SKIPPREV, BUTTON_HOLDMINUS|BUTTON_REPEAT, BUTTON_HOLDMINUS }, + { ACTION_LIST_SKIPNEXT, BUTTON_HOLDPLUS|BUTTON_REPEAT, BUTTON_HOLDPLUS }, + { ACTION_LIST_NEXTDIR, BUTTON_HOLDMENU|BUTTON_REPEAT, BUTTON_HOLDMENU }, +#endif +#endif /* HAVE_BUTTONS_IN_HOLD_MODE */ + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_list */ diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 26c0051..6142e0f 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -13114,3 +13114,21 @@ *: "Select directories to scan" + + id: LANG_HOLD_PLAYBACK_CONTROL + desc: in the Playback settings menu + user: core + + *: none + buttons_in_hold: "Playback Control in Hold Mode" + + + *: none + buttons_in_hold: "Playback Control in Hold Mode" + + + *: none + buttons_in_hold: "Playback Control in Hold Mode" + + + \ No newline at end of file diff --git a/apps/lang/russian.lang b/apps/lang/russian.lang index 79b839a..a432bc9 100644 --- a/apps/lang/russian.lang +++ b/apps/lang/russian.lang @@ -13038,3 +13038,20 @@ *: "Выберите папки для сканирования" + + id: LANG_HOLD_PLAYBACK_CONTROL + desc: in the Playback settings menu + user: core + + *: none + buttons_in_hold: "Playback Control in Hold Mode" + + + *: none + buttons_in_hold: "Включить кнопки при блоке?" + + + *: none + buttons_in_hold: "Включить кнопки при блоке?" + + \ No newline at end of file diff --git a/apps/menus/playback_menu.c b/apps/menus/playback_menu.c index 6beda93..24611c6 100644 --- a/apps/menus/playback_menu.c +++ b/apps/menus/playback_menu.c @@ -192,6 +192,9 @@ MENUITEM_SETTING(prevent_skip, &global_settings.prevent_skip, NULL); MENUITEM_SETTING(resume_rewind, &global_settings.resume_rewind, NULL); #endif MENUITEM_SETTING(pause_rewind, &global_settings.pause_rewind, NULL); +#ifdef HAVE_BUTTONS_IN_HOLD_MODE +MENUITEM_SETTING(use_hold_buttons, &global_settings.use_hold_buttons, NULL); +#endif MAKE_MENU(playback_settings,ID2P(LANG_PLAYBACK),0, Icon_Playback_menu, @@ -223,6 +226,9 @@ MAKE_MENU(playback_settings,ID2P(LANG_PLAYBACK),0, &resume_rewind, #endif &pause_rewind, +#ifdef HAVE_BUTTONS_IN_HOLD_MODE + &use_hold_buttons +#endif ); static int playback_callback(int action,const struct menu_item_ex *this_item) diff --git a/apps/settings.c b/apps/settings.c index e2a6efa..f3aa0fa 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -1028,6 +1028,10 @@ void settings_apply(bool read_disk) touchscreen_set_mode(global_settings.touch_mode); memcpy(&calibration_parameters, &global_settings.ts_calibration_data, sizeof(struct touchscreen_parameter)); #endif + +#ifdef HAVE_BUTTONS_IN_HOLD_MODE + button_use_hold_buttons(global_settings.use_hold_buttons); +#endif /* This should stay last */ #if defined(HAVE_RECORDING) && CONFIG_CODEC == SWCODEC diff --git a/apps/settings.h b/apps/settings.h index 2af29ce..3fdd288 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -773,6 +773,10 @@ struct user_settings bool morse_input; /* text input method setting */ #endif +#ifdef HAVE_BUTTONS_IN_HOLD_MODE + bool use_hold_buttons; +#endif + #ifdef HAVE_HOTKEY /* hotkey assignments - acceptable values are in hotkey_action enum in onplay.h */ diff --git a/apps/settings_list.c b/apps/settings_list.c index f27c13c..1cd4639 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -1913,6 +1913,11 @@ const struct settings_list settings[] = { OFFON_SETTING(0, morse_input, LANG_MORSE_INPUT, false, "morse input", NULL), #endif +#ifdef HAVE_BUTTONS_IN_HOLD_MODE + OFFON_SETTING(0, use_hold_buttons, LANG_HOLD_PLAYBACK_CONTROL, false, + "buttons in hold mode", button_use_hold_buttons), +#endif + #ifdef HAVE_HOTKEY TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, hotkey_wps, LANG_HOTKEY_WPS, HOTKEY_VIEW_PLAYLIST, "hotkey wps", diff --git a/firmware/export/config/cowond2.h b/firmware/export/config/cowond2.h index d27589c..85ec35a 100644 --- a/firmware/export/config/cowond2.h +++ b/firmware/export/config/cowond2.h @@ -52,6 +52,15 @@ /* define this if you would like tagcache to build on this target */ #define HAVE_TAGCACHE +/* define this if you have volume keys that can be used in lists */ +#define HAVE_VOLUME_IN_LIST + +/* define this if you have playback control keys that can be used in lists */ +#define HAVE_PLAYBACK_CONTROL_IN_LIST + +/* define this if you can make button combinations using the hold switch */ +#define HAVE_BUTTONS_IN_HOLD_MODE + /* FM Tuner */ #define CONFIG_TUNER LV24020LP #define HAVE_TUNER_PWR_CTRL diff --git a/firmware/target/arm/tcc780x/cowond2/button-cowond2.c b/firmware/target/arm/tcc780x/cowond2/button-cowond2.c index df2ea1f..2d606dd 100644 --- a/firmware/target/arm/tcc780x/cowond2/button-cowond2.c +++ b/firmware/target/arm/tcc780x/cowond2/button-cowond2.c @@ -27,6 +27,13 @@ #include "touchscreen-target.h" #include +static bool use_hold_buttons = false; + +void button_use_hold_buttons(bool yesno) +{ + use_hold_buttons = yesno; +} + void button_init_device(void) { /* Configure GPIOA 4 (POWER) and 8 (HOLD) for input */ @@ -62,9 +69,6 @@ int button_read_device(int *data) backlight_hold_changed(hold_button); #endif - if (hold_button) - return BUTTON_NONE; - if (GPIOB & 0x4) { adc = adc_read(ADC_BUTTONS); @@ -86,6 +90,25 @@ int button_read_device(int *data) btn |= BUTTON_MENU; } } + + /* Hold mode is software controlled so we can make combination buttons */ + if (button_hold()) + { +#ifdef HAVE_BUTTONS_IN_HOLD_MODE + if (use_hold_buttons) + { + if (btn == BUTTON_MINUS) + return BUTTON_HOLDMINUS; + else if (btn == BUTTON_PLUS) + return BUTTON_HOLDPLUS; + else if (btn == BUTTON_MENU) + return BUTTON_HOLDMENU; + } +#endif + + return BUTTON_NONE; + } + btn |= touchscreen_read_device(data, &old_data); diff --git a/firmware/target/arm/tcc780x/cowond2/button-target.h b/firmware/target/arm/tcc780x/cowond2/button-target.h index cca1021..4a4f1f4 100644 --- a/firmware/target/arm/tcc780x/cowond2/button-target.h +++ b/firmware/target/arm/tcc780x/cowond2/button-target.h @@ -24,6 +24,8 @@ #define HAS_BUTTON_HOLD +void button_use_hold_buttons(bool yesno); + /* Main unit's buttons */ #define BUTTON_POWER 0x00000001 #define BUTTON_PLUS 0x00000002 @@ -47,7 +49,18 @@ #define BUTTON_BOTTOMMIDDLE 0x00000800 #define BUTTON_BOTTOMRIGHT 0x00001000 +/* Main unit's buttons whilst hold switch is on */ +#ifdef HAVE_BUTTONS_IN_HOLD_MODE +#define BUTTON_HOLDPLUS 0x00002000 +#define BUTTON_HOLDMINUS 0x00004000 +#define BUTTON_HOLDMENU 0x00008000 +#endif + +#ifdef HAVE_BUTTONS_IN_HOLD_MODE +#define BUTTON_MAIN 0xFFFF +#else #define BUTTON_MAIN 0x1FFF +#endif /* Software power-off */ #define POWEROFF_BUTTON BUTTON_POWER