aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal
diff options
context:
space:
mode:
Diffstat (limited to 'os/hal')
-rw-r--r--os/hal/include/hal_buffers.h20
-rw-r--r--os/hal/src/hal_buffers.c33
2 files changed, 49 insertions, 4 deletions
diff --git a/os/hal/include/hal_buffers.h b/os/hal/include/hal_buffers.h
index 28677849f..a256f02e2 100644
--- a/os/hal/include/hal_buffers.h
+++ b/os/hal/include/hal_buffers.h
@@ -126,6 +126,15 @@ typedef io_buffers_queue_t output_buffers_queue_t;
/*===========================================================================*/
/**
+ * @brief Computes the size of a buffers queue buffer size.
+ *
+ * @param[in] n sumber of buffers in the queue
+ * @param[in] size size of the buffers
+ */
+#define BQ_BUFFER_SIZE(n, size) \
+ (((size_t)(size) + sizeof (size_t)) * (size_t)(n))
+
+/**
* @name Macro Functions
* @{
*/
@@ -152,6 +161,16 @@ typedef io_buffers_queue_t output_buffers_queue_t;
#define bqSpaceI(bqp) ((bqp)->bcounter)
/**
+ * @brief Returns the queue application-defined link.
+ *
+ * @param[in] bqp pointer to an @p io_buffers_queue_t structure
+ * @return The application-defined link.
+ *
+ * @special
+ */
+#define bqGetLinkX(bqp) ((bqp)->link)
+
+/**
* @brief Evaluates to @p TRUE if the specified input buffered queue is empty.
*
* @param[in] ibqp pointer to an @p input_buffers_queue_t structure
@@ -187,6 +206,7 @@ extern "C" {
void ibqObjectInit(io_buffers_queue_t *ibqp, uint8_t *bp,
size_t size, size_t n,
dbnotify_t infy, void *link);
+ void ibqResetI(input_buffers_queue_t *ibqp);
uint8_t *ibqGetEmptyBufferI(input_buffers_queue_t *ibqp);
void ibqPostBufferI(input_buffers_queue_t *ibqp, size_t size);
msg_t ibqGetDataTimeoutI(input_buffers_queue_t *ibqp, systime_t timeout);
diff --git a/os/hal/src/hal_buffers.c b/os/hal/src/hal_buffers.c
index 8e93d7700..85a26383b 100644
--- a/os/hal/src/hal_buffers.c
+++ b/os/hal/src/hal_buffers.c
@@ -47,7 +47,7 @@
/*===========================================================================*/
/**
- * @brief Initializes an input double buffer object.
+ * @brief Initializes an input buffers queue object.
*
* @param[out] ibqp pointer to the @p io_buffers_queue_t object
* @param[in] bp pointer to a memory area allocated for buffers
@@ -65,6 +65,7 @@ void ibqObjectInit(input_buffers_queue_t *ibqp, uint8_t *bp,
osalDbgCheck((ibqp != NULL) && (bp != NULL) && (size >= sizeof(size_t) + 2));
+ osalThreadQueueObjectInit(&ibqp->waiting);
ibqp->bcounter = 0;
ibqp->brdptr = bp;
ibqp->bwrptr = bp;
@@ -79,6 +80,29 @@ void ibqObjectInit(input_buffers_queue_t *ibqp, uint8_t *bp,
}
/**
+ * @brief Resets an input buffers queue.
+ * @details All the data in the input buffers queue is erased and lost, any
+ * waiting thread is resumed with status @p MSG_RESET.
+ * @note A reset operation can be used by a low level driver in order to
+ * obtain immediate attention from the high level layers.
+ *
+ * @param[in] ibqp pointer to the @p input_buffers_queue_t object
+ *
+ * @iclass
+ */
+void ibqResetI(input_buffers_queue_t *ibqp) {
+
+ osalDbgCheckClassI();
+
+ ibqp->bcounter = 0;
+ ibqp->brdptr = ibqp->buffers;
+ ibqp->bwrptr = ibqp->buffers;
+ ibqp->ptr = NULL;
+ ibqp->top = NULL;
+ osalThreadDequeueAllI(&ibqp->waiting, MSG_RESET);
+}
+
+/**
* @brief Gets the next empty buffer from the queue.
* @note The function always returns the same buffer if called repeatedly.
*
@@ -152,7 +176,7 @@ msg_t ibqGetDataTimeoutI(input_buffers_queue_t *ibqp, systime_t timeout) {
while (ibqIsEmptyI(ibqp)) {
msg_t msg = osalThreadEnqueueTimeoutS(&ibqp->waiting, timeout);
- if (msg < Q_OK) {
+ if (msg < MSG_OK) {
return msg;
}
}
@@ -299,8 +323,9 @@ size_t ibqReadTimeout(input_buffers_queue_t *ibqp, uint8_t *bp,
memcpy(bp, ibqp->ptr, size);
osalSysLock();
- /* Updating the pointers.*/
- bp += size;
+ /* Updating the pointers and the counter.*/
+ r += size;
+ bp += size;
ibqp->ptr += size;
/* Has the current data buffer been finished? if so then release it.*/