diff options
author | Miika Pekkarinen <miipekk@ihme.org> | 2007-03-11 10:52:36 +0000 |
---|---|---|
committer | Miika Pekkarinen <miipekk@ihme.org> | 2007-03-11 10:52:36 +0000 |
commit | 2eefb5acb847eeb2d10bac860d37c4cef00be67b (patch) | |
tree | bd08d1908d01e56c10a442c0b2fd8ef224fb982f /firmware | |
parent | 408dfd65ad61181b3612cb11574c9ff547e42d24 (diff) | |
download | rockbox-2eefb5acb847eeb2d10bac860d37c4cef00be67b.tar.gz rockbox-2eefb5acb847eeb2d10bac860d37c4cef00be67b.zip |
Optimized the gui list code performance, including automatic frame dropping and cpu boosting when button events are getting queued. Improved scrollwheel acceleration code is needed to notice a real change.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12721 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/button.c | 36 | ||||
-rw-r--r-- | firmware/export/kernel.h | 1 | ||||
-rw-r--r-- | firmware/kernel.c | 21 |
3 files changed, 56 insertions, 2 deletions
diff --git a/firmware/drivers/button.c b/firmware/drivers/button.c index a1fd58c447..7c5858a1e3 100644 --- a/firmware/drivers/button.c +++ b/firmware/drivers/button.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include "system.h" | 26 | #include "system.h" |
27 | #include "button.h" | 27 | #include "button.h" |
28 | #include "kernel.h" | 28 | #include "kernel.h" |
29 | #include "thread.h" | ||
29 | #include "backlight.h" | 30 | #include "backlight.h" |
30 | #include "serial.h" | 31 | #include "serial.h" |
31 | #include "power.h" | 32 | #include "power.h" |
@@ -255,21 +256,52 @@ static void button_tick(void) | |||
255 | lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); | 256 | lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT); |
256 | } | 257 | } |
257 | 258 | ||
259 | void button_boost(bool state) | ||
260 | { | ||
261 | static bool boosted = false; | ||
262 | |||
263 | if (state && !boosted) | ||
264 | { | ||
265 | cpu_boost(true); | ||
266 | boosted = true; | ||
267 | } | ||
268 | else if (!state && boosted) | ||
269 | { | ||
270 | cpu_boost(false); | ||
271 | boosted = false; | ||
272 | } | ||
273 | } | ||
274 | |||
258 | long button_get(bool block) | 275 | long button_get(bool block) |
259 | { | 276 | { |
260 | struct event ev; | 277 | struct event ev; |
261 | 278 | int pending_count = queue_count(&button_queue); | |
262 | if ( block || !queue_empty(&button_queue) ) | 279 | |
280 | /* Control the CPU boost trying to keep queue empty. */ | ||
281 | if (pending_count == 0) | ||
282 | button_boost(false); | ||
283 | else if (pending_count > 2) | ||
284 | button_boost(true); | ||
285 | |||
286 | if ( block || pending_count ) | ||
263 | { | 287 | { |
264 | queue_wait(&button_queue, &ev); | 288 | queue_wait(&button_queue, &ev); |
265 | return ev.id; | 289 | return ev.id; |
266 | } | 290 | } |
291 | |||
267 | return BUTTON_NONE; | 292 | return BUTTON_NONE; |
268 | } | 293 | } |
269 | 294 | ||
270 | long button_get_w_tmo(int ticks) | 295 | long button_get_w_tmo(int ticks) |
271 | { | 296 | { |
272 | struct event ev; | 297 | struct event ev; |
298 | |||
299 | /* Be sure to keep boosted state. */ | ||
300 | if (!queue_empty(&button_queue)) | ||
301 | return button_get(true); | ||
302 | |||
303 | button_boost(false); | ||
304 | |||
273 | queue_wait_w_tmo(&button_queue, &ev, ticks); | 305 | queue_wait_w_tmo(&button_queue, &ev, ticks); |
274 | return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE; | 306 | return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE; |
275 | } | 307 | } |
diff --git a/firmware/export/kernel.h b/firmware/export/kernel.h index cd6a810bad..13e353d736 100644 --- a/firmware/export/kernel.h +++ b/firmware/export/kernel.h | |||
@@ -123,6 +123,7 @@ extern bool queue_in_queue_send(struct event_queue *q); | |||
123 | extern bool queue_empty(const struct event_queue* q); | 123 | extern bool queue_empty(const struct event_queue* q); |
124 | extern void queue_clear(struct event_queue* q); | 124 | extern void queue_clear(struct event_queue* q); |
125 | extern void queue_remove_from_head(struct event_queue *q, long id); | 125 | extern void queue_remove_from_head(struct event_queue *q, long id); |
126 | extern int queue_count(const struct event_queue *q); | ||
126 | extern int queue_broadcast(long id, intptr_t data); | 127 | extern int queue_broadcast(long id, intptr_t data); |
127 | 128 | ||
128 | extern void mutex_init(struct mutex *m); | 129 | extern void mutex_init(struct mutex *m); |
diff --git a/firmware/kernel.c b/firmware/kernel.c index db7249fdee..c304e455c2 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -374,6 +374,27 @@ void queue_remove_from_head(struct event_queue *q, long id) | |||
374 | set_irq_level(oldlevel); | 374 | set_irq_level(oldlevel); |
375 | } | 375 | } |
376 | 376 | ||
377 | /** | ||
378 | * The number of events waiting in the queue. | ||
379 | * | ||
380 | * @param struct of event_queue | ||
381 | * @return number of events in the queue | ||
382 | */ | ||
383 | int queue_count(const struct event_queue *q) | ||
384 | { | ||
385 | int oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL); | ||
386 | int result = 0; | ||
387 | |||
388 | if (q->read <= q->write) | ||
389 | result = q->write - q->read; | ||
390 | else | ||
391 | result = QUEUE_LENGTH - (q->read - q->write); | ||
392 | |||
393 | set_irq_level(oldlevel); | ||
394 | |||
395 | return result; | ||
396 | } | ||
397 | |||
377 | int queue_broadcast(long id, intptr_t data) | 398 | int queue_broadcast(long id, intptr_t data) |
378 | { | 399 | { |
379 | int i; | 400 | int i; |