aboutsummaryrefslogtreecommitdiff
path: root/src/modules/systemlib
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-04-28 18:14:46 -0700
committerpx4dev <px4@purgatory.org>2013-04-28 18:14:46 -0700
commite67022f874f0fa091ed7dffd617c70c0c0253b5c (patch)
tree4308fd72c7dc6f782d464ac5886b226c371fd74d /src/modules/systemlib
parent8f7200e0114d6bd9fcac7ec088b125e54761c2e0 (diff)
downloadpx4-firmware-e67022f874f0fa091ed7dffd617c70c0c0253b5c.tar.gz
px4-firmware-e67022f874f0fa091ed7dffd617c70c0c0253b5c.tar.bz2
px4-firmware-e67022f874f0fa091ed7dffd617c70c0c0253b5c.zip
Serial interface for IOv2
Diffstat (limited to 'src/modules/systemlib')
-rw-r--r--src/modules/systemlib/hx_stream.c42
-rw-r--r--src/modules/systemlib/hx_stream.h18
2 files changed, 55 insertions, 5 deletions
diff --git a/src/modules/systemlib/hx_stream.c b/src/modules/systemlib/hx_stream.c
index 8d77f14a8..88f7f762c 100644
--- a/src/modules/systemlib/hx_stream.c
+++ b/src/modules/systemlib/hx_stream.c
@@ -76,6 +76,7 @@ struct hx_stream {
static void hx_tx_raw(hx_stream_t stream, uint8_t c);
static void hx_tx_raw(hx_stream_t stream, uint8_t c);
static int hx_rx_frame(hx_stream_t stream);
+static bool hx_rx_char(hx_stream_t stream, uint8_t c);
static void
hx_tx_raw(hx_stream_t stream, uint8_t c)
@@ -224,13 +225,13 @@ hx_stream_send(hx_stream_t stream,
return 0;
}
-void
-hx_stream_rx(hx_stream_t stream, uint8_t c)
+static bool
+hx_rx_char(hx_stream_t stream, uint8_t c)
{
/* frame end? */
if (c == FBO) {
hx_rx_frame(stream);
- return;
+ return true;
}
/* escaped? */
@@ -241,10 +242,43 @@ hx_stream_rx(hx_stream_t stream, uint8_t c)
} else if (c == CEO) {
/* now escaped, ignore the byte */
stream->escaped = true;
- return;
+ return false;
}
/* save for later */
if (stream->frame_bytes < sizeof(stream->buf))
stream->buf[stream->frame_bytes++] = c;
+
+ return false;
+}
+
+void
+hx_stream_rx_char(hx_stream_t stream, uint8_t c)
+{
+ hx_rx_char(stream, c);
+}
+
+int
+hx_stream_rx(hx_stream_t stream)
+{
+ uint16_t buf[16];
+ ssize_t len;
+
+ /* read bytes */
+ len = read(stream->fd, buf, sizeof(buf));
+ if (len <= 0) {
+
+ /* nonblocking stream and no data */
+ if (errno == EWOULDBLOCK)
+ return 0;
+
+ /* error or EOF */
+ return -errno;
+ }
+
+ /* process received characters */
+ for (int i = 0; i < len; i++)
+ hx_rx_char(stream, buf[i]);
+
+ return 0;
}
diff --git a/src/modules/systemlib/hx_stream.h b/src/modules/systemlib/hx_stream.h
index 128689953..be4850f74 100644
--- a/src/modules/systemlib/hx_stream.h
+++ b/src/modules/systemlib/hx_stream.h
@@ -114,9 +114,25 @@ __EXPORT extern int hx_stream_send(hx_stream_t stream,
* @param stream A handle returned from hx_stream_init.
* @param c The character to process.
*/
-__EXPORT extern void hx_stream_rx(hx_stream_t stream,
+__EXPORT extern void hx_stream_rx_char(hx_stream_t stream,
uint8_t c);
+/**
+ * Handle received bytes from the stream.
+ *
+ * Note that this interface should only be used with blocking streams
+ * when it is OK for the call to block until a frame is received.
+ *
+ * When used with a non-blocking stream, it will typically return
+ * immediately, or after handling a received frame.
+ *
+ * @param stream A handle returned from hx_stream_init.
+ * @return -errno on error, nonzero if a frame
+ * has been received, or if not enough
+ * bytes are available to complete a frame.
+ */
+__EXPORT extern int hx_stream_rx(hx_stream_t stream);
+
__END_DECLS
#endif