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
Branches
No related tags found
No related merge requests found
......@@ -16,9 +16,8 @@
}
function canvasApp() {
var metrics = {{ metrics }};
var cycle = 0;
var cycle = 1;
theCanvas = document.getElementById('canvasOne');
context = theCanvas.getContext('2d');
......@@ -27,25 +26,37 @@
context.clearRect(0, 0, theCanvas.width, theCanvas.height);
}
function drawScreen() {
function drawScreen(metrics) {
erraseCanvas();
var count = metrics[cycle].length;
var count = metrics.length;
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.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.fill();
}
}
function gameLoop() {
if (cycle < metrics.length) {
window.setTimeout(gameLoop, 20);
drawScreen();
cycle = cycle + 1;
async function gameLoop() {
let data = await fetch("./metric/".concat("", cycle.toString().concat("", "/")))
.then((response) => response.json())
.then(data => {return data.data;})
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();
......@@ -99,9 +110,14 @@
<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>
<form action='./export_csv/' method='GET'>
<button type='submit'> Export all metrics</button>
</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>
......
......@@ -24,4 +24,6 @@ urlpatterns = [
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'),
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):
delete_folder(str(settings.MEDIA_ROOT) + "/tmp")
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:
if not os.path.exists(folder_path + "/" + required_file):
exp.status = "Wrong format : " + required_file + " file is expected"
......
......@@ -13,7 +13,7 @@ from ..models import Client, Agent
def update(request):
ssh = get_ssh_client()
version = "0.0.2"
version = "0.0.3"
commands = [
Cmd(
cmd="cd Desktop/mqtt_goyon/iotamak-core"
......
import csv
import os
import sys
import zipfile
import json
from ast import literal_eval
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
......@@ -17,6 +20,7 @@ from ..models import Experiment, CurrentExperiment, Metrics
client = MQTTClient(client_id="django-ihm")
def subscribe(mqttclient, topic, fun):
mqttclient.subscribe(topic)
mqttclient.message_callback_add(topic, fun)
......@@ -36,6 +40,7 @@ def agent_metric(client, userdata, message) -> None:
metric = Metrics(cycle=exp.cycle, metrics=results)
metric.save()
def cycle_done(client, userdata, message) -> None:
cur_exp = CurrentExperiment.objects.all()[0]
cur_exp.cycle += 1
......@@ -47,8 +52,8 @@ def update_nbr_agent(client, userdata, message) -> None:
exp.nbr_agent += 1
exp.save()
def experiment_load(request):
def experiment_load(request):
delete_folder(str(settings.MEDIA_ROOT) + "current_experiment")
exp = Experiment.objects.get(status="Selected")
......@@ -66,9 +71,9 @@ def experiment_load(request):
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()
experiment_path = str(settings.MEDIA_ROOT) + "current_experiment/" + Experiment.objects.get(status="Selected").name
......@@ -82,13 +87,13 @@ def experiment_start(request):
subscribe(client, "amas/all_metric", agent_metric)
# 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)
# start subprocess amas
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
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.amas_pid = p2.pid
......@@ -98,9 +103,24 @@ def experiment_start(request):
return HttpResponseRedirect(reverse('ping:play'))
def main_play(request):
context = {}
canvas = []
if len(CurrentExperiment.objects.all()) > 0:
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:
cycle = 0
metrics = []
......@@ -112,8 +132,10 @@ def main_play(request):
metrics.append(cycle_metrics)
context["metrics"] = metrics
context["canvas"] = canvas
template = loader.get_template('ping/play.html')
context = {"metrics": metrics}
return HttpResponse(template.render(context, request))
......@@ -131,6 +153,7 @@ def scheduler_start(request):
client.publish("ihm/unpause")
return HttpResponseRedirect(reverse('ping:play'))
def experiment_share(request):
# get selected experiment
exp = Experiment.objects.get(status="Selected")
......@@ -152,18 +175,47 @@ def experiment_share(request):
return HttpResponseRedirect(reverse('ping:play'))
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))
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'))
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