void DecayCounter::decay(utime_t now, const DecayRate &rate)
{
- utime_t el = now;
- el -= last_decay;
+ if (now >= last_decay) {
+ double el = (double)(now - last_decay);
+ if (el >= 1.0) {
+ // calculate new value
+ double newval = (val+delta) * exp(el * rate.k);
+ if (newval < .01)
+ newval = 0.0;
- if (el.sec() >= 1) {
- // calculate new value
- double newval = (val+delta) * exp((double)el * rate.k);
- if (newval < .01)
- newval = 0.0;
+ // calculate velocity approx
+ vel += (newval - val) * el;
+ vel *= exp(el * rate.k);
- // calculate velocity approx
- vel += (newval - val) * (double)el;
- vel *= exp((double)el * rate.k);
-
- val = newval;
- delta = 0;
- last_decay = now;
+ val = newval;
+ delta = 0;
+ last_decay = now;
+ }
+ } else {
+ last_decay = now;
}
}