Files
PFC/Code/STM32/Core/Src/Components/StaticFIFO.cpp

79 lines
2.2 KiB
C++

/*
* DebugFIFO.cpp
*
* Created on: May 26, 2022
* Author: Gabriel
*/
#include "StaticFIFO.hpp"
#include <cstring>
StaticFIFO::StaticFIFO(uint32_t fifoSize) : fifoSize(fifoSize){
fifo = new StringContainer[fifoSize];
}
StaticFIFO::~StaticFIFO() {
delete fifo;
}
int32_t StaticFIFO::push(const char* string){
if (((fifoSize + firstIdx) - lastIdx) % fifoSize == 1) {
return 0; //overflow
}else if(strlen(string) + 1 > bufSize){
return -2; //length limit
}
StringContainer stringContainer;
for(uint32_t i=0; i < (strlen(string) + 1); i++){
stringContainer.buffer[i] = string[i];
}
stringContainer.length = strlen(string) + 1;
fifo[lastIdx] = stringContainer;
lastIdx = (lastIdx + 1) % fifoSize;
return (((fifoSize + lastIdx) - firstIdx) % fifoSize);
}
int32_t StaticFIFO::push(uint8_t* pointer, uint32_t length){
if (((fifoSize + firstIdx) - lastIdx) % fifoSize == 1) {
return 0; //overflow
}else if(length > bufSize){
return -2; //length limit
}
StringContainer stringContainer;
for(uint32_t i=0; i < length; i++){
stringContainer.buffer[i] = pointer[i];
}
stringContainer.length = length;
fifo[lastIdx] = stringContainer;
lastIdx = (lastIdx + 1) % fifoSize;
return (((fifoSize + lastIdx) - firstIdx) % fifoSize);
}
int32_t StaticFIFO::push(char* stringPointer, uint32_t stringLength){
if (((fifoSize + firstIdx) - lastIdx) % fifoSize == 1) {
return 0; //overflow
}else if(stringLength > bufSize){
return -2; //length limit
}
StringContainer stringContainer;
for(uint32_t i=0; i < (stringLength); i++){
stringContainer.buffer[i] = stringPointer[i];
}
stringContainer.length = stringLength;
fifo[lastIdx] = stringContainer;
lastIdx = (lastIdx + 1) % fifoSize;
return (((fifoSize + lastIdx) - firstIdx) % fifoSize);
}
int32_t StaticFIFO::pop(uint8_t** pointer, uint32_t* length, uint32_t max_length){
if (lastIdx == firstIdx){
return -1; //underrun
}else if(fifo[firstIdx].length > max_length){
return -2; //length limit
}
*pointer = fifo[firstIdx].buffer;
*length = fifo[firstIdx].length;
firstIdx = (firstIdx + 1) % fifoSize;
return (((fifoSize + lastIdx) - firstIdx) % fifoSize);
}