diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2021-03-10 19:03:00 -0500 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2021-03-10 21:35:44 -0500 |
commit | 87e37a4d48ada935808aa85a86526b24ea482bb6 (patch) | |
tree | 3510f9dc2177d0993480e28cceabee1e2f35861c /firmware/target/hosted/button-devinput.c | |
parent | a87abdb28f929623354270f257cc63bf73b3e74c (diff) | |
download | rockbox-87e37a4d48ada935808aa85a86526b24ea482bb6.tar.gz rockbox-87e37a4d48ada935808aa85a86526b24ea482bb6.zip |
xduoo_x3ii: Improvements in the meymappings!
* PREV/NEXT now swapped so they do what is expected in most contexts
* List and setting context retains prior behavior
* Enable the ADC that reads the headset remote and map the keys.
* As ADC-based remote "events" arrive as press/release pairs,
delay the button release.
Change-Id: I22d4eac3bfe1573b50eca795cf377bdafdeb5336
Diffstat (limited to 'firmware/target/hosted/button-devinput.c')
-rw-r--r-- | firmware/target/hosted/button-devinput.c | 40 |
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 | ||
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 | } |