@@ -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 |
|
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 |
|
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