OSDN Git Service

Updated the rotary encoder module.
[bluetank/bluetank.git] / firm / bare_metal / main.c
index 55fbdc9..bb90e4c 100644 (file)
 #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;
 }