#include "can_buffer.h"
void can_buffer_init(volatile CanBuffer *buffer)
{
memset((void*)buffer, 0, sizeof(CanBuffer));
}
CanBufferStatus can_buffer_add(volatile CanBuffer *buffer, CanRxMsgTypeDef *msg)
{
if ((uint16_t) buffer->count < ((uint16_t) CAN_BUFFER_SIZE)) {
buffer->data[buffer->head] = *msg;
buffer->head = (buffer->head + 1) % CAN_BUFFER_SIZE;
buffer->count++;
return CAN_BUFFER_OK;
}
else {
return CAN_BUFFER_FULL;
}
}
volatile CanRxMsgTypeDef* can_buffer_remove(volatile CanBuffer *buffer)
{
volatile CanRxMsgTypeDef* msg = NULL;
if (buffer->count > 0) {
msg = &buffer->data[buffer->tail];
buffer->tail = (buffer->tail + 1) % CAN_BUFFER_SIZE;
buffer->count--;
}
return msg;
}
bool can_buffer_is_empty(volatile CanBuffer *buffer)
{
return (buffer->count < 1);
}
uint8_t can_buffer_size(volatile CanBuffer *buffer)
{
return buffer->count;
}