aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--os/lib/src/chmboxes.c4
-rw-r--r--os/lib/src/chpipes.c163
2 files changed, 165 insertions, 2 deletions
diff --git a/os/lib/src/chmboxes.c b/os/lib/src/chmboxes.c
index af10c6d7e..b0ca43877 100644
--- a/os/lib/src/chmboxes.c
+++ b/os/lib/src/chmboxes.c
@@ -103,7 +103,7 @@ void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n) {
* @details All the waiting threads are resumed with status @p MSG_RESET and
* the queued messages are lost.
* @post The mailbox is in reset state, all operations will fail and
- * return @p MSG reset until the mailbox is enabled again using
+ * return @p MSG_RESET until the mailbox is enabled again using
* @p chMBResumeX().
*
* @param[in] mbp the pointer to an initialized @p mailbox_t object
@@ -123,7 +123,7 @@ void chMBReset(mailbox_t *mbp) {
* @details All the waiting threads are resumed with status @p MSG_RESET and
* the queued messages are lost.
* @post The mailbox is in reset state, all operations will fail and
- * return @p MSG reset until the mailbox is enabled again using
+ * return @p MSG_RESET until the mailbox is enabled again using
* @p chMBResumeX().
*
* @param[in] mbp the pointer to an initialized @p mailbox_t object
diff --git a/os/lib/src/chpipes.c b/os/lib/src/chpipes.c
new file mode 100644
index 000000000..74a45e121
--- /dev/null
+++ b/os/lib/src/chpipes.c
@@ -0,0 +1,163 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio.
+
+ This file is part of ChibiOS.
+
+ ChibiOS is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ ChibiOS is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/**
+ * @file chpipes.c
+ * @brief Pipes code.
+ *
+ * @addtogroup pipes
+ * @details Byte pipes.
+ * <h2>Operation mode</h2>
+ * A pipe is an asynchronous communication mechanism.<br>
+ * Operations defined for mailboxes:
+ * - <b>Write</b>: Writes a buffer of data in the pipe in FIFO order.
+ * - <b>Read</b>: A buffer of data is read from the read and removed.
+ * - <b>Reset</b>: The pipe is emptied and all the stored data
+ * is lost.
+ * .
+ * @pre In order to use the pipes APIs the @p CH_CFG_USE_PIPES
+ * option must be enabled in @p chconf.h.
+ * @note Compatible with RT and NIL.
+ * @{
+ */
+
+#include "ch.h"
+
+#if (CH_CFG_USE_PIPES == TRUE) || defined(__DOXYGEN__)
+
+/*===========================================================================*/
+/* Module exported variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local types. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local variables. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module local functions. */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Module exported functions. */
+/*===========================================================================*/
+
+/**
+ * @brief Initializes a @p mailbox_t object.
+ *
+ * @param[out] pp the pointer to the @p pipe_t structure to be
+ * initialized
+ * @param[in] buf pointer to the pipe buffer as an array of @p uint8_t
+ * @param[in] n number of elements in the buffer array
+ *
+ * @init
+ */
+void chPipeObjectInit(pipe_t *pp, uint8_t *buf, size_t n) {
+
+ chDbgCheck((pp != NULL) && (buf != NULL) && (n > (size_t)0));
+
+ pp->buffer = buf;
+ pp->rdptr = buf;
+ pp->wrptr = buf;
+ pp->top = &buf[n];
+ pp->cnt = (size_t)0;
+ pp->reset = false;
+ chThdQueueObjectInit(&pp->qw);
+ chThdQueueObjectInit(&pp->qr);
+}
+
+/**
+ * @brief Resets a @p pipe_t object.
+ * @details All the waiting threads are resumed with status @p MSG_RESET and
+ * the queued data is lost.
+ * @post The pipe is in reset state, all operations will fail and
+ * return @p MSG_RESET until the mailbox is enabled again using
+ * @p chPipeResumeX().
+ *
+ * @param[in] pp the pointer to an initialized @p pipe_t object
+ *
+ * @api
+ */
+void chPipeReset(mailbox_t *mbp) {
+
+ chSysLock();
+ chMBResetI(mbp);
+ chSchRescheduleS();
+ chSysUnlock();
+}
+
+/**
+ * @brief Resets a @p pipe_t object.
+ * @details All the waiting threads are resumed with status @p MSG_RESET and
+ * the queued data is lost.
+ * @post The pipe is in reset state, all operations will fail and
+ * return @p MSG_RESET until the mailbox is enabled again using
+ * @p chPipeResumeX().
+ *
+ * @param[in] pp the pointer to an initialized @p pipe_t object
+ *
+ * @api
+ */
+void chPipeResetI(pipe_t *pp) {
+
+ chDbgCheckClassI();
+ chDbgCheck(pipe_t != NULL);
+
+ pipe_t->wrptr = pipe_t->buffer;
+ pipe_t->rdptr = pipe_t->buffer;
+ pipe_t->cnt = (size_t)0;
+ pipe_t->reset = true;
+ chThdDequeueAllI(&pipe_t->qw, MSG_RESET);
+ chThdDequeueAllI(&pipe_t->qr, MSG_RESET);
+}
+
+size_t chPipeReadI(pipe_t *pp, uint8_t *bp, size_t n) {
+
+}
+
+size_t chPipeReadTimeoutS(pipe_t *pp, uint8_t *bp,
+ size_t n, sysinterval_t timeout) {
+
+}
+
+size_t chPipeReadTimeout(pipe_t *pp, uint8_t *bp,
+ size_t n, sysinterval_t timeout) {
+
+}
+
+size_t chPipeWriteI(pipe_t *pp, const uint8_t *bp, size_t n) {
+
+}
+
+size_t chPipeWriteTimeoutS(pipe_t *pp, const uint8_t *bp,
+ size_t n, sysinterval_t timeout) {
+
+}
+
+size_t chPipeWriteTimeout(pipe_t *pp, const uint8_t *bp,
+ size_t n, sysinterval_t timeout) {
+
+}
+
+#endif /* CH_CFG_USE_MAILBOXES == TRUE */
+
+/** @} */