Skip to content
Snippets Groups Projects
Commit 0fa0dd08 authored by shinedday's avatar shinedday
Browse files

Add Schedulable class to simplify the rest

parent bd8673bb
No related branches found
No related tags found
No related merge requests found
import sys import sys
import time
from ast import literal_eval from ast import literal_eval
from typing import Dict from typing import Dict
from mqtt_client import MqttClient from schedulable import Schedulable
class Agent(MqttClient): class Agent(Schedulable):
def __init__(self, identifier: int) -> None: def __init__(self, identifier: int) -> None:
self.id = identifier self.id = identifier
MqttClient.__init__(self, client_id="Agent"+str(self.id)) Schedulable.__init__(self, client_id="Agent"+str(self.id))
self.wait_delay = 0.01
self.subscribe("scheduler/agent/wakeup", self.scheduler_wake_up) self.subscribe("scheduler/agent/wakeup", self.scheduler_wake_up)
self.wake_up_token = False
self.neighbors = [] self.neighbors = []
self.next_neighbors = [] self.next_neighbors = []
self.subscribe("amas/agent/"+str(self.id)+"/neighbor", self.add_neighbor) self.subscribe("amas/agent/"+str(self.id)+"/neighbor", self.add_neighbor)
self.exit_bool = False
self.subscribe("ihm/exit", self.exit_procedure)
self.on_initialization() self.on_initialization()
self.publish("cycle_done", "") self.publish("cycle_done", "")
...@@ -34,9 +26,6 @@ class Agent(MqttClient): ...@@ -34,9 +26,6 @@ class Agent(MqttClient):
def on_initialization(self): def on_initialization(self):
pass pass
def exit_procedure(self, client, userdata, message):
self.exit_bool = True
def add_neighbor(self, client, userdata, message): def add_neighbor(self, client, userdata, message):
print(message.payload.decode("utf-8")) print(message.payload.decode("utf-8"))
result = literal_eval(message.payload.decode("utf-8")) result = literal_eval(message.payload.decode("utf-8"))
...@@ -56,13 +45,6 @@ class Agent(MqttClient): ...@@ -56,13 +45,6 @@ class Agent(MqttClient):
self.wake_up_token = True self.wake_up_token = True
print("waked up") print("waked up")
def wait(self):
print("waiting")
while not self.wake_up_token:
time.sleep(self.wait_delay)
self.wake_up_token = False
print("end wait")
def on_cycle_begin(self): def on_cycle_begin(self):
self.log("on_cycle_begin") self.log("on_cycle_begin")
......
...@@ -4,62 +4,35 @@ Amas class ...@@ -4,62 +4,35 @@ Amas class
from ast import literal_eval from ast import literal_eval
from pexpect import pxssh from pexpect import pxssh
from mqtt_client import MqttClient from schedulable import Schedulable
from time import sleep
from agent import Agent
class Amas(Schedulable):
def create_agent(identifier):
a = Agent(identifier)
a.run()
return
class Amas(MqttClient):
""" """
Amas class Amas class
""" """
def __init__(self): def __init__(self):
MqttClient.__init__(self, client_id="Amas") Schedulable.__init__(self, client_id="Amas")
self.nbr_cycle: int = 0
self.subscribe("scheduler/schedulable/wakeup", self.scheduler_wake_up) self.subscribe("scheduler/schedulable/wakeup", self.scheduler_wake_up)
self.wait_delay = 0.01
self.wake_up_token = False
self.next_id = 0 self.next_id = 0
self.exit_bool = False
self.subscribe("ihm/exit", self.exit_procedure)
self.agents_metric = [None for _ in range(self.next_id)] self.agents_metric = [None for _ in range(self.next_id)]
self.on_initialization() self.on_initialization()
self.on_initial_agents_creation() self.on_initial_agents_creation()
self.client.publish("amas/action_done", "") self.client.publish("amas/action_done", "")
def on_initial_agents_creation(self): def on_initial_agents_creation(self):
pass pass
def exit_procedure(self, client, userdata, message):
self.exit_bool = True
def scheduler_wake_up(self, client, userdata, message): def scheduler_wake_up(self, client, userdata, message):
self.wake_up_token = True self.wake_up_token = True
print("waked up") print("waked up")
def wait(self):
print("waiting")
while not self.wake_up_token:
sleep(self.wait_delay)
self.wake_up_token = False
print("end wait")
def add_agent(self): def add_agent(self):
try: try:
s = pxssh.pxssh() s = pxssh.pxssh()
...@@ -68,7 +41,7 @@ class Amas(MqttClient): ...@@ -68,7 +41,7 @@ class Amas(MqttClient):
password = "raspberry" password = "raspberry"
s.login(hostname, username, password) s.login(hostname, username, password)
s.sendline('nohup python \"Desktop/mqtt_goyon/iotamak-core/agent.py\" ' + str(self.next_id)+" &") s.sendline('nohup python \"Desktop/mqtt_goyon/iotamak-core/agent.py\" ' + str(self.next_id) + " &")
s.prompt() s.prompt()
print(s.before.decode('utf-8')) print(s.before.decode('utf-8'))
...@@ -92,7 +65,6 @@ class Amas(MqttClient): ...@@ -92,7 +65,6 @@ class Amas(MqttClient):
agent_id = result.get("id") agent_id = result.get("id")
self.agents_metric[agent_id] = result self.agents_metric[agent_id] = result
def on_initialization(self) -> None: def on_initialization(self) -> None:
""" """
This method will be executed at the end of __init__() This method will be executed at the end of __init__()
...@@ -111,7 +83,6 @@ class Amas(MqttClient): ...@@ -111,7 +83,6 @@ class Amas(MqttClient):
""" """
pass pass
def run(self) -> None: def run(self) -> None:
while not self.exit_bool: while not self.exit_bool:
...@@ -123,7 +94,7 @@ class Amas(MqttClient): ...@@ -123,7 +94,7 @@ class Amas(MqttClient):
self.on_cycle_begin() self.on_cycle_begin()
self.client.publish("amas/action_done", "") self.client.publish("amas/action_done", "")
#agent cycle # agent cycle
self.wait() self.wait()
self.on_cycle_end() self.on_cycle_end()
......
""" """
Environment class Environment class
""" """
from time import sleep
from mqtt_client import MqttClient from schedulable import Schedulable
class Environment(MqttClient): class Environment(Schedulable):
""" """
Environment class Environment class
""" """
def __init__(self): def __init__(self):
MqttClient.__init__(self, client_id="Env") Schedulable.__init__(self, client_id="Env")
self.nbr_cycle: int = 0
self.subscribe("scheduler/schedulable/wakeup", self.scheduler_wake_up) self.subscribe("scheduler/schedulable/wakeup", self.scheduler_wake_up)
self.wait_delay = 0.01
self.wake_up_token = False
self.exit_bool = False
self.subscribe("ihm/exit", self.exit_procedure)
self.on_initialization() self.on_initialization()
self.client.publish("env/action_done", "") self.client.publish("env/action_done", "")
...@@ -31,17 +23,6 @@ class Environment(MqttClient): ...@@ -31,17 +23,6 @@ class Environment(MqttClient):
self.wake_up_token = True self.wake_up_token = True
print("waked up") print("waked up")
def wait(self):
print("waiting")
while not self.wake_up_token:
sleep(self.wait_delay)
self.wake_up_token = False
print("end wait")
def exit_procedure(self, client, userdata, message):
self.exit_bool = True
def on_initialization(self) -> None: def on_initialization(self) -> None:
""" """
This method will be executed at the end of __init__() This method will be executed at the end of __init__()
......
from time import sleep
from mqtt_client import MqttClient from mqtt_client import MqttClient
...@@ -17,3 +19,10 @@ class Ihm(MqttClient): ...@@ -17,3 +19,10 @@ class Ihm(MqttClient):
if cmd.lower() == "exit": if cmd.lower() == "exit":
self.client.publish("ihm/exit") self.client.publish("ihm/exit")
exit_bool = True exit_bool = True
sleep(2)
if __name__ == '__main__':
a = Ihm()
a.run()
\ No newline at end of file
import sys
from amas import Amas
class SimpleAmas(Amas):
def __init__(self, nbr_agent):
self.agent_to_create = nbr_agent
super().__init__()
def on_initial_agents_creation(self):
for _ in range(self.agent_to_create):
self.add_agent()
if __name__ == '__main__':
print("nbr agent: ", int(sys.argv[1]))
a = SimpleAmas(int(sys.argv[1]))
a.run()
"""
Tool class that implement basic interaction that help to finish processes
"""
from time import sleep
from mqtt_client import MqttClient
class Schedulable(MqttClient):
"""
Base class for Agent/Amas/Env/scheduler
"""
def __init__(self, client_id: str):
MqttClient.__init__(self, client_id)
self.exit_bool: bool = False
self.subscribe("ihm/exit", self.exit_procedure)
self.nbr_cycle: int = 0
self.wait_delay: float = 0.01
self.wake_up_token: int = 0
def wait(self):
# print("Waiting")
while not self.wake_up_token > 1:
sleep(self.wait_delay)
self.wake_up_token -= 1
# print("End wait")
def exit_procedure(self, client, userdata, message):
self.exit_bool = True
from time import sleep from time import sleep
from mqtt_client import MqttClient from schedulable import Schedulable
class Scheduler(MqttClient): class Scheduler(Schedulable):
def __init__(self): def __init__(self):
MqttClient.__init__(self, client_id="Scheduler") Schedulable.__init__(self, client_id="Scheduler")
self.nbr_cycle: int = 0
self.wait_delay = 0.01
self.sleep_between_cycle = 5 self.sleep_between_cycle = 5
self.nbr_agent = 0 self.nbr_agent = 0
...@@ -21,16 +18,12 @@ class Scheduler(MqttClient): ...@@ -21,16 +18,12 @@ class Scheduler(MqttClient):
self.agent_waiting = 0 self.agent_waiting = 0
self.schedulable_waiting = 0 self.schedulable_waiting = 0
self.exit_bool = False
self.subscribe("ihm/exit", self.exit_procedure)
print("Init done") print("Init done")
def exit_procedure(self, client, userdata, message):
self.exit_bool = True
def update_schedulable(self, client, userdata, message): def update_schedulable(self, client, userdata, message):
self.schedulable_waiting += 1 self.schedulable_waiting += 1
if self.schedulable_waiting == 2:
self.wake_up_token += 1
print("__Schedulable is waiting") print("__Schedulable is waiting")
def update_nbr_agent(self, client, userdata, message): def update_nbr_agent(self, client, userdata, message):
...@@ -40,18 +33,10 @@ class Scheduler(MqttClient): ...@@ -40,18 +33,10 @@ class Scheduler(MqttClient):
def agent_done(self, client, userdata, message): def agent_done(self, client, userdata, message):
self.agent_waiting += 1 self.agent_waiting += 1
if self.agent_waiting >= self.nbr_agent:
self.wake_up_token += 1
print("__Agent done") print("__Agent done")
def wait_agent(self):
while self.agent_waiting < self.nbr_agent:
sleep(self.wait_delay)
self.agent_waiting = 0
def wait_schedulable(self):
while self.schedulable_waiting < 2:
sleep(self.wait_delay)
self.schedulable_waiting = 0
def first_part(self) -> None: def first_part(self) -> None:
""" """
first part of a cycle first part of a cycle
...@@ -59,7 +44,7 @@ class Scheduler(MqttClient): ...@@ -59,7 +44,7 @@ class Scheduler(MqttClient):
self.client.publish("scheduler/schedulable/wakeup", "") self.client.publish("scheduler/schedulable/wakeup", "")
# Amas on cycle begin # Amas on cycle begin
# Environment on cycle begin # Environment on cycle begin
self.wait_schedulable() self.wait()
def main_part(self) -> None: def main_part(self) -> None:
""" """
...@@ -67,10 +52,10 @@ class Scheduler(MqttClient): ...@@ -67,10 +52,10 @@ class Scheduler(MqttClient):
""" """
self.client.publish("scheduler/agent/wakeup", "") self.client.publish("scheduler/agent/wakeup", "")
# Agent doing phase 1 # Agent doing phase 1
self.wait_agent() self.wait()
self.client.publish("scheduler/agent/wakeup", "") self.client.publish("scheduler/agent/wakeup", "")
# agent doing phase 2 # agent doing phase 2
self.wait_agent() self.wait()
def last_part(self) -> None: def last_part(self) -> None:
""" """
...@@ -79,7 +64,7 @@ class Scheduler(MqttClient): ...@@ -79,7 +64,7 @@ class Scheduler(MqttClient):
self.client.publish("scheduler/schedulable/wakeup", "") self.client.publish("scheduler/schedulable/wakeup", "")
# Amas on cycle end # Amas on cycle end
# Environment on cycle end # Environment on cycle end
self.wait_schedulable() self.wait()
def run(self) -> None: def run(self) -> None:
""" """
...@@ -88,10 +73,10 @@ class Scheduler(MqttClient): ...@@ -88,10 +73,10 @@ class Scheduler(MqttClient):
# wait that all schedulable have init # wait that all schedulable have init
print("Waiting schedulable") print("Waiting schedulable")
self.wait_schedulable() self.wait()
# Wait that all agent have init # Wait that all agent have init
print("Waiting agents :", self.nbr_agent) print("Waiting agents :", self.nbr_agent)
self.wait_agent() self.wait()
while not self.exit_bool: while not self.exit_bool:
print("Cycle : ", self.nbr_cycle) print("Cycle : ", self.nbr_cycle)
...@@ -109,6 +94,7 @@ class Scheduler(MqttClient): ...@@ -109,6 +94,7 @@ class Scheduler(MqttClient):
self.client.publish("scheduler/schedulable/wakeup", "") self.client.publish("scheduler/schedulable/wakeup", "")
self.client.publish("scheduler/agent/wakeup", "") self.client.publish("scheduler/agent/wakeup", "")
sleep(2)
if __name__ == '__main__': if __name__ == '__main__':
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment