X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=firm%2Fbare_metal%2Fmain.c;h=bb90e4c31876c2db67d813f2c60e37060b912862;hb=5acd50635778de92bbdb96d74695dc69d3222650;hp=55fbdc9d7388ce4ab68bf7ae0c6285b6a3b00476;hpb=5692f68a06f063744c83e35f5964d9a3baacbbd5;p=bluetank%2Fbluetank.git diff --git a/firm/bare_metal/main.c b/firm/bare_metal/main.c index 55fbdc9..bb90e4c 100644 --- a/firm/bare_metal/main.c +++ b/firm/bare_metal/main.c @@ -41,53 +41,85 @@ #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; }