diff --git a/ihm.py b/ihm.py index 82ece822684ace85b10419a90063b6183b90ad82..9236072694c623cfbbe317c41faaf04907f1e898 100644 --- a/ihm.py +++ b/ihm.py @@ -1,5 +1,5 @@ -import subprocess import sys +from subprocess import Popen from os import path from time import sleep @@ -7,7 +7,6 @@ from mqtt_client import MqttClient from ssh_client import SSHClient, Cmd, RemoteClient from update import VersionManager - class Ihm(MqttClient, SSHClient): def __init__(self): @@ -24,10 +23,12 @@ class Ihm(MqttClient, SSHClient): print("\n") cmd = input(">") + # Envoie un signal a tout le monde pour exit if cmd.lower() == "exit": self.client.publish("ihm/exit") exit_bool = True + # cherche tout les potentiel agents sur les raspberry et les tuent if cmd.lower() == "kill": commands = [ @@ -49,6 +50,7 @@ class Ihm(MqttClient, SSHClient): print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) self.run_cmd(i_client, commands) + # affiche tout les agents en vie if cmd.lower() == "agent": commands = [ Cmd( @@ -59,11 +61,13 @@ class Ihm(MqttClient, SSHClient): print("Hostname :", self.clients[i_client].hostname, " User :", self.clients[i_client].user) self.run_cmd(i_client, commands) + # automatise la mise a jour de l'exerience sur les raspberry if cmd.lower() == "update": r = RemoteClient("192.168.105.18", "pi", "raspberry") updater = VersionManager(r) updater.update() + # charge une experience et verifie le format if cmd.lower() == "load": print("Give Path to experiment folder(relavive)") cmd = input(">") @@ -78,29 +82,36 @@ class Ihm(MqttClient, SSHClient): experiment_folder = cmd print("Experiment loaded") + # Crée les processus amas/env/scheduler de l'experience chargé if cmd.lower() == "start": if experiment_folder != "": # choose exec + print("Choose execution mode for the scheduler") + print("0 : step by step, 1 : auto") + while cmd not in ["0", "1"]: + cmd = input(">") # start subprocess scheduler - subprocess.Popen([sys.executable, 'scheduler.py']) - # wait(1) + p1 = Popen([sys.executable, 'scheduler.py', cmd]) + sleep(1) # start subprocess amas - subprocess.Popen([sys.executable, experiment_folder+'/amas.py']) + p2 = Popen([sys.executable, experiment_folder+'/amas.py']) # start subprocess env - subprocess.Popen([sys.executable, experiment_folder+'/env.py']) + p3 = Popen([sys.executable, experiment_folder+'/env.py']) if cmd.lower() == "pause": - pass + self.client.publish("ihm/pause") - if cmd.lower() == "unpause": - pass + if cmd.lower() in ["s", "step"]: + self.client.publish("ihm/step") + self.client.publish("ihm/step") sleep(2) + if __name__ == '__main__': a = Ihm() a.run() diff --git a/scheduler.py b/scheduler.py index 0995b4322cc6ffb32f384117953b6ff166043fd7..652345fe909ef79c4d533a25fc0cb6743252222e 100644 --- a/scheduler.py +++ b/scheduler.py @@ -1,3 +1,4 @@ +import sys from time import sleep from schedulable import Schedulable @@ -5,21 +6,35 @@ from schedulable import Schedulable class Scheduler(Schedulable): - def __init__(self): + def __init__(self, execution_policy: int): Schedulable.__init__(self, client_id="Scheduler") - self.sleep_between_cycle = 5 + self.sleep_between_cycle = 0 + + # 0: pas a pas, 1: auto + self.execution_policy: int = execution_policy + self.ihm_token = 0 + self.paused = True self.nbr_agent = 0 self.subscribe("amas/agent/new", self.update_nbr_agent) self.subscribe("amas/action_done", self.update_schedulable) self.subscribe("env/action_done", self.update_schedulable) + self.subscribe("ihm/step", self.step) + self.subscribe("ihm/pause", self.pause) self.agent_waiting = 0 self.schedulable_waiting = 0 print("Init done") + def pause(self, client, userdata, message): + self.paused = not self.paused + self.ihm_token += 1 + + def step(self, client, userdata, message): + self.ihm_token += 1 + def update_schedulable(self, client, userdata, message): self.schedulable_waiting += 1 print("__Schedulable is waiting") @@ -43,6 +58,11 @@ class Scheduler(Schedulable): sleep(self.wait_delay) self.schedulable_waiting = 0 + def wait_ihm(self): + while self.ihm_token == 0: + sleep(self.wait_delay) + self.ihm_token -= 1 + def first_part(self) -> None: """ first part of a cycle @@ -87,6 +107,11 @@ class Scheduler(Schedulable): while not self.exit_bool: print("Cycle : ", self.nbr_cycle) + if self.execution_policy == 0 or self.paused: + self.wait_ihm() + if self.exit_bool: + break + print("-First part") self.first_part() print("-Main part") @@ -94,15 +119,15 @@ class Scheduler(Schedulable): print("-Last part") self.last_part() - # sleep(self.sleep_between_cycle) - # input() + sleep(self.sleep_between_cycle) self.nbr_cycle += 1 + # exit self.client.publish("scheduler/schedulable/wakeup", "") self.client.publish("scheduler/agent/wakeup", "") sleep(2) if __name__ == '__main__': - s = Scheduler() + s = Scheduler(int(sys.argv[1])) s.run()