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

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?

UserRevisionLine numberNew 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 /** @} */