diff src/g23m-aci/gdd_dio/gdd_dio_queue.c @ 1:fa8dc04885d8

src/g23m-*: import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:25:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-aci/gdd_dio/gdd_dio_queue.c	Fri Oct 16 06:25:50 2020 +0000
@@ -0,0 +1,115 @@
+/*
++-----------------------------------------------------------------------------
+|  File     : gdd_dio_queue.c
++-----------------------------------------------------------------------------
+|  Copyright 2002 Texas Instruments Berlin, AG
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments Berlin, AG
+|                 The receipt of or possession of this file does not convey
+|                 any rights to reproduce or disclose its contents or to
+|                 manufacture, use, or sell anything it may describe, in
+|                 whole, or in part, without the specific written consent of
+|                 Texas Instruments Berlin, AG.
++-----------------------------------------------------------------------------
+|  Purpose  : Implements the queue functions for the DIO buffer FIFO
++-----------------------------------------------------------------------------
+*/
+
+
+#define ENTITY_GDD_DIO
+
+/*==== INCLUDES =============================================================*/
+
+#include "typedefs.h"   /* to get Condat data types */
+#include "vsi.h"        /* to get a lot of macros */
+
+#include <string.h>  /* for memset */
+
+#include "gdd_dio_queue.h"
+
+/*==== CONST ================================================================*/
+
+/*==== LOCAL VARS ===========================================================*/
+
+/*==== PRIVATE FUNCTIONS ====================================================*/
+
+/*==== PUBLIC FUNCTIONS =====================================================*/
+
+
+GLOBAL void gdd_dio_queue_clear(T_GDD_BUF_QUEUE *queue)
+{
+  queue->next_in = 0;
+  queue->next_out = 0;
+  memset(queue->elems, 0, sizeof(T_dio_buffer *) * GDD_MAX_DIO_BUF);
+}
+
+
+BOOL gdd_dio_queue_is_empty(const T_GDD_BUF_QUEUE *queue)
+{
+  return (queue->next_in == queue->next_out) &&
+         (0 == queue->elems[queue->next_out]);
+}
+
+
+GLOBAL BOOL gdd_dio_queue_is_full(const T_GDD_BUF_QUEUE *queue)
+{
+  return (queue->next_in == queue->next_out) && 
+          !(0 == queue->elems[queue->next_out]);
+}
+
+
+GLOBAL BOOL gdd_dio_dequeue(T_GDD_BUF_QUEUE *queue, T_dio_buffer **elem)
+{
+  if(gdd_dio_queue_is_empty(queue))
+  {
+    return FALSE;
+  }
+  else
+  {
+    (*elem) = queue->elems[queue->next_out];
+    queue->elems[queue->next_out] = 0;
+    ++(queue->next_out);
+    if(queue->next_out EQ GDD_MAX_DIO_BUF)
+      queue->next_out = 0;
+    return TRUE;
+  }
+}
+
+GLOBAL BOOL gdd_dio_queue_peek_next_for_dequeue
+(const T_GDD_BUF_QUEUE *queue, /*out*/T_dio_buffer **elem)
+{
+  if(gdd_dio_queue_is_empty(queue))
+  {
+    return FALSE;
+  }
+  else
+  {
+    (*elem) = queue->elems[queue->next_out];
+    return TRUE;
+  }
+}
+
+GLOBAL BOOL gdd_dio_enqueue(T_dio_buffer *elem, T_GDD_BUF_QUEUE *queue, /*out*/U16 *pos)
+{
+  if(gdd_dio_queue_is_full(queue))
+  {
+    return FALSE;
+  }
+  else
+  {
+    queue->elems[queue->next_in] = elem;
+    (*pos) = queue->next_in;
+    ++(queue->next_in);
+    if(queue->next_in EQ GDD_MAX_DIO_BUF)
+      queue->next_in = 0;
+    return TRUE;
+  }
+}
+
+
+GLOBAL void gdd_dio_queue_peek(const T_GDD_BUF_QUEUE *queue, U16 pos, /*out*/T_dio_buffer **elem)
+{
+  (*elem) = queue->elems[pos];
+}