Fixed plot data by implementing it the numpy way :D
This commit is contained in:
parent
519b248261
commit
d812c00b7c
78
plot_data.py
78
plot_data.py
@ -4,15 +4,19 @@ from datetime import datetime, timedelta
|
|||||||
|
|
||||||
class PlotData():
|
class PlotData():
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.refresh_rate = 1 # ms
|
|
||||||
self.timeout = 100 # cycles
|
#resolution * timeout must be at least 2-3 times higher then the slowest refresh rate
|
||||||
self.data = {"time": np.array([0])}
|
self.resolution = 100 # ms
|
||||||
|
self.timeout = 100 #cycles
|
||||||
|
self.data = {"time": np.array([])}
|
||||||
self.start_time = datetime.utcnow()
|
self.start_time = datetime.utcnow()
|
||||||
self.queues = {}
|
self.queues = {}
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
|
print("clear")
|
||||||
for key in self.data:
|
for key in self.data:
|
||||||
self.data[key] = np.array([])
|
self.data[key] = np.array([])
|
||||||
|
self.start_time = datetime.utcnow()
|
||||||
|
|
||||||
def get(self, key):
|
def get(self, key):
|
||||||
return self.data.get(key, np.full_like(self.data["time"], np.nan, dtype=np.double))
|
return self.data.get(key, np.full_like(self.data["time"], np.nan, dtype=np.double))
|
||||||
@ -22,45 +26,41 @@ class PlotData():
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
if sensor_name not in self.data:
|
if sensor_name not in self.data:
|
||||||
self.queues[sensor_name] = []
|
self.queues[sensor_name] = ([],[])
|
||||||
self.data[sensor_name] = np.full_like(self.data["time"], np.nan, dtype=np.double)
|
self.data[sensor_name] = np.full_like(self.data["time"], np.nan, dtype=np.double)
|
||||||
for time, dat in zip(data[0], data[1]):
|
for time, dat in zip(data[0], data[1]):
|
||||||
self.queues[sensor_name].append((time, dat))
|
self.queues[sensor_name][0].append((time-self.start_time)/ timedelta(milliseconds=self.resolution))
|
||||||
|
self.queues[sensor_name][1].append(dat)
|
||||||
|
self.extend_timeline()
|
||||||
|
self.sort_in_queue()
|
||||||
|
#self.drop_old()
|
||||||
|
|
||||||
running = True
|
def extend_timeline(self):
|
||||||
while running:
|
#extend numpy arrays with passed time
|
||||||
# TODO timeout clean and time clean
|
#unknown values are filled with nans
|
||||||
for sensor, que in self.queues.items():
|
end = (datetime.utcnow()-self.start_time)/timedelta(milliseconds=self.resolution)
|
||||||
index = -1
|
print(end, self.start_time)
|
||||||
for time, _ in que:
|
|
||||||
if time < self.start_time \
|
|
||||||
+ timedelta(milliseconds=int(self.data["time"][-1]) + self.refresh_rate):
|
|
||||||
index += 1
|
|
||||||
if index >= 0:
|
|
||||||
self.queues[sensor] = que[index:]
|
|
||||||
#TODO timeout not working as intended
|
|
||||||
#if timeout is reached add empty values on sensors
|
|
||||||
#if self.start_time + timedelta(milliseconds=int(self.data["time"][-1])+self.timeout) < datetime.utcnow():
|
|
||||||
# for sensor, que in self.queues.items():
|
|
||||||
# if len(que) == 0:
|
|
||||||
# que.append((self.start_time,np.nan))
|
|
||||||
|
|
||||||
for que in self.queues.values():
|
self.data["time"] = np.arange(0, end, 1).astype(np.double)
|
||||||
if len(que) == 0:
|
for key in self.data:
|
||||||
running = False
|
if key != "time":
|
||||||
return
|
pad_length = self.data["time"].size-self.data[key].size
|
||||||
|
self.data[key] = np.pad(self.data[key], (0,pad_length), mode="constant", constant_values=np.nan)
|
||||||
|
|
||||||
for sensor, que in self.queues.items():
|
def sort_in_queue(self):
|
||||||
self.data[sensor] = np.append(self.data[sensor], que[0][1])
|
#linear interpolation and adding it to the array
|
||||||
self.queues[sensor] = que[1:]
|
for key in self.queues:
|
||||||
self.data["time"] = np.append(self.data["time"],self.data["time"][-1]+self.refresh_rate)
|
time = np.array(self.queues[key][0])
|
||||||
|
data = np.array(self.queues[key][1])
|
||||||
|
if time.size > 1:
|
||||||
|
inter = np.interp(self.data["time"], time, data)
|
||||||
|
self.data[key] = inter#np.where(np.isnan(inter), self.data[key], inter)
|
||||||
|
|
||||||
|
def drop_old(self):
|
||||||
|
for key in self.queues:
|
||||||
|
time = np.array(self.queues[key][0])
|
||||||
|
old = self.data["time"][-1]-(self.timeout)
|
||||||
|
if time.size>2:
|
||||||
|
drop_index = (np.where(time < old)[0])[-1]
|
||||||
|
self.queues[key] = (self.queues[key][0][drop_index:],self.queues[key][1][drop_index:])
|
||||||
|
|
||||||
"""
|
|
||||||
TODO
|
|
||||||
while true
|
|
||||||
clean delte all to old values
|
|
||||||
for q in que:
|
|
||||||
if q is empty
|
|
||||||
return
|
|
||||||
update np array
|
|
||||||
"""
|
|
||||||
|
Loading…
Reference in New Issue
Block a user