1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 Damien Teney
11 * modified to use int instead of float math by Andreas Zwirtes
12 * heavily extended by Jens Arnold
14 * All files in this archive are subject to the GNU General Public License.
15 * See the file COPYING in the source tree root for full license agreement.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ***************************************************************************/
23 #include "playergfx.h"
25 #include "fixedpoint.h"
29 /* Loops that the values are displayed */
32 /* variable button definitions */
33 #if CONFIG_KEYPAD == RECORDER_PAD
34 #define CUBE_QUIT BUTTON_OFF
35 #define CUBE_X_INC BUTTON_RIGHT
36 #define CUBE_X_DEC BUTTON_LEFT
37 #define CUBE_Y_INC BUTTON_UP
38 #define CUBE_Y_DEC BUTTON_DOWN
39 #define CUBE_Z_INC BUTTON_F2
40 #define CUBE_Z_DEC BUTTON_F1
41 #define CUBE_MODE BUTTON_F3
42 #define CUBE_PAUSE BUTTON_PLAY
43 #define CUBE_HIGHSPEED BUTTON_ON
45 #elif CONFIG_KEYPAD == ARCHOS_AV300_PAD
46 #define CUBE_QUIT BUTTON_OFF
47 #define CUBE_X_INC BUTTON_RIGHT
48 #define CUBE_X_DEC BUTTON_LEFT
49 #define CUBE_Y_INC BUTTON_UP
50 #define CUBE_Y_DEC BUTTON_DOWN
51 #define CUBE_Z_INC BUTTON_F2
52 #define CUBE_Z_DEC BUTTON_F1
53 #define CUBE_MODE BUTTON_F3
54 #define CUBE_PAUSE BUTTON_SELECT
55 #define CUBE_HIGHSPEED BUTTON_ON
57 #elif CONFIG_KEYPAD == PLAYER_PAD
58 #define CUBE_QUIT BUTTON_STOP
59 #define CUBE_X_INC BUTTON_RIGHT
60 #define CUBE_X_DEC BUTTON_LEFT
61 #define CUBE_Y_INC (BUTTON_ON | BUTTON_RIGHT)
62 #define CUBE_Y_DEC (BUTTON_ON | BUTTON_LEFT)
63 #define CUBE_Z_INC (BUTTON_MENU | BUTTON_RIGHT)
64 #define CUBE_Z_DEC (BUTTON_MENU | BUTTON_LEFT)
65 #define CUBE_MODE_PRE BUTTON_MENU
66 #define CUBE_MODE (BUTTON_MENU | BUTTON_REL)
67 #define CUBE_PAUSE BUTTON_PLAY
68 #define CUBE_HIGHSPEED_PRE BUTTON_ON
69 #define CUBE_HIGHSPEED (BUTTON_ON | BUTTON_REL)
71 #elif CONFIG_KEYPAD == ONDIO_PAD
72 #define CUBE_QUIT BUTTON_OFF
73 #define CUBE_X_INC BUTTON_RIGHT
74 #define CUBE_X_DEC BUTTON_LEFT
75 #define CUBE_Y_INC BUTTON_UP
76 #define CUBE_Y_DEC BUTTON_DOWN
77 #define CUBE_Z_INC (BUTTON_MENU | BUTTON_UP)
78 #define CUBE_Z_DEC (BUTTON_MENU | BUTTON_DOWN)
79 #define CUBE_MODE_PRE BUTTON_MENU
80 #define CUBE_MODE (BUTTON_MENU | BUTTON_REL)
81 #define CUBE_PAUSE (BUTTON_MENU | BUTTON_LEFT)
82 #define CUBE_HIGHSPEED (BUTTON_MENU | BUTTON_RIGHT)
84 #elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
85 (CONFIG_KEYPAD == IRIVER_H300_PAD)
86 #define CUBE_QUIT BUTTON_OFF
87 #define CUBE_X_INC BUTTON_RIGHT
88 #define CUBE_X_DEC BUTTON_LEFT
89 #define CUBE_Y_INC BUTTON_UP
90 #define CUBE_Y_DEC BUTTON_DOWN
91 #define CUBE_Z_INC (BUTTON_ON | BUTTON_UP)
92 #define CUBE_Z_DEC (BUTTON_ON | BUTTON_DOWN)
93 #define CUBE_MODE BUTTON_MODE
94 #define CUBE_PAUSE_PRE BUTTON_ON
95 #define CUBE_PAUSE (BUTTON_ON | BUTTON_REL)
96 #define CUBE_HIGHSPEED BUTTON_SELECT
98 #define CUBE_RC_QUIT BUTTON_RC_STOP
100 #elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
101 (CONFIG_KEYPAD == IPOD_3G_PAD) || \
102 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
103 #define CUBE_QUIT BUTTON_MENU
104 #define CUBE_X_INC BUTTON_RIGHT
105 #define CUBE_X_DEC BUTTON_LEFT
106 #define CUBE_Y_INC BUTTON_SCROLL_FWD
107 #define CUBE_Y_DEC BUTTON_SCROLL_BACK
108 #define CUBE_Z_INC (BUTTON_SELECT | BUTTON_RIGHT)
109 #define CUBE_Z_DEC (BUTTON_SELECT | BUTTON_LEFT)
110 #define CUBE_MODE (BUTTON_SELECT | BUTTON_MENU)
111 #define CUBE_PAUSE_PRE BUTTON_PLAY
112 #define CUBE_PAUSE (BUTTON_PLAY | BUTTON_REL)
113 #define CUBE_HIGHSPEED (BUTTON_SELECT | BUTTON_PLAY)
115 #elif CONFIG_KEYPAD == IRIVER_IFP7XX_PAD
116 #define CUBE_QUIT BUTTON_PLAY
117 #define CUBE_X_INC BUTTON_RIGHT
118 #define CUBE_X_DEC BUTTON_LEFT
119 #define CUBE_Y_INC BUTTON_UP
120 #define CUBE_Y_DEC BUTTON_DOWN
121 #define CUBE_Z_INC BUTTON_MODE
122 #define CUBE_Z_DEC BUTTON_EQ
123 #define CUBE_MODE (BUTTON_SELECT | BUTTON_REPEAT)
124 #define CUBE_PAUSE (BUTTON_SELECT | BUTTON_REL)
125 #define CUBE_HIGHSPEED (BUTTON_MODE | BUTTON_EQ) /* TODO: this is impossible */
127 #elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD)
128 #define CUBE_QUIT BUTTON_POWER
129 #define CUBE_X_INC BUTTON_LEFT
130 #define CUBE_X_DEC BUTTON_RIGHT
131 #define CUBE_Y_INC BUTTON_UP
132 #define CUBE_Y_DEC BUTTON_DOWN
133 #define CUBE_Z_INC (BUTTON_PLAY | BUTTON_UP)
134 #define CUBE_Z_DEC (BUTTON_PLAY | BUTTON_DOWN)
135 #define CUBE_MODE BUTTON_SELECT
136 #define CUBE_PAUSE_PRE BUTTON_PLAY
137 #define CUBE_PAUSE (BUTTON_PLAY | BUTTON_REL)
138 #define CUBE_HIGHSPEED (BUTTON_REC | BUTTON_REL)
140 #elif (CONFIG_KEYPAD == GIGABEAT_PAD)
141 #define CUBE_QUIT BUTTON_POWER
142 #define CUBE_X_INC BUTTON_LEFT
143 #define CUBE_X_DEC BUTTON_RIGHT
144 #define CUBE_Y_INC BUTTON_UP
145 #define CUBE_Y_DEC BUTTON_DOWN
146 #define CUBE_Z_INC BUTTON_VOL_UP
147 #define CUBE_Z_DEC BUTTON_VOL_DOWN
148 #define CUBE_MODE BUTTON_MENU
149 #define CUBE_PAUSE BUTTON_SELECT
150 #define CUBE_HIGHSPEED BUTTON_A
152 #elif (CONFIG_KEYPAD == SANSA_E200_PAD)
153 #define CUBE_QUIT BUTTON_POWER
154 #define CUBE_X_INC BUTTON_LEFT
155 #define CUBE_X_DEC BUTTON_RIGHT
156 #define CUBE_Y_INC BUTTON_SCROLL_UP
157 #define CUBE_Y_DEC BUTTON_SCROLL_DOWN
158 #define CUBE_Z_INC BUTTON_UP
159 #define CUBE_Z_DEC BUTTON_DOWN
160 #define CUBE_MODE_PRE BUTTON_SELECT
161 #define CUBE_MODE (BUTTON_SELECT|BUTTON_REPEAT)
162 #define CUBE_PAUSE_PRE BUTTON_SELECT
163 #define CUBE_PAUSE (BUTTON_SELECT|BUTTON_REL)
164 #define CUBE_HIGHSPEED BUTTON_REC
166 #elif (CONFIG_KEYPAD == SANSA_C200_PAD)
167 #define CUBE_QUIT BUTTON_POWER
168 #define CUBE_X_INC BUTTON_LEFT
169 #define CUBE_X_DEC BUTTON_RIGHT
170 #define CUBE_Y_INC BUTTON_VOL_UP
171 #define CUBE_Y_DEC BUTTON_VOL_DOWN
172 #define CUBE_Z_INC BUTTON_UP
173 #define CUBE_Z_DEC BUTTON_DOWN
174 #define CUBE_MODE_PRE BUTTON_SELECT
175 #define CUBE_MODE (BUTTON_SELECT|BUTTON_REPEAT)
176 #define CUBE_PAUSE_PRE BUTTON_SELECT
177 #define CUBE_PAUSE (BUTTON_SELECT|BUTTON_REL)
178 #define CUBE_HIGHSPEED BUTTON_REC
181 #elif (CONFIG_KEYPAD == IRIVER_H10_PAD)
182 #define CUBE_QUIT BUTTON_POWER
183 #define CUBE_X_INC BUTTON_LEFT
184 #define CUBE_X_DEC BUTTON_RIGHT
185 #define CUBE_Y_INC BUTTON_SCROLL_UP
186 #define CUBE_Y_DEC BUTTON_SCROLL_DOWN
187 #define CUBE_Z_INC (BUTTON_PLAY | BUTTON_SCROLL_UP)
188 #define CUBE_Z_DEC (BUTTON_PLAY | BUTTON_SCROLL_DOWN)
189 #define CUBE_MODE BUTTON_REW
190 #define CUBE_PAUSE_PRE BUTTON_PLAY
191 #define CUBE_PAUSE (BUTTON_PLAY | BUTTON_REL)
192 #define CUBE_HIGHSPEED (BUTTON_FF | BUTTON_REL)
194 #elif CONFIG_KEYPAD == MROBE500_PAD
195 #define CUBE_QUIT BUTTON_POWER
196 #define CUBE_X_INC BUTTON_LEFT
197 #define CUBE_X_DEC BUTTON_RIGHT
198 #define CUBE_Y_INC BUTTON_RC_PLAY
199 #define CUBE_Y_DEC BUTTON_RC_DOWN
200 #define CUBE_Z_INC BUTTON_RC_VOL_UP
201 #define CUBE_Z_DEC BUTTON_RC_VOL_DOWN
202 #define CUBE_MODE BUTTON_RC_MODE
203 #define CUBE_PAUSE_PRE BUTTON_RC_HEART
204 #define CUBE_PAUSE (BUTTON_RC_HEART | BUTTON_REL)
205 #define CUBE_HIGHSPEED BUTTON_RC_HEART
209 #ifdef HAVE_LCD_BITMAP
211 #define DIST (10 * MIN(LCD_HEIGHT, LCD_WIDTH) / 16)
212 static int x_off
= LCD_WIDTH
/2;
213 static int y_off
= LCD_HEIGHT
/2;
218 void (*update
)(void);
219 void (*clear_display
)(void);
220 void (*drawline
)(int x1
, int y1
, int x2
, int y2
);
221 void (*putsxy
)(int x
, int y
, const unsigned char *string
);
224 static struct my_lcd grayfuncs
= {
225 gray_update
, gray_clear_display
, gray_drawline
, gray_putsxy
227 static struct my_lcd lcdfuncs
; /* initialised at runtime */
228 static struct my_lcd
*mylcd
= &grayfuncs
;
230 #define MYLCD(fn) mylcd->fn
231 #define MY_FILLTRIANGLE(x1, y1, x2, y2, x3, y3) gray_filltriangle(x1, y1, x2, y2, x3, y3)
232 #define MY_SET_FOREGROUND(fg) gray_set_foreground(fg)
233 #define MY_GET_FOREGROUND() gray_get_foreground()
236 #define MYLCD(fn) rb->lcd_ ## fn
237 #define MY_FILLTRIANGLE(x1, y1, x2, y2, x3, y3) xlcd_filltriangle(x1, y1, x2, y2, x3, y3)
238 #define MY_SET_FOREGROUND(fg) rb->lcd_set_foreground(fg)
239 #define MY_GET_FOREGROUND() rb->lcd_get_foreground()
242 #if CONFIG_LCD == LCD_SSD1815
243 #define ASPECT 320 /* = 1.25 (fixed point 24.8) */
245 #define ASPECT 256 /* = 1.00 */
248 #else /* !LCD_BITMAP */
250 #define MYLCD(fn) pgfx_ ## fn
252 static int x_off
= 10;
253 static int y_off
= 7;
254 #define ASPECT 300 /* = 1.175 */
256 #endif /* !LCD_BITMAP */
275 /* initial, unrotated cube corners */
276 static const struct point_3D sommet
[8] =
278 {-DIST
, -DIST
, -DIST
},
279 { DIST
, -DIST
, -DIST
},
280 { DIST
, DIST
, -DIST
},
281 {-DIST
, DIST
, -DIST
},
282 {-DIST
, -DIST
, DIST
},
283 { DIST
, -DIST
, DIST
},
288 /* The 12 lines forming the edges */
289 static const struct line lines
[12] =
291 {0, 1}, {1, 2}, {2, 3}, {3, 0},
292 {4, 7}, {7, 6}, {6, 5}, {5, 4},
293 {0, 4}, {1, 5}, {2, 6}, {3, 7}
296 static bool lines_drawn
[12];
298 /* The 6 faces of the cube; points are in clockwise order when viewed
300 static const struct face faces
[6] =
302 {{0, 1, 2, 3}, {0, 1, 2, 3}},
303 {{4, 7, 6, 5}, {4, 5, 6, 7}},
304 {{0, 4, 5, 1}, {8, 7, 9, 0}},
305 {{2, 6, 7, 3}, {10, 5, 11, 2}},
306 {{0, 3, 7, 4}, {3, 11, 4, 8}},
307 {{1, 5, 6, 2}, {9, 6, 10, 1}}
310 #if LCD_DEPTH > 1 || defined(USE_GSLIB)
311 static const unsigned face_colors
[6] =
313 #ifdef HAVE_LCD_COLOR
314 LCD_RGBPACK(255, 0, 0), LCD_RGBPACK(255, 0, 0), LCD_RGBPACK(0, 255, 0),
315 LCD_RGBPACK(0, 255, 0), LCD_RGBPACK(0, 0, 255), LCD_RGBPACK(0, 0, 255)
316 #elif defined(USE_GSLIB)
317 GRAY_LIGHTGRAY
, GRAY_LIGHTGRAY
, GRAY_DARKGRAY
,
318 GRAY_DARKGRAY
, GRAY_BLACK
, GRAY_BLACK
320 LCD_LIGHTGRAY
, LCD_LIGHTGRAY
, LCD_DARKGRAY
,
321 LCD_DARKGRAY
, LCD_BLACK
, LCD_BLACK
327 #if LCD_DEPTH > 1 || defined(USE_GSLIB)
337 static struct point_3D point3D
[8];
338 static struct point_2D point2D
[8];
339 static long matrice
[3][3];
341 static const int nb_points
= 8;
342 static long z_off
= 600;
344 static struct plugin_api
* rb
;
346 static void cube_rotate(int xa
, int ya
, int za
)
349 /* Just to prevent unnecessary lookups */
350 long sxa
, cxa
, sya
, cya
, sza
, cza
;
359 /* calculate overall translation matrix */
360 matrice
[0][0] = (cza
* cya
) >> 14;
361 matrice
[1][0] = (sza
* cya
) >> 14;
362 matrice
[2][0] = -sya
;
364 matrice
[0][1] = (((cza
* sya
) >> 14) * sxa
- sza
* cxa
) >> 14;
365 matrice
[1][1] = (((sza
* sya
) >> 14) * sxa
+ cxa
* cza
) >> 14;
366 matrice
[2][1] = (sxa
* cya
) >> 14;
368 matrice
[0][2] = (((cza
* sya
) >> 14) * cxa
+ sza
* sxa
) >> 14;
369 matrice
[1][2] = (((sza
* sya
) >> 14) * cxa
- cza
* sxa
) >> 14;
370 matrice
[2][2] = (cxa
* cya
) >> 14;
372 /* apply translation matrix to all points */
373 for (i
= 0; i
< nb_points
; i
++)
375 point3D
[i
].x
= matrice
[0][0] * sommet
[i
].x
+ matrice
[1][0] * sommet
[i
].y
376 + matrice
[2][0] * sommet
[i
].z
;
378 point3D
[i
].y
= matrice
[0][1] * sommet
[i
].x
+ matrice
[1][1] * sommet
[i
].y
379 + matrice
[2][1] * sommet
[i
].z
;
381 point3D
[i
].z
= matrice
[0][2] * sommet
[i
].x
+ matrice
[1][2] * sommet
[i
].y
382 + matrice
[2][2] * sommet
[i
].z
;
386 static void cube_viewport(void)
390 /* Do viewport transformation for all points */
391 for (i
= 0; i
< nb_points
; i
++)
394 point2D
[i
].x
= (point3D
[i
].x
* ASPECT
) / (point3D
[i
].z
+ (z_off
<< 14))
397 point2D
[i
].x
= (point3D
[i
].x
<< 8) / (point3D
[i
].z
+ (z_off
<< 14))
400 point2D
[i
].y
= (point3D
[i
].y
<< 8) / (point3D
[i
].z
+ (z_off
<< 14))
405 static void cube_draw(void)
408 #if LCD_DEPTH > 1 || defined(USE_GSLIB)
409 unsigned old_foreground
;
414 #if LCD_DEPTH > 1 || defined(USE_GSLIB)
417 old_foreground
= MY_GET_FOREGROUND();
418 for (i
= 0; i
< 6; i
++)
420 /* backface culling; if the shape winds counter-clockwise, we are
421 * looking at the backface, and the (simplified) cross product
422 * is < 0. Do not draw it. */
423 if (0 >= (point2D
[faces
[i
].corner
[1]].x
- point2D
[faces
[i
].corner
[0]].x
)
424 * (point2D
[faces
[i
].corner
[2]].y
- point2D
[faces
[i
].corner
[1]].y
)
425 - (point2D
[faces
[i
].corner
[1]].y
- point2D
[faces
[i
].corner
[0]].y
)
426 * (point2D
[faces
[i
].corner
[2]].x
- point2D
[faces
[i
].corner
[1]].x
))
429 MY_SET_FOREGROUND(face_colors
[i
]);
430 MY_FILLTRIANGLE(point2D
[faces
[i
].corner
[0]].x
,
431 point2D
[faces
[i
].corner
[0]].y
,
432 point2D
[faces
[i
].corner
[1]].x
,
433 point2D
[faces
[i
].corner
[1]].y
,
434 point2D
[faces
[i
].corner
[2]].x
,
435 point2D
[faces
[i
].corner
[2]].y
);
436 MY_FILLTRIANGLE(point2D
[faces
[i
].corner
[0]].x
,
437 point2D
[faces
[i
].corner
[0]].y
,
438 point2D
[faces
[i
].corner
[2]].x
,
439 point2D
[faces
[i
].corner
[2]].y
,
440 point2D
[faces
[i
].corner
[3]].x
,
441 point2D
[faces
[i
].corner
[3]].y
);
444 MY_SET_FOREGROUND(old_foreground
);
446 #endif /* (LCD_DEPTH > 1) || GSLIB */
450 rb
->memset(lines_drawn
, 0, sizeof(lines_drawn
));
451 for (i
= 0; i
< 6; i
++)
453 /* backface culling; if the shape winds counter-clockwise, we are
454 * looking at the backface, and the (simplified) cross product
455 * is < 0. Do not draw it. */
456 if (0 >= (point2D
[faces
[i
].corner
[1]].x
- point2D
[faces
[i
].corner
[0]].x
)
457 * (point2D
[faces
[i
].corner
[2]].y
- point2D
[faces
[i
].corner
[1]].y
)
458 - (point2D
[faces
[i
].corner
[1]].y
- point2D
[faces
[i
].corner
[0]].y
)
459 * (point2D
[faces
[i
].corner
[2]].x
- point2D
[faces
[i
].corner
[1]].x
))
462 for (j
= 0; j
< 4; j
++)
464 line
= faces
[i
].line
[j
];
465 if (!lines_drawn
[line
])
467 lines_drawn
[line
] = true;
468 MYLCD(drawline
)(point2D
[lines
[line
].start
].x
,
469 point2D
[lines
[line
].start
].y
,
470 point2D
[lines
[line
].end
].x
,
471 point2D
[lines
[line
].end
].y
);
479 for (i
= 0; i
< 12; i
++)
480 MYLCD(drawline
)(point2D
[lines
[i
].start
].x
,
481 point2D
[lines
[i
].start
].y
,
482 point2D
[lines
[i
].end
].x
,
483 point2D
[lines
[i
].end
].y
);
488 void cleanup(void *parameter
)
494 #elif defined HAVE_LCD_CHARCELLS
499 enum plugin_status
plugin_start(struct plugin_api
* api
, void* parameter
)
505 size_t gbuf_size
= 0;
506 bool mode_switch
= true;
510 int lastbutton
= BUTTON_NONE
;
517 bool highspeed
= false;
525 #ifdef HAVE_LCD_BITMAP
528 #elif defined(USE_GSLIB)
529 gbuf
= (unsigned char *)rb
->plugin_get_buffer(&gbuf_size
);
530 if (gray_init(rb
, gbuf
, gbuf_size
, true, LCD_WIDTH
, LCD_HEIGHT
, 3, 0, NULL
)
533 rb
->splash(HZ
, "Couldn't get grayscale buffer");
536 /* init lcd_ function pointers */
537 lcdfuncs
.update
= rb
->lcd_update
;
538 lcdfuncs
.clear_display
= rb
->lcd_clear_display
;
539 lcdfuncs
.drawline
= rb
->lcd_drawline
;
540 lcdfuncs
.putsxy
= rb
->lcd_putsxy
;
542 gray_setfont(FONT_SYSFIXED
);
544 rb
->lcd_setfont(FONT_SYSFIXED
);
545 #else /* LCD_CHARCELLS */
546 if (!pgfx_init(rb
, 4, 2))
548 rb
->splash(HZ
*2, "Old LCD :(");
563 MYLCD(clear_display
)();
564 cube_rotate(xa
, ya
, za
);
570 #ifdef HAVE_LCD_BITMAP
574 rb
->snprintf(buffer
, sizeof(buffer
), "x:%d y:%d z:%d h:%d",
575 xs
, ys
, zs
, highspeed
);
576 MYLCD(putsxy
)(0, LCD_HEIGHT
-8, buffer
);
583 if (t_disp
== DISP_TIME
)
585 rb
->snprintf(buffer
, sizeof(buffer
), "x%d", xs
);
586 rb
->lcd_puts(0, 0, buffer
);
587 rb
->snprintf(buffer
, sizeof(buffer
), "y%d", ys
);
588 rb
->lcd_puts(0, 1, buffer
);
590 rb
->snprintf(buffer
, sizeof(buffer
), "z%d", zs
);
591 rb
->lcd_puts(8, 0, buffer
);
592 rb
->snprintf(buffer
, sizeof(buffer
), "h%d", highspeed
);
593 rb
->lcd_puts(8, 1, buffer
);
598 rb
->lcd_clear_display();
606 gray_show(mode
== SOLID
);
634 button
= rb
->button_get(false);
638 case (CUBE_X_INC
|BUTTON_REPEAT
):
655 case (CUBE_X_DEC
|BUTTON_REPEAT
):
672 case (CUBE_Y_INC
|BUTTON_REPEAT
):
689 case (CUBE_Y_DEC
|BUTTON_REPEAT
):
706 case (CUBE_Z_INC
|BUTTON_REPEAT
):
723 case (CUBE_Z_DEC
|BUTTON_REPEAT
):
741 if (lastbutton
!= CUBE_MODE_PRE
)
744 if (++mode
>= NUM_MODES
)
747 mylcd
= (mode
== SOLID
) ? &grayfuncs
: &lcdfuncs
;
754 #ifdef CUBE_PAUSE_PRE
755 if (lastbutton
!= CUBE_PAUSE_PRE
)
762 #ifdef CUBE_HIGHSPEED_PRE
763 if (lastbutton
!= CUBE_HIGHSPEED_PRE
)
766 highspeed
= !highspeed
;
778 if (rb
->default_event_handler_ex(button
, cleanup
, NULL
)
779 == SYS_USB_CONNECTED
)
780 return PLUGIN_USB_CONNECTED
;
783 if (button
!= BUTTON_NONE
)
789 #elif defined(HAVE_LCD_CHARCELLS)