Fixed MIDI class driver send routines silently discarding packets if the endpoint...
[pub/USBasp.git] / Projects / XPLAINBridge / Lib / LightweightRingBuff.h
index 768e49a..0205fe4 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
      Copyright (C) Dean Camera, 2010.
 /*
              LUFA Library
      Copyright (C) Dean Camera, 2010.
-              
+
   dean [at] fourwalledcubicle [dot] com
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
 */
 
 /*
   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
   software and its documentation for any purpose is hereby granted
-  without fee, provided that the above copyright notice appear in 
+  without fee, provided that the above copyright notice appear in
   all copies and that both that the copyright notice and this
   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 
+  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 without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
  *  or deletions) must not overlap. If there is possibility of two or more of the same kind of
  *  operating occuring at the same point in time, atomic (mutex) locking should be used.
  */
  *  or deletions) must not overlap. If there is possibility of two or more of the same kind of
  *  operating occuring at the same point in time, atomic (mutex) locking should be used.
  */
+
 #ifndef _ULW_RING_BUFF_H_
 #define _ULW_RING_BUFF_H_
 
        /* Includes: */
                #include <util/atomic.h>
 #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         255
                #include <stdint.h>
                #include <stdbool.h>
 
        /* Defines: */
                /** Size of each ring buffer, in data elements - must be between 1 and 255. */
                #define BUFFER_SIZE         255
-               
+
                /** Type of data to store into the buffer. */
                #define RingBuff_Data_t     uint8_t
 
                /** Type of data to store into the buffer. */
                #define RingBuff_Data_t     uint8_t
 
@@ -76,7 +76,7 @@
                        RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */
                        RingBuff_Count_t Count;
                } RingBuff_t;
                        RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */
                        RingBuff_Count_t Count;
                } 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
        /* 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
@@ -92,7 +92,7 @@
                                Buffer->Out = Buffer->Buffer;
                        }
                }
                                Buffer->Out = Buffer->Buffer;
                        }
                }
-               
+
                /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed
                 *  by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that
                 *  the buffer cannot be modified while the computation takes place. This value should be cached
                /** Retrieves the minimum number of bytes stored in a particular buffer. This value is computed
                 *  by entering an atomic lock on the buffer while the IN and OUT locations are fetched, so that
                 *  the buffer cannot be modified while the computation takes place. This value should be cached
                static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer)
                {
                        RingBuff_Count_t Count;
                static inline RingBuff_Count_t RingBuffer_GetCount(RingBuff_t* const Buffer)
                {
                        RingBuff_Count_t Count;
-                       
+
                        ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
                        {
                                Count = Buffer->Count;
                        }
                        ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
                        {
                                Count = Buffer->Count;
                        }
-                       
+
                        return Count;
                }
                        return Count;
                }
-               
+
                /** Atomically determines if the specified ring buffer contains any free space. This should
                 *  be tested before storing data to the buffer, to ensure that no data is lost due to a
                 *  buffer overrun.
                /** Atomically determines if the specified ring buffer contains any free space. This should
                 *  be tested before storing data to the buffer, to ensure that no data is lost due to a
                 *  buffer overrun.
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
                 *
                 *  \return Boolean true if the buffer contains no free space, false otherwise
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
                 *
                 *  \return Boolean true if the buffer contains no free space, false otherwise
-                */              
+                */
                static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer)
                {
                        return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE);
                static inline bool RingBuffer_IsFull(RingBuff_t* const Buffer)
                {
                        return (RingBuffer_GetCount(Buffer) == BUFFER_SIZE);
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
                 *
                 *  \return Boolean true if the buffer contains no free space, false otherwise
                 *  \param[in,out] Buffer  Pointer to a ring buffer structure to insert into
                 *
                 *  \return Boolean true if the buffer contains no free space, false otherwise
-                */              
+                */
                static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer)
                {
                        return (RingBuffer_GetCount(Buffer) == 0);
                static inline bool RingBuffer_IsEmpty(RingBuff_t* const Buffer)
                {
                        return (RingBuffer_GetCount(Buffer) == 0);
                                                     const RingBuff_Data_t Data)
                {
                        *Buffer->In = Data;
                                                     const RingBuff_Data_t Data)
                {
                        *Buffer->In = Data;
-                       
+
                        if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
                          Buffer->In = Buffer->Buffer;
 
                        if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
                          Buffer->In = Buffer->Buffer;
 
                static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
                {
                        RingBuff_Data_t Data = *Buffer->Out;
                static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer)
                {
                        RingBuff_Data_t Data = *Buffer->Out;
-                       
+
                        if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
                          Buffer->Out = Buffer->Buffer;
 
                        if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
                          Buffer->Out = Buffer->Buffer;
 
                        {
                                Buffer->Count--;
                        }
                        {
                                Buffer->Count--;
                        }
-                       
+
                        return Data;
                }
 
 #endif
                        return Data;
                }
 
 #endif
+