From 039ce8c508abc91932dd8d50824565ad204fcd1f Mon Sep 17 00:00:00 2001 From: shinedday <shinedday@gmail.com> Date: Wed, 18 May 2022 15:18:18 +0200 Subject: [PATCH] Update .gitignore, add client selection, better db managment, simplify experiment managment, simplify experiment killing process --- .gitignore | 7 +- db.sqlite3 | Bin 323584 -> 0 bytes ping/migrations/0001_initial.py | 31 -------- ping/migrations/0002_experiment.py | 23 ------ ...periment_metrics_alter_experiment_media.py | 37 ---------- ping/models.py | 11 +-- ping/templates/ping/experiment.html | 5 +- ping/templates/ping/index.html | 3 + ping/templates/ping/play.html | 64 +++++++++-------- ping/urls.py | 4 ++ ping/views/experiment.py | 40 ++++++----- ping/views/network.py | 27 +++---- ping/views/play.py | 59 ++++++++------- ping/views/tool.py | 30 ++++++++ uploads/current_experiment/ant/agent.py | 16 ++++- uploads/current_experiment/ant/amas.py | 2 +- uploads/media/amas.py | 20 ------ uploads/media/ant.zip | Bin 1335 -> 1363 bytes uploads/media/ant_XUpI6l7.zip | Bin 1336 -> 0 bytes uploads/media/config.json | 25 ------- uploads/media/env.py | 67 ------------------ uploads/media/philosophers.zip | Bin 3191 -> 0 bytes uploads/media/philosophers_7r4Esmi.zip | Bin 3181 -> 0 bytes 23 files changed, 168 insertions(+), 303 deletions(-) delete mode 100644 db.sqlite3 delete mode 100644 ping/migrations/0001_initial.py delete mode 100644 ping/migrations/0002_experiment.py delete mode 100644 ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py create mode 100644 ping/views/tool.py delete mode 100644 uploads/media/amas.py delete mode 100644 uploads/media/ant_XUpI6l7.zip delete mode 100644 uploads/media/config.json delete mode 100644 uploads/media/env.py delete mode 100644 uploads/media/philosophers.zip delete mode 100644 uploads/media/philosophers_7r4Esmi.zip diff --git a/.gitignore b/.gitignore index 5cc30b1..bb2256e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,9 @@ desktop.ini .idea venv *.bat -__pycache__/ \ No newline at end of file +__pycache__/ +ping/migrations/* +db.sqlite3 +uploads/tmp/* +uploads/media/* +uploads/current_experiment/* diff --git a/db.sqlite3 b/db.sqlite3 deleted file mode 100644 index e7914df3e2bbedfddc5f951f6789d3558ab5f351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323584 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 diff --git a/ping/migrations/0001_initial.py b/ping/migrations/0001_initial.py deleted file mode 100644 index ae0c37f..0000000 --- a/ping/migrations/0001_initial.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-12 08:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Agent', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('ip', models.CharField(max_length=16)), - ('command', models.CharField(max_length=256)), - ], - ), - migrations.CreateModel( - name='Client', - fields=[ - ('hostname', models.CharField(max_length=16, primary_key=True, serialize=False, unique=True)), - ('username', models.CharField(max_length=16)), - ('password', models.CharField(max_length=16)), - ('status', models.CharField(default='Offline', max_length=8)), - ], - ), - ] diff --git a/ping/migrations/0002_experiment.py b/ping/migrations/0002_experiment.py deleted file mode 100644 index c06c6d6..0000000 --- a/ping/migrations/0002_experiment.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-12 12:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('ping', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='Experiment', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=60)), - ('status', models.CharField(default='Not checked', max_length=60)), - ('description', models.TextField()), - ('media', models.FileField(blank=True, null=True, upload_to='')), - ], - ), - ] diff --git a/ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py b/ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py deleted file mode 100644 index d014e25..0000000 --- a/ping/migrations/0003_currentexperiment_metrics_alter_experiment_media.py +++ /dev/null @@ -1,37 +0,0 @@ -# Generated by Django 4.0.4 on 2022-05-13 12:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('ping', '0002_experiment'), - ] - - operations = [ - migrations.CreateModel( - name='CurrentExperiment', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=60)), - ('cycle', models.PositiveIntegerField(default=0)), - ('nbr_agent', models.PositiveIntegerField(default=0)), - ], - ), - migrations.CreateModel( - name='Metrics', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('experiment_name', models.CharField(max_length=60)), - ('cycle', models.PositiveIntegerField()), - ('agent_id', models.PositiveIntegerField()), - ('_metrics', models.BinaryField()), - ], - ), - migrations.AlterField( - model_name='experiment', - name='media', - field=models.FileField(blank=True, null=True, upload_to='media'), - ), - ] diff --git a/ping/models.py b/ping/models.py index ecc1779..7731b89 100644 --- a/ping/models.py +++ b/ping/models.py @@ -5,10 +5,11 @@ from django.forms import ModelForm class Client(models.Model): - hostname = models.CharField(max_length=16, primary_key=True, unique=True) + hostname = models.CharField(max_length=16) username = models.CharField(max_length=16) password = models.CharField(max_length=16) status = models.CharField(max_length=8, default="Offline") + active = models.BooleanField(default=True) def __str__(self): return "Hostname : " + self.hostname + " Username : " + self.username + " Status : " + self.status @@ -34,9 +35,7 @@ class ExperimentForm(ModelForm): fields = ["name", "description", "media"] class Metrics(models.Model): - experiment_name = models.CharField(max_length=60) cycle = models.PositiveIntegerField() - agent_id = models.PositiveIntegerField() _metrics = models.BinaryField() def set_data(self, data): @@ -52,4 +51,8 @@ class CurrentExperiment(models.Model): name = models.CharField(max_length=60) cycle = models.PositiveIntegerField(default=0) - nbr_agent = models.PositiveIntegerField(default=0) \ No newline at end of file + nbr_agent = models.PositiveIntegerField(default=0) + + amas_pid = models.PositiveIntegerField(default=0) + scheduler_pid = models.PositiveIntegerField(default=0) + env_pid = models.PositiveIntegerField(default=0) \ No newline at end of file diff --git a/ping/templates/ping/experiment.html b/ping/templates/ping/experiment.html index e725a12..8e067ae 100644 --- a/ping/templates/ping/experiment.html +++ b/ping/templates/ping/experiment.html @@ -28,18 +28,19 @@ <tr> <th>Name</th> <th>Status</th> - <th>Check</th> </tr> {% for experiment in experiments %} <tr> <td>{{ experiment.name }}</td> <td>{{ experiment.status }}</td> <td><a href="/experiment/{{ experiment.id }}/check">Check</td> + <td><a href="/experiment/{{ experiment.id }}/select">Select</td> + <td><a href="/experiment/{{ experiment.id }}/delete">Delete</td> </tr> {% endfor %} </table> {% else %} - <p>No agents are available.</p> + <p>No experiment are available.</p> {% endif %} </body> diff --git a/ping/templates/ping/index.html b/ping/templates/ping/index.html index 4e63881..449b317 100644 --- a/ping/templates/ping/index.html +++ b/ping/templates/ping/index.html @@ -37,12 +37,15 @@ <th>Hostname</th> <th>Username</th> <th>Status</th> + <th>Active</th> </tr> {% for client in host_list %} <tr> <td>{{ client.hostname }}</td> <td>{{ client.username }}</td> <td>{{ client.status }}</td> + <td>{{ client.active }}</td> + <td><a href="/network/{{ client.id }}/activate">Enable/Disable</td> </tr> {% endfor %} </table> diff --git a/ping/templates/ping/play.html b/ping/templates/ping/play.html index ebc8c51..b0f0aff 100644 --- a/ping/templates/ping/play.html +++ b/ping/templates/ping/play.html @@ -10,51 +10,48 @@ <meta name="viewport" content="width=device-width, initial-scale=1"> <script type="text/javascript"> -window.addEventListener('load', eventWindowLoaded, false); -function eventWindowLoaded() { - canvasApp(); - -} + window.addEventListener('load', eventWindowLoaded, false); + function eventWindowLoaded() { + canvasApp(); + } - function canvasApp() { - var metrics = {{metrics}}; + function canvasApp() { + var metrics = {{ metrics }}; - var cycle = 0; + var cycle = 0; - theCanvas = document.getElementById('canvasOne'); - context = theCanvas.getContext('2d'); + theCanvas = document.getElementById('canvasOne'); + context = theCanvas.getContext('2d'); - function erraseCanvas() { - context.clearRect(0,0,theCanvas.width,theCanvas.height); - } + function erraseCanvas() { + context.clearRect(0, 0, theCanvas.width, theCanvas.height); + } - function drawScreen () { + function drawScreen() { erraseCanvas(); var count = metrics[cycle].length; - for (let id_agent = 0; id_agent<count; id_agent++){ + 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.arc(metrics[cycle][id_agent][0], metrics[cycle][id_agent][1], 1, 0, Math.PI * 2, true); context.closePath(); context.fill(); } - } - - function gameLoop() { - if (cycle < metrics.length) { - window.setTimeout(gameLoop, 20); - drawScreen(); - cycle = cycle + 1 ; + } - } + function gameLoop() { + if (cycle < metrics.length) { + window.setTimeout(gameLoop, 20); + drawScreen(); + cycle = cycle + 1; + } + } + gameLoop(); } - gameLoop(); -} - -</script> + </script> </head> @@ -98,9 +95,14 @@ function eventWindowLoaded() { <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> + <form action='./global/kill' method='GET'> + <button type='submit'> Kill Amas, Env, Scheduler</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/urls.py b/ping/urls.py index 133b8fb..1dcf382 100644 --- a/ping/urls.py +++ b/ping/urls.py @@ -9,9 +9,12 @@ urlpatterns = [ path('network/update/', views.update, name='update'), path('network/agents/', views.agents, name='agents'), path('network/agent/kill', views.kill, name='kill'), + path('network/<int:client_id>/activate/', views.client_activate, name='active'), path('experiment/new/', views.entry, name='entry'), path('experiment/', views.experiment, name='experiment'), path('experiment/<int:experiment_id>/check/', views.check, name='check'), + path('experiment/<int:experiment_id>/select/', views.select, name='select'), + path('experiment/<int:experiment_id>/delete/', views.delete, name='delete'), path('play/', views.main_play, name='play'), path('play/scheduler/start', views.scheduler_start, name='start'), path('play/scheduler/step', views.scheduler_step, name='step'), @@ -20,4 +23,5 @@ urlpatterns = [ path('play/global/share', views.experiment_share, name='share'), path('play/global/start', views.experiment_start, name='start_exp'), path('play/global/load', views.experiment_load, name='load_exp'), + path('play/global/kill', views.experiment_kill, name='kill_exp'), ] \ No newline at end of file diff --git a/ping/views/experiment.py b/ping/views/experiment.py index ca83afb..c0ed1ba 100644 --- a/ping/views/experiment.py +++ b/ping/views/experiment.py @@ -1,5 +1,4 @@ import os -import shutil import zipfile from django.conf import settings @@ -8,6 +7,7 @@ from django.http import HttpResponse, HttpResponseRedirect from django.template import loader from django.urls import reverse +from .tool import delete_folder from ..models import Experiment, ExperimentForm @@ -26,19 +26,6 @@ def entry(request): return HttpResponse(template.render(context, request)) -def empty_tmp(): - folder = str(settings.MEDIA_ROOT) + "/tmp" - for filename in os.listdir(folder): - file_path = os.path.join(folder, filename) - try: - if os.path.isfile(file_path) or os.path.islink(file_path): - os.unlink(file_path) - elif os.path.isdir(file_path): - shutil.rmtree(file_path) - except Exception as e: - print('Failed to delete %s. Reason: %s' % (file_path, e)) - - def check(request, experiment_id): # get the path exp = Experiment.objects.get(pk=experiment_id) @@ -57,7 +44,7 @@ def check(request, experiment_id): if not os.path.isdir(folder_path): exp.status = "Wrong format : zip should contain a folder" exp.save() - empty_tmp() + delete_folder(str(settings.MEDIA_ROOT) + "/tmp") return HttpResponseRedirect(reverse('ping:experiment')) required_files = ["amas.py", "agent.py", "env.py", "scheduler.py"] @@ -65,14 +52,33 @@ def check(request, experiment_id): if not os.path.exists(folder_path + "/" + required_file): exp.status = "Wrong format : " + required_file + " file is expected" exp.save() - empty_tmp() + delete_folder(str(settings.MEDIA_ROOT) + "/tmp") return HttpResponseRedirect(reverse('ping:experiment')) exp.status = "Checked" exp.save() - empty_tmp() + delete_folder(str(settings.MEDIA_ROOT) + "/tmp") return HttpResponseRedirect(reverse('ping:experiment')) +def select(request, experiment_id): + + exp = Experiment.objects.get(pk=experiment_id) + + if exp.status == "Checked": + exp_list = Experiment.objects.filter(status="Selected") + for expe in exp_list: + expe.status = "Checked" + expe.save() + exp.status = "Selected" + exp.save() + return HttpResponseRedirect(reverse('ping:experiment')) + +def delete(request, experiment_id): + exp = Experiment.objects.get(pk=experiment_id) + os.remove(str(settings.MEDIA_ROOT) + str(exp.media)) + + Experiment.objects.get(pk=experiment_id).delete() + return HttpResponseRedirect(reverse('ping:experiment')) def experiment(request): template = loader.get_template('ping/experiment.html') diff --git a/ping/views/network.py b/ping/views/network.py index 5a13bc7..f9e147a 100644 --- a/ping/views/network.py +++ b/ping/views/network.py @@ -5,27 +5,15 @@ import re from django.http import HttpResponse, HttpResponseRedirect from django.template import loader from django.urls import reverse -from iotAmak.tool.remote_client import RemoteClient -from iotAmak.tool.ssh_client import SSHClient, Cmd +from iotAmak.tool.ssh_client import Cmd +from .tool import get_ssh_client from ..models import Client, Agent -def get_remote_client(): - res = [] - for client in Client.objects.all(): - if client.status == "Online": - res.append(RemoteClient(client.hostname, client.username, client.password)) - - return res - - -def get_ssh_client(): - return SSHClient(get_remote_client()) - def update(request): ssh = get_ssh_client() - version = "0.0.1" + version = "0.0.2" commands = [ Cmd( cmd="cd Desktop/mqtt_goyon/iotamak-core" @@ -69,6 +57,7 @@ def agents(request): return HttpResponseRedirect(reverse('ping:index')) + def kill(request): ssh = get_ssh_client() @@ -82,7 +71,6 @@ def kill(request): return HttpResponseRedirect(reverse('ping:index')) - def index(request): template = loader.get_template('ping/index.html') context = { @@ -106,4 +94,11 @@ def pressed(request): c.status = "Offline" c.save() + return HttpResponseRedirect(reverse('ping:index')) + +def client_activate(request, client_id): + client = Client.objects.get(pk=client_id) + + client.active = not client.active + client.save() return HttpResponseRedirect(reverse('ping:index')) \ No newline at end of file diff --git a/ping/views/play.py b/ping/views/play.py index 60d8fba..c251813 100644 --- a/ping/views/play.py +++ b/ping/views/play.py @@ -1,5 +1,4 @@ import os -import shutil import sys import zipfile from ast import literal_eval @@ -7,16 +6,15 @@ from subprocess import Popen from time import sleep from django.conf import settings -from django.http import HttpResponse, HttpResponseRedirect, JsonResponse +from django.http import HttpResponse, HttpResponseRedirect from django.template import loader from django.urls import reverse from iotAmak.tool.ssh_client import Cmd from paho.mqtt.client import Client as MQTTClient +from .tool import delete_folder, get_ssh_client from ..models import Experiment, CurrentExperiment, Metrics -from .network import get_ssh_client - client = MQTTClient(client_id="django-ihm") def subscribe(mqttclient, topic, fun): @@ -32,12 +30,10 @@ def agent_log(client, userdata, message) -> None: def agent_metric(client, userdata, message) -> None: - result = literal_eval(message.payload.decode("utf-8")) - agent_id = result.get("id") + results = literal_eval(message.payload.decode("utf-8")) exp = CurrentExperiment.objects.all()[0] - - metric = Metrics(experiment_name=exp.name, cycle=exp.cycle, agent_id=agent_id, metrics=result) + metric = Metrics(cycle=exp.cycle, metrics=results) metric.save() def cycle_done(client, userdata, message) -> None: @@ -48,26 +44,12 @@ def cycle_done(client, userdata, message) -> None: 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() -def empty_current_experiment(): - folder = str(settings.MEDIA_ROOT) + "current_experiment" - for filename in os.listdir(folder): - file_path = os.path.join(folder, filename) - try: - if os.path.isfile(file_path) or os.path.islink(file_path): - os.unlink(file_path) - elif os.path.isdir(file_path): - shutil.rmtree(file_path) - except Exception as e: - print('Failed to delete %s. Reason: %s' % (file_path, e)) - def experiment_load(request): - empty_current_experiment() + delete_folder(str(settings.MEDIA_ROOT) + "current_experiment") exp = Experiment.objects.get(status="Selected") @@ -86,7 +68,7 @@ def experiment_load(request): def experiment_start(request): - broker_ip = "192.168.201.209" + broker_ip = "192.168.157.209" ssh = get_ssh_client() experiment_path = str(settings.MEDIA_ROOT) + "current_experiment/" + Experiment.objects.get(status="Selected").name @@ -96,6 +78,8 @@ def experiment_start(request): client.connect(host=broker_ip) client.loop_start() subscribe(client, "amas/agent/new", update_nbr_agent) + subscribe(client, "scheduler/cycledone", cycle_done) + subscribe(client, "amas/all_metric", agent_metric) # start subprocess scheduler p1 = Popen([sys.executable, experiment_path+'/scheduler.py', broker_ip]) @@ -105,16 +89,26 @@ def experiment_start(request): p2 = Popen([sys.executable, experiment_path+'/amas.py', broker_ip, str(send_client)]) # start subprocess env p3 = Popen([sys.executable, experiment_path+'/env.py', broker_ip]) + + exp = CurrentExperiment.objects.all()[0] + exp.amas_pid = p2.pid + exp.scheduler_pid = p1.pid + exp.env_pid = p3.pid + exp.save() + return HttpResponseRedirect(reverse('ping:play')) def main_play(request): - cycle = CurrentExperiment.objects.all()[0].cycle + if len(CurrentExperiment.objects.all()) > 0: + cycle = CurrentExperiment.objects.all()[0].cycle + else: + cycle = 0 metrics = [] for i in range(cycle): # get all the agent 0 metrics - raw_context = Metrics.objects.filter(cycle=i) + raw_context = Metrics.objects.filter(cycle=i)[0].metrics - cycle_metrics = [[metric.metrics.get("x"), metric.metrics.get("y")] for metric in raw_context] + cycle_metrics = [[metric.get("x"), metric.get("y")] for metric in raw_context if metric != {}] metrics.append(cycle_metrics) @@ -162,3 +156,14 @@ def experiment_stop(request): client.publish("ihm/exit") client.publish("ihm/step") return HttpResponseRedirect(reverse('ping:play')) + +def experiment_kill(request): + exp = CurrentExperiment.objects.all()[0] + + if exp.amas_pid != 0 : + os.system("kill "+str(exp.amas_pid)) + if exp.env_pid != 0 : + os.system("kill "+str(exp.env_pid)) + if exp.scheduler_pid != 0 : + os.system("kill "+str(exp.scheduler_pid)) + return HttpResponseRedirect(reverse('ping:play')) diff --git a/ping/views/tool.py b/ping/views/tool.py new file mode 100644 index 0000000..172d5f4 --- /dev/null +++ b/ping/views/tool.py @@ -0,0 +1,30 @@ +import os +import shutil + +from iotAmak.tool.remote_client import RemoteClient +from iotAmak.tool.ssh_client import SSHClient + +from ping.models import Client + + +def delete_folder(folder_name): + for filename in os.listdir(folder_name): + file_path = os.path.join(folder_name, filename) + try: + if os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) + elif os.path.isdir(file_path): + shutil.rmtree(file_path) + except Exception as e: + print('Failed to delete %s. Reason: %s' % (file_path, e)) + +def get_remote_client(): + res = [] + for client in Client.objects.all(): + if client.status == "Online" and client.active: + res.append(RemoteClient(client.hostname, client.username, client.password)) + + return res + +def get_ssh_client(): + return SSHClient(get_remote_client()) \ No newline at end of file diff --git a/uploads/current_experiment/ant/agent.py b/uploads/current_experiment/ant/agent.py index 80f5688..b51b4f5 100644 --- a/uploads/current_experiment/ant/agent.py +++ b/uploads/current_experiment/ant/agent.py @@ -11,10 +11,24 @@ class Ant(Agent): self.y = 250 super().__init__(identifier, broker_ip) + def on_initialization(self) -> None: + pass + + def on_cycle_begin(self) -> None: + pass + + def on_perceive(self) -> None: + pass + + def on_decide(self) -> None: + pass + def on_act(self) -> None: self.x += random.randint(-5, +5) self.y += random.randint(-5, +5) - self.log("X : "+str(self.x)+" Y : "+str(self.y)) + + def on_cycle_end(self) -> None: + pass def send_metric(self): metric = super(Ant, self).send_metric() diff --git a/uploads/current_experiment/ant/amas.py b/uploads/current_experiment/ant/amas.py index 99a0586..f4746a9 100644 --- a/uploads/current_experiment/ant/amas.py +++ b/uploads/current_experiment/ant/amas.py @@ -16,5 +16,5 @@ class AntAmas(Amas): if __name__ == '__main__': - s = AntAmas(str(sys.argv[1]), sys.argv[2], 5) + s = AntAmas(str(sys.argv[1]), sys.argv[2], 150) s.run() diff --git a/uploads/media/amas.py b/uploads/media/amas.py deleted file mode 100644 index 1b8e3f3..0000000 --- a/uploads/media/amas.py +++ /dev/null @@ -1,20 +0,0 @@ -import sys - - -from iotAmak.amas import Amas - - -class PhiAmas(Amas): - - def __init__(self, broker_ip: str, clients, nbr_agent): - self.agent_to_create = nbr_agent - super().__init__(broker_ip, clients) - - def on_initial_agents_creation(self): - for _ in range(self.agent_to_create): - self.add_agent("philosophers", [str(self.agent_to_create)]) - - -if __name__ == '__main__': - s = PhiAmas(str(sys.argv[1]), sys.argv[2], 5) - s.run() diff --git a/uploads/media/ant.zip b/uploads/media/ant.zip index 412da9c2e93f2efd75892236c484c9a8068ba3c3..5deb3014d79ead7187411c6887f88036fad5c716 100644 GIT binary patch delta 736 zcmdnab(w2|d3~PO#t<KuH~ah;85nYz85npN7#I@sO7s)cQ}asn3M!`t-|lKQ5U3UZ z)4ovO^vbEch5D@Ge;WTb205)tmR!}TlDYEt*V!2>F1^#cy~pF+oXM8O6L0xtaz~x; z+FI!H`05w6zDFyrtzr$@mT}ZlSbd5Z)4~tp{+)|A2_AD$%r&ZS$a(Hqu>6peg}Udo z&qor1mpe>N4)9%3?r>>Y!If7%vx2uXCvUy(WDz&vu0s3SZ*Ljj&cEQ@Zk2e`_V$$Y zX-#K)H7yG~O}?n=Xj)pNZ1~sUuUeS4r1+_=#_4@I6XZX-=%1W(Qs`yZ`V1|dSi|)i zE}8X9+n25TWbolk{T+o#U+c|UuTHZy{l))`U)C}5@9mX^Dfbp#4e6UDS>AGY%JG9@ zb-`?YX5n{jeJ1^Vw9TU8Zou>6E%O)s6}g(BAH_DQe#)OmUKf>~Pk6rJ$sSP^%Xqf_ zL$;5^?|nb~S8L{l<*)z!JrK12i0~%M4Hp6@zU=n7VIJVk%p$_Tz`((9By3a2zxtWp zM(-FH7!EQrFmS_yJ~y#gub?tF@L<+q1D?J7-}o0zza?<U>c-Lu&ifaOEL8Io=zXfN zyZP_mH!9x6GkDyD{Qb|Lf3ti6=Oh1`dhO-cA2d4es;Ij1M3YIs<4%O)TMxrSu3T!f zif$IabnZL%wc*4e&WkSQ-$d`2+SJcc@=x#Z)Xs1(o0P;_6uw09d8*7c4dbtOj*4su zbwBC&`Ov!w=TENO_;p)e^p>|9sv{lK6fW;DINCb5`Ha(drC$pg4lsEcS$v+q%=XXH z-LJ*+iWNNBcmFtgR7ml?z{1Q29WOdrKkf)R@@JpD`DSOe|E|7PHSzxD(Fen7?`c`o za@F1_U2$#sjF>-6n-?%GVdO(ikCTH~bmYMSg%(Z>3=9m63<?Yk3`-}^WwBt~Gx-{e QIb+>qK2~KmaTbs)0HSSB?EnA( delta 696 zcmcc2wVi8%dHuVP4Iu%-%u7ue85m|TF);8jFfb(MmFOp?r{<OD6;$>HUCcVHAX3Z! zL|(6Q<)n~pj`2*APuRch32fSNWQzA{v8{`L{?43an)%x({z&opo!=`&uHKB`4|{QL zg~`E}FW9E5WnPM2%+R}js)bSEgj<JwRy<Y=y0pZW^Z9~n^LiBOb(J|1OE<Bf3taqs zjz#4w?gM%T8{9L!9o};P*!E0A_jobqx!WsRD_t3PJF)8X-}ulFd+w6Zsl3V4Bv*ec z$vu^!7iAx{XhUr~|Kg{gpX`|xoLI=6cd{(pVc%l^x__r_W-_0&TiBw*KV9{*%&hbe ztlu9vy#Hgh(t6#J?Kk|Eg{Rf4TeuiK4LBa)&KJEp@2%KLyWMHNS9<m4tv(ziJ8jj} ze@S0`x_k}yZ4~n=;tOS!J~!3j?9a4s8cvgcm?vpH3^z>VxBq>;P0ZllH~z}(7jvd1 zd|Sl%mo>nfnMH(wfq{b|FJwc=^uCpXZx|RD_A@dtaKpkkH?df+pmOp#M*eyx**8Ha z7Tyo+3J_NBI94>_?!kZi$|fzf^kGx(T)zBy`nTW<EFaD5>ZV-I{%}As*2XsLlSreu zOWv9ZWlJO;DzOUt?tHWJi=zAUDu<MZEg6fXe{;Q)lJlFm-1x{6(Jji>o*S8VYG0c0 z*@!QD%FL>FNnAHpEq=0~GP(T3^CwqsRK-Pa*S%GCWA7RT;|ZBDGael}=a{yzTCg_2 zA%Rg<a?Vfx%X0s&-7V$bZaHB|bL^i-Nu3kQJ1&?MxO_R%R1u?@RCj;=?3;>{|1VOL zty{Nz_S%Hi`|?C<ZkH~(wtPm+9)`_(n3gc|p{BFRc`Q2e*n)<Efq{XML4kpRp?mU9 Y77NA&lRvSTGbT;eVpV4Q%?y$S0FNd$m;e9( diff --git a/uploads/media/ant_XUpI6l7.zip b/uploads/media/ant_XUpI6l7.zip deleted file mode 100644 index f2376c7643fd1a04ba142f07ab3fdf329abd0224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 diff --git a/uploads/media/config.json b/uploads/media/config.json deleted file mode 100644 index 56c5b0c..0000000 --- a/uploads/media/config.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "broker" : "192.168.30.209", - "clients_ssh" : [ - { - "hostname" : "192.168.30.18", - "user" : "pi", - "password" : "raspberry" - }, - { - "hostname" : "192.168.30.227", - "user" : "pi", - "password" : "raspberry" - }, - { - "hostname" : "192.168.30.61", - "user" : "pi", - "password" : "raspberry" - }, - { - "hostname" : "192.168.30.75", - "user" : "pi", - "password" : "raspberry" - } - ] -} \ No newline at end of file diff --git a/uploads/media/env.py b/uploads/media/env.py deleted file mode 100644 index c8a767f..0000000 --- a/uploads/media/env.py +++ /dev/null @@ -1,67 +0,0 @@ - -import sys - - -from iotAmak.environment import Environment -from fork import Fork - - -class PhiEnv(Environment): - - def __init__(self, broker_ip, nbr_phil): - self.nbr_phil = nbr_phil - super().__init__(broker_ip) - - def on_initialization(self): - self.forks = [] - for i in range(self.nbr_phil): - self.forks.append(Fork(i)) - self.subscribe("agent/" + str(i) + "/ask_spoon", self.ask_spoon) - self.subscribe("agent/" + str(i) + "/done_eating", self.done_eating) - - def ask_spoon(self, client, userdata, message): - res = str(message.payload.decode("utf-8")) - agent_id = int(str(message.topic).split("/")[1]) - - if res == "left": - fork_id = agent_id - else: - fork_id = (agent_id - 1) % self.nbr_phil - - if self.forks[fork_id].state == 1: - message = { - "response": "False" - } - elif self.forks[fork_id].taken_by == -1: - message = { - "response": "True", - "side": res, - "state": 0 - } - self.forks[fork_id].taken_by = agent_id - else: - message = { - "response": "True", - "side": res, - "state": 1 - } - self.forks[fork_id].taken_by = agent_id - self.forks[fork_id].state = 1 - - self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message)) - - def done_eating(self, client, userdata, message): - agent_id = int(str(message.topic).split("/")[1]) - - for fork_id in [agent_id, (agent_id - 1) % self.nbr_phil]: - self.forks[fork_id].state = 0 - - def on_cycle_begin(self) -> None: - for fork in self.forks: - self.client.publish("env/fork/" + str(fork.identifier), str(fork.to_msg())) - print("Fork : ", fork.identifier," taken by ", fork.taken_by, " and is :", fork.state) - - -if __name__ == '__main__': - s = PhiEnv(str(sys.argv[1]), 5) - s.run() \ No newline at end of file diff --git a/uploads/media/philosophers.zip b/uploads/media/philosophers.zip deleted file mode 100644 index 7c2deb36c8adeb6b9c9f9e60519c28d58b2724f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3191 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 Z069Shc(byBlyWd|Fvu`5Ft~DocmQ*rAXoqZ diff --git a/uploads/media/philosophers_7r4Esmi.zip b/uploads/media/philosophers_7r4Esmi.zip deleted file mode 100644 index 36a06f59b5c16b862e0b44f85cc23505f35b0377..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3181 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 O2ZIa~1A{dehz9_Z1{22s -- GitLab