diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2016-04-21 15:59:34 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2016-04-21 15:59:34 +0900 |
commit | 06d28b62fbc146a18c6fac3e8c82da3f812fedfa (patch) | |
tree | bfdcf7f38b667a014da3760ff9250610172280c2 /example-fs-bb48 | |
parent | 437b2dc43ca2e9b39b7be40f41b233bbaa8f8362 (diff) |
Implement chopstx_poll
Diffstat (limited to 'example-fs-bb48')
-rw-r--r-- | example-fs-bb48/sample.c | 83 | ||||
-rw-r--r-- | example-fs-bb48/usb-cdc.c | 7 |
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); |