diff --git a/apps/main/models.py b/apps/main/models.py index 68e2b26..d8f20c0 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -124,6 +124,11 @@ class Device(models.Model): return color + @property + def url(self): + + return 'http://{}:{}/'.format(self.ip_address, self.port_address) + def get_absolute_url(self): return reverse('url_device', args=[str(self.id)]) diff --git a/apps/main/templates/dev_conf.html b/apps/main/templates/dev_conf.html index 171ce2b..8cb22c5 100644 --- a/apps/main/templates/dev_conf.html +++ b/apps/main/templates/dev_conf.html @@ -37,7 +37,7 @@ - + {% for key in dev_conf_keys %} diff --git a/apps/main/templates/operation.html b/apps/main/templates/operation.html index cf523ae..94f8429 100644 --- a/apps/main/templates/operation.html +++ b/apps/main/templates/operation.html @@ -57,11 +57,12 @@ {% for item in location.experiments %} {% if location.name in item.location.name %} - {% for key in experiment_keys %} - {% if 'status' in key %} + {% if 'name' in key %} + + {% elif 'status' in key %} {% else %} diff --git a/apps/main/views.py b/apps/main/views.py index ae33215..712ec1a 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -1399,6 +1399,7 @@ def get_paginator(model, page, order, filters={}, n=10): def operation(request, id_camp=None): kwargs = {} + kwargs['no_sidebar'] = True campaigns = Campaign.objects.filter(start_date__lte=datetime.now(), end_date__gte=datetime.now()).order_by('-start_date') @@ -1412,8 +1413,6 @@ def operation(request, id_camp=None): kwargs['form'] = form return render(request, 'operation.html', kwargs) - - #---Experiment keys = ['id', 'name', 'start_time', 'end_time', 'status'] kwargs['experiment_keys'] = keys[1:] @@ -1423,7 +1422,7 @@ def operation(request, id_camp=None): #---Else kwargs['title'] = 'Campaign' kwargs['suptitle'] = campaign.name - kwargs['form'] = form + kwargs['form'] = form return render(request, 'operation.html', kwargs) diff --git a/apps/rc/models.py b/apps/rc/models.py index 0da7146..853da79 100644 --- a/apps/rc/models.py +++ b/apps/rc/models.py @@ -1,7 +1,9 @@ import ast import json +import requests import numpy as np +from base64 import b64encode from django.db import models from django.core.urlresolvers import reverse @@ -258,60 +260,60 @@ class RCConfiguration(Configuration): def add_data(self, value): return (254, value-1) - - def parms_to_binary(self): + + def parms_to_binary(self, dat=True): ''' Create "dat" stream to be send to CR ''' - data = [] + data = bytearray() # create header - data.append(self.add_cmd('DISABLE')) - data.append(self.add_cmd('CONTINUE')) - data.append(self.add_cmd('RESTART')) + data.extend(self.add_cmd('DISABLE')) + data.extend(self.add_cmd('CONTINUE')) + data.extend(self.add_cmd('RESTART')) if self.control_sw: - data.append(self.add_cmd('SW_ONE')) + data.extend(self.add_cmd('SW_ONE')) else: - data.append(self.add_cmd('SW_ZERO')) + data.extend(self.add_cmd('SW_ZERO')) if self.control_tx: - data.append(self.add_cmd('TX_ONE')) + data.extend(self.add_cmd('TX_ONE')) else: - data.append(self.add_cmd('TX_ZERO')) + data.extend(self.add_cmd('TX_ZERO')) # write divider - data.append(self.add_cmd('CLOCK_DIVIDER')) - data.append(self.add_data(self.clock_divider)) + data.extend(self.add_cmd('CLOCK_DIVIDER')) + data.extend(self.add_data(self.clock_divider)) # write delays - data.append(self.add_cmd('DELAY_START')) + data.extend(self.add_cmd('DELAY_START')) # first delay is always zero - data.append(self.add_data(1)) + data.extend(self.add_data(1)) delays = self.get_delays() for delay in delays: while delay>252: - data.append(self.add_data(253)) + data.extend(self.add_data(253)) delay -= 253 - data.append(self.add_data(delay)) + data.extend(self.add_data(int(delay))) # write flips - data.append(self.add_cmd('FLIP_START')) + data.extend(self.add_cmd('FLIP_START')) states = self.get_pulses(binary=False) for flips, delay in zip(states, delays): flips.reverse() flip = int(''.join([str(x) for x in flips]), 2) - data.append(self.add_data(flip+1)) + data.extend(self.add_data(flip+1)) while delay>252: - data.append(self.add_data(1)) + data.extend(self.add_data(1)) delay -= 253 # write sampling period - data.append(self.add_cmd('SAMPLING_PERIOD')) + data.extend(self.add_cmd('SAMPLING_PERIOD')) wins = self.get_lines(line_type__name='windows') if wins: win_params = json.loads(wins[0].params)['params'] @@ -321,12 +323,16 @@ class RCConfiguration(Configuration): dh = 1 else: dh = 1 - data.append(self.add_data(dh)) + data.extend(self.add_data(dh)) # write enable - data.append(self.add_cmd('ENABLE')) + data.extend(self.add_cmd('ENABLE')) + + if not dat: + return data + + return '\n'.join(['{}'.format(x) for x in data]) - return '\n'.join(['{}'.format(x) for tup in data for x in tup]) def update_from_file(self, filename): ''' @@ -342,7 +348,7 @@ class RCConfiguration(Configuration): for line in self.get_lines(): line.update_pulses() - def plot_pulses(self, km=False): + def plot_pulses2(self, km=False): import matplotlib.pyplot as plt from bokeh.resources import CDN @@ -354,7 +360,7 @@ class RCConfiguration(Configuration): N = len(lines) npoints = self.total_units/self.km2unit if km else self.total_units - fig = plt.figure(figsize=(10, 2+N*0.5)) + fig = plt.figure(figsize=(12, 2+N*0.5)) ax = fig.add_subplot(111) labels = ['IPP'] @@ -377,52 +383,138 @@ class RCConfiguration(Configuration): ax.set_yticks(range(len(labels))) ax.set_yticklabels(labels) ax.set_xlabel = 'Units' - plot = to_bokeh(fig, use_pandas=False) + plot = to_bokeh(fig, use_pandas=False) plot.tools = [PanTool(dimensions=['width']), WheelZoomTool(dimensions=['width']), ResetTool(), SaveTool()] plot.toolbar_location="above" return components(plot, CDN) - def status_device(self): + def plot_pulses(self, km=False): - return 0 + from bokeh.plotting import figure + from bokeh.resources import CDN + from bokeh.embed import components + from bokeh.models import FixedTicker, PrintfTickFormatter + from bokeh.models.tools import WheelZoomTool, ResetTool, PanTool, HoverTool, SaveTool + from bokeh.models.sources import ColumnDataSource - def stop_device(self): + lines = self.get_lines().reverse() + + N = len(lines) + npoints = self.total_units/self.km2unit if km else self.total_units + ipp = self.ipp if km else self.ipp*self.km2unit + + hover = HoverTool(tooltips=[("Line", "@name"), + ("IPP", "@ipp"), + ("X", "@left")]) + + tools = [PanTool(dimensions=['width']), + WheelZoomTool(dimensions=['width']), + hover, SaveTool()] + + plot = figure(width=1000, + height=40+N*50, + y_range = (0, N), + tools=tools, + toolbar_location='above', + toolbar_sticky=False,) + + plot.xaxis.axis_label = 'Km' if km else 'Units' + plot.xaxis[0].formatter = PrintfTickFormatter(format='%d') + plot.yaxis.axis_label = 'Pulses' + plot.yaxis[0].ticker=FixedTicker(ticks=list(range(N))) + plot.yaxis[0].formatter = PrintfTickFormatter(format='Line %d') + + for i, line in enumerate(lines): + + points = [tup for tup in line.pulses_as_points(km=km) if tup!=(0,0)] + + source = ColumnDataSource(data = dict( + bottom = [i for tup in points], + top = [i+0.5 for tup in points], + left = [tup[0] for tup in points], + right = [tup[1] for tup in points], + ipp = [int(tup[0]/ipp) for tup in points], + name = [line.get_name() for tup in points] + )) + + plot.quad( + bottom = 'bottom', + top = 'top', + left = 'left', + right = 'right', + source = source, + fill_alpha = 0, + #line_color = 'blue', + ) + + plot.line([0, npoints], [i, i])#, color='blue') + + return components(plot, CDN) - answer = api.disable(ip = self.device.ip_address, - port = self.device.port_address) + def status_device(self): - if answer[0] != "1": - self.message = answer[0:] + try: + req = requests.get(self.device.url) + payload = req.json() + if payload['status']=='ok': + self.device.status = 3 + else: + self.device.status = 1 + except: + self.device.status = 0 + + self.device.save() + + return self.device.status + + + def reset_device(self): + + payload = bytearray() + payload.extend(self.add_cmd('RESTART')) + data = b64encode(payload) + req = requests.put(self.device.url, data) + + if data==req.text.encode('utf8'): + return 1 + else: return 0 + + def stop_device(self): - self.message = answer[2:] - return 1 + payload = bytearray() + payload.extend(self.add_cmd('DISABLE')) + data = b64encode(payload) + req = requests.put(self.device.url, data) + + if data==req.text.encode('utf8'): + return 1 + else: + return 0 def start_device(self): - answer = api.enable(ip = self.device.ip_address, - port = self.device.port_address) - - if answer[0] != "1": - self.message = answer[0:] + payload = bytearray() + payload.extend(self.add_cmd('ENABLE')) + data = b64encode(payload) + req = requests.put(self.device.url, data) + + if data==req.text.encode('utf8'): + return 1 + else: return 0 - self.message = answer[2:] - return 1 - def write_device(self): - answer = api.write_config(ip = self.device.ip_address, - port = self.device.port_address, - parms = self.parms_to_dict()) - - if answer[0] != "1": - self.message = answer[0:] + + data = b64encode(self.parms_to_binary(dat=False)) + req = requests.put(self.device.url, data) + print(req.text) + if data==req.text.encode('utf8'): + return 1 + else: return 0 - self.message = answer[2:] - return 1 - class RCLineCode(models.Model): @@ -550,7 +642,7 @@ class RCLine(models.Model): km2unit = self.rc_configuration.km2unit us2unit = self.rc_configuration.us2unit ipp = self.rc_configuration.ipp - ntx = self.rc_configuration.ntx + ntx = int(self.rc_configuration.ntx) ipp_u = int(ipp*km2unit) total = ipp_u*ntx if self.rc_configuration.total_units==0 else self.rc_configuration.total_units y = [] diff --git a/apps/rc/urls.py b/apps/rc/urls.py index 55cae1c..c0ff544 100644 --- a/apps/rc/urls.py +++ b/apps/rc/urls.py @@ -7,6 +7,7 @@ urlpatterns = ( url(r'^(?P-?\d+)/import/$', views.import_file, name='url_import_rc_conf'), url(r'^(?P-?\d+)/edit/$', views.conf_edit, name='url_edit_rc_conf'), url(r'^(?P-?\d+)/plot/$', views.plot_pulses, name='url_plot_rc_pulses'), + url(r'^(?P-?\d+)/plot2/$', views.plot_pulses2, name='url_plot_rc_pulses'), #url(r'^(?P-?\d+)/write/$', 'apps.main.views.dev_conf_write', name='url_write_rc_conf'), #url(r'^(?P-?\d+)/read/$', 'apps.main.views.dev_conf_read', name='url_read_rc_conf'), diff --git a/apps/rc/views.py b/apps/rc/views.py index f2ab949..75179f9 100644 --- a/apps/rc/views.py +++ b/apps/rc/views.py @@ -360,7 +360,31 @@ def plot_pulses(request, conf_id): script, div = conf.plot_pulses(km=km) kwargs = {} + kwargs['no_sidebar'] = True + kwargs['title'] = 'RC Pulses' + kwargs['suptitle'] = conf.name + kwargs['div'] = mark_safe(div) + kwargs['script'] = mark_safe(script) + kwargs['units'] = conf.km2unit + kwargs['kms'] = 1/conf.km2unit + + if km: + kwargs['km_selected'] = True + + if 'json' in request.GET: + return HttpResponse(json.dumps({'div':mark_safe(div), 'script':mark_safe(script)}), content_type="application/json") + else: + return render(request, 'rc_pulses.html', kwargs) + +def plot_pulses2(request, conf_id): + conf = get_object_or_404(RCConfiguration, pk=conf_id) + km = True if 'km' in request.GET else False + + script, div = conf.plot_pulses2(km=km) + + kwargs = {} + kwargs['no_sidebar'] = True kwargs['title'] = 'RC Pulses' kwargs['suptitle'] = conf.name kwargs['div'] = mark_safe(div)
Status{%if status != "No connected" %} {{status}} {% else %} {{status}} {% endif %} {{dev_conf.device.get_status_display}}
{{ forloop.counter }}{{ item|value:key }}{{ item|value:key }}{{ item|value:key }}