diff --git a/src/monitor.c b/src/monitor.c new file mode 100644 index 0000000..c9607c1 --- /dev/null +++ b/src/monitor.c @@ -0,0 +1,22 @@ +#include "monitor.h" +#include + +void monitor_init(monitor_t *monitor) { if (monitor) memset(monitor, 0, sizeof(*monitor)); } + +frame_result_t monitor_accept(monitor_t *monitor, const uint8_t *bytes, size_t length) { + sample_t sample; + if (!monitor) return FRAME_SHORT; + frame_result_t result = decode_frame(bytes, length, &sample); + if (result != FRAME_OK) { monitor->rejected++; return result; } + if (monitor->has_last) { + uint16_t delta = (uint16_t)(sample.sequence - monitor->last_sequence); + if (delta == 0) { monitor->duplicate++; monitor->rejected++; return FRAME_DUPLICATE; } + if (delta > 32767) { monitor->rollback++; monitor->rejected++; return FRAME_ROLLBACK; } + if (delta > 1) monitor->lost += delta - 1; + } + monitor->accepted++; + monitor->last_sequence = sample.sequence; + monitor->last_sample = sample; + monitor->has_last = 1; + return FRAME_OK; +}