diff options
Diffstat (limited to 'firmware/target/hosted')
-rw-r--r-- | firmware/target/hosted/button-devinput.c | 40 | ||||
-rw-r--r-- | firmware/target/hosted/xduoo/button-target.h | 2 | ||||
-rw-r--r-- | firmware/target/hosted/xduoo/button-xduoo.c | 15 |
3 files changed, 45 insertions, 12 deletions
diff --git a/firmware/target/hosted/button-devinput.c b/firmware/target/hosted/button-devinput.c index 90e6fb0340..b1b4dfca5d 100644 --- a/firmware/target/hosted/button-devinput.c +++ b/firmware/target/hosted/button-devinput.c | |||
@@ -19,7 +19,6 @@ | |||
19 | * KIND, either express or implied. | 19 | * KIND, either express or implied. |
20 | * | 20 | * |
21 | ****************************************************************************/ | 21 | ****************************************************************************/ |
22 | |||
23 | #include <poll.h> | 22 | #include <poll.h> |
24 | #include <errno.h> | 23 | #include <errno.h> |
25 | #include <unistd.h> | 24 | #include <unistd.h> |
@@ -72,6 +71,11 @@ void button_close_device(void) | |||
72 | num_devices = 0; | 71 | num_devices = 0; |
73 | } | 72 | } |
74 | 73 | ||
74 | #ifdef BUTTON_DELAY_RELEASE | ||
75 | static int button_delay_release = 0; | ||
76 | static int delay_tick = 0; | ||
77 | #endif | ||
78 | |||
75 | int button_read_device(void) | 79 | int button_read_device(void) |
76 | { | 80 | { |
77 | static int button_bitmap = 0; | 81 | static int button_bitmap = 0; |
@@ -81,6 +85,15 @@ int button_read_device(void) | |||
81 | int wheel_ticks = 0; | 85 | int wheel_ticks = 0; |
82 | #endif | 86 | #endif |
83 | 87 | ||
88 | #ifdef BUTTON_DELAY_RELEASE | ||
89 | /* First de-assert delayed-release buttons */ | ||
90 | if (button_delay_release && current_tick >= delay_tick) | ||
91 | { | ||
92 | button_bitmap &= ~button_delay_release; | ||
93 | button_delay_release = 0; | ||
94 | } | ||
95 | #endif | ||
96 | |||
84 | /* check if there are any events pending and process them */ | 97 | /* check if there are any events pending and process them */ |
85 | while(poll(poll_fds, num_devices, 0)) | 98 | while(poll(poll_fds, num_devices, 0)) |
86 | { | 99 | { |
@@ -92,17 +105,14 @@ int button_read_device(void) | |||
92 | int size = read(poll_fds[i].fd, &event, sizeof(event)); | 105 | int size = read(poll_fds[i].fd, &event, sizeof(event)); |
93 | if(size == (int)sizeof(event)) | 106 | if(size == (int)sizeof(event)) |
94 | { | 107 | { |
95 | int keycode = event.code; | 108 | /* map linux event code to rockbox button bitmap */ |
109 | int bmap = button_map(event.code); | ||
110 | |||
96 | /* event.value == 0x10000 means press | 111 | /* event.value == 0x10000 means press |
97 | * event.value == 0 means release | 112 | * event.value == 0 means release |
98 | */ | 113 | */ |
99 | bool press = event.value ? true : false; | 114 | if(event.value) |
100 | |||
101 | /* map linux event code to rockbox button bitmap */ | ||
102 | if(press) | ||
103 | { | 115 | { |
104 | int bmap = button_map(keycode); | ||
105 | |||
106 | #ifdef HAVE_SCROLLWHEEL | 116 | #ifdef HAVE_SCROLLWHEEL |
107 | /* Filter out wheel ticks */ | 117 | /* Filter out wheel ticks */ |
108 | if (bmap & BUTTON_SCROLL_BACK) | 118 | if (bmap & BUTTON_SCROLL_BACK) |
@@ -111,18 +121,28 @@ int button_read_device(void) | |||
111 | wheel_ticks++; | 121 | wheel_ticks++; |
112 | bmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); | 122 | bmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); |
113 | #endif | 123 | #endif |
124 | #ifdef BUTTON_DELAY_RELEASE | ||
125 | bmap &= ~BUTTON_DELAY_RELEASE; | ||
126 | #endif | ||
114 | button_bitmap |= bmap; | 127 | button_bitmap |= bmap; |
115 | } | 128 | } |
116 | else | 129 | else |
117 | { | 130 | { |
118 | int bmap = button_map(keycode); | 131 | #ifdef BUTTON_DELAY_RELEASE |
132 | /* Delay the release of any requested buttons */ | ||
133 | if (bmap & BUTTON_DELAY_RELEASE) | ||
134 | { | ||
135 | button_delay_release |= bmap & ~BUTTON_DELAY_RELEASE; | ||
136 | delay_tick = current_tick + HZ/20; | ||
137 | bmap = 0; | ||
138 | } | ||
139 | #endif | ||
119 | 140 | ||
120 | #ifdef HAVE_SCROLLWHEEL | 141 | #ifdef HAVE_SCROLLWHEEL |
121 | /* Wheel gives us press+release back to back; ignore the release */ | 142 | /* Wheel gives us press+release back to back; ignore the release */ |
122 | bmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); | 143 | bmap &= ~(BUTTON_SCROLL_BACK|BUTTON_SCROLL_FWD); |
123 | #endif | 144 | #endif |
124 | button_bitmap &= ~bmap; | 145 | button_bitmap &= ~bmap; |
125 | |||
126 | } | 146 | } |
127 | } | 147 | } |
128 | } | 148 | } |
diff --git a/firmware/target/hosted/xduoo/button-target.h b/firmware/target/hosted/xduoo/button-target.h index 20bae1c6f6..d1a2b27624 100644 --- a/firmware/target/hosted/xduoo/button-target.h +++ b/firmware/target/hosted/xduoo/button-target.h | |||
@@ -36,6 +36,8 @@ | |||
36 | #define BUTTON_MAIN (BUTTON_POWER | BUTTON_HOME | BUTTON_OPTION | BUTTON_PREV | \ | 36 | #define BUTTON_MAIN (BUTTON_POWER | BUTTON_HOME | BUTTON_OPTION | BUTTON_PREV | \ |
37 | BUTTON_NEXT | BUTTON_PLAY | BUTTON_VOL_UP | BUTTON_VOL_DOWN) | 37 | BUTTON_NEXT | BUTTON_PLAY | BUTTON_VOL_UP | BUTTON_VOL_DOWN) |
38 | 38 | ||
39 | #define BUTTON_DELAY_RELEASE 0x00010000 | ||
40 | |||
39 | /* Software power-off */ | 41 | /* Software power-off */ |
40 | #define POWEROFF_BUTTON BUTTON_POWER | 42 | #define POWEROFF_BUTTON BUTTON_POWER |
41 | #define POWEROFF_COUNT 25 | 43 | #define POWEROFF_COUNT 25 |
diff --git a/firmware/target/hosted/xduoo/button-xduoo.c b/firmware/target/hosted/xduoo/button-xduoo.c index f5b6c6be62..2daa7da16b 100644 --- a/firmware/target/hosted/xduoo/button-xduoo.c +++ b/firmware/target/hosted/xduoo/button-xduoo.c | |||
@@ -37,10 +37,10 @@ int button_map(int keycode) | |||
37 | return BUTTON_OPTION; | 37 | return BUTTON_OPTION; |
38 | 38 | ||
39 | case KEY_UP: | 39 | case KEY_UP: |
40 | return BUTTON_PREV; | 40 | return BUTTON_NEXT; |
41 | 41 | ||
42 | case KEY_DOWN: | 42 | case KEY_DOWN: |
43 | return BUTTON_NEXT; | 43 | return BUTTON_PREV; |
44 | 44 | ||
45 | case KEY_ENTER: | 45 | case KEY_ENTER: |
46 | return BUTTON_PLAY; | 46 | return BUTTON_PLAY; |
@@ -54,6 +54,17 @@ int button_map(int keycode) | |||
54 | case KEY_POWER: | 54 | case KEY_POWER: |
55 | return BUTTON_POWER; | 55 | return BUTTON_POWER; |
56 | 56 | ||
57 | #if defined(XDUOO_X3II) /* Headphone remote */ | ||
58 | case KEY_NEXTSONG: | ||
59 | return (BUTTON_NEXT | BUTTON_DELAY_RELEASE); | ||
60 | |||
61 | case KEY_PLAYPAUSE: | ||
62 | return (BUTTON_PLAY | BUTTON_DELAY_RELEASE); | ||
63 | |||
64 | case KEY_PREVIOUSSONG: | ||
65 | return (BUTTON_PREV | BUTTON_DELAY_RELEASE); | ||
66 | |||
67 | #endif | ||
57 | default: | 68 | default: |
58 | return 0; | 69 | return 0; |
59 | } | 70 | } |