blinker change
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 21 Jul 2011 06:51:56 +0000 (15:51 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 21 Jul 2011 06:51:56 +0000 (15:51 +0900)
ChangeLog
src/main.c
src/neug.h

index 8597972..1922b7a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-07-21  NIIBE Yutaka  <gniibe@fsij.org>
+
+       * src/neug.h (NEUG_PRE_LOOP): New.
+
+       * src/main.c (led_blinker): New.
+       (main): Use led_blinker.
+       (main): Call neug_get before USB configuration at least
+       NEUG_PRE_LOOP times.
+
 2011-07-14  NIIBE Yutaka  <gniibe@fsij.org>
 
        * src/configure: Support CQ_STARM.
index 231d3c5..ad8b809 100644 (file)
@@ -348,6 +348,29 @@ static void fill_serial_no_by_unique_id (void)
     }
 }
 \f
+static WORKING_AREA(wa_led, 64);
+
+#define LED_ONESHOT ((eventmask_t)1)
+static Thread *led_thread;
+
+static msg_t led_blinker (void *arg)
+{
+  (void)arg;
+
+  led_thread = chThdSelf ();
+  set_led (0);
+
+  while (1)
+    {
+      chEvtWaitOne (LED_ONESHOT);
+      set_led (1);
+      chThdSleep (MS2ST (100));
+      set_led (0);
+    }
+
+  return 0;
+}
+\f
 #define RANDOM_BYTES_LENGTH 32
 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)];
 
@@ -376,24 +399,31 @@ main (int argc, char **argv)
   sduStart(&SDU1, &serusbcfg);
   USB_Cable_Config (ENABLE);
 
+  chThdCreateStatic (wa_led, sizeof (wa_led), NORMALPRIO, led_blinker, NULL);
+
   neug_init (random_word, RANDOM_BYTES_LENGTH/sizeof (uint32_t));
 
   while (1)
     {
+      uint32_t v;
+      const uint8_t *s = (const uint8_t *)&v;
+
       while (SDU1.config->usbp->state != USB_ACTIVE)
        {
-         set_led ((count & 1) == 0);
-         chThdSleep (MS2ST (250));
+         v = neug_get (NEUG_KICK_FILLING);
+         if ((count & 15) == 0)
+           chEvtSignalFlags (led_thread, LED_ONESHOT);
+         chThdSleep (MS2ST (25));
          count++;
        }
 
+      while (count++ < NEUG_PRE_LOOP)
+       v = neug_get (NEUG_KICK_FILLING);
+
       count = 0;
 
       while (1)
        {
-         uint32_t v;
-         const uint8_t *s = (const uint8_t *)&v;
-
          count++;
 
          if (SDU1.config->usbp->state != USB_ACTIVE)
@@ -401,8 +431,8 @@ main (int argc, char **argv)
 
          v = neug_get (NEUG_KICK_FILLING);
 
-         set_led ((count & 0x400) == 0);
-
+         if ((count & 0x800) == 0)
+           chEvtSignalFlags (led_thread, LED_ONESHOT);
          /*
           * Ignore input, just in case /dev/ttyACM0 echos our output
           */
index 0678bed..b6d0a21 100644 (file)
@@ -1,6 +1,8 @@
 #define NEUG_NO_KICK      0
 #define NEUG_KICK_FILLING 1
 
+#define NEUG_PRE_LOOP 16
+
 void neug_init (uint32_t *buf, uint8_t size);
 uint32_t neug_get (int kick);
 void neug_kick_filling (void);