96 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdint.h>
 | |
| #include <stdbool.h>
 | |
| #include <stddef.h>
 | |
| #include "FIFOBuffer.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
|  extern "C" {
 | |
| #endif
 | |
| 
 | |
|  bool fifo_isempty(const FIFOBuffer *f) {
 | |
|   return f->head == f->tail;
 | |
| }
 | |
| 
 | |
|  bool fifo_isfull(const FIFOBuffer *f) {
 | |
|   return ((f->head == f->begin) && (f->tail == f->end)) || (f->tail == f->head - 1);
 | |
| }
 | |
| 
 | |
|  void fifo_push(FIFOBuffer *f, unsigned char c) {
 | |
|   *(f->tail) = c;
 | |
|   
 | |
|   if (f->tail == f->end) {
 | |
|     f->tail = f->begin;
 | |
|   } else {
 | |
|     f->tail++;
 | |
|   }
 | |
| }
 | |
| 
 | |
|  unsigned char fifo_pop(FIFOBuffer *f) {
 | |
|   if(f->head == f->end) {
 | |
|     f->head = f->begin;
 | |
|     return *(f->end);
 | |
|   } else {
 | |
|     return *(f->head++);
 | |
|   }
 | |
| }
 | |
| 
 | |
|  void fifo_flush(FIFOBuffer *f) {
 | |
|   f->head = f->tail;
 | |
| }
 | |
| 
 | |
| 
 | |
|  void fifo_init(FIFOBuffer *f, unsigned char *buffer, size_t size) {
 | |
|   f->head = f->tail = f->begin = buffer;
 | |
|   f->end = buffer + size;
 | |
| }
 | |
| 
 | |
| // todo, fix this so it actually displays the amount of data in the fifo
 | |
| // buffer, not just the size allocated for the buffer
 | |
|  size_t fifo_len(FIFOBuffer *f) {
 | |
|   return f->end - f->begin;
 | |
| }
 | |
| 
 | |
|  bool fifo16_isempty(const FIFOBuffer16 *f) {
 | |
|   return f->head == f->tail;
 | |
| }
 | |
| 
 | |
|  bool fifo16_isfull(const FIFOBuffer16 *f) {
 | |
|   return ((f->head == f->begin) && (f->tail == f->end)) || (f->tail == f->head - 1);
 | |
| }
 | |
| 
 | |
|  void fifo16_push(FIFOBuffer16 *f, uint16_t c) {
 | |
|   *(f->tail) = c;
 | |
| 
 | |
|   if (f->tail == f->end) {
 | |
|     f->tail = f->begin;
 | |
|   } else {
 | |
|     f->tail++;
 | |
|   }
 | |
| }
 | |
| 
 | |
|  uint16_t fifo16_pop(FIFOBuffer16 *f) {
 | |
|   if(f->head == f->end) {
 | |
|     f->head = f->begin;
 | |
|     return *(f->end);
 | |
|   } else {
 | |
|     return *(f->head++);
 | |
|   }
 | |
| }
 | |
| 
 | |
|  void fifo16_flush(FIFOBuffer16 *f) {
 | |
|   f->head = f->tail;
 | |
| }
 | |
| 
 | |
|  void fifo16_init(FIFOBuffer16 *f, uint16_t *buffer, uint16_t size) {
 | |
|   f->head = f->tail = f->begin = buffer;
 | |
|   f->end = buffer + size;
 | |
| }
 | |
| 
 | |
|  uint16_t fifo16_len(FIFOBuffer16 *f) {
 | |
|   return (f->end - f->begin);
 | |
| }
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 |