summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/button-devinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/hosted/button-devinput.c')
-rw-r--r--firmware/target/hosted/button-devinput.c40
1 files changed, 30 insertions, 10 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
75static int button_delay_release = 0;
76static int delay_tick = 0;
77#endif
78
75int button_read_device(void) 79int 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 }