11#if PC_ENABLE_TELEMETRY
15void pc_window_init(pc_window *w,
float *buf, uint16_t cap)
25void pc_window_push(pc_window *w,
float sample)
27 if (!w->buf || w->cap == 0)
31 if (w->count == w->cap)
34 float old = w->buf[w->head];
35 w->sum -= (double)old;
36 w->sum_sq -= (double)old * (
double)old;
42 w->buf[w->head] = sample;
43 w->sum += (double)sample;
44 w->sum_sq += (double)sample * (
double)sample;
45 w->head = (uint16_t)((w->head + 1) % w->cap);
48uint16_t pc_window_count(
const pc_window *w)
53float pc_window_mean(
const pc_window *w)
59 return (
float)(w->sum / (double)w->count);
62float pc_window_variance(
const pc_window *w)
68 double mean = w->sum / (double)w->count;
69 double var = w->sum_sq / (double)w->count - mean * mean;
70 return var < 0.0 ? 0.0f : (float)var;
73float pc_window_stddev(
const pc_window *w)
75 return sqrtf(pc_window_variance(w));
78float pc_window_min(
const pc_window *w)
85 for (uint16_t i = 1; i < w->count; i++)
95float pc_window_max(
const pc_window *w)
102 for (uint16_t i = 1; i < w->count; i++)
112void pc_rate_init(pc_rate *r)
114 r->last_value = 0.0f;
119float pc_rate_update(pc_rate *r,
float value, uint32_t now_ms)
123 r->last_value = value;
128 uint32_t dt_ms = (uint32_t)(now_ms - r->last_ms);
132 rate = (value - r->last_value) * 1000.0f / (
float)dt_ms;
134 r->last_value = value;
139void pc_totalizer_init(pc_totalizer *t)
147double pc_totalizer_add(pc_totalizer *t,
float rate, uint32_t now_ms)
156 uint32_t dt_ms = (uint32_t)(now_ms - t->last_ms);
157 double dt_s = (double)dt_ms / 1000.0;
159 t->total += ((double)t->last_rate + (
double)rate) * 0.5 * dt_s;
165double pc_totalizer_total(
const pc_totalizer *t)
170void pc_totalizer_reset(pc_totalizer *t)
Zero-heap telemetry math helpers (PC_ENABLE_TELEMETRY).