From 1dd4ae2ce4cb0d0e239559f32181b85a8b19389f Mon Sep 17 00:00:00 2001 From: peterlu14 Date: Wed, 4 May 2022 18:07:05 +0800 Subject: [PATCH] [update] add stop project api & fix uuid problem & get all projects & as_json problem --- python/biopro/controller.py | 9 ++++-- python/biopro/project/project.py | 39 ++++++++++++++++-------- python/biopro/project/project_manager.py | 16 +++++++--- python/biopro/project/task_manager.py | 4 +++ python/biopro/server/main.py | 17 +++++++++-- 5 files changed, 62 insertions(+), 23 deletions(-) diff --git a/python/biopro/controller.py b/python/biopro/controller.py index 0f44e9e..7a56e90 100644 --- a/python/biopro/controller.py +++ b/python/biopro/controller.py @@ -1578,10 +1578,13 @@ class ControlAPI(metaclass=Router): raise NotImplementedError() def run_project(self, project) -> bool: - print('create_project', project) - self._project_manager.create(project) - return False + raise NotImplementedError() + def get_running_project(self) -> bool: + raise NotImplementedError() + + def stop_project(self, project) -> bool: + raise NotImplementedError() # noinspection PyAbstractClass class ControlClient(SocketClient, ControlAPI, metaclass=SocketClientMacro(ControlAPI)): diff --git a/python/biopro/project/project.py b/python/biopro/project/project.py index 1a0d4ba..f47771a 100644 --- a/python/biopro/project/project.py +++ b/python/biopro/project/project.py @@ -29,16 +29,18 @@ class Project(threading.Thread): self._end_time = None self._id = None - self._uuid = uuid4() + self._uuid = str(uuid4()) self._name = None self._desc = None self._device = None self._complete_device = [] - self._status = None + self._status = 0 self._instruction_set = Instruction() self._stop_flag = False + self._task_manager = None + self.setup_project(project) self.setup_device(self._device) @@ -49,6 +51,8 @@ class Project(threading.Thread): if key == 'task': self._task_manager = TaskManager(project['task']) + elif key == 'uuid': + pass else: setattr(self, key, value) @@ -107,17 +111,17 @@ class Project(threading.Thread): @property def task_list(self): - return self.task_manager.task_list + return self._task_manager.export_task_list - @property def mqtt_thread(self): return self._mqtt_thread def run(self): + self._status = 1 self._start_time = time() - - self.mqtt_thread.broadcast_command('project:' + self._name + ' start_at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) + self.mqtt_thread.broadcast_command('project:' + self._name + ' start at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) + while not self._stop_flag : # check running task first delay_time = 0 @@ -165,7 +169,6 @@ class Project(threading.Thread): # check project done then close project if self.check_project_done() == True: - self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) print('project stop at', datetime.now()) self.close() @@ -176,9 +179,19 @@ class Project(threading.Thread): # TODO pass - def close(self): + def stop(self): + self._task_manager.running_task.stop() + self.mqtt_thread.broadcast_command('project:task ' + str(self._task_manager.running_task.name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) + self._status = 2 self._end_time = time() self._stop_flag = True + self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) + + def close(self): + self._status = 2 + self._end_time = time() + self._stop_flag = True + self.mqtt_thread.broadcast_command('project:project ' + str(self._name) + ' stop at ' + datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) def check_project_done(self): for task in self._task_manager.task_list: @@ -191,19 +204,21 @@ class Project(threading.Thread): # if no running task if self._task_manager.running_task == None: return False - device_list = self._task_manager.running_task.device - for device in device_list: + + for device in self._task_manager.running_task.device: if self._complete_device[device].status == 1: return False return True def as_json(self): - return { + data = { 'id': self._id, 'name': self._name, 'uuid': self._uuid, 'desc': self._desc, 'status': self._status, 'device': self._device, - 'task_list': self.task_list, + 'task': self.task_list, + 'running_task': self._task_manager.running_task.as_json() } + return data diff --git a/python/biopro/project/project_manager.py b/python/biopro/project/project_manager.py index 08099a4..3243d15 100644 --- a/python/biopro/project/project_manager.py +++ b/python/biopro/project/project_manager.py @@ -23,11 +23,17 @@ class ProjectManager(): self._project_list[index].stop() del self._project_list[index] - def get(self): - return self._project_list + def get(self, project_uuid = None): + if project_uuid == None: + return self._project_list + else: + for project in self._project_list: + if project.uuid == project_uuid: + return project - def run(self, project): + def run_project(self, project): project.start() - def stop(self, project): - project.stop() + def stop_project(self, project): + _project = self.get(project) + _project.stop() diff --git a/python/biopro/project/task_manager.py b/python/biopro/project/task_manager.py index 34c2ea8..c732147 100644 --- a/python/biopro/project/task_manager.py +++ b/python/biopro/project/task_manager.py @@ -28,6 +28,10 @@ class TaskManager(): 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 diff --git a/python/biopro/server/main.py b/python/biopro/server/main.py index 929d5c2..f68ee14 100644 --- a/python/biopro/server/main.py +++ b/python/biopro/server/main.py @@ -1014,9 +1014,20 @@ class ControlServer(SocketServer, ControlServerAPI): @logging_info def run_project(self, project) -> bool: - project = self._project_manager.create(project) - self._project_manager.run(project) - return False + if project is not None: + project = self._project_manager.create(project) + self._project_manager.run_project(project) + return project.as_json() + + @logging_info + def stop_project(self, project) -> bool: + if project is not None: + self._project_manager.stop_project(project) + return True + + @logging_info + def get_running_project(self) -> bool: + return self._project_manager.get() @logging_info def device_internal_command(self, device: int, oper: str, value: Any) -> bool: