11#if DETWS_ENABLE_TELEMETRY
15void detws_window_init(DetwsWindow *w,
float *buf, uint16_t cap)
25void detws_window_push(DetwsWindow *w,
float sample)
27 if (!w->buf || w->cap == 0)
29 if (w->count == w->cap)
32 float old = w->buf[w->head];
33 w->sum -= (double)old;
34 w->sum_sq -= (double)old * (
double)old;
40 w->buf[w->head] = sample;
41 w->sum += (double)sample;
42 w->sum_sq += (double)sample * (
double)sample;
43 w->head = (uint16_t)((w->head + 1) % w->cap);
46uint16_t detws_window_count(
const DetwsWindow *w)
51float detws_window_mean(
const DetwsWindow *w)
55 return (
float)(w->sum / (double)w->count);
58float detws_window_variance(
const DetwsWindow *w)
62 double mean = w->sum / (double)w->count;
63 double var = w->sum_sq / (double)w->count - mean * mean;
64 return var < 0.0 ? 0.0f : (float)var;
67float detws_window_stddev(
const DetwsWindow *w)
69 return sqrtf(detws_window_variance(w));
72float detws_window_min(
const DetwsWindow *w)
77 for (uint16_t i = 1; i < w->count; i++)
83float detws_window_max(
const DetwsWindow *w)
88 for (uint16_t i = 1; i < w->count; i++)
94void detws_rate_init(DetwsRate *r)
101float detws_rate_update(DetwsRate *r,
float value, uint32_t now_ms)
105 r->last_value = value;
110 uint32_t dt_ms = (uint32_t)(now_ms - r->last_ms);
113 rate = (value - r->last_value) * 1000.0f / (
float)dt_ms;
114 r->last_value = value;
119void detws_totalizer_init(DetwsTotalizer *t)
127double detws_totalizer_add(DetwsTotalizer *t,
float rate, uint32_t now_ms)
136 uint32_t dt_ms = (uint32_t)(now_ms - t->last_ms);
137 double dt_s = (double)dt_ms / 1000.0;
139 t->total += ((double)t->last_rate + (
double)rate) * 0.5 * dt_s;
145double detws_totalizer_total(
const DetwsTotalizer *t)
150void detws_totalizer_reset(DetwsTotalizer *t)
Zero-heap telemetry math helpers (DETWS_ENABLE_TELEMETRY).