##// END OF EJS Templates
Create 'ip_address_rx', 'daughterboard_rx' and 'antenna_rx' parameters (USRP Rx) and Update models.py file (Pedestal)
eynilupu -
r413:231bd42642ba
parent child
Show More
@@ -1,1284 +1,1296
1 import ast
1 import ast
2 import json
2 import json
3 import hashlib
3 import hashlib
4 from datetime import datetime, timedelta
4 from datetime import datetime, timedelta
5
5
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 from django.utils.safestring import mark_safe
7 from django.utils.safestring import mark_safe
8 from django.http import HttpResponseRedirect
8 from django.http import HttpResponseRedirect
9 from django.urls import reverse
9 from django.urls import reverse
10 from django.db.models import Q
10 from django.db.models import Q
11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
11 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
12 from django.contrib import messages
12 from django.contrib import messages
13 from django.http.request import QueryDict
13 from django.http.request import QueryDict
14 from django.contrib.auth.decorators import login_required, user_passes_test
14 from django.contrib.auth.decorators import login_required, user_passes_test
15
15
16 from django.utils.timezone import is_aware
16 from django.utils.timezone import is_aware
17
17
18 try:
18 try:
19 from urllib.parse import urlencode
19 from urllib.parse import urlencode
20 except ImportError:
20 except ImportError:
21 from urllib import urlencode
21 from urllib import urlencode
22
22
23 from .forms import ExperimentForm, ExperimentEditionForm, DeviceForm, ConfigurationForm, UploadFileForm, DownloadFileForm, NewForm
23 from .forms import ExperimentForm, ExperimentEditionForm, DeviceForm, ConfigurationForm, UploadFileForm, DownloadFileForm, NewForm
24 from .forms import FilterForm, ChangeIpForm
24 from .forms import FilterForm, ChangeIpForm
25
25
26 from apps.pedestal.forms import PedestalConfigurationForm, PedestalEditionForm
26 from apps.pedestal.forms import PedestalConfigurationForm, PedestalEditionForm
27 from apps.generator.forms import GeneratorConfigurationForm
27 from apps.generator.forms import GeneratorConfigurationForm
28 from apps.usrp_rx.forms import USRPRXConfigurationForm, USRPRXEditionForm
28 from apps.usrp_rx.forms import USRPRXConfigurationForm, USRPRXEditionForm
29 from apps.usrp_tx.forms import USRPTXConfigurationForm, USRPTXEditionForm
29 from apps.usrp_tx.forms import USRPTXConfigurationForm, USRPTXEditionForm
30 from .utils import Params
30 from .utils import Params
31
31
32 from .models import Experiment, Device, Configuration, DEV_STATES
32 from .models import Experiment, Device, Configuration, DEV_STATES
33 from apps.pedestal.models import PedestalConfiguration
33 from apps.pedestal.models import PedestalConfiguration
34 from apps.generator.models import GeneratorConfiguration
34 from apps.generator.models import GeneratorConfiguration
35 from apps.usrp_rx.models import USRPRXConfiguration
35 from apps.usrp_rx.models import USRPRXConfiguration
36 from apps.usrp_tx.models import USRPTXConfiguration
36 from apps.usrp_tx.models import USRPTXConfiguration
37 from apps.usrp_tx.validations import validation_usrp_tx_code
37 from apps.usrp_tx.validations import validation_usrp_tx_code
38
38
39
39
40 #comentario test
40 #comentario test
41 CONF_FORMS = {
41 CONF_FORMS = {
42 'pedestal': PedestalConfigurationForm,
42 'pedestal': PedestalConfigurationForm,
43 'generator': GeneratorConfigurationForm,
43 'generator': GeneratorConfigurationForm,
44 'usrp_rx': USRPRXConfigurationForm,
44 'usrp_rx': USRPRXConfigurationForm,
45 'usrp_tx': USRPTXConfigurationForm,
45 'usrp_tx': USRPTXConfigurationForm,
46 }
46 }
47
47
48 CONF_MODELS = {
48 CONF_MODELS = {
49 'pedestal': PedestalConfiguration,
49 'pedestal': PedestalConfiguration,
50 'generator': GeneratorConfiguration,
50 'generator': GeneratorConfiguration,
51 'usrp_rx': USRPRXConfiguration,
51 'usrp_rx': USRPRXConfiguration,
52 'usrp_tx': USRPTXConfiguration,
52 'usrp_tx': USRPTXConfiguration,
53 }
53 }
54
54
55 MIX_MODES = {
55 MIX_MODES = {
56 '0': 'P',
56 '0': 'P',
57 '1': 'S',
57 '1': 'S',
58 }
58 }
59
59
60 MIX_OPERATIONS = {
60 MIX_OPERATIONS = {
61 '0': 'OR',
61 '0': 'OR',
62 '1': 'XOR',
62 '1': 'XOR',
63 '2': 'AND',
63 '2': 'AND',
64 '3': 'NAND',
64 '3': 'NAND',
65 }
65 }
66
66
67
67
68 def is_developer(user):
68 def is_developer(user):
69
69
70 groups = [str(g.name) for g in user.groups.all()]
70 groups = [str(g.name) for g in user.groups.all()]
71 return 'Developer' in groups or user.is_staff
71 return 'Developer' in groups or user.is_staff
72
72
73
73
74 def is_operator(user):
74 def is_operator(user):
75
75
76 groups = [str(g.name) for g in user.groups.all()]
76 groups = [str(g.name) for g in user.groups.all()]
77 return 'Operator' in groups or user.is_staff
77 return 'Operator' in groups or user.is_staff
78
78
79
79
80 def has_been_modified(model):
80 def has_been_modified(model):
81
81
82 prev_hash = model.hash
82 prev_hash = model.hash
83 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
83 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
84 if prev_hash != new_hash:
84 if prev_hash != new_hash:
85 model.hash = new_hash
85 model.hash = new_hash
86 model.save()
86 model.save()
87 return True
87 return True
88 return False
88 return False
89
89
90
90
91 def index(request):
91 def index(request):
92 kwargs = {'no_sidebar': True}
92 kwargs = {'no_sidebar': True}
93
93
94 return render(request, 'index.html', kwargs)
94 return render(request, 'index.html', kwargs)
95
95
96
96
97 def devices(request):
97 def devices(request):
98
98
99 page = request.GET.get('page')
99 page = request.GET.get('page')
100 order = ('device_type',)
100 order = ('device_type',)
101
101
102 filters = request.GET.copy()
102 filters = request.GET.copy()
103 kwargs = get_paginator(Device, page, order, filters)
103 kwargs = get_paginator(Device, page, order, filters)
104 form = FilterForm(initial=request.GET, extra_fields=['tags'])
104 form = FilterForm(initial=request.GET, extra_fields=['tags'])
105
105
106 kwargs['keys'] = ['device_type',
106 kwargs['keys'] = ['device_type',
107 'ip_address', 'port_address', 'actions']
107 'ip_address', 'port_address', 'actions']
108 kwargs['title'] = 'Device'
108 kwargs['title'] = 'Device'
109 kwargs['suptitle'] = 'List'
109 kwargs['suptitle'] = 'List'
110 kwargs['no_sidebar'] = True
110 kwargs['no_sidebar'] = True
111 kwargs['form'] = form
111 kwargs['form'] = form
112 kwargs['add_url'] = reverse('url_add_device')
112 kwargs['add_url'] = reverse('url_add_device')
113 filters.pop('page', None)
113 filters.pop('page', None)
114 kwargs['q'] = urlencode(filters)
114 kwargs['q'] = urlencode(filters)
115 kwargs['menu_devices'] = 'active'
115 kwargs['menu_devices'] = 'active'
116 return render(request, 'base_list.html', kwargs)
116 return render(request, 'base_list.html', kwargs)
117
117
118
118
119 def device(request, id_dev):
119 def device(request, id_dev):
120
120
121 device = get_object_or_404(Device, pk=id_dev)
121 device = get_object_or_404(Device, pk=id_dev)
122
122
123 kwargs = {}
123 kwargs = {}
124 kwargs['device'] = device
124 kwargs['device'] = device
125 kwargs['device_keys'] = ['device_type',
125 kwargs['device_keys'] = ['device_type',
126 'ip_address', 'port_address', 'description']
126 'ip_address', 'port_address', 'description']
127
127
128 kwargs['title'] = 'Device'
128 kwargs['title'] = 'Device'
129 kwargs['suptitle'] = 'Details'
129 kwargs['suptitle'] = 'Details'
130 kwargs['menu_devices'] = 'active'
130 kwargs['menu_devices'] = 'active'
131
131
132 return render(request, 'device.html', kwargs)
132 return render(request, 'device.html', kwargs)
133
133
134
134
135 @login_required
135 @login_required
136 def device_new(request):
136 def device_new(request):
137
137
138 if request.method == 'GET':
138 if request.method == 'GET':
139 form = DeviceForm()
139 form = DeviceForm()
140
140
141 if request.method == 'POST':
141 if request.method == 'POST':
142 form = DeviceForm(request.POST)
142 form = DeviceForm(request.POST)
143
143
144 if form.is_valid():
144 if form.is_valid():
145 form.save()
145 form.save()
146 return redirect('url_devices')
146 return redirect('url_devices')
147
147
148 kwargs = {}
148 kwargs = {}
149 kwargs['form'] = form
149 kwargs['form'] = form
150 kwargs['title'] = 'Device'
150 kwargs['title'] = 'Device'
151 kwargs['suptitle'] = 'New'
151 kwargs['suptitle'] = 'New'
152 kwargs['button'] = 'Create'
152 kwargs['button'] = 'Create'
153 kwargs['menu_devices'] = 'active'
153 kwargs['menu_devices'] = 'active'
154
154
155 return render(request, 'base_edit.html', kwargs)
155 return render(request, 'base_edit.html', kwargs)
156
156
157
157
158 @login_required
158 @login_required
159 def device_edit(request, id_dev):
159 def device_edit(request, id_dev):
160
160
161 device = get_object_or_404(Device, pk=id_dev)
161 device = get_object_or_404(Device, pk=id_dev)
162
162
163 if request.method == 'GET':
163 if request.method == 'GET':
164 form = DeviceForm(instance=device)
164 form = DeviceForm(instance=device)
165
165
166 if request.method == 'POST':
166 if request.method == 'POST':
167 form = DeviceForm(request.POST, instance=device)
167 form = DeviceForm(request.POST, instance=device)
168
168
169 if form.is_valid():
169 if form.is_valid():
170 form.save()
170 form.save()
171 return redirect(device.get_absolute_url())
171 return redirect(device.get_absolute_url())
172
172
173 kwargs = {}
173 kwargs = {}
174 kwargs['form'] = form
174 kwargs['form'] = form
175 kwargs['title'] = 'Device'
175 kwargs['title'] = 'Device'
176 kwargs['suptitle'] = 'Edit'
176 kwargs['suptitle'] = 'Edit'
177 kwargs['button'] = 'Update'
177 kwargs['button'] = 'Update'
178 kwargs['menu_devices'] = 'active'
178 kwargs['menu_devices'] = 'active'
179
179
180 return render(request, 'base_edit.html', kwargs)
180 return render(request, 'base_edit.html', kwargs)
181
181
182
182
183 @login_required
183 @login_required
184 def device_delete(request, id_dev):
184 def device_delete(request, id_dev):
185
185
186 device = get_object_or_404(Device, pk=id_dev)
186 device = get_object_or_404(Device, pk=id_dev)
187
187
188 if request.method == 'POST':
188 if request.method == 'POST':
189
189
190 if is_developer(request.user):
190 if is_developer(request.user):
191 device.delete()
191 device.delete()
192 return redirect('url_devices')
192 return redirect('url_devices')
193
193
194 messages.error(request, 'Not enough permission to delete this object')
194 messages.error(request, 'Not enough permission to delete this object')
195 return redirect(device.get_absolute_url())
195 return redirect(device.get_absolute_url())
196
196
197 kwargs = {
197 kwargs = {
198 'title': 'Delete',
198 'title': 'Delete',
199 'suptitle': 'Device',
199 'suptitle': 'Device',
200 'object': device,
200 'object': device,
201 'delete': True
201 'delete': True
202 }
202 }
203 kwargs['menu_devices'] = 'active'
203 kwargs['menu_devices'] = 'active'
204
204
205 return render(request, 'confirm.html', kwargs)
205 return render(request, 'confirm.html', kwargs)
206
206
207
207
208 @login_required
208 @login_required
209 def device_change_ip(request, id_dev):
209 def device_change_ip(request, id_dev):
210
210
211 device = get_object_or_404(Device, pk=id_dev)
211 device = get_object_or_404(Device, pk=id_dev)
212
212
213 if request.method == 'POST':
213 if request.method == 'POST':
214
214
215 if is_developer(request.user):
215 if is_developer(request.user):
216 device.change_ip(**request.POST.dict())
216 device.change_ip(**request.POST.dict())
217 level, message = device.message.split('|')
217 level, message = device.message.split('|')
218 messages.add_message(request, level, message)
218 messages.add_message(request, level, message)
219 else:
219 else:
220 messages.error(
220 messages.error(
221 request, 'Not enough permission to delete this object')
221 request, 'Not enough permission to delete this object')
222 return redirect(device.get_absolute_url())
222 return redirect(device.get_absolute_url())
223
223
224 kwargs = {
224 kwargs = {
225 'title': 'Device',
225 'title': 'Device',
226 'suptitle': 'Change IP',
226 'suptitle': 'Change IP',
227 'object': device,
227 'object': device,
228 'previous': device.get_absolute_url(),
228 'previous': device.get_absolute_url(),
229 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
229 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
230 'message': ' ',
230 'message': ' ',
231 }
231 }
232 kwargs['menu_devices'] = 'active'
232 kwargs['menu_devices'] = 'active'
233
233
234 return render(request, 'confirm.html', kwargs)
234 return render(request, 'confirm.html', kwargs)
235
235
236
236
237 def experiments(request):
237 def experiments(request):
238
238
239 page = request.GET.get('page')
239 page = request.GET.get('page')
240 order = ('id',)
240 order = ('id',)
241 filters = request.GET.copy()
241 filters = request.GET.copy()
242
242
243 if 'my experiments' in filters:
243 if 'my experiments' in filters:
244 filters.pop('my experiments', None)
244 filters.pop('my experiments', None)
245 filters['mine'] = request.user.id
245 filters['mine'] = request.user.id
246
246
247 kwargs = get_paginator(Experiment, page, order, filters)
247 kwargs = get_paginator(Experiment, page, order, filters)
248
248
249 fields = ['tags']
249 fields = ['tags']
250 if request.user.is_authenticated:
250 if request.user.is_authenticated:
251 fields.append('my experiments')
251 fields.append('my experiments')
252
252
253 form = FilterForm(initial=request.GET, extra_fields=fields)
253 form = FilterForm(initial=request.GET, extra_fields=fields)
254
254
255 kwargs['keys'] = ['name', 'pedestal', 'reception_rx', 'transmission_tx', 'actions']
255 kwargs['keys'] = ['name', 'pedestal', 'reception_rx', 'transmission_tx', 'actions']
256 kwargs['title'] = 'Experiment'
256 kwargs['title'] = 'Experiment'
257 kwargs['suptitle'] = 'List'
257 kwargs['suptitle'] = 'List'
258 kwargs['no_sidebar'] = True
258 kwargs['no_sidebar'] = True
259 kwargs['form'] = form
259 kwargs['form'] = form
260 kwargs['add_url'] = reverse('url_add_experiment')
260 kwargs['add_url'] = reverse('url_add_experiment')
261 filters = request.GET.copy()
261 filters = request.GET.copy()
262 filters.pop('page', None)
262 filters.pop('page', None)
263 kwargs['q'] = urlencode(filters)
263 kwargs['q'] = urlencode(filters)
264 kwargs['menu_experiments'] = 'active'
264 kwargs['menu_experiments'] = 'active'
265
265
266 return render(request, 'base_list.html', kwargs)
266 return render(request, 'base_list.html', kwargs)
267
267
268
268
269 def experiment(request, id_exp):
269 def experiment(request, id_exp):
270
270
271 experiment = get_object_or_404(Experiment, pk=id_exp)
271 experiment = get_object_or_404(Experiment, pk=id_exp)
272 id_p = experiment.pedestal_id
272 id_p = experiment.pedestal_id
273 id_rx = experiment.reception_rx_id
273 id_rx = experiment.reception_rx_id
274 id_tx = experiment.transmission_tx_id
274 id_tx = experiment.transmission_tx_id
275 conf_pedestal = PedestalConfiguration.objects.get(id = id_p)
275 conf_pedestal = PedestalConfiguration.objects.get(id = id_p)
276 conf_rx = USRPRXConfiguration.objects.get(id = id_rx)
276 conf_rx = USRPRXConfiguration.objects.get(id = id_rx)
277 conf_tx = USRPTXConfiguration.objects.get(id = id_tx)
277 conf_tx = USRPTXConfiguration.objects.get(id = id_tx)
278
278
279 kwargs = {}
279 kwargs = {}
280 kwargs['experiment_keys'] = ['name', 'latitude', 'longitude', 'heading']
280 kwargs['experiment_keys'] = ['name', 'latitude', 'longitude', 'heading']
281 kwargs['experiment'] = experiment
281 kwargs['experiment'] = experiment
282 kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'speed', 'angle']
282
283 if conf_pedestal.mode == 'position':
284 kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'angle']
285 elif conf_pedestal.mode == 'speed':
286 kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'speed']
287 else:
288 kwargs['experiment_pedestal_keys'] = ['mode', 'axis', 'speed', 'angle', 'min_value', 'max_value']
283 kwargs['experiment_pedestal'] = conf_pedestal
289 kwargs['experiment_pedestal'] = conf_pedestal
284 kwargs['experiment_rx_keys'] = ['samplerate_rx', 'frequency_rx', 'datadir', 'clocksource', 'timesource', 'clockrate']
290
291 kwargs['experiment_rx_keys'] = ['ip_address_rx', 'daughterboard_rx', 'antenna_rx', 'samplerate_rx', 'frequency_rx', 'datadir', 'clocksource', 'timesource', 'clockrate']
285 kwargs['experiment_rx'] = conf_rx
292 kwargs['experiment_rx'] = conf_rx
286 kwargs['experiment_tx_keys'] = ['frequency', 'samplerate', 'ipp', 'delay', 'pulse_1', 'code_type_1', 'code_1', 'repetitions_1',
293
287 'enable_2', 'pulse_2', 'code_type_2', 'code_2', 'repetitions_2']
294 if not conf_tx.enable_2:
295 kwargs['experiment_tx_keys'] = ['ip_address', 'daughterboard', 'antenna', 'frequency', 'samplerate', 'ipp', 'delay', 'pulse_1', 'code_type_1', 'code_1', 'repetitions_1']
296 else:
297 kwargs['experiment_tx_keys'] = ['ip_address', 'daughterboard', 'antenna', 'frequency', 'samplerate', 'ipp', 'delay', 'pulse_1', 'code_type_1', 'code_1', 'repetitions_1',
298 'pulse_2', 'code_type_2', 'code_2', 'repetitions_2']
288 kwargs['experiment_tx'] = conf_tx
299 kwargs['experiment_tx'] = conf_tx
300
289 kwargs['title'] = 'Experiment'
301 kwargs['title'] = 'Experiment'
290 kwargs['suptitle'] = 'Details'
302 kwargs['suptitle'] = 'Details'
291 kwargs['button'] = 'Add Configuration'
303 kwargs['button'] = 'Add Configuration'
292 kwargs['menu_experiments'] = 'active'
304 kwargs['menu_experiments'] = 'active'
293
305
294 ###### SIDEBAR ######
306 ###### SIDEBAR ######
295 kwargs.update(sidebar(confs=[conf_pedestal, conf_rx, conf_tx]))
307 kwargs.update(sidebar(confs=[conf_pedestal, conf_rx, conf_tx]))
296
308
297 return render(request, 'experiment.html', kwargs)
309 return render(request, 'experiment.html', kwargs)
298
310
299
311
300 @login_required
312 @login_required
301 def experiment_new(request, id_camp=None):
313 def experiment_new(request, id_camp=None):
302
314
303 if not is_developer(request.user):
315 if not is_developer(request.user):
304 messages.error(
316 messages.error(
305 request, 'Developer required, to create new Experiments')
317 request, 'Developer required, to create new Experiments')
306 return redirect('index')
318 return redirect('index')
307 kwargs = {}
319 kwargs = {}
308
320
309 if request.method == 'GET':
321 if request.method == 'GET':
310 kwargs['button'] = 'Create'
322 kwargs['button'] = 'Create'
311 form = ExperimentForm()
323 form = ExperimentForm()
312
324
313 if request.method == 'POST':
325 if request.method == 'POST':
314 form = ExperimentForm(request.POST)
326 form = ExperimentForm(request.POST)
315 if form.is_valid():
327 if form.is_valid():
316 experiment = form.save(commit=False)
328 experiment = form.save(commit=False)
317 experiment.author = request.user
329 experiment.author = request.user
318 experiment.save()
330 experiment.save()
319 messages.success(request, 'Experiment configuration successfully created')
331 messages.success(request, 'Experiment configuration successfully created')
320 return redirect('url_experiment', id_exp=experiment.id)
332 return redirect('url_experiment', id_exp=experiment.id)
321
333
322 kwargs['form'] = form
334 kwargs['form'] = form
323 kwargs['title'] = 'Experiment'
335 kwargs['title'] = 'Experiment'
324 kwargs['suptitle'] = 'New'
336 kwargs['suptitle'] = 'New'
325 kwargs['menu_experiments'] = 'active'
337 kwargs['menu_experiments'] = 'active'
326
338
327 return render(request, 'experiment_edit.html', kwargs)
339 return render(request, 'experiment_edit.html', kwargs)
328
340
329
341
330 @login_required
342 @login_required
331 def experiment_edit(request, id_exp):
343 def experiment_edit(request, id_exp):
332
344
333 experiment = get_object_or_404(Experiment, pk=id_exp)
345 experiment = get_object_or_404(Experiment, pk=id_exp)
334 id_p = experiment.pedestal_id
346 id_p = experiment.pedestal_id
335 id_rx = experiment.reception_rx_id
347 id_rx = experiment.reception_rx_id
336 id_tx = experiment.transmission_tx_id
348 id_tx = experiment.transmission_tx_id
337 conf_pedestal = PedestalConfiguration.objects.get(id = id_p)
349 conf_pedestal = PedestalConfiguration.objects.get(id = id_p)
338 conf_rx = USRPRXConfiguration.objects.get(id = id_rx)
350 conf_rx = USRPRXConfiguration.objects.get(id = id_rx)
339 conf_tx = USRPTXConfiguration.objects.get(id = id_tx)
351 conf_tx = USRPTXConfiguration.objects.get(id = id_tx)
340
352
341 if request.method == 'GET':
353 if request.method == 'GET':
342 form = ExperimentEditionForm(instance=experiment)
354 form = ExperimentEditionForm(instance=experiment)
343 form_pedestal = PedestalEditionForm(instance=conf_pedestal)
355 form_pedestal = PedestalEditionForm(instance=conf_pedestal)
344 form_rx = USRPRXEditionForm(instance=conf_rx)
356 form_rx = USRPRXEditionForm(instance=conf_rx)
345 form_tx = USRPTXEditionForm(instance=conf_tx)
357 form_tx = USRPTXEditionForm(instance=conf_tx)
346
358
347 if request.method == 'POST':
359 if request.method == 'POST':
348 form = ExperimentEditionForm(request.POST, instance=experiment)
360 form = ExperimentEditionForm(request.POST, instance=experiment)
349 form_pedestal = PedestalEditionForm(request.POST, instance=conf_pedestal)
361 form_pedestal = PedestalEditionForm(request.POST, instance=conf_pedestal)
350 form_rx = USRPRXEditionForm(request.POST, instance=conf_rx)
362 form_rx = USRPRXEditionForm(request.POST, instance=conf_rx)
351 form_tx = USRPTXEditionForm(request.POST, instance=conf_tx)
363 form_tx = USRPTXEditionForm(request.POST, instance=conf_tx)
352
364
353 if form.is_valid() and form_pedestal.is_valid() and form_rx.is_valid() and form_tx.is_valid():
365 if form.is_valid() and form_pedestal.is_valid() and form_rx.is_valid() and form_tx.is_valid():
354 experiment = form.save(commit=False)
366 experiment = form.save(commit=False)
355 pedestal = form_pedestal.save(commit=False)
367 pedestal = form_pedestal.save(commit=False)
356 rx = form_rx.save(commit=False)
368 rx = form_rx.save(commit=False)
357 tx = form_tx.save(commit=False)
369 tx = form_tx.save(commit=False)
358
370
359 pedestal.save()
371 pedestal.save()
360 rx.save()
372 rx.save()
361 validation_usrp_tx_code(request, tx)
373 validation_usrp_tx_code(request, tx)
362 tx.save()
374 tx.save()
363 messages.success(request, 'Experiment configuration successfully updated')
375 messages.success(request, 'Experiment configuration successfully updated')
364 return redirect('url_experiment', id_exp=experiment.id)
376 return redirect('url_experiment', id_exp=experiment.id)
365
377
366 kwargs = {}
378 kwargs = {}
367 kwargs['form'] = form
379 kwargs['form'] = form
368 kwargs['form_pedestal'] = form_pedestal
380 kwargs['form_pedestal'] = form_pedestal
369 kwargs['form_rx'] = form_rx
381 kwargs['form_rx'] = form_rx
370 kwargs['form_tx'] = form_tx
382 kwargs['form_tx'] = form_tx
371 kwargs['title'] = 'Experiment'
383 kwargs['title'] = 'Experiment'
372 kwargs['suptitle'] = 'Edit'
384 kwargs['suptitle'] = 'Edit'
373 kwargs['button'] = 'Update'
385 kwargs['button'] = 'Update'
374 kwargs['menu_experiments'] = 'active'
386 kwargs['menu_experiments'] = 'active'
375
387
376 return render(request, 'experiment_edit.html', kwargs)
388 return render(request, 'experiment_edit.html', kwargs)
377
389
378
390
379 @login_required
391 @login_required
380 def experiment_delete(request, id_exp):
392 def experiment_delete(request, id_exp):
381
393
382 experiment = get_object_or_404(Experiment, pk=id_exp)
394 experiment = get_object_or_404(Experiment, pk=id_exp)
383
395
384 if request.method == 'POST':
396 if request.method == 'POST':
385 if is_developer(request.user):
397 if is_developer(request.user):
386 #for conf in Configuration.objects.filter(experiment=experiment):
398 #for conf in Configuration.objects.filter(experiment=experiment):
387 #conf.delete()
399 #conf.delete()
388 experiment.delete()
400 experiment.delete()
389 return redirect('url_experiments')
401 return redirect('url_experiments')
390
402
391 messages.error(request, 'Not enough permission to delete this object')
403 messages.error(request, 'Not enough permission to delete this object')
392 return redirect(experiment.get_absolute_url())
404 return redirect(experiment.get_absolute_url())
393
405
394 kwargs = {
406 kwargs = {
395 'title': 'Delete',
407 'title': 'Delete',
396 'suptitle': 'Experiment',
408 'suptitle': 'Experiment',
397 'object': experiment,
409 'object': experiment,
398 'delete': True
410 'delete': True
399 }
411 }
400
412
401 return render(request, 'confirm.html', kwargs)
413 return render(request, 'confirm.html', kwargs)
402
414
403
415
404 @login_required
416 @login_required
405 def experiment_export(request, id_exp):
417 def experiment_export(request, id_exp):
406
418
407 experiment = get_object_or_404(Experiment, pk=id_exp)
419 experiment = get_object_or_404(Experiment, pk=id_exp)
408 content = experiment.parms_to_dict()
420 content = experiment.parms_to_dict()
409 content_type = 'application/json'
421 content_type = 'application/json'
410 filename = '%s_%s.json' % (experiment.name, experiment.id)
422 filename = '%s_%s.json' % (experiment.name, experiment.id)
411
423
412 response = HttpResponse(content_type=content_type)
424 response = HttpResponse(content_type=content_type)
413 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
425 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
414 response.write(json.dumps(content, indent=2))
426 response.write(json.dumps(content, indent=2))
415
427
416 return response
428 return response
417
429
418
430
419 @login_required
431 @login_required
420 def experiment_import(request, id_exp):
432 def experiment_import(request, id_exp):
421
433
422 experiment = get_object_or_404(Experiment, pk=id_exp)
434 experiment = get_object_or_404(Experiment, pk=id_exp)
423 configurations = Configuration.objects.filter(experiment=experiment)
435 configurations = Configuration.objects.filter(experiment=experiment)
424
436
425 if request.method == 'GET':
437 if request.method == 'GET':
426 file_form = UploadFileForm()
438 file_form = UploadFileForm()
427
439
428 if request.method == 'POST':
440 if request.method == 'POST':
429 file_form = UploadFileForm(request.POST, request.FILES)
441 file_form = UploadFileForm(request.POST, request.FILES)
430
442
431 if file_form.is_valid():
443 if file_form.is_valid():
432 new_exp = experiment.dict_to_parms(
444 new_exp = experiment.dict_to_parms(
433 json.load(request.FILES['file']), CONF_MODELS)
445 json.load(request.FILES['file']), CONF_MODELS)
434 messages.success(
446 messages.success(
435 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
447 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
436 return redirect(new_exp.get_absolute_url_edit())
448 return redirect(new_exp.get_absolute_url_edit())
437
449
438 messages.error(request, "Could not import parameters from file")
450 messages.error(request, "Could not import parameters from file")
439
451
440 kwargs = {}
452 kwargs = {}
441 kwargs['title'] = 'Experiment'
453 kwargs['title'] = 'Experiment'
442 kwargs['form'] = file_form
454 kwargs['form'] = file_form
443 kwargs['suptitle'] = 'Importing file'
455 kwargs['suptitle'] = 'Importing file'
444 kwargs['button'] = 'Import'
456 kwargs['button'] = 'Import'
445 kwargs['menu_experiments'] = 'active'
457 kwargs['menu_experiments'] = 'active'
446
458
447 kwargs.update(sidebar(experiment=experiment))
459 kwargs.update(sidebar(experiment=experiment))
448
460
449 return render(request, 'experiment_import.html', kwargs)
461 return render(request, 'experiment_import.html', kwargs)
450
462
451
463
452 @login_required
464 @login_required
453 def experiment_start(request, id_exp):
465 def experiment_start(request, id_exp):
454
466
455 exp = get_object_or_404(Experiment, pk=id_exp)
467 exp = get_object_or_404(Experiment, pk=id_exp)
456 exp.status = 0
468 exp.status = 0
457 if exp.status == 2:
469 if exp.status == 2:
458 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
470 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
459 else:
471 else:
460 exp.status = exp.start()
472 exp.status = exp.start()
461 if exp.status == 0:
473 if exp.status == 0:
462 messages.error(request, 'Experiment {} not start'.format(exp))
474 messages.error(request, 'Experiment {} not start'.format(exp))
463 if exp.status == 2:
475 if exp.status == 2:
464 messages.success(request, 'Experiment {} started'.format(exp))
476 messages.success(request, 'Experiment {} started'.format(exp))
465
477
466 exp.save()
478 exp.save()
467
479
468 return redirect(exp.get_absolute_url())
480 return redirect(exp.get_absolute_url())
469
481
470
482
471 @login_required
483 @login_required
472 def experiment_stop(request, id_exp):
484 def experiment_stop(request, id_exp):
473
485
474 exp = get_object_or_404(Experiment, pk=id_exp)
486 exp = get_object_or_404(Experiment, pk=id_exp)
475
487
476 if exp.status == 2 or exp.status == 4:
488 if exp.status == 2 or exp.status == 4:
477 exp.status = exp.stop()
489 exp.status = exp.stop()
478 exp.save()
490 exp.save()
479 messages.success(request, 'Experiment {} stopped'.format(exp))
491 messages.success(request, 'Experiment {} stopped'.format(exp))
480 else:
492 else:
481 messages.error(request, 'Experiment {} not running'.format(exp))
493 messages.error(request, 'Experiment {} not running'.format(exp))
482
494
483 return redirect(exp.get_absolute_url())
495 return redirect(exp.get_absolute_url())
484
496
485
497
486 def experiment_status(request, id_exp):
498 def experiment_status(request, id_exp):
487
499
488 exp = get_object_or_404(Experiment, pk=id_exp)
500 exp = get_object_or_404(Experiment, pk=id_exp)
489
501
490 exp.get_status()
502 exp.get_status()
491
503
492 return redirect(exp.get_absolute_url())
504 return redirect(exp.get_absolute_url())
493
505
494
506
495 def experiment_summary(request, id_exp):
507 def experiment_summary(request, id_exp):
496
508
497 experiment = get_object_or_404(Experiment, pk=id_exp)
509 experiment = get_object_or_404(Experiment, pk=id_exp)
498 configurations = Configuration.objects.filter(
510 configurations = Configuration.objects.filter(
499 experiment=experiment, type=0)
511 experiment=experiment, type=0)
500
512
501 kwargs = {}
513 kwargs = {}
502 kwargs['experiment_keys'] = ['radar_system',
514 kwargs['experiment_keys'] = ['radar_system',
503 'name', 'freq', 'start_time', 'end_time']
515 'name', 'freq', 'start_time', 'end_time']
504 kwargs['experiment'] = experiment
516 kwargs['experiment'] = experiment
505 kwargs['configurations'] = []
517 kwargs['configurations'] = []
506 kwargs['title'] = 'Experiment Summary'
518 kwargs['title'] = 'Experiment Summary'
507 kwargs['suptitle'] = 'Details'
519 kwargs['suptitle'] = 'Details'
508 kwargs['button'] = 'Verify Parameters'
520 kwargs['button'] = 'Verify Parameters'
509
521
510 c_vel = 3.0*(10**8) # m/s
522 c_vel = 3.0*(10**8) # m/s
511 ope_freq = experiment.freq*(10**6) # 1/s
523 ope_freq = experiment.freq*(10**6) # 1/s
512 radar_lambda = c_vel/ope_freq # m
524 radar_lambda = c_vel/ope_freq # m
513 kwargs['radar_lambda'] = radar_lambda
525 kwargs['radar_lambda'] = radar_lambda
514
526
515 ipp = None
527 ipp = None
516 nsa = 1
528 nsa = 1
517 code_id = 0
529 code_id = 0
518 tx_line = {}
530 tx_line = {}
519
531
520 for configuration in configurations.filter(device__device_type__name = 'pedestal'):
532 for configuration in configurations.filter(device__device_type__name = 'pedestal'):
521
533
522 if configuration.mix:
534 if configuration.mix:
523 continue
535 continue
524 conf = {'conf': configuration}
536 conf = {'conf': configuration}
525 conf['keys'] = []
537 conf['keys'] = []
526 conf['NTxs'] = configuration.ntx
538 conf['NTxs'] = configuration.ntx
527 conf['keys'].append('NTxs')
539 conf['keys'].append('NTxs')
528 ipp = configuration.ipp
540 ipp = configuration.ipp
529 conf['IPP'] = ipp
541 conf['IPP'] = ipp
530 conf['keys'].append('IPP')
542 conf['keys'].append('IPP')
531 lines = configuration.get_lines(line_type__name='tx')
543 lines = configuration.get_lines(line_type__name='tx')
532
544
533 for tx_line in lines:
545 for tx_line in lines:
534 tx_params = json.loads(tx_line.params)
546 tx_params = json.loads(tx_line.params)
535 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
547 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
536 conf['keys'].append(tx_line.get_name())
548 conf['keys'].append(tx_line.get_name())
537 delays = tx_params['delays']
549 delays = tx_params['delays']
538 if delays not in ('', '0'):
550 if delays not in ('', '0'):
539 n = len(delays.split(','))
551 n = len(delays.split(','))
540 taus = '{} Taus: {}'.format(n, delays)
552 taus = '{} Taus: {}'.format(n, delays)
541 else:
553 else:
542 taus = '-'
554 taus = '-'
543 conf['Taus ({})'.format(tx_line.get_name())] = taus
555 conf['Taus ({})'.format(tx_line.get_name())] = taus
544 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
556 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
545 for code_line in configuration.get_lines(line_type__name='codes'):
557 for code_line in configuration.get_lines(line_type__name='codes'):
546 code_params = json.loads(code_line.params)
558 code_params = json.loads(code_line.params)
547 code_id = code_params['code']
559 code_id = code_params['code']
548 if tx_line.pk == int(code_params['TX_ref']):
560 if tx_line.pk == int(code_params['TX_ref']):
549 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
561 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
550 '-'.join(code_params['codes']))
562 '-'.join(code_params['codes']))
551 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
563 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
552
564
553 for windows_line in configuration.get_lines(line_type__name='windows'):
565 for windows_line in configuration.get_lines(line_type__name='windows'):
554 win_params = json.loads(windows_line.params)
566 win_params = json.loads(windows_line.params)
555 if tx_line.pk == int(win_params['TX_ref']):
567 if tx_line.pk == int(win_params['TX_ref']):
556 windows = ''
568 windows = ''
557 nsa = win_params['params'][0]['number_of_samples']
569 nsa = win_params['params'][0]['number_of_samples']
558 for i, params in enumerate(win_params['params']):
570 for i, params in enumerate(win_params['params']):
559 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
571 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
560 i, **params)
572 i, **params)
561 conf['Window'] = mark_safe(windows)
573 conf['Window'] = mark_safe(windows)
562 conf['keys'].append('Window')
574 conf['keys'].append('Window')
563
575
564 kwargs['configurations'].append(conf)
576 kwargs['configurations'].append(conf)
565
577
566 for configuration in configurations.filter(device__device_type__name = 'jars'):
578 for configuration in configurations.filter(device__device_type__name = 'jars'):
567
579
568 conf = {'conf': configuration}
580 conf = {'conf': configuration}
569 conf['keys'] = []
581 conf['keys'] = []
570 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
582 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
571 conf['keys'].append('Type of Data')
583 conf['keys'].append('Type of Data')
572 channels_number = configuration.channels_number
584 channels_number = configuration.channels_number
573 exp_type = configuration.exp_type
585 exp_type = configuration.exp_type
574 fftpoints = configuration.fftpoints
586 fftpoints = configuration.fftpoints
575 filter_parms = json.loads(configuration.filter_parms)
587 filter_parms = json.loads(configuration.filter_parms)
576 spectral_number = configuration.spectral_number
588 spectral_number = configuration.spectral_number
577 acq_profiles = configuration.acq_profiles
589 acq_profiles = configuration.acq_profiles
578 cohe_integr = configuration.cohe_integr
590 cohe_integr = configuration.cohe_integr
579 profiles_block = configuration.profiles_block
591 profiles_block = configuration.profiles_block
580
592
581 conf['Num of Profiles'] = acq_profiles
593 conf['Num of Profiles'] = acq_profiles
582 conf['keys'].append('Num of Profiles')
594 conf['keys'].append('Num of Profiles')
583
595
584 conf['Prof per Block'] = profiles_block
596 conf['Prof per Block'] = profiles_block
585 conf['keys'].append('Prof per Block')
597 conf['keys'].append('Prof per Block')
586
598
587 conf['Blocks per File'] = configuration.raw_data_blocks
599 conf['Blocks per File'] = configuration.raw_data_blocks
588 conf['keys'].append('Blocks per File')
600 conf['keys'].append('Blocks per File')
589
601
590 if exp_type == 0: # Short
602 if exp_type == 0: # Short
591 bytes_ = 2
603 bytes_ = 2
592 b = nsa*2*bytes_*channels_number
604 b = nsa*2*bytes_*channels_number
593 else: # Float
605 else: # Float
594 bytes_ = 4
606 bytes_ = 4
595 channels = channels_number + spectral_number
607 channels = channels_number + spectral_number
596 b = nsa*2*bytes_*fftpoints*channels
608 b = nsa*2*bytes_*fftpoints*channels
597
609
598 codes_num = 7
610 codes_num = 7
599 if code_id == 2:
611 if code_id == 2:
600 codes_num = 7
612 codes_num = 7
601 elif code_id == 12:
613 elif code_id == 12:
602 codes_num = 15
614 codes_num = 15
603
615
604 #Jars filter values:
616 #Jars filter values:
605
617
606 clock = float(filter_parms['clock'])
618 clock = float(filter_parms['clock'])
607 filter_2 = int(filter_parms['cic_2'])
619 filter_2 = int(filter_parms['cic_2'])
608 filter_5 = int(filter_parms['cic_5'])
620 filter_5 = int(filter_parms['cic_5'])
609 filter_fir = int(filter_parms['fir'])
621 filter_fir = int(filter_parms['fir'])
610 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
622 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
611
623
612 #Jars values:
624 #Jars values:
613 if ipp is not None:
625 if ipp is not None:
614 IPP_units = ipp/0.15*Fs_MHz
626 IPP_units = ipp/0.15*Fs_MHz
615 IPP_us = IPP_units / Fs_MHz
627 IPP_us = IPP_units / Fs_MHz
616 IPP_s = IPP_units / (Fs_MHz * (10**6))
628 IPP_s = IPP_units / (Fs_MHz * (10**6))
617 Ts = 1/(Fs_MHz*(10**6))
629 Ts = 1/(Fs_MHz*(10**6))
618
630
619 Va = radar_lambda/(4*Ts*cohe_integr)
631 Va = radar_lambda/(4*Ts*cohe_integr)
620 rate_bh = ((nsa-codes_num)*channels_number*2 *
632 rate_bh = ((nsa-codes_num)*channels_number*2 *
621 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
633 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
622 rate_gh = rate_bh/(1024*1024*1024)
634 rate_gh = rate_bh/(1024*1024*1024)
623
635
624 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
636 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
625 conf['keys'].append('Time per Block')
637 conf['keys'].append('Time per Block')
626 conf['Acq time'] = IPP_s * acq_profiles
638 conf['Acq time'] = IPP_s * acq_profiles
627 conf['keys'].append('Acq time')
639 conf['keys'].append('Acq time')
628 conf['Data rate'] = str(rate_gh)+" (GB/h)"
640 conf['Data rate'] = str(rate_gh)+" (GB/h)"
629 conf['keys'].append('Data rate')
641 conf['keys'].append('Data rate')
630 conf['Va (m/s)'] = Va
642 conf['Va (m/s)'] = Va
631 conf['keys'].append('Va (m/s)')
643 conf['keys'].append('Va (m/s)')
632 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
644 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
633 conf['keys'].append('Vrange (m/s)')
645 conf['keys'].append('Vrange (m/s)')
634
646
635 kwargs['configurations'].append(conf)
647 kwargs['configurations'].append(conf)
636 kwargs['menu_experiments'] = 'active'
648 kwargs['menu_experiments'] = 'active'
637
649
638 ###### SIDEBAR ######
650 ###### SIDEBAR ######
639 kwargs.update(sidebar(experiment=experiment))
651 kwargs.update(sidebar(experiment=experiment))
640
652
641 return render(request, 'experiment_summary.html', kwargs)
653 return render(request, 'experiment_summary.html', kwargs)
642
654
643
655
644 @login_required
656 @login_required
645 def experiment_verify(request, id_exp):
657 def experiment_verify(request, id_exp):
646
658
647 experiment = get_object_or_404(Experiment, pk=id_exp)
659 experiment = get_object_or_404(Experiment, pk=id_exp)
648 experiment_data = experiment.parms_to_dict()
660 experiment_data = experiment.parms_to_dict()
649 configurations = Configuration.objects.filter(
661 configurations = Configuration.objects.filter(
650 experiment=experiment, type=0)
662 experiment=experiment, type=0)
651
663
652 kwargs = {}
664 kwargs = {}
653
665
654 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
666 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
655 kwargs['experiment'] = experiment
667 kwargs['experiment'] = experiment
656
668
657 kwargs['configuration_keys'] = ['name', 'device__ip_address',
669 kwargs['configuration_keys'] = ['name', 'device__ip_address',
658 'device__port_address', 'device__status']
670 'device__port_address', 'device__status']
659 kwargs['configurations'] = configurations
671 kwargs['configurations'] = configurations
660 kwargs['experiment_data'] = experiment_data
672 kwargs['experiment_data'] = experiment_data
661
673
662 kwargs['title'] = 'Verify Experiment'
674 kwargs['title'] = 'Verify Experiment'
663 kwargs['suptitle'] = 'Parameters'
675 kwargs['suptitle'] = 'Parameters'
664
676
665 kwargs['button'] = 'Update'
677 kwargs['button'] = 'Update'
666
678
667 jars_conf = False
679 jars_conf = False
668 rc_conf = False
680 rc_conf = False
669 dds_conf = False
681 dds_conf = False
670
682
671 for configuration in configurations:
683 for configuration in configurations:
672 #-------------------- JARS -----------------------:
684 #-------------------- JARS -----------------------:
673 if configuration.device.device_type.name == 'jars':
685 if configuration.device.device_type.name == 'jars':
674 jars_conf = True
686 jars_conf = True
675 jars = configuration
687 jars = configuration
676 kwargs['jars_conf'] = jars_conf
688 kwargs['jars_conf'] = jars_conf
677 filter_parms = json.loads(jars.filter_parms)
689 filter_parms = json.loads(jars.filter_parms)
678 kwargs['filter_parms'] = filter_parms
690 kwargs['filter_parms'] = filter_parms
679 #--Sampling Frequency
691 #--Sampling Frequency
680 clock = filter_parms['clock']
692 clock = filter_parms['clock']
681 filter_2 = filter_parms['cic_2']
693 filter_2 = filter_parms['cic_2']
682 filter_5 = filter_parms['cic_5']
694 filter_5 = filter_parms['cic_5']
683 filter_fir = filter_parms['fir']
695 filter_fir = filter_parms['fir']
684 samp_freq_jars = clock/filter_2/filter_5/filter_fir
696 samp_freq_jars = clock/filter_2/filter_5/filter_fir
685
697
686 kwargs['samp_freq_jars'] = samp_freq_jars
698 kwargs['samp_freq_jars'] = samp_freq_jars
687 kwargs['jars'] = configuration
699 kwargs['jars'] = configuration
688
700
689 #--------------------- RC ----------------------:
701 #--------------------- RC ----------------------:
690 if configuration.device.device_type.name == 'pedestal' and not configuration.mix:
702 if configuration.device.device_type.name == 'pedestal' and not configuration.mix:
691 rc_conf = True
703 rc_conf = True
692 rc = configuration
704 rc = configuration
693
705
694 rc_parms = configuration.parms_to_dict()
706 rc_parms = configuration.parms_to_dict()
695
707
696 win_lines = rc.get_lines(line_type__name='windows')
708 win_lines = rc.get_lines(line_type__name='windows')
697 if win_lines:
709 if win_lines:
698 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
710 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
699 #--Sampling Frequency
711 #--Sampling Frequency
700 samp_freq_rc = 0.15/dh
712 samp_freq_rc = 0.15/dh
701 kwargs['samp_freq_rc'] = samp_freq_rc
713 kwargs['samp_freq_rc'] = samp_freq_rc
702
714
703 kwargs['rc_conf'] = rc_conf
715 kwargs['rc_conf'] = rc_conf
704 kwargs['rc'] = configuration
716 kwargs['rc'] = configuration
705
717
706 #-------------------- DDS ----------------------:
718 #-------------------- DDS ----------------------:
707 if configuration.device.device_type.name == 'dds':
719 if configuration.device.device_type.name == 'dds':
708 dds_conf = True
720 dds_conf = True
709 dds = configuration
721 dds = configuration
710 dds_parms = configuration.parms_to_dict()
722 dds_parms = configuration.parms_to_dict()
711
723
712 kwargs['dds_conf'] = dds_conf
724 kwargs['dds_conf'] = dds_conf
713 kwargs['dds'] = configuration
725 kwargs['dds'] = configuration
714
726
715 #------------Validation------------:
727 #------------Validation------------:
716 #Clock
728 #Clock
717 if dds_conf and rc_conf and jars_conf:
729 if dds_conf and rc_conf and jars_conf:
718 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
730 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
719 messages.warning(request, "Devices don't have the same clock.")
731 messages.warning(request, "Devices don't have the same clock.")
720 elif rc_conf and jars_conf:
732 elif rc_conf and jars_conf:
721 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
733 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
722 messages.warning(request, "Devices don't have the same clock.")
734 messages.warning(request, "Devices don't have the same clock.")
723 elif rc_conf and dds_conf:
735 elif rc_conf and dds_conf:
724 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
736 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
725 messages.warning(request, "Devices don't have the same clock.")
737 messages.warning(request, "Devices don't have the same clock.")
726 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
738 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
727 messages.warning(
739 messages.warning(
728 request, "Devices don't have the same Frequency A.")
740 request, "Devices don't have the same Frequency A.")
729
741
730 #------------POST METHOD------------:
742 #------------POST METHOD------------:
731 if request.method == 'POST':
743 if request.method == 'POST':
732 if request.POST['suggest_clock']:
744 if request.POST['suggest_clock']:
733 try:
745 try:
734 suggest_clock = float(request.POST['suggest_clock'])
746 suggest_clock = float(request.POST['suggest_clock'])
735 except:
747 except:
736 messages.warning(request, "Invalid value in CLOCK IN.")
748 messages.warning(request, "Invalid value in CLOCK IN.")
737 return redirect('url_verify_experiment', id_exp=experiment.id)
749 return redirect('url_verify_experiment', id_exp=experiment.id)
738 else:
750 else:
739 suggest_clock = ""
751 suggest_clock = ""
740 if suggest_clock:
752 if suggest_clock:
741 if rc_conf:
753 if rc_conf:
742 rc.clock_in = suggest_clock
754 rc.clock_in = suggest_clock
743 rc.save()
755 rc.save()
744 if jars_conf:
756 if jars_conf:
745 filter_parms = jars.filter_parms
757 filter_parms = jars.filter_parms
746 filter_parms = ast.literal_eval(filter_parms)
758 filter_parms = ast.literal_eval(filter_parms)
747 filter_parms['clock'] = suggest_clock
759 filter_parms['clock'] = suggest_clock
748 jars.filter_parms = json.dumps(filter_parms)
760 jars.filter_parms = json.dumps(filter_parms)
749 jars.save()
761 jars.save()
750 kwargs['filter_parms'] = filter_parms
762 kwargs['filter_parms'] = filter_parms
751 if dds_conf:
763 if dds_conf:
752 dds.clock = suggest_clock
764 dds.clock = suggest_clock
753 dds.save()
765 dds.save()
754
766
755 if request.POST['suggest_frequencyA']:
767 if request.POST['suggest_frequencyA']:
756 try:
768 try:
757 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
769 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
758 except:
770 except:
759 messages.warning(request, "Invalid value in FREQUENCY A.")
771 messages.warning(request, "Invalid value in FREQUENCY A.")
760 return redirect('url_verify_experiment', id_exp=experiment.id)
772 return redirect('url_verify_experiment', id_exp=experiment.id)
761 else:
773 else:
762 suggest_frequencyA = ""
774 suggest_frequencyA = ""
763 if suggest_frequencyA:
775 if suggest_frequencyA:
764 if jars_conf:
776 if jars_conf:
765 filter_parms = jars.filter_parms
777 filter_parms = jars.filter_parms
766 filter_parms = ast.literal_eval(filter_parms)
778 filter_parms = ast.literal_eval(filter_parms)
767 filter_parms['fch'] = suggest_frequencyA
779 filter_parms['fch'] = suggest_frequencyA
768 jars.filter_parms = json.dumps(filter_parms)
780 jars.filter_parms = json.dumps(filter_parms)
769 jars.save()
781 jars.save()
770 kwargs['filter_parms'] = filter_parms
782 kwargs['filter_parms'] = filter_parms
771 if dds_conf:
783 if dds_conf:
772 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
784 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
773 dds.save()
785 dds.save()
774
786
775 kwargs['menu_experiments'] = 'active'
787 kwargs['menu_experiments'] = 'active'
776 kwargs.update(sidebar(experiment=experiment))
788 kwargs.update(sidebar(experiment=experiment))
777 return render(request, 'experiment_verify.html', kwargs)
789 return render(request, 'experiment_verify.html', kwargs)
778
790
779
791
780 def dev_confs(request):
792 def dev_confs(request):
781
793
782 page = request.GET.get('page')
794 page = request.GET.get('page')
783 order = ('-programmed_date', )
795 order = ('-programmed_date', )
784 filters = request.GET.copy()
796 filters = request.GET.copy()
785 if 'my configurations' in filters:
797 if 'my configurations' in filters:
786 filters.pop('my configurations', None)
798 filters.pop('my configurations', None)
787 filters['mine'] = request.user.id
799 filters['mine'] = request.user.id
788 kwargs = get_paginator(Configuration, page, order, filters)
800 kwargs = get_paginator(Configuration, page, order, filters)
789 fields = ['tags', 'historical']
801 fields = ['tags', 'historical']
790 if request.user.is_authenticated:
802 if request.user.is_authenticated:
791 fields.append('my configurations')
803 fields.append('my configurations')
792 form = FilterForm(initial=request.GET, extra_fields=fields)
804 form = FilterForm(initial=request.GET, extra_fields=fields)
793 kwargs['keys'] = ['name', 'device',
805 kwargs['keys'] = ['name', 'device',
794 'type', 'programmed_date', 'actions']
806 'type', 'programmed_date', 'actions']
795 kwargs['title'] = 'Configuration'
807 kwargs['title'] = 'Configuration'
796 kwargs['suptitle'] = 'List'
808 kwargs['suptitle'] = 'List'
797 kwargs['no_sidebar'] = True
809 kwargs['no_sidebar'] = True
798 kwargs['form'] = form
810 kwargs['form'] = form
799 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
811 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
800 filters = request.GET.copy()
812 filters = request.GET.copy()
801 filters.pop('page', None)
813 filters.pop('page', None)
802 kwargs['q'] = urlencode(filters)
814 kwargs['q'] = urlencode(filters)
803 kwargs['menu_configurations'] = 'active'
815 kwargs['menu_configurations'] = 'active'
804
816
805 return render(request, 'base_list.html', kwargs)
817 return render(request, 'base_list.html', kwargs)
806
818
807
819
808 def dev_conf(request, id_conf):
820 def dev_conf(request, id_conf):
809
821
810 conf = get_object_or_404(Configuration, pk=id_conf)
822 conf = get_object_or_404(Configuration, pk=id_conf)
811
823
812 return redirect(conf.get_absolute_url())
824 return redirect(conf.get_absolute_url())
813
825
814
826
815 @login_required
827 @login_required
816 def dev_conf_new(request, id_exp=0, id_dev=0):
828 def dev_conf_new(request, id_exp=0, id_dev=0):
817
829
818 if not is_developer(request.user):
830 if not is_developer(request.user):
819 messages.error(
831 messages.error(
820 request, 'Developer required, to create new configurations')
832 request, 'Developer required, to create new configurations')
821 return redirect('index')
833 return redirect('index')
822
834
823 initial = {}
835 initial = {}
824 kwargs = {}
836 kwargs = {}
825
837
826 if id_exp != 0:
838 if id_exp != 0:
827 initial['experiment'] = id_exp
839 initial['experiment'] = id_exp
828
840
829 if id_dev != 0:
841 if id_dev != 0:
830 initial['device'] = id_dev
842 initial['device'] = id_dev
831
843
832 if request.method == 'GET':
844 if request.method == 'GET':
833
845
834 if id_dev:
846 if id_dev:
835 kwargs['button'] = 'Create'
847 kwargs['button'] = 'Create'
836 device = Device.objects.get(pk=id_dev)
848 device = Device.objects.get(pk=id_dev)
837 DevConfForm = CONF_FORMS[device.device_type.name]
849 DevConfForm = CONF_FORMS[device.device_type.name]
838 initial['name'] = request.GET['name']
850 initial['name'] = request.GET['name']
839 form = DevConfForm(initial=initial)
851 form = DevConfForm(initial=initial)
840 else:
852 else:
841 kwargs['button'] = 'Create'
853 kwargs['button'] = 'Create'
842 form = ConfigurationForm(initial=initial)
854 form = ConfigurationForm(initial=initial)
843
855
844 if request.method == 'POST':
856 if request.method == 'POST':
845
857
846 device = Device.objects.get(pk=request.POST['device'])
858 device = Device.objects.get(pk=request.POST['device'])
847 DevConfForm = CONF_FORMS[device.device_type.name]
859 DevConfForm = CONF_FORMS[device.device_type.name]
848
860
849 form = DevConfForm(request.POST)
861 form = DevConfForm(request.POST)
850 kwargs['button'] = 'Create'
862 kwargs['button'] = 'Create'
851 if form.is_valid():
863 if form.is_valid():
852 conf = form.save(commit=False)
864 conf = form.save(commit=False)
853
865
854 if device.device_type.name == 'usrp_tx':
866 if device.device_type.name == 'usrp_tx':
855 validation_usrp_tx_code(request, conf)
867 validation_usrp_tx_code(request, conf)
856
868
857 conf.save()
869 conf.save()
858 conf.author = request.user
870 conf.author = request.user
859
871
860 messages.success(request, device.device_type.name + ' configuration successfully created')
872 messages.success(request, device.device_type.name + ' configuration successfully created')
861 return redirect('url_dev_conf', id_conf=conf.pk)
873 return redirect('url_dev_conf', id_conf=conf.pk)
862
874
863 kwargs['id_exp'] = id_exp
875 kwargs['id_exp'] = id_exp
864 kwargs['form'] = form
876 kwargs['form'] = form
865 kwargs['title'] = 'Configuration'
877 kwargs['title'] = 'Configuration'
866 kwargs['suptitle'] = 'New'
878 kwargs['suptitle'] = 'New'
867 kwargs['menu_configurations'] = 'active'
879 kwargs['menu_configurations'] = 'active'
868
880
869 if id_dev != 0:
881 if id_dev != 0:
870 device = Device.objects.get(pk=id_dev)
882 device = Device.objects.get(pk=id_dev)
871 kwargs['device'] = device.device_type.name
883 kwargs['device'] = device.device_type.name
872 return render(request, 'dev_conf_edit.html', kwargs)
884 return render(request, 'dev_conf_edit.html', kwargs)
873
885
874
886
875 @login_required
887 @login_required
876 def dev_conf_edit(request, id_conf):
888 def dev_conf_edit(request, id_conf):
877
889
878 conf = get_object_or_404(Configuration, pk=id_conf)
890 conf = get_object_or_404(Configuration, pk=id_conf)
879
891
880 DevConfForm = CONF_FORMS[conf.device.device_type.name]
892 DevConfForm = CONF_FORMS[conf.device.device_type.name]
881
893
882 if request.method == 'GET':
894 if request.method == 'GET':
883 form = DevConfForm(instance=conf)
895 form = DevConfForm(instance=conf)
884
896
885 if request.method == 'POST':
897 if request.method == 'POST':
886 form = DevConfForm(request.POST, instance=conf)
898 form = DevConfForm(request.POST, instance=conf)
887
899
888 if form.is_valid():
900 if form.is_valid():
889 form.save()
901 form.save()
890 return redirect('url_dev_conf', id_conf=id_conf)
902 return redirect('url_dev_conf', id_conf=id_conf)
891
903
892 kwargs = {}
904 kwargs = {}
893 kwargs['form'] = form
905 kwargs['form'] = form
894 kwargs['title'] = 'Device Configuration'
906 kwargs['title'] = 'Device Configuration'
895 kwargs['suptitle'] = 'Edit'
907 kwargs['suptitle'] = 'Edit'
896 kwargs['button'] = 'Update'
908 kwargs['button'] = 'Update'
897 kwargs['menu_configurations'] = 'active'
909 kwargs['menu_configurations'] = 'active'
898
910
899 ###### SIDEBAR ######
911 ###### SIDEBAR ######
900 kwargs.update(sidebar(conf=conf))
912 kwargs.update(sidebar(conf=conf))
901
913
902 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
914 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
903
915
904
916
905 @login_required
917 @login_required
906 def dev_conf_start(request, id_conf):
918 def dev_conf_start(request, id_conf):
907
919
908 conf = get_object_or_404(Configuration, pk=id_conf)
920 conf = get_object_or_404(Configuration, pk=id_conf)
909
921
910 if conf.start_device():
922 if conf.start_device():
911 messages.success(request, conf.message)
923 messages.success(request, conf.message)
912 else:
924 else:
913 messages.error(request, conf.message)
925 messages.error(request, conf.message)
914
926
915 #conf.status_device()
927 #conf.status_device()
916
928
917 return redirect(conf.get_absolute_url())
929 return redirect(conf.get_absolute_url())
918
930
919
931
920 @login_required
932 @login_required
921 def dev_conf_stop(request, id_conf):
933 def dev_conf_stop(request, id_conf):
922
934
923 conf = get_object_or_404(Configuration, pk=id_conf)
935 conf = get_object_or_404(Configuration, pk=id_conf)
924
936
925 if conf.stop_device():
937 if conf.stop_device():
926 messages.success(request, conf.message)
938 messages.success(request, conf.message)
927 else:
939 else:
928 messages.error(request, conf.message)
940 messages.error(request, conf.message)
929
941
930 #conf.status_device()
942 #conf.status_device()
931
943
932 return redirect(conf.get_absolute_url())
944 return redirect(conf.get_absolute_url())
933
945
934
946
935 @login_required
947 @login_required
936 def dev_conf_status(request, id_conf):
948 def dev_conf_status(request, id_conf):
937
949
938 conf = get_object_or_404(Configuration, pk=id_conf)
950 conf = get_object_or_404(Configuration, pk=id_conf)
939
951
940 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
952 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
941 if conf_active!=conf:
953 if conf_active!=conf:
942 url = '#' if conf_active is None else conf_active.get_absolute_url()
954 url = '#' if conf_active is None else conf_active.get_absolute_url()
943 label = 'None' if conf_active is None else conf_active.label
955 label = 'None' if conf_active is None else conf_active.label
944 messages.warning(
956 messages.warning(
945 request,
957 request,
946 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
958 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
947 url,
959 url,
948 label
960 label
949 ))
961 ))
950 )
962 )
951
963
952 return redirect(conf.get_absolute_url())
964 return redirect(conf.get_absolute_url())
953
965
954 if conf.status_device():
966 if conf.status_device():
955 messages.success(request, conf.message)
967 messages.success(request, conf.message)
956 else:
968 else:
957 messages.error(request, conf.message)
969 messages.error(request, conf.message)
958
970
959 return redirect(conf.get_absolute_url())
971 return redirect(conf.get_absolute_url())
960
972
961
973
962 @login_required
974 @login_required
963 def dev_conf_reset(request, id_conf):
975 def dev_conf_reset(request, id_conf):
964
976
965 conf = get_object_or_404(Configuration, pk=id_conf)
977 conf = get_object_or_404(Configuration, pk=id_conf)
966
978
967 if conf.reset_device():
979 if conf.reset_device():
968 messages.success(request, conf.message)
980 messages.success(request, conf.message)
969 else:
981 else:
970 messages.error(request, conf.message)
982 messages.error(request, conf.message)
971
983
972 return redirect(conf.get_absolute_url())
984 return redirect(conf.get_absolute_url())
973
985
974
986
975 @login_required
987 @login_required
976 def dev_conf_write(request, id_conf):
988 def dev_conf_write(request, id_conf):
977
989
978 conf = get_object_or_404(Configuration, pk=id_conf)
990 conf = get_object_or_404(Configuration, pk=id_conf)
979
991
980 if request.method == 'POST':
992 if request.method == 'POST':
981 if conf.write_device():
993 if conf.write_device():
982 conf.device.conf_active = conf.pk
994 conf.device.conf_active = conf.pk
983 conf.device.save()
995 conf.device.save()
984 messages.success(request, conf.message)
996 messages.success(request, conf.message)
985 if has_been_modified(conf):
997 if has_been_modified(conf):
986 conf.clone(type=1)
998 conf.clone(type=1)
987 else:
999 else:
988 messages.error(request, conf.message)
1000 messages.error(request, conf.message)
989
1001
990 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1002 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
991
1003
992 kwargs = {
1004 kwargs = {
993 'title': 'Write Configuration',
1005 'title': 'Write Configuration',
994 'suptitle': conf.label,
1006 'suptitle': conf.label,
995 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1007 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
996 'delete': False
1008 'delete': False
997 }
1009 }
998 kwargs['menu_configurations'] = 'active'
1010 kwargs['menu_configurations'] = 'active'
999
1011
1000 return render(request, 'confirm.html', kwargs)
1012 return render(request, 'confirm.html', kwargs)
1001
1013
1002
1014
1003 @login_required
1015 @login_required
1004 def dev_conf_read(request, id_conf):
1016 def dev_conf_read(request, id_conf):
1005
1017
1006 conf = get_object_or_404(Configuration, pk=id_conf)
1018 conf = get_object_or_404(Configuration, pk=id_conf)
1007
1019
1008 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1020 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1009
1021
1010 if request.method == 'GET':
1022 if request.method == 'GET':
1011 parms = conf.read_device()
1023 parms = conf.read_device()
1012 #conf.status_device()
1024 #conf.status_device()
1013
1025
1014 if not parms:
1026 if not parms:
1015 messages.error(request, conf.message)
1027 messages.error(request, conf.message)
1016 return redirect(conf.get_absolute_url())
1028 return redirect(conf.get_absolute_url())
1017
1029
1018 form = DevConfForm(initial=parms, instance=conf)
1030 form = DevConfForm(initial=parms, instance=conf)
1019
1031
1020 if request.method == 'POST':
1032 if request.method == 'POST':
1021 form = DevConfForm(request.POST, instance=conf)
1033 form = DevConfForm(request.POST, instance=conf)
1022
1034
1023 if form.is_valid():
1035 if form.is_valid():
1024 form.save()
1036 form.save()
1025 return redirect(conf.get_absolute_url())
1037 return redirect(conf.get_absolute_url())
1026
1038
1027 messages.error(request, "Parameters could not be saved")
1039 messages.error(request, "Parameters could not be saved")
1028
1040
1029 kwargs = {}
1041 kwargs = {}
1030 kwargs['id_dev'] = conf.id
1042 kwargs['id_dev'] = conf.id
1031 kwargs['form'] = form
1043 kwargs['form'] = form
1032 kwargs['title'] = 'Device Configuration'
1044 kwargs['title'] = 'Device Configuration'
1033 kwargs['suptitle'] = 'Parameters read from device'
1045 kwargs['suptitle'] = 'Parameters read from device'
1034 kwargs['button'] = 'Save'
1046 kwargs['button'] = 'Save'
1035
1047
1036 ###### SIDEBAR ######
1048 ###### SIDEBAR ######
1037 kwargs.update(sidebar(conf=conf))
1049 kwargs.update(sidebar(conf=conf))
1038
1050
1039 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1051 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1040
1052
1041
1053
1042 @login_required
1054 @login_required
1043 def dev_conf_import(request, id_conf):
1055 def dev_conf_import(request, id_conf):
1044
1056
1045 conf = get_object_or_404(Configuration, pk=id_conf)
1057 conf = get_object_or_404(Configuration, pk=id_conf)
1046 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1058 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1047
1059
1048 if request.method == 'GET':
1060 if request.method == 'GET':
1049 file_form = UploadFileForm()
1061 file_form = UploadFileForm()
1050
1062
1051 if request.method == 'POST':
1063 if request.method == 'POST':
1052 file_form = UploadFileForm(request.POST, request.FILES)
1064 file_form = UploadFileForm(request.POST, request.FILES)
1053
1065
1054 if file_form.is_valid():
1066 if file_form.is_valid():
1055
1067
1056 data = conf.import_from_file(request.FILES['file'])
1068 data = conf.import_from_file(request.FILES['file'])
1057 parms = Params(data=data).get_conf(
1069 parms = Params(data=data).get_conf(
1058 dtype=conf.device.device_type.name)
1070 dtype=conf.device.device_type.name)
1059
1071
1060 if parms:
1072 if parms:
1061
1073
1062 form = DevConfForm(initial=parms, instance=conf)
1074 form = DevConfForm(initial=parms, instance=conf)
1063
1075
1064 kwargs = {}
1076 kwargs = {}
1065 kwargs['id_dev'] = conf.id
1077 kwargs['id_dev'] = conf.id
1066 kwargs['form'] = form
1078 kwargs['form'] = form
1067 kwargs['title'] = 'Device Configuration'
1079 kwargs['title'] = 'Device Configuration'
1068 kwargs['suptitle'] = 'Parameters imported'
1080 kwargs['suptitle'] = 'Parameters imported'
1069 kwargs['button'] = 'Save'
1081 kwargs['button'] = 'Save'
1070 kwargs['action'] = conf.get_absolute_url_edit()
1082 kwargs['action'] = conf.get_absolute_url_edit()
1071 kwargs['previous'] = conf.get_absolute_url()
1083 kwargs['previous'] = conf.get_absolute_url()
1072
1084
1073 ###### SIDEBAR ######
1085 ###### SIDEBAR ######
1074 kwargs.update(sidebar(conf=conf))
1086 kwargs.update(sidebar(conf=conf))
1075
1087
1076 messages.success(
1088 messages.success(
1077 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1089 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1078
1090
1079 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1091 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1080
1092
1081 messages.error(request, "Could not import parameters from file")
1093 messages.error(request, "Could not import parameters from file")
1082
1094
1083 kwargs = {}
1095 kwargs = {}
1084 kwargs['id_dev'] = conf.id
1096 kwargs['id_dev'] = conf.id
1085 kwargs['title'] = 'Device Configuration'
1097 kwargs['title'] = 'Device Configuration'
1086 kwargs['form'] = file_form
1098 kwargs['form'] = file_form
1087 kwargs['suptitle'] = 'Importing file'
1099 kwargs['suptitle'] = 'Importing file'
1088 kwargs['button'] = 'Import'
1100 kwargs['button'] = 'Import'
1089 kwargs['menu_configurations'] = 'active'
1101 kwargs['menu_configurations'] = 'active'
1090
1102
1091 kwargs.update(sidebar(conf=conf))
1103 kwargs.update(sidebar(conf=conf))
1092
1104
1093 return render(request, 'dev_conf_import.html', kwargs)
1105 return render(request, 'dev_conf_import.html', kwargs)
1094
1106
1095
1107
1096 @login_required
1108 @login_required
1097 def dev_conf_export(request, id_conf):
1109 def dev_conf_export(request, id_conf):
1098
1110
1099 conf = get_object_or_404(Configuration, pk=id_conf)
1111 conf = get_object_or_404(Configuration, pk=id_conf)
1100
1112
1101 if request.method == 'GET':
1113 if request.method == 'GET':
1102 file_form = DownloadFileForm(conf.device.device_type.name)
1114 file_form = DownloadFileForm(conf.device.device_type.name)
1103
1115
1104 if request.method == 'POST':
1116 if request.method == 'POST':
1105 file_form = DownloadFileForm(
1117 file_form = DownloadFileForm(
1106 conf.device.device_type.name, request.POST)
1118 conf.device.device_type.name, request.POST)
1107
1119
1108 if file_form.is_valid():
1120 if file_form.is_valid():
1109 fields = conf.export_to_file(
1121 fields = conf.export_to_file(
1110 format=file_form.cleaned_data['format'])
1122 format=file_form.cleaned_data['format'])
1111
1123
1112 if not fields['content']:
1124 if not fields['content']:
1113 messages.error(request, conf.message)
1125 messages.error(request, conf.message)
1114 return redirect(conf.get_absolute_url_export())
1126 return redirect(conf.get_absolute_url_export())
1115 response = HttpResponse(content_type=fields['content_type'])
1127 response = HttpResponse(content_type=fields['content_type'])
1116 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1128 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1117 response.write(fields['content'])
1129 response.write(fields['content'])
1118
1130
1119 return response
1131 return response
1120
1132
1121 messages.error(request, "Could not export parameters")
1133 messages.error(request, "Could not export parameters")
1122
1134
1123 kwargs = {}
1135 kwargs = {}
1124 kwargs['id_dev'] = conf.id
1136 kwargs['id_dev'] = conf.id
1125 kwargs['title'] = 'Device Configuration'
1137 kwargs['title'] = 'Device Configuration'
1126 kwargs['form'] = file_form
1138 kwargs['form'] = file_form
1127 kwargs['suptitle'] = 'Exporting file'
1139 kwargs['suptitle'] = 'Exporting file'
1128 kwargs['button'] = 'Export'
1140 kwargs['button'] = 'Export'
1129 kwargs['menu_configurations'] = 'active'
1141 kwargs['menu_configurations'] = 'active'
1130
1142
1131 return render(request, 'dev_conf_export.html', kwargs)
1143 return render(request, 'dev_conf_export.html', kwargs)
1132
1144
1133
1145
1134 @login_required
1146 @login_required
1135 def dev_conf_delete(request, id_conf):
1147 def dev_conf_delete(request, id_conf):
1136
1148
1137 conf = get_object_or_404(Configuration, pk=id_conf)
1149 conf = get_object_or_404(Configuration, pk=id_conf)
1138
1150
1139 if request.method == 'POST':
1151 if request.method == 'POST':
1140 if is_developer(request.user):
1152 if is_developer(request.user):
1141 try:
1153 try:
1142 conf.delete()
1154 conf.delete()
1143 except Exception as e:
1155 except Exception as e:
1144 messages.error(request, "The device configuration is protected")
1156 messages.error(request, "The device configuration is protected")
1145 return redirect('url_dev_confs')
1157 return redirect('url_dev_confs')
1146
1158
1147 messages.error(request, 'Not enough permission to delete this object')
1159 messages.error(request, 'Not enough permission to delete this object')
1148 return redirect(conf.get_absolute_url())
1160 return redirect(conf.get_absolute_url())
1149
1161
1150 kwargs = {
1162 kwargs = {
1151 'title': 'Delete',
1163 'title': 'Delete',
1152 'suptitle': 'Configuration',
1164 'suptitle': 'Configuration',
1153 'object': conf,
1165 'object': conf,
1154 'delete': True
1166 'delete': True
1155 }
1167 }
1156 kwargs['menu_configurations'] = 'active'
1168 kwargs['menu_configurations'] = 'active'
1157
1169
1158 return render(request, 'confirm.html', kwargs)
1170 return render(request, 'confirm.html', kwargs)
1159
1171
1160
1172
1161 def sidebar(**kwargs):
1173 def sidebar(**kwargs):
1162
1174
1163 side_data = {}
1175 side_data = {}
1164
1176
1165 conf = kwargs.get('conf', None)
1177 conf = kwargs.get('conf', None)
1166 confs = kwargs.get('confs', None)
1178 confs = kwargs.get('confs', None)
1167 experiment = kwargs.get('experiment', None)
1179 experiment = kwargs.get('experiment', None)
1168
1180
1169 if confs:
1181 if confs:
1170 side_data['side_configurations'] = confs
1182 side_data['side_configurations'] = confs
1171
1183
1172 if experiment:
1184 if experiment:
1173 side_data['experiment'] = experiment
1185 side_data['experiment'] = experiment
1174 experiments = [experiment]
1186 experiments = [experiment]
1175 #configurations = experiment.configuration_set.filter(type=0)
1187 #configurations = experiment.configuration_set.filter(type=0)
1176 side_data['side_experiments'] = experiments
1188 side_data['side_experiments'] = experiments
1177 #side_data['side_configurations'] = configurations.order_by('device__device_type__name')
1189 #side_data['side_configurations'] = configurations.order_by('device__device_type__name')
1178
1190
1179 return side_data
1191 return side_data
1180
1192
1181
1193
1182 def get_paginator(model, page, order, filters={}, n=8):
1194 def get_paginator(model, page, order, filters={}, n=8):
1183
1195
1184 kwargs = {}
1196 kwargs = {}
1185 query = Q()
1197 query = Q()
1186 if isinstance(filters, QueryDict):
1198 if isinstance(filters, QueryDict):
1187 filters = filters.dict()
1199 filters = filters.dict()
1188 [filters.pop(key) for key in list(filters) if filters[key] in ('', ' ')]
1200 [filters.pop(key) for key in list(filters) if filters[key] in ('', ' ')]
1189 filters.pop('page', None)
1201 filters.pop('page', None)
1190
1202
1191 fields = [f.name for f in model._meta.get_fields()]
1203 fields = [f.name for f in model._meta.get_fields()]
1192
1204
1193 if 'historical' in filters:
1205 if 'historical' in filters:
1194 filters.pop('historical')
1206 filters.pop('historical')
1195 filters['type'] = 1
1207 filters['type'] = 1
1196 elif 'type' in fields:
1208 elif 'type' in fields:
1197 filters['type'] = 0
1209 filters['type'] = 0
1198 if 'start_date' in filters:
1210 if 'start_date' in filters:
1199 filters['start_date__gte'] = filters.pop('start_date')
1211 filters['start_date__gte'] = filters.pop('start_date')
1200 if 'end_date' in filters:
1212 if 'end_date' in filters:
1201 filters['start_date__lte'] = filters.pop('end_date')
1213 filters['start_date__lte'] = filters.pop('end_date')
1202 if 'tags' in filters:
1214 if 'tags' in filters:
1203 tags = filters.pop('tags')
1215 tags = filters.pop('tags')
1204 if 'tags' in fields:
1216 if 'tags' in fields:
1205 query = query | Q(tags__icontains=tags)
1217 query = query | Q(tags__icontains=tags)
1206 if 'label' in fields:
1218 if 'label' in fields:
1207 query = query | Q(label__icontains=tags)
1219 query = query | Q(label__icontains=tags)
1208 if 'device' in fields:
1220 if 'device' in fields:
1209 query = query | Q(device__device_type__name__icontains=tags)
1221 query = query | Q(device__device_type__name__icontains=tags)
1210 if 'device_type' in fields:
1222 if 'device_type' in fields:
1211 query = query | Q(device_type__name__icontains=tags)
1223 query = query | Q(device_type__name__icontains=tags)
1212
1224
1213 if 'mine' in filters:
1225 if 'mine' in filters:
1214 filters['author_id'] = filters['mine']
1226 filters['author_id'] = filters['mine']
1215 filters.pop('mine')
1227 filters.pop('mine')
1216 object_list = model.objects.filter(query, **filters).order_by(*order)
1228 object_list = model.objects.filter(query, **filters).order_by(*order)
1217 paginator = Paginator(object_list, n)
1229 paginator = Paginator(object_list, n)
1218
1230
1219 try:
1231 try:
1220 objects = paginator.page(page)
1232 objects = paginator.page(page)
1221 except PageNotAnInteger:
1233 except PageNotAnInteger:
1222 objects = paginator.page(1)
1234 objects = paginator.page(1)
1223 except EmptyPage:
1235 except EmptyPage:
1224 objects = paginator.page(paginator.num_pages)
1236 objects = paginator.page(paginator.num_pages)
1225
1237
1226 kwargs['objects'] = objects
1238 kwargs['objects'] = objects
1227 kwargs['offset'] = (int(page)-1)*n if page else 0
1239 kwargs['offset'] = (int(page)-1)*n if page else 0
1228
1240
1229 return kwargs
1241 return kwargs
1230
1242
1231 @login_required
1243 @login_required
1232 def revoke_tasks(request, id_camp):
1244 def revoke_tasks(request, id_camp):
1233
1245
1234 i = app.control.inspect()
1246 i = app.control.inspect()
1235 scheduled = list(i.scheduled().values())[0]
1247 scheduled = list(i.scheduled().values())[0]
1236 revoked = list(i.revoked().values())[0]
1248 revoked = list(i.revoked().values())[0]
1237
1249
1238 for t in scheduled:
1250 for t in scheduled:
1239 if t['request']['id'] in revoked:
1251 if t['request']['id'] in revoked:
1240 continue
1252 continue
1241 app.control.revoke(t['request']['id'])
1253 app.control.revoke(t['request']['id'])
1242 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1254 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1243 eta = t['eta']
1255 eta = t['eta']
1244 task = t['request']['name'].split('.')[-1]
1256 task = t['request']['name'].split('.')[-1]
1245 messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1257 messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
1246
1258
1247 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1259 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1248
1260
1249 @login_required
1261 @login_required
1250 def show_tasks(request, id_camp):
1262 def show_tasks(request, id_camp):
1251
1263
1252 i = app.control.inspect()
1264 i = app.control.inspect()
1253 scheduled = list(i.scheduled().values())[0]
1265 scheduled = list(i.scheduled().values())[0]
1254 revoked = list(i.revoked().values())[0]
1266 revoked = list(i.revoked().values())[0]
1255
1267
1256 for t in scheduled:
1268 for t in scheduled:
1257 if t['request']['id'] in revoked:
1269 if t['request']['id'] in revoked:
1258 continue
1270 continue
1259 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1271 exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
1260 eta = t['eta']
1272 eta = t['eta']
1261 task = t['request']['name'].split('.')[-1]
1273 task = t['request']['name'].split('.')[-1]
1262 messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
1274 messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
1263
1275
1264 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1276 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
1265
1277
1266 def real_time(request):
1278 def real_time(request):
1267
1279
1268 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1280 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
1269
1281
1270 kwargs = {}
1282 kwargs = {}
1271 kwargs['title'] = 'CLAIRE'
1283 kwargs['title'] = 'CLAIRE'
1272 kwargs['suptitle'] = 'Real Time'
1284 kwargs['suptitle'] = 'Real Time'
1273 kwargs['no_sidebar'] = True
1285 kwargs['no_sidebar'] = True
1274 kwargs['graphic_path'] = graphic_path
1286 kwargs['graphic_path'] = graphic_path
1275 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1287 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
1276
1288
1277 return render(request, 'real_time.html', kwargs)
1289 return render(request, 'real_time.html', kwargs)
1278
1290
1279 def theme(request, theme):
1291 def theme(request, theme):
1280
1292
1281 user = request.user
1293 user = request.user
1282 user.profile.theme = theme
1294 user.profile.theme = theme
1283 user.save()
1295 user.save()
1284 return redirect('index')
1296 return redirect('index')
@@ -1,273 +1,277
1 import ast
1 import ast
2 import json
2 import json
3 import requests
3 import requests
4 import base64
4 import base64
5 import struct
5 import struct
6 from struct import pack
6 from struct import pack
7 import time
7 import time
8 from django.contrib import messages
8 from django.contrib import messages
9 from django.db import models
9 from django.db import models
10 from django.urls import reverse
10 from django.urls import reverse
11 from django.core.validators import MinValueValidator, MaxValueValidator
11 from django.core.validators import MinValueValidator, MaxValueValidator
12
12
13 from apps.main.models import Configuration
13 from apps.main.models import Configuration
14
14
15 MODE_VALUE = (
15 MODE_VALUE = (
16 ('position', 'Position'),
16 ('position', 'Position'),
17 ('speed', 'Speed'),
17 ('speed', 'Speed'),
18 ('table', 'Table')
18 ('table', 'Table')
19 )
19 )
20
20
21 class PedestalConfiguration(Configuration):
21 class PedestalConfiguration(Configuration):
22
22
23 mode = models.CharField(
23 mode = models.CharField(
24 verbose_name='Mode',
24 verbose_name='Mode',
25 max_length=10,
25 max_length=10,
26 choices=MODE_VALUE,
26 choices=MODE_VALUE,
27 null=False,
27 null=False,
28 blank=False
28 blank=False
29 )
29 )
30
30
31 axis = models.CharField(
31 axis = models.CharField(
32 verbose_name="Axis",
32 verbose_name="Axis",
33 max_length=100,
33 max_length=100,
34 blank=False,
34 blank=False,
35 null=False,
35 null=False,
36 help_text="Please separate the values with commas when using table mode"
36 help_text="Please separate the values with commas when using table mode"
37 )
37 )
38
38
39 speed = models.CharField(
39 speed = models.CharField(
40 verbose_name='Speed',
40 verbose_name='Speed',
41 max_length=100,
41 max_length=100,
42 blank=True,
42 blank=True,
43 null=True
43 null=True
44 )
44 )
45
45
46 angle = models.CharField(
46 angle = models.CharField(
47 verbose_name="Angle(s)",
47 verbose_name="Angle(s)",
48 max_length=100,
48 max_length=100,
49 blank=True,
49 blank=True,
50 null=True,
50 null=True,
51 help_text="Please separate the values with commas when using table mode"
51 help_text="Please separate the values with commas when using table mode"
52 )
52 )
53
53
54 min_value = models.FloatField(
54 min_value = models.FloatField(
55 verbose_name='Min angle',
55 verbose_name='Min angle',
56 validators=[MinValueValidator(-5), MaxValueValidator(185)],
56 validators=[MinValueValidator(-5), MaxValueValidator(185)],
57 blank=True,
57 blank=True,
58 null=True
58 null=True
59 )
59 )
60
60
61 max_value = models.FloatField(
61 max_value = models.FloatField(
62 verbose_name='Max angle',
62 verbose_name='Max angle',
63 validators=[MinValueValidator(-5), MaxValueValidator(185)],
63 validators=[MinValueValidator(-5), MaxValueValidator(185)],
64 blank=True,
64 blank=True,
65 null=True
65 null=True
66 )
66 )
67
67
68 class Meta:
68 class Meta:
69 db_table = 'pedestal_configurations'
69 db_table = 'pedestal_configurations'
70
70
71 def __str__(self):
71 def __str__(self):
72 if self.mode=='position':
72 if self.mode=='position':
73 return u'Position: {}ΒΊ {}'.format(self.angle, self.axis.upper())
73 return u'Position: {}ΒΊ {}'.format(self.angle, self.axis.upper())
74 if self.mode=='speed':
74 if self.mode=='speed':
75 return u'Speed: {}ΒΊ/s {}'.format(self.speed, self.axis.upper())
75 return u'Speed: {}ΒΊ/s {}'.format(self.speed, self.axis.upper())
76 if self.mode=='table':
76 if self.mode=='table':
77 axis = [x.strip().upper() for x in self.axis.split(',')]
77 axis = [x.strip().upper() for x in self.axis.split(',')]
78 speeds = [float(x.strip()) for x in self.speed.split(',')]
78 speeds = [float(x.strip()) for x in self.speed.split(',')]
79 table = [float(x.strip()) for x in self.angle.split(',')]
79 table = [float(x.strip()) for x in self.angle.split(',')]
80 return u'Table: Axis {}, Speed {}ΒΊ/s, Steps {}'.format(axis, speeds, table)
80 return u'Table: Axis {}, Speed {}ΒΊ/s, Steps {}'.format(axis, speeds, table)
81
81
82 @property
82 @property
83 def label(self):
83 def label(self):
84 return str(self)
84 return str(self)
85
85
86 def get_absolute_url_plot(self):
86 def get_absolute_url_plot(self):
87 return reverse('url_plot_pedestal_pulses', args=[str(self.id)])
87 return reverse('url_plot_pedestal_pulses', args=[str(self.id)])
88
88
89 def request(self, cmd, method='get', **kwargs):
89 def request(self, cmd, method='get', **kwargs):
90
90
91 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
91 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
92 payload = req.json()
92 payload = req.json()
93
93
94 return payload
94 return payload
95
95
96 def status_device(self):
96 def status_device(self):
97
97
98 try:
98 try:
99 payload = requests.get(self.device.url())
99 payload = requests.get(self.device.url())
100
100
101 if payload:
101 if payload:
102 self.device.status = 1
102 self.device.status = 1
103 elif payload['status']=='disable':
103 elif payload['status']=='disable':
104 self.device.status = 2
104 self.device.status = 2
105 else:
105 else:
106 self.device.status = 1
106 self.device.status = 1
107 self.device.save()
107 self.device.save()
108 self.message = 'Pedestal status: {}'.format(payload['status'])
108 self.message = 'Pedestal status: {}'.format(payload['status'])
109 return False
109 return False
110 except Exception as e:
110 except Exception as e:
111 if 'No route to host' not in str(e):
111 if 'No route to host' not in str(e):
112 self.device.status = 4
112 self.device.status = 4
113 self.device.save()
113 self.device.save()
114 self.message = 'Pedestal status: {}'.format(str(e))
114 self.message = 'Pedestal status: {}'.format(str(e))
115 return False
115 return False
116
116
117 self.device.save()
117 self.device.save()
118 return True
118 return True
119
119
120 def reset_device(self, axi, angle):
120 def reset_device(self, axi, angle):
121
121
122 try:
122 try:
123 url = self.device.url() + "position?params="
123 url = self.device.url() + "position?params="
124
124
125 payload_el = {'axis': 'elevation'}
125 payload_el = {'axis': 'elevation'}
126 payload_az = {'axis': 'azimuth'}
126 payload_az = {'axis': 'azimuth'}
127
127
128 if axi == 'elevation':
128 if axi == 'elevation':
129 payload_az['position'] = angle
129 payload_az['position'] = angle
130 payload_el['position'] = 0
130 payload_el['position'] = 0
131 elif axi == 'azimuth':
131 elif axi == 'azimuth':
132 payload_el['position'] = angle
132 payload_el['position'] = angle
133 payload_az['position'] = 0
133 payload_az['position'] = 0
134 else:
134 else:
135 payload_el['position'] = 0
135 payload_el['position'] = 0
136 payload_az['position'] = 0
136 payload_az['position'] = 0
137
137
138 json_data_el = json.dumps(payload_el)
138 json_data_el = json.dumps(payload_el)
139 json_data_az = json.dumps(payload_az)
139 json_data_az = json.dumps(payload_az)
140
140
141 base64_table_el = base64.standard_b64encode(json_data_el.encode('ascii'))
141 base64_table_el = base64.standard_b64encode(json_data_el.encode('ascii'))
142 base64_table_az = base64.standard_b64encode(json_data_az.encode('ascii'))
142 base64_table_az = base64.standard_b64encode(json_data_az.encode('ascii'))
143
143
144 time.sleep(0.1)
144 time.sleep(0.1)
145 r = requests.get(url + base64_table_el.decode('ascii'))
145 r = requests.get(url + base64_table_el.decode('ascii'))
146 time.sleep(0.1)
146 time.sleep(0.1)
147 r = requests.get(url + base64_table_az.decode('ascii'))
147 r = requests.get(url + base64_table_az.decode('ascii'))
148
148
149 if r:
149 if r:
150 self.device.status = 3
150 self.device.status = 3
151 self.device.save()
151 self.device.save()
152 self.message = 'Pedestal reset'
152 self.message = 'Pedestal reset'
153 else:
153 else:
154 return False
154 return False
155
155
156 except Exception as e:
156 except Exception as e:
157 self.message = 'Pedestal reset: {}'.format(str(e))
157 self.message = 'Pedestal reset: {}'.format(str(e))
158 return False
158 return False
159
159
160 return True
160 return True
161
161
162 def stop_device(self):
162 def stop_device(self):
163
163
164 try:
164 try:
165 command = self.device.url() + "stop"
165 command = self.device.url() + "stop"
166 r = requests.get(command)
166 r = requests.get(command)
167
167
168 if self.mode == 'table':
168 if self.mode == 'table':
169 AX = {'az':'azimuth', 'el':'elevation'}
169 AX = {'az':'azimuth', 'el':'elevation'}
170 axis = [AX[x.lower().strip()] for x in self.axis.split(',')]
170 axis = [AX[x.lower().strip()] for x in self.axis.split(',')]
171 list_of_floats = [float(x.strip()) for x in self.angle.split(",")]
171 list_of_floats = [float(x.strip()) for x in self.angle.split(",")]
172 self.reset_device(axis[0], list_of_floats[0])
172 self.reset_device(axis[0], list_of_floats[0])
173
173
174 if r:
174 if r:
175 self.device.status = 4
175 self.device.status = 4
176 self.device.save()
176 self.device.save()
177 self.message = 'Pedestal stopped'
177 self.message = 'Pedestal stopped'
178 else:
178 else:
179 self.device.status = 4
179 self.device.status = 4
180 self.device.save()
180 self.device.save()
181 return False
181 return False
182 except Exception as e:
182 except Exception as e:
183 if 'No route to host' not in str(e):
183 if 'No route to host' not in str(e):
184 self.device.status = 4
184 self.device.status = 4
185 else:
185 else:
186 self.device.status = 0
186 self.device.status = 0
187 #self.message = 'Pedestal stop: {}'.format(str(e))
187 #self.message = 'Pedestal stop: {}'.format(str(e))
188 self.message = "Pedestal can't start, please check network/device connection or IP address/port configuration"
188 self.message = "Pedestal can't start, please check network/device connection or IP address/port configuration"
189 self.device.save()
189 self.device.save()
190 return False
190 return False
191
191
192 return True
192 return True
193
193
194 def start_device(self):
194 def start_device(self):
195
195
196 if self.mode == 'table':
196 if self.mode == 'table':
197 if len(self.angle.split(',')) > 1:
197 if len(self.angle.split(',')) > 1:
198 list_speed = []
198 list_speed = []
199 list_axis = []
199 list_axis = []
200 for _ in range(len(self.angle.split(','))):
200 for _ in range(len(self.angle.split(','))):
201 list_axis.append(self.axis)
201 list_axis.append(self.axis)
202 list_speed.append(self.speed)
202 list_speed.append(self.speed)
203
203
204 if len(self.axis.split(',')) == 1:
204 if len(self.axis.split(',')) == 1:
205 self.axis = ",".join(map(str, list_axis))
205 self.axis = ",".join(map(str, list_axis))
206 if len(self.speed.split(',')) == 1:
206 if len(self.speed.split(',')) == 1:
207 self.speed = ",".join(map(str, list_speed))
207 self.speed = ",".join(map(str, list_speed))
208
208
209 AX = {'az':'azimuth', 'el':'elevation'}
209 AX = {'az':'azimuth', 'el':'elevation'}
210 axis = [AX[x.lower().strip()] for x in self.axis.split(',')]
210 axis = [AX[x.lower().strip()] for x in self.axis.split(',')]
211 if len(axis)==1:
211 if len(axis)==1:
212 axis = axis[0]
212 axis = axis[0]
213
213
214 try:
214 try:
215 if self.mode == 'position':
215 if self.mode == 'position':
216 url = self.device.url() + "position?params="
216 url = self.device.url() + "position?params="
217 payload = {'axis': axis, 'position': float(self.angle)}
217 payload = {'axis': axis, 'position': float(self.angle)}
218 elif self.mode == 'speed':
218 elif self.mode == 'speed':
219 url = self.device.url() + "speed?params="
219 url = self.device.url() + "speed?params="
220 payload = {'axis': axis, 'speed': float(self.speed)}
220 payload = {'axis': axis, 'speed': float(self.speed)}
221 elif self.mode == 'table':
221 elif self.mode == 'table':
222 url = self.device.url() + "combinedtable?params="
222 url = self.device.url() + "combinedtable?params="
223 list_of_floats = [float(x.strip()) for x in self.angle.split(",")]
223 list_of_floats = [float(x.strip()) for x in self.angle.split(",")]
224 byte_table = []
224 byte_table = []
225 for x in list_of_floats:
225 for x in list_of_floats:
226 temp = bytearray(struct.pack("f", x))
226 temp = bytearray(struct.pack("f", x))
227 byte_table.append(temp[3])
227 byte_table.append(temp[3])
228 byte_table.append(temp[2])
228 byte_table.append(temp[2])
229 byte_table.append(temp[1])
229 byte_table.append(temp[1])
230 byte_table.append(temp[0])
230 byte_table.append(temp[0])
231
231
232 coded_table = base64.standard_b64encode(bytes(byte_table))
232 coded_table = base64.standard_b64encode(bytes(byte_table))
233 coded_table_ascii = coded_table.decode('ascii')
233 coded_table_ascii = coded_table.decode('ascii')
234 speed = [float(x.strip()) for x in self.speed.split(',')]
234 speed = [float(x.strip()) for x in self.speed.split(',')]
235
236 if isinstance(axis, str):
237 axis = [axis]
238
235 payload = {
239 payload = {
236 'arraylength': len(speed),
240 'arraylength': len(speed),
237 'axis': axis,
241 'axis': axis,
238 'speed': speed,
242 'speed': speed,
239 'bottom': self.min_value,
243 'bottom': self.min_value,
240 'top': self.max_value,
244 'top': self.max_value,
241 'table': coded_table_ascii
245 'table': coded_table_ascii
242 }
246 }
243
247
244 json_data = json.dumps(payload)
248 json_data = json.dumps(payload)
245 print(json_data)
249 print(json_data)
246 base64_table = base64.standard_b64encode(json_data.encode('ascii'))
250 base64_table = base64.standard_b64encode(json_data.encode('ascii'))
247 url += base64_table.decode('ascii')
251 url += base64_table.decode('ascii')
248 print(url)
252 print(url)
249 r = requests.get(url)
253 r = requests.get(url)
250
254
251 if self.mode == 'table':
255 if self.mode == 'table':
252 payload['table'] = list_of_floats
256 payload['table'] = list_of_floats
253
257
254 if r:
258 if r:
255 self.device.status = 3
259 self.device.status = 3
256 self.device.save()
260 self.device.save()
257 self.message = 'Pedestal configured and started'
261 self.message = 'Pedestal configured and started'
258 else:
262 else:
259 return False
263 return False
260 except Exception as e:
264 except Exception as e:
261 if 'No route to host' not in str(e):
265 if 'No route to host' not in str(e):
262 self.device.status = 4
266 self.device.status = 4
263 else:
267 else:
264 self.device.status = 0
268 self.device.status = 0
265 #self.message = 'Pedestal start: {}'.format(str(e))
269 #self.message = 'Pedestal start: {}'.format(str(e))
266 self.message = "Pedestal can't start, please check network/device connection or IP address/port configuration"
270 self.message = "Pedestal can't start, please check network/device connection or IP address/port configuration"
267 self.device.save()
271 self.device.save()
268 return False
272 return False
269
273
270 return payload
274 return payload
271
275
272 def get_absolute_url_import(self):
276 def get_absolute_url_import(self):
273 return reverse('url_import_pedestal_conf', args=[str(self.id)])
277 return reverse('url_import_pedestal_conf', args=[str(self.id)])
@@ -1,111 +1,111
1 import os
1 import os
2 import json
2 import json
3
3
4 from django import forms
4 from django import forms
5 from django.utils.safestring import mark_safe
5 from django.utils.safestring import mark_safe
6 from apps.main.models import Device
6 from apps.main.models import Device
7 from apps.main.forms import add_empty_choice
7 from apps.main.forms import add_empty_choice
8 from .models import USRPRXConfiguration
8 from .models import USRPRXConfiguration
9
9
10 def create_choices_from_model(model, conf_id, all_choice=False):
10 def create_choices_from_model(model, conf_id, all_choice=False):
11
11
12 instance = globals()[model]
12 instance = globals()[model]
13 choices = instance.objects.all().values_list('pk', 'name')
13 choices = instance.objects.all().values_list('pk', 'name')
14
14
15 return choices
15 return choices
16
16
17 class USRPRXConfigurationForm(forms.ModelForm):
17 class USRPRXConfigurationForm(forms.ModelForm):
18
18
19 def __init__(self, *args, **kwargs):
19 def __init__(self, *args, **kwargs):
20 super(USRPRXConfigurationForm, self).__init__(*args, **kwargs)
20 super(USRPRXConfigurationForm, self).__init__(*args, **kwargs)
21
21
22 instance = getattr(self, 'instance', None)
22 instance = getattr(self, 'instance', None)
23
23
24 if instance and instance.pk:
24 if instance and instance.pk:
25
25
26 devices = Device.objects.filter(device_type__name='usrp_rx')
26 devices = Device.objects.filter(device_type__name='usrp_rx')
27 #if instance.experiment:
27 #if instance.experiment:
28 #self.fields['experiment'].widget.attrs['read_only'] = True
28 #self.fields['experiment'].widget.attrs['read_only'] = True
29 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
29 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
30 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
30 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
31
31
32 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
32 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
33 self.fields['experiment'].widget.attrs['readonly'] = True
33 self.fields['experiment'].widget.attrs['readonly'] = True
34
34
35 class Meta:
35 class Meta:
36 model = USRPRXConfiguration
36 model = USRPRXConfiguration
37 exclude = ('type', 'parameters', 'status', 'total_units', 'author', 'hash')
37 exclude = ('type', 'parameters', 'status', 'total_units', 'author', 'hash')
38
38
39 def clean(self):
39 def clean(self):
40 form_data = super(USRPRXConfigurationForm, self).clean()
40 form_data = super(USRPRXConfigurationForm, self).clean()
41 return form_data
41 return form_data
42
42
43 def save(self, *args, **kwargs):
43 def save(self, *args, **kwargs):
44 conf = super(USRPRXConfigurationForm, self).save(*args, **kwargs)
44 conf = super(USRPRXConfigurationForm, self).save(*args, **kwargs)
45 conf.save()
45 conf.save()
46 return conf
46 return conf
47
47
48 class USRPRXEditionForm(forms.ModelForm):
48 class USRPRXEditionForm(forms.ModelForm):
49
49
50 def __init__(self, *args, **kwargs):
50 def __init__(self, *args, **kwargs):
51 super(USRPRXEditionForm, self).__init__(*args, **kwargs)
51 super(USRPRXEditionForm, self).__init__(*args, **kwargs)
52
52
53 instance = getattr(self, 'instance', None)
53 instance = getattr(self, 'instance', None)
54
54
55 if instance and instance.pk:
55 if instance and instance.pk:
56
56
57 devices = Device.objects.filter(device_type__name='usrp_rx')
57 devices = Device.objects.filter(device_type__name='usrp_rx')
58 #if instance.experiment:
58 #if instance.experiment:
59 #self.fields['experiment'].widget.attrs['read_only'] = True
59 #self.fields['experiment'].widget.attrs['read_only'] = True
60 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
60 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
61 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
61 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
62
62
63 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
63 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
64 self.fields['experiment'].widget.attrs['readonly'] = True
64 self.fields['experiment'].widget.attrs['readonly'] = True
65
65
66 class Meta:
66 class Meta:
67 model = USRPRXConfiguration
67 model = USRPRXConfiguration
68 exclude = ('template', 'device', 'label', 'ip_address', 'daughterboard', 'antenna', 'type', 'parameters', 'status', 'total_units', 'author', 'hash')
68 exclude = ('template', 'device', 'label', 'type', 'parameters', 'status', 'total_units', 'author', 'hash')
69
69
70 def clean(self):
70 def clean(self):
71 form_data = super(USRPRXEditionForm, self).clean()
71 form_data = super(USRPRXEditionForm, self).clean()
72 return form_data
72 return form_data
73
73
74 def save(self, *args, **kwargs):
74 def save(self, *args, **kwargs):
75 conf = super(USRPRXEditionForm, self).save(*args, **kwargs)
75 conf = super(USRPRXEditionForm, self).save(*args, **kwargs)
76 conf.save()
76 conf.save()
77 return conf
77 return conf
78
78
79 class ExtFileField(forms.FileField):
79 class ExtFileField(forms.FileField):
80 """
80 """
81 Same as forms.FileField, but you can specify a file extension whitelist.
81 Same as forms.FileField, but you can specify a file extension whitelist.
82
82
83 >>> from django.core.files.uploadedfile import SimpleUploadedFile
83 >>> from django.core.files.uploadedfile import SimpleUploadedFile
84 >>>
84 >>>
85 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
85 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
86 >>>
86 >>>
87 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
87 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
88 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
88 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
89 >>>
89 >>>
90 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
90 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
91 Traceback (most recent call last):
91 Traceback (most recent call last):
92 ...
92 ...
93 ValidationError: [u'Not allowed filetype!']
93 ValidationError: [u'Not allowed filetype!']
94 """
94 """
95 def __init__(self, *args, **kwargs):
95 def __init__(self, *args, **kwargs):
96 extensions = kwargs.pop("extensions")
96 extensions = kwargs.pop("extensions")
97 self.extensions = [i.lower() for i in extensions]
97 self.extensions = [i.lower() for i in extensions]
98
98
99 super(ExtFileField, self).__init__(*args, **kwargs)
99 super(ExtFileField, self).__init__(*args, **kwargs)
100
100
101 def clean(self, *args, **kwargs):
101 def clean(self, *args, **kwargs):
102 data = super(ExtFileField, self).clean(*args, **kwargs)
102 data = super(ExtFileField, self).clean(*args, **kwargs)
103 filename = data.name
103 filename = data.name
104 ext = os.path.splitext(filename)[1]
104 ext = os.path.splitext(filename)[1]
105 ext = ext.lower()
105 ext = ext.lower()
106 if ext not in self.extensions:
106 if ext not in self.extensions:
107 raise forms.ValidationError('Not allowed file type: %s' % ext)
107 raise forms.ValidationError('Not allowed file type: %s' % ext)
108
108
109 class USRPRXImportForm(forms.Form):
109 class USRPRXImportForm(forms.Form):
110
110
111 file_name = ExtFileField(extensions=['.racp', '.json', '.dat']) No newline at end of file
111 file_name = ExtFileField(extensions=['.racp', '.json', '.dat'])
@@ -1,222 +1,222
1 import ast
1 import ast
2 import json
2 import json
3 import requests
3 import requests
4 import base64
4 import base64
5 from struct import pack
5 from struct import pack
6
6
7 from django.db import models
7 from django.db import models
8 from django.urls import reverse
8 from django.urls import reverse
9 from django.core.validators import MinValueValidator, MaxValueValidator
9 from django.core.validators import MinValueValidator, MaxValueValidator
10
10
11 from apps.main.models import Configuration
11 from apps.main.models import Configuration
12
12
13 BOARD_VALUE = (
13 BOARD_VALUE = (
14 ('1', 'A:AB'),
14 ('1', 'A:AB'),
15 ('2', 'AB'),
15 ('2', 'AB'),
16 ('3', 'A:A A:B'),
16 ('3', 'A:A A:B'),
17 )
17 )
18
18
19 ANT_VALUE = (
19 ANT_VALUE = (
20 ('1', 'RX'),
20 ('1', 'RX'),
21 ('2', 'TX')
21 ('2', 'TX')
22 )
22 )
23
23
24 CLK_VALUE = (
24 CLK_VALUE = (
25 ('1', 'internal'),
25 ('1', 'internal'),
26 ('2', 'external')
26 ('2', 'external')
27 )
27 )
28
28
29 TIME_VALUE = (
29 TIME_VALUE = (
30 ('1', 'internal'),
30 ('1', 'internal'),
31 ('2', 'external')
31 ('2', 'external')
32 )
32 )
33
33
34 class USRPRXConfiguration(Configuration):
34 class USRPRXConfiguration(Configuration):
35
35
36 ip_address = models.GenericIPAddressField(
36 ip_address_rx = models.GenericIPAddressField(
37 verbose_name = 'IP address',
37 verbose_name = 'IP address',
38 protocol='IPv4',
38 protocol='IPv4',
39 default='0.0.0.0')
39 default='0.0.0.0')
40
40
41 daughterboard = models.CharField(
41 daughterboard_rx = models.CharField(
42 verbose_name='Daughterboard',
42 verbose_name='Daughterboard',
43 max_length=3,
43 max_length=3,
44 choices=BOARD_VALUE,
44 choices=BOARD_VALUE,
45 null=False,
45 null=False,
46 blank=False
46 blank=False
47 )
47 )
48
48
49 antenna = models.CharField(
49 antenna_rx = models.CharField(
50 verbose_name='Antenna',
50 verbose_name='Antenna',
51 max_length=3,
51 max_length=3,
52 choices=ANT_VALUE,
52 choices=ANT_VALUE,
53 null=False,
53 null=False,
54 blank=False
54 blank=False
55 )
55 )
56
56
57 samplerate_rx = models.FloatField(
57 samplerate_rx = models.FloatField(
58 verbose_name='Sample Rate',
58 verbose_name='Sample Rate [MHz]',
59 validators=[MinValueValidator(0.01), MaxValueValidator(10.00)],
59 validators=[MinValueValidator(0.01), MaxValueValidator(10.00)],
60 blank=False,
60 blank=False,
61 null=False,
61 null=False,
62 help_text='Introduce the value in MHz (10^6)'
62 help_text='Introduce the value in MHz (10^6)'
63 )
63 )
64
64
65 frequency_rx = models.FloatField(
65 frequency_rx = models.FloatField(
66 verbose_name='Frequency',
66 verbose_name='Frequency [MHz]',
67 validators=[MinValueValidator(0.01)],
67 validators=[MinValueValidator(0.01)],
68 blank=False,
68 blank=False,
69 null=False,
69 null=False,
70 help_text='Introduce the value in MHz (10^6)'
70 help_text='Introduce the value in MHz (10^6)'
71 )
71 )
72
72
73 datadir = models.CharField(
73 datadir = models.CharField(
74 verbose_name="Data Directory",
74 verbose_name="Data Directory",
75 max_length=100,
75 max_length=100,
76 default='',
76 default='',
77 blank=False,
77 blank=False,
78 null=False,
78 null=False,
79 help_text='Fill with a directory. Example: /media/soporte/DATA'
79 help_text='Fill with a directory. Example: /media/soporte/DATA'
80 )
80 )
81
81
82 clocksource = models.CharField(
82 clocksource = models.CharField(
83 verbose_name='Clock Source',
83 verbose_name='Clock Source',
84 max_length=3,
84 max_length=3,
85 choices=CLK_VALUE,
85 choices=CLK_VALUE,
86 null=False,
86 null=False,
87 blank=False
87 blank=False
88 )
88 )
89
89
90 timesource = models.CharField(
90 timesource = models.CharField(
91 verbose_name='Time Source',
91 verbose_name='Time Source',
92 max_length=3,
92 max_length=3,
93 choices=TIME_VALUE,
93 choices=TIME_VALUE,
94 null=False,
94 null=False,
95 blank=False
95 blank=False
96 )
96 )
97
97
98 clockrate = models.FloatField(
98 clockrate = models.FloatField(
99 verbose_name='Clock Rate',
99 verbose_name='Clock Rate [MHz]',
100 blank=False,
100 blank=False,
101 null=False,
101 null=False,
102 help_text='Introduce the value in MHz (10^6)'
102 help_text='Introduce the value in MHz (10^6)'
103 )
103 )
104
104
105 class Meta:
105 class Meta:
106 db_table = 'usrp_rx_configurations'
106 db_table = 'usrp_rx_configurations'
107
107
108 def __str__(self):
108 def __str__(self):
109 return u'RX at {} MHz @ {} MHz'.format(self.frequency_rx, self.samplerate_rx)
109 return u'RX at {} MHz @ {} MHz'.format(self.frequency_rx, self.samplerate_rx)
110
110
111 def get_absolute_url_plot(self):
111 def get_absolute_url_plot(self):
112 return reverse('url_plot_usrp_rx_pulses', args=[str(self.id)])
112 return reverse('url_plot_usrp_rx_pulses', args=[str(self.id)])
113
113
114 def request(self, cmd, method='get', **kwargs):
114 def request(self, cmd, method='get', **kwargs):
115
115
116 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
116 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
117 payload = req.json()
117 payload = req.json()
118 return payload
118 return payload
119
119
120 def status_device(self):
120 def status_device(self):
121
121
122 try:
122 try:
123 #self.device.status = 0
123 #self.device.status = 0
124 #payload = self.request('status')
124 #payload = self.request('status')
125 payload = requests.get(self.device.url())
125 payload = requests.get(self.device.url())
126
126
127 if payload:
127 if payload:
128 self.device.status = 1
128 self.device.status = 1
129 elif payload['status']=='disable':
129 elif payload['status']=='disable':
130 self.device.status = 2
130 self.device.status = 2
131 else:
131 else:
132 self.device.status = 1
132 self.device.status = 1
133 self.device.save()
133 self.device.save()
134 self.message = 'USRP Rx Dev status: {}'.format(payload['status'])
134 self.message = 'USRP Rx Dev status: {}'.format(payload['status'])
135 return False
135 return False
136 except Exception as e:
136 except Exception as e:
137 if 'No route to host' not in str(e):
137 if 'No route to host' not in str(e):
138 self.device.status = 4
138 self.device.status = 4
139 self.device.save()
139 self.device.save()
140 self.message = 'USRP Rx status: {}'.format(str(e))
140 self.message = 'USRP Rx status: {}'.format(str(e))
141 return False
141 return False
142
142
143 self.device.save()
143 self.device.save()
144 return True
144 return True
145
145
146 def reset_device(self):
146 def reset_device(self):
147
147
148 try:
148 try:
149 payload = self.request('reset', 'post')
149 payload = self.request('reset', 'post')
150 if payload['reset']=='ok':
150 if payload['reset']=='ok':
151 self.message = 'USRP Rx restarted OK'
151 self.message = 'USRP Rx restarted OK'
152 self.device.status = 2
152 self.device.status = 2
153 self.device.save()
153 self.device.save()
154 else:
154 else:
155 self.message = 'USRP Rx restart fail'
155 self.message = 'USRP Rx restart fail'
156 self.device.status = 4
156 self.device.status = 4
157 self.device.save()
157 self.device.save()
158 except Exception as e:
158 except Exception as e:
159 self.message = 'USRP Rx reset: {}'.format(str(e))
159 self.message = 'USRP Rx reset: {}'.format(str(e))
160 return False
160 return False
161
161
162 return True
162 return True
163
163
164 def stop_device(self):
164 def stop_device(self):
165
165
166 try:
166 try:
167 command = self.device.url() + "stoprx"
167 command = self.device.url() + "stoprx"
168 r = requests.get(command)
168 r = requests.get(command)
169 if r:
169 if r:
170 self.device.status = 4
170 self.device.status = 4
171 self.device.save()
171 self.device.save()
172 self.message = 'USRP stopped'
172 self.message = 'USRP stopped'
173 else:
173 else:
174 self.device.status = 4
174 self.device.status = 4
175 self.device.save()
175 self.device.save()
176 return False
176 return False
177 except Exception as e:
177 except Exception as e:
178 if 'No route to host' not in str(e):
178 if 'No route to host' not in str(e):
179 self.device.status = 4
179 self.device.status = 4
180 else:
180 else:
181 self.device.status = 0
181 self.device.status = 0
182 #self.message = 'USRP Rx stop: {}'.format(str(e))
182 #self.message = 'USRP Rx stop: {}'.format(str(e))
183 self.message = "USRP Rx can't start, please check network/device connection or IP address/port configuration"
183 self.message = "USRP Rx can't start, please check network/device connection or IP address/port configuration"
184 self.device.save()
184 self.device.save()
185 return False
185 return False
186
186
187 return True
187 return True
188
188
189 def start_device(self):
189 def start_device(self):
190
190
191 try:
191 try:
192 usrp = USRPRXConfiguration.objects.get(pk=self)
192 usrp = USRPRXConfiguration.objects.get(pk=self)
193 usrp_daughterboard = usrp.get_daughterboard_display()
193 usrp_daughterboard_rx = usrp.get_daughterboard_rx_display()
194 usrp_antenna = usrp.get_antenna_display()
194 usrp_antenna_rx = usrp.get_antenna_rx_display()
195 usrp_clocksource = usrp.get_clocksource_display()
195 usrp_clocksource = usrp.get_clocksource_display()
196 usrp_timesource = usrp.get_timesource_display()
196 usrp_timesource = usrp.get_timesource_display()
197
197
198 payload = {'ip_address': usrp.ip_address, 'daughterboard': usrp_daughterboard, 'antenna': usrp_antenna, 'sample_rate': usrp.samplerate_rx, 'frequency': usrp.frequency_rx,
198 payload = {'ip_address': usrp.ip_address_rx, 'daughterboard': usrp_daughterboard_rx, 'antenna': usrp_antenna_rx, 'sample_rate': usrp.samplerate_rx, 'frequency': usrp.frequency_rx,
199 'datadir': usrp.datadir, 'clock_source': usrp_clocksource, 'time_source': usrp_timesource, 'clock_rate':usrp.clockrate}
199 'datadir': usrp.datadir, 'clock_source': usrp_clocksource, 'time_source': usrp_timesource, 'clock_rate':usrp.clockrate}
200
200
201 r = requests.post(self.device.url("usrprx"), json=payload)
201 r = requests.post(self.device.url("usrprx"), json=payload)
202
202
203 if r:
203 if r:
204 self.device.status = 3
204 self.device.status = 3
205 self.device.save()
205 self.device.save()
206 self.message = 'USRP Rx configured and started'
206 self.message = 'USRP Rx configured and started'
207 else:
207 else:
208 return False
208 return False
209 except Exception as e:
209 except Exception as e:
210 if 'No route to host' not in str(e):
210 if 'No route to host' not in str(e):
211 self.device.status = 4
211 self.device.status = 4
212 else:
212 else:
213 self.device.status = 0
213 self.device.status = 0
214 #self.message = 'USRP Rx start: {}'.format(str(e))
214 #self.message = 'USRP Rx start: {}'.format(str(e))
215 self.message = "USRP Rx can't start, please check network/device connection or IP address/port configuration"
215 self.message = "USRP Rx can't start, please check network/device connection or IP address/port configuration"
216 self.device.save()
216 self.device.save()
217 return False
217 return False
218
218
219 return payload
219 return payload
220
220
221 def get_absolute_url_import(self):
221 def get_absolute_url_import(self):
222 return reverse('url_import_usrp_rx_conf', args=[str(self.id)]) No newline at end of file
222 return reverse('url_import_usrp_rx_conf', args=[str(self.id)])
@@ -1,129 +1,129
1
1
2 import json
2 import json
3
3
4 from django.contrib import messages
4 from django.contrib import messages
5 from django.utils.safestring import mark_safe
5 from django.utils.safestring import mark_safe
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
6 from django.shortcuts import render, redirect, get_object_or_404, HttpResponse
7 from django.contrib.auth.decorators import login_required
7 from django.contrib.auth.decorators import login_required
8
8
9 from apps.main.models import Experiment, Device
9 from apps.main.models import Experiment, Device
10 from apps.main.views import sidebar
10 from apps.main.views import sidebar
11
11
12 from .models import USRPRXConfiguration
12 from .models import USRPRXConfiguration
13 from .forms import USRPRXConfigurationForm, USRPRXImportForm
13 from .forms import USRPRXConfigurationForm, USRPRXImportForm
14
14
15
15
16 def conf(request, conf_id):
16 def conf(request, conf_id):
17
17
18 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
18 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
19
19
20 kwargs = {}
20 kwargs = {}
21 kwargs['dev_conf'] = conf
21 kwargs['dev_conf'] = conf
22 kwargs['dev_conf_keys'] = ['ip_address', 'daughterboard', 'antenna', 'samplerate_rx', 'frequency_rx', 'datadir', 'clocksource', 'timesource', 'clockrate']
22 kwargs['dev_conf_keys'] = ['ip_address_rx', 'daughterboard_rx', 'antenna_rx', 'samplerate_rx', 'frequency_rx', 'datadir', 'clocksource', 'timesource', 'clockrate']
23
23
24 kwargs['title'] = 'Configuration'
24 kwargs['title'] = 'Configuration'
25 kwargs['suptitle'] = 'Detail'
25 kwargs['suptitle'] = 'Detail'
26
26
27 kwargs['button'] = 'Edit Configuration'
27 kwargs['button'] = 'Edit Configuration'
28
28
29 conf.status_device()
29 conf.status_device()
30
30
31 ###### SIDEBAR ######
31 ###### SIDEBAR ######
32 kwargs.update(sidebar(conf=conf))
32 kwargs.update(sidebar(conf=conf))
33
33
34 return render(request, 'usrp_rx_conf.html', kwargs)
34 return render(request, 'usrp_rx_conf.html', kwargs)
35
35
36 @login_required
36 @login_required
37 def conf_edit(request, conf_id):
37 def conf_edit(request, conf_id):
38
38
39 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
39 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
40
40
41 if request.method=='GET':
41 if request.method=='GET':
42
42
43 form = USRPRXConfigurationForm(instance=conf)
43 form = USRPRXConfigurationForm(instance=conf)
44
44
45 elif request.method=='POST':
45 elif request.method=='POST':
46
46
47 line_data = {}
47 line_data = {}
48 conf_data = {}
48 conf_data = {}
49 clock_data = {}
49 clock_data = {}
50 extras = []
50 extras = []
51
51
52 #classified post fields
52 #classified post fields
53 for label,value in request.POST.items():
53 for label,value in request.POST.items():
54 if label=='csrfmiddlewaretoken':
54 if label=='csrfmiddlewaretoken':
55 continue
55 continue
56
56
57 if label.count('|')==0:
57 if label.count('|')==0:
58 if label in ('mode', 'multiplier', 'divisor', 'reference'):
58 if label in ('mode', 'multiplier', 'divisor', 'reference'):
59 clock_data[label] = value
59 clock_data[label] = value
60 else:
60 else:
61 conf_data[label] = value
61 conf_data[label] = value
62 continue
62 continue
63
63
64 elif label.split('|')[0]!='-1':
64 elif label.split('|')[0]!='-1':
65 extras.append(label)
65 extras.append(label)
66 continue
66 continue
67
67
68 x, pk, name = label.split('|')
68 x, pk, name = label.split('|')
69
69
70 if name=='codes':
70 if name=='codes':
71 value = [s for s in value.split('\r\n') if s]
71 value = [s for s in value.split('\r\n') if s]
72
72
73 if pk in line_data:
73 if pk in line_data:
74 line_data[pk][name] = value
74 line_data[pk][name] = value
75 else:
75 else:
76 line_data[pk] = {name:value}
76 line_data[pk] = {name:value}
77
77
78 form = USRPRXConfigurationForm(conf_data, instance=conf)
78 form = USRPRXConfigurationForm(conf_data, instance=conf)
79
79
80 if form.is_valid():
80 if form.is_valid():
81 form.save()
81 form.save()
82
82
83 messages.success(request, 'USRP Rx configuration successfully updated')
83 messages.success(request, 'USRP Rx configuration successfully updated')
84
84
85 return redirect(conf.get_absolute_url())
85 return redirect(conf.get_absolute_url())
86
86
87 kwargs = {}
87 kwargs = {}
88 kwargs['dev_conf'] = conf
88 kwargs['dev_conf'] = conf
89 kwargs['form'] = form
89 kwargs['form'] = form
90 kwargs['edit'] = True
90 kwargs['edit'] = True
91
91
92 kwargs['title'] = 'USRP Rx Configuration'
92 kwargs['title'] = 'USRP Rx Configuration'
93 kwargs['suptitle'] = 'Edit'
93 kwargs['suptitle'] = 'Edit'
94 kwargs['button'] = 'Update'
94 kwargs['button'] = 'Update'
95
95
96 return render(request, 'usrp_rx_conf_edit.html', kwargs)
96 return render(request, 'usrp_rx_conf_edit.html', kwargs)
97
97
98 def import_file(request, conf_id):
98 def import_file(request, conf_id):
99
99
100 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
100 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
101 if request.method=='POST':
101 if request.method=='POST':
102 form = USRPRXImportForm(request.POST, request.FILES)
102 form = USRPRXImportForm(request.POST, request.FILES)
103 if form.is_valid():
103 if form.is_valid():
104 try:
104 try:
105 data = conf.import_from_file(request.FILES['file_name'])
105 data = conf.import_from_file(request.FILES['file_name'])
106 conf.dict_to_parms(data)
106 conf.dict_to_parms(data)
107 conf.update_pulses()
107 conf.update_pulses()
108 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
108 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
109 return redirect(conf.get_absolute_url_edit())
109 return redirect(conf.get_absolute_url_edit())
110
110
111 except Exception as e:
111 except Exception as e:
112 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], repr(e)))
112 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], repr(e)))
113 else:
113 else:
114 messages.warning(request, 'Your current configuration will be replaced')
114 messages.warning(request, 'Your current configuration will be replaced')
115 form = USRPRXImportForm()
115 form = USRPRXImportForm()
116
116
117 kwargs = {}
117 kwargs = {}
118 kwargs['form'] = form
118 kwargs['form'] = form
119 kwargs['title'] = 'USRP Rx Configuration'
119 kwargs['title'] = 'USRP Rx Configuration'
120 kwargs['suptitle'] = 'Import file'
120 kwargs['suptitle'] = 'Import file'
121 kwargs['button'] = 'Upload'
121 kwargs['button'] = 'Upload'
122 kwargs['previous'] = conf.get_absolute_url()
122 kwargs['previous'] = conf.get_absolute_url()
123
123
124 return render(request, 'usrp_rx_import.html', kwargs)
124 return render(request, 'usrp_rx_import.html', kwargs)
125
125
126 def conf_raw(request, conf_id):
126 def conf_raw(request, conf_id):
127 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
127 conf = get_object_or_404(USRPRXConfiguration, pk=conf_id)
128 raw = conf.write_device(raw=True)
128 raw = conf.write_device(raw=True)
129 return HttpResponse(raw, content_type='application/json') No newline at end of file
129 return HttpResponse(raw, content_type='application/json')
@@ -1,158 +1,158
1 import os
1 import os
2 import json
2 import json
3 from queue import Empty
3 from queue import Empty
4
4
5 from django import forms
5 from django import forms
6 from django.utils.safestring import mark_safe
6 from django.utils.safestring import mark_safe
7 from apps.main.models import Device
7 from apps.main.models import Device
8 from apps.main.forms import add_empty_choice
8 from apps.main.forms import add_empty_choice
9 from .models import USRPTXConfiguration
9 from .models import USRPTXConfiguration
10
10
11 def create_choices_from_model(model, conf_id, all_choice=False):
11 def create_choices_from_model(model, conf_id, all_choice=False):
12
12
13 instance = globals()[model]
13 instance = globals()[model]
14 choices = instance.objects.all().values_list('pk', 'name')
14 choices = instance.objects.all().values_list('pk', 'name')
15
15
16 return choices
16 return choices
17
17
18 def validators_pulse_2(self, data):
18 def validators_pulse_2(self, data):
19 if data['enable_2'] is True and None in data.values():
19 if data['enable_2'] is True and None in data.values():
20 for key, value in data.items():
20 for key, value in data.items():
21 if value is None:
21 if value is None:
22 self._errors[key] = ["Ensure this value isn't empty."]
22 self._errors[key] = ["Ensure this value isn't empty."]
23
23
24 def validators_textarea(self,data):
24 def validators_textarea(self,data):
25 if data['code_type_1'].pk == 19 and data['code_1'] == '':
25 if data['code_type_1'].pk == 19 and data['code_1'] == '':
26 self._errors['code_1'] = ["Ensure this value isn't empty."]
26 self._errors['code_1'] = ["Ensure this value isn't empty."]
27
27
28 try:
28 try:
29 if data['code_type_2'].pk == 19 and data['code_2'] == '':
29 if data['code_type_2'].pk == 19 and data['code_2'] == '':
30 self._errors['code_2'] = ["Ensure this value isn't empty."]
30 self._errors['code_2'] = ["Ensure this value isn't empty."]
31 except:
31 except:
32 pass
32 pass
33
33
34 class USRPTXConfigurationForm(forms.ModelForm):
34 class USRPTXConfigurationForm(forms.ModelForm):
35
35
36 def __init__(self, *args, **kwargs):
36 def __init__(self, *args, **kwargs):
37 super(USRPTXConfigurationForm, self).__init__(*args, **kwargs)
37 super(USRPTXConfigurationForm, self).__init__(*args, **kwargs)
38
38
39 instance = getattr(self, 'instance', None)
39 instance = getattr(self, 'instance', None)
40
40
41 if instance and instance.pk:
41 if instance and instance.pk:
42
42
43 devices = Device.objects.filter(device_type__name='usrp_tx')
43 devices = Device.objects.filter(device_type__name='usrp_tx')
44 #if instance.experiment:
44 #if instance.experiment:
45 #self.fields['experiment'].widget.attrs['read_only'] = True
45 #self.fields['experiment'].widget.attrs['read_only'] = True
46 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
46 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
47 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
47 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
48
48
49 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
49 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
50 self.fields['experiment'].widget.attrs['readonly'] = True
50 self.fields['experiment'].widget.attrs['readonly'] = True
51
51
52 class Meta:
52 class Meta:
53 model = USRPTXConfiguration
53 model = USRPTXConfiguration
54 exclude = ('type', 'parameters', 'status', 'total_units', 'author', 'hash')
54 exclude = ('type', 'parameters', 'status', 'total_units', 'author', 'hash')
55
55
56 def clean(self):
56 def clean(self):
57 form_data = super(USRPTXConfigurationForm, self).clean()
57 form_data = super(USRPTXConfigurationForm, self).clean()
58
58
59 kwargs_check_pulse2 = {}
59 kwargs_check_pulse2 = {}
60 kwargs_check_pulse2['enable_2'] = form_data.get('enable_2')
60 kwargs_check_pulse2['enable_2'] = form_data.get('enable_2')
61 kwargs_check_pulse2['pulse_2'] = form_data.get('pulse_2')
61 kwargs_check_pulse2['pulse_2'] = form_data.get('pulse_2')
62 kwargs_check_pulse2['code_type_2'] = form_data.get('code_type_2')
62 kwargs_check_pulse2['code_type_2'] = form_data.get('code_type_2')
63 kwargs_check_pulse2['repetitions_2'] = form_data.get('repetitions_2')
63 kwargs_check_pulse2['repetitions_2'] = form_data.get('repetitions_2')
64 validators_pulse_2(self, kwargs_check_pulse2)
64 validators_pulse_2(self, kwargs_check_pulse2)
65
65
66 kwargs_check_textarea = {}
66 kwargs_check_textarea = {}
67 kwargs_check_textarea['code_type_1'] = form_data.get('code_type_1')
67 kwargs_check_textarea['code_type_1'] = form_data.get('code_type_1')
68 kwargs_check_textarea['code_1'] = form_data.get('code_1')
68 kwargs_check_textarea['code_1'] = form_data.get('code_1')
69 kwargs_check_textarea['code_type_2'] = form_data.get('code_type_2')
69 kwargs_check_textarea['code_type_2'] = form_data.get('code_type_2')
70 kwargs_check_textarea['code_2'] = form_data.get('code_2')
70 kwargs_check_textarea['code_2'] = form_data.get('code_2')
71 validators_textarea(self, kwargs_check_textarea)
71 validators_textarea(self, kwargs_check_textarea)
72
72
73 return form_data
73 return form_data
74
74
75 def save(self, *args, **kwargs):
75 def save(self, *args, **kwargs):
76 conf = super(USRPTXConfigurationForm, self).save(*args, **kwargs)
76 conf = super(USRPTXConfigurationForm, self).save(*args, **kwargs)
77 conf.save()
77 conf.save()
78 return conf
78 return conf
79
79
80 class USRPTXEditionForm(forms.ModelForm):
80 class USRPTXEditionForm(forms.ModelForm):
81
81
82 def __init__(self, *args, **kwargs):
82 def __init__(self, *args, **kwargs):
83 super(USRPTXEditionForm, self).__init__(*args, **kwargs)
83 super(USRPTXEditionForm, self).__init__(*args, **kwargs)
84
84
85 instance = getattr(self, 'instance', None)
85 instance = getattr(self, 'instance', None)
86
86
87 if instance and instance.pk:
87 if instance and instance.pk:
88
88
89 devices = Device.objects.filter(device_type__name='usrp_tx')
89 devices = Device.objects.filter(device_type__name='usrp_tx')
90 #if instance.experiment:
90 #if instance.experiment:
91 #self.fields['experiment'].widget.attrs['read_only'] = True
91 #self.fields['experiment'].widget.attrs['read_only'] = True
92 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
92 #self.fields['experiment'].widget.choices = [(instance.experiment.id, instance.experiment)]
93 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
93 #self.fields['device'].widget.choices = [(device.id, device) for device in devices]
94
94
95 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
95 if 'initial' in kwargs and 'experiment' in kwargs['initial'] and kwargs['initial']['experiment'] not in (0, '0'):
96 self.fields['experiment'].widget.attrs['readonly'] = True
96 self.fields['experiment'].widget.attrs['readonly'] = True
97
97
98 class Meta:
98 class Meta:
99 model = USRPTXConfiguration
99 model = USRPTXConfiguration
100 exclude = ('template', 'device', 'label', 'ip_address', 'daughterboard', 'antenna', 'type', 'parameters', 'status', 'total_units', 'author', 'hash')
100 exclude = ('template', 'device', 'label', 'type', 'parameters', 'status', 'total_units', 'author', 'hash')
101
101
102 def clean(self):
102 def clean(self):
103 form_data = super(USRPTXEditionForm, self).clean()
103 form_data = super(USRPTXEditionForm, self).clean()
104
104
105 kwargs_check_pulse2 = {}
105 kwargs_check_pulse2 = {}
106 kwargs_check_pulse2['enable_2'] = form_data.get('enable_2')
106 kwargs_check_pulse2['enable_2'] = form_data.get('enable_2')
107 kwargs_check_pulse2['pulse_2'] = form_data.get('pulse_2')
107 kwargs_check_pulse2['pulse_2'] = form_data.get('pulse_2')
108 kwargs_check_pulse2['code_type_2'] = form_data.get('code_type_2')
108 kwargs_check_pulse2['code_type_2'] = form_data.get('code_type_2')
109 kwargs_check_pulse2['repetitions_2'] = form_data.get('repetitions_2')
109 kwargs_check_pulse2['repetitions_2'] = form_data.get('repetitions_2')
110 validators_pulse_2(self, kwargs_check_pulse2)
110 validators_pulse_2(self, kwargs_check_pulse2)
111
111
112 kwargs_check_textarea = {}
112 kwargs_check_textarea = {}
113 kwargs_check_textarea['code_type_1'] = form_data.get('code_type_1')
113 kwargs_check_textarea['code_type_1'] = form_data.get('code_type_1')
114 kwargs_check_textarea['code_1'] = form_data.get('code_1')
114 kwargs_check_textarea['code_1'] = form_data.get('code_1')
115 kwargs_check_textarea['code_type_2'] = form_data.get('code_type_2')
115 kwargs_check_textarea['code_type_2'] = form_data.get('code_type_2')
116 kwargs_check_textarea['code_2'] = form_data.get('code_2')
116 kwargs_check_textarea['code_2'] = form_data.get('code_2')
117 validators_textarea(self, kwargs_check_textarea)
117 validators_textarea(self, kwargs_check_textarea)
118
118
119 return form_data
119 return form_data
120
120
121 def save(self, *args, **kwargs):
121 def save(self, *args, **kwargs):
122 conf = super(USRPTXEditionForm, self).save(*args, **kwargs)
122 conf = super(USRPTXEditionForm, self).save(*args, **kwargs)
123 conf.save()
123 conf.save()
124 return conf
124 return conf
125
125
126 class ExtFileField(forms.FileField):
126 class ExtFileField(forms.FileField):
127 """
127 """
128 Same as forms.FileField, but you can specify a file extension whitelist.
128 Same as forms.FileField, but you can specify a file extension whitelist.
129
129
130 >>> from django.core.files.uploadedfile import SimpleUploadedFile
130 >>> from django.core.files.uploadedfile import SimpleUploadedFile
131 >>>
131 >>>
132 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
132 >>> t = ExtFileField(ext_whitelist=(".pdf", ".txt"))
133 >>>
133 >>>
134 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
134 >>> t.clean(SimpleUploadedFile('filename.pdf', 'Some File Content'))
135 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
135 >>> t.clean(SimpleUploadedFile('filename.txt', 'Some File Content'))
136 >>>
136 >>>
137 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
137 >>> t.clean(SimpleUploadedFile('filename.exe', 'Some File Content'))
138 Traceback (most recent call last):
138 Traceback (most recent call last):
139 ...
139 ...
140 ValidationError: [u'Not allowed filetype!']
140 ValidationError: [u'Not allowed filetype!']
141 """
141 """
142 def __init__(self, *args, **kwargs):
142 def __init__(self, *args, **kwargs):
143 extensions = kwargs.pop("extensions")
143 extensions = kwargs.pop("extensions")
144 self.extensions = [i.lower() for i in extensions]
144 self.extensions = [i.lower() for i in extensions]
145
145
146 super(ExtFileField, self).__init__(*args, **kwargs)
146 super(ExtFileField, self).__init__(*args, **kwargs)
147
147
148 def clean(self, *args, **kwargs):
148 def clean(self, *args, **kwargs):
149 data = super(ExtFileField, self).clean(*args, **kwargs)
149 data = super(ExtFileField, self).clean(*args, **kwargs)
150 filename = data.name
150 filename = data.name
151 ext = os.path.splitext(filename)[1]
151 ext = os.path.splitext(filename)[1]
152 ext = ext.lower()
152 ext = ext.lower()
153 if ext not in self.extensions:
153 if ext not in self.extensions:
154 raise forms.ValidationError('Not allowed file type: %s' % ext)
154 raise forms.ValidationError('Not allowed file type: %s' % ext)
155
155
156 class USRPTXImportForm(forms.Form):
156 class USRPTXImportForm(forms.Form):
157
157
158 file_name = ExtFileField(extensions=['.racp', '.json', '.dat']) No newline at end of file
158 file_name = ExtFileField(extensions=['.racp', '.json', '.dat'])
General Comments 0
You need to be logged in to leave comments. Login now