Add missing documentation to the lightweight ring buffer code in the XPLAINBridge...
authorDean Camera <dean@fourwalledcubicle.com>
Thu, 10 Jun 2010 01:26:10 +0000 (01:26 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Thu, 10 Jun 2010 01:26:10 +0000 (01:26 +0000)
Projects/XPLAINBridge/Lib/LightweightRingBuff.h

index 8026cef..89239ac 100644 (file)
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2010.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- *  Ultra lightweight ring buffer, for fast insertion/deletion.\r
- */\r
\r
-#ifndef _ULW_RING_BUFF_H_\r
-#define _ULW_RING_BUFF_H_\r
-\r
-       /* Includes: */\r
-               #include <stdint.h>\r
-               #include <stdbool.h>\r
-\r
-       /* Defines: */\r
-               /** Size of each ring buffer, in bytes. */\r
-               #define BUFFER_SIZE      128\r
-               \r
-               /** Type of data to store into the buffer. */\r
-               #define RingBuff_Data_t  uint8_t\r
-\r
-       /* Type Defines: */\r
-               typedef struct\r
-               {\r
-                       RingBuff_Data_t  Buffer[BUFFER_SIZE];\r
-                       RingBuff_Data_t* In;\r
-                       RingBuff_Data_t* Out;\r
-                       uint8_t          Count;\r
-               } RingBuff_t;\r
-       \r
-       /* Inline Functions: */\r
-               static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer)\r
-               {\r
-                       Buffer->In  = Buffer->Buffer;\r
-                       Buffer->Out = Buffer->Buffer;\r
-                       Buffer->Count = 0;\r
-               }\r
-               \r
-               static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)\r
-               {\r
-                       *Buffer->In = Data;\r
-               \r
-                       if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])\r
-                         Buffer->In = Buffer->Buffer;\r
-                         \r
-                       Buffer->Count++;\r
-               }\r
-\r
-               static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)\r
-               {\r
-                       RingBuff_Data_t Data = *Buffer->Out;\r
-               \r
-                       if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])\r
-                         Buffer->Out = Buffer->Buffer;\r
-                         \r
-                       Buffer->Count--;\r
-\r
-                       return Data;\r
-               }\r
-\r
-#endif\r
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2010.
+              
+  dean [at] fourwalledcubicle [dot] com
+      www.fourwalledcubicle.com
+*/
+
+/*
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+  Permission to use, copy, modify, distribute, and sell this 
+  software and its documentation for any purpose is hereby granted
+  without fee, provided that the above copyright notice appear in 
+  all copies and that both that the copyright notice and this
+  permission notice and warranty disclaimer appear in supporting 
+  documentation, and that the name of the author not be used in 
+  advertising or publicity pertaining to distribution of the 
+  software without specific, written prior permission.
+
+  The author disclaim all warranties with regard to this
+  software, including all implied warranties of merchantability
+  and fitness.  In no event shall the author be liable for any
+  special, indirect or consequential damages or any damages
+  whatsoever resulting from loss of use, data or profits, whether
+  in an action of contract, negligence or other tortious action,
+  arising out of or in connection with the use or performance of
+  this software.
+*/
+
+/** \file
+ *
+ *  Ultra lightweight ring buffer, for fast insertion/deletion.
+ */
+#ifndef _ULW_RING_BUFF_H_
+#define _ULW_RING_BUFF_H_
+
+       /* Includes: */
+               #include <util/atomic.h>
+       
+               #include <stdint.h>
+               #include <stdbool.h>
+
+       /* Defines: */
+               /** Size of each ring buffer, in data elements - must be between 1 and 255. */
+               #define BUFFER_SIZE      128
+               
+               /** Type of data to store into the buffer. */
+               #define RingBuff_Data_t  uint8_t
+
+       /* Type Defines: */
+               /** Type define for a new ring buffer object. Buffers should be initialized via a call to
+                *  \ref RingBuffer_InitBuffer() before use.
+                */
+               typedef struct
+               {
+                       RingBuff_Data_t  Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */
+                       RingBuff_Data_t* In; /**< Current storage location in the circular buffer */
+                       RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */
+                       uint8_t          Count; /**< Total number of bytes stored in the circular buffer */
+               } RingBuff_t;
+       
+       /* Inline Functions: */
+               /** Initializes a ring buffer ready for use. Buffers must be initialized via this function
+                *  before any operations are called upon them. Already initialized buffers may be reset
+                *  by re-initializing them using this function.
+                *
+                *  \ref Buffer  Pointer to a ring buffer structure to initialize
+                */
+               static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer)
+               {
+                       Buffer->In    = Buffer->Buffer;
+                       Buffer->Out   = Buffer->Buffer;
+                       Buffer->Count = 0;
+               }
+               
+               /** Inserts an element into the ring buffer.
+                *
+                *  \ref Buffer  Pointer to a ring buffer structure to insert into
+                *  \ref Data    Data element to insert into the buffer
+                */
+               static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data)
+               {
+                       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+                       {
+                               *Buffer->In = Data;
+                       
+                               if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+                                 Buffer->In = Buffer->Buffer;
+                                 
+                               Buffer->Count++;
+                       }
+               }
+
+               /** Retrieves an element from the ring buffer.
+                *
+                *  \ref Buffer  Pointer to a ring buffer structure to retrieve from
+                *
+                *  \return Next data element stored in the buffer
+                */
+               static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
+               {
+                       RingBuff_Data_t Data;
+                       
+                       ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+                       {
+                               Data = *Buffer->Out;
+                       
+                               if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+                                 Buffer->Out = Buffer->Buffer;
+                                 
+                               Buffer->Count--;
+                       }
+
+                       return Data;
+               }
+
+#endif
  
\ No newline at end of file
  
\ No newline at end of file