From 4e71ae46824149cde7569dfa39ab8259ba3ed311 Mon Sep 17 00:00:00 2001
From: shinedday <shinedday@gmail.com>
Date: Mon, 13 Jun 2022 09:19:06 +0200
Subject: [PATCH] Agent : Update how canvas update work

---
 dist/iotAmak-0.0.7-py3-none-any.whl | Bin 31645 -> 31875 bytes
 iotAmak/agent/agent.py              |   1 +
 iotAmak/agent/async_agent.py        |   1 +
 iotAmak/agent/base_agent.py         |  11 +++++++++++
 iotAmak/amas/base_amas.py           |   4 +++-
 iotAmak/scheduler/scheduler.py      |   6 +++++-
 6 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/dist/iotAmak-0.0.7-py3-none-any.whl b/dist/iotAmak-0.0.7-py3-none-any.whl
index 6b8729469c70282fe1274145a88acef11cfe9f1a..744cb9dfed1ef86c93b444d4867458e6f5593247 100644
GIT binary patch
delta 7888
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
OHMy}`j4dZ0q!s{T^Hc@^

delta 7647
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
Q0JZWar`L$FwdH{%09i%YY5)KL

diff --git a/iotAmak/agent/agent.py b/iotAmak/agent/agent.py
index 4af7fb9..9cbf8c5 100644
--- a/iotAmak/agent/agent.py
+++ b/iotAmak/agent/agent.py
@@ -64,5 +64,6 @@ class Agent(Schedulable, BaseAgent):
             self.on_cycle_end()
 
             self.publish("metric", str(self.send_metric()))
+            self.publish("canvas", str(self.to_canvas()))
             self.publish("cycle_done", "")
             self.nbr_cycle += 1
diff --git a/iotAmak/agent/async_agent.py b/iotAmak/agent/async_agent.py
index a2653d5..58543c0 100644
--- a/iotAmak/agent/async_agent.py
+++ b/iotAmak/agent/async_agent.py
@@ -54,4 +54,5 @@ class AsyncAgent(AsyncControlable, BaseAgent):
         self.on_act()
         self.on_cycle_end()
         self.publish("metric", str(self.send_metric()))
+        self.publish("canvas", str(self.to_canvas()))
 
diff --git a/iotAmak/agent/base_agent.py b/iotAmak/agent/base_agent.py
index 4d31dd2..3bdd006 100644
--- a/iotAmak/agent/base_agent.py
+++ b/iotAmak/agent/base_agent.py
@@ -74,6 +74,17 @@ class BaseAgent:
             "[AGENT] " + str(self.id) + " : " + message
         )
 
+    def to_canvas(self) -> dict:
+        """
+        To override if the canvas is used, automatically called each cycle
+        the dict must contains :
+         * 'x', 'y' keys -> int values
+         * 'id' of the agent (self.id) -> int value
+         * 'color' in hex -> str (e.g. '#FF0000')
+         * 'cycle' self.nbr_cycle -> int
+        """
+        return {}
+
     def send_metric(self) -> Dict:
         """
         Should be override if the neighbor need to be aware of any other info, should be a dict
diff --git a/iotAmak/amas/base_amas.py b/iotAmak/amas/base_amas.py
index c3da4e0..7b34bd2 100644
--- a/iotAmak/amas/base_amas.py
+++ b/iotAmak/amas/base_amas.py
@@ -92,19 +92,21 @@ class BaseAmas(SSHClient):
                 if len(self.agents_cmd[i_min]) > len(self.agents_cmd[elem]):
                     i_min = elem
             self.agents_cmd[i_min].append(Cmd(command))
+            self.client.publish("amas/agent/new", str({"id": self.next_id, "ip": i_min}))
         else:
             have_found = False
             for i_client in range(len(self.clients)):
                 if self.clients[i_client].hostname == client_ip:
                     self.agents_cmd[i_client].append(Cmd(command))
+                    self.client.publish("amas/agent/new", str({"id": self.next_id, "ip": i_client}))
                     have_found = True
                     break
             if not have_found:
                 self.agents_cmd[0].append(Cmd(command))
+                self.client.publish("amas/agent/new", str({"id": self.next_id, "ip": 0}))
 
         self.subscribe("agent/" + str(self.next_id) + "/metric", self.agent_metric)
 
-        self.client.publish("amas/agent/new", self.next_id)
         self.next_id += 1
 
     def push_agent(self) -> None:
diff --git a/iotAmak/scheduler/scheduler.py b/iotAmak/scheduler/scheduler.py
index d5f2237..df01367 100644
--- a/iotAmak/scheduler/scheduler.py
+++ b/iotAmak/scheduler/scheduler.py
@@ -1,6 +1,7 @@
 """
 Scheduler class file
 """
+from ast import literal_eval
 from threading import Semaphore
 from time import sleep, time
 
@@ -67,7 +68,10 @@ class Scheduler(Schedulable):
         param message: id of the new agent
         """
         self.nbr_agent += 1
-        self.subscribe("agent/" + str(message.payload.decode("utf-8")) + "/cycle_done", self.agent_done)
+        self.subscribe(
+            "agent/" + literal_eval(message.payload.decode("utf-8")).get("id") + "/cycle_done",
+            self.agent_done)
+
         # print("__Update agent : ", self.nbr_agent, str(message.payload.decode("utf-8")))
 
     def agent_done(self, client, userdata, message) -> None:
-- 
GitLab