import time from tasks.server_log import ServerLogTask from components import APid, AHeater def _safe_filename_part(text): return "".join(c if c.isalnum() or c in "-_" else "_" for c in text) or "Sud" class SudLogTask(ServerLogTask): """Records temp/power samples for a single Sud run - same sample format as ServerLogTask, but only while a run is active: recording starts on Play and is written out on Stop (or natural completion), to logs/log_{date_time}_{sud_name}.log. A Pause/resume doesn't start a new file - only a fresh Play (from IDLE/DONE) does.""" def __init__(self, tc: APid, heater: AHeater, heater_task, sud, interval, path='./logs', config=None, dt=None, log_interval=None): ServerLogTask.__init__(self, tc, heater, heater_task, interval, path, config, dt, log_interval) self.sud = sud self._active = False def _should_sample(self): return self._active def _filename(self): name_part = _safe_filename_part(self.sud.name or 'Sud') return 'log_{}_{}.log'.format(self._run_id, name_part) def start_run(self): if self._active: return self._samples = [] self._t0 = time.monotonic() self._last_write = self._t0 self._run_id = time.strftime("%Y%m%dT%H%M%S", time.localtime()) self._active = True def stop_run(self): if not self._active: return self._active = False self.write() self._param_events = []