osmo-e1d/src/octoi/frame_rifo.h

52 lines
1.4 KiB
C

#pragma once
#include "frame_fifo.h"
struct frame_rifo {
uint8_t *next_out; /* where to read next output from FIFO */
uint8_t buf[BYTES_PER_FRAME * FRAMES_PER_FIFO];
uint32_t last_in_fn; /* frame number of most recently inserted frame */
uint32_t next_out_fn; /* frame number of next output frame */
uint8_t bitvec[FRAMES_PER_FIFO/8];
/* bit-vector of occupied (data received) slots in FIFO,
indexed by physical offset in buf */
};
/* can this frame number be stores in the rifo */
static inline bool frame_rifo_fn_in_range(const struct frame_rifo *ff, uint32_t fn)
{
uint32_t d = fn - ff->next_out_fn;
return d < FRAMES_PER_FIFO;
}
/* current depth of RIFO */
static inline unsigned int frame_rifo_depth(struct frame_rifo *rifo)
{
return rifo->last_in_fn - rifo->next_out_fn + 1;
}
void frame_rifo_init(struct frame_rifo *rifo, uint32_t fn);
/* number of frames currently available in FIFO */
static inline unsigned int frame_rifo_frames(struct frame_rifo *rifo)
{
unsigned int byte, bit;
unsigned int frame_count = 0;
for (byte = 0; byte < sizeof(rifo->bitvec); byte++) {
for (bit = 0; bit < 8; bit++) {
if (rifo->bitvec[byte] & (1 << bit))
frame_count++;
}
}
return frame_count;
}
/* put a received frame into the FIFO */
int frame_rifo_in(struct frame_rifo *rifo, const uint8_t *frame, uint32_t fn);
/* pull one frame out of the FIFO */
int frame_rifo_out(struct frame_rifo *rifo, uint8_t *out);