42 lines
878 B
Python
42 lines
878 B
Python
import time
|
|
|
|
|
|
class Rate:
|
|
def __init__(self, cap):
|
|
self._cap = cap
|
|
self._t = None
|
|
|
|
def step(self, t):
|
|
if self._t is None:
|
|
self._t = t
|
|
return True
|
|
|
|
elapsed = t - self._t
|
|
if elapsed < self._cap:
|
|
return False
|
|
self._t += self._cap
|
|
return True
|
|
|
|
|
|
class SlewLimiter:
|
|
def __init__(self, rate: float, now=time.time):
|
|
self._rate = rate
|
|
self._a = None
|
|
self._t = None
|
|
self._now = now
|
|
|
|
def __call__(self, v: float) -> float:
|
|
if self._rate is None:
|
|
return v
|
|
|
|
now = self._now()
|
|
if self._t is None:
|
|
self._v = v
|
|
else:
|
|
limit = self._rate * (now - self._t)
|
|
delta = min(limit, max(-limit, v - self._v))
|
|
self._v += delta
|
|
|
|
self._t = now
|
|
return self._v
|