wayne roberts / libscpi

Dependents:   scpi_sx127x scpi_sx127x_firstTest MLX90418_I2C_master

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers fifo.c Source File

fifo.c

00001 
00002 #include "fifo_private.h"
00003 
00004 /**
00005  * Initialize fifo
00006  * @param fifo
00007  */
00008 void fifo_init(scpi_fifo_t * fifo) {
00009     fifo->wr = 0;
00010     fifo->rd = 0;
00011     fifo->size = FIFO_SIZE;
00012 }
00013 
00014 /**
00015  * Empty fifo
00016  * @param fifo
00017  */
00018 void fifo_clear(scpi_fifo_t * fifo) {
00019     fifo->wr = 0;
00020     fifo->rd = 0;
00021 }
00022 
00023 /**
00024  * Add element to fifo. If fifo is full, remove last element.
00025  * @param fifo
00026  * @param value
00027  * @return 
00028  */
00029 scpi_bool_t fifo_add(scpi_fifo_t * fifo, int16_t value) {
00030     /* FIFO full? */
00031     if (fifo->wr == ((fifo->rd + fifo->size) % (fifo->size + 1))) {
00032         fifo_remove(fifo, NULL);
00033     }
00034 
00035     fifo->data[fifo->wr] = value;
00036     fifo->wr = (fifo->wr + 1) % (fifo->size + 1);
00037 
00038     return TRUE;
00039 }
00040 
00041 /**
00042  * Remove element form fifo
00043  * @param fifo
00044  * @param value
00045  * @return FALSE - fifo is empty
00046  */
00047 scpi_bool_t fifo_remove(scpi_fifo_t * fifo, int16_t * value) {
00048     /* FIFO empty? */
00049     if (fifo->wr == fifo->rd) {
00050         return FALSE;
00051     }
00052 
00053     if(value) {
00054         *value = fifo->data[fifo->rd];
00055     }
00056 
00057     fifo->rd = (fifo->rd + 1) % (fifo->size + 1);
00058 
00059     return TRUE;
00060 }
00061 
00062 /**
00063  * Retrive number of elements in fifo
00064  * @param fifo
00065  * @param value
00066  * @return 
00067  */
00068 scpi_bool_t fifo_count(scpi_fifo_t * fifo, int16_t * value) {
00069     *value = fifo->wr - fifo->rd;
00070     if (*value < 0) {
00071         *value += (fifo->size + 1);
00072     }
00073     return TRUE;
00074 }