flexPTP-basic/ptp_raw_msg_circbuf.c
2023-04-27 08:23:40 +00:00

47 lines
1.3 KiB
C

#include <flexptp/ptp_raw_msg_circbuf.h>
void ptp_circ_buf_init(PtpCircBuf * pCircBuf, RawPtpMessage * pMsgPool, uint8_t n)
{
pCircBuf->msgs = pMsgPool;
pCircBuf->totalSize = n;
pCircBuf->freeBufs = n;
pCircBuf->lastReceived = 0;
pCircBuf->allocPending = -1;
}
// allocate packet (CALL ONLY IF THERE IS SPACE AVAILABLE!)
RawPtpMessage *ptp_circ_buf_alloc(PtpCircBuf * pCircBuf)
{
if (pCircBuf->freeBufs > 0 && pCircBuf->allocPending == -1) {
uint8_t current = (pCircBuf->lastReceived + 1) % pCircBuf->totalSize; // allocate a new packet
pCircBuf->allocPending = current;
return &(pCircBuf->msgs[current]);
} else {
return NULL;
}
}
int ptp_circ_buf_commit(PtpCircBuf * pCircBuf)
{
if (pCircBuf->allocPending != -1) {
pCircBuf->lastReceived = pCircBuf->allocPending; // advance last index
pCircBuf->freeBufs--; // decrease amount of free buffers
pCircBuf->allocPending = -1; // turn off allocation pending flag
return pCircBuf->lastReceived;
} else {
return -1;
}
}
void ptp_circ_buf_free(PtpCircBuf * pCircBuf)
{
if (pCircBuf->freeBufs < pCircBuf->totalSize) {
pCircBuf->freeBufs++;
}
}
RawPtpMessage *ptp_circ_buf_get(PtpCircBuf * pCircBuf, uint8_t idx)
{
return &(pCircBuf->msgs[idx]);
}