From aeb3e1e87236920f5eed3f3e83b8134c29164fa3 Mon Sep 17 00:00:00 2001
From: shinedday <shinedday@gmail.com>
Date: Mon, 16 May 2022 14:34:46 +0200
Subject: [PATCH] Add offline canvas

---
 db.sqlite3                              | Bin 294912 -> 323584 bytes
 ping/templates/ping/play.html           |  51 ++++++++++++++++++++++++
 ping/views/play.py                      |  21 ++++++++--
 uploads/current_experiment/ant/agent.py |   4 +-
 uploads/media/ant_XUpI6l7.zip           | Bin 0 -> 1336 bytes
 5 files changed, 71 insertions(+), 5 deletions(-)
 create mode 100644 uploads/media/ant_XUpI6l7.zip

diff --git a/db.sqlite3 b/db.sqlite3
index 8db1a619382a48f53c27a90a51d809a2091ac1f2..e7914df3e2bbedfddc5f951f6789d3558ab5f351 100644
GIT binary patch
delta 40859
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

delta 1338
zcmZp8Al%R(G(n1wC!B$S!GnQ;L4$#TL1?0e852+V#)L)kQV9%P{H*N!FZo&dck`F=
zck|EUU(N5$ug@>DS<&DnpPMK%vo2FgR$^Xyetcp|Zf0J5PJTMmVnIP>Ri=W>y!80o
z)RLmi<YJCfQUc7Dj9{VU(xRf&ypq(4g4CkS+|;}ho@Q_Tc5i*g>E8NGd$w~tVE)NJ
z&4G!H<tqdK*Uf?rulZd$c~}{QIT#c3N?3Ur7#JkEB^dZm^Uvnb=C|Ny<GakafUkhh
zj*pY~I`0zRd|rEA9-dn~%Xvz9TzQ1JA8@bbuI2XTme{PQaF0vSV4@cr$gGIOyb`7c
zmZ{RyCl)h{%6k3z|NnmvW91ZY#!@}~iJl-eoFFw|C4#j~qM}~^VM^Fb^>inCfRr#!
z52$96oc`bfGn*7USUX#(p20+SupCG`Gg!Z28I!22*H@T+W{?$bAT=ByHDDzV>zTx4
z89+vO{r>;|KgbkUkP1eS3WO=5UY}s5Fo9g*0#<`?g(N4)2yZ5k4bC7rR8Pox{X^1j
zFwqI51Z)LzSp0;kVF4NA2vURQP!^CaULbWKhdO{%fK5Sm=r@=tV29d+)nGW3y;RR=
zq8&(%GcGZ&q=99s+;mWAD|-EcY6k~9$QE0WDzGicZiUAi2gt29AT_9Nm0<?E6%wdM
z6RkliQ0-CxdjzZs6vZHOtU#(z%t4NS22jXbf|Ov!KMTmI7GOD0%psgA=k*urBX3ra
z8gsZBM4-vSeeDendNYt3RA<P6lLyGL5MxY1O2DClFh&%ih8g5k6R;XY*o!iO^@HQZ
z7%Uf*m{&6WV;PgQBsd9zY&V){1d>7xDj9e_fkq1`J2LT4XXM|<KYg=cK{vmW3KtuL
zu&ktdVqQsbYEEi$NotCzLSkM?ac*i#W}-gGqMi9n?mP?-AjrVLpfWwcfJs`_j)8%}
zo`HeEfq{X+k%581iGhK^nSp`9g@J*=m4Si5je&u|eY0S}7XC>SSeCOiFbOcTaHdRW
zpTLy5y<h^<Qby)j&amwwlbD>?CkF6sPnpTIU>nOMwkZtLc><UuwkrfM^Du9A6v$wn
zuHePYvVBGvbB5%0#s|#*`?m``U}h|sG=W8ihfA4(e=6U9zD(ZByw*HRdCa*_az}E#
U=4#_o-s~vA%(Y#)isddV0KC7X#sB~S

diff --git a/ping/templates/ping/play.html b/ping/templates/ping/play.html
index 2b9de00..ebc8c51 100644
--- a/ping/templates/ping/play.html
+++ b/ping/templates/ping/play.html
@@ -9,6 +9,53 @@
   <title>Play - IOTAMAK</title>
   <meta name="viewport" content="width=device-width, initial-scale=1">
 
+  <script type="text/javascript">
+window.addEventListener('load', eventWindowLoaded, false);
+function eventWindowLoaded() {
+    canvasApp();
+
+}
+
+ function canvasApp() {
+    var metrics = {{metrics}};
+
+    var cycle = 0;
+
+    theCanvas = document.getElementById('canvasOne');
+    context = theCanvas.getContext('2d');
+
+    function erraseCanvas() {
+        context.clearRect(0,0,theCanvas.width,theCanvas.height);
+    }
+
+    function drawScreen () {
+        erraseCanvas();
+
+        var count = metrics[cycle].length;
+        for (let id_agent = 0; id_agent<count; id_agent++){
+          context.fillStyle = "#000000";
+          context.beginPath();
+              context.arc(metrics[cycle][id_agent][0],metrics[cycle][id_agent][1],15,0,Math.PI*2,true);
+          context.closePath();
+          context.fill();
+        }
+    }
+
+    function gameLoop() {
+          if (cycle < metrics.length) {
+           window.setTimeout(gameLoop, 20);
+           drawScreen();
+           cycle = cycle + 1 ;
+
+          }
+
+    }
+
+    gameLoop();
+}
+
+</script>
+
 </head>
 
 <body>
@@ -51,5 +98,9 @@
     <button type='submit'> Load</button>
   </form>
 
+<canvas id="canvasOne" width="500" height="500" style="border:1px solid #000000;">
+ Your browser does not support the HTML 5 Canvas.
+</canvas>
+
 </body>
 </html>
\ No newline at end of file
diff --git a/ping/views/play.py b/ping/views/play.py
index c7e0a72..60d8fba 100644
--- a/ping/views/play.py
+++ b/ping/views/play.py
@@ -7,7 +7,7 @@ from subprocess import Popen
 from time import sleep
 
 from django.conf import settings
-from django.http import HttpResponse, HttpResponseRedirect
+from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
 from django.template import loader
 from django.urls import reverse
 from iotAmak.tool.ssh_client import Cmd
@@ -40,10 +40,16 @@ def agent_metric(client, userdata, message) -> None:
     metric = Metrics(experiment_name=exp.name, cycle=exp.cycle, agent_id=agent_id, metrics=result)
     metric.save()
 
+def cycle_done(client, userdata, message) -> None:
+    cur_exp = CurrentExperiment.objects.all()[0]
+    cur_exp.cycle += 1
+    cur_exp.save()
+
 
 def update_nbr_agent(client, userdata, message) -> None:
     exp = CurrentExperiment.objects.all()[0]
     subscribe(client, "agent/"+str(exp.nbr_agent)+"/metric", agent_metric)
+    subscribe(client, "scheduler/cycledone", cycle_done)
     exp.nbr_agent += 1
     exp.save()
 
@@ -101,10 +107,19 @@ def experiment_start(request):
     p3 = Popen([sys.executable, experiment_path+'/env.py', broker_ip])
     return HttpResponseRedirect(reverse('ping:play'))
 
-
 def main_play(request):
+    cycle = CurrentExperiment.objects.all()[0].cycle
+    metrics = []
+    for i in range(cycle):
+        # get all the agent 0 metrics
+        raw_context = Metrics.objects.filter(cycle=i)
+
+        cycle_metrics = [[metric.metrics.get("x"), metric.metrics.get("y")] for metric in raw_context]
+
+        metrics.append(cycle_metrics)
+
     template = loader.get_template('ping/play.html')
-    context = {}
+    context = {"metrics": metrics}
     return HttpResponse(template.render(context, request))
 
 
diff --git a/uploads/current_experiment/ant/agent.py b/uploads/current_experiment/ant/agent.py
index 5accea6..80f5688 100644
--- a/uploads/current_experiment/ant/agent.py
+++ b/uploads/current_experiment/ant/agent.py
@@ -7,8 +7,8 @@ from iotAmak.agent import Agent
 class Ant(Agent):
 
     def __init__(self, identifier: int, broker_ip: str):
-        self.x = 0
-        self.y = 0
+        self.x = 250
+        self.y = 250
         super().__init__(identifier, broker_ip)
 
     def on_act(self) -> None:
diff --git a/uploads/media/ant_XUpI6l7.zip b/uploads/media/ant_XUpI6l7.zip
new file mode 100644
index 0000000000000000000000000000000000000000..f2376c7643fd1a04ba142f07ab3fdf329abd0224
GIT binary patch
literal 1336
zcmWIWW@Zs#0D(_I8$v)d4D&NEFeK)c=*P!r=4F<|$LkeT!W45b{D|5RayVwwI#Wgl
zhB-_O3_MW9iRr0%C3*#wy+IeV4l9V%@;{N+t6VuLWSdhwljIZjZ+il}b{uQ*UM;qD
z@z39xlT2TJGKxP^e17lq3X!W<BlyE!99v;>@Z*cB>1vsmq82msuAgdQe9`l5qSBR*
z0-BjcyEvXNxHgYRL06e0(R35*xxmHG=U7x`avxAL*x;J!?eLcS$EIgGy2rCQ&)vSk
zeYuPG4WH<nZ~FBY>RRuuyCif<E^G5SrzX8#$+JgK@^90~x&Pp9#?G+wt2HIXwm+DW
z^PTlc^{%2X@z0KysQhja+GG<mqsPkR`~%^62j|)SEDbV`@y!2dGAnL|>_dT5Gn{3c
zWi4`Uew8raF0-k+tf#iQyL9XP)qi8QUb??#o=2g^vGQw9p63>>N;tezXocl{A30YE
zq5tkas(*CUa=zDA*j{34yZujTxANReLTB!oEVM@iZ(hiTkm-FZ1>Z0*Fzjb!VBm%Y
zZ*F3-UO{DU;K8iJ20VNDzws}ceoKH!_D#@<h4%xy0)*8&julO~d+^`BvPnxVeb|&c
zmoI;w{w??d%SZFNx+#~lKO9huwXx0mB+@AElDB3;*%FC|O02@ZJKya5qUip-$|2=p
zOU5GU-(2sc<oqTsH$JjNbc?dJ=SHTT+LtDLHsZ^kGPCMk64#AYi=Qm0OfEn1{K=IY
zRngmZZ<XEHyGFryLT1d2M~BWirY)=%tPOBTU{sZy^V9#b+`nsgOS!jOPFT_$`{z+o
z=Y;Z(3nm3FUyd|Y#Aqhf-Jd`ErsCxPi_~Q6)-9jCHevO?JkgrlrAw|YpAoZ%0TC$E
zLN<h0teVt1i-CdRD+2=q7c@{(^UCxJDt-G8avd_@X?x%Fe!}gj2~FXN?Xopo69cwR
z-e4;0X@2AO?oBWM6rcY8)ZeMlW0GUKt(@1^NlF2ye80@)wwb8X*Jyl!EAIO>s}FDX
zYMIOtKmKRux1gAaFI>6`Lcwk(Qop{j@O#DzELj+^!SlFc$HsTZ-(A_&<;C|~LSW&#
zg-$*5BsSi15_$Dran?~CdrSTIFU$5t?-ulPGyBGj@WJem4I#yxe1h2w3=FLd3=9HL
z9~38Nq^6YSq!#HFRGvPgdqQ6;P-C6Wv!{=qdTF0JA9~`9e&HG4GuO2J&UyH1p7qoX
zI?<xR)yCN{C2g7Jk>k%*pDjCfT>Hi?trf?QKUYh8cJ%n_=#NF3433MMbe)>r3ONPB
z#a^q5EuHQveJm@>N%W=Y)MuF)Obh|uj7%a7xN|?GBv61*m}LP>GxpK|q>GUOq*)j0
zOIX=}u$F@XTS7<Z>|ulyL5YxLkE{_}VnAqI$OO>{NgBxdutfnvUota9A992Qc(byB
RRIoCzGN>^!F#KT#@c`+c`OyFX

literal 0
HcmV?d00001

-- 
GitLab