##// END OF EJS Templates
sync repo...
Juan C. Espinoza -
r157:82791b88ae92
parent child
Show More
@@ -0,0 +1,1
1 {% extends "dev_conf_edit.html" %}
@@ -0,0 +1,145
1 {% extends "base.html" %}
2 {% load bootstrap3 %}
3 {% load static %}
4 {% load main_tags %}
5 {% block extra-head %}
6 <link href="{% static 'css/bootstrap-datetimepicker.min.css' %}" media="screen" rel="stylesheet">
7 {% endblock %}
8
9 {% block exp-active %}active{% endblock %}
10
11 {% block content-title %}{{title}}{% endblock %}
12 {% block content-suptitle %}{{suptitle}}{% endblock %}
13
14 {% block content %}
15
16 {% block menu-actions %}
17
18 {% endblock %}
19
20
21
22 <table class="table table-bordered" style="text-align:center;">
23 <!--<h4 class="panel-title"> </h4>-->
24 <tr>
25 <th style="text-align:center;">Parameters</th>
26 <th style="text-align:center;">DDS</th>
27 <th style="text-align:center;">RC</th>
28 <th style="text-align:center;">JARS</th>
29 <th style="text-align:center;">=P</th>
30 </tr>
31
32 <tr>
33 <th>Clock In</th>
34 <td id="dds_clock">{{ dds.clock }}</td>
35 <td id="rc_clock">{{ rc.clock_in }}</td>
36 <td id="filter_clock">{{ filter_parms.clock }}</td>
37 <td><input id="suggest_clock"></input></td>
38 </tr>
39
40 <tr>
41 <th>Frequency A (Mhz)</th>
42 <td>{{ dds.frequencyA_Mhz }}</td>
43 <td>x</td>
44 <td>{{ filter_parms.fch }}</td>
45 <td><input></input></td>
46 </tr>
47
48 <tr>
49 <th>Frequency A (Decimal)</th>
50 <td>{{ dds.frequencyA }}</td>
51 <td>x</td>
52 <td>{{ filter_parms.fch_decimal }}</td>
53 <td><input></input></td>
54 </tr>
55
56 <tr>
57 <th>Sampling Frequency (MHz)</th>
58 <td id="dds_sampfreq">{{ dds.frequencyA }}</td>
59 <td id="rc_sampfreq">{{ samp_freq_rc }}</td>
60 <td id="jars_sampfreq">{{ samp_freq_jars }}</td>
61 <td><input id="suggest_sampfreq"></input></td>
62 </tr>
63 </table>
64
65
66
67 <div class="">
68 <h4 class="panel-title"><b> Extra Parameters </b></h4>
69 <br>
70 </div>
71
72 <table class="table table-bordered" >
73 {% for configuration in configurations %}
74 {% if configuration.device.device_type.name == 'jars' %}
75 <tr><th>Rate(MB/h)</th><td>{{ rate }}</td></tr>
76 {% endif %}
77 {% endfor %}
78 </table>
79
80
81 <div class="pull-right">
82 <button type="button" class="btn btn-primary" id="bt_back">Back</button>
83 <button type="button" class="btn btn-primary" id="bt_update">{{ button }}</button>
84 </div>
85
86 {% endblock %}
87
88 {% block sidebar%}
89 {% include "sidebar_devices.html" %}
90 {% endblock %}
91
92 {% block extra-js%}
93 <script type="text/javascript">
94
95 {% if dds_conf %}
96 $(document).ready(function() {
97 $('#dds_clock').click(function(event) {
98 clock = $("#dds_clock").text();
99 $("#suggest_clock").val(clock);
100 });
101 $('#dds_sampfreq').click(function(event) {
102 sampfreq = $("#dds_sampfreq").text();
103 $("#suggest_sampfreq").val(sampfreq);
104 });
105 });
106 {% endif %}
107 {% if rc_conf %}
108 $(document).ready(function() {
109 $('#rc_clock').click(function(event) {
110 clock = $("#rc_clock").text();
111 $("#suggest_clock").val(clock);
112 });
113 $('#rc_sampfreq').click(function(event) {
114 sampfreq = $("#rc_sampfreq").text();
115 $("#suggest_sampfreq").val(sampfreq);
116 });
117 });
118 {% endif %}
119 {% if jars_conf %}
120 $(document).ready(function() {
121 $('#filter_clock').click(function(event) {
122 clock = $("#filter_clock").text();
123 $("#suggest_clock").val(clock);
124 });
125 $('#jars_sampfreq').click(function(event) {
126 sampfreq = $("#jars_sampfreq").text();
127 $("#suggest_sampfreq").val(sampfreq);
128 });
129 });
130 {% endif %}
131
132
133
134
135 $(".clickable-row").click(function() {
136 document.location = $(this).data("href");
137 });
138
139 $("#bt_back").click(function() {
140 document.location = "{% url 'url_experiment' experiment.id%}";
141 });
142
143
144 </script>
145 {% endblock %} No newline at end of file
@@ -1,3 +1,5
1 import os
2
1 3 from django import forms
2 4 from apps.main.models import Device, Experiment
3 5 from .models import JARSConfiguration, JARSfilter
@@ -42,4 +44,40 class JARSfilterForm(forms.ModelForm):
42 44
43 45 class Meta:
44 46 model = JARSfilter
45 exclude = ('type', 'parameters', 'status') No newline at end of file
47 exclude = ('type', 'parameters', 'status')
48
49 class ExtFileField(forms.FileField):
50 """
51 Same as forms.FileField, but you can specify a file extension whitelist.
52
53 >>> from django.core.files.uploadedfile import SimpleUploadedFile
54 >>>
55 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
56 >>>
57 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
58 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
59 >>>
60 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
61 Traceback (most recent call last):
62 ...
63 ValidationError: [u'Not allowed filetype!']
64 """
65 def __init__(self, *args, **kwargs):
66 extensions = kwargs.pop("extensions")
67 self.extensions = [i.lower() for i in extensions]
68
69 super(ExtFileField, self).__init__(*args, **kwargs)
70
71 def clean(self, *args, **kwargs):
72 data = super(ExtFileField, self).clean(*args, **kwargs)
73 filename = data.name
74 ext = os.path.splitext(filename)[1]
75 ext = ext.lower()
76 if ext not in self.extensions:
77 raise forms.ValidationError('Not allowed file type: %s' % ext)
78
79
80 class JARSImportForm(forms.Form):
81
82 #file_name = ExtFileField(extensions=['.racp', '.json', '.dat'])
83 file_name = ExtFileField(extensions=['.json']) No newline at end of file
@@ -1,8 +1,12
1 1 from django.db import models
2 2 from apps.main.models import Configuration
3 3 from django.core.validators import MinValueValidator, MaxValueValidator
4 from django.core.urlresolvers import reverse
5 from devices.jars import api
4 6
5 7 from apps.rc.models import RCConfiguration
8
9 import json
6 10 # Create your models here.
7 11
8 12 EXPERIMENT_TYPE = (
@@ -77,12 +81,15 class JARSConfiguration(Configuration):
77 81 cards_number = models.PositiveIntegerField(verbose_name='Number of Cards', validators=[MinValueValidator(1), MaxValueValidator(4)], default = 1)
78 82 channels_number = models.PositiveIntegerField(verbose_name='Number of Channels', validators=[MinValueValidator(1), MaxValueValidator(8)], default = 5)
79 83 channels = models.CharField(verbose_name='Channels', max_length=15, default = '1,2,3,4,5')
80 rd_directory = models.CharField(verbose_name='Raw Data Directory', max_length=40, default='', blank=True, null=True)
81 raw_data_blocks = models.PositiveIntegerField(verbose_name='Raw Data Blocks', validators=[MaxValueValidator(5000)], default=120)
84 rd_directory = models.CharField(verbose_name='Raw Data Directory', max_length=200, default='', blank=True, null=True)
85 pd_directory = models.CharField(verbose_name='Process Data Directory', max_length=200, default='', blank=True, null=True)
86 #raw_data_blocks = models.PositiveIntegerField(verbose_name='Raw Data Blocks', validators=[MaxValueValidator(5000)], default=120)
82 87 data_type = models.PositiveIntegerField(verbose_name='Data Type', choices=DATA_TYPE, default=0)
83 88 acq_profiles = models.PositiveIntegerField(verbose_name='Acquired Profiles', validators=[MaxValueValidator(5000)], default=400)
84 89 profiles_block = models.PositiveIntegerField(verbose_name='Profiles Per Block', validators=[MaxValueValidator(5000)], default=400)
90 ftp_interval = models.PositiveIntegerField(verbose_name='FTP Interval', default=60)
85 91 fftpoints = models.PositiveIntegerField(verbose_name='FFT Points',default=16)
92 cohe_integr_str = models.PositiveIntegerField(verbose_name='Coh. Int. Stride',validators=[MinValueValidator(1)], default=30)
86 93 cohe_integr = models.PositiveIntegerField(verbose_name='Coherent Integrations',validators=[MinValueValidator(1)], default=30)
87 94 incohe_integr = models.PositiveIntegerField(verbose_name='Incoherent Integrations',validators=[MinValueValidator(1)], default=30)
88 95 filter = models.ForeignKey(JARSfilter, on_delete=models.CASCADE, null=True)
@@ -90,9 +97,10 class JARSConfiguration(Configuration):
90 97 spectral = models.CharField(verbose_name='Combinations', max_length=5000, default = '[0, 0],')
91 98 create_directory = models.BooleanField(verbose_name='Create Directory Per Day', default=True)
92 99 include_expname = models.BooleanField(verbose_name='Experiment Name in Directory', default=True)
93 acq_link = models.BooleanField(verbose_name='Acquisition Link', default=True)
94 view_raw_data = models.BooleanField(verbose_name='View Raw Data', default=True)
100 #acq_link = models.BooleanField(verbose_name='Acquisition Link', default=True)
101 #view_raw_data = models.BooleanField(verbose_name='View Raw Data', default=True)
95 102 save_ch_dc = models.BooleanField(verbose_name='Save Channels DC', default=True)
103 save_data = models.BooleanField(verbose_name='Save Data', default=True)
96 104 filter_parms = models.CharField(max_length=10000, default='{}')
97 105
98 106 class Meta:
@@ -102,6 +110,7 class JARSConfiguration(Configuration):
102 110
103 111 parameters = {}
104 112
113 parameters['device_id'] = self.device.id
105 114 parameters['name'] = self.name
106 115 #parameters['rc'] = self.rc.name
107 116 parameters['exp_type'] = self.exp_type
@@ -110,26 +119,31 class JARSConfiguration(Configuration):
110 119 parameters['channels_number'] = self.channels_number
111 120 parameters['channels'] = self.channels
112 121 parameters['rd_directory'] = self.rd_directory
113 parameters['raw_data_blocks'] = self.raw_data_blocks
122 #parameters['raw_data_blocks'] = self.raw_data_blocks
114 123 parameters['data_type'] = self.data_type
124 parameters['cohe_integr_str'] = self.cohe_integr_str
115 125 parameters['acq_profiles'] = self.acq_profiles
116 126 parameters['profiles_block'] = self.profiles_block
127 parameters['ftp_interval'] = self.ftp_interval
117 128 parameters['fftpoints'] = self.fftpoints
118 129 parameters['cohe_integr'] = self.cohe_integr
119 130 #parameters['incohe_integr'] = self.incohe_integr
120 131 parameters['filter'] = self.filter.name
132 parameters['filter_parms'] = self.filter_parms
121 133 #parameters['spectral_number'] = self.spectral_number
122 134 #parameters['spectral'] = self.spectral
123 135 parameters['create_directory'] = bool(self.create_directory)
124 136 parameters['include_expname'] = bool(self.include_expname)
125 parameters['acq_link'] = bool(self.acq_link)
126 parameters['view_raw_data'] = bool(self.view_raw_data)
137 #parameters['acq_link'] = bool(self.acq_link)
138 #parameters['view_raw_data'] = bool(self.view_raw_data)
127 139 parameters['save_ch_dc'] = bool(self.save_ch_dc)
140 parameters['save_data'] = bool(self.save_data)
128 141
129 142 if parameters['exptype'] == 'PDATA':
130 143 parameters['incohe_integr'] = self.incohe_integr
131 144 parameters['spectral_number'] = self.spectral_number
132 145 parameters['spectral'] = self.spectral
146 parameters['pd_directory'] = self.pd_directory
133 147
134 148 return parameters
135 149
@@ -139,39 +153,116 class JARSConfiguration(Configuration):
139 153
140 154 def dict_to_parms(self, parameters):
141 155
156 self.name = parameters['name']
157 self.device.id = int(parameters['device_id'])
158
142 159 self.exp_type = int(parameters['exp_type'])
143 160 if parameters['exptype'] == 'PDATA':
144 161 self.incohe_integr = parameters['incohe_integr']
145 162 self.spectral_number = parameters['spectral_number']
146 self.spectral = parameters['spectral']
163 self.spectral = parameters['spectral']
164 self.pd_directory = parameters['pd_directory']
147 165
148 166 self.cards_number = int(parameters['cards_number'])
149 167 self.channels_number = int(parameters['channels_number'])
150 168 self.channels = parameters['channels']
151 169 self.rd_directory = parameters['rd_directory']
152 self.raw_data_blocks = parameters['raw_data_blocks']
170 #self.raw_data_blocks = parameters['raw_data_blocks']
153 171 self.data_type = parameters['data_type']
172 self.cohe_integr_str = parameters['cohe_integr_str']
154 173 self.acq_profiles = parameters['acq_profiles']
155 174 self.profiles_block = parameters['profiles_block']
175 self.ftp_interval = parameters['ftp_interval']
156 176 self.fftpoints = parameters['fftpoints']
157 177 self.cohe_integr = parameters['cohe_integr']
158 178
159 filter_name = parameters['filter']
160 self.filter = JARS.objects.get(name=filter_name)
161 self.save()
179 filter_name = parameters['filter']
180 self.filter = JARSfilter.objects.get(name=filter_name)
162 181 self.add_parms_to_filter()
182 self.filter_parms = parameters['filter_parms']
163 183
164 184 self.create_directory = bool(parameters['create_directory'])
165 185 self.include_expname = bool(parameters['include_expname'])
166 self.acq_link = bool(parameters['acq_link'])
167 self.view_raw_data = bool(parameters['view_raw_data'])
186 #self.acq_link = bool(parameters['acq_link'])
187 #self.view_raw_data = bool(parameters['view_raw_data'])
168 188 self.save_ch_dc = bool(parameters['save_ch_dc'])
189 self.save_data = bool(parameters['save_data'])
169 190
170 191 def status_device(self):
171 return
192
193 answer = api.status(self.device.ip_address,self.device.port_address)
194 self.device.status = int(answer[0])
195 self.message = answer[2:]
196 self.device.save()
197
198 return self.device.status
199
200 def stop_device(self):
201
202 answer = api.stop(self.device.ip_address,self.device.port_address)
203 self.device.status = int(answer[0])
204 self.message = answer[2:]
205 self.device.save()
206
207 return self.device.status
172 208
173 209 def read_device(self):
174 return
210
211 answer = api.read(self.device.ip_address,self.device.port_address)
212 self.device.status = int(answer[0])
213 try:
214 data = json.loads(answer[2:])
215 parms = data['configurations']['jars']
216 except:
217 self.device.status = 0
218 self.device.save()
219 self.message = 'Could not read JARS configuration.'
220 return ''
221
222 #self.dict_to_parms(parms)
223 self.message = 'Current JARS configuration was read successfully.'
224 self.device.save()
225 return parms
226
175 227
176 228 def write_device(self):
177 return No newline at end of file
229
230 data = self.experiment.parms_to_dict()
231 data = json.loads(data)
232 data['configurations']['dds'] =''
233 data['configurations']['cgs'] =''
234 data['configurations']['rc']['pulses']=''
235 data['configurations']['rc']['delays']=''
236 json_data = json.dumps(data)
237
238 answer = api.configure(self.device.ip_address,self.device.port_address,json_data)
239 #print answer
240 self.device.status = int(answer[0])
241 self.message = answer[2:]
242
243 self.device.save()
244
245 return self.device.status
246
247
248 def echo(self):
249
250 answer = api.echo(self.device.ip_address,self.device.port_address,'(=')
251 #print answer
252 self.device.status = int(answer[0])
253 self.message = answer[2:]
254
255 self.device.save()
256
257 return #self.device.status
258
259 def update_from_file(self, parameters):
260
261 self.dict_to_parms(parameters)
262 self.save()
263
264 def get_absolute_url_import(self):
265 return reverse('url_import_jars_conf', args=[str(self.id)])
266
267 def get_absolute_url_read(self):
268 return reverse('url_read_jars_conf', args=[str(self.id)]) No newline at end of file
@@ -6,4 +6,6 urlpatterns = (
6 6 url(r'^(?P<conf_id>-?\d+)/new_filter/$', 'apps.jars.views.new_filter', name='url_new_jars_filter'),
7 7 url(r'^(?P<conf_id>-?\d+)/view_filter/(?P<filter_id>-?\d+)/$', 'apps.jars.views.view_filter', name='url_jars_filter'),
8 8 url(r'^(?P<conf_id>-?\d+)/view_filter/(?P<filter_id>-?\d+)/edit$', 'apps.jars.views.edit_filter', name='url_edit_jars_filter'),
9 url(r'^(?P<conf_id>-?\d+)/import/$', 'apps.jars.views.import_file', name='url_import_jars_conf'),
10 url(r'^(?P<conf_id>-?\d+)/read/$', 'apps.jars.views.read_conf', name='url_read_jars_conf'),
9 11 )
@@ -7,7 +7,7 from apps.main.models import Device
7 7 from apps.main.views import sidebar
8 8
9 9 from .models import JARSConfiguration, JARSfilter
10 from .forms import JARSConfigurationForm, JARSfilterForm
10 from .forms import JARSConfigurationForm, JARSfilterForm, JARSImportForm
11 11 # Create your views here.
12 12
13 13 def jars_conf(request, id_conf):
@@ -24,18 +24,22 def jars_conf(request, id_conf):
24 24 kwargs['dev_conf'] = conf
25 25 kwargs['dev_conf_keys'] = ['name',
26 26 'cards_number', 'channels_number', 'channels',
27 'rd_directory', 'raw_data_blocks', 'data_type',
28 'acq_profiles', 'profiles_block', 'fftpoints',
27 'rd_directory', 'pd_directory',
28 'data_type',
29 'acq_profiles', 'profiles_block', 'ftp_interval', 'fftpoints',
30 'cohe_integr_str',
29 31 'incohe_integr', 'cohe_integr', 'filter', 'spectral_number',
30 32 'spectral', 'create_directory', 'include_expname',
31 'acq_link', 'view_raw_data', 'save_ch_dc',]
33 'save_ch_dc', 'save_data']
32 34
33 35 kwargs['title'] = 'JARS Configuration'
34 36 kwargs['suptitle'] = 'Details'
35 37
36 38 kwargs['button'] = 'Edit Configuration'
37 39
38 kwargs['no_play'] = True
40 #kwargs['no_play'] = True
41
42 kwargs['only_stop'] = True
39 43
40 44 ###### SIDEBAR ######
41 45 kwargs.update(sidebar(conf=conf))
@@ -70,6 +74,74 def jars_conf_edit(request, id_conf):
70 74
71 75 return render(request, 'jars_conf_edit.html', kwargs)
72 76
77 def import_file(request, conf_id):
78
79 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
80 if request.method=='POST':
81 form = JARSImportForm(request.POST, request.FILES)
82 if form.is_valid():
83 try:
84 parms = conf.import_from_file(request.FILES['file_name'])
85
86 if parms:
87 conf.update_from_file(parms)
88 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
89 return redirect(conf.get_absolute_url_edit())
90
91 except Exception as e:
92 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
93
94 else:
95 messages.warning(request, 'Your current configuration will be replaced')
96 form = JARSImportForm()
97
98 kwargs = {}
99 kwargs['form'] = form
100 kwargs['title'] = 'JARS Configuration'
101 kwargs['suptitle'] = 'Import file'
102 kwargs['button'] = 'Upload'
103 kwargs['previous'] = conf.get_absolute_url()
104
105 return render(request, 'jars_import.html', kwargs)
106
107 def read_conf(request, conf_id):
108
109 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
110 #filter = get_object_or_404(JARSfilter, pk=filter_id)
111
112 if request.method=='GET':
113
114 parms = conf.read_device()
115 conf.status_device()
116
117 if not parms:
118 messages.error(request, conf.message)
119 return redirect(conf.get_absolute_url())
120
121 form = JARSConfigurationForm(initial=parms, instance=conf)
122
123 if request.method=='POST':
124 form = JARSConfigurationForm(request.POST, instance=conf)
125
126 if form.is_valid():
127 form.save()
128 return redirect(conf.get_absolute_url())
129
130 messages.error(request, "Parameters could not be saved")
131
132 kwargs = {}
133 kwargs['id_dev'] = conf.id
134 kwargs['filter_id'] = conf.filter.id
135 kwargs['form'] = form
136 kwargs['title'] = 'Device Configuration'
137 kwargs['suptitle'] = 'Parameters read from device'
138 kwargs['button'] = 'Save'
139
140 ###### SIDEBAR ######
141 kwargs.update(sidebar(conf=conf))
142
143 return render(request, 'jars_conf_edit.html', kwargs)
144
73 145 def view_filter(request, conf_id, filter_id):
74 146
75 147 conf = get_object_or_404(JARSConfiguration, pk=conf_id)
@@ -376,6 +376,16 class Experiment(models.Model):
376 376 #--For ABS Device:
377 377 #--For USRP Device:
378 378 #--For JARS Device:
379 if conf_type == 'jars':
380 device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id'])
381 DevConfModel = CONF_MODELS[conf_type]
382 confjars_form = DevConfModel(
383 experiment = self,
384 name = 'JARS',
385 device=device,
386 )
387 confjars_form.dict_to_parms(parms['configurations']['jars'])
388 confjars_form.save()
379 389 #--For RC Device:
380 390 if conf_type == 'rc':
381 391 device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id'])
@@ -23,7 +23,9
23 23 <li><a>----------------</a></li>
24 24 <li><a href="{{ dev_conf.get_absolute_url_status }}"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Status</a></li>
25 25 {% if not no_play %}
26 <li><a href="{{ dev_conf.get_absolute_url_start}}"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> Start</a></li>
26 {% if not only_stop %}
27 <li><a href="{{ dev_conf.get_absolute_url_start}}"><span class="glyphicon glyphicon-play" aria-hidden="true"></span> Start</a></li>
28 {% endif %}
27 29 <li><a href="{{ dev_conf.get_absolute_url_stop }}"><span class="glyphicon glyphicon-stop" aria-hidden="true"></span> Stop</a></li>
28 30 {% endif %}
29 31 <li><a href="{{ dev_conf.get_absolute_url_write }}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span> Write</a></li>
@@ -38,67 +38,77
38 38 {% endfor %}
39 39 </table>
40 40
41 <div class="">
42 <h4 class="panel-title"><b> Parameters </b></h4>
43 <br>
44 </div>
45 41
46 <table class="table table-bordered">
47 42 {% for configuration in configurations %}
43
48 44 {% if configuration.device.device_type.name == 'dds' %}
49 <!--<h4 class="panel-title"> </h4>-->
50 <tr><th>dds</th><td>(=</td></tr>
45 <div class="">
46 <h4 class="panel-title"><b> DDS </b></h4>
47 <br>
48 </div>
49
50 <table class="table table-bordered">
51 <!--<h4 class="panel-title"> </h4>-->
52 <tr><th>dds</th><td>(=</td></tr>
53 </table>
51 54 {% endif %}
52 55
53 56 {% if configuration.device.device_type.name == 'rc' %}
54 <!--<h4 class="panel-title"> </h4>-->
55 <tr><th>IPP(km)</th><td>{{experiment_data.configurations.rc.ipp}}</td></tr>
56 <tr><th>NTX</th><td>{{experiment_data.configurations.rc.ntx}}</td></tr>
57 <tr><th>TX</th><td>{{tx}}</td></tr>
58 <tr><th>Code</th><td>{{code}}</td></tr>
59 <tr><th>Sampling Window</th><td>{{window|linebreaks}}</td></tr>
60 {% endif %}
57 <div class="">
58 <h4 class="panel-title"><b> CR </b></h4>
59 <br>
60 </div>
61 61
62 {% if configuration.device.device_type.name == 'rc_mix' %}
63 <!--<h4 class="panel-title"> </h4>-->
64 <tr><th>rc_mix</th><td>(=</td></tr>
62 <table class="table table-bordered">
63 <!--<h4 class="panel-title"> </h4>-->
64 <tr><th>IPP(km)</th><td>{{experiment_data.configurations.rc.ipp}}</td></tr>
65 <tr><th>NTX</th><td>{{experiment_data.configurations.rc.ntx}}</td></tr>
66 <tr><th>TX</th><td>{{tx}}</td></tr>
67 <tr><th>Code</th><td>{{code}}</td></tr>
68 <tr><th>Sampling Window</th><td>{{window|linebreaks}}</td></tr>
69 </table>
65 70 {% endif %}
66 71
67 72 {% if configuration.device.device_type.name == 'jars' %}
68 <!--<h4 class="panel-title"> JARS </h4>-->
69 <tr><th>Data Type</th><td>{{exp_type}}</td></tr>
70 <tr><th># Channels</th><td>{{configuration.channels_number}}</td></tr>
71 <tr><th>Coh Int</th><td>{{configuration.cohe_integr}}</td></tr>
72 <tr><th>FFT Points</th><td>{{configuration.fftpoints}}</td></tr>
73 {% if exp_type == 'PDATA'%}
74 <tr><th>Inc Int</th><td>{{configuration.incohe_integr}}</td></tr>
75 <tr><th>Spec. Comb.</th><td>{{configuration.spectral}}</td></tr>
76 {% endif %}
77 <tr><th>Acq Prof</th><td>{{configuration.acq_profiles}}</td></tr>
78 <tr><th>Prof x Block</th><td>{{configuration.profiles_block}}</td></tr>
79 <tr><th>Block x File</th><td>(=</td></tr>
80 {% endif %}
81
82 {% if configuration.device.device_type.name == 'usrp' %}
83 <!--<h4 class="panel-title"> </h4>-->
84 <tr><th>usrp</th><td>(=</td></tr>
85 {% endif %}
86
87 {% if configuration.device.device_type.name == 'cgs' %}
88 <!--<h4 class="panel-title"> CGS </h4>-->
89 <!--<tr><th>Frequency 0</th><td>{{configuration.freq0}}</td></tr>-->
90 <!--<tr><th>Frequency 1</th><td>{{configuration.freq1}}</td></tr>-->
91 <!--<tr><th>Frequency 2</th><td>{{configuration.freq2}}</td></tr>-->
92 <!--<tr><th>Frequency 3</th><td>{{configuration.freq3}}</td></tr>-->
93 {% endif %}
73 <div class="">
74 <h4 class="panel-title"><b> JARS </b></h4>
75 <br>
76 </div>
94 77
95 {% if configuration.device.device_type.name == 'abs' %}
96 <!--<h4 class="panel-title"> </h4>-->
97 <tr><th>abs</th><td>(=</td></tr>
78 <table class="table table-bordered">
79 <!--<h4 class="panel-title"> JARS </h4>-->
80 <tr><th>Data Type</th><td>{{exp_type}}</td></tr>
81 <tr><th># Channels</th><td>{{configuration.channels_number}}</td></tr>
82 <tr><th>Coh Int</th><td>{{configuration.cohe_integr}}</td></tr>
83 <tr><th>FFT Points</th><td>{{configuration.fftpoints}}</td></tr>
84 {% if exp_type == 'PDATA'%}
85 <tr><th>Inc Int</th><td>{{configuration.incohe_integr}}</td></tr>
86 <tr><th>Spec. Comb.</th><td>{{configuration.spectral}}</td></tr>
87 {% endif %}
88 <tr><th>Acq Prof</th><td>{{configuration.acq_profiles}}</td></tr>
89 <tr><th>Prof x Block</th><td>{{configuration.profiles_block}}</td></tr>
90 <tr><th>Block x File</th><td>{{ configuration.raw_data_blocks }}</td></tr>
91 </table>
98 92 {% endif %}
93
99 94 {% endfor %}
95
96
97 <div class="">
98 <h4 class="panel-title"><b> Extra Parameters </b></h4>
99 <br>
100 </div>
101
102 <table class="table table-bordered">
103 {% if jars_conf %}
104 <tr><th>Rate (MB/h)</th><td>{{ rate }}</td></tr>
105 {% endif %}
106 {% if dds_conf %}
107 <tr><th>Vmax (m/s)</th><td>{{ rate }}</td></tr>
108 {% endif %}
100 109 </table>
101 110
111
102 112 <div class="pull-right">
103 113 <button type="button" class="btn btn-primary" id="bt_back">Back</button>
104 114 <button type="button" class="btn btn-primary" id="bt_verify">Verify Parameters</button>
@@ -121,5 +131,9
121 131 document.location = "{% url 'url_experiment' experiment.id%}";
122 132 });
123 133
134 $("#bt_verify").click(function() {
135 document.location = "{% url 'url_verify_experiment' experiment.id%}";
136 });
137
124 138 </script>
125 139 {% endblock %} No newline at end of file
@@ -31,6 +31,7 urlpatterns = (
31 31 url(r'^experiment/(?P<id_exp>-?\d+)/mix/$', 'apps.main.views.experiment_mix', name='url_mix_experiment'),
32 32 url(r'^experiment/(?P<id_exp>-?\d+)/mix/delete/$', 'apps.main.views.experiment_mix_delete', name='url_delete_mix_experiment'),
33 33 url(r'^experiment/(?P<id_exp>-?\d+)/summary/$', 'apps.main.views.experiment_summary', name='url_sum_experiment'),
34 url(r'^experiment/(?P<id_exp>-?\d+)/verify/$', 'apps.main.views.experiment_verify', name='url_verify_experiment'),
34 35
35 36 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/$', 'apps.main.views.dev_conf_new', name='url_add_dev_conf'),
36 37 url(r'^experiment/(?P<id_exp>-?\d+)/new_dev_conf/(?P<id_dev>-?\d+)/$', 'apps.main.views.dev_conf_new', name='url_add_dev_conf'),
@@ -25,6 +25,7 from apps.abs.models import ABSConfiguration
25 25 from apps.rc.models import RCConfiguration, RCLine, RCLineType
26 26 from apps.dds.models import DDSConfiguration
27 27 from django.http.request import QueryDict
28 #from __builtin__ import False
28 29
29 30 # Create your views here.
30 31
@@ -756,6 +757,7 def experiment_mix_delete(request, id_exp):
756 757 def experiment_summary(request, id_exp):
757 758
758 759 import json
760 import ast
759 761
760 762 experiment = get_object_or_404(Experiment, pk=id_exp)
761 763 experiment_data = json.loads(experiment.parms_to_dict())
@@ -775,12 +777,28 def experiment_summary(request, id_exp):
775 777
776 778 kwargs['button'] = 'Verify Parameters'
777 779
780 jars_conf = False
781 rc_conf = False
782
778 783 for configuration in configurations:
784 #-------------------- JARS -----------------------:
779 785 if configuration.device.device_type.name == 'jars':
780 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
781
786 jars_conf = True
787 kwargs['jars_conf'] = jars_conf
788 kwargs['exp_type'] = EXPERIMENT_TYPE[configuration.exp_type][1]
789 channels_number = configuration.channels_number
790 exp_type = configuration.exp_type
791 fftpoints = configuration.fftpoints
792 filter_parms = configuration.filter_parms
793 filter_parms = ast.literal_eval(filter_parms)
794 spectral_number = configuration.spectral_number
795
796 #--------------------- RC ----------------------:
782 797 if configuration.device.device_type.name == 'rc':
798 rc_conf = True
799 kwargs['rc_conf'] = rc_conf
783 800 rc_lines = experiment_data['configurations']['rc']['lines']
801 ipp = configuration.ipp
784 802 if experiment_data['configurations']['rc']['mix'] == 'True':
785 803 tx = ''
786 804 code = ''
@@ -805,12 +823,136 def experiment_summary(request, id_exp):
805 823 kwargs['tx'] = tx
806 824 kwargs['code'] = code
807 825 kwargs['window'] = window
808
826
827 #-------------------- DDS -----------------------:
828 if configuration.device.device_type.name == 'dds':
829 dds_conf = True
830 kwargs['dds_conf'] = dds_conf
831
832 #------ RC & JARS ------:
833 ipp = 937.5 #
834 nsa = 200#
835 dh = 1.5 #
836 channels_number = 5 #
837
838 if rc_conf and jars_conf:
839 if exp_type == 0: #Short
840 bytes = 2
841 b = nsa*2*bytes*channels_number
842 else: #Float
843 bytes = 4
844 channels = channels_number + spectral_number
845 b = nsa*2*bytes*fftpoints*channels
846
847 ipps = (ipp*pow(10,-6))/0.15
848 GB = 1048576.0*1024.0
849 Hour = 3600
850 rate = b/ipps
851 rate = rate *(1/GB)*(Hour)
852 kwargs['rate'] = str(rate)+" GB/h"
853 else:
854 kwargs['rate'] = ''
855
809 856 ###### SIDEBAR ######
810 857 kwargs.update(sidebar(experiment=experiment))
811 858
812 859 return render(request, 'experiment_summary.html', kwargs)
813 860
861 def experiment_verify(request, id_exp):
862
863 import json
864 import ast
865
866 experiment = get_object_or_404(Experiment, pk=id_exp)
867 experiment_data = json.loads(experiment.parms_to_dict())
868 configurations = Configuration.objects.filter(experiment=experiment, type=0)
869
870 kwargs = {}
871
872 kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'start_time', 'end_time']
873 kwargs['experiment'] = experiment
874
875 kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status']
876 kwargs['configurations'] = configurations
877 kwargs['experiment_data'] = experiment_data
878
879 kwargs['title'] = 'Verify Experiment'
880 kwargs['suptitle'] = 'Parameters'
881
882 kwargs['button'] = 'Update'
883
884 jars_conf = False
885 rc_conf = False
886 dds_conf = False
887
888 for configuration in configurations:
889 #-------------------- JARS -----------------------:
890 if configuration.device.device_type.name == 'jars':
891 jars_conf = True
892 kwargs['jars_conf'] = jars_conf
893 filter_parms = configuration.filter_parms
894 filter_parms = ast.literal_eval(filter_parms)
895 kwargs['filter_parms'] = filter_parms
896 #--Sampling Frequency
897 clock = filter_parms['clock']
898 filter_2 = filter_parms['filter_2']
899 filter_5 = filter_parms['filter_5']
900 filter_fir = filter_parms['filter_fir']
901 samp_freq_jars = clock/filter_2/filter_5/filter_fir
902
903 kwargs['samp_freq_jars'] = samp_freq_jars
904 kwargs['jars'] = configuration
905
906 #--------------------- RC ----------------------:
907 if configuration.device.device_type.name == 'rc':
908 rc_conf = True
909 rc_parms = configuration.parms_to_dict()
910 if rc_parms['mix'] == 'True':
911 pass
912 else:
913 rc_lines = rc_parms['lines']
914 dh = rc_lines[6]['params'][0]['resolution']
915 #--Sampling Frequency
916 samp_freq_rc = 0.15/dh
917 kwargs['samp_freq_rc'] = samp_freq_rc
918
919 kwargs['rc_conf'] = rc_conf
920 kwargs['rc'] = configuration
921
922 #-------------------- DDS ----------------------:
923 if configuration.device.device_type.name == 'dds':
924 dds_conf = True
925 dds_parms = configuration.parms_to_dict()
926
927 kwargs['dds_conf'] = dds_conf
928 kwargs['dds'] = configuration
929
930
931 #------------Validation------------:
932 #Clock
933 if dds_conf and rc_conf and jars_conf:
934 if filter_parms['clock'] != rc_parms['clock_in'] and rc_parms['clock_in'] != dds_parms['clock']:
935 messages.warning(request, "Devices don't have the same clock.")
936 elif rc_conf and jars_conf:
937 if filter_parms['clock'] != rc_parms['clock_in']:
938 messages.warning(request, "Devices don't have the same clock.")
939 elif rc_conf and dds_conf:
940 if rc_parms['clock_in'] != dds_parms['clock']:
941 messages.warning(request, "Devices don't have the same clock.")
942 if float(samp_freq_rc) != float(dds_parms['frequencyA']):
943 messages.warning(request, "Devices don't have the same Frequency A.")
944
945
946
947 ###### SIDEBAR ######
948 kwargs.update(sidebar(experiment=experiment))
949
950
951
952
953
954 return render(request, 'experiment_verify.html', kwargs)
955
814 956
815 957 def parse_mix_result(s):
816 958
@@ -1055,7 +1197,7 def dev_conf_write(request, id_conf):
1055 1197 messages.success(request, conf.message)
1056 1198
1057 1199 #Creating a historical configuration
1058 conf.clone(type=0, template=False)
1200 conf.clone(type=1, template=False)
1059 1201
1060 1202 #Original configuration
1061 1203 conf = DevConfModel.objects.get(pk=id_conf)
@@ -20,7 +20,7
20 20 {"fields": {"params": "{\"TX_ref\": {\"model\": \"RCLine\", \"value\": \"\"}, \"range\": { \"value\": 0, \"help\": \"Frame numbers or frame ranges separated by commas, use 0 for all frames eg: 1,2,10-15\"}}", "name": "tr", "description": ""}, "model": "rc.rclinetype", "pk": 1},
21 21 {"fields": {"params": "{\"pulse_width\":{\"value\": 0, \"widget\":\"dc\"},\r\n \"delays\":{\"value\": \"\", \"widget\":\"km\", \"help\": \"Delay entries separated by commas (TAUs)\"},\r\n \"range\":{\"value\": 0, \"help\": \"Frame numbers or frame ranges separated by commas, use 0 for all frames eg: 1,2,10-15\"}}", "name": "tx", "description": ""}, "model": "rc.rclinetype", "pk": 2},
22 22 {"fields": {"params": "{\"TX_ref\": {\"model\": \"RCLine\", \"value\": \"\"}, \"code\": {\"model\":\"RCLineCode\",\"value\": \"\"}, \"codes\":{\"value\":\"\", \"widget\":\"codes\"}}", "name": "codes", "description": ""}, "model": "rc.rclinetype", "pk": 3},
23 {"fields": {"params": "{ \"TX_ref\":{\"model\": \"RCLine\", \"value\": \"\"}, \"params\": {\"first_height\":{ \"value\": 0, \"widget\":\"km\"},\"resolution\": {\"value\": 0, \"widget\":\"km\"}, \"number_of_samples\": { \"value\": 0, \"help\":\"number of samples (NSA)\"}}}", "name": "windows", "description": ""}, "model": "rc.rclinetype", "pk": 4},
23 {"fields": {"params": "{ \"TX_ref\":{\"model\": \"RCLine\", \"value\": \"\"}, \"params\": {\"first_height\":{ \"value\": 0, \"widget\":\"km\"},\"resolution\": {\"value\": 0, \"widget\":\"km\"}, \"number_of_samples\": { \"value\": 0, \"help\":\"number of samples (NSA)\"}, \"last_height\": { \"value\": 0}}}", "name": "windows", "description": ""}, "model": "rc.rclinetype", "pk": 4},
24 24 {"fields": {"params": "{\"invert\":{\"value\": 0, \"help\": \"Set to 1 for synchro pulse at the end\"}}", "name": "sync", "description": ""}, "model": "rc.rclinetype", "pk": 5},
25 25 {"fields": {"params": "{ \"periodic\": { \"value\": 0, \"help\": \"Set to 1 for IPP periodic\"}, \"params\": {\"begin\": { \"value\": 0, \"widget\":\"unit\"}, \"end\": {\"value\": 0, \"widget\":\"unit\"}}}", "name": "prog_pulses", "description": ""}, "model": "rc.rclinetype", "pk": 6},
26 26 {"fields": {"params": "{\"number_of_flips\": {\"value\": 0}}", "name": "flip", "description": ""}, "model": "rc.rclinetype", "pk": 7},
@@ -30,6 +30,7 LINE_TYPES = (
30 30
31 31 SAMPLING_REFS = (
32 32 ('none', 'No Reference'),
33 ('begin_baud', 'Begin of the first baud'),
33 34 ('first_baud', 'Middle of the first baud'),
34 35 ('sub_baud', 'Middle of the sub-baud')
35 36 )
@@ -145,12 +146,13 class RCConfiguration(Configuration):
145 146 data['lines'] = []
146 147
147 148 for line in self.get_lines():
148 line_data = json.loads(line.params)
149 line_data = json.loads(line.params)
149 150 if 'TX_ref' in line_data and line_data['TX_ref'] not in (0, '0'):
150 line_data['TX_ref'] = RCLine.objects.get(pk=line_data['TX_ref']).get_name()
151 line_data['TX_ref'] = line.get_name()
151 152 if 'code' in line_data:
152 153 line_data['code'] = RCLineCode.objects.get(pk=line_data['code']).name
153 154 line_data['type'] = line.line_type.name
155 line_data['name'] = line.get_name()
154 156 data['lines'].append(line_data)
155 157
156 158 data['delays'] = self.get_delays()
@@ -341,7 +343,7 class RCConfiguration(Configuration):
341 343 for line in self.get_lines():
342 344 line.update_pulses()
343 345
344 def plot_pulses(self):
346 def plot_pulses(self, km=False):
345 347
346 348 import matplotlib.pyplot as plt
347 349 from bokeh.resources import CDN
@@ -352,19 +354,29 class RCConfiguration(Configuration):
352 354 lines = self.get_lines()
353 355
354 356 N = len(lines)
357 npoints = self.total_units/self.km2unit if km else self.total_units
355 358 fig = plt.figure(figsize=(10, 2+N*0.5))
356 359 ax = fig.add_subplot(111)
357 labels = []
360 labels = ['IPP']
358 361
359 362 for i, line in enumerate(lines):
360 labels.append(line.get_name())
361 l = ax.plot((0, self.total_units),(N-i-1, N-i-1))
362 points = [(tup[0], tup[1]-tup[0]) for tup in line.pulses_as_points() if tup<>(0,0)]
363 labels.append(line.get_name(channel=True))
364 l = ax.plot((0, npoints),(N-i-1, N-i-1))
365 points = [(tup[0], tup[1]-tup[0]) for tup in line.pulses_as_points(km=km) if tup<>(0,0)]
363 366 ax.broken_barh(points, (N-i-1, 0.5),
364 367 edgecolor=l[0].get_color(), facecolor='none')
365 368
369 n = 0
370 f = ((self.ntx+50)/100)*5 if ((self.ntx+50)/100)*10>0 else 2
371 for x in np.arange(0, npoints, self.ipp if km else self.ipp*self.km2unit):
372 if n%f==0:
373 ax.text(x, N, '%s' % n, size=10)
374 n += 1
375
376
366 377 labels.reverse()
367 378 ax.set_yticklabels(labels)
379
368 380 ax.set_xlabel = 'Units'
369 381 plot = to_bokeh(fig, use_pandas=False)
370 382 plot.tools = [PanTool(dimensions=['width']), WheelZoomTool(dimensions=['width']), ResetTool(), PreviewSaveTool()]
@@ -468,7 +480,7 class RCLine(models.Model):
468 480
469 481 return self
470 482
471 def get_name(self):
483 def get_name(self, channel=False):
472 484
473 485 chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
474 486 s = ''
@@ -484,10 +496,13 class RCLine(models.Model):
484 496 ref = RCLine.objects.get(pk=pk)
485 497 s = chars[ref.position]
486 498 s = '({})'.format(s)
487 if s:
488 return '{}{} {}'.format(self.line_type.name.upper(), s, self.channel)
499
500 s = '{}{}'.format(self.line_type.name.upper(), s)
501
502 if channel:
503 return '{} {}'.format(s, self.channel)
489 504 else:
490 return '{} {}'.format(self.line_type.name.upper(), self.channel)
505 return s
491 506
492 507 def get_lines(self, **kwargs):
493 508
@@ -502,9 +517,13 class RCLine(models.Model):
502 517
503 518 return y.astype(np.int8)
504 519
505 def pulses_as_points(self):
520 def pulses_as_points(self, km=False):
506 521
507 return ast.literal_eval(self.pulses)
522 if km:
523 unit2km = 1/self.rc_configuration.km2unit
524 return [(tup[0]*unit2km, tup[1]*unit2km) for tup in ast.literal_eval(self.pulses)]
525 else:
526 return ast.literal_eval(self.pulses)
508 527
509 528 def get_win_ref(self, params, tx_id, km2unit):
510 529
@@ -14,7 +14,18 function str2unit(s){
14 14 var ret = "";
15 15 values = s.split(",");
16 16 for (i=0; i<values.length; i++) {
17 ret += Math.round(parseFloat(values[i]))*km2unit;
17 ret += Math.round(parseFloat(values[i])*km2unit);
18 ret += ",";
19 }
20 return ret.substring(0, ret.length-1);
21 }
22
23
24 function str2int(s){
25 var ret = "";
26 values = s.split(",");
27 for (i=0; i<values.length; i++) {
28 ret += Math.round(parseFloat(values[i]));
18 29 ret += ",";
19 30 }
20 31 return ret.substring(0, ret.length-1);
@@ -58,6 +69,44 function updateDc() {
58 69 }
59 70
60 71
72 function updateWindows(label) {
73
74 if (label.indexOf("first_height")>0){
75 llabel = label.replace("first_height", "last_height");
76 rlabel = label.replace("first_height", "resolution");
77 nlabel = label.replace("first_height", "number_of_samples");
78 value = parseFloat($(label).val())+parseFloat($(rlabel).val())*(parseInt($(nlabel).val())-1);
79 $(llabel).val(value);
80 }
81
82 if (label.indexOf("resolution")>0){
83 llabel = label.replace("resolution", "last_height");
84 flabel = label.replace("resolution", "first_height");
85 nlabel = label.replace("resolution", "number_of_samples");
86 value = parseFloat($(flabel).val())+parseFloat($(label).val())*(parseInt($(nlabel).val())-1);
87 $(llabel).val(value);
88 }
89
90 if (label.indexOf("number_of_samples")>0){
91 llabel = label.replace("number_of_samples", "last_height");
92 rlabel = label.replace("number_of_samples", "resolution");
93 flabel = label.replace("number_of_samples", "first_height");
94 value = parseFloat($(flabel).val())+parseFloat($(rlabel).val())*(parseInt($(label).val())-1);
95 $(llabel).val(value);
96 }
97
98 if (label.indexOf("last_height")>0){
99 flabel = label.replace("last_height", "first_height");
100 rlabel = label.replace("last_height", "resolution");
101 nlabel = label.replace("last_height", "number_of_samples");
102
103 nvalue = Math.round((parseFloat($(label).val())-parseFloat($(flabel).val()))/parseFloat($(rlabel).val()))+1;
104 $(nlabel).val(nvalue);
105 value = parseFloat($(flabel).val())+parseFloat($(rlabel).val())*(nvalue-1);
106 $(label).val(value);
107 }
108
109 }
61 110
62 111 $("#id_clock_in").change(function() {
63 112 $("#id_clock").val(parseFloat($('#id_clock_in').val())/parseFloat($('#id_clock_divider').val()));
@@ -10,9 +10,18
10 10 {% block extra-content %}
11 11
12 12 <div class="clearfix"></div>
13 <h2>RC Lines</h2><hr>
13 <h2>RC Lines</h2>
14 <hr>
14 15 <div class="panel-group" id="div_lines" role="tablist" aria-multiselectable="true">
15 16 {% include "rc_lines.html" %}
16 17 </div>
17 18
18 19 {% endblock extra-content%}
20
21 {% block extra-js%}
22 <script type="text/javascript">
23 $("#bt_toggle").click(function() {
24 $(".panel-collapse").collapse('toggle')
25 });
26 </script>
27 {% endblock %} No newline at end of file
@@ -68,6 +68,10
68 68 }
69 69 });
70 70
71 $("#bt_toggle").click(function() {
72 $(".panel-collapse").collapse('toggle')
73 });
74
71 75 </script>
72 76 {% endblock %}
73 77 No newline at end of file
@@ -1,5 +1,7
1 1 {% load bootstrap3 %}
2
2 <div class="pull-right"><button id="bt_toggle" type="button" class="btn btn-default btn-sm" >
3 Expand/Collapse
4 </button></div><br><br>
3 5 {% for line in rc_lines %}
4 6 <div class="panel panel-default" id="panel-{{line.id}}">
5 7 <div class="panel-heading" role="tab" id="heading{{line.id}}">
@@ -8,17 +8,55
8 8 {% endblock %}
9 9
10 10 {% block content %}
11
11 12 <div id="div_plot">{{div}}</div>
12 13 <br>
13 <div class="col-md-2">1 Km =</div><div class="col-md-3">{{units}} Units</div>
14 <br>
15 <div class="col-md-2">1 Unit=</div><div class="col-md-3">{{kms}} Km</div>
14
15 <form class="form-horizontal">
16 <div class="form-group">
17 <label class="col-sm-2 control-label">Axis</label>
18 <div class="col-sm-4">
19 <select class="form-control" id='id_axis'>
20 <option value=0>Units</option>
21 {%if km_selected %}
22 <option value=1 selected>Km</option>
23 {%else%}
24 <option value=1>Km</option>
25 {%endif%}
26 </select>
27 </div>
28 </div>
29 <div class="form-group">
30 <label class="col-sm-2 control-label">1 Km</label>
31 <div class="col-sm-4">
32 <p class="form-control-static">{{units}} Units</p>
33 </div>
34 </div>
35 <div class="form-group">
36 <label class="col-sm-2 control-label">1 Unit</label>
37 <div class="col-sm-4">
38 <p class="form-control-static">{{kms}} Km</p>
39 </div>
40 </div>
41 </form>
42
16 43 {% endblock %}
17 44
18 45 {% block extra-js%}
19 46
20 47 <script src="{% static 'js/bokeh-0.11.1.min.js' %}"></script>
21
48
49 <script type="text/javascript">
50
51 $("#id_axis").change(function() {
52 if($(this).val()=='0'){
53 document.location = '?unit';
54 }else{
55 document.location = '?km'
56 }
57 });
58
59 </script>
22 60 {{script}}
23 61
24 62 {% endblock %} No newline at end of file
@@ -145,8 +145,10 class RCFile(object):
145 145 windows = []
146 146 for w in range(int(data['Sampling Windows (Line %d)' % n])):
147 147 windows.append({'first_height':float(data['L%d_H0(%d)' % (n, w)]),
148 'resolution':float(data['L%d_DH(%d)' % (n, w)]),
148 149 'number_of_samples':int(data['L%d_NSA(%d)' % (n, w)]),
149 'resolution':float(data['L%d_DH(%d)' % (n, w)])}
150 'last_height':float(data['L%d_DH(%d)' % (n, w)])*(int(data['L%d_NSA(%d)' % (n, w)])-1)+float(data['L%d_H0(%d)' % (n, w)])
151 }
150 152 )
151 153 line['params'] = windows
152 154 elif 'Line%d' % n in labels and data['Line%d' % n]=='Synchro':
@@ -184,7 +186,8 class RCFile(object):
184 186 dh = raw_data[x+3+3*w].split('=')[-1]
185 187 windows.append({'first_height':float(h0),
186 188 'number_of_samples':int(nsa),
187 'resolution':float(dh)}
189 'resolution':float(dh),
190 'last_height':float(h0)+float(dh)*(int(nsa)-1)}
188 191 )
189 192 line['params'] = windows
190 193 self.data['lines'].append(line)
@@ -330,6 +330,7 def import_file(request, conf_id):
330 330 form = RCImportForm(request.POST, request.FILES)
331 331 if form.is_valid():
332 332 try:
333 #if True:
333 334 conf.update_from_file(request.FILES['file_name'])
334 335 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
335 336 return redirect(conf.get_absolute_url_edit())
@@ -354,18 +355,22 def import_file(request, conf_id):
354 355 def plot_pulses(request, conf_id):
355 356
356 357 conf = get_object_or_404(RCConfiguration, pk=conf_id)
357
358 script, div = conf.plot_pulses()
358 km = True if 'km' in request.GET else False
359
360 script, div = conf.plot_pulses(km=km)
359 361
360 362 kwargs = {}
361 363
362 364 kwargs['title'] = 'RC Pulses'
363 kwargs['suptitle'] = conf.name
365 kwargs['suptitle'] = conf.name
364 366 kwargs['div'] = mark_safe(div)
365 367 kwargs['script'] = mark_safe(script)
366 368 kwargs['units'] = conf.km2unit
367 369 kwargs['kms'] = 1/conf.km2unit
368 370
371 if km:
372 kwargs['km_selected'] = True
373
369 374 if 'json' in request.GET:
370 375 return HttpResponse(json.dumps({'div':mark_safe(div), 'script':mark_safe(script)}), content_type="application/json")
371 376 else:
@@ -31,7 +31,7 class KmUnitWidget(forms.widgets.TextInput):
31 31 input_type = 'number'
32 32
33 33 if 'line' in attrs:
34 label += '_{0}'.format(attrs['line'].pk)
34 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
35 35
36 36 html = '''<div class="col-md-12 col-no-padding">
37 37 <div class="col-md-5 col-no-padding"><input type="{0}" step="any" {1} class="form-control" id="id_{2}" name="{3}" value="{4}"></div>
@@ -48,13 +48,15 class KmUnitWidget(forms.widgets.TextInput):
48 48 $("#id_{label}").change(function() {{
49 49 $("#id_{label}_unit").val(str2unit($(this).val()));
50 50 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
51 updateWindows("#id_{label}");
51 52 }});
52 53 $("#id_{label}_unit").change(function() {{
53 $(this).val(parseFloat($(this).val()));
54 $(this).val(str2int($(this).val()));
54 55 $("#id_{label}").val(str2km($(this).val()));
56 updateWindows("#id_{label}");
55 57 }});
56 58 }});
57 </script>'''.format(label=label)
59 </script>'''.format(label=label)
58 60
59 61 if disabled:
60 62 return mark_safe(html)
@@ -80,7 +82,7 class UnitKmWidget(forms.widgets.TextInput):
80 82 name = attrs.get('name', label)
81 83
82 84 if 'line' in attrs:
83 label += '_{0}'.format(attrs['line'].pk)
85 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
84 86
85 87 html = '''<div class="col-md-12 col-no-padding">
86 88 <div class="col-md-5 col-no-padding"><input type="number" {0} class="form-control" id="id_{1}_unit" name="{2}" value="{3}"></div>
@@ -139,6 +141,7 class KmUnitHzWidget(forms.widgets.TextInput):
139 141 unit_fields.push("id_{label}_unit");
140 142 $("#id_{label}").change(function() {{
141 143 $("#id_{label}_unit").val(str2unit($(this).val()));
144 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
142 145 $("#id_{label}_hz").val(str2hz($(this).val()));
143 146 updateDc();
144 147 }});
@@ -191,6 +194,7 class KmUnitDcWidget(forms.widgets.TextInput):
191 194 dc_fields.push("id_{label}");
192 195 $("#id_{label}").change(function() {{
193 196 $("#id_{label}_unit").val(str2unit($(this).val()));
197 $("#id_{label}").val(str2km($("#id_{label}_unit").val()));
194 198 $("#id_{label}_dc").val(str2dc($("#id_{label}").val()));
195 199 }});
196 200 $("#id_{label}_unit").change(function() {{
@@ -216,9 +220,31 class DefaultWidget(forms.widgets.TextInput):
216 220 def render(self, label, value, attrs=None):
217 221
218 222 disabled = 'disabled' if attrs.get('disabled', False) else ''
223 itype = 'number' if label in ('number_of_samples', 'last_height') else 'text'
219 224 name = attrs.get('name', label)
225 if 'line' in attrs:
226 label += '_{0}_{1}'.format(attrs['line'].pk, name.split('|')[0])
227 html = '<div class="col-md-12 col-no-padding"><div class="col-md-5 col-no-padding"><input {0} type="{1}" class="form-control" id="id_{2}" name="{3}" value="{4}"></div></div>'.format(disabled, itype, label, name, value)
228
229 if 'last_height' in label or 'number_of_samples' in label:
230 script = '''<script type="text/javascript">
231 $(document).ready(function () {{
232
233 $("#id_{label}").change(function() {{
234 updateWindows("#id_{label}");
235 }});
236
237 }});
238 </script>'''.format(label=label)
239 else:
240 script = ''
241
242 if disabled:
243 return mark_safe(html)
244 else:
245 return mark_safe(html+script)
246
220 247
221 html = '<div class="col-md-12 col-no-padding"><div class="col-md-5 col-no-padding"><input {0} type="text" class="form-control" id="id_{1}" name="{2}" value="{3}"></div></div>'.format(disabled, label, name, value)
222 248
223 249 return mark_safe(html)
224 250
@@ -35,6 +35,8 CMD_ECHO =0XFE
35 35 RC_CMD_RESET =0X10
36 36 RC_CMD_WRITE =0x50
37 37 RC_CMD_READ =0x8000
38 RC_CMD_ENABLE =0X24
39 RC_CMD_DISABLE =0X00
38 40
39 41 @eth_device(ID_CLASS)
40 42 def reset():
@@ -69,16 +71,32 def echo():
69 71 return cmd, payload
70 72
71 73 @eth_device(ID_CLASS)
74 def enable():
75
76 cmd = RC_CMD_ENABLE
77 payload = chr(0x01)
78
79 return cmd, payload
80
81 @eth_device(ID_CLASS)
82 def disable():
83
84 cmd = RC_CMD_DISABLE
85 payload = chr(0x00)
86
87 return cmd, payload
88
89 @eth_device(ID_CLASS)
72 90 def read_all_device():
73 91
74 92 payload = ""
75 93
76 return CR_CMD_READ, payload
94 return RC_CMD_READ, payload
77 95
78 96 @eth_device(ID_CLASS)
79 97 def write_all_device(payload):
80 98
81 return CR_CMD_WRITE, payload
99 return RC_CMD_WRITE, payload
82 100
83 101 def read_config(ip, port):
84 102 """
@@ -99,7 +117,7 def write_config(ip, port, parms):
99 117
100 118 """
101 119
102 payload = data.dict_to_rc_str(parms)
120 payload = write_ram_memory(parms['pulses'], parms['delays'])
103 121
104 122 answer = write_all_device(ip, port, payload)
105 123
@@ -107,13 +125,13 def write_config(ip, port, parms):
107 125
108 126 def __get_low_byte(valor):
109 127
110 return ord(valor & 0x00FF)
128 return ord(valor & 0x00FF)
111 129
112 130 def __get_high_byte(valor):
113 131
114 return ord((valor & 0xFF00) >> 8)
132 return ord((valor & 0xFF00) >> 8)
133
115 134
116 @eth_device(ID_CLASS)
117 135 def write_ram_memory(vector_valores, vector_tiempos):
118 136
119 137 l1 = len(vector_valores)
@@ -122,10 +140,10 def write_ram_memory(vector_valores, vector_tiempos):
122 140 cad = ""
123 141
124 142 for i in range(l1):
125 cad += ord(84) + __get_low_byte(vector_valores[i]) + ord(85) + __get_high_byte(vector_valores[i]) + \
143 cad += ord(84) + __get_low_byte(vector_valores[i]) + ord(85) + __get_high_byte(vector_valores[i]) + \
126 144 ord(84) + __get_low_byte(vector_tiempos[i]) + ord(85) + __get_high_byte(vector_tiempos[i])
127 145
128 return RC_CMD_WRITE, cad
146 return cad
129 147
130 148 if __name__ == '__main__':
131 149 ip = "10.10.20.150"
General Comments 0
You need to be logged in to leave comments. Login now