77 lines
1.7 KiB
Python
77 lines
1.7 KiB
Python
from collections import deque
|
|
from time import time
|
|
|
|
|
|
class Cacher:
|
|
|
|
def __init__(self):
|
|
self.caches = {}
|
|
|
|
def add_source(self, src, size=100):
|
|
name = src.name
|
|
if not src.is_connected:
|
|
raise RuntimeError(f"source NOT connected: {name}")
|
|
cache = self.add_cache(name, size=size)
|
|
src.add_callback(cache.callback_append)
|
|
return cache
|
|
|
|
def add_cache(self, name, size=100):
|
|
# key contains size in case multiple caches per name with different sizes are needed
|
|
key = (name, size)
|
|
caches = self.caches
|
|
try:
|
|
return caches[key]
|
|
except KeyError:
|
|
caches[key] = cache = Cache(size=size)
|
|
return cache
|
|
|
|
def __repr__(self):
|
|
return repr(self.caches)
|
|
|
|
|
|
class Cache:
|
|
|
|
def __init__(self, size=100):
|
|
self.size = size
|
|
self.times = deque(maxlen=size)
|
|
self.values = deque(maxlen=size)
|
|
|
|
def callback_append(self, value=None, **kwargs):
|
|
self.append(value)
|
|
|
|
def append(self, value):
|
|
self.times.append(time())
|
|
self.values.append(value)
|
|
|
|
@property
|
|
def xy(self):
|
|
return self.times, self.values
|
|
|
|
@property
|
|
def latest(self):
|
|
try:
|
|
return self.values[-1]
|
|
except IndexError:
|
|
return None
|
|
|
|
def __repr__(self):
|
|
n = len(self.times)
|
|
return f"Cache: {n} / {self.size}"
|
|
|
|
def set_size(self, size):
|
|
self.size = size
|
|
self.times = deque(self.times, maxlen=size)
|
|
self.values = deque(self.values, maxlen=size)
|
|
|
|
|
|
|
|
# need to create object here to share it between sessions
|
|
cacher = Cacher()
|
|
|
|
|
|
|
|
#TODO: copy data from existing cache for the same name but different size
|
|
|
|
|
|
|