Circular FIFO buffer example for fifo->bufSize = 7 (usable size = 6): ****** * * * 0 * * * * * * 1 rp==wp readPtr writePtr * * * 2 * * * * * *
| 76 | * buffer in buff in buff full * |
| 77 | ******************************************************************************/ |
| 78 | size_t |
| 79 | CO_fifo_write(CO_fifo_t* fifo, const uint8_t* buf, size_t count, uint16_t* crc) { |
| 80 | size_t i; |
| 81 | uint8_t* bufDest; |
| 82 | |
| 83 | if ((fifo == NULL) || (fifo->buf == NULL) || (buf == NULL)) { |
| 84 | return 0; |
| 85 | } |
| 86 | |
| 87 | bufDest = &fifo->buf[fifo->writePtr]; |
| 88 | for (i = count; i > 0U; i--) { |
| 89 | size_t writePtrNext = fifo->writePtr + 1U; |
| 90 | |
| 91 | /* is circular buffer full */ |
| 92 | if ((writePtrNext == fifo->readPtr) || ((writePtrNext == fifo->bufSize) && (fifo->readPtr == 0U))) { |
| 93 | break; |
| 94 | } |
| 95 | |
| 96 | *bufDest = *buf; |
| 97 | |
| 98 | #if ((CO_CONFIG_FIFO)&CO_CONFIG_FIFO_CRC16_CCITT) != 0 |
| 99 | if (crc != NULL) { |
| 100 | crc16_ccitt_single(crc, *buf); |
| 101 | } |
| 102 | #endif |
| 103 | |
| 104 | /* increment variables */ |
| 105 | if (writePtrNext == fifo->bufSize) { |
| 106 | fifo->writePtr = 0; |
| 107 | bufDest = &fifo->buf[0]; |
| 108 | } else { |
| 109 | fifo->writePtr++; |
| 110 | bufDest++; |
| 111 | } |
| 112 | buf++; |
| 113 | } |
| 114 | |
| 115 | return count - i; |
| 116 | } |
| 117 | |
| 118 | size_t |
| 119 | CO_fifo_read(CO_fifo_t* fifo, uint8_t* buf, size_t count, bool_t* eof) { |
no test coverage detected