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 %}
+
+
+ Status | {%if connected == True %} ☘ Connected {% else %} ⛔ Disconnected {% endif %} |
+ {% for item in dev_conf_keys %}
+ {{item|title}} | {{dev_conf|attr:item}} |
+ {% endfor %}
+
+ {{form.modulation.label}} | {{form.modulation}} |
+
+ {% if form.modulation.value == 0 %}
+ {% endif %}
+
+ {% if form.modulation.value == 1 %}
+ {{form.frequency_mod.label}} | {{form.frequency_mod.value}} |
+ {% endif %}
+
+ {% if form.modulation.value == 2 %}
+ {{form.frequency_mod.label}} | {{form.frequency_mod.value}} |
+ {% endif %}
+
+ {% if form.modulation.value == 3 %}
+ {{form.frequency_mod.label}} | {{form.frequency_mod.value}} |
+ {% endif %}
+
+ {% if form.modulation.value == 4 %}
+ {{form.phase_mod.label}} | {{form.phase_mod.value}} |
+ {% endif %}
+
+
+
+
+
+
+
+{% 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 %}
+
+Status | {%if connected == True %} ☘ Connected {% else %} ⛔ Disconnected {% endif %} |
{% for key in dev_conf_keys %}
{{key|title}} | {{dev_conf|attr:key}} |
{% endfor %}
+
-
{% 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)