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 from copy import copy, deepcopy _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) # original version """ 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 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: # print('set_running_task return false: ', self._running_task.name) 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) # print(f'!!@#!set_running_task\n\n\n{task._cycle_count}\n{task._cycle}\n\n\n') if task._cycle_count < task._cycle: task._cycle_count += 1 cycle_target = deepcopy(self._task_list[task._cycle_next]) # TODO: not sure deep or shallow cycle_target.reset() # print('!!@#!status: ', cycle_target.status) # self._task_list[task._cycle_next].status = 0 self._next_task.append(cycle_target) # print('!!@#!append what: ', cycle_target) else: task._cycle_count = 0 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: _task.reset() # print('!@#WATCH', _task.status) # print('!@#_task._cycle_count: ', _task._cycle_count) _task_copy = deepcopy(_task) # TODO: here fix one bug, and make another, due to the second time "stop" condition will be trigger in this way, while the number of cycle will be reset self._next_task.append(_task_copy) except RuntimeError as e: print(e) """ def set_cycle_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 print(f'!!@#!\n\n\n{task._cycle_count}\n{task._cycle}\n\n\n') if task._cycle_count < task._cycle: task._cycle_count += 1 self._next_task.append(self._task_list[task._cycle_next]) else: task._cycle_count = 0 except RuntimeError as e: print(e) """ """ def set_cycle_task(self): try: print(f'!!@#!set_cycle_task\n\n\n{self._running_task._cycle_count}\n{self._running_task._cycle}\n\n\n') if self._running_task._cycle_count < self._running_task._cycle: self._running_task._cycle_count += 1 self._next_task.append(self._task_list[self._running_task._cycle_next]) else: self._running_task._cycle_count = 0 except RuntimeError as e: print(e) """ def get_task(self, task_id): return self._task_list[task_id]