summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorJonathan Gordon <rockbox@jdgordon.info>2006-11-16 02:53:44 +0000
committerJonathan Gordon <rockbox@jdgordon.info>2006-11-16 02:53:44 +0000
commit7b8b0ff49192007d791038cda2d3f44f004ff169 (patch)
tree6515041a44eb261160763a53cbdefd71a125d794 /apps
parent407284818411f82419679d39686f5402596f3725 (diff)
downloadrockbox-7b8b0ff49192007d791038cda2d3f44f004ff169.tar.gz
rockbox-7b8b0ff49192007d791038cda2d3f44f004ff169.zip
implement actions in the plugins, bubbles and metronome converted.
(hopefully buttons are correct, let me know in http://forums.rockbox.org/index.php?topic=5829.0 if there is a major stuff up) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11535 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/action.c3
-rw-r--r--apps/action.h2
-rwxr-xr-xapps/plugins/bubbles.c145
-rw-r--r--apps/plugins/lib/SOURCES1
-rw-r--r--apps/plugins/lib/pluginlib_actions.c46
-rw-r--r--apps/plugins/lib/pluginlib_actions.h181
-rw-r--r--apps/plugins/metronome.c180
7 files changed, 306 insertions, 252 deletions
diff --git a/apps/action.c b/apps/action.c
index 0f332a29f5..07d3cb25a2 100644
--- a/apps/action.c
+++ b/apps/action.c
@@ -161,7 +161,8 @@ int get_action_worker(int context, int timeout,
161 161
162 ret = do_button_check(items,button,last_button,&i); 162 ret = do_button_check(items,button,last_button,&i);
163 163
164 if (context ==(int)CONTEXT_STOPSEARCHING) 164 if ((context ==(int)CONTEXT_STOPSEARCHING) ||
165 items == NULL )
165 break; 166 break;
166 167
167 if (ret == ACTION_UNKNOWN ) 168 if (ret == ACTION_UNKNOWN )
diff --git a/apps/action.h b/apps/action.h
index d3da152e35..b0725ddb41 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -210,6 +210,8 @@ enum {
210 ACTION_KBD_MORSE_INPUT, 210 ACTION_KBD_MORSE_INPUT,
211 ACTION_KBD_MORSE_SELECT, 211 ACTION_KBD_MORSE_SELECT,
212 212
213
214 LAST_ACTION_PLACEHOLDER, /* custom actions should be this + something */
213}; 215};
214 216
215struct button_mapping { 217struct button_mapping {
diff --git a/apps/plugins/bubbles.c b/apps/plugins/bubbles.c
index 9ce6ee80c5..e5a094e053 100755
--- a/apps/plugins/bubbles.c
+++ b/apps/plugins/bubbles.c
@@ -21,6 +21,7 @@
21 21
22#include "plugin.h" 22#include "plugin.h"
23#include "xlcd.h" 23#include "xlcd.h"
24#include "pluginlib_actions.h"
24 25
25#ifdef HAVE_LCD_BITMAP 26#ifdef HAVE_LCD_BITMAP
26 27
@@ -53,93 +54,6 @@ PLUGIN_HEADER
53#define NUM_COMPRESS 9 54#define NUM_COMPRESS 9
54#define MAX_SHOTTIME 1000 55#define MAX_SHOTTIME 1000
55 56
56/* button definitions */
57#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
58#define BUBBLES_LEFT BUTTON_LEFT
59#define BUBBLES_RIGHT BUTTON_RIGHT
60#define BUBBLES_UP BUTTON_UP
61#define BUBBLES_DOWN BUTTON_DOWN
62#define BUBBLES_QUIT BUTTON_OFF
63#define BUBBLES_START BUTTON_ON
64#define BUBBLES_SELECT BUTTON_SELECT
65#define BUBBLES_RESUME BUTTON_MODE
66
67#define BUBBLES_RC_QUIT BUTTON_RC_STOP
68
69#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
70#define BUBBLES_LEFT BUTTON_SCROLL_BACK
71#define BUBBLES_RIGHT BUTTON_SCROLL_FWD
72#define BUBBLES_UP BUTTON_SCROLL_FWD
73#define BUBBLES_DOWN BUTTON_SCROLL_BACK
74#define BUBBLES_QUIT BUTTON_MENU|BUTTON_REL
75#define BUBBLES_START BUTTON_PLAY|BUTTON_REL
76#define BUBBLES_SELECT BUTTON_SELECT
77#define BUBBLES_RESUME BUTTON_RIGHT|BUTTON_LEFT
78
79#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
80#define BUBBLES_LEFT BUTTON_LEFT
81#define BUBBLES_RIGHT BUTTON_RIGHT
82#define BUBBLES_UP BUTTON_UP
83#define BUBBLES_DOWN BUTTON_DOWN
84#define BUBBLES_QUIT BUTTON_POWER
85#define BUBBLES_START BUTTON_PLAY
86#define BUBBLES_SELECT BUTTON_SELECT
87#define BUBBLES_RESUME BUTTON_REC
88
89#elif CONFIG_KEYPAD == GIGABEAT_PAD
90#define BUBBLES_LEFT BUTTON_LEFT
91#define BUBBLES_RIGHT BUTTON_RIGHT
92#define BUBBLES_UP BUTTON_UP
93#define BUBBLES_DOWN BUTTON_DOWN
94#define BUBBLES_QUIT BUTTON_A
95#define BUBBLES_START BUTTON_POWER
96#define BUBBLES_SELECT BUTTON_SELECT
97#define BUBBLES_RESUME BUTTON_MENU
98
99#elif CONFIG_KEYPAD == RECORDER_PAD
100#define BUBBLES_LEFT BUTTON_LEFT
101#define BUBBLES_RIGHT BUTTON_RIGHT
102#define BUBBLES_UP BUTTON_UP
103#define BUBBLES_DOWN BUTTON_DOWN
104#define BUBBLES_QUIT BUTTON_OFF
105#define BUBBLES_START BUTTON_ON
106#define BUBBLES_SELECT BUTTON_PLAY
107#define BUBBLES_RESUME BUTTON_F1
108
109#elif CONFIG_KEYPAD == ONDIO_PAD
110#define BUBBLES_LEFT BUTTON_LEFT
111#define BUBBLES_RIGHT BUTTON_RIGHT
112#define BUBBLES_UP BUTTON_RIGHT
113#define BUBBLES_DOWN BUTTON_LEFT
114#define BUBBLES_QUIT BUTTON_OFF
115#define BUBBLES_START BUTTON_MENU
116#define BUBBLES_SELECT BUTTON_UP
117#define BUBBLES_RESUME BUTTON_DOWN
118
119#elif CONFIG_KEYPAD == SANSA_E200_PAD
120#define BUBBLES_LEFT BUTTON_LEFT
121#define BUBBLES_RIGHT BUTTON_RIGHT
122#define BUBBLES_UP BUTTON_SCROLL_UP
123#define BUBBLES_DOWN BUTTON_SCROLL_DOWN
124#define BUBBLES_QUIT BUTTON_POWER
125#define BUBBLES_START BUTTON_PLAY
126#define BUBBLES_SELECT BUTTON_SELECT
127#define BUBBLES_RESUME BUTTON_DOWN
128
129#elif CONFIG_KEYPAD == IRIVER_H10_PAD
130#define BUBBLES_LEFT BUTTON_LEFT
131#define BUBBLES_RIGHT BUTTON_RIGHT
132#define BUBBLES_UP BUTTON_SCROLL_UP
133#define BUBBLES_DOWN BUTTON_SCROLL_DOWN
134#define BUBBLES_QUIT BUTTON_POWER
135#define BUBBLES_START BUTTON_PLAY
136#define BUBBLES_SELECT BUTTON_REW
137#define BUBBLES_RESUME BUTTON_FF
138
139#else
140 #error BUBBLES: Unsupported keypad
141#endif
142
143/* bubbles will consume height of 10*ROW_HEIGHT+2*(BUBBLE_HEIGHT-1)+BUBBLE_HEIGHT/2 */ 57/* bubbles will consume height of 10*ROW_HEIGHT+2*(BUBBLE_HEIGHT-1)+BUBBLE_HEIGHT/2 */
144/* 24x24 bubbles (iPod Video) */ 58/* 24x24 bubbles (iPod Video) */
145#if (LCD_HEIGHT == 240) && (LCD_WIDTH == 320) 59#if (LCD_HEIGHT == 240) && (LCD_WIDTH == 320)
@@ -2395,31 +2309,29 @@ static int bubbles_handlebuttons(struct game_context* bb, bool animblock,
2395 int button; 2309 int button;
2396 int buttonres; 2310 int buttonres;
2397 long start; 2311 long start;
2398 2312 const struct button_mapping *plugin_contexts[]
2399 button = rb->button_get_w_tmo(timeout); 2313 = {generic_directions,generic_actions};
2314 button = pluginlib_getaction(rb,timeout,plugin_contexts,2);
2400 2315
2401#ifdef HAS_BUTTON_HOLD 2316#ifdef HAS_BUTTON_HOLD
2402 if (rb->button_hold()) 2317 if (rb->button_hold())
2403 button = BUBBLES_START; 2318 button = PLA_START;
2404#endif 2319#endif
2405 2320
2406 switch(button){ 2321 switch(button){
2407 case (BUBBLES_LEFT|BUTTON_REPEAT): 2322 case PLA_LEFT_REPEAT:
2408 if(bb->angle > MIN_ANGLE) bb->angle -= 4; 2323 if(bb->angle > MIN_ANGLE) bb->angle -= 4;
2409 case BUBBLES_LEFT: /* change angle to the left */ 2324 case PLA_LEFT: /* change angle to the left */
2410 if(bb->angle > MIN_ANGLE) bb->angle -= 2; 2325 if(bb->angle > MIN_ANGLE) bb->angle -= 2;
2411 break; 2326 break;
2412 2327
2413 case (BUBBLES_RIGHT|BUTTON_REPEAT): 2328 case PLA_RIGHT_REPEAT:
2414 if(bb->angle < MAX_ANGLE) bb->angle += 4; 2329 if(bb->angle < MAX_ANGLE) bb->angle += 4;
2415 case BUBBLES_RIGHT: /* change angle to the right */ 2330 case PLA_RIGHT: /* change angle to the right */
2416 if(bb->angle < MAX_ANGLE) bb->angle += 2; 2331 if(bb->angle < MAX_ANGLE) bb->angle += 2;
2417 break; 2332 break;
2418 2333
2419 case BUBBLES_SELECT: /* fire the shot */ 2334 case PLA_FIRE: /* fire the shot */
2420#if CONFIG_KEYPAD == IRIVER_H10_PAD
2421 case BUBBLES_UP: /* easier to press on H10 */
2422#endif
2423 if(!animblock) { 2335 if(!animblock) {
2424 bb->elapsedlvl += bb->elapsedshot; 2336 bb->elapsedlvl += bb->elapsedshot;
2425 bb->elapsedshot = 0; 2337 bb->elapsedshot = 0;
@@ -2431,29 +2343,27 @@ static int bubbles_handlebuttons(struct game_context* bb, bool animblock,
2431 } 2343 }
2432 break; 2344 break;
2433 2345
2434 case BUBBLES_START: /* pause the game */ 2346 case PLA_START: /* pause the game */
2435 start = *rb->current_tick; 2347 start = *rb->current_tick;
2436 rb->splash(1, true, "Paused"); 2348 rb->splash(1, true, "Paused");
2437 while(rb->button_get(true) != (BUBBLES_START)); 2349 while(pluginlib_getaction(rb,TIMEOUT_BLOCK,plugin_contexts,2)
2350 != (PLA_START));
2438 bb->startedshot += *rb->current_tick-start; 2351 bb->startedshot += *rb->current_tick-start;
2439 bubbles_drawboard(bb); 2352 bubbles_drawboard(bb);
2440 rb->lcd_update(); 2353 rb->lcd_update();
2441 break; 2354 break;
2442 2355
2443 case BUBBLES_RESUME: /* save and end the game */ 2356 case PLA_MENU: /* save and end the game */
2444 if(!animblock) { 2357 if(!animblock) {
2445 rb->splash(HZ/2, true, "Saving game..."); 2358 rb->splash(HZ/2, true, "Saving game...");
2446 bubbles_savegame(bb); 2359 bubbles_savegame(bb);
2447 return BB_END; 2360 return BB_END;
2448 } 2361 }
2449 break; 2362 break;
2450#ifdef BUBBLES_RC_QUIT 2363 case PLA_QUIT: /* end the game */
2451 case BUBBLES_RC_QUIT:
2452#endif
2453 case BUBBLES_QUIT: /* end the game */
2454 return BB_END; 2364 return BB_END;
2455 2365
2456 case BUTTON_NONE: /* no button pressed */ 2366 case ACTION_UNKNOWN: /* no button pressed */
2457 break; 2367 break;
2458 2368
2459 default: 2369 default:
@@ -2479,6 +2389,8 @@ static int bubbles(struct game_context* bb) {
2479 bool startgame = false; 2389 bool startgame = false;
2480 bool showscores = false; 2390 bool showscores = false;
2481 long timeout; 2391 long timeout;
2392 const struct button_mapping *plugin_contexts[]
2393 = {generic_directions,generic_actions};
2482 2394
2483 bubbles_setcolors(); 2395 bubbles_setcolors();
2484 2396
@@ -2578,23 +2490,20 @@ static int bubbles(struct game_context* bb) {
2578 rb->lcd_update(); 2490 rb->lcd_update();
2579 2491
2580 /* handle menu button presses */ 2492 /* handle menu button presses */
2581 button = rb->button_get(true); 2493 button = pluginlib_getaction(rb,timeout,plugin_contexts,2);
2582 switch(button){ 2494 switch(button){
2583 case BUBBLES_START: /* start playing */ 2495 case PLA_START: /* start playing */
2584 bb->level = startlevel; 2496 bb->level = startlevel;
2585 startgame = true; 2497 startgame = true;
2586 break; 2498 break;
2587#ifdef BUBBLES_RC_QUIT 2499 case PLA_QUIT: /* quit program */
2588 case BUBBLES_RC_QUIT:
2589#endif
2590 case BUBBLES_QUIT: /* quit program */
2591 if(showscores) { 2500 if(showscores) {
2592 showscores = false; 2501 showscores = false;
2593 break; 2502 break;
2594 } 2503 }
2595 return BB_QUIT; 2504 return BB_QUIT;
2596 2505
2597 case BUBBLES_RESUME: /* resume game */ 2506 case PLA_MENU: /* resume game */
2598 if(!bubbles_loadgame(bb)) { 2507 if(!bubbles_loadgame(bb)) {
2599 rb->splash(HZ*2, true, "Nothing to resume"); 2508 rb->splash(HZ*2, true, "Nothing to resume");
2600 } else { 2509 } else {
@@ -2602,12 +2511,12 @@ static int bubbles(struct game_context* bb) {
2602 } 2511 }
2603 break; 2512 break;
2604 2513
2605 case BUBBLES_SELECT: /* toggle high scores */ 2514 case PLA_FIRE: /* toggle high scores */
2606 showscores = !showscores; 2515 showscores = !showscores;
2607 break; 2516 break;
2608 2517
2609 case (BUBBLES_UP|BUTTON_REPEAT): 2518 case PLA_UP: /* increase starting level */
2610 case BUBBLES_UP: /* increase starting level */ 2519 case PLA_UP_REPEAT:
2611 if(startlevel >= bb->highlevel) { 2520 if(startlevel >= bb->highlevel) {
2612 startlevel = 0; 2521 startlevel = 0;
2613 } else { 2522 } else {
@@ -2615,8 +2524,8 @@ static int bubbles(struct game_context* bb) {
2615 } 2524 }
2616 break; 2525 break;
2617 2526
2618 case (BUBBLES_DOWN|BUTTON_REPEAT): 2527 case PLA_DOWN: /* decrease starting level */
2619 case BUBBLES_DOWN: /* decrease starting level */ 2528 case PLA_DOWN_REPEAT:
2620 if(startlevel <= 0) { 2529 if(startlevel <= 0) {
2621 startlevel = bb->highlevel; 2530 startlevel = bb->highlevel;
2622 } else { 2531 } else {
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES
index 6002934ac0..d57db3bbc8 100644
--- a/apps/plugins/lib/SOURCES
+++ b/apps/plugins/lib/SOURCES
@@ -25,3 +25,4 @@ xlcd_scroll.c
25bmp.c 25bmp.c
26#endif 26#endif
27#endif 27#endif
28pluginlib_actions.c
diff --git a/apps/plugins/lib/pluginlib_actions.c b/apps/plugins/lib/pluginlib_actions.c
new file mode 100644
index 0000000000..312eb61ea6
--- /dev/null
+++ b/apps/plugins/lib/pluginlib_actions.c
@@ -0,0 +1,46 @@
1/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* Copyright (C) 2006 Jonathan Gordon
11*
12*
13* All files in this archive are subject to the GNU General Public License.
14* See the file COPYING in the source tree root for full license agreement.
15*
16* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17* KIND, either express or implied.
18*
19****************************************************************************/
20
21#include "plugin.h"
22#include "action.h"
23#include "pluginlib_actions.h"
24
25static struct button_mapping **plugin_context_order;
26static int plugin_context_count = 0;
27static int last_context = 0; /* index into plugin_context_order
28 of the last context returned */
29
30const struct button_mapping* get_context_map(int context)
31{
32 (void)context;
33 if (last_context<plugin_context_count)
34 return plugin_context_order[last_context++];
35 else return NULL;
36}
37
38int pluginlib_getaction(struct plugin_api *api,int timeout,
39 const struct button_mapping *plugin_contexts[],
40 int count)
41{
42 plugin_context_order = (struct button_mapping **)plugin_contexts;
43 plugin_context_count = count;
44 last_context = 0;
45 return api->get_custom_action(CONTEXT_CUSTOM,timeout,get_context_map);
46}
diff --git a/apps/plugins/lib/pluginlib_actions.h b/apps/plugins/lib/pluginlib_actions.h
new file mode 100644
index 0000000000..8dcd2b653d
--- /dev/null
+++ b/apps/plugins/lib/pluginlib_actions.h
@@ -0,0 +1,181 @@
1/***************************************************************************
2* __________ __ ___.
3* Open \______ \ ____ ____ | | _\_ |__ _______ ___
4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7* \/ \/ \/ \/ \/
8* $Id$
9*
10* Copyright (C) 2006 Jonathan Gordon
11*
12*
13* All files in this archive are subject to the GNU General Public License.
14* See the file COPYING in the source tree root for full license agreement.
15*
16* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17* KIND, either express or implied.
18*
19****************************************************************************/
20
21#ifndef __PLUGINLIB_ACTIONS_H__
22#define __PLUGINLIB_ACTIONS_H__
23
24#include "config.h"
25#include "plugin.h"
26#include "action.h"
27
28/* PLA stands for Plugin Lib Action :P */
29enum {
30 PLA_UP = LAST_ACTION_PLACEHOLDER+1,
31 PLA_DOWN,
32 PLA_LEFT,
33 PLA_RIGHT,
34 PLA_UP_REPEAT,
35 PLA_DOWN_REPEAT,
36 PLA_LEFT_REPEAT,
37 PLA_RIGHT_REPEAT,
38
39 PLA_QUIT,
40 PLA_START,
41 PLA_MENU,
42 PLA_FIRE,
43 PLA_FIRE_REPEAT,
44
45 LAST_PLUGINLIB_ACTION
46};
47
48static const struct button_mapping generic_directions[] =
49{
50#if (CONFIG_KEYPAD == IRIVER_H100_PAD) \
51 || (CONFIG_KEYPAD == IRIVER_H300_PAD) \
52 || (CONFIG_KEYPAD == IAUDIO_X5_PAD) \
53 || (CONFIG_KEYPAD == GIGABEAT_PAD) \
54 || (CONFIG_KEYPAD == RECORDER_PAD) \
55 || (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD)
56 { PLA_UP, BUTTON_UP, BUTTON_NONE},
57 { PLA_DOWN, BUTTON_DOWN, BUTTON_NONE},
58 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
59 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE},
60 { PLA_UP_REPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE},
61 { PLA_DOWN_REPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE},
62 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
63 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
64#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
65 { PLA_UP, BUTTON_SCROLL_FWD, BUTTON_NONE},
66 { PLA_DOWN, BUTTON_SCROLL_BACK, BUTTON_NONE},
67 { PLA_LEFT, BUTTON_SCROLL_BACK, BUTTON_NONE},
68 { PLA_RIGHT, BUTTON_SCROLL_FWD, BUTTON_NONE},
69 { PLA_UP_REPEAT, BUTTON_SCROLL_FWD, BUTTON_NONE},
70 { PLA_DOWN_REPEAT, BUTTON_SCROLL_BACK, BUTTON_NONE},
71 { PLA_LEFT_REPEAT, BUTTON_SCROLL_BACK, BUTTON_NONE},
72 { PLA_RIGHT_REPEAT, BUTTON_SCROLL_FWD, BUTTON_NONE},
73#elif CONFIG_KEYPAD == ONDIO_PAD
74 { PLA_UP, BUTTON_RIGHT, BUTTON_NONE},
75 { PLA_DOWN, BUTTON_LEFT, BUTTON_NONE},
76 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
77 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE},
78 { PLA_UP_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
79 { PLA_DOWN_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
80 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
81 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
82#elif CONFIG_KEYPAD == PLAYER_PAD
83 {PLA_UP, BUTTON_STOP, BUTTON_NONE},
84 {PLA_DOWN, BUTTON_PLAY, BUTTON_NONE},
85 {PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
86 {PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE},
87 {PLA_UP_REPEAT, BUTTON_STOP|BUTTON_REPEAT, BUTTON_NONE},
88 {PLA_DOWN_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
89 {PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
90 {PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
91#elif (CONFIG_KEYPAD == SANSA_E200_PAD) \
92 || (CONFIG_KEYPAD == IRIVER_H10_PAD)
93 { PLA_UP, BUTTON_SCROLL_UP, BUTTON_NONE},
94 { PLA_DOWN, BUTTON_SCROLL_DOWN, BUTTON_NONE},
95 { PLA_LEFT, BUTTON_LEFT, BUTTON_NONE},
96 { PLA_RIGHT, BUTTON_RIGHT, BUTTON_NONE},
97 { PLA_UP_REPEAT, BUTTON_SCROLL_UP|BUTTON_REPEAT, BUTTON_NONE},
98 { PLA_DOWN_REPEAT, BUTTON_SCROLL_DOWN|BUTTON_REPEAT, BUTTON_NONE},
99 { PLA_LEFT_REPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE},
100 { PLA_RIGHT_REPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE},
101#else
102 #error pluginlib_actions: Unsupported keypad
103#endif
104 {CONTEXT_CUSTOM,BUTTON_NONE,BUTTON_NONE}
105};
106
107/* these were taken from the bubbles plugin, so may need tweaking */
108static const struct button_mapping generic_actions[] =
109{
110#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
111 {PLA_QUIT, BUTTON_OFF, BUTTON_NONE},
112 {PLA_QUIT, BUTTON_RC_STOP, BUTTON_NONE},
113 {PLA_START, BUTTON_ON, BUTTON_NONE},
114 {PLA_MENU, BUTTON_MODE, BUTTON_NONE},
115 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
116 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
117#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || (CONFIG_KEYPAD == IPOD_4G_PAD)
118 {PLA_QUIT, BUTTON_MENU|BUTTON_SELECT, BUTTON_NONE},
119 {PLA_START, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY},
120 {PLA_MENU, BUTTON_MENU, BUTTON_NONE},
121 {PLA_FIRE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT},
122 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
123#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
124 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE},
125 {PLA_START, BUTTON_PLAY, BUTTON_NONE},
126 {PLA_MENU, BUTTON_REC, BUTTON_NONE},
127 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
128 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
129#elif CONFIG_KEYPAD == GIGABEAT_PAD
130 {PLA_QUIT, BUTTON_A, BUTTON_NONE},
131 {PLA_START, BUTTON_POWER, BUTTON_NONE},
132 {PLA_MENU, BUTTON_MENU, BUTTON_NONE},
133 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
134 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
135#elif CONFIG_KEYPAD == RECORDER_PAD
136 {PLA_QUIT, BUTTON_OFF, BUTTON_NONE},
137 {PLA_START, BUTTON_ON, BUTTON_NONE},
138 {PLA_MENU, BUTTON_F1, BUTTON_NONE},
139 {PLA_FIRE, BUTTON_PLAY, BUTTON_NONE},
140 {PLA_FIRE_REPEAT, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
141#elif CONFIG_KEYPAD == ONDIO_PAD
142 {PLA_QUIT, BUTTON_OFF, BUTTON_NONE},
143 {PLA_START, BUTTON_MENU, BUTTON_NONE},
144 {PLA_MENU, BUTTON_DOWN, BUTTON_NONE},
145 {PLA_FIRE, BUTTON_UP, BUTTON_NONE},
146 {PLA_FIRE_REPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE},
147#elif CONFIG_KEYPAD == PLAYER_PAD
148 {PLA_QUIT, BUTTON_STOP|BUTTON_REPEAT, BUTTON_NONE},
149 {PLA_START, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE},
150 {PLA_MENU, BUTTON_MENU, BUTTON_NONE},
151 {PLA_FIRE, BUTTON_ON, BUTTON_NONE},
152 {PLA_FIRE_REPEAT, BUTTON_ON|BUTTON_REPEAT, BUTTON_NONE},
153#elif CONFIG_KEYPAD == SANSA_E200_PAD
154 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE},
155 {PLA_START, BUTTON_PLAY, BUTTON_NONE},
156 {PLA_MENU, BUTTON_DOWN, BUTTON_NONE},
157 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
158 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
159#elif CONFIG_KEYPAD == IRIVER_H10_PAD
160 {PLA_QUIT, BUTTON_POWER, BUTTON_NONE},
161 {PLA_START, BUTTON_PLAY, BUTTON_NONE},
162 {PLA_MENU, BUTTON_FF, BUTTON_NONE},
163 {PLA_FIRE, BUTTON_REW, BUTTON_NONE},
164 {PLA_FIRE_REPEAT, BUTTON_REW|BUTTON_REPEAT, BUTTON_NONE},
165#elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
166 {PLA_QUIT, BUTTON_EQ, BUTTON_NONE},
167 {PLA_START, BUTTON_PLAY, BUTTON_NONE},
168 {PLA_MENU, BUTTON_MODE, BUTTON_NONE},
169 {PLA_FIRE, BUTTON_SELECT, BUTTON_NONE},
170 {PLA_FIRE_REPEAT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_NONE},
171#else
172 #error pluginlib_actions: Unsupported keypad
173#endif
174 {CONTEXT_CUSTOM,BUTTON_NONE,BUTTON_NONE}
175};
176
177int pluginlib_getaction(struct plugin_api *api,int timeout,
178 const struct button_mapping *plugin_contexts[],
179 int count);
180
181#endif /* __PLUGINLIB_ACTIONS_H__ */
diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c
index 7a975f434d..45a870b65b 100644
--- a/apps/plugins/metronome.c
+++ b/apps/plugins/metronome.c
@@ -17,100 +17,44 @@
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19#include "plugin.h" 19#include "plugin.h"
20#include "pluginlib_actions.h"
20 21
21PLUGIN_HEADER 22PLUGIN_HEADER
22 23
23/* variable button definitions */ 24#define METRONOME_QUIT PLA_QUIT
24#if CONFIG_KEYPAD == RECORDER_PAD 25#define METRONOME_VOL_UP PLA_UP
25#define METRONOME_QUIT BUTTON_OFF 26#define METRONOME_VOL_DOWN PLA_DOWN
26#define METRONOME_PLAYPAUSE BUTTON_PLAY 27#define METRONOME_VOL_UP_REP PLA_UP_REPEAT
27#define METRONOME_VOL_UP BUTTON_UP 28#define METRONOME_VOL_DOWN_REP PLA_DOWN_REPEAT
28#define METRONOME_VOL_DOWN BUTTON_DOWN 29#define METRONOME_TAP PLA_START
29#define METRONOME_TAP BUTTON_ON 30enum {
30#define METRONOME_MSG_START "press play" 31 METRONOME_PLAY_TAP = LAST_PLUGINLIB_ACTION+1,
31#define METRONOME_MSG_STOP "press pause" 32 METRONOME_PAUSE,
33 METRONOME_SYNC
34};
32 35
33#elif CONFIG_KEYPAD == ONDIO_PAD 36
34#define METRONOME_QUIT BUTTON_OFF 37#if CONFIG_KEYPAD == ONDIO_PAD
35#define METRONOME_PLAY_TAP BUTTON_MENU
36#define METRONOME_PAUSE (BUTTON_MENU | BUTTON_REPEAT)
37#define METRONOME_VOL_UP BUTTON_UP
38#define METRONOME_VOL_DOWN BUTTON_DOWN
39#define METRONOME_MSG_START "start: mode" 38#define METRONOME_MSG_START "start: mode"
40#define METRONOME_MSG_STOP "pause: hold mode" 39#define METRONOME_MSG_STOP "pause: hold mode"
41 40static const struct button_mapping ondio_action[] =
42#elif CONFIG_KEYPAD == PLAYER_PAD 41{
43#define METRONOME_QUIT BUTTON_STOP 42 {METRONOME_PLAY_TAP, BUTTON_MENU|BUTTON_REL, BUTTON_NONE },
44#define METRONOME_PLAYPAUSE BUTTON_PLAY 43 {METRONOME_PAUSE, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE }
45#define METRONOME_VOL_UP (BUTTON_ON | BUTTON_RIGHT) 44};
46#define METRONOME_VOL_DOWN (BUTTON_ON | BUTTON_LEFT) 45#else
47#define METRONOME_TAP BUTTON_ON 46#define METRONOME_PLAYPAUSE PLA_FIRE
48
49#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
50#define METRONOME_QUIT BUTTON_OFF
51#define METRONOME_PLAYPAUSE BUTTON_ON
52#define METRONOME_VOL_UP BUTTON_UP
53#define METRONOME_VOL_DOWN BUTTON_DOWN
54#define METRONOME_TAP BUTTON_SELECT
55#define METRONOME_SYNC BUTTON_REC
56#define METRONOME_MSG_START "press play"
57#define METRONOME_MSG_STOP "press pause"
58
59#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
60 (CONFIG_KEYPAD == IPOD_3G_PAD)
61#define METRONOME_QUIT BUTTON_MENU
62#define METRONOME_PLAYPAUSE BUTTON_PLAY
63#define METRONOME_VOL_UP BUTTON_SCROLL_FWD
64#define METRONOME_VOL_DOWN BUTTON_SCROLL_BACK
65#define METRONOME_TAP BUTTON_SELECT
66#define METRONOME_MSG_START "press play"
67#define METRONOME_MSG_STOP "press pause"
68
69#elif (CONFIG_KEYPAD == IAUDIO_X5_PAD)
70#define METRONOME_QUIT BUTTON_POWER
71#define METRONOME_PLAYPAUSE BUTTON_PLAY
72#define METRONOME_VOL_UP BUTTON_UP
73#define METRONOME_VOL_DOWN BUTTON_DOWN
74#define METRONOME_TAP BUTTON_REC
75#define METRONOME_MSG_START "press play" 47#define METRONOME_MSG_START "press play"
76#define METRONOME_MSG_STOP "press pause" 48#define METRONOME_MSG_STOP "press pause"
77 49
78#elif (CONFIG_KEYPAD == IRIVER_IFP7XX_PAD) 50#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
79#define METRONOME_QUIT BUTTON_MODE 51static const struct button_mapping iriver_syncaction[] =
80#define METRONOME_PLAYPAUSE BUTTON_PLAY 52{
81#define METRONOME_VOL_UP BUTTON_UP 53 {METRONOME_SYNC, BUTTON_REC, BUTTON_NONE },
82#define METRONOME_VOL_DOWN BUTTON_DOWN 54};
83#define METRONOME_TAP BUTTON_EQ
84#define METRONOME_MSG_START "press play"
85#define METRONOME_MSG_STOP "press pause"
86#endif 55#endif
56#endif /* #if CONFIG_KEYPAD == ONDIO_PAD */
87 57
88#if CONFIG_REMOTE_KEYPAD == H100_REMOTE
89#define METRONOME_R_QUIT BUTTON_RC_STOP
90#define METRONOME_R_PLAYPAUSE BUTTON_RC_ON
91#define METRONOME_R_VOL_UP BUTTON_RC_VOL_UP
92#define METRONOME_R_VOL_DOWN BUTTON_RC_VOL_DOWN
93#define METRONOME_R_TAP BUTTON_RC_BITRATE
94
95#elif CONFIG_KEYPAD == SANSA_E200_PAD
96#define METRONOME_QUIT BUTTON_POWER
97#define METRONOME_PLAYPAUSE BUTTON_UP
98#define METRONOME_VOL_UP BUTTON_SCROLL_UP
99#define METRONOME_VOL_DOWN BUTTON_SCROLL_DOWN
100#define METRONOME_TAP BUTTON_SELECT
101#define METRONOME_MSG_START "press play"
102#define METRONOME_MSG_STOP "press pause"
103
104#elif CONFIG_KEYPAD == IRIVER_H10_PAD
105#define METRONOME_QUIT BUTTON_POWER
106#define METRONOME_PLAYPAUSE BUTTON_PLAY
107#define METRONOME_VOL_UP BUTTON_SCROLL_UP
108#define METRONOME_VOL_DOWN BUTTON_SCROLL_DOWN
109#define METRONOME_TAP BUTTON_FF
110#define METRONOME_MSG_START "press play"
111#define METRONOME_MSG_STOP "press pause"
112
113#endif
114 58
115static struct plugin_api* rb; 59static struct plugin_api* rb;
116 60
@@ -925,6 +869,21 @@ void tap(void)
925 869
926enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ 870enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
927 int button; 871 int button;
872 const struct button_mapping *plugin_contexts[]
873 = {generic_directions,
874#if CONFIG_KEYPAD == ONDIO_PAD
875 ondio_action,
876#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
877 iriver_syncaction,
878#endif
879 generic_actions};
880#if (CONFIG_KEYPAD == ONDIO_PAD) \
881 || (CONFIG_KEYPAD == IRIVER_H100_PAD) \
882 || (CONFIG_KEYPAD == IRIVER_H300_PAD)
883#define PLA_ARRAY_COUNT 3
884#else
885#define PLA_ARRAY_COUNT 2
886#endif
928 887
929 (void)parameter; 888 (void)parameter;
930 rb = api; 889 rb = api;
@@ -947,53 +906,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
947 while (true){ 906 while (true){
948 reset_tap = true; 907 reset_tap = true;
949 908
950 button = rb->button_get(true); 909 button = pluginlib_getaction(rb,TIMEOUT_BLOCK,
951 910 plugin_contexts,PLA_ARRAY_COUNT);
952#if CONFIG_REMOTE_KEYPAD == H100_REMOTE
953 if(button && BUTTON_REMOTE) {
954 switch(button) {
955 case BUTTON_RC_STOP:
956 button = METRONOME_QUIT;
957 break;
958 case BUTTON_RC_ON:
959 button = METRONOME_PLAYPAUSE;
960 break;
961 case BUTTON_RC_VOL_UP:
962 button = METRONOME_VOL_UP;
963 break;
964 case BUTTON_RC_VOL_UP | BUTTON_REPEAT:
965 button = METRONOME_VOL_UP | BUTTON_REPEAT;
966 break;
967 case BUTTON_RC_VOL_DOWN:
968 button = METRONOME_VOL_DOWN;
969 break;
970 case BUTTON_RC_VOL_DOWN | BUTTON_REPEAT:
971 button = METRONOME_VOL_DOWN | BUTTON_REPEAT;
972 break;
973 case BUTTON_RC_FF:
974 button = BUTTON_RIGHT;
975 break;
976 case BUTTON_RC_FF | BUTTON_REPEAT:
977 button = BUTTON_RIGHT | BUTTON_REPEAT;
978 break;
979 case BUTTON_RC_REW:
980 button = BUTTON_LEFT;
981 break;
982 case BUTTON_RC_REW | BUTTON_REPEAT:
983 button = BUTTON_LEFT | BUTTON_REPEAT;
984 break;
985 case BUTTON_RC_MODE:
986 button = METRONOME_SYNC;
987 break;
988 case BUTTON_RC_REC:
989 case BUTTON_RC_SOURCE:
990 case BUTTON_RC_MENU:
991 case BUTTON_RC_BITRATE:
992 button = METRONOME_TAP;
993 break;
994 }
995 }
996#endif
997 911
998 switch (button) { 912 switch (button) {
999 913
@@ -1031,13 +945,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
1031#endif 945#endif
1032 946
1033 case METRONOME_VOL_UP: 947 case METRONOME_VOL_UP:
1034 case METRONOME_VOL_UP | BUTTON_REPEAT: 948 case METRONOME_VOL_UP_REP:
1035 change_volume(1); 949 change_volume(1);
1036 calc_period(); 950 calc_period();
1037 break; 951 break;
1038 952
1039 case METRONOME_VOL_DOWN: 953 case METRONOME_VOL_DOWN:
1040 case METRONOME_VOL_DOWN | BUTTON_REPEAT: 954 case METRONOME_VOL_DOWN_REP:
1041 change_volume(-1); 955 change_volume(-1);
1042 calc_period(); 956 calc_period();
1043 break; 957 break;
@@ -1060,7 +974,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter){
1060 break; 974 break;
1061#endif 975#endif
1062 976
1063#ifdef METRONOME_SYNC 977#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || (CONFIG_KEYPAD == IRIVER_H300_PAD)
1064 case METRONOME_SYNC: 978 case METRONOME_SYNC:
1065 minitick = period; 979 minitick = period;
1066 break; 980 break;