From f5336ec2a11bfad2fc3ca4df7cfaf65349e0564d Mon Sep 17 00:00:00 2001 From: James Kirikland Garner Date: Wed, 14 Dec 2022 16:32:10 -0800 Subject: [PATCH] Speeding up simulator. --- lib/oven.py | 22 +++++++++++++++++++--- lib/ovenWatcher.py | 9 ++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/oven.py b/lib/oven.py index 7503fac..45fd05e 100644 --- a/lib/oven.py +++ b/lib/oven.py @@ -243,6 +243,9 @@ class Oven(threading.Thread): self.reset() self.save_automatic_restart_state() + def get_start_time(self): + return datetime.datetime.now() - datetime.timedelta(milliseconds = self.runtime * 1000) + def kiln_must_catch_up(self): '''shift the whole schedule forward in time by one time_step to wait for the kiln to catch up''' @@ -252,11 +255,11 @@ class Oven(threading.Thread): # kiln too cold, wait for it to heat up if self.target - temp > config.pid_control_window: log.info("kiln must catch up, too cold, shifting schedule") - self.start_time = datetime.datetime.now() - datetime.timedelta(milliseconds = self.runtime * 1000) + self.start_time = self.get_start_time() # kiln too hot, wait for it to cool down if temp - self.target > config.pid_control_window: log.info("kiln must catch up, too hot, shifting schedule") - self.start_time = datetime.datetime.now() - datetime.timedelta(milliseconds = self.runtime * 1000) + self.start_time = self.get_start_time() def update_runtime(self): @@ -414,6 +417,7 @@ class SimulatedOven(Oven): self.R_o_nocool = config.sim_R_o_nocool self.R_ho_noair = config.sim_R_ho_noair self.R_ho = self.R_ho_noair + self.speedup_factor = 10 # set temps to the temp of the surrounding environment self.t = self.t_env # deg C temp of oven @@ -425,6 +429,18 @@ class SimulatedOven(Oven): self.start() log.info("SimulatedOven started") + # runtime is in sped up time, start_time is actual time of day + def get_start_time(self): + return datetime.datetime.now() - datetime.timedelta(milliseconds = self.runtime * 1000 / self.speedup_factor) + + def update_runtime(self): + + runtime_delta = datetime.datetime.now() - self.start_time + if runtime_delta.total_seconds() < 0: + runtime_delta = datetime.timedelta(0) + + self.runtime = runtime_delta.total_seconds() * self.speedup_factor + def heating_energy(self,pid): # using pid here simulates the element being on for # only part of the time_step @@ -489,7 +505,7 @@ class SimulatedOven(Oven): # we don't actually spend time heating & cooling during # a simulation, so sleep. - time.sleep(self.time_step) + time.sleep(self.time_step / self.speedup_factor) class RealOven(Oven): diff --git a/lib/ovenWatcher.py b/lib/ovenWatcher.py index 3e47e4f..19dd2ad 100644 --- a/lib/ovenWatcher.py +++ b/lib/ovenWatcher.py @@ -1,4 +1,6 @@ import threading,logging,json,time,datetime + +import config from oven import Oven log = logging.getLogger(__name__) @@ -32,7 +34,12 @@ class OvenWatcher(threading.Thread): else: self.recording = False self.notify_all(oven_state) - time.sleep(self.oven.time_step) + + if config.simulate: + time.sleep(self.oven.time_step / self.oven.speedup_factor) + else: + time.sleep(self.oven.time_step) + def lastlog_subset(self,maxpts=50): '''send about maxpts from lastlog by skipping unwanted data'''