OSDN Git Service

Added effect parameters to effect module.
authorShinichiro Nakamura <shinta.main.jp@gmail.com>
Sat, 25 Aug 2012 19:36:35 +0000 (04:36 +0900)
committerShinichiro Nakamura <shinta.main.jp@gmail.com>
Sat, 25 Aug 2012 19:36:35 +0000 (04:36 +0900)
firm/bare_metal/README
firm/bare_metal/common/effect.c
firm/bare_metal/common/effect.h
firm/bare_metal/common/rotenc.c
firm/bare_metal/dynamic_menu/main.c
firm/bare_metal/karaoke_machine/main.c
firm/bare_metal/simple_through/main.c

index 010ba99..ff3f85d 100644 (file)
@@ -4,7 +4,11 @@
 ==========================================================================
 common/             Common Files
 simple_through/     Simple Through Example
+                    UZURA\e$B%U%l!<%`%o!<%/$r;H$&$?$a$N:GDc8BI,MW$J=i4|2=$,\e(B
+                    \e$B$o$+$k%5%s%W%k!#\e(B
 karaoke_machine/    Karaoke Machine Example
+                    simple_through\e$B$K!"%(%U%'%/%H$N@Z$jBX$($d%\%j%e!<%`\e(B
+                    \e$B@)8f$rDI2C$7$?%5%s%W%k!#\e(B
 dynamic_menu/       Dynamic Menu Example
 
 ==========================================================================
index e656be1..941f080 100644 (file)
 #include <stdlib.h>
 #include "effect.h"
 
+typedef struct {
+    double left;
+    double right;
+} volume_t;
+
+volume_t volume;
+
 void effect_through(
         UZURA *p,
         const int32_t *src, int32_t *des, int32_t count)
@@ -46,8 +53,8 @@ void effect_through(
     UZURA_LEVEL_OUTPUT(p).left = 0;
     UZURA_LEVEL_OUTPUT(p).right = 0;
     for (i = 0; i < count; i+=2) {
-        *(des + i + 0) = *(src + i + 0);
-        *(des + i + 1) = *(src + i + 1);
+        *(des + i + 0) = *(src + i + 0) * volume.left;
+        *(des + i + 1) = *(src + i + 1) * volume.right;
         UZURA_LEVEL_INPUT(p).left += abs(*(src + i + 0)) >> 1;
         UZURA_LEVEL_INPUT(p).right += abs(*(src + i + 1)) >> 1;
         UZURA_LEVEL_OUTPUT(p).left += abs(*(des + i + 0)) >> 1;
@@ -65,8 +72,8 @@ void effect_karaoke(
     UZURA_LEVEL_OUTPUT(p).left = 0;
     UZURA_LEVEL_OUTPUT(p).right = 0;
     for (i = 0; i < count; i+=2) {
-        *(des + i + 0) = *(src + i + 0) - *(src + i + 1);
-        *(des + i + 1) = *(src + i + 0) - *(src + i + 1);
+        *(des + i + 0) = (*(src + i + 0) - *(src + i + 1)) * volume.left;
+        *(des + i + 1) = (*(src + i + 0) - *(src + i + 1)) * volume.right;
         UZURA_LEVEL_INPUT(p).left += abs(*(src + i + 0)) >> 1;
         UZURA_LEVEL_INPUT(p).right += abs(*(src + i + 1)) >> 1;
         UZURA_LEVEL_OUTPUT(p).left += abs(*(des + i + 0)) >> 1;
@@ -74,3 +81,15 @@ void effect_karaoke(
     }
 }
 
+void effect_param_init(void)
+{
+    volume.left = 1.0;
+    volume.right = 1.0;
+}
+
+void effect_param_volume(const double left, const double right)
+{
+    volume.left = left;
+    volume.right = right;
+}
+
index 1539d01..376c15a 100644 (file)
@@ -46,5 +46,8 @@ void effect_karaoke(
         UZURA *p,
         const int32_t *src, int32_t *des, int32_t count);
 
+void effect_param_init(void);
+void effect_param_volume(const double left, const double right);
+
 #endif
 
index 627daf3..e6aff6a 100644 (file)
@@ -74,7 +74,7 @@ static __attribute__((interrupt_handler)) void rotenc_isr(void)
     static int index;
     int n;
 
-    index = (index << 2) + (((PA_STAT() << 1) | (PB_STAT() << 0)) & 3);
+    index = (index << 2) + (((PB_STAT() << 1) | (PA_STAT() << 0)) & 3);
     n = dir[index & 15];
     if (n) {
         if (n < 0) {
@@ -85,7 +85,7 @@ static __attribute__((interrupt_handler)) void rotenc_isr(void)
         }
     }
     swstat = (swstat << 1) | SW_STAT();
-    if (swstat == 0x0F) {
+    if (swstat == 0xF0) {
         callback(RotencActionPush, user_obj);
     }
 }
index 9340371..ac31b80 100644 (file)
@@ -40,6 +40,9 @@
 #include "effect.h"
 #include "rotenc.h"
 
+#define LOTTHR  (5)     /**< Lotate Threshold. */
+#define SCRSPD  (16)    /**< Scroll Speed. */
+
 typedef struct {
     UZURA uzura;
     uint8_t effect;
@@ -62,28 +65,34 @@ static void rotenc_callback(RotencAction action, void *extobj)
         } else {
             uzura_set_effect(&(w->uzura), effect_through);
             led_write(LedTargetR, 1);
-            led_write(LedTargetG, 0);
+            led_write(LedTargetG, 1);
         }
     }
     if (RotencActionLeft == action) {
-        if (lotdiv < -4) {
+        if (lotdiv < -LOTTHR) {
             w->locate_target-=8;
             if (w->locate_target < 0) {
                 w->locate_target = 0;
             }
             lotdiv = 0;
         } else {
+            if (0 < lotdiv) {
+                lotdiv = 0;
+            }
             lotdiv--;
         }
     }
     if (RotencActionRight == action) {
-        if (4 < lotdiv) {
+        if (LOTTHR < lotdiv) {
             w->locate_target+=8;
             if (32 < w->locate_target) {
                 w->locate_target = 32;
             }
             lotdiv = 0;
         } else {
+            if (lotdiv < 0) {
+                lotdiv = 0;
+            }
             lotdiv++;
         }
     }
@@ -103,9 +112,8 @@ static void system_dynamic_menu(UZURA *p)
     lcd_putc(0x08 + (UZURA_LEVEL_OUTPUT(p).left  >> 29));
     lcd_putc(0x08 + (UZURA_LEVEL_OUTPUT(p).right >> 29));
 
-#define SCROLL_SPEED    (16)
     static uint8_t divcnt = 0;
-    if (((divcnt++) % SCROLL_SPEED) == 0) {
+    if (((divcnt++) % SCRSPD) == 0) {
         if (w->locate_current < w->locate_target) {
             lcd_display_shift(Left);
             w->locate_current++;
@@ -125,11 +133,12 @@ int main(void)
     w.locate_target = 0;
     w.locate_current = 0;
 
+    effect_param_init();
     uzura_init(&w.uzura, &w);
     uzura_set_effect(&w.uzura, effect_through);
     uzura_set_system(&w.uzura, system_dynamic_menu);
     led_write(LedTargetR, 1);
-    led_write(LedTargetG, 0);
+    led_write(LedTargetG, 1);
     rotenc_init(rotenc_callback, &w);
     uzura_execute(&w.uzura);
 
index 0f1cf0d..7ce4a69 100644 (file)
  * ===============================================================
  */
 
-#include <stddef.h>
 #include "uzura.h"
-#include "led.h"
 #include "effect.h"
 #include "system.h"
+#include "led.h"
 #include "rotenc.h"
 
 typedef struct {
     UZURA uzura;
     uint8_t effect;
+    int volume;
 } work_t;
 
 static void rotenc_callback(RotencAction action, void *extobj)
@@ -61,6 +61,18 @@ static void rotenc_callback(RotencAction action, void *extobj)
             led_write(LedTargetG, 1);
         }
     }
+    if (RotencActionLeft == action) {
+        if (0 < w->volume) {
+            w->volume--;
+            effect_param_volume(w->volume / 100.0, w->volume / 100.0);
+        }
+    }
+    if (RotencActionRight == action) {
+        if (w->volume < 100) {
+            w->volume++;
+            effect_param_volume(w->volume / 100.0, w->volume / 100.0);
+        }
+    }
 }
 
 int main(void)
@@ -68,7 +80,9 @@ int main(void)
     work_t w;
 
     w.effect = 0;
+    w.volume = 100;
 
+    effect_param_init();
     uzura_init(&w.uzura, &w);
     uzura_set_effect(&w.uzura, effect_through);
     uzura_set_system(&w.uzura, system_default);
index 4cf4a50..a779599 100644 (file)
@@ -45,6 +45,7 @@ int main(void)
 {
     work_t w;
 
+    effect_param_init();
     uzura_init(&w.uzura, &w);
     uzura_set_effect(&w.uzura, effect_through);
     uzura_set_system(&w.uzura, system_default);