loop from NeuG side
authorNIIBE Yutaka <gniibe@fsij.org>
Tue, 23 Oct 2012 00:01:26 +0000 (09:01 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Tue, 23 Oct 2012 00:01:26 +0000 (09:01 +0900)
src/main.c
src/neug.h
src/random.c

index d5ed890..15f42bf 100644 (file)
@@ -691,6 +691,11 @@ static msg_t led_blinker (void *arg)
 #define RANDOM_BYTES_LENGTH 64
 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)];
 
+static void copy_to_tx (uint32_t v, int i)
+{
+  usb_lld_txcpy (&v, ENDP1, i * 4, 4);
+}
+
 /*
  * Entry point.
  *
@@ -773,15 +778,7 @@ main (int argc, char **argv)
          if ((count & 0x03ff) == 0)
            chEvtSignalFlags (led_thread, LED_ONESHOT_SHORT);
 
-         for (i = 0; i < 64/4; i++)
-           {
-             uint32_t v;
-
-             if (neug_get_nonblock (&v) < 0)
-               break;
-
-             usb_lld_txcpy (&v, ENDP1, i * 4, 4);
-           }
+         i = neug_consume_random (copy_to_tx);
 
          if (i == 0 && !last_was_fullsizepacket)
            {    /* Only send ZLP when the last packet was fullsize.  */
index d35de2d..20b56dc 100644 (file)
@@ -25,3 +25,5 @@ void neug_flush (void);
 void neug_wait_full (void);
 void neug_fini (void);
 void neug_mode_select (uint8_t mode);
+
+int neug_consume_random (void (*proc) (uint32_t, int));
index 5867ebc..340241a 100644 (file)
@@ -573,6 +573,26 @@ neug_get_nonblock (uint32_t *p)
   return r;
 }
 
+int neug_consume_random (void (*proc) (uint32_t, int))
+{
+  int i = 0;
+  struct rng_rb *rb = &the_ring_buffer;
+
+  chMtxLock (&rb->m);
+  while (!rb->empty)
+    {
+      uint32_t v;
+
+      v = rb_del (rb);
+      proc (v, i);
+      i++;
+    }
+  chCondSignal (&rb->space_available);
+  chMtxUnlock ();
+
+  return i;
+}
+
 void
 neug_wait_full (void)
 {