Jonathan Gordon wrote:
> hey all,
> well iv had another play with this and i tinhk it actually works :O
> attached is a demo plugin that just tests the loop.. hopefully its all
> simple enough to understand without thinking too much..
> the idea of line 12-35 is that there would be a standard list of
> buttons that would be global so the button list would really only ever
> really need to be coded again is if some wierd combo u want isnt in
> the main list..
> as u can see. the code easily handles short/long presses of both
> individual buttons and combo's. fancy stuff like quick double press
> and short then long press would need to be done after the call.. but
> that doesnt happen very often so thats no big deal..
> also, ive only tested this in the sim so i dont know how responsive it
> feels on the actual player.. (if the attachment doesnt work iv put it
> at http://members.optusnet.com.au/jdgordy/button_test.c )
>
Having both a for-loop and a switch case to read a button seems a bit over
kill to me.
Why not turn it into a if/else if/... chain instead? That loosens the
contraints of the current switch case style without incurring to much overhead.
Also checking for key up/down, long-press, double clicks etc, should be
handled by the button driver in firmware/drivers/button.c and set as flags.
Here's a quick sample of how I'm envisioning it:
enum {
ACTION_UP = 0,
ACTION_DOWN,
ACTION_FOO,
ACTION_BAR
};
#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
// Maps the actions above to button defines for a specific target.
// This array could be changed at runtime to allow a user to remap buttons or
// handle stuff like the 3 different remotes that an iRiver may have.
static action_buttons [4] = {
BUTTON_UP,
BUTTON_DOWN | BUTTON_DBLCLICK,
BUTTON_MODE,
BUTTON_SELECT | BUTTON_REL
};
#endif
#if CONFIG_KEYPAD == RECORDER_PAD
static action_buttons [4] = { ... } ;
#endif
... etc ...
enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
{
int button;
rb = api;
button = rb->button_status ();
if (button == action_buttons [ACTION_UP])
DEBUGF("Up!\n");
else if (button == action_buttons [ACTION_DOWN])
DEBUGF("Down!\n");
else if (button == action_buttons [ACTION_FOO])
DEBUGF("Foo!\n");
else if (button == action_buttons [ACTION_BAR])
DEBUGF("Bar!\n");
}