summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorMiika Pekkarinen <miipekk@ihme.org>2007-03-11 10:52:36 +0000
committerMiika Pekkarinen <miipekk@ihme.org>2007-03-11 10:52:36 +0000
commit2eefb5acb847eeb2d10bac860d37c4cef00be67b (patch)
treebd08d1908d01e56c10a442c0b2fd8ef224fb982f /firmware
parent408dfd65ad61181b3612cb11574c9ff547e42d24 (diff)
downloadrockbox-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.c36
-rw-r--r--firmware/export/kernel.h1
-rw-r--r--firmware/kernel.c21
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
259void 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
258long button_get(bool block) 275long 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
270long button_get_w_tmo(int ticks) 295long 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);
123extern bool queue_empty(const struct event_queue* q); 123extern bool queue_empty(const struct event_queue* q);
124extern void queue_clear(struct event_queue* q); 124extern void queue_clear(struct event_queue* q);
125extern void queue_remove_from_head(struct event_queue *q, long id); 125extern void queue_remove_from_head(struct event_queue *q, long id);
126extern int queue_count(const struct event_queue *q);
126extern int queue_broadcast(long id, intptr_t data); 127extern int queue_broadcast(long id, intptr_t data);
127 128
128extern void mutex_init(struct mutex *m); 129extern 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 */
383int 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
377int queue_broadcast(long id, intptr_t data) 398int queue_broadcast(long id, intptr_t data)
378{ 399{
379 int i; 400 int i;