From 33c77d9a34dfb7a341c1646308fb87e9e0c3700f 2016-02-02 21:50:09 From: Miguel Urco Date: 2016-02-02 21:50:09 Subject: [PATCH] git-svn-id: http://jro-dev.igp.gob.pe/svn/jro_hard/radarsys/trunk/webapp@44 aa17d016-51d5-4e8b-934c-7b2bbb1bbe71 --- diff --git a/apps/dds/forms.py b/apps/dds/forms.py index f03a988..bc2cfad 100644 --- a/apps/dds/forms.py +++ b/apps/dds/forms.py @@ -2,15 +2,28 @@ from django import forms from apps.main.models import Device from .models import DDSConfiguration -from django.core.validators import MinValueValidator, MaxValueValidator +# from django.core.validators import MinValueValidator, MaxValueValidator class DDSConfigurationForm(forms.ModelForm): - frequency = forms.FloatField(label='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)]) - phase = forms.FloatField(label='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)]) +# frequency_bin = forms.IntegerField(label='Frequency (Binary)', required=False) +# phase_bin = forms.IntegerField(label='Phase (Binary)', required=False) - frequency_mod = forms.FloatField(label='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], required=False) - phase_mod = forms.FloatField(label='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], required=False) +# frequency_mod_bin = forms.IntegerField(label='Frequency Mod (Binary)', required=False) +# phase_mod_bin = forms.IntegerField(label='Phase Mod (Binary)', required=False) + + field_order = ['experiment', 'device', + 'clock', 'multiplier', + 'frequency', + 'frequency_bin', + 'phase', + 'phase_bin', + 'amplitude_chA', 'amplitude_chB', + 'modulation', + 'frequency_mod', + 'frequency_mod_bin', + 'phase_mod', + 'phase_mod_bin'] def __init__(self, *args, **kwargs): #request = kwargs.pop('request') @@ -21,10 +34,11 @@ class DDSConfigurationForm(forms.ModelForm): if instance and instance.pk: devices = Device.objects.filter(device_type__name='dds') - items = devices.values('id', 'name', 'device_type__name', 'ip_address') self.fields['experiment'].widget.attrs['readonly'] = True - self.fields['device'].widget.choices = [(item['id'], '[%s]: %s | %s' % (item['device_type__name'], item['name'], item['ip_address'])) for item in items] + self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)] + + self.fields['device'].widget.choices = [(device.id, device) for device in devices] def clean(self): @@ -33,4 +47,4 @@ class DDSConfigurationForm(forms.ModelForm): class Meta: model = DDSConfiguration - fields = ('experiment', 'device', 'clock', 'multiplier', 'modulation') + exclude = ('type','parameters') diff --git a/apps/dds/models.py b/apps/dds/models.py index e58706c..fa9ff13 100644 --- a/apps/dds/models.py +++ b/apps/dds/models.py @@ -3,28 +3,74 @@ from apps.main.models import Configuration # Create your models here. from django.core.validators import MinValueValidator, MaxValueValidator +from django.core.exceptions import ValidationError MOD_TYPES = ( (None, 'Select a modulation type'), - (0, 'No modulation'), - (1, 'ASK'), - (2, 'FSK'), - (3, 'PSK'), + (0, 'Single Tone'), + (1, 'FSK'), + (2, 'Ramped FSK'), + (3, 'Chirp'), + (4, 'BPSK'), ) class DDSConfiguration(Configuration): - clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(50)], blank=True, null=True) + DDS_NBITS = 48 + + clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)]) multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4) - freq_reg = models.PositiveIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**32-1)], blank=True, null=True) - phase_reg = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True) + + frequency = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=17, decimal_places=15) + frequency_bin = models.BigIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)]) - amplitude_chA = models.PositiveIntegerField(verbose_name='Amplitude CHA',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True) - amplitude_chB = models.PositiveIntegerField(verbose_name='Amplitude CHB',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True) + phase = models.FloatField(verbose_name='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)]) +# phase_binary = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)]) + + amplitude_ch_A = models.PositiveIntegerField(verbose_name='Amplitude CHA',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True) + amplitude_ch_B = models.PositiveIntegerField(verbose_name='Amplitude CHB',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True) modulation = models.PositiveIntegerField(choices = MOD_TYPES, default = 0) - freq_reg_mod = models.PositiveIntegerField(verbose_name='Frequency Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**32-1)], blank=True, null=True) - phase_reg_mod = models.PositiveIntegerField(verbose_name='Phase Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True) + + frequency_mod = models.DecimalField(verbose_name='Frequency Mod. (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=17, decimal_places=15, blank=True, null=True) + frequency_mod_bin = models.BigIntegerField(verbose_name='Frequency Mod. (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True) + + phase_mod = models.FloatField(verbose_name='Phase Mod. (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True) +# phase_binary_mod = models.PositiveIntegerField(verbose_name='Phase Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True) + + def get_nbits(self): + + return self.DDS_NBITS + + def clean(self): + + if self.modulation in [1,2,3]: + if self.frequency_mod is None or self.frequency_mod_bin is None: + raise ValidationError({ + 'frequency_mod': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected' + }) + + if self.modulation in [4,]: + if self.phase_mod is None: + raise ValidationError({ + 'phase_mod': 'Phase modulation has to be defined when BPSK modulation is selected' + }) + + def verify_frequencies(self): + + return True + + def freq2binary(self, freq, mclock): + + binary = (float(freq)/mclock)*(2**self.DDS_NBITS) + + return binary + + def binary2freq(self, binary, mclock): + + freq = (float(binary)/(2**self.DDS_NBITS))*mclock + + return freq class Meta: db_table = 'dds_configurations' diff --git a/apps/dds/templates/dds_conf.html b/apps/dds/templates/dds_conf.html index c2c0c61..294944b 100644 --- a/apps/dds/templates/dds_conf.html +++ b/apps/dds/templates/dds_conf.html @@ -1,4 +1,53 @@ -{% extends "dev_conf.html" %} +{% extends "base.html" %} +{% load bootstrap3 %} +{% load static %} +{% load main_tags %} + +{% block conf-active %}active{% endblock %} + +{% block content-title %}{{title}}{% endblock %} +{% block content-suptitle %}{{suptitle}}{% endblock %} + +{% block content %} + + + + {% for item in dev_conf_keys %} + + {% endfor %} + + + + {% if form.modulation.value == 0 %} + {% endif %} + + {% if form.modulation.value == 1 %} + + {% endif %} + + {% if form.modulation.value == 2 %} + + {% endif %} + + {% if form.modulation.value == 3 %} + + {% endif %} + + {% if form.modulation.value == 4 %} + + {% endif %} +
Status{%if connected == True %} ☘ Connected {% else %} ⛔ Disconnected {% endif %}
{{item|title}}{{dev_conf|attr:item}}
{{form.modulation.label}}{{form.modulation}}
{{form.frequency_mod.label}}{{form.frequency_mod.value}}
{{form.frequency_mod.label}}{{form.frequency_mod.value}}
{{form.frequency_mod.label}}{{form.frequency_mod.value}}
{{form.phase_mod.label}}{{form.phase_mod.value}}
+ + + + + +

+{% endblock %} + +{% block sidebar%} +{% include "sidebar_devices.html" %} +{% endblock %} {% block extra-js%} {% endblock %} \ No newline at end of file diff --git a/apps/dds/templates/dds_conf_edit.html b/apps/dds/templates/dds_conf_edit.html index 029ea49..efd91eb 100644 --- a/apps/dds/templates/dds_conf_edit.html +++ b/apps/dds/templates/dds_conf_edit.html @@ -1 +1,90 @@ -{% extends "dev_conf_edit.html" %} \ No newline at end of file +{% extends "dev_conf_edit.html" %} +{% load bootstrap3 %} +{% load static %} +{% load main_tags %} + +{% block extra-js%} + +{% endblock %} \ No newline at end of file diff --git a/apps/dds/urls.py b/apps/dds/urls.py index 00a41d4..3b29afb 100644 --- a/apps/dds/urls.py +++ b/apps/dds/urls.py @@ -2,5 +2,8 @@ from django.conf.urls import url urlpatterns = ( url(r'^(?P-?\d+)/$', 'apps.dds.views.dds_conf', name='url_dds_conf'), + url(r'^(?P-?\d+)/(?P-?\d+)/$', 'apps.dds.views.dds_conf', name='url_dds_conf'), url(r'^(?P-?\d+)/edit/$', 'apps.dds.views.dds_conf_edit', name='url_edit_dds_conf'), + url(r'^(?P-?\d+)/write/$', 'apps.dds.views.dds_conf_write', name='url_dds_conf_write'), + url(r'^(?P-?\d+)/read/$', 'apps.dds.views.dds_conf_read', name='url_dds_conf_read'), ) diff --git a/apps/dds/views.py b/apps/dds/views.py index 7fce463..eab23af 100644 --- a/apps/dds/views.py +++ b/apps/dds/views.py @@ -1,24 +1,42 @@ # Create your views here. - +from django.contrib import messages from django.shortcuts import redirect, render, get_object_or_404 from apps.main.models import Experiment, Configuration +from apps.main.views import sidebar + from .models import DDSConfiguration from .forms import DDSConfigurationForm # Create your views here. +from radarsys_api import jro_device, dds + def dds_conf(request, id_conf): conf = get_object_or_404(DDSConfiguration, pk=id_conf) + if request.method=='GET': + form = DDSConfigurationForm(instance=conf) + + answer = dds.echo(ip=str(conf.device.ip_address), port=conf.device.port_address) + kwargs = {} + kwargs['connected'] = (answer[0] == "1") + kwargs['form'] = form + kwargs['dev_conf'] = conf kwargs['dev_conf_keys'] = ['experiment', 'device', 'clock', 'multiplier', - 'freq_reg', 'phase_reg', - 'amplitude_chA', 'amplitude_chB', - 'modulation', - 'freq_reg_mod', 'phase_reg_mod'] + 'frequency', +# 'frequency_bin', + 'phase', +# 'phase_binary', + 'amplitude_ch_A', 'amplitude_ch_B'] +# 'modulation', +# 'frequency_mod', +# 'frequency_mod_bin', +# 'phase_mod'] +# 'phase_binary_mod'] kwargs['title'] = 'DDS Configuration' kwargs['suptitle'] = 'Details' @@ -26,17 +44,7 @@ def dds_conf(request, id_conf): kwargs['button'] = 'Edit Configuration' ###### SIDEBAR ###### - experiments = Experiment.objects.filter(campaign=conf.experiment.campaign) - configurations = Configuration.objects.filter(experiment=conf.experiment) - - exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time'] - conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address'] - - kwargs['experiment_keys'] = exp_keys[1:] - kwargs['experiments'] = experiments.values(*exp_keys) - - kwargs['configuration_keys'] = conf_keys[1:] - kwargs['configurations'] = configurations.values(*conf_keys) + kwargs.update(sidebar(conf)) return render(request, 'dds_conf.html', kwargs) @@ -51,13 +59,103 @@ def dds_conf_edit(request, id_conf): form = DDSConfigurationForm(request.POST, instance=conf) if form.is_valid(): - form.save() - return redirect('url_dds_conf', id_conf=id_conf) + conf = form.save(commit=False) + + if conf.verify_frequencies(): + + conf.save() + return redirect('url_dds_conf', id_conf=conf.id) + + ##ERRORS kwargs = {} + kwargs['id_dev'] = conf.id kwargs['form'] = form kwargs['title'] = 'Device Configuration' kwargs['suptitle'] = 'Edit' - kwargs['button'] = 'Update' + kwargs['button'] = 'Save' + kwargs['dds_nbits'] = conf.get_nbits() + + ###### SIDEBAR ###### + kwargs.update(sidebar(conf)) + + return render(request, 'dds_conf_edit.html', kwargs) + +def dds_conf_write(request, id_conf): + + conf = get_object_or_404(DDSConfiguration, pk=id_conf) + + answer = dds.write_config(ip=str(conf.device.ip_address), + port=conf.device.port_address, + clock=conf.clock, + multiplier=conf.multiplier, + freq_regA=conf.frequency_bin, + freq_regB=conf.frequency_mod_bin, + modulation=conf.modulation, + phaseA=conf.phase, + phaseB=conf.phase_mod, + amplitude0=conf.amplitude_ch_A, + amplitude1=conf.amplitude_ch_B) + + if answer[0] == "1": + messages.success(request, answer[2:]) + else: + messages.error(request, answer) + + return redirect('url_dds_conf', id_conf=conf.id) + +def dds_conf_read(request, id_conf): + + conf = get_object_or_404(DDSConfiguration, pk=id_conf) + + if request.method=='POST': + form = DDSConfigurationForm(request.POST, instance=conf) + + if form.is_valid(): + dds_model = form.save(commit=False) + + if dds_model.verify_frequencies(): + + dds_model.save() + return redirect('url_dds_conf', id_conf=conf.id) + + parms = None + + if request.method=='GET': + + #mult, freqA, freqB, modulation, phaseA, phaseB, amp0, amp1 + parms = dds.read_config(ip=conf.device.ip_address, + port=conf.device.port_address) + + if parms is None: + return redirect('url_dds_conf', id_conf=conf.id) + + data = {'experiment' : conf.experiment.id, + 'device' : conf.device.id, + 'clock' : conf.clock, + 'multiplier' : parms[0], + 'frequency' : conf.binary2freq(parms[1], parms[0]*conf.clock), + 'frequency_bin' : parms[1], + 'phase' : parms[4], + 'amplitude_ch_A' : parms[6], + 'amplitude_ch_B' : parms[7], + 'modulation' : parms[3], + 'frequency_mod' : conf.binary2freq(parms[2], parms[0]*conf.clock), + 'frequency_mod_bin' : parms[2], + 'phase_mod' : parms[5], + } + + form = DDSConfigurationForm(data) + + kwargs = {} + kwargs['id_dev'] = conf.id + kwargs['form'] = form + kwargs['title'] = 'Device Configuration' + kwargs['suptitle'] = 'Parameters read from device' + kwargs['button'] = 'Save' + kwargs['dds_nbits'] = conf.get_nbits() + + ###### SIDEBAR ###### + kwargs.update(sidebar(conf)) return render(request, 'dds_conf_edit.html', kwargs) \ No newline at end of file diff --git a/apps/jars/forms.py b/apps/jars/forms.py index 340018c..fc09f96 100644 --- a/apps/jars/forms.py +++ b/apps/jars/forms.py @@ -6,10 +6,15 @@ class JARSConfigurationForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(JARSConfigurationForm, self).__init__(*args, **kwargs) instance = getattr(self, 'instance', None) + if instance and instance.pk: - self.fields['experiment'].widget.attrs['disabled'] = True - self.fields['device'].widget.choices = [(item['id'], '%s | %s' % (item['device_type__name'], item['ip_address'])) for item in Device.objects.filter(device_type__name='jars').values('id', 'device_type__name', 'ip_address')] - + devices = Device.objects.filter(device_type__name='jars') + + self.fields['experiment'].widget.attrs['readonly'] = True + self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)] + + self.fields['device'].widget.choices = [(device.id, device) for device in devices] + class Meta: model = JARSConfiguration exclude = ('parameters', 'status') diff --git a/apps/main/templates/dev_conf.html b/apps/main/templates/dev_conf.html index 23f4ac1..2b5a9ad 100644 --- a/apps/main/templates/dev_conf.html +++ b/apps/main/templates/dev_conf.html @@ -9,16 +9,18 @@ {% block content-suptitle %}{{suptitle}}{% endblock %} {% block content %} + + {% for key in dev_conf_keys %} {% endfor %}
Status{%if connected == True %} ☘ Connected {% else %} ⛔ Disconnected {% endif %}
{{key|title}}{{dev_conf|attr:key}}
+

-

{% endblock %} {% block sidebar%} diff --git a/apps/main/views.py b/apps/main/views.py index 2aadc72..878560a 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -465,6 +465,9 @@ def sidebar(conf): conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address'] kwargs = {} + + kwargs['dev_conf'] = conf + kwargs['experiment_keys'] = exp_keys[1:] kwargs['experiments'] = experiments.values(*exp_keys)