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