flexPTP 1.0
An IEEE 1588 PTP implementation designed for microcontrollers
Loading...
Searching...
No Matches
ptp_raw_msg_circbuf.c
Go to the documentation of this file.
2
3void ptp_circ_buf_init(PtpCircBuf *pCircBuf, RawPtpMessage *pMsgPool, uint8_t n) {
4 pCircBuf->msgs = pMsgPool;
5 pCircBuf->totalSize = n;
6 pCircBuf->freeBufs = n;
7 pCircBuf->lastReceived = 0;
8 pCircBuf->allocPending = -1;
9}
10
11// allocate packet (CALL ONLY IF THERE IS SPACE AVAILABLE!)
13 if (pCircBuf->freeBufs > 0 && pCircBuf->allocPending == -1) {
14 uint8_t current = (pCircBuf->lastReceived + 1) % pCircBuf->totalSize; // allocate a new packet
15 pCircBuf->allocPending = current;
16 return &(pCircBuf->msgs[current]);
17 } else {
18 return NULL;
19 }
20}
21
23 if (pCircBuf->allocPending != -1) {
24 pCircBuf->lastReceived = pCircBuf->allocPending; // advance last index
25 pCircBuf->freeBufs--; // decrease amount of free buffers
26 pCircBuf->allocPending = -1; // turn off allocation pending flag
27 return pCircBuf->lastReceived;
28 } else {
29 return -1;
30 }
31}
32
34 if (pCircBuf->freeBufs < pCircBuf->totalSize) {
35 pCircBuf->freeBufs++;
36 }
37}
38
39RawPtpMessage *ptp_circ_buf_get(PtpCircBuf *pCircBuf, uint8_t idx) {
40 if (idx < pCircBuf->totalSize) {
41 return &(pCircBuf->msgs[idx]);
42 } else {
43 return NULL;
44 }
45}
RawPtpMessage * ptp_circ_buf_alloc(PtpCircBuf *pCircBuf)
void ptp_circ_buf_free(PtpCircBuf *pCircBuf)
int ptp_circ_buf_commit(PtpCircBuf *pCircBuf)
RawPtpMessage * ptp_circ_buf_get(PtpCircBuf *pCircBuf, uint8_t idx)
void ptp_circ_buf_init(PtpCircBuf *pCircBuf, RawPtpMessage *pMsgPool, uint8_t n)
This module implements a circular buffer that is used for accepting and omitting received and to be t...
"Ring" buffer for PTP-messages.
uint8_t lastReceived
pointer to last received and last processed messages
int allocPending
allocation pending (by index)
RawPtpMessage * msgs
messages
uint8_t totalSize
element count
uint8_t freeBufs
number of free buffers
Raw PTP message structure.
Definition: ptp_types.h:162