#include "rotenc.h"
typedef struct {
- uint8_t swstat;
+ UZUME uzume;
uint8_t effect;
+ int8_t locate_target;
+ int8_t locate_current;
} work_t;
-static void system_default(UZUME *p)
+static void rotenc_callback(RotencAction action, void *extobj)
{
- work_t *w = (work_t *)UZUME_USER_DATA(p);
-
- lcd_goto(0, 0);
- lcd_putc(0x08 + UZUME_VOLUME_INPUT(p).left >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_INPUT(p).right >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_OUTPUT(p).left >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_OUTPUT(p).right >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_INPUT(p).left >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_INPUT(p).right >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_OUTPUT(p).left >> 29);
- lcd_putc(0x08 + UZUME_VOLUME_OUTPUT(p).right >> 29);
-
- w->swstat = (w->swstat << 1) | rotenc_swstat();
- if (w->swstat == 0x0F) {
+ work_t *w = (work_t *)extobj;
+ if (RotencActionPush == action) {
w->effect = !w->effect;
if (w->effect) {
- uzume_set_effect(p, effect_karaoke);
+ uzume_set_effect(&(w->uzume), effect_karaoke);
led_write(LedTargetR, 0);
led_write(LedTargetG, 1);
+
} else {
- uzume_set_effect(p, effect_through);
+ uzume_set_effect(&(w->uzume), effect_through);
led_write(LedTargetR, 1);
led_write(LedTargetG, 0);
}
}
+ if (RotencActionLeft == action) {
+ w->locate_target-=8;
+ if (w->locate_target < 0) {
+ w->locate_target = 0;
+ }
+ }
+ if (RotencActionRight == action) {
+ w->locate_target+=8;
+ if (32 < w->locate_target) {
+ w->locate_target = 32;
+ }
+ }
+}
+
+static void system_default(UZUME *p)
+{
+ work_t *w = (work_t *)UZUME_USER_DATA(p);
+
+ lcd_goto(0, 0);
+ lcd_putc(0x08 + (UZUME_VOLUME_INPUT(p).left >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_INPUT(p).right >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_OUTPUT(p).left >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_OUTPUT(p).right >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_INPUT(p).left >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_INPUT(p).right >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_OUTPUT(p).left >> 29));
+ lcd_putc(0x08 + (UZUME_VOLUME_OUTPUT(p).right >> 29));
+
+#define SCROLL_SPEED (16)
+ static uint8_t divcnt = 0;
+ if (((divcnt++) % SCROLL_SPEED) == 0) {
+ if (w->locate_current < w->locate_target) {
+ lcd_display_shift(Left);
+ w->locate_current++;
+ }
+ if (w->locate_target < w->locate_current) {
+ lcd_display_shift(Right);
+ w->locate_current--;
+ }
+ }
}
int main(void)
{
- UZUME u;
work_t w;
- w.swstat = 0;
w.effect = 0;
+ w.locate_target = 0;
+ w.locate_current = 0;
- uzume_init(&u, &w);
- uzume_set_effect(&u, effect_through);
- uzume_set_system(&u, system_default);
+ uzume_init(&w.uzume, &w);
+ uzume_set_effect(&w.uzume, effect_through);
+ uzume_set_system(&w.uzume, system_default);
led_write(LedTargetR, 1);
led_write(LedTargetG, 0);
- uzume_execute(&u);
+ rotenc_init(rotenc_callback, &w);
+ uzume_execute(&w.uzume);
return 0;
}