Skip to content
Snippets Groups Projects
Commit 1ad5d589 authored by shinedday's avatar shinedday
Browse files

update to 0.0.3, add a config file requirement

parent 29c19d58
No related branches found
No related tags found
No related merge requests found
...@@ -16,9 +16,8 @@ ...@@ -16,9 +16,8 @@
} }
function canvasApp() { function canvasApp() {
var metrics = {{ metrics }};
var cycle = 0; var cycle = 1;
theCanvas = document.getElementById('canvasOne'); theCanvas = document.getElementById('canvasOne');
context = theCanvas.getContext('2d'); context = theCanvas.getContext('2d');
...@@ -27,25 +26,37 @@ ...@@ -27,25 +26,37 @@
context.clearRect(0, 0, theCanvas.width, theCanvas.height); context.clearRect(0, 0, theCanvas.width, theCanvas.height);
} }
function drawScreen() { function drawScreen(metrics) {
erraseCanvas(); erraseCanvas();
var count = metrics[cycle].length; var count = metrics.length;
for (let id_agent = 0; id_agent < count; id_agent++) { for (let id_agent = 0; id_agent < count; id_agent++) {
context.fillStyle = "#000000"; if ( metrics[id_agent][2] == 0){
context.fillStyle = "#000000";
}
else {
context.fillStyle = "#e00000";
}
context.beginPath(); context.beginPath();
context.arc(metrics[cycle][id_agent][0], metrics[cycle][id_agent][1], 1, 0, Math.PI * 2, true); context.arc(metrics[id_agent][0], metrics[id_agent][1], 1, 0, Math.PI * 2, true);
context.closePath(); context.closePath();
context.fill(); context.fill();
} }
} }
function gameLoop() { async function gameLoop() {
if (cycle < metrics.length) { let data = await fetch("./metric/".concat("", cycle.toString().concat("", "/")))
window.setTimeout(gameLoop, 20); .then((response) => response.json())
drawScreen(); .then(data => {return data.data;})
cycle = cycle + 1; while (data.length == 0){
await new Promise(r => setTimeout(r, 1000));
data = await fetch("./metric/".concat("", cycle.toString().concat("", "/")))
.then((response) => response.json())
.then(data => {return data.data;})
} }
drawScreen(data)
cycle = cycle + 1
window.setTimeout(gameLoop, 20);
} }
gameLoop(); gameLoop();
...@@ -99,9 +110,14 @@ ...@@ -99,9 +110,14 @@
<button type='submit'> Kill Amas, Env, Scheduler</button> <button type='submit'> Kill Amas, Env, Scheduler</button>
</form> </form>
<canvas id="canvasOne" width="500" height="500" style="border:1px solid #000000;"> <form action='./export_csv/' method='GET'>
Your browser does not support the HTML 5 Canvas. <button type='submit'> Export all metrics</button>
</canvas> </form>
{% if canvas %}
<canvas id="canvasOne" width="{{ canvas.0 }}" height="{{ canvas.1 }}" style="border:1px solid #000000;">
Your browser does not support the HTML 5 Canvas.
</canvas>
{% endif %}
</body> </body>
......
...@@ -24,4 +24,6 @@ urlpatterns = [ ...@@ -24,4 +24,6 @@ urlpatterns = [
path('play/global/start', views.experiment_start, name='start_exp'), path('play/global/start', views.experiment_start, name='start_exp'),
path('play/global/load', views.experiment_load, name='load_exp'), path('play/global/load', views.experiment_load, name='load_exp'),
path('play/global/kill', views.experiment_kill, name='kill_exp'), path('play/global/kill', views.experiment_kill, name='kill_exp'),
path('play/metric/<int:metrics_id>/', views.experiment_metric, name='metrics'),
path('play/export_csv/', views.export_csv, name='csv'),
] ]
\ No newline at end of file
...@@ -47,7 +47,7 @@ def check(request, experiment_id): ...@@ -47,7 +47,7 @@ def check(request, experiment_id):
delete_folder(str(settings.MEDIA_ROOT) + "/tmp") delete_folder(str(settings.MEDIA_ROOT) + "/tmp")
return HttpResponseRedirect(reverse('ping:experiment')) return HttpResponseRedirect(reverse('ping:experiment'))
required_files = ["amas.py", "agent.py", "env.py", "scheduler.py"] required_files = ["amas.py", "agent.py", "env.py", "scheduler.py", "config.json"]
for required_file in required_files: for required_file in required_files:
if not os.path.exists(folder_path + "/" + required_file): if not os.path.exists(folder_path + "/" + required_file):
exp.status = "Wrong format : " + required_file + " file is expected" exp.status = "Wrong format : " + required_file + " file is expected"
......
...@@ -13,7 +13,7 @@ from ..models import Client, Agent ...@@ -13,7 +13,7 @@ from ..models import Client, Agent
def update(request): def update(request):
ssh = get_ssh_client() ssh = get_ssh_client()
version = "0.0.2" version = "0.0.3"
commands = [ commands = [
Cmd( Cmd(
cmd="cd Desktop/mqtt_goyon/iotamak-core" cmd="cd Desktop/mqtt_goyon/iotamak-core"
......
import csv
import os import os
import sys import sys
import zipfile import zipfile
import json
from ast import literal_eval from ast import literal_eval
from subprocess import Popen from subprocess import Popen
from time import sleep from time import sleep
from django.conf import settings 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.template import loader
from django.urls import reverse from django.urls import reverse
from iotAmak.tool.ssh_client import Cmd from iotAmak.tool.ssh_client import Cmd
...@@ -17,6 +20,7 @@ from ..models import Experiment, CurrentExperiment, Metrics ...@@ -17,6 +20,7 @@ from ..models import Experiment, CurrentExperiment, Metrics
client = MQTTClient(client_id="django-ihm") client = MQTTClient(client_id="django-ihm")
def subscribe(mqttclient, topic, fun): def subscribe(mqttclient, topic, fun):
mqttclient.subscribe(topic) mqttclient.subscribe(topic)
mqttclient.message_callback_add(topic, fun) mqttclient.message_callback_add(topic, fun)
...@@ -36,6 +40,7 @@ def agent_metric(client, userdata, message) -> None: ...@@ -36,6 +40,7 @@ def agent_metric(client, userdata, message) -> None:
metric = Metrics(cycle=exp.cycle, metrics=results) metric = Metrics(cycle=exp.cycle, metrics=results)
metric.save() metric.save()
def cycle_done(client, userdata, message) -> None: def cycle_done(client, userdata, message) -> None:
cur_exp = CurrentExperiment.objects.all()[0] cur_exp = CurrentExperiment.objects.all()[0]
cur_exp.cycle += 1 cur_exp.cycle += 1
...@@ -47,8 +52,8 @@ def update_nbr_agent(client, userdata, message) -> None: ...@@ -47,8 +52,8 @@ def update_nbr_agent(client, userdata, message) -> None:
exp.nbr_agent += 1 exp.nbr_agent += 1
exp.save() exp.save()
def experiment_load(request):
def experiment_load(request):
delete_folder(str(settings.MEDIA_ROOT) + "current_experiment") delete_folder(str(settings.MEDIA_ROOT) + "current_experiment")
exp = Experiment.objects.get(status="Selected") exp = Experiment.objects.get(status="Selected")
...@@ -66,9 +71,9 @@ def experiment_load(request): ...@@ -66,9 +71,9 @@ def experiment_load(request):
return HttpResponseRedirect(reverse('ping:play')) return HttpResponseRedirect(reverse('ping:play'))
def experiment_start(request):
broker_ip = "192.168.157.209" def experiment_start(request):
broker_ip = "192.168.236.209"
ssh = get_ssh_client() ssh = get_ssh_client()
experiment_path = str(settings.MEDIA_ROOT) + "current_experiment/" + Experiment.objects.get(status="Selected").name experiment_path = str(settings.MEDIA_ROOT) + "current_experiment/" + Experiment.objects.get(status="Selected").name
...@@ -82,13 +87,13 @@ def experiment_start(request): ...@@ -82,13 +87,13 @@ def experiment_start(request):
subscribe(client, "amas/all_metric", agent_metric) subscribe(client, "amas/all_metric", agent_metric)
# start subprocess scheduler # start subprocess scheduler
p1 = Popen([sys.executable, experiment_path+'/scheduler.py', broker_ip]) p1 = Popen([sys.executable, experiment_path + '/scheduler.py', broker_ip])
sleep(1) sleep(1)
# start subprocess amas # start subprocess amas
send_client = [c.to_send() for c in ssh.clients] send_client = [c.to_send() for c in ssh.clients]
p2 = Popen([sys.executable, experiment_path+'/amas.py', broker_ip, str(send_client)]) p2 = Popen([sys.executable, experiment_path + '/amas.py', broker_ip, str(send_client)])
# start subprocess env # start subprocess env
p3 = Popen([sys.executable, experiment_path+'/env.py', broker_ip]) p3 = Popen([sys.executable, experiment_path + '/env.py', broker_ip])
exp = CurrentExperiment.objects.all()[0] exp = CurrentExperiment.objects.all()[0]
exp.amas_pid = p2.pid exp.amas_pid = p2.pid
...@@ -98,9 +103,24 @@ def experiment_start(request): ...@@ -98,9 +103,24 @@ def experiment_start(request):
return HttpResponseRedirect(reverse('ping:play')) return HttpResponseRedirect(reverse('ping:play'))
def main_play(request): def main_play(request):
context = {}
canvas = []
if len(CurrentExperiment.objects.all()) > 0: if len(CurrentExperiment.objects.all()) > 0:
cycle = CurrentExperiment.objects.all()[0].cycle cycle = CurrentExperiment.objects.all()[0].cycle
exp = CurrentExperiment.objects.all()[0]
with open(
str(settings.MEDIA_ROOT) + "current_experiment/" + exp.name + "/config.json",
mode='r',
encoding='utf-8'
) as f:
data = json.load(f)
if "canvas" in data:
canvas = [data.get("canvas").get("height"), data.get("canvas").get("width")]
else: else:
cycle = 0 cycle = 0
metrics = [] metrics = []
...@@ -112,8 +132,10 @@ def main_play(request): ...@@ -112,8 +132,10 @@ def main_play(request):
metrics.append(cycle_metrics) metrics.append(cycle_metrics)
context["metrics"] = metrics
context["canvas"] = canvas
template = loader.get_template('ping/play.html') template = loader.get_template('ping/play.html')
context = {"metrics": metrics}
return HttpResponse(template.render(context, request)) return HttpResponse(template.render(context, request))
...@@ -131,6 +153,7 @@ def scheduler_start(request): ...@@ -131,6 +153,7 @@ def scheduler_start(request):
client.publish("ihm/unpause") client.publish("ihm/unpause")
return HttpResponseRedirect(reverse('ping:play')) return HttpResponseRedirect(reverse('ping:play'))
def experiment_share(request): def experiment_share(request):
# get selected experiment # get selected experiment
exp = Experiment.objects.get(status="Selected") exp = Experiment.objects.get(status="Selected")
...@@ -152,18 +175,47 @@ def experiment_share(request): ...@@ -152,18 +175,47 @@ def experiment_share(request):
return HttpResponseRedirect(reverse('ping:play')) return HttpResponseRedirect(reverse('ping:play'))
def experiment_stop(request): def experiment_stop(request):
client.publish("ihm/exit") client.publish("ihm/exit")
client.publish("ihm/step") client.publish("ihm/step")
return HttpResponseRedirect(reverse('ping:play')) return HttpResponseRedirect(reverse('ping:play'))
def experiment_kill(request): def experiment_kill(request):
exp = CurrentExperiment.objects.all()[0] exp = CurrentExperiment.objects.all()[0]
if exp.amas_pid != 0 : if exp.amas_pid != 0:
os.system("kill "+str(exp.amas_pid)) os.system("kill " + str(exp.amas_pid))
if exp.env_pid != 0 : if exp.env_pid != 0:
os.system("kill "+str(exp.env_pid)) os.system("kill " + str(exp.env_pid))
if exp.scheduler_pid != 0 : if exp.scheduler_pid != 0:
os.system("kill "+str(exp.scheduler_pid)) os.system("kill " + str(exp.scheduler_pid))
return HttpResponseRedirect(reverse('ping:play')) return HttpResponseRedirect(reverse('ping:play'))
def experiment_metric(request, metrics_id):
raw_metrics = Metrics.objects.filter(cycle=metrics_id)
if len(raw_metrics) == 0:
return JsonResponse({'data': []})
else:
cycle_metrics = [
[metric.get("x"), metric.get("y"), metric.get("color")]
for metric in raw_metrics[0].metrics if metric != {}]
return JsonResponse({'data': cycle_metrics})
def export_csv(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="users.csv"'
writer = csv.writer(response)
writer.writerow(['cycle'] + ["Agent_"+key for key in Metrics.objects.order_by('?').first().metrics[0].keys()])
for m in Metrics.objects.all():
cycle = m.cycle
metrics = m.metrics
for metric in metrics:
if metric != {}:
writer.writerow([cycle] + [value for value in metric.values()])
return response
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment