iLLD_TC27xC  1.0
Ifx_CircularBuffer.c
Go to the documentation of this file.
1 /**
2  * \file Ifx_CircularBuffer.c
3  * \brief Circular buffer functions in C language.
4  *
5  * \version iLLD_0_1_0_10
6  * \copyright Copyright (c) 2013 Infineon Technologies AG. All rights reserved.
7  *
8  *
9  * IMPORTANT NOTICE
10  *
11  *
12  * Infineon Technologies AG (Infineon) is supplying this file for use
13  * exclusively with Infineon's microcontroller products. This file can be freely
14  * distributed within development tools that are supporting such microcontroller
15  * products.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
18  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
20  * INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
21  * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
22  *
23  */
24 
25 #include "Ifx_CircularBuffer.h"
26 
27 #if (IFX_CFG_CIRCULARBUFFER_C)
28 
30 {
31  uint32 data = ((uint32 *)buffer->base)[buffer->index];
32 
33  buffer->index += 4;
34 
35  if (buffer->index >= buffer->length)
36  {
37  buffer->index = 0;
38  }
39 
40  return data;
41 }
42 
43 
45 {
46  uint16 data = ((uint16 *)buffer->base)[buffer->index];
47 
48  buffer->index += 2;
49 
50  if (buffer->index >= buffer->length)
51  {
52  buffer->index = 0;
53  }
54 
55  return data;
56 }
57 
58 
59 /** \brief Add a 32 bit value to the circular buffer, and post-increment the circular buffer pointer
60  *
61  * \param buffer Specifies circular buffer.
62  * \param data Specifies value to be added to the buffer.
63  *
64  * \return None.
65  */
67 {
68  ((uint32 *)buffer->base)[buffer->index] = data;
69  buffer->index += 4;
70 
71  if (buffer->index >= buffer->length)
72  {
73  buffer->index = 0;
74  }
75 }
76 
77 
78 void *Ifx_CircularBuffer_read8(Ifx_CircularBuffer *buffer, void *data, Ifx_SizeT count)
79 {
80  uint8 *Dest = (uint8 *)data;
81 
82  do
83  {
84  count--;
85  *Dest = ((uint8 *)buffer->base)[buffer->index];
86  Dest = &Dest[1];
87  buffer->index++;
88 
89  if (buffer->index >= buffer->length)
90  {
91  buffer->index = 0;
92  }
93  } while (count > 0);
94 
95  return Dest;
96 }
97 
98 
99 void *Ifx_CircularBuffer_read32(Ifx_CircularBuffer *buffer, void *data, Ifx_SizeT count)
100 {
101  uint32 *Dest = (uint32 *)data;
102  uint8 *base = buffer->base;
103 
104  do
105  {
106  *Dest = *((uint32 *)(&base[buffer->index]));
107  Dest = &Dest[1];
108  buffer->index = buffer->index + 4;
109 
110  if (buffer->index >= buffer->length)
111  {
112  buffer->index = 0;
113  }
114 
115  count--;
116  } while (count > 0);
117 
118  return Dest;
119 }
120 
121 
122 const void *Ifx_CircularBuffer_write8(Ifx_CircularBuffer *buffer, const void *data, Ifx_SizeT count)
123 {
124  const uint8 *source = (const uint8 *)data;
125 
126  do
127  {
128  count--;
129  ((uint8 *)buffer->base)[buffer->index] = *source;
130  source = &source[1];
131  buffer->index++;
132 
133  if (buffer->index >= buffer->length)
134  {
135  buffer->index = 0;
136  }
137  } while (count > 0);
138 
139  return source;
140 }
141 
142 
143 const void *Ifx_CircularBuffer_write32(Ifx_CircularBuffer *buffer, const void *data, Ifx_SizeT count)
144 {
145  const uint32 *source = (const uint32 *)data;
146  uint8 *base = buffer->base;
147 
148  do
149  {
150  *((uint32 *)(&base[buffer->index])) = *source;
151  source = &source[1];
152  buffer->index = buffer->index + 4;
153 
154  if (buffer->index >= buffer->length)
155  {
156  buffer->index = 0;
157  }
158 
159  count--;
160  } while (count > 0);
161 
162  return source;
163 }
164 
165 
166 #endif