Skip to content

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);    
    }
}