diff --git a/.gitignore b/.gitignore index 5cc30b11118c1d1ed582f34035c76b420c5805eb..bb2256e64c7ca2269012d3ff1472466354f34b87 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 Binary files a/db.sqlite3 and /dev/null differ diff --git a/ping/migrations/0001_initial.py b/ping/migrations/0001_initial.py deleted file mode 100644 index ae0c37f73e11cbb2e187439556f37a476c144143..0000000000000000000000000000000000000000 --- 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 c06c6d60dcf15c768fd20542a0605ce4ebb46062..0000000000000000000000000000000000000000 --- 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 d014e25f9508d4c05a52c3c3bb4038f585fa4c7a..0000000000000000000000000000000000000000 --- 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 ecc17795aad954629623f58144890dc7fdfbd6b5..7731b893404518c72be9642b47fe585292ffddea 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 e725a128fed66979a861d03286772ffa7fa3cf80..8e067ae0161f6be493a43409b798230114617f03 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 4e63881224eaf9e740978e16f18b2350aef391ab..449b3170923438af7ee2bc6ae7d689c770427303 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 ebc8c51a6ebc4dbbc00dafe808576949405d06bf..b0f0affb4ce4f7b7561a36758229fe5db42bbbae 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 133b8fbff2a66971b9292a6bb3193c535437f0bf..1dcf382abcc5c040fcf507333e3456de2eea3c34 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 ca83afb55b19a44481fd2e518ec02df151427151..c0ed1ba151d8dd9052911fd8e0c921a50932e97e 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 5a13bc786bd60451425f50eba978fc0257d2b894..f9e147a6e4380e2a8a0d634ec3f36ed37d24ea7f 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 60d8fbad96d73ddf2e1e31a8c5b32f09a3ffbdb6..c2518131039ea9cc5b1f806dcaa2015e7dd70c33 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 0000000000000000000000000000000000000000..172d5f4b0ca30f229fb3b4960340f7e9f3fcc15e --- /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 80f5688cfe9fe0dee42baf3c1331b025c19e6c77..b51b4f58367b9db6dd3051406ede66651884cb74 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 99a0586c10c2185bf7ed813e58b6ee83c7934747..f4746a97671a7d400239f6124b5576dc5c0bc6b8 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 1b8e3f306293dc9151a0de60da43dd8a772f3b20..0000000000000000000000000000000000000000 --- 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 Binary files a/uploads/media/ant.zip and b/uploads/media/ant.zip differ diff --git a/uploads/media/ant_XUpI6l7.zip b/uploads/media/ant_XUpI6l7.zip deleted file mode 100644 index f2376c7643fd1a04ba142f07ab3fdf329abd0224..0000000000000000000000000000000000000000 Binary files a/uploads/media/ant_XUpI6l7.zip and /dev/null differ diff --git a/uploads/media/config.json b/uploads/media/config.json deleted file mode 100644 index 56c5b0c82bcd9281d321f063c9d5bcd5237c6b1f..0000000000000000000000000000000000000000 --- 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 c8a767fd18a98aabce6994c1864789c28a374ee5..0000000000000000000000000000000000000000 --- 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 Binary files a/uploads/media/philosophers.zip and /dev/null differ diff --git a/uploads/media/philosophers_7r4Esmi.zip b/uploads/media/philosophers_7r4Esmi.zip deleted file mode 100644 index 36a06f59b5c16b862e0b44f85cc23505f35b0377..0000000000000000000000000000000000000000 Binary files a/uploads/media/philosophers_7r4Esmi.zip and /dev/null differ