import json from enum import Enum from utils.value import AttributeChange class SudState(Enum): IDLE = 0 RAMPING = 1 HOLDING = 2 WAIT_USER = 3 DONE = 4 class Sud(AttributeChange): def __init__(self, path): AttributeChange.__init__(self) with open(path) as f: data = json.load(f) self.name = data.get('Name', '') self.description = data.get('Description', '') self.schedule = data['schedule'] self.index = -1 self.hold_remaining = 0.0 self.state = SudState.IDLE self.step = None self.user_message = None def start(self): if self.state != SudState.IDLE: return self.index = -1 self._advance() def confirm(self): if self.state == SudState.WAIT_USER: self._advance() def temp_reached(self): if self.state == SudState.RAMPING: self._finish_step() def tick(self, dt): if self.state == SudState.HOLDING: self.hold_remaining -= dt if self.hold_remaining <= 0: self._finish_step() def _advance(self): self.index += 1 if self.index >= len(self.schedule): self.state = SudState.DONE self.user_message = None self.step = None return next_step = self.schedule[self.index] if next_step['type'] == 'heat': self.state = SudState.RAMPING else: self.hold_remaining = next_step.get('duration', 0) * 60.0 self.state = SudState.HOLDING self.user_message = next_step.get('user_message') self.step = next_step def _finish_step(self): if self.step.get('user_wait_for_continue', False): self.state = SudState.WAIT_USER else: self._advance()