aboutsummaryrefslogtreecommitdiff
path: root/example-fs-bb48
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2016-04-21 15:59:34 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2016-04-21 15:59:34 +0900
commit06d28b62fbc146a18c6fac3e8c82da3f812fedfa (patch)
treebfdcf7f38b667a014da3760ff9250610172280c2 /example-fs-bb48
parent437b2dc43ca2e9b39b7be40f41b233bbaa8f8362 (diff)
Implement chopstx_poll
Diffstat (limited to 'example-fs-bb48')
-rw-r--r--example-fs-bb48/sample.c83
-rw-r--r--example-fs-bb48/usb-cdc.c7
2 files changed, 59 insertions, 31 deletions
diff --git a/example-fs-bb48/sample.c b/example-fs-bb48/sample.c
index 1054315..e692f1f 100644
--- a/example-fs-bb48/sample.c
+++ b/example-fs-bb48/sample.c
@@ -152,10 +152,31 @@ static char hexchar (uint8_t x)
return '?';
}
+static struct stream *st;
+
+static int
+check_recv (void *arg)
+{
+ struct stream *s = arg;
+ if ((s->flags & FLAG_CONNECTED) == 0)
+ return 1;
+ if ((s->flags & FLAG_RECV_AVAIL))
+ return 1;
+ return 0;
+}
+
+static void
+poll_for_stream (int reg_or_unreg, chopstx_px_t *px)
+{
+ if (reg_or_unreg == 0)
+ chopstx_cond_hook (px, &st->cnd, &st->mtx, check_recv, st);
+ else
+ chopstx_cond_unhook (px, &st->cnd);
+}
+
int
main (int argc, const char *argv[])
{
- struct stream *st;
uint8_t count;
extern uint32_t bDeviceState;
@@ -212,35 +233,43 @@ main (int argc, const char *argv[])
while (1)
{
- int size = stream_recv (st, s + 4);
+ int size;
+ uint32_t usec;
- if (size < 0)
- break;
-
- if (size >= 0)
+ /* With chopstx_poll, we can do timed cond_wait */
+ usec = 3000000;
+ if (chopstx_poll (&usec, 1, poll_for_stream))
{
- int i;
- unsigned int value;
-
- crc32_init ();
- s[0] = hexchar (size >> 4);
- s[1] = hexchar (size & 0x0f);
-
- for (i = 0; i < size; i++)
- crc32_u8 (s[4 + i]);
- value = crc32_value () ^ 0xffffffff;
- s[4] = hexchar (value >> 28);
- s[5] = hexchar (value >> 24);
- s[6] = hexchar (value >> 20);
- s[7] = hexchar (value >> 16);
- s[8] = hexchar (value >> 12);
- s[9] = hexchar (value >> 8);
- s[10] = hexchar (value >> 4);
- s[11] = hexchar (value);
- s[12] = '\r';
- s[13] = '\n';
- if (stream_send (st, s, 14) < 0)
+ size = stream_recv (st, s + 4);
+
+ if (size < 0)
break;
+
+ if (size >= 0)
+ {
+ int i;
+ unsigned int value;
+
+ crc32_init ();
+ s[0] = hexchar (size >> 4);
+ s[1] = hexchar (size & 0x0f);
+
+ for (i = 0; i < size; i++)
+ crc32_u8 (s[4 + i]);
+ value = crc32_value () ^ 0xffffffff;
+ s[4] = hexchar (value >> 28);
+ s[5] = hexchar (value >> 24);
+ s[6] = hexchar (value >> 20);
+ s[7] = hexchar (value >> 16);
+ s[8] = hexchar (value >> 12);
+ s[9] = hexchar (value >> 8);
+ s[10] = hexchar (value >> 4);
+ s[11] = hexchar (value);
+ s[12] = '\r';
+ s[13] = '\n';
+ if (stream_send (st, s, 14) < 0)
+ break;
+ }
}
u ^= 1;
diff --git a/example-fs-bb48/usb-cdc.c b/example-fs-bb48/usb-cdc.c
index 30d4ccd..58588c8 100644
--- a/example-fs-bb48/usb-cdc.c
+++ b/example-fs-bb48/usb-cdc.c
@@ -594,14 +594,13 @@ stream_recv (struct stream *st, uint8_t *buf)
r = -1;
else
{
- stream.flags &= ~FLAG_RECV_AVAIL;
- do
+ while (1)
{
- chopstx_cond_wait (&st->cnd, &st->mtx);
if ((stream.flags & FLAG_RECV_AVAIL))
{
r = stream.recv_len;
memcpy (buf, stream.recv_buf, r);
+ stream.flags &= ~FLAG_RECV_AVAIL;
break;
}
else if ((stream.flags & FLAG_CONNECTED) == 0)
@@ -609,8 +608,8 @@ stream_recv (struct stream *st, uint8_t *buf)
r = -1;
break;
}
+ chopstx_cond_wait (&st->cnd, &st->mtx);
}
- while (1);
}
chopstx_mutex_unlock (&st->mtx);