Add PaceFilter
A PaceFilter
stores the smallest pace sample encountered in a predefined window (after which the minimal sample expires and the filter returns 0 until it gets a new sample).
paceFilter.h
typedef struct prrtPaceFilter {
prrtTimedelta window_us;
bool valid;
prrtTimestamp updated;
prrtTimedelta value;
} PrrtPaceFilter;
PrrtPaceFilter* PrrtPaceFilter_create(prrtTimedelta window_us);
bool PrrtPaceFilter_destroy(PrrtPaceFilter* filter);
prrtTimedelta PrrtPaceFilter_get(PrrtPaceFilter* filter);
void PrrtPaceFilter_update(PrrtPaceFilter* filter, prrtTimedelta value);
paceFilter.c
PrrtPaceFilter* PrrtPaceFilter_create(int window_us) {
...
}
bool PrrtPaceFilter_destroy(PrrtPaceFilter* filter) {
...
}
void inline invalidate(PrrtPaceFilter* filter) {
filter->valid = false;
filter->updated = now;
filter->value = 0;
}
prrtTimedelta PrrtPaceFilter_get(PrrtPaceFilter* filter) {
prrtTimestamp now = PrrtClock_get_current_time_us();
if (filter->updated + filter->length < now) {
invalidate(filter);
}
return value;
}
void PrrtPaceFilter_update(PrrtPaceFilter* filter, prrtTimedelta value) {
prrtTimestamp now = PrrtClock_get_current_time_us();
if (filter->valid == false) {
filter->value = value;
filter->valid = true;
filter->updated = now
} else {
if (value < filter->value) {
filter->value = value;
filter->updated = now;
} else {
// ignore sample
}
}
if (filter->updated + filter->length < now) {
invalidate(filter);
}
}