Multi purpose buffer module.
Multipurpose ringbuffer
Since there weren't any ringbuffers available on the internet optimized for 32-Bit ARM operation without unix-calls and dynamic memory... I created one.
This module is a fixed ringbuffer, it does not allocate any memory, it can work as FIFO or LIFO or any other exotic mode depending on your imagination. With a fixed 32Bit element size it is optimized for 32 bit arm processors. Any smaller value will have overhead, any larger value will require a double entry. (not recommended)
I hope you can use it.
Information
This is not a C++ class, it is a C Module. It does work object oriented, however you cannot work on the object, you work with the object.
Import programxIFO_example
Small example for xIFO
xIFO.cpp@2:6013f6d867e5, 2014-04-04 (annotated)
- Committer:
- jeroen3
- Date:
- Fri Apr 04 21:36:55 2014 +0000
- Revision:
- 2:6013f6d867e5
- Parent:
- xIFO.c@1:5f59aa9b86ed
major revision, now supports multiple C formats and Templates C++
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jeroen3 | 2:6013f6d867e5 | 1 | /** |
jeroen3 | 0:a04dc0c57d20 | 2 | * @file xifo.c |
jeroen3 | 2:6013f6d867e5 | 3 | * @brief xifo circular buffer with <t>/8/16/32/64 bit elements |
jeroen3 | 2:6013f6d867e5 | 4 | * @details xifo supplies object oriented circular buffer with 8 bit size elements. \n |
jeroen3 | 2:6013f6d867e5 | 5 | * To use either as FIFO (First In First Out) or as FILO (First In Last Out) |
jeroen3 | 2:6013f6d867e5 | 6 | * You might want to rename this file is you are using a C compiler. |
jeroen3 | 0:a04dc0c57d20 | 7 | * |
jeroen3 | 2:6013f6d867e5 | 8 | * @Author Jeroen Lodder |
jeroen3 | 2:6013f6d867e5 | 9 | * @Date March 2014 |
jeroen3 | 2:6013f6d867e5 | 10 | * @version 3 |
jeroen3 | 2:6013f6d867e5 | 11 | * |
jeroen3 | 2:6013f6d867e5 | 12 | * Copyright (c) 2014 Jeroen Lodder |
jeroen3 | 2:6013f6d867e5 | 13 | * |
jeroen3 | 2:6013f6d867e5 | 14 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
jeroen3 | 2:6013f6d867e5 | 15 | * of this software and associated documentation files (the "Software"), to deal |
jeroen3 | 2:6013f6d867e5 | 16 | * in the Software without restriction, including without limitation the rights |
jeroen3 | 2:6013f6d867e5 | 17 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
jeroen3 | 2:6013f6d867e5 | 18 | * copies of the Software, and to permit persons to whom the Software is |
jeroen3 | 2:6013f6d867e5 | 19 | * furnished to do so, subject to the following conditions: |
jeroen3 | 2:6013f6d867e5 | 20 | * |
jeroen3 | 2:6013f6d867e5 | 21 | * The above copyright notice and this permission notice shall be included in all |
jeroen3 | 2:6013f6d867e5 | 22 | * copies or substantial portions of the Software. |
jeroen3 | 2:6013f6d867e5 | 23 | * |
jeroen3 | 2:6013f6d867e5 | 24 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
jeroen3 | 2:6013f6d867e5 | 25 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
jeroen3 | 2:6013f6d867e5 | 26 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
jeroen3 | 2:6013f6d867e5 | 27 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
jeroen3 | 2:6013f6d867e5 | 28 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
jeroen3 | 2:6013f6d867e5 | 29 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
jeroen3 | 2:6013f6d867e5 | 30 | * SOFTWARE. |
jeroen3 | 0:a04dc0c57d20 | 31 | * |
jeroen3 | 0:a04dc0c57d20 | 32 | * @{ |
jeroen3 | 0:a04dc0c57d20 | 33 | */ |
jeroen3 | 1:5f59aa9b86ed | 34 | #include "xIFO.h" |
jeroen3 | 0:a04dc0c57d20 | 35 | |
jeroen3 | 2:6013f6d867e5 | 36 | #if xIFO_USE_64BIT == TRUE |
jeroen3 | 0:a04dc0c57d20 | 37 | /** |
jeroen3 | 2:6013f6d867e5 | 38 | * @brief Initialize buffer object structure. |
jeroen3 | 0:a04dc0c57d20 | 39 | * |
jeroen3 | 0:a04dc0c57d20 | 40 | * @note Does not clear memory pool. |
jeroen3 | 0:a04dc0c57d20 | 41 | * |
jeroen3 | 2:6013f6d867e5 | 42 | * @param[in] c Pointer to @p xifo64_t object used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 43 | * @param[in] s Number of elements buffer can hold (size). |
jeroen3 | 0:a04dc0c57d20 | 44 | * @param[in] sp Start of pre-allocated memory pool. |
jeroen3 | 0:a04dc0c57d20 | 45 | */ |
jeroen3 | 2:6013f6d867e5 | 46 | void xifo64_init(xifo64_t *c, uint32_t s, uint64_t *sp){ |
jeroen3 | 0:a04dc0c57d20 | 47 | c->startpool = sp; |
jeroen3 | 0:a04dc0c57d20 | 48 | c->size = s; |
jeroen3 | 2:6013f6d867e5 | 49 | c->endpool = &sp[--s]; |
jeroen3 | 0:a04dc0c57d20 | 50 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 51 | c->count = 0; |
jeroen3 | 0:a04dc0c57d20 | 52 | c->read = sp; |
jeroen3 | 0:a04dc0c57d20 | 53 | c->write = sp; |
jeroen3 | 0:a04dc0c57d20 | 54 | } |
jeroen3 | 0:a04dc0c57d20 | 55 | |
jeroen3 | 0:a04dc0c57d20 | 56 | /** |
jeroen3 | 2:6013f6d867e5 | 57 | * @brief Clear buffer memory pool |
jeroen3 | 0:a04dc0c57d20 | 58 | * |
jeroen3 | 0:a04dc0c57d20 | 59 | * @note Must be used on initialised buffer object. |
jeroen3 | 0:a04dc0c57d20 | 60 | * |
jeroen3 | 2:6013f6d867e5 | 61 | * @param[in] c Pointer to @p xifo64_t object. |
jeroen3 | 2:6013f6d867e5 | 62 | */ |
jeroen3 | 2:6013f6d867e5 | 63 | void xifo64_clear(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 64 | register uint64_t *ptemp = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 65 | register uint32_t i = c->size; |
jeroen3 | 2:6013f6d867e5 | 66 | while(i--){ |
jeroen3 | 2:6013f6d867e5 | 67 | |
jeroen3 | 2:6013f6d867e5 | 68 | *ptemp++ = 0; |
jeroen3 | 2:6013f6d867e5 | 69 | } |
jeroen3 | 2:6013f6d867e5 | 70 | } |
jeroen3 | 2:6013f6d867e5 | 71 | |
jeroen3 | 2:6013f6d867e5 | 72 | /** |
jeroen3 | 2:6013f6d867e5 | 73 | * @brief Read from buffer (lr) Least Recent oriented (fifo) |
jeroen3 | 2:6013f6d867e5 | 74 | * |
jeroen3 | 2:6013f6d867e5 | 75 | * @note Buffer state will be preserved |
jeroen3 | 2:6013f6d867e5 | 76 | * |
jeroen3 | 2:6013f6d867e5 | 77 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 78 | * |
jeroen3 | 2:6013f6d867e5 | 79 | * @details Read n elements from the oldest element to the most recent. |
jeroen3 | 2:6013f6d867e5 | 80 | * As for index[0] the least recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 81 | * And for index[count] the most recent element is returned. |
jeroen3 | 2:6013f6d867e5 | 82 | * This makes it possible to peek in fifo. |
jeroen3 | 2:6013f6d867e5 | 83 | * |
jeroen3 | 2:6013f6d867e5 | 84 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 85 | * @param[in] index Index relative from least recent |
jeroen3 | 2:6013f6d867e5 | 86 | * |
jeroen3 | 2:6013f6d867e5 | 87 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 88 | */ |
jeroen3 | 2:6013f6d867e5 | 89 | uint64_t xifo64_read_lr(xifo64_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 90 | register uint64_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 91 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 92 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 93 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 94 | } |
jeroen3 | 2:6013f6d867e5 | 95 | /* Calculate index of oldest element */ |
jeroen3 | 2:6013f6d867e5 | 96 | index = (c->count-1) - index; |
jeroen3 | 2:6013f6d867e5 | 97 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 98 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 99 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 100 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 101 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 102 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 103 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 104 | } |
jeroen3 | 2:6013f6d867e5 | 105 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 106 | return *ptemp; |
jeroen3 | 2:6013f6d867e5 | 107 | } |
jeroen3 | 2:6013f6d867e5 | 108 | |
jeroen3 | 2:6013f6d867e5 | 109 | /** |
jeroen3 | 2:6013f6d867e5 | 110 | * @brief Read from buffer (mr) Most Recent oriented (filo) |
jeroen3 | 2:6013f6d867e5 | 111 | * |
jeroen3 | 2:6013f6d867e5 | 112 | * @note Buffer state will be preserved |
jeroen3 | 2:6013f6d867e5 | 113 | * |
jeroen3 | 2:6013f6d867e5 | 114 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 115 | * |
jeroen3 | 2:6013f6d867e5 | 116 | * @details Read n elements back in time. |
jeroen3 | 2:6013f6d867e5 | 117 | * As for index[0] the most recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 118 | * And for index[count] the oldest element is returned. |
jeroen3 | 2:6013f6d867e5 | 119 | * This makes it possible to keep history. For DSP application. |
jeroen3 | 2:6013f6d867e5 | 120 | * |
jeroen3 | 2:6013f6d867e5 | 121 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 122 | * @param[in] index Index relative from most recent |
jeroen3 | 2:6013f6d867e5 | 123 | * |
jeroen3 | 2:6013f6d867e5 | 124 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 125 | */ |
jeroen3 | 2:6013f6d867e5 | 126 | uint64_t xifo64_read_mr(xifo64_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 127 | register uint64_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 128 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 129 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 130 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 131 | } |
jeroen3 | 2:6013f6d867e5 | 132 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 133 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 134 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 135 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 136 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 137 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 138 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 139 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 140 | } |
jeroen3 | 2:6013f6d867e5 | 141 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 142 | return *ptemp; |
jeroen3 | 2:6013f6d867e5 | 143 | } |
jeroen3 | 2:6013f6d867e5 | 144 | |
jeroen3 | 2:6013f6d867e5 | 145 | /** |
jeroen3 | 2:6013f6d867e5 | 146 | * @brief Pop (mr) most recent from buffer (filo) |
jeroen3 | 2:6013f6d867e5 | 147 | * |
jeroen3 | 2:6013f6d867e5 | 148 | * @note Buffer state will be altered |
jeroen3 | 2:6013f6d867e5 | 149 | * |
jeroen3 | 2:6013f6d867e5 | 150 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 151 | * |
jeroen3 | 2:6013f6d867e5 | 152 | * @details Read and remove the most recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 153 | * Using this results in a stack type of buffer. |
jeroen3 | 2:6013f6d867e5 | 154 | * |
jeroen3 | 2:6013f6d867e5 | 155 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 156 | * |
jeroen3 | 2:6013f6d867e5 | 157 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 158 | */ |
jeroen3 | 2:6013f6d867e5 | 159 | uint64_t xifo64_pop_mr(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 160 | register uint64_t temp; |
jeroen3 | 2:6013f6d867e5 | 161 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 162 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 163 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 164 | } |
jeroen3 | 2:6013f6d867e5 | 165 | /* Read */ |
jeroen3 | 2:6013f6d867e5 | 166 | temp = *c->read; |
jeroen3 | 2:6013f6d867e5 | 167 | /* Empty */ |
jeroen3 | 2:6013f6d867e5 | 168 | *c->read = 0; |
jeroen3 | 2:6013f6d867e5 | 169 | /* Most recent element read, return write pointer */ |
jeroen3 | 2:6013f6d867e5 | 170 | c->write = c->read; |
jeroen3 | 2:6013f6d867e5 | 171 | /* Decrement read pointer */ |
jeroen3 | 2:6013f6d867e5 | 172 | c->read--; |
jeroen3 | 2:6013f6d867e5 | 173 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 174 | if( c->read < c->startpool ){ |
jeroen3 | 2:6013f6d867e5 | 175 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 176 | c->read = c->endpool; |
jeroen3 | 2:6013f6d867e5 | 177 | } |
jeroen3 | 2:6013f6d867e5 | 178 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 179 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 180 | if(c->count < c->size) |
jeroen3 | 2:6013f6d867e5 | 181 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 182 | return temp; |
jeroen3 | 2:6013f6d867e5 | 183 | } |
jeroen3 | 2:6013f6d867e5 | 184 | |
jeroen3 | 2:6013f6d867e5 | 185 | /** |
jeroen3 | 2:6013f6d867e5 | 186 | * @brief Pop (lr) least recent from buffer (fifo) |
jeroen3 | 2:6013f6d867e5 | 187 | * |
jeroen3 | 2:6013f6d867e5 | 188 | * @note Buffer state will be altered |
jeroen3 | 2:6013f6d867e5 | 189 | * |
jeroen3 | 2:6013f6d867e5 | 190 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 191 | * |
jeroen3 | 2:6013f6d867e5 | 192 | * @details Read and remove the least recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 193 | * Using this results in a fifo type of buffer. |
jeroen3 | 2:6013f6d867e5 | 194 | * |
jeroen3 | 2:6013f6d867e5 | 195 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 196 | * |
jeroen3 | 2:6013f6d867e5 | 197 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 0:a04dc0c57d20 | 198 | */ |
jeroen3 | 2:6013f6d867e5 | 199 | uint64_t xifo64_pop_lr(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 200 | register uint64_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 201 | register uint64_t temp; |
jeroen3 | 2:6013f6d867e5 | 202 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 203 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 204 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 205 | } |
jeroen3 | 2:6013f6d867e5 | 206 | /* Derive least recent buffer element */ |
jeroen3 | 2:6013f6d867e5 | 207 | ptemp = (c->read+1) - c->count; |
jeroen3 | 2:6013f6d867e5 | 208 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 209 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 210 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 211 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 212 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 213 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 214 | } |
jeroen3 | 2:6013f6d867e5 | 215 | /* Read oldest buffer element */ |
jeroen3 | 2:6013f6d867e5 | 216 | /* Read to temp register */ |
jeroen3 | 2:6013f6d867e5 | 217 | temp = *ptemp; |
jeroen3 | 2:6013f6d867e5 | 218 | /* Empty buffer element */ |
jeroen3 | 2:6013f6d867e5 | 219 | *ptemp = 0; |
jeroen3 | 2:6013f6d867e5 | 220 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 221 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 222 | /* Check full flag */ |
jeroen3 | 2:6013f6d867e5 | 223 | if(c->count < c->size) |
jeroen3 | 2:6013f6d867e5 | 224 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 225 | return temp; |
jeroen3 | 2:6013f6d867e5 | 226 | } |
jeroen3 | 2:6013f6d867e5 | 227 | |
jeroen3 | 2:6013f6d867e5 | 228 | /** |
jeroen3 | 2:6013f6d867e5 | 229 | * @brief Write to buffer |
jeroen3 | 2:6013f6d867e5 | 230 | * |
jeroen3 | 2:6013f6d867e5 | 231 | * @note Readpointer is automatically set to the last added element. |
jeroen3 | 2:6013f6d867e5 | 232 | * |
jeroen3 | 2:6013f6d867e5 | 233 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 234 | * |
jeroen3 | 2:6013f6d867e5 | 235 | * @details Adds a value to the buffer. |
jeroen3 | 2:6013f6d867e5 | 236 | * Automatically overwrites oldest elements when full. |
jeroen3 | 2:6013f6d867e5 | 237 | * |
jeroen3 | 2:6013f6d867e5 | 238 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 239 | * @param[in] data Data to add to buffer |
jeroen3 | 2:6013f6d867e5 | 240 | * |
jeroen3 | 2:6013f6d867e5 | 241 | * @return Number of free buffer elements |
jeroen3 | 2:6013f6d867e5 | 242 | */ |
jeroen3 | 2:6013f6d867e5 | 243 | uint32_t xifo64_write(xifo64_t *c, uint64_t data){ |
jeroen3 | 2:6013f6d867e5 | 244 | /* Write data */ |
jeroen3 | 2:6013f6d867e5 | 245 | *c->write = data; |
jeroen3 | 2:6013f6d867e5 | 246 | /* Update read pointer to most recent element */ |
jeroen3 | 2:6013f6d867e5 | 247 | c->read = c->write; |
jeroen3 | 2:6013f6d867e5 | 248 | /* Write pointer increment */ |
jeroen3 | 2:6013f6d867e5 | 249 | c->write++; |
jeroen3 | 2:6013f6d867e5 | 250 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 251 | if( c->write > c->endpool){ |
jeroen3 | 2:6013f6d867e5 | 252 | /* We exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 253 | c->write = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 254 | } |
jeroen3 | 2:6013f6d867e5 | 255 | /* Update count */ |
jeroen3 | 2:6013f6d867e5 | 256 | c->count++; |
jeroen3 | 2:6013f6d867e5 | 257 | /* Verify full */ |
jeroen3 | 2:6013f6d867e5 | 258 | if( c->count >= c->size ){ |
jeroen3 | 2:6013f6d867e5 | 259 | c->full = 1; |
jeroen3 | 2:6013f6d867e5 | 260 | c->count = c->size; |
jeroen3 | 2:6013f6d867e5 | 261 | } |
jeroen3 | 2:6013f6d867e5 | 262 | /* return free elements count */ |
jeroen3 | 2:6013f6d867e5 | 263 | return c->size - c->count; |
jeroen3 | 2:6013f6d867e5 | 264 | } |
jeroen3 | 2:6013f6d867e5 | 265 | |
jeroen3 | 2:6013f6d867e5 | 266 | /** |
jeroen3 | 2:6013f6d867e5 | 267 | * @brief Get buffer size |
jeroen3 | 2:6013f6d867e5 | 268 | * |
jeroen3 | 2:6013f6d867e5 | 269 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 270 | * |
jeroen3 | 2:6013f6d867e5 | 271 | * @return Size of memory pool in elements |
jeroen3 | 2:6013f6d867e5 | 272 | */ |
jeroen3 | 2:6013f6d867e5 | 273 | uint32_t xifo64_get_size(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 274 | return c->size; |
jeroen3 | 2:6013f6d867e5 | 275 | } |
jeroen3 | 2:6013f6d867e5 | 276 | |
jeroen3 | 2:6013f6d867e5 | 277 | /** |
jeroen3 | 2:6013f6d867e5 | 278 | * @brief Get number of used elements |
jeroen3 | 2:6013f6d867e5 | 279 | * |
jeroen3 | 2:6013f6d867e5 | 280 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 281 | * |
jeroen3 | 2:6013f6d867e5 | 282 | * @return Number of used buffer elements |
jeroen3 | 2:6013f6d867e5 | 283 | */ |
jeroen3 | 2:6013f6d867e5 | 284 | uint32_t xifo64_get_used(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 285 | return c->count; |
jeroen3 | 2:6013f6d867e5 | 286 | } |
jeroen3 | 2:6013f6d867e5 | 287 | |
jeroen3 | 2:6013f6d867e5 | 288 | /** |
jeroen3 | 2:6013f6d867e5 | 289 | * @brief Get number of free elements |
jeroen3 | 2:6013f6d867e5 | 290 | * |
jeroen3 | 2:6013f6d867e5 | 291 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 292 | * |
jeroen3 | 2:6013f6d867e5 | 293 | * @return Number of free elements |
jeroen3 | 2:6013f6d867e5 | 294 | */ |
jeroen3 | 2:6013f6d867e5 | 295 | uint32_t xifo64_get_free(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 296 | return c->size - c->count; |
jeroen3 | 2:6013f6d867e5 | 297 | } |
jeroen3 | 2:6013f6d867e5 | 298 | |
jeroen3 | 2:6013f6d867e5 | 299 | /** |
jeroen3 | 2:6013f6d867e5 | 300 | * @brief Get full flag |
jeroen3 | 2:6013f6d867e5 | 301 | * |
jeroen3 | 2:6013f6d867e5 | 302 | * @param[in] c Pointer to @p xifo64_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 303 | * |
jeroen3 | 2:6013f6d867e5 | 304 | * @return 1 if full |
jeroen3 | 2:6013f6d867e5 | 305 | */ |
jeroen3 | 2:6013f6d867e5 | 306 | uint32_t xifo64_get_full(xifo64_t *c){ |
jeroen3 | 2:6013f6d867e5 | 307 | return c->full; |
jeroen3 | 2:6013f6d867e5 | 308 | } |
jeroen3 | 2:6013f6d867e5 | 309 | |
jeroen3 | 2:6013f6d867e5 | 310 | /** @} */ |
jeroen3 | 2:6013f6d867e5 | 311 | #endif |
jeroen3 | 2:6013f6d867e5 | 312 | |
jeroen3 | 2:6013f6d867e5 | 313 | #if xIFO_USE_32BIT == TRUE |
jeroen3 | 2:6013f6d867e5 | 314 | /** |
jeroen3 | 2:6013f6d867e5 | 315 | * @brief Initialize buffer object structure. |
jeroen3 | 2:6013f6d867e5 | 316 | * |
jeroen3 | 2:6013f6d867e5 | 317 | * @note Does not clear memory pool. |
jeroen3 | 2:6013f6d867e5 | 318 | * |
jeroen3 | 2:6013f6d867e5 | 319 | * @param[in] c Pointer to @p xifo32_t object used for configuration. |
jeroen3 | 2:6013f6d867e5 | 320 | * @param[in] s Number of elements buffer can hold (size). |
jeroen3 | 2:6013f6d867e5 | 321 | * @param[in] sp Start of pre-allocated memory pool. |
jeroen3 | 2:6013f6d867e5 | 322 | */ |
jeroen3 | 2:6013f6d867e5 | 323 | void xifo32_init(xifo32_t *c, uint32_t s, uint32_t *sp){ |
jeroen3 | 2:6013f6d867e5 | 324 | c->startpool = sp; |
jeroen3 | 2:6013f6d867e5 | 325 | c->size = s; |
jeroen3 | 2:6013f6d867e5 | 326 | c->endpool = &sp[--s]; |
jeroen3 | 2:6013f6d867e5 | 327 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 328 | c->count = 0; |
jeroen3 | 2:6013f6d867e5 | 329 | c->read = sp; |
jeroen3 | 2:6013f6d867e5 | 330 | c->write = sp; |
jeroen3 | 2:6013f6d867e5 | 331 | } |
jeroen3 | 2:6013f6d867e5 | 332 | |
jeroen3 | 2:6013f6d867e5 | 333 | /** |
jeroen3 | 2:6013f6d867e5 | 334 | * @brief Clear buffer memory pool |
jeroen3 | 2:6013f6d867e5 | 335 | * |
jeroen3 | 2:6013f6d867e5 | 336 | * @note Must be used on initialised buffer object. |
jeroen3 | 2:6013f6d867e5 | 337 | * |
jeroen3 | 2:6013f6d867e5 | 338 | * @param[in] c Pointer to @p xifo32_t object. |
jeroen3 | 2:6013f6d867e5 | 339 | */ |
jeroen3 | 2:6013f6d867e5 | 340 | void xifo32_clear(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 341 | register uint32_t *ptemp = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 342 | register uint32_t i = c->size; |
jeroen3 | 2:6013f6d867e5 | 343 | while(i--){ |
jeroen3 | 2:6013f6d867e5 | 344 | *ptemp++ = 0; |
jeroen3 | 0:a04dc0c57d20 | 345 | } |
jeroen3 | 0:a04dc0c57d20 | 346 | } |
jeroen3 | 0:a04dc0c57d20 | 347 | |
jeroen3 | 0:a04dc0c57d20 | 348 | /** |
jeroen3 | 0:a04dc0c57d20 | 349 | * @brief Read from buffer (lr) Least Recent oriented (fifo) |
jeroen3 | 0:a04dc0c57d20 | 350 | * |
jeroen3 | 0:a04dc0c57d20 | 351 | * @note Buffer state will be preserved |
jeroen3 | 0:a04dc0c57d20 | 352 | * |
jeroen3 | 2:6013f6d867e5 | 353 | * @warning Consider this opertaion as atomic! |
jeroen3 | 0:a04dc0c57d20 | 354 | * |
jeroen3 | 0:a04dc0c57d20 | 355 | * @details Read n elements from the oldest element to the most recent. |
jeroen3 | 2:6013f6d867e5 | 356 | * As for index[0] the least recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 357 | * And for index[count] the most recent element is returned. |
jeroen3 | 2:6013f6d867e5 | 358 | * This makes it possible to peek in fifo. |
jeroen3 | 0:a04dc0c57d20 | 359 | * |
jeroen3 | 2:6013f6d867e5 | 360 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 361 | * @param[in] index Index relative from least recent |
jeroen3 | 0:a04dc0c57d20 | 362 | * |
jeroen3 | 2:6013f6d867e5 | 363 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 0:a04dc0c57d20 | 364 | */ |
jeroen3 | 2:6013f6d867e5 | 365 | uint32_t xifo32_read_lr(xifo32_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 366 | register uint32_t *ptemp; |
jeroen3 | 0:a04dc0c57d20 | 367 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 368 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 369 | return 0; /* Nothing to read there */ |
jeroen3 | 0:a04dc0c57d20 | 370 | } |
jeroen3 | 0:a04dc0c57d20 | 371 | /* Calculate index of oldest element */ |
jeroen3 | 2:6013f6d867e5 | 372 | index = (c->count-1) - index; |
jeroen3 | 0:a04dc0c57d20 | 373 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 374 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 375 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 376 | /* Exceeded pool boundaries */ |
jeroen3 | 0:a04dc0c57d20 | 377 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 0:a04dc0c57d20 | 378 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 379 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 0:a04dc0c57d20 | 380 | } |
jeroen3 | 0:a04dc0c57d20 | 381 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 382 | return *ptemp; |
jeroen3 | 0:a04dc0c57d20 | 383 | } |
jeroen3 | 0:a04dc0c57d20 | 384 | |
jeroen3 | 0:a04dc0c57d20 | 385 | /** |
jeroen3 | 0:a04dc0c57d20 | 386 | * @brief Read from buffer (mr) Most Recent oriented (filo) |
jeroen3 | 0:a04dc0c57d20 | 387 | * |
jeroen3 | 0:a04dc0c57d20 | 388 | * @note Buffer state will be preserved |
jeroen3 | 0:a04dc0c57d20 | 389 | * |
jeroen3 | 2:6013f6d867e5 | 390 | * @warning Consider this opertaion as atomic! |
jeroen3 | 0:a04dc0c57d20 | 391 | * |
jeroen3 | 0:a04dc0c57d20 | 392 | * @details Read n elements back in time. |
jeroen3 | 2:6013f6d867e5 | 393 | * As for index[0] the most recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 394 | * And for index[count] the oldest element is returned. |
jeroen3 | 2:6013f6d867e5 | 395 | * This makes it possible to keep history. For DSP application. |
jeroen3 | 0:a04dc0c57d20 | 396 | * |
jeroen3 | 2:6013f6d867e5 | 397 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 398 | * @param[in] index Index relative from most recent |
jeroen3 | 0:a04dc0c57d20 | 399 | * |
jeroen3 | 2:6013f6d867e5 | 400 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 0:a04dc0c57d20 | 401 | */ |
jeroen3 | 2:6013f6d867e5 | 402 | uint32_t xifo32_read_mr(xifo32_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 403 | register uint32_t *ptemp; |
jeroen3 | 0:a04dc0c57d20 | 404 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 405 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 406 | return 0; /* Nothing to read there */ |
jeroen3 | 0:a04dc0c57d20 | 407 | } |
jeroen3 | 0:a04dc0c57d20 | 408 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 409 | ptemp = (c->read) - index; |
jeroen3 | 0:a04dc0c57d20 | 410 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 411 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 412 | /* Exceeded pool boundaries */ |
jeroen3 | 0:a04dc0c57d20 | 413 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 0:a04dc0c57d20 | 414 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 415 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 0:a04dc0c57d20 | 416 | } |
jeroen3 | 0:a04dc0c57d20 | 417 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 418 | return *ptemp; |
jeroen3 | 0:a04dc0c57d20 | 419 | } |
jeroen3 | 0:a04dc0c57d20 | 420 | |
jeroen3 | 0:a04dc0c57d20 | 421 | /** |
jeroen3 | 0:a04dc0c57d20 | 422 | * @brief Pop (mr) most recent from buffer (filo) |
jeroen3 | 0:a04dc0c57d20 | 423 | * |
jeroen3 | 0:a04dc0c57d20 | 424 | * @note Buffer state will be altered |
jeroen3 | 0:a04dc0c57d20 | 425 | * |
jeroen3 | 2:6013f6d867e5 | 426 | * @warning Consider this opertaion as atomic! |
jeroen3 | 0:a04dc0c57d20 | 427 | * |
jeroen3 | 0:a04dc0c57d20 | 428 | * @details Read and remove the most recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 429 | * Using this results in a stack type of buffer. |
jeroen3 | 0:a04dc0c57d20 | 430 | * |
jeroen3 | 2:6013f6d867e5 | 431 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 432 | * |
jeroen3 | 2:6013f6d867e5 | 433 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 0:a04dc0c57d20 | 434 | */ |
jeroen3 | 2:6013f6d867e5 | 435 | uint32_t xifo32_pop_mr(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 436 | register uint32_t temp; |
jeroen3 | 0:a04dc0c57d20 | 437 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 438 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 439 | return 0; /* Nothing to read there */ |
jeroen3 | 0:a04dc0c57d20 | 440 | } |
jeroen3 | 0:a04dc0c57d20 | 441 | /* Read */ |
jeroen3 | 2:6013f6d867e5 | 442 | temp = *c->read; |
jeroen3 | 2:6013f6d867e5 | 443 | /* Empty */ |
jeroen3 | 2:6013f6d867e5 | 444 | *c->read = 0; |
jeroen3 | 2:6013f6d867e5 | 445 | /* Most recent element read, return write pointer */ |
jeroen3 | 2:6013f6d867e5 | 446 | c->write = c->read; |
jeroen3 | 2:6013f6d867e5 | 447 | /* Decrement read pointer */ |
jeroen3 | 2:6013f6d867e5 | 448 | c->read--; |
jeroen3 | 2:6013f6d867e5 | 449 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 450 | if( c->read < c->startpool ){ |
jeroen3 | 2:6013f6d867e5 | 451 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 452 | c->read = c->endpool; |
jeroen3 | 2:6013f6d867e5 | 453 | } |
jeroen3 | 2:6013f6d867e5 | 454 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 455 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 456 | if(c->count < c->size) |
jeroen3 | 2:6013f6d867e5 | 457 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 458 | return temp; |
jeroen3 | 2:6013f6d867e5 | 459 | } |
jeroen3 | 2:6013f6d867e5 | 460 | |
jeroen3 | 2:6013f6d867e5 | 461 | /** |
jeroen3 | 2:6013f6d867e5 | 462 | * @brief Pop (lr) least recent from buffer (fifo) |
jeroen3 | 2:6013f6d867e5 | 463 | * |
jeroen3 | 2:6013f6d867e5 | 464 | * @note Buffer state will be altered |
jeroen3 | 2:6013f6d867e5 | 465 | * |
jeroen3 | 2:6013f6d867e5 | 466 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 467 | * |
jeroen3 | 2:6013f6d867e5 | 468 | * @details Read and remove the least recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 469 | * Using this results in a fifo type of buffer. |
jeroen3 | 2:6013f6d867e5 | 470 | * |
jeroen3 | 2:6013f6d867e5 | 471 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 472 | * |
jeroen3 | 2:6013f6d867e5 | 473 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 474 | */ |
jeroen3 | 2:6013f6d867e5 | 475 | uint32_t xifo32_pop_lr(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 476 | register uint32_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 477 | register uint32_t temp; |
jeroen3 | 2:6013f6d867e5 | 478 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 479 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 480 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 481 | } |
jeroen3 | 2:6013f6d867e5 | 482 | /* Derive least recent buffer element */ |
jeroen3 | 2:6013f6d867e5 | 483 | ptemp = (c->read+1) - c->count; |
jeroen3 | 2:6013f6d867e5 | 484 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 485 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 486 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 487 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 488 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 489 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 490 | } |
jeroen3 | 2:6013f6d867e5 | 491 | /* Read oldest buffer element */ |
jeroen3 | 2:6013f6d867e5 | 492 | /* Read to temp register */ |
jeroen3 | 2:6013f6d867e5 | 493 | temp = *ptemp; |
jeroen3 | 2:6013f6d867e5 | 494 | /* Empty buffer element */ |
jeroen3 | 2:6013f6d867e5 | 495 | *ptemp = 0; |
jeroen3 | 2:6013f6d867e5 | 496 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 497 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 498 | /* Check full flag */ |
jeroen3 | 2:6013f6d867e5 | 499 | if(c->count < c->size) |
jeroen3 | 2:6013f6d867e5 | 500 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 501 | return temp; |
jeroen3 | 2:6013f6d867e5 | 502 | } |
jeroen3 | 2:6013f6d867e5 | 503 | |
jeroen3 | 2:6013f6d867e5 | 504 | /** |
jeroen3 | 2:6013f6d867e5 | 505 | * @brief Write to buffer |
jeroen3 | 2:6013f6d867e5 | 506 | * |
jeroen3 | 2:6013f6d867e5 | 507 | * @note Readpointer is automatically set to the last added element. |
jeroen3 | 2:6013f6d867e5 | 508 | * |
jeroen3 | 2:6013f6d867e5 | 509 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 510 | * |
jeroen3 | 2:6013f6d867e5 | 511 | * @details Adds a value to the buffer. |
jeroen3 | 2:6013f6d867e5 | 512 | * Automatically overwrites oldest elements when full. |
jeroen3 | 2:6013f6d867e5 | 513 | * |
jeroen3 | 2:6013f6d867e5 | 514 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 515 | * @param[in] data Data to add to buffer |
jeroen3 | 2:6013f6d867e5 | 516 | * |
jeroen3 | 2:6013f6d867e5 | 517 | * @return Number of free buffer elements |
jeroen3 | 2:6013f6d867e5 | 518 | */ |
jeroen3 | 2:6013f6d867e5 | 519 | uint32_t xifo32_write(xifo32_t *c, uint32_t data){ |
jeroen3 | 2:6013f6d867e5 | 520 | /* Write data */ |
jeroen3 | 2:6013f6d867e5 | 521 | *c->write = data; |
jeroen3 | 2:6013f6d867e5 | 522 | /* Update read pointer to most recent element */ |
jeroen3 | 2:6013f6d867e5 | 523 | c->read = c->write; |
jeroen3 | 2:6013f6d867e5 | 524 | /* Write pointer increment */ |
jeroen3 | 2:6013f6d867e5 | 525 | c->write++; |
jeroen3 | 2:6013f6d867e5 | 526 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 527 | if( c->write > c->endpool){ |
jeroen3 | 2:6013f6d867e5 | 528 | /* We exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 529 | c->write = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 530 | } |
jeroen3 | 2:6013f6d867e5 | 531 | /* Update count */ |
jeroen3 | 2:6013f6d867e5 | 532 | c->count++; |
jeroen3 | 2:6013f6d867e5 | 533 | /* Verify full */ |
jeroen3 | 2:6013f6d867e5 | 534 | if( c->count >= c->size ){ |
jeroen3 | 2:6013f6d867e5 | 535 | c->full = 1; |
jeroen3 | 2:6013f6d867e5 | 536 | c->count = c->size; |
jeroen3 | 2:6013f6d867e5 | 537 | } |
jeroen3 | 2:6013f6d867e5 | 538 | /* return free elements count */ |
jeroen3 | 2:6013f6d867e5 | 539 | return c->size - c->count; |
jeroen3 | 2:6013f6d867e5 | 540 | } |
jeroen3 | 2:6013f6d867e5 | 541 | |
jeroen3 | 2:6013f6d867e5 | 542 | /** |
jeroen3 | 2:6013f6d867e5 | 543 | * @brief Get buffer size |
jeroen3 | 2:6013f6d867e5 | 544 | * |
jeroen3 | 2:6013f6d867e5 | 545 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 546 | * |
jeroen3 | 2:6013f6d867e5 | 547 | * @return Size of memory pool in elements |
jeroen3 | 2:6013f6d867e5 | 548 | */ |
jeroen3 | 2:6013f6d867e5 | 549 | uint32_t xifo32_get_size(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 550 | return c->size; |
jeroen3 | 2:6013f6d867e5 | 551 | } |
jeroen3 | 2:6013f6d867e5 | 552 | |
jeroen3 | 2:6013f6d867e5 | 553 | /** |
jeroen3 | 2:6013f6d867e5 | 554 | * @brief Get number of used elements |
jeroen3 | 2:6013f6d867e5 | 555 | * |
jeroen3 | 2:6013f6d867e5 | 556 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 557 | * |
jeroen3 | 2:6013f6d867e5 | 558 | * @return Number of used buffer elements |
jeroen3 | 2:6013f6d867e5 | 559 | */ |
jeroen3 | 2:6013f6d867e5 | 560 | uint32_t xifo32_get_used(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 561 | return c->count; |
jeroen3 | 2:6013f6d867e5 | 562 | } |
jeroen3 | 2:6013f6d867e5 | 563 | |
jeroen3 | 2:6013f6d867e5 | 564 | /** |
jeroen3 | 2:6013f6d867e5 | 565 | * @brief Get number of free elements |
jeroen3 | 2:6013f6d867e5 | 566 | * |
jeroen3 | 2:6013f6d867e5 | 567 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 568 | * |
jeroen3 | 2:6013f6d867e5 | 569 | * @return Number of free elements |
jeroen3 | 2:6013f6d867e5 | 570 | */ |
jeroen3 | 2:6013f6d867e5 | 571 | uint32_t xifo32_get_free(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 572 | return c->size - c->count; |
jeroen3 | 2:6013f6d867e5 | 573 | } |
jeroen3 | 2:6013f6d867e5 | 574 | |
jeroen3 | 2:6013f6d867e5 | 575 | /** |
jeroen3 | 2:6013f6d867e5 | 576 | * @brief Get full flag |
jeroen3 | 2:6013f6d867e5 | 577 | * |
jeroen3 | 2:6013f6d867e5 | 578 | * @param[in] c Pointer to @p xifo32_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 579 | * |
jeroen3 | 2:6013f6d867e5 | 580 | * @return 1 if full |
jeroen3 | 2:6013f6d867e5 | 581 | */ |
jeroen3 | 2:6013f6d867e5 | 582 | uint32_t xifo32_get_full(xifo32_t *c){ |
jeroen3 | 2:6013f6d867e5 | 583 | return c->full; |
jeroen3 | 2:6013f6d867e5 | 584 | } |
jeroen3 | 2:6013f6d867e5 | 585 | |
jeroen3 | 2:6013f6d867e5 | 586 | /** @} */ |
jeroen3 | 2:6013f6d867e5 | 587 | #endif |
jeroen3 | 2:6013f6d867e5 | 588 | |
jeroen3 | 2:6013f6d867e5 | 589 | #if xIFO_USE_16BIT == TRUE |
jeroen3 | 2:6013f6d867e5 | 590 | /** |
jeroen3 | 2:6013f6d867e5 | 591 | * @brief Initialize buffer object structure. |
jeroen3 | 2:6013f6d867e5 | 592 | * |
jeroen3 | 2:6013f6d867e5 | 593 | * @note Does not clear memory pool. |
jeroen3 | 2:6013f6d867e5 | 594 | * |
jeroen3 | 2:6013f6d867e5 | 595 | * @param[in] c Pointer to @p xifo16_t object used for configuration. |
jeroen3 | 2:6013f6d867e5 | 596 | * @param[in] s Number of elements buffer can hold (size). |
jeroen3 | 2:6013f6d867e5 | 597 | * @param[in] sp Start of pre-allocated memory pool. |
jeroen3 | 2:6013f6d867e5 | 598 | */ |
jeroen3 | 2:6013f6d867e5 | 599 | void xifo16_init(xifo16_t *c, uint32_t s, uint16_t *sp){ |
jeroen3 | 2:6013f6d867e5 | 600 | c->startpool = sp; |
jeroen3 | 2:6013f6d867e5 | 601 | c->size = s; |
jeroen3 | 2:6013f6d867e5 | 602 | c->endpool = &sp[--s]; |
jeroen3 | 2:6013f6d867e5 | 603 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 604 | c->count = 0; |
jeroen3 | 2:6013f6d867e5 | 605 | c->read = sp; |
jeroen3 | 2:6013f6d867e5 | 606 | c->write = sp; |
jeroen3 | 2:6013f6d867e5 | 607 | } |
jeroen3 | 2:6013f6d867e5 | 608 | |
jeroen3 | 2:6013f6d867e5 | 609 | /** |
jeroen3 | 2:6013f6d867e5 | 610 | * @brief Clear buffer memory pool |
jeroen3 | 2:6013f6d867e5 | 611 | * |
jeroen3 | 2:6013f6d867e5 | 612 | * @note Must be used on initialised buffer object. |
jeroen3 | 2:6013f6d867e5 | 613 | * |
jeroen3 | 2:6013f6d867e5 | 614 | * @param[in] c Pointer to @p xifo16_t object. |
jeroen3 | 2:6013f6d867e5 | 615 | */ |
jeroen3 | 2:6013f6d867e5 | 616 | void xifo16_clear(xifo16_t *c){ |
jeroen3 | 2:6013f6d867e5 | 617 | register uint16_t *ptemp = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 618 | register uint32_t i = c->size; |
jeroen3 | 2:6013f6d867e5 | 619 | while(i--){ |
jeroen3 | 2:6013f6d867e5 | 620 | *ptemp++ = 0; |
jeroen3 | 2:6013f6d867e5 | 621 | } |
jeroen3 | 2:6013f6d867e5 | 622 | } |
jeroen3 | 2:6013f6d867e5 | 623 | |
jeroen3 | 2:6013f6d867e5 | 624 | /** |
jeroen3 | 2:6013f6d867e5 | 625 | * @brief Read from buffer (lr) Least Recent oriented (fifo) |
jeroen3 | 2:6013f6d867e5 | 626 | * |
jeroen3 | 2:6013f6d867e5 | 627 | * @note Buffer state will be preserved |
jeroen3 | 2:6013f6d867e5 | 628 | * |
jeroen3 | 2:6013f6d867e5 | 629 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 630 | * |
jeroen3 | 2:6013f6d867e5 | 631 | * @details Read n elements from the oldest element to the most recent. |
jeroen3 | 2:6013f6d867e5 | 632 | * As for index[0] the least recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 633 | * And for index[count] the most recent element is returned. |
jeroen3 | 2:6013f6d867e5 | 634 | * This makes it possible to peek in fifo. |
jeroen3 | 2:6013f6d867e5 | 635 | * |
jeroen3 | 2:6013f6d867e5 | 636 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 637 | * @param[in] index Index relative from least recent |
jeroen3 | 2:6013f6d867e5 | 638 | * |
jeroen3 | 2:6013f6d867e5 | 639 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 640 | */ |
jeroen3 | 2:6013f6d867e5 | 641 | uint16_t xifo16_read_lr(xifo16_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 642 | register uint16_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 643 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 644 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 645 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 646 | } |
jeroen3 | 2:6013f6d867e5 | 647 | /* Calculate index of oldest element */ |
jeroen3 | 2:6013f6d867e5 | 648 | index = (c->count-1) - index; |
jeroen3 | 2:6013f6d867e5 | 649 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 650 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 651 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 652 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 653 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 654 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 655 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 656 | } |
jeroen3 | 2:6013f6d867e5 | 657 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 658 | return *ptemp; |
jeroen3 | 2:6013f6d867e5 | 659 | } |
jeroen3 | 2:6013f6d867e5 | 660 | |
jeroen3 | 2:6013f6d867e5 | 661 | /** |
jeroen3 | 2:6013f6d867e5 | 662 | * @brief Read from buffer (mr) Most Recent oriented (filo) |
jeroen3 | 2:6013f6d867e5 | 663 | * |
jeroen3 | 2:6013f6d867e5 | 664 | * @note Buffer state will be preserved |
jeroen3 | 2:6013f6d867e5 | 665 | * |
jeroen3 | 2:6013f6d867e5 | 666 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 667 | * |
jeroen3 | 2:6013f6d867e5 | 668 | * @details Read n elements back in time. |
jeroen3 | 2:6013f6d867e5 | 669 | * As for index[0] the most recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 670 | * And for index[count] the oldest element is returned. |
jeroen3 | 2:6013f6d867e5 | 671 | * This makes it possible to keep history. For DSP application. |
jeroen3 | 2:6013f6d867e5 | 672 | * |
jeroen3 | 2:6013f6d867e5 | 673 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 674 | * @param[in] index Index relative from most recent |
jeroen3 | 2:6013f6d867e5 | 675 | * |
jeroen3 | 2:6013f6d867e5 | 676 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 677 | */ |
jeroen3 | 2:6013f6d867e5 | 678 | uint16_t xifo16_read_mr(xifo16_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 679 | register uint16_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 680 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 681 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 682 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 683 | } |
jeroen3 | 2:6013f6d867e5 | 684 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 685 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 686 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 687 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 688 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 689 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 690 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 691 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 692 | } |
jeroen3 | 2:6013f6d867e5 | 693 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 694 | return *ptemp; |
jeroen3 | 2:6013f6d867e5 | 695 | } |
jeroen3 | 2:6013f6d867e5 | 696 | |
jeroen3 | 2:6013f6d867e5 | 697 | /** |
jeroen3 | 2:6013f6d867e5 | 698 | * @brief Pop (mr) most recent from buffer (filo) |
jeroen3 | 2:6013f6d867e5 | 699 | * |
jeroen3 | 2:6013f6d867e5 | 700 | * @note Buffer state will be altered |
jeroen3 | 2:6013f6d867e5 | 701 | * |
jeroen3 | 2:6013f6d867e5 | 702 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 703 | * |
jeroen3 | 2:6013f6d867e5 | 704 | * @details Read and remove the most recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 705 | * Using this results in a stack type of buffer. |
jeroen3 | 2:6013f6d867e5 | 706 | * |
jeroen3 | 2:6013f6d867e5 | 707 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 708 | * |
jeroen3 | 2:6013f6d867e5 | 709 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 710 | */ |
jeroen3 | 2:6013f6d867e5 | 711 | uint16_t xifo16_pop_mr(xifo16_t *c){ |
jeroen3 | 2:6013f6d867e5 | 712 | register uint16_t temp; |
jeroen3 | 2:6013f6d867e5 | 713 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 714 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 715 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 716 | } |
jeroen3 | 2:6013f6d867e5 | 717 | /* Read */ |
jeroen3 | 2:6013f6d867e5 | 718 | temp = *c->read; |
jeroen3 | 0:a04dc0c57d20 | 719 | /* Empty */ |
jeroen3 | 0:a04dc0c57d20 | 720 | *c->read = 0; |
jeroen3 | 0:a04dc0c57d20 | 721 | /* Most recent element read, return write pointer */ |
jeroen3 | 0:a04dc0c57d20 | 722 | c->write = c->read; |
jeroen3 | 0:a04dc0c57d20 | 723 | /* Decrement read pointer */ |
jeroen3 | 0:a04dc0c57d20 | 724 | c->read--; |
jeroen3 | 0:a04dc0c57d20 | 725 | /* Validate pointer */ |
jeroen3 | 0:a04dc0c57d20 | 726 | if( c->read < c->startpool ){ |
jeroen3 | 2:6013f6d867e5 | 727 | /* Exceeded pool boundaries */ |
jeroen3 | 0:a04dc0c57d20 | 728 | c->read = c->endpool; |
jeroen3 | 0:a04dc0c57d20 | 729 | } |
jeroen3 | 2:6013f6d867e5 | 730 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 731 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 732 | if(c->count < c->size) |
jeroen3 | 0:a04dc0c57d20 | 733 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 734 | return temp; |
jeroen3 | 0:a04dc0c57d20 | 735 | } |
jeroen3 | 0:a04dc0c57d20 | 736 | |
jeroen3 | 0:a04dc0c57d20 | 737 | /** |
jeroen3 | 0:a04dc0c57d20 | 738 | * @brief Pop (lr) least recent from buffer (fifo) |
jeroen3 | 0:a04dc0c57d20 | 739 | * |
jeroen3 | 0:a04dc0c57d20 | 740 | * @note Buffer state will be altered |
jeroen3 | 0:a04dc0c57d20 | 741 | * |
jeroen3 | 2:6013f6d867e5 | 742 | * @warning Consider this opertaion as atomic! |
jeroen3 | 0:a04dc0c57d20 | 743 | * |
jeroen3 | 0:a04dc0c57d20 | 744 | * @details Read and remove the least recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 745 | * Using this results in a fifo type of buffer. |
jeroen3 | 0:a04dc0c57d20 | 746 | * |
jeroen3 | 2:6013f6d867e5 | 747 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 748 | * |
jeroen3 | 2:6013f6d867e5 | 749 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 0:a04dc0c57d20 | 750 | */ |
jeroen3 | 2:6013f6d867e5 | 751 | uint16_t xifo16_pop_lr(xifo16_t *c){ |
jeroen3 | 2:6013f6d867e5 | 752 | register uint16_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 753 | register uint16_t temp; |
jeroen3 | 0:a04dc0c57d20 | 754 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 755 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 756 | return 0; /* Nothing to read there */ |
jeroen3 | 0:a04dc0c57d20 | 757 | } |
jeroen3 | 0:a04dc0c57d20 | 758 | /* Derive least recent buffer element */ |
jeroen3 | 2:6013f6d867e5 | 759 | ptemp = (c->read+1) - c->count; |
jeroen3 | 0:a04dc0c57d20 | 760 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 761 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 762 | /* Exceeded pool boundaries */ |
jeroen3 | 0:a04dc0c57d20 | 763 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 0:a04dc0c57d20 | 764 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 765 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 0:a04dc0c57d20 | 766 | } |
jeroen3 | 0:a04dc0c57d20 | 767 | /* Read oldest buffer element */ |
jeroen3 | 2:6013f6d867e5 | 768 | /* Read to temp register */ |
jeroen3 | 2:6013f6d867e5 | 769 | temp = *ptemp; |
jeroen3 | 2:6013f6d867e5 | 770 | /* Empty buffer element */ |
jeroen3 | 2:6013f6d867e5 | 771 | *ptemp = 0; |
jeroen3 | 2:6013f6d867e5 | 772 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 773 | c->count--; |
jeroen3 | 0:a04dc0c57d20 | 774 | /* Check full flag */ |
jeroen3 | 2:6013f6d867e5 | 775 | if(c->count < c->size) |
jeroen3 | 0:a04dc0c57d20 | 776 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 777 | return temp; |
jeroen3 | 0:a04dc0c57d20 | 778 | } |
jeroen3 | 0:a04dc0c57d20 | 779 | |
jeroen3 | 0:a04dc0c57d20 | 780 | /** |
jeroen3 | 0:a04dc0c57d20 | 781 | * @brief Write to buffer |
jeroen3 | 0:a04dc0c57d20 | 782 | * |
jeroen3 | 0:a04dc0c57d20 | 783 | * @note Readpointer is automatically set to the last added element. |
jeroen3 | 0:a04dc0c57d20 | 784 | * |
jeroen3 | 2:6013f6d867e5 | 785 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 786 | * |
jeroen3 | 0:a04dc0c57d20 | 787 | * @details Adds a value to the buffer. |
jeroen3 | 2:6013f6d867e5 | 788 | * Automatically overwrites oldest elements when full. |
jeroen3 | 0:a04dc0c57d20 | 789 | * |
jeroen3 | 2:6013f6d867e5 | 790 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 791 | * @param[in] data Data to add to buffer |
jeroen3 | 0:a04dc0c57d20 | 792 | * |
jeroen3 | 2:6013f6d867e5 | 793 | * @return Number of free buffer elements |
jeroen3 | 0:a04dc0c57d20 | 794 | */ |
jeroen3 | 2:6013f6d867e5 | 795 | uint32_t xifo16_write(xifo16_t *c, uint16_t data){ |
jeroen3 | 0:a04dc0c57d20 | 796 | /* Write data */ |
jeroen3 | 0:a04dc0c57d20 | 797 | *c->write = data; |
jeroen3 | 0:a04dc0c57d20 | 798 | /* Update read pointer to most recent element */ |
jeroen3 | 0:a04dc0c57d20 | 799 | c->read = c->write; |
jeroen3 | 0:a04dc0c57d20 | 800 | /* Write pointer increment */ |
jeroen3 | 2:6013f6d867e5 | 801 | c->write++; |
jeroen3 | 0:a04dc0c57d20 | 802 | /* Validate pointer */ |
jeroen3 | 0:a04dc0c57d20 | 803 | if( c->write > c->endpool){ |
jeroen3 | 2:6013f6d867e5 | 804 | /* We exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 805 | c->write = c->startpool; |
jeroen3 | 0:a04dc0c57d20 | 806 | } |
jeroen3 | 2:6013f6d867e5 | 807 | /* Update count */ |
jeroen3 | 2:6013f6d867e5 | 808 | c->count++; |
jeroen3 | 0:a04dc0c57d20 | 809 | /* Verify full */ |
jeroen3 | 2:6013f6d867e5 | 810 | if( c->count >= c->size ){ |
jeroen3 | 0:a04dc0c57d20 | 811 | c->full = 1; |
jeroen3 | 2:6013f6d867e5 | 812 | c->count = c->size; |
jeroen3 | 0:a04dc0c57d20 | 813 | } |
jeroen3 | 0:a04dc0c57d20 | 814 | /* return free elements count */ |
jeroen3 | 2:6013f6d867e5 | 815 | return c->size - c->count; |
jeroen3 | 0:a04dc0c57d20 | 816 | } |
jeroen3 | 0:a04dc0c57d20 | 817 | |
jeroen3 | 0:a04dc0c57d20 | 818 | /** |
jeroen3 | 0:a04dc0c57d20 | 819 | * @brief Get buffer size |
jeroen3 | 0:a04dc0c57d20 | 820 | * |
jeroen3 | 2:6013f6d867e5 | 821 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 822 | * |
jeroen3 | 2:6013f6d867e5 | 823 | * @return Size of memory pool in elements |
jeroen3 | 0:a04dc0c57d20 | 824 | */ |
jeroen3 | 2:6013f6d867e5 | 825 | uint32_t xifo16_get_size(xifo16_t *c){ |
jeroen3 | 0:a04dc0c57d20 | 826 | return c->size; |
jeroen3 | 0:a04dc0c57d20 | 827 | } |
jeroen3 | 0:a04dc0c57d20 | 828 | |
jeroen3 | 0:a04dc0c57d20 | 829 | /** |
jeroen3 | 0:a04dc0c57d20 | 830 | * @brief Get number of used elements |
jeroen3 | 0:a04dc0c57d20 | 831 | * |
jeroen3 | 2:6013f6d867e5 | 832 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 833 | * |
jeroen3 | 2:6013f6d867e5 | 834 | * @return Number of used buffer elements |
jeroen3 | 0:a04dc0c57d20 | 835 | */ |
jeroen3 | 2:6013f6d867e5 | 836 | uint32_t xifo16_get_used(xifo16_t *c){ |
jeroen3 | 2:6013f6d867e5 | 837 | return c->count; |
jeroen3 | 0:a04dc0c57d20 | 838 | } |
jeroen3 | 0:a04dc0c57d20 | 839 | |
jeroen3 | 0:a04dc0c57d20 | 840 | /** |
jeroen3 | 0:a04dc0c57d20 | 841 | * @brief Get number of free elements |
jeroen3 | 0:a04dc0c57d20 | 842 | * |
jeroen3 | 2:6013f6d867e5 | 843 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 844 | * |
jeroen3 | 2:6013f6d867e5 | 845 | * @return Number of free elements |
jeroen3 | 0:a04dc0c57d20 | 846 | */ |
jeroen3 | 2:6013f6d867e5 | 847 | uint32_t xifo16_get_free(xifo16_t *c){ |
jeroen3 | 2:6013f6d867e5 | 848 | return c->size - c->count; |
jeroen3 | 0:a04dc0c57d20 | 849 | } |
jeroen3 | 0:a04dc0c57d20 | 850 | |
jeroen3 | 0:a04dc0c57d20 | 851 | /** |
jeroen3 | 0:a04dc0c57d20 | 852 | * @brief Get full flag |
jeroen3 | 0:a04dc0c57d20 | 853 | * |
jeroen3 | 2:6013f6d867e5 | 854 | * @param[in] c Pointer to @p xifo16_t used for configuration. |
jeroen3 | 0:a04dc0c57d20 | 855 | * |
jeroen3 | 2:6013f6d867e5 | 856 | * @return 1 if full |
jeroen3 | 0:a04dc0c57d20 | 857 | */ |
jeroen3 | 2:6013f6d867e5 | 858 | uint32_t xifo16_get_full(xifo16_t *c){ |
jeroen3 | 0:a04dc0c57d20 | 859 | return c->full; |
jeroen3 | 0:a04dc0c57d20 | 860 | } |
jeroen3 | 0:a04dc0c57d20 | 861 | |
jeroen3 | 0:a04dc0c57d20 | 862 | /** @} */ |
jeroen3 | 2:6013f6d867e5 | 863 | |
jeroen3 | 2:6013f6d867e5 | 864 | #endif |
jeroen3 | 2:6013f6d867e5 | 865 | |
jeroen3 | 2:6013f6d867e5 | 866 | #if xIFO_USE_8BIT == TRUE |
jeroen3 | 2:6013f6d867e5 | 867 | /** |
jeroen3 | 2:6013f6d867e5 | 868 | * @brief Initialize buffer object structure. |
jeroen3 | 2:6013f6d867e5 | 869 | * |
jeroen3 | 2:6013f6d867e5 | 870 | * @note Does not clear memory pool. |
jeroen3 | 2:6013f6d867e5 | 871 | * |
jeroen3 | 2:6013f6d867e5 | 872 | * @param[in] c Pointer to @p xifo8_t object used for configuration. |
jeroen3 | 2:6013f6d867e5 | 873 | * @param[in] s Number of elements buffer can hold (size). |
jeroen3 | 2:6013f6d867e5 | 874 | * @param[in] sp Start of pre-allocated memory pool. |
jeroen3 | 2:6013f6d867e5 | 875 | */ |
jeroen3 | 2:6013f6d867e5 | 876 | void xifo8_init(xifo8_t *c, uint32_t s, uint8_t *sp){ |
jeroen3 | 2:6013f6d867e5 | 877 | c->startpool = sp; |
jeroen3 | 2:6013f6d867e5 | 878 | c->size = s; |
jeroen3 | 2:6013f6d867e5 | 879 | c->endpool = &sp[--s]; |
jeroen3 | 2:6013f6d867e5 | 880 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 881 | c->count = 0; |
jeroen3 | 2:6013f6d867e5 | 882 | c->read = sp; |
jeroen3 | 2:6013f6d867e5 | 883 | c->write = sp; |
jeroen3 | 2:6013f6d867e5 | 884 | } |
jeroen3 | 2:6013f6d867e5 | 885 | |
jeroen3 | 2:6013f6d867e5 | 886 | /** |
jeroen3 | 2:6013f6d867e5 | 887 | * @brief Clear buffer memory pool |
jeroen3 | 2:6013f6d867e5 | 888 | * |
jeroen3 | 2:6013f6d867e5 | 889 | * @note Must be used on initialised buffer object. |
jeroen3 | 2:6013f6d867e5 | 890 | * |
jeroen3 | 2:6013f6d867e5 | 891 | * @param[in] c Pointer to @p xifo8_t object. |
jeroen3 | 2:6013f6d867e5 | 892 | */ |
jeroen3 | 2:6013f6d867e5 | 893 | void xifo8_clear(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 894 | register uint8_t *ptemp = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 895 | register uint32_t i = c->size; |
jeroen3 | 2:6013f6d867e5 | 896 | while(i--){ |
jeroen3 | 2:6013f6d867e5 | 897 | *ptemp++ = 0; |
jeroen3 | 2:6013f6d867e5 | 898 | } |
jeroen3 | 2:6013f6d867e5 | 899 | } |
jeroen3 | 2:6013f6d867e5 | 900 | |
jeroen3 | 2:6013f6d867e5 | 901 | /** |
jeroen3 | 2:6013f6d867e5 | 902 | * @brief Read from buffer (lr) Least Recent oriented (fifo) |
jeroen3 | 2:6013f6d867e5 | 903 | * |
jeroen3 | 2:6013f6d867e5 | 904 | * @note Buffer state will be preserved |
jeroen3 | 2:6013f6d867e5 | 905 | * |
jeroen3 | 2:6013f6d867e5 | 906 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 907 | * |
jeroen3 | 2:6013f6d867e5 | 908 | * @details Read n elements from the oldest element to the most recent. |
jeroen3 | 2:6013f6d867e5 | 909 | * As for index[0] the least recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 910 | * And for index[count] the most recent element is returned. |
jeroen3 | 2:6013f6d867e5 | 911 | * This makes it possible to peek in fifo. |
jeroen3 | 2:6013f6d867e5 | 912 | * |
jeroen3 | 2:6013f6d867e5 | 913 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 914 | * @param[in] index Index relative from least recent |
jeroen3 | 2:6013f6d867e5 | 915 | * |
jeroen3 | 2:6013f6d867e5 | 916 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 917 | */ |
jeroen3 | 2:6013f6d867e5 | 918 | uint8_t xifo8_read_lr(xifo8_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 919 | register uint8_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 920 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 921 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 922 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 923 | } |
jeroen3 | 2:6013f6d867e5 | 924 | /* Calculate index of oldest element */ |
jeroen3 | 2:6013f6d867e5 | 925 | index = (c->count-1) - index; |
jeroen3 | 2:6013f6d867e5 | 926 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 927 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 928 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 929 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 930 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 931 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 932 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 933 | } |
jeroen3 | 2:6013f6d867e5 | 934 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 935 | return *ptemp; |
jeroen3 | 2:6013f6d867e5 | 936 | } |
jeroen3 | 2:6013f6d867e5 | 937 | |
jeroen3 | 2:6013f6d867e5 | 938 | /** |
jeroen3 | 2:6013f6d867e5 | 939 | * @brief Read from buffer (mr) Most Recent oriented (filo) |
jeroen3 | 2:6013f6d867e5 | 940 | * |
jeroen3 | 2:6013f6d867e5 | 941 | * @note Buffer state will be preserved |
jeroen3 | 2:6013f6d867e5 | 942 | * |
jeroen3 | 2:6013f6d867e5 | 943 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 944 | * |
jeroen3 | 2:6013f6d867e5 | 945 | * @details Read n elements back in time. |
jeroen3 | 2:6013f6d867e5 | 946 | * As for index[0] the most recently added element is returned. |
jeroen3 | 2:6013f6d867e5 | 947 | * And for index[count] the oldest element is returned. |
jeroen3 | 2:6013f6d867e5 | 948 | * This makes it possible to keep history. For DSP application. |
jeroen3 | 2:6013f6d867e5 | 949 | * |
jeroen3 | 2:6013f6d867e5 | 950 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 951 | * @param[in] index Index relative from most recent |
jeroen3 | 2:6013f6d867e5 | 952 | * |
jeroen3 | 2:6013f6d867e5 | 953 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 954 | */ |
jeroen3 | 2:6013f6d867e5 | 955 | uint8_t xifo8_read_mr(xifo8_t *c, uint32_t index){ |
jeroen3 | 2:6013f6d867e5 | 956 | register uint8_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 957 | /* Verify there is valid data to read */ |
jeroen3 | 2:6013f6d867e5 | 958 | if(index >= c->count){ |
jeroen3 | 2:6013f6d867e5 | 959 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 960 | } |
jeroen3 | 2:6013f6d867e5 | 961 | /* Set pointer */ |
jeroen3 | 2:6013f6d867e5 | 962 | ptemp = (c->read) - index; |
jeroen3 | 2:6013f6d867e5 | 963 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 964 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 965 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 966 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 967 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 968 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 969 | } |
jeroen3 | 2:6013f6d867e5 | 970 | /* Read most recent */ |
jeroen3 | 2:6013f6d867e5 | 971 | return *ptemp; |
jeroen3 | 2:6013f6d867e5 | 972 | } |
jeroen3 | 2:6013f6d867e5 | 973 | |
jeroen3 | 2:6013f6d867e5 | 974 | /** |
jeroen3 | 2:6013f6d867e5 | 975 | * @brief Pop (mr) most recent from buffer (filo) |
jeroen3 | 2:6013f6d867e5 | 976 | * |
jeroen3 | 2:6013f6d867e5 | 977 | * @note Buffer state will be altered |
jeroen3 | 2:6013f6d867e5 | 978 | * |
jeroen3 | 2:6013f6d867e5 | 979 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 980 | * |
jeroen3 | 2:6013f6d867e5 | 981 | * @details Read and remove the most recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 982 | * Using this results in a stack type of buffer. |
jeroen3 | 2:6013f6d867e5 | 983 | * |
jeroen3 | 2:6013f6d867e5 | 984 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 985 | * |
jeroen3 | 2:6013f6d867e5 | 986 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 987 | */ |
jeroen3 | 2:6013f6d867e5 | 988 | uint8_t xifo8_pop_mr(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 989 | register uint8_t temp; |
jeroen3 | 2:6013f6d867e5 | 990 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 991 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 992 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 993 | } |
jeroen3 | 2:6013f6d867e5 | 994 | /* Read */ |
jeroen3 | 2:6013f6d867e5 | 995 | temp = *c->read; |
jeroen3 | 2:6013f6d867e5 | 996 | /* Empty */ |
jeroen3 | 2:6013f6d867e5 | 997 | *c->read = 0; |
jeroen3 | 2:6013f6d867e5 | 998 | /* Most recent element read, return write pointer */ |
jeroen3 | 2:6013f6d867e5 | 999 | c->write = c->read; |
jeroen3 | 2:6013f6d867e5 | 1000 | /* Decrement read pointer */ |
jeroen3 | 2:6013f6d867e5 | 1001 | c->read--; |
jeroen3 | 2:6013f6d867e5 | 1002 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 1003 | if( c->read < c->startpool ){ |
jeroen3 | 2:6013f6d867e5 | 1004 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 1005 | c->read = c->endpool; |
jeroen3 | 2:6013f6d867e5 | 1006 | } |
jeroen3 | 2:6013f6d867e5 | 1007 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 1008 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 1009 | if(c->count < c->size) |
jeroen3 | 2:6013f6d867e5 | 1010 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 1011 | return temp; |
jeroen3 | 2:6013f6d867e5 | 1012 | } |
jeroen3 | 2:6013f6d867e5 | 1013 | |
jeroen3 | 2:6013f6d867e5 | 1014 | /** |
jeroen3 | 2:6013f6d867e5 | 1015 | * @brief Pop (lr) least recent from buffer (fifo) |
jeroen3 | 2:6013f6d867e5 | 1016 | * |
jeroen3 | 2:6013f6d867e5 | 1017 | * @note Buffer state will be altered |
jeroen3 | 2:6013f6d867e5 | 1018 | * |
jeroen3 | 2:6013f6d867e5 | 1019 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 1020 | * |
jeroen3 | 2:6013f6d867e5 | 1021 | * @details Read and remove the least recently added from the buffer. |
jeroen3 | 2:6013f6d867e5 | 1022 | * Using this results in a fifo type of buffer. |
jeroen3 | 2:6013f6d867e5 | 1023 | * |
jeroen3 | 2:6013f6d867e5 | 1024 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 1025 | * |
jeroen3 | 2:6013f6d867e5 | 1026 | * @return Contents of element or 0 if failed (element can hold 0) |
jeroen3 | 2:6013f6d867e5 | 1027 | */ |
jeroen3 | 2:6013f6d867e5 | 1028 | uint8_t xifo8_pop_lr(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 1029 | register uint8_t *ptemp; |
jeroen3 | 2:6013f6d867e5 | 1030 | register uint8_t temp; |
jeroen3 | 2:6013f6d867e5 | 1031 | /* Verify there is valid data read */ |
jeroen3 | 2:6013f6d867e5 | 1032 | if(c->count == 0){ |
jeroen3 | 2:6013f6d867e5 | 1033 | return 0; /* Nothing to read there */ |
jeroen3 | 2:6013f6d867e5 | 1034 | } |
jeroen3 | 2:6013f6d867e5 | 1035 | /* Derive least recent buffer element */ |
jeroen3 | 2:6013f6d867e5 | 1036 | ptemp = (c->read+1) - c->count; |
jeroen3 | 2:6013f6d867e5 | 1037 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 1038 | if(ptemp < c->startpool){ |
jeroen3 | 2:6013f6d867e5 | 1039 | /* Exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 1040 | /* Calculate overshoot (startpool - indexptr) and subtract from end */ |
jeroen3 | 2:6013f6d867e5 | 1041 | /* Since one element of overshoot results in end - 1 you would miss the last value */ |
jeroen3 | 2:6013f6d867e5 | 1042 | ptemp = (c->endpool+1) - (c->startpool - ptemp); |
jeroen3 | 2:6013f6d867e5 | 1043 | } |
jeroen3 | 2:6013f6d867e5 | 1044 | /* Read oldest buffer element */ |
jeroen3 | 2:6013f6d867e5 | 1045 | /* Read to temp register */ |
jeroen3 | 2:6013f6d867e5 | 1046 | temp = *ptemp; |
jeroen3 | 2:6013f6d867e5 | 1047 | /* Empty buffer element */ |
jeroen3 | 2:6013f6d867e5 | 1048 | *ptemp = 0; |
jeroen3 | 2:6013f6d867e5 | 1049 | /* Reduce count */ |
jeroen3 | 2:6013f6d867e5 | 1050 | c->count--; |
jeroen3 | 2:6013f6d867e5 | 1051 | /* Check full flag */ |
jeroen3 | 2:6013f6d867e5 | 1052 | if(c->count < c->size) |
jeroen3 | 2:6013f6d867e5 | 1053 | c->full = 0; |
jeroen3 | 2:6013f6d867e5 | 1054 | return temp; |
jeroen3 | 2:6013f6d867e5 | 1055 | } |
jeroen3 | 2:6013f6d867e5 | 1056 | |
jeroen3 | 2:6013f6d867e5 | 1057 | /** |
jeroen3 | 2:6013f6d867e5 | 1058 | * @brief Write to buffer |
jeroen3 | 2:6013f6d867e5 | 1059 | * |
jeroen3 | 2:6013f6d867e5 | 1060 | * @note Readpointer is automatically set to the last added element. |
jeroen3 | 2:6013f6d867e5 | 1061 | * |
jeroen3 | 2:6013f6d867e5 | 1062 | * @warning Consider this opertaion as atomic! |
jeroen3 | 2:6013f6d867e5 | 1063 | * |
jeroen3 | 2:6013f6d867e5 | 1064 | * @details Adds a value to the buffer. |
jeroen3 | 2:6013f6d867e5 | 1065 | * Automatically overwrites oldest elements when full. |
jeroen3 | 2:6013f6d867e5 | 1066 | * |
jeroen3 | 2:6013f6d867e5 | 1067 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 1068 | * @param[in] data Data to add to buffer |
jeroen3 | 2:6013f6d867e5 | 1069 | * |
jeroen3 | 2:6013f6d867e5 | 1070 | * @return Number of free buffer elements |
jeroen3 | 2:6013f6d867e5 | 1071 | */ |
jeroen3 | 2:6013f6d867e5 | 1072 | uint32_t xifo8_write(xifo8_t *c, uint8_t data){ |
jeroen3 | 2:6013f6d867e5 | 1073 | /* Write data */ |
jeroen3 | 2:6013f6d867e5 | 1074 | *c->write = data; |
jeroen3 | 2:6013f6d867e5 | 1075 | /* Update read pointer to most recent element */ |
jeroen3 | 2:6013f6d867e5 | 1076 | c->read = c->write; |
jeroen3 | 2:6013f6d867e5 | 1077 | /* Write pointer increment */ |
jeroen3 | 2:6013f6d867e5 | 1078 | c->write++; |
jeroen3 | 2:6013f6d867e5 | 1079 | /* Validate pointer */ |
jeroen3 | 2:6013f6d867e5 | 1080 | if( c->write > c->endpool){ |
jeroen3 | 2:6013f6d867e5 | 1081 | /* We exceeded pool boundaries */ |
jeroen3 | 2:6013f6d867e5 | 1082 | c->write = c->startpool; |
jeroen3 | 2:6013f6d867e5 | 1083 | } |
jeroen3 | 2:6013f6d867e5 | 1084 | /* Update count */ |
jeroen3 | 2:6013f6d867e5 | 1085 | c->count++; |
jeroen3 | 2:6013f6d867e5 | 1086 | /* Verify full */ |
jeroen3 | 2:6013f6d867e5 | 1087 | if( c->count >= c->size ){ |
jeroen3 | 2:6013f6d867e5 | 1088 | c->full = 1; |
jeroen3 | 2:6013f6d867e5 | 1089 | c->count = c->size; |
jeroen3 | 2:6013f6d867e5 | 1090 | } |
jeroen3 | 2:6013f6d867e5 | 1091 | /* return free elements count */ |
jeroen3 | 2:6013f6d867e5 | 1092 | return c->size - c->count; |
jeroen3 | 2:6013f6d867e5 | 1093 | } |
jeroen3 | 2:6013f6d867e5 | 1094 | |
jeroen3 | 2:6013f6d867e5 | 1095 | /** |
jeroen3 | 2:6013f6d867e5 | 1096 | * @brief Get buffer size |
jeroen3 | 2:6013f6d867e5 | 1097 | * |
jeroen3 | 2:6013f6d867e5 | 1098 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 1099 | * |
jeroen3 | 2:6013f6d867e5 | 1100 | * @return Size of memory pool in elements |
jeroen3 | 2:6013f6d867e5 | 1101 | */ |
jeroen3 | 2:6013f6d867e5 | 1102 | uint32_t xifo8_get_size(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 1103 | return c->size; |
jeroen3 | 2:6013f6d867e5 | 1104 | } |
jeroen3 | 2:6013f6d867e5 | 1105 | |
jeroen3 | 2:6013f6d867e5 | 1106 | /** |
jeroen3 | 2:6013f6d867e5 | 1107 | * @brief Get number of used elements |
jeroen3 | 2:6013f6d867e5 | 1108 | * |
jeroen3 | 2:6013f6d867e5 | 1109 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 1110 | * |
jeroen3 | 2:6013f6d867e5 | 1111 | * @return Number of used buffer elements |
jeroen3 | 2:6013f6d867e5 | 1112 | */ |
jeroen3 | 2:6013f6d867e5 | 1113 | uint32_t xifo8_get_used(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 1114 | return c->count; |
jeroen3 | 2:6013f6d867e5 | 1115 | } |
jeroen3 | 2:6013f6d867e5 | 1116 | |
jeroen3 | 2:6013f6d867e5 | 1117 | /** |
jeroen3 | 2:6013f6d867e5 | 1118 | * @brief Get number of free elements |
jeroen3 | 2:6013f6d867e5 | 1119 | * |
jeroen3 | 2:6013f6d867e5 | 1120 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 1121 | * |
jeroen3 | 2:6013f6d867e5 | 1122 | * @return Number of free elements |
jeroen3 | 2:6013f6d867e5 | 1123 | */ |
jeroen3 | 2:6013f6d867e5 | 1124 | uint32_t xifo8_get_free(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 1125 | return c->size - c->count; |
jeroen3 | 2:6013f6d867e5 | 1126 | } |
jeroen3 | 2:6013f6d867e5 | 1127 | |
jeroen3 | 2:6013f6d867e5 | 1128 | /** |
jeroen3 | 2:6013f6d867e5 | 1129 | * @brief Get full flag |
jeroen3 | 2:6013f6d867e5 | 1130 | * |
jeroen3 | 2:6013f6d867e5 | 1131 | * @param[in] c Pointer to @p xifo8_t used for configuration. |
jeroen3 | 2:6013f6d867e5 | 1132 | * |
jeroen3 | 2:6013f6d867e5 | 1133 | * @return 1 if full |
jeroen3 | 2:6013f6d867e5 | 1134 | */ |
jeroen3 | 2:6013f6d867e5 | 1135 | uint32_t xifo8_get_full(xifo8_t *c){ |
jeroen3 | 2:6013f6d867e5 | 1136 | return c->full; |
jeroen3 | 2:6013f6d867e5 | 1137 | } |
jeroen3 | 2:6013f6d867e5 | 1138 | |
jeroen3 | 2:6013f6d867e5 | 1139 | /** @} */ |
jeroen3 | 2:6013f6d867e5 | 1140 | #endif |
jeroen3 | 2:6013f6d867e5 | 1141 | |
jeroen3 | 2:6013f6d867e5 | 1142 | /** @} */ |