from json import loads as json_parse, dumps as _json_stringify from socket import if_nametoindex from typing import Dict, List, Optional, Any from xml.dom.expatbuilder import parseString import paho.mqtt.client as mqtt from biopro.text import * from .task import Task _RUNTIME_COMPILE = False def json_stringify(o: Any) -> str: return _json_stringify(o, separators=(',', ':')) class TaskManager(): def __init__(self, task_list): self._task_list = [] self._next_task = [] self._prev_task = None self._running_task = None self.load_task_list(task_list) # self.set_running_task(self._task_list[0]) # self._running_task.run() self._next_task.append(self._task_list[0]) @property def task_list(self): return self._task_list @property def export_task_list(self): return [d.as_json() for d in self._task_list] @property def prev_task(self): return self._prev_task @property def running_task(self): return self._running_task @property def next_task(self): return self._next_task @property def check_list(self): return [self._running_task, *self._next_task] @property def check_list(self): return [self._running_task, *self._next_task] def load_task_list(self, task_list): for task in task_list: task = Task(task) self._task_list.append(task) def set_running_task(self, task): try: # if there is task running & same task active ,then reject if self._running_task != None and self._running_task.uuid == task.uuid: return False # save running task self._prev_task = self._running_task # clear next task list self._next_task.clear() self._running_task = task self._running_task.run() if self._prev_task != None: # if previous task is still running, then need to close if self._prev_task.status == 1: self._prev_task.stop() print('prev', 'run', self._prev_task.name, self._running_task.name) for task_uuid in self._running_task.next: _task = next((task for task in self._task_list if task.uuid == task_uuid), None) if _task != None: self._next_task.append(_task) except RuntimeError as e: print(e) def get_task(self, task_id): return self._task_list[task_id]