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");

}

Reply via email to