Skip to content
Snippets Groups Projects
scheduler.py 2.99 KiB
from time import sleep

from schedulable import Schedulable


class Scheduler(Schedulable):

    def __init__(self):

        Schedulable.__init__(self, client_id="Scheduler")
        self.sleep_between_cycle = 5

        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.agent_waiting = 0
        self.schedulable_waiting = 0

        print("Init done")

    def update_schedulable(self, client, userdata, message):
        self.schedulable_waiting += 1
        print("__Schedulable is waiting")

    def update_nbr_agent(self, client, userdata, message):
        self.nbr_agent += 1
        self.subscribe("agent/" + str(message.payload.decode("utf-8")) + "/cycle_done", self.agent_done)
        print("__Update agent : ",self.nbr_agent, str(message.payload.decode("utf-8")))

    def agent_done(self, client, userdata, message):
        self.agent_waiting += 1
        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:
        """
        first part of a cycle
        """
        self.client.publish("scheduler/schedulable/wakeup", "")
        # Amas on cycle begin
        # Environment on cycle begin
        self.wait_schedulable()

    def main_part(self) -> None:
        """
        main part of a cycle
        """
        self.client.publish("scheduler/agent/wakeup", "")
        # Agent doing phase 1
        self.wait_agent()
        self.client.publish("scheduler/agent/wakeup", "")
        # agent doing phase 2
        self.wait_agent()

    def last_part(self) -> None:
        """
        last part of a cycle
        """
        self.client.publish("scheduler/schedulable/wakeup", "")
        # Amas on cycle end
        # Environment on cycle end
        self.wait_schedulable()

    def run(self) -> None:
        """
        main part of amak core
        """

        # wait that all schedulable have init
        print("Waiting schedulable")
        self.wait_schedulable()
        # Wait that all agent have init
        print("Waiting agents :", self.nbr_agent)
        self.wait_agent()

        while not self.exit_bool:
            print("Cycle : ", self.nbr_cycle)

            print("-First part")
            self.first_part()
            print("-Main part")
            self.main_part()
            print("-Last part")
            self.last_part()

            # sleep(self.sleep_between_cycle)
            input()
            self.nbr_cycle += 1

        self.client.publish("scheduler/schedulable/wakeup", "")
        self.client.publish("scheduler/agent/wakeup", "")
        sleep(2)


if __name__ == '__main__':
    s = Scheduler()
    s.run()