##// END OF EJS Templates
git-svn-id: http://jro-dev.igp.gob.pe/svn/jro_hard/radarsys/trunk/webapp@44 aa17d016-51d5-4e8b-934c-7b2bbb1bbe71
Miguel Urco -
r26:33c77d9a34df
parent child
Show More
@@ -2,15 +2,28 from django import forms
2 2 from apps.main.models import Device
3 3 from .models import DDSConfiguration
4 4
5 from django.core.validators import MinValueValidator, MaxValueValidator
5 # from django.core.validators import MinValueValidator, MaxValueValidator
6 6
7 7 class DDSConfigurationForm(forms.ModelForm):
8 8
9 frequency = forms.FloatField(label='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)])
10 phase = forms.FloatField(label='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)])
11
12 frequency_mod = forms.FloatField(label='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], required=False)
13 phase_mod = forms.FloatField(label='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], required=False)
9 # frequency_bin = forms.IntegerField(label='Frequency (Binary)', required=False)
10 # phase_bin = forms.IntegerField(label='Phase (Binary)', required=False)
11
12 # frequency_mod_bin = forms.IntegerField(label='Frequency Mod (Binary)', required=False)
13 # phase_mod_bin = forms.IntegerField(label='Phase Mod (Binary)', required=False)
14
15 field_order = ['experiment', 'device',
16 'clock', 'multiplier',
17 'frequency',
18 'frequency_bin',
19 'phase',
20 'phase_bin',
21 'amplitude_chA', 'amplitude_chB',
22 'modulation',
23 'frequency_mod',
24 'frequency_mod_bin',
25 'phase_mod',
26 'phase_mod_bin']
14 27
15 28 def __init__(self, *args, **kwargs):
16 29 #request = kwargs.pop('request')
@@ -21,10 +34,11 class DDSConfigurationForm(forms.ModelForm):
21 34 if instance and instance.pk:
22 35
23 36 devices = Device.objects.filter(device_type__name='dds')
24 items = devices.values('id', 'name', 'device_type__name', 'ip_address')
25 37
26 38 self.fields['experiment'].widget.attrs['readonly'] = True
27 self.fields['device'].widget.choices = [(item['id'], '[%s]: %s | %s' % (item['device_type__name'], item['name'], item['ip_address'])) for item in items]
39 self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
40
41 self.fields['device'].widget.choices = [(device.id, device) for device in devices]
28 42
29 43
30 44 def clean(self):
@@ -33,4 +47,4 class DDSConfigurationForm(forms.ModelForm):
33 47
34 48 class Meta:
35 49 model = DDSConfiguration
36 fields = ('experiment', 'device', 'clock', 'multiplier', 'modulation')
50 exclude = ('type','parameters')
@@ -3,28 +3,74 from apps.main.models import Configuration
3 3 # Create your models here.
4 4
5 5 from django.core.validators import MinValueValidator, MaxValueValidator
6 from django.core.exceptions import ValidationError
6 7
7 8 MOD_TYPES = (
8 9 (None, 'Select a modulation type'),
9 (0, 'No modulation'),
10 (1, 'ASK'),
11 (2, 'FSK'),
12 (3, 'PSK'),
10 (0, 'Single Tone'),
11 (1, 'FSK'),
12 (2, 'Ramped FSK'),
13 (3, 'Chirp'),
14 (4, 'BPSK'),
13 15 )
14 16
15 17 class DDSConfiguration(Configuration):
16 18
17 clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(50)], blank=True, null=True)
19 DDS_NBITS = 48
20
21 clock = models.FloatField(verbose_name='Clock Master (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)])
18 22 multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4)
19 freq_reg = models.PositiveIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**32-1)], blank=True, null=True)
20 phase_reg = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True)
21 23
22 amplitude_chA = models.PositiveIntegerField(verbose_name='Amplitude CHA',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
23 amplitude_chB = models.PositiveIntegerField(verbose_name='Amplitude CHB',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
24 frequency = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=17, decimal_places=15)
25 frequency_bin = models.BigIntegerField(verbose_name='Frequency (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)])
26
27 phase = models.FloatField(verbose_name='Phase (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)])
28 # phase_binary = models.PositiveIntegerField(verbose_name='Phase (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)])
29
30 amplitude_ch_A = models.PositiveIntegerField(verbose_name='Amplitude CHA',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
31 amplitude_ch_B = models.PositiveIntegerField(verbose_name='Amplitude CHB',validators=[MinValueValidator(0), MaxValueValidator(2**10-1)], blank=True, null=True)
24 32
25 33 modulation = models.PositiveIntegerField(choices = MOD_TYPES, default = 0)
26 freq_reg_mod = models.PositiveIntegerField(verbose_name='Frequency Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**32-1)], blank=True, null=True)
27 phase_reg_mod = models.PositiveIntegerField(verbose_name='Phase Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True)
34
35 frequency_mod = models.DecimalField(verbose_name='Frequency Mod. (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=17, decimal_places=15, blank=True, null=True)
36 frequency_mod_bin = models.BigIntegerField(verbose_name='Frequency Mod. (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True)
37
38 phase_mod = models.FloatField(verbose_name='Phase Mod. (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True)
39 # phase_binary_mod = models.PositiveIntegerField(verbose_name='Phase Mod (Binary)',validators=[MinValueValidator(0), MaxValueValidator(2**14-1)], blank=True, null=True)
40
41 def get_nbits(self):
42
43 return self.DDS_NBITS
44
45 def clean(self):
46
47 if self.modulation in [1,2,3]:
48 if self.frequency_mod is None or self.frequency_mod_bin is None:
49 raise ValidationError({
50 'frequency_mod': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected'
51 })
52
53 if self.modulation in [4,]:
54 if self.phase_mod is None:
55 raise ValidationError({
56 'phase_mod': 'Phase modulation has to be defined when BPSK modulation is selected'
57 })
58
59 def verify_frequencies(self):
60
61 return True
62
63 def freq2binary(self, freq, mclock):
64
65 binary = (float(freq)/mclock)*(2**self.DDS_NBITS)
66
67 return binary
68
69 def binary2freq(self, binary, mclock):
70
71 freq = (float(binary)/(2**self.DDS_NBITS))*mclock
72
73 return freq
28 74
29 75 class Meta:
30 76 db_table = 'dds_configurations'
@@ -1,4 +1,53
1 {% extends "dev_conf.html" %}
1 {% extends "base.html" %}
2 {% load bootstrap3 %}
3 {% load static %}
4 {% load main_tags %}
5
6 {% block conf-active %}active{% endblock %}
7
8 {% block content-title %}{{title}}{% endblock %}
9 {% block content-suptitle %}{{suptitle}}{% endblock %}
10
11 {% block content %}
12
13 <table class="table table-bordered">
14 <tr><th>Status</th><td>{%if connected == True %} &#9752; Connected {% else %} &#9940; Disconnected {% endif %}</td></tr>
15 {% for item in dev_conf_keys %}
16 <tr><th>{{item|title}}</th><td>{{dev_conf|attr:item}}</td></tr>
17 {% endfor %}
18
19 <tr><th>{{form.modulation.label}}</th><td>{{form.modulation}}</td></tr>
20
21 {% if form.modulation.value == 0 %}
22 {% endif %}
23
24 {% if form.modulation.value == 1 %}
25 <tr><th>{{form.frequency_mod.label}}</th><td>{{form.frequency_mod.value}}</td></tr>
26 {% endif %}
27
28 {% if form.modulation.value == 2 %}
29 <tr><th>{{form.frequency_mod.label}}</th><td>{{form.frequency_mod.value}}</td></tr>
30 {% endif %}
31
32 {% if form.modulation.value == 3 %}
33 <tr><th>{{form.frequency_mod.label}}</th><td>{{form.frequency_mod.value}}</td></tr>
34 {% endif %}
35
36 {% if form.modulation.value == 4 %}
37 <tr><th>{{form.phase_mod.label}}</th><td>{{form.phase_mod.value}}</td></tr>
38 {% endif %}
39 </table>
40
41 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_read">Read</button>
42 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_write">Write</button>
43 <button class="btn btn-primary pull-left" style="margin-left: 10px" id="bt_export">Export</button>
44 <button class="btn btn-primary pull-left" style="margin-left: 10px" id="bt_edit">Edit</button>
45 <br></br>
46 {% endblock %}
47
48 {% block sidebar%}
49 {% include "sidebar_devices.html" %}
50 {% endblock %}
2 51
3 52 {% block extra-js%}
4 53 <script type="text/javascript">
@@ -7,5 +56,13
7 56 document.location = "{% url 'url_edit_dds_conf' dev_conf.id%}";
8 57 });
9 58
59 $("#bt_write").click(function() {
60 document.location = "{% url 'url_dds_conf_write' dev_conf.id%}";
61 });
62
63 $("#bt_read").click(function() {
64 document.location = "{% url 'url_dds_conf_read' dev_conf.id%}";
65 });
66
10 67 </script>
11 68 {% endblock %} No newline at end of file
@@ -1,1 +1,90
1 1 {% extends "dev_conf_edit.html" %}
2 {% load bootstrap3 %}
3 {% load static %}
4 {% load main_tags %}
5
6 {% block extra-js%}
7 <script type="text/javascript">
8
9 $("#bt_cancel").click(function() {
10 document.location = "{% url 'url_dds_conf' id_dev%}";
11 });
12
13 $("#bt_read").click(function() {
14 document.location = "{% url 'url_dds_conf_read' id_dev%}";
15 });
16
17 $("#id_clock").on('change', function() {
18 updateFrequencies();
19 });
20
21 $("#id_multiplier").on('change', function() {
22 updateFrequencies();
23 });
24
25 $("#id_frequency").on('change', function() {
26 updateBinaryFrequencies();
27 });
28
29 $("#id_frequency_bin").on('change', function() {
30 updateFrequencies();
31 });
32
33 $("#id_frequency_mod").on('change', function() {
34 updateBinaryFrequencies();
35 });
36
37 $("#id_frequency_mod_bin").on('change', function() {
38 updateFrequencies();
39 });
40
41 function updateBinaryFrequencies() {
42
43 var clock = $("#id_clock").val();
44 var multiplier = $("#id_multiplier").val();
45 var freq = $("#id_frequency").val();
46 var freq_mod = $("#id_frequency_mod").val();
47
48 var mclock = clock*multiplier;
49 var k = Math.pow(2,48)/mclock;
50
51 var freq_bin = parseInt(freq*k);
52 var freq_mod_bin = parseInt(freq_mod*k);
53
54 $("#id_frequency_bin").val(freq_bin);
55 $("#id_frequency_mod_bin").val(freq_mod_bin);
56
57 freq = freq_bin/k;
58 freq_mod = freq_mod_bin/k;
59
60 $("#id_frequency").val(freq);
61 $("#id_frequency_mod").val(freq_mod);
62
63 }
64
65 function updateFrequencies() {
66
67 var clock = $("#id_clock").val();
68 var multiplier = $("#id_multiplier").val();
69 var freq_bin = $("#id_frequency_bin").val();
70 var freq_mod_bin = $("#id_frequency_mod_bin").val();
71
72 var mclock = clock*multiplier;
73 var k = Math.pow(2,48)/mclock;
74
75 var freq = parseInt(freq_bin)/k;
76 var freq_mod = parseInt(freq_mod_bin)/k;
77
78 $("#id_frequency").val(freq);
79 $("#id_frequency_mod").val(freq_mod);
80
81 var freq_bin = parseInt(freq*k);
82 var freq_mod_bin = parseInt(freq_mod*k);
83
84 $("#id_frequency_bin").val(freq_bin);
85 $("#id_frequency_mod_bin").val(freq_mod_bin);
86
87 }
88
89 </script>
90 {% endblock %} No newline at end of file
@@ -2,5 +2,8 from django.conf.urls import url
2 2
3 3 urlpatterns = (
4 4 url(r'^(?P<id_conf>-?\d+)/$', 'apps.dds.views.dds_conf', name='url_dds_conf'),
5 url(r'^(?P<id_conf>-?\d+)/(?P<message>-?\d+)/$', 'apps.dds.views.dds_conf', name='url_dds_conf'),
5 6 url(r'^(?P<id_conf>-?\d+)/edit/$', 'apps.dds.views.dds_conf_edit', name='url_edit_dds_conf'),
7 url(r'^(?P<id_conf>-?\d+)/write/$', 'apps.dds.views.dds_conf_write', name='url_dds_conf_write'),
8 url(r'^(?P<id_conf>-?\d+)/read/$', 'apps.dds.views.dds_conf_read', name='url_dds_conf_read'),
6 9 )
@@ -1,24 +1,42
1 1 # Create your views here.
2
2 from django.contrib import messages
3 3 from django.shortcuts import redirect, render, get_object_or_404
4 4
5 5 from apps.main.models import Experiment, Configuration
6 from apps.main.views import sidebar
7
6 8 from .models import DDSConfiguration
7 9 from .forms import DDSConfigurationForm
8 10 # Create your views here.
9 11
12 from radarsys_api import jro_device, dds
13
10 14 def dds_conf(request, id_conf):
11 15
12 16 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
13 17
18 if request.method=='GET':
19 form = DDSConfigurationForm(instance=conf)
20
21 answer = dds.echo(ip=str(conf.device.ip_address), port=conf.device.port_address)
22
14 23 kwargs = {}
24 kwargs['connected'] = (answer[0] == "1")
25 kwargs['form'] = form
26
15 27 kwargs['dev_conf'] = conf
16 28 kwargs['dev_conf_keys'] = ['experiment', 'device',
17 29 'clock', 'multiplier',
18 'freq_reg', 'phase_reg',
19 'amplitude_chA', 'amplitude_chB',
20 'modulation',
21 'freq_reg_mod', 'phase_reg_mod']
30 'frequency',
31 # 'frequency_bin',
32 'phase',
33 # 'phase_binary',
34 'amplitude_ch_A', 'amplitude_ch_B']
35 # 'modulation',
36 # 'frequency_mod',
37 # 'frequency_mod_bin',
38 # 'phase_mod']
39 # 'phase_binary_mod']
22 40
23 41 kwargs['title'] = 'DDS Configuration'
24 42 kwargs['suptitle'] = 'Details'
@@ -26,17 +44,7 def dds_conf(request, id_conf):
26 44 kwargs['button'] = 'Edit Configuration'
27 45
28 46 ###### SIDEBAR ######
29 experiments = Experiment.objects.filter(campaign=conf.experiment.campaign)
30 configurations = Configuration.objects.filter(experiment=conf.experiment)
31
32 exp_keys = ['id', 'campaign', 'name', 'start_time', 'end_time']
33 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
34
35 kwargs['experiment_keys'] = exp_keys[1:]
36 kwargs['experiments'] = experiments.values(*exp_keys)
37
38 kwargs['configuration_keys'] = conf_keys[1:]
39 kwargs['configurations'] = configurations.values(*conf_keys)
47 kwargs.update(sidebar(conf))
40 48
41 49 return render(request, 'dds_conf.html', kwargs)
42 50
@@ -51,13 +59,103 def dds_conf_edit(request, id_conf):
51 59 form = DDSConfigurationForm(request.POST, instance=conf)
52 60
53 61 if form.is_valid():
54 form.save()
55 return redirect('url_dds_conf', id_conf=id_conf)
62 conf = form.save(commit=False)
63
64 if conf.verify_frequencies():
65
66 conf.save()
67 return redirect('url_dds_conf', id_conf=conf.id)
68
69 ##ERRORS
56 70
57 71 kwargs = {}
72 kwargs['id_dev'] = conf.id
58 73 kwargs['form'] = form
59 74 kwargs['title'] = 'Device Configuration'
60 75 kwargs['suptitle'] = 'Edit'
61 kwargs['button'] = 'Update'
76 kwargs['button'] = 'Save'
77 kwargs['dds_nbits'] = conf.get_nbits()
78
79 ###### SIDEBAR ######
80 kwargs.update(sidebar(conf))
81
82 return render(request, 'dds_conf_edit.html', kwargs)
83
84 def dds_conf_write(request, id_conf):
85
86 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
87
88 answer = dds.write_config(ip=str(conf.device.ip_address),
89 port=conf.device.port_address,
90 clock=conf.clock,
91 multiplier=conf.multiplier,
92 freq_regA=conf.frequency_bin,
93 freq_regB=conf.frequency_mod_bin,
94 modulation=conf.modulation,
95 phaseA=conf.phase,
96 phaseB=conf.phase_mod,
97 amplitude0=conf.amplitude_ch_A,
98 amplitude1=conf.amplitude_ch_B)
99
100 if answer[0] == "1":
101 messages.success(request, answer[2:])
102 else:
103 messages.error(request, answer)
104
105 return redirect('url_dds_conf', id_conf=conf.id)
106
107 def dds_conf_read(request, id_conf):
108
109 conf = get_object_or_404(DDSConfiguration, pk=id_conf)
110
111 if request.method=='POST':
112 form = DDSConfigurationForm(request.POST, instance=conf)
113
114 if form.is_valid():
115 dds_model = form.save(commit=False)
116
117 if dds_model.verify_frequencies():
118
119 dds_model.save()
120 return redirect('url_dds_conf', id_conf=conf.id)
121
122 parms = None
123
124 if request.method=='GET':
125
126 #mult, freqA, freqB, modulation, phaseA, phaseB, amp0, amp1
127 parms = dds.read_config(ip=conf.device.ip_address,
128 port=conf.device.port_address)
129
130 if parms is None:
131 return redirect('url_dds_conf', id_conf=conf.id)
132
133 data = {'experiment' : conf.experiment.id,
134 'device' : conf.device.id,
135 'clock' : conf.clock,
136 'multiplier' : parms[0],
137 'frequency' : conf.binary2freq(parms[1], parms[0]*conf.clock),
138 'frequency_bin' : parms[1],
139 'phase' : parms[4],
140 'amplitude_ch_A' : parms[6],
141 'amplitude_ch_B' : parms[7],
142 'modulation' : parms[3],
143 'frequency_mod' : conf.binary2freq(parms[2], parms[0]*conf.clock),
144 'frequency_mod_bin' : parms[2],
145 'phase_mod' : parms[5],
146 }
147
148 form = DDSConfigurationForm(data)
149
150 kwargs = {}
151 kwargs['id_dev'] = conf.id
152 kwargs['form'] = form
153 kwargs['title'] = 'Device Configuration'
154 kwargs['suptitle'] = 'Parameters read from device'
155 kwargs['button'] = 'Save'
156 kwargs['dds_nbits'] = conf.get_nbits()
157
158 ###### SIDEBAR ######
159 kwargs.update(sidebar(conf))
62 160
63 161 return render(request, 'dds_conf_edit.html', kwargs) No newline at end of file
@@ -6,9 +6,14 class JARSConfigurationForm(forms.ModelForm):
6 6 def __init__(self, *args, **kwargs):
7 7 super(JARSConfigurationForm, self).__init__(*args, **kwargs)
8 8 instance = getattr(self, 'instance', None)
9
9 10 if instance and instance.pk:
10 self.fields['experiment'].widget.attrs['disabled'] = True
11 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')]
11 devices = Device.objects.filter(device_type__name='jars')
12
13 self.fields['experiment'].widget.attrs['readonly'] = True
14 self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
15
16 self.fields['device'].widget.choices = [(device.id, device) for device in devices]
12 17
13 18 class Meta:
14 19 model = JARSConfiguration
@@ -9,16 +9,18
9 9 {% block content-suptitle %}{{suptitle}}{% endblock %}
10 10
11 11 {% block content %}
12
12 13 <table class="table table-bordered">
14 <tr><th>Status</th><td>{%if connected == True %} &#9752; Connected {% else %} &#9940; Disconnected {% endif %}</td></tr>
13 15 {% for key in dev_conf_keys %}
14 16 <tr><th>{{key|title}}</th><td>{{dev_conf|attr:key}}</td></tr>
15 17 {% endfor %}
16 18 </table>
19
17 20 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_send">Send</button>
18 21 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_export">Export</button>
19 22 <button class="btn btn-primary pull-right" style="margin-left: 10px" id="bt_edit">Edit</button>
20 23 <br></br>
21 <br></br>
22 24 {% endblock %}
23 25
24 26 {% block sidebar%}
@@ -465,6 +465,9 def sidebar(conf):
465 465 conf_keys = ['id', 'device__name', 'device__device_type__name', 'device__ip_address']
466 466
467 467 kwargs = {}
468
469 kwargs['dev_conf'] = conf
470
468 471 kwargs['experiment_keys'] = exp_keys[1:]
469 472 kwargs['experiments'] = experiments.values(*exp_keys)
470 473
General Comments 0
You need to be logged in to leave comments. Login now