##// END OF EJS Templates
Avance scheduler
Renato Huallpa -
r388:7b60d9ecd28a
parent child
Show More
@@ -1,1082 +1,1082
1 from django.db import models
1 from django.db import models
2 from apps.main.models import Configuration , User
2 from apps.main.models import Configuration , User
3 from django.urls import reverse
3 from django.urls import reverse
4 from celery.execute import send_task
4 from celery.execute import send_task
5 from datetime import datetime
5 from datetime import datetime
6 import ast
6 import ast
7 import socket
7 import socket
8 import json
8 import json
9 import requests
9 import requests
10 import struct
10 import struct
11 import os, sys, time
11 import os, sys, time
12
12
13 from .mqtt import client as mqtt_client
13 from .mqtt import client as mqtt_client
14 from radarsys.socketconfig import sio as sio
14 from radarsys.socketconfig import sio as sio
15 import json
15 import json
16
16
17 antenna_default = json.dumps({
17 antenna_default = json.dumps({
18 "antenna_up": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
18 "antenna_up": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
19 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
19 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
20 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
20 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
21 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
21 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
22 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
22 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
23 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
23 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
24 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
24 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
25 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0]
25 [0.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0]
26 ]
26 ]
27 ,
27 ,
28 "antenna_down": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
28 "antenna_down": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
29 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
29 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
30 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
30 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
31 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
31 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
32 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
32 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
33 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
33 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
34 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
34 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
35 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0]],
35 [0.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0]],
36 })
36 })
37
37
38
38
39 tx_default = json.dumps({
39 tx_default = json.dumps({
40 "up": [[1,1,1,1,0,0,0,0],
40 "up": [[1,1,1,1,0,0,0,0],
41 [1,1,1,1,0,0,0,0],
41 [1,1,1,1,0,0,0,0],
42 [1,1,1,1,0,0,0,0],
42 [1,1,1,1,0,0,0,0],
43 [1,1,1,1,0,0,0,0],
43 [1,1,1,1,0,0,0,0],
44 [0,0,0,0,1,1,1,1],
44 [0,0,0,0,1,1,1,1],
45 [0,0,0,0,1,1,1,1],
45 [0,0,0,0,1,1,1,1],
46 [0,0,0,0,1,1,1,1],
46 [0,0,0,0,1,1,1,1],
47 [0,0,0,0,1,1,1,1]],
47 [0,0,0,0,1,1,1,1]],
48
48
49 "down": [[1,1,1,1,0,0,0,0],
49 "down": [[1,1,1,1,0,0,0,0],
50 [1,1,1,1,0,0,0,0],
50 [1,1,1,1,0,0,0,0],
51 [1,1,1,1,0,0,0,0],
51 [1,1,1,1,0,0,0,0],
52 [1,1,1,1,0,0,0,0],
52 [1,1,1,1,0,0,0,0],
53 [0,0,0,0,1,1,1,1],
53 [0,0,0,0,1,1,1,1],
54 [0,0,0,0,1,1,1,1],
54 [0,0,0,0,1,1,1,1],
55 [0,0,0,0,1,1,1,1],
55 [0,0,0,0,1,1,1,1],
56 [0,0,0,0,1,1,1,1]],
56 [0,0,0,0,1,1,1,1]],
57 })
57 })
58
58
59 rx_default = json.dumps({
59 rx_default = json.dumps({
60 "up": [[1,1,1,1,0,0,0,0],
60 "up": [[1,1,1,1,0,0,0,0],
61 [1,1,1,1,0,0,0,0],
61 [1,1,1,1,0,0,0,0],
62 [1,1,1,1,0,0,0,0],
62 [1,1,1,1,0,0,0,0],
63 [1,1,1,1,0,0,0,0],
63 [1,1,1,1,0,0,0,0],
64 [0,0,0,0,1,1,1,1],
64 [0,0,0,0,1,1,1,1],
65 [0,0,0,0,1,1,1,1],
65 [0,0,0,0,1,1,1,1],
66 [0,0,0,0,1,1,1,1],
66 [0,0,0,0,1,1,1,1],
67 [0,0,0,0,1,1,1,1]],
67 [0,0,0,0,1,1,1,1]],
68
68
69 "down": [[1,1,1,1,0,0,0,0],
69 "down": [[1,1,1,1,0,0,0,0],
70 [1,1,1,1,0,0,0,0],
70 [1,1,1,1,0,0,0,0],
71 [1,1,1,1,0,0,0,0],
71 [1,1,1,1,0,0,0,0],
72 [1,1,1,1,0,0,0,0],
72 [1,1,1,1,0,0,0,0],
73 [0,0,0,0,1,1,1,1],
73 [0,0,0,0,1,1,1,1],
74 [0,0,0,0,1,1,1,1],
74 [0,0,0,0,1,1,1,1],
75 [0,0,0,0,1,1,1,1],
75 [0,0,0,0,1,1,1,1],
76 [0,0,0,0,1,1,1,1]],
76 [0,0,0,0,1,1,1,1]],
77 })
77 })
78
78
79 status_default = '0000000000000000000000000000000000000000000000000000000000000000'
79 status_default = '0000000000000000000000000000000000000000000000000000000000000000'
80 default_messages = {}
80 default_messages = {}
81
81
82 for i in range(1,65):
82 for i in range(1,65):
83 default_messages[str(i)] = "Module "+str(i)
83 default_messages[str(i)] = "Module "+str(i)
84
84
85
85
86 ues_default = json.dumps({
86 ues_default = json.dumps({
87 "up": [0.533333,0.00000,1.06667,0.00000],
87 "up": [0.533333,0.00000,1.06667,0.00000],
88 "down": [0.533333,0.00000,1.06667,0.00000]
88 "down": [0.533333,0.00000,1.06667,0.00000]
89 })
89 })
90
90
91 onlyrx_default = json.dumps({
91 onlyrx_default = json.dumps({
92 "up": False,
92 "up": False,
93 "down": False
93 "down": False
94 })
94 })
95
95
96 def up_convertion(cadena):
96 def up_convertion(cadena):
97 valores = []
97 valores = []
98 for c in cadena:
98 for c in cadena:
99 if c == 1.0: valores=valores+['000']
99 if c == 1.0: valores=valores+['000']
100 if c == 2.0: valores=valores+['001']
100 if c == 2.0: valores=valores+['001']
101 if c == 3.0: valores=valores+['010']
101 if c == 3.0: valores=valores+['010']
102 if c == 0.0: valores=valores+['011']
102 if c == 0.0: valores=valores+['011']
103 if c == 0.5: valores=valores+['100']
103 if c == 0.5: valores=valores+['100']
104 if c == 1.5: valores=valores+['101']
104 if c == 1.5: valores=valores+['101']
105 if c == 2.5: valores=valores+['110']
105 if c == 2.5: valores=valores+['110']
106 if c == 3.5: valores=valores+['111']
106 if c == 3.5: valores=valores+['111']
107
107
108 return valores
108 return valores
109
109
110 def up_conv_bits(value):
110 def up_conv_bits(value):
111
111
112 if value == 1.0: bits="000"
112 if value == 1.0: bits="000"
113 if value == 2.0: bits="001"
113 if value == 2.0: bits="001"
114 if value == 3.0: bits="010"
114 if value == 3.0: bits="010"
115 if value == 0.0: bits="011"
115 if value == 0.0: bits="011"
116 if value == 0.5: bits="100"
116 if value == 0.5: bits="100"
117 if value == 1.5: bits="101"
117 if value == 1.5: bits="101"
118 if value == 2.5: bits="110"
118 if value == 2.5: bits="110"
119 if value == 3.5: bits="111"
119 if value == 3.5: bits="111"
120
120
121 return bits
121 return bits
122
122
123 def down_convertion(cadena):
123 def down_convertion(cadena):
124 valores = []
124 valores = []
125 for c in cadena:
125 for c in cadena:
126 if c == 1.0: valores=valores+['000']
126 if c == 1.0: valores=valores+['000']
127 if c == 2.0: valores=valores+['001']
127 if c == 2.0: valores=valores+['001']
128 if c == 3.0: valores=valores+['010']
128 if c == 3.0: valores=valores+['010']
129 if c == 0.0: valores=valores+['011']
129 if c == 0.0: valores=valores+['011']
130 if c == 0.5: valores=valores+['100']
130 if c == 0.5: valores=valores+['100']
131 if c == 1.5: valores=valores+['101']
131 if c == 1.5: valores=valores+['101']
132 if c == 2.5: valores=valores+['110']
132 if c == 2.5: valores=valores+['110']
133 if c == 3.5: valores=valores+['111']
133 if c == 3.5: valores=valores+['111']
134
134
135 return valores
135 return valores
136
136
137 def down_conv_bits(value):
137 def down_conv_bits(value):
138
138
139 if value == 1.0: bits="000"
139 if value == 1.0: bits="000"
140 if value == 2.0: bits="001"
140 if value == 2.0: bits="001"
141 if value == 3.0: bits="010"
141 if value == 3.0: bits="010"
142 if value == 0.0: bits="011"
142 if value == 0.0: bits="011"
143 if value == 0.5: bits="100"
143 if value == 0.5: bits="100"
144 if value == 1.5: bits="101"
144 if value == 1.5: bits="101"
145 if value == 2.5: bits="110"
145 if value == 2.5: bits="110"
146 if value == 3.5: bits="111"
146 if value == 3.5: bits="111"
147
147
148 return bits
148 return bits
149
149
150 def up_conv_value(bits):
150 def up_conv_value(bits):
151
151
152 if bits == "000": value=1.0
152 if bits == "000": value=1.0
153 if bits == "001": value=2.0
153 if bits == "001": value=2.0
154 if bits == "010": value=3.0
154 if bits == "010": value=3.0
155 if bits == "011": value=0.0
155 if bits == "011": value=0.0
156 if bits == "100": value=0.5
156 if bits == "100": value=0.5
157 if bits == "101": value=1.5
157 if bits == "101": value=1.5
158 if bits == "110": value=2.5
158 if bits == "110": value=2.5
159 if bits == "111": value=3.5
159 if bits == "111": value=3.5
160
160
161 return value
161 return value
162
162
163 def down_conv_value(bits):
163 def down_conv_value(bits):
164
164
165 if bits == "000": value=1.0
165 if bits == "000": value=1.0
166 if bits == "001": value=2.0
166 if bits == "001": value=2.0
167 if bits == "010": value=3.0
167 if bits == "010": value=3.0
168 if bits == "011": value=0.0
168 if bits == "011": value=0.0
169 if bits == "100": value=0.5
169 if bits == "100": value=0.5
170 if bits == "101": value=1.5
170 if bits == "101": value=1.5
171 if bits == "110": value=2.5
171 if bits == "110": value=2.5
172 if bits == "111": value=3.5
172 if bits == "111": value=3.5
173
173
174 return value
174 return value
175
175
176 def ip2position(module_number):
176 def ip2position(module_number):
177 j=0
177 j=0
178 i=0
178 i=0
179 for x in range(0,module_number-1):
179 for x in range(0,module_number-1):
180 j=j+1
180 j=j+1
181 if j==8:
181 if j==8:
182 i=i+1
182 i=i+1
183 j=0
183 j=0
184
184
185 pos = [i,j]
185 pos = [i,j]
186 return pos
186 return pos
187
187
188
188
189 def fromBinary2Char(binary_string):
189 def fromBinary2Char(binary_string):
190 number = int(binary_string, 2)
190 number = int(binary_string, 2)
191 #Plus 33 to avoid more than 1 characters values such as: '\x01'-'\x1f'
191 #Plus 33 to avoid more than 1 characters values such as: '\x01'-'\x1f'
192 number = number + 33
192 number = number + 33
193 char = chr(number)
193 char = chr(number)
194 return char
194 return char
195
195
196 def fromChar2Binary(char):
196 def fromChar2Binary(char):
197 number = ord(char) - 33
197 number = ord(char) - 33
198 #Minus 33 to get the real value
198 #Minus 33 to get the real value
199 bits = bin(number)[2:]
199 bits = bin(number)[2:]
200 #To ensure we have a string with 6bits
200 #To ensure we have a string with 6bits
201 if len(bits) < 6:
201 if len(bits) < 6:
202 bits = bits.zfill(6)
202 bits = bits.zfill(6)
203 return bits
203 return bits
204
204
205 OPERATION_MODES = (
205 OPERATION_MODES = (
206 (0, 'Manual'),
206 (0, 'Manual'),
207 (1, 'Automatic'),
207 (1, 'Automatic'),
208 )
208 )
209
209
210 class ABSConfiguration(Configuration):
210 class ABSConfiguration(Configuration):
211 active_beam = models.PositiveSmallIntegerField(verbose_name='Active Beam', default=0)
211 active_beam = models.PositiveSmallIntegerField(verbose_name='Active Beam', default=0)
212 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=status_default)
212 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=status_default)
213 operation_mode = models.PositiveSmallIntegerField(verbose_name='Operation Mode', choices=OPERATION_MODES, default = 0)
213 operation_mode = models.PositiveSmallIntegerField(verbose_name='Operation Mode', choices=OPERATION_MODES, default = 0)
214 operation_value = models.FloatField(verbose_name='Periodic (seconds)', default="10", null=True, blank=True)
214 operation_value = models.FloatField(verbose_name='Periodic (seconds)', default="10", null=True, blank=True)
215 module_messages = models.CharField(verbose_name='Modules Messages', max_length=10000, default=json.dumps(default_messages))
215 module_messages = models.CharField(verbose_name='Modules Messages', max_length=10000, default=json.dumps(default_messages))
216
216
217 class Meta:
217 class Meta:
218 db_table = 'abs_configurations'
218 db_table = 'abs_configurations'
219
219
220 def get_absolute_url_plot(self):
220 def get_absolute_url_plot(self):
221 return reverse('url_plot_abs_patterns', args=[str(self.id)])
221 return reverse('url_plot_abs_patterns', args=[str(self.id)])
222
222
223
223
224 def parms_to_dict(self):
224 def parms_to_dict(self):
225
225
226 parameters = {}
226 parameters = {}
227
227
228 parameters['device_id'] = self.device.id
228 parameters['device_id'] = self.device.id
229 parameters['label'] = self.label
229 parameters['label'] = self.label
230 parameters['device_type'] = self.device.device_type.name
230 parameters['device_type'] = self.device.device_type.name
231 parameters['beams'] = {}
231 parameters['beams'] = {}
232
232
233 beams = ABSBeam.objects.filter(abs_conf=self)
233 beams = ABSBeam.objects.filter(abs_conf=self)
234 b=1
234 b=1
235 for beam in beams:
235 for beam in beams:
236 #absbeam = ABSBeam.objects.get(pk=beams[beam])
236 #absbeam = ABSBeam.objects.get(pk=beams[beam])
237 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
237 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
238 b+=1
238 b+=1
239
239
240 return parameters
240 return parameters
241
241
242
242
243 def dict_to_parms(self, parameters):
243 def dict_to_parms(self, parameters):
244
244
245 self.label = parameters['label']
245 self.label = parameters['label']
246
246
247 absbeams = ABSBeam.objects.filter(abs_conf=self)
247 absbeams = ABSBeam.objects.filter(abs_conf=self)
248 beams = parameters['beams']
248 beams = parameters['beams']
249
249
250 if absbeams:
250 if absbeams:
251 beams_number = len(beams)
251 beams_number = len(beams)
252 absbeams_number = len(absbeams)
252 absbeams_number = len(absbeams)
253 if beams_number==absbeams_number:
253 if beams_number==absbeams_number:
254 i = 1
254 i = 1
255 for absbeam in absbeams:
255 for absbeam in absbeams:
256 absbeam.dict_to_parms(beams['beam'+str(i)])
256 absbeam.dict_to_parms(beams['beam'+str(i)])
257 i = i+1
257 i = i+1
258 elif beams_number > absbeams_number:
258 elif beams_number > absbeams_number:
259 i = 1
259 i = 1
260 for absbeam in absbeams:
260 for absbeam in absbeams:
261 absbeam.dict_to_parms(beams['beam'+str(i)])
261 absbeam.dict_to_parms(beams['beam'+str(i)])
262 i=i+1
262 i=i+1
263 for x in range(i,beams_number+1):
263 for x in range(i,beams_number+1):
264 new_beam = ABSBeam(
264 new_beam = ABSBeam(
265 name =beams['beam'+str(i)]['name'],
265 name =beams['beam'+str(i)]['name'],
266 antenna =json.dumps(beams['beam'+str(i)]['antenna']),
266 antenna =json.dumps(beams['beam'+str(i)]['antenna']),
267 abs_conf = self,
267 abs_conf = self,
268 tx =json.dumps(beams['beam'+str(i)]['tx']),
268 tx =json.dumps(beams['beam'+str(i)]['tx']),
269 rx =json.dumps(beams['beam'+str(i)]['rx']),
269 rx =json.dumps(beams['beam'+str(i)]['rx']),
270 ues =json.dumps(beams['beam'+str(i)]['ues']),
270 ues =json.dumps(beams['beam'+str(i)]['ues']),
271 only_rx =json.dumps(beams['beam'+str(i)]['only_rx'])
271 only_rx =json.dumps(beams['beam'+str(i)]['only_rx'])
272 )
272 )
273 new_beam.save()
273 new_beam.save()
274 i=i+1
274 i=i+1
275 else: #beams_number < absbeams_number:
275 else: #beams_number < absbeams_number:
276 i = 1
276 i = 1
277 for absbeam in absbeams:
277 for absbeam in absbeams:
278 if i <= beams_number:
278 if i <= beams_number:
279 absbeam.dict_to_parms(beams['beam'+str(i)])
279 absbeam.dict_to_parms(beams['beam'+str(i)])
280 i=i+1
280 i=i+1
281 else:
281 else:
282 absbeam.delete()
282 absbeam.delete()
283 else:
283 else:
284 for beam in beams:
284 for beam in beams:
285 new_beam = ABSBeam(
285 new_beam = ABSBeam(
286 name =beams[beam]['name'],
286 name =beams[beam]['name'],
287 antenna =json.dumps(beams[beam]['antenna']),
287 antenna =json.dumps(beams[beam]['antenna']),
288 abs_conf = self,
288 abs_conf = self,
289 tx =json.dumps(beams[beam]['tx']),
289 tx =json.dumps(beams[beam]['tx']),
290 rx =json.dumps(beams[beam]['rx']),
290 rx =json.dumps(beams[beam]['rx']),
291 ues =json.dumps(beams[beam]['ues']),
291 ues =json.dumps(beams[beam]['ues']),
292 only_rx =json.dumps(beams[beam]['only_rx'])
292 only_rx =json.dumps(beams[beam]['only_rx'])
293 )
293 )
294 new_beam.save()
294 new_beam.save()
295
295
296
296
297
297
298 def update_from_file(self, parameters):
298 def update_from_file(self, parameters):
299
299
300 self.dict_to_parms(parameters)
300 self.dict_to_parms(parameters)
301 self.save()
301 self.save()
302
302
303
303
304 def get_beams(self, **kwargs):
304 def get_beams(self, **kwargs):
305 '''
305 '''
306 This function returns ABS Configuration beams
306 This function returns ABS Configuration beams
307 '''
307 '''
308 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
308 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
309
309
310 def clone(self, **kwargs):
310 def clone(self, **kwargs):
311
311
312 beams = self.get_beams()
312 beams = self.get_beams()
313 self.pk = None
313 self.pk = None
314 self.id = None
314 self.id = None
315 for attr, value in kwargs.items():
315 for attr, value in kwargs.items():
316 setattr(self, attr, value)
316 setattr(self, attr, value)
317 self.save()
317 self.save()
318
318
319 for beam in beams:
319 for beam in beams:
320 beam.clone(abs_conf=self)
320 beam.clone(abs_conf=self)
321
321
322 #-----For Active Beam-----
322 #-----For Active Beam-----
323 new_beams = ABSBeam.objects.filter(abs_conf=self)
323 new_beams = ABSBeam.objects.filter(abs_conf=self)
324 self.active_beam = new_beams[0].id
324 self.active_beam = new_beams[0].id
325 self.save()
325 self.save()
326 #-----For Active Beam-----
326 #-----For Active Beam-----
327 #-----For Device Status---
327 #-----For Device Status---
328 self.device.status = 3
328 self.device.status = 3
329 self.device.save()
329 self.device.save()
330 #-----For Device Status---
330 #-----For Device Status---
331
331
332 return self
332 return self
333
333
334
334
335 def start_device(self):
335 def start_device(self):
336
336
337 if self.device.status == 3:
337 if self.device.status == 3:
338
338
339 try:
339 try:
340 #self.write_device()
340 #self.write_device()
341 send_task('task_change_beam', [self.id],)
341 send_task('task_change_beam', [self.id],)
342 self.message = 'ABS running'
342 self.message = 'ABS running'
343
343
344 except Exception as e:
344 except Exception as e:
345 self.message = str(e)
345 self.message = str(e)
346 return False
346 return False
347
347
348 return True
348 return True
349
349
350 else:
350 else:
351 self.message = 'Please, select Write ABS Device first.'
351 self.message = 'Please, select Write ABS Device first.'
352 return False
352 return False
353
353
354
354
355 def stop_device(self):
355 def stop_device(self):
356
356 print("estoy en ABS models")
357 self.device.status = 2
357 self.device.status = 2
358 self.device.save()
358 self.device.save()
359 self.message = 'ABS has been stopped.'
359 self.message = 'ABS has been stopped.'
360 self.save()
360 self.save()
361
361
362 return True
362 return True
363
363
364 def stop_device_mqtt(self):
364 def stop_device_mqtt(self):
365
365
366 self.device.status = 2
366 self.device.status = 2
367 self.device.save()
367 self.device.save()
368 self.message = 'ABS has been stopped.'
368 self.message = 'ABS has been stopped.'
369 self.save()
369 self.save()
370
370
371 mqtt_client.publish(os.environ.get('TOPIC_ABS', 'abs/beams'),"STOP")
371 mqtt_client.publish(os.environ.get('TOPIC_ABS', 'abs/beams'),"STOP")
372
372
373 return True
373 return True
374
374
375 def write_device(self):
375 def write_device(self):
376
376
377 """
377 """
378 This function sends the beams list to every abs module.
378 This function sends the beams list to every abs module.
379 It needs 'module_conf' function
379 It needs 'module_conf' function
380 """
380 """
381 print("Write 3")
381 print("Write 3")
382
382
383 beams = ABSBeam.objects.filter(abs_conf=self)
383 beams = ABSBeam.objects.filter(abs_conf=self)
384 nbeams = len(beams)
384 nbeams = len(beams)
385
385
386 # Se manda a cero RC para poder realizar cambio de beam
386 # Se manda a cero RC para poder realizar cambio de beam
387 if self.experiment is None:
387 if self.experiment is None:
388 confs = []
388 confs = []
389 else:
389 else:
390 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
390 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
391 confdds = ''
391 confdds = ''
392 confjars = ''
392 confjars = ''
393 confrc = ''
393 confrc = ''
394 #TO STOP DEVICES: DDS-JARS-RC
394 #TO STOP DEVICES: DDS-JARS-RC
395 for i in range(0,len(confs)):
395 for i in range(0,len(confs)):
396 if i==0:
396 if i==0:
397 for conf in confs:
397 for conf in confs:
398 if conf.device.device_type.name == 'dds':
398 if conf.device.device_type.name == 'dds':
399 confdds = conf
399 confdds = conf
400 confdds.stop_device()
400 confdds.stop_device()
401 break
401 break
402 if i==1:
402 if i==1:
403 for conf in confs:
403 for conf in confs:
404 if conf.device.device_type.name == 'jars':
404 if conf.device.device_type.name == 'jars':
405 confjars = conf
405 confjars = conf
406 confjars.stop_device()
406 confjars.stop_device()
407 break
407 break
408 if i==2:
408 if i==2:
409 for conf in confs:
409 for conf in confs:
410 if conf.device.device_type.name == 'rc':
410 if conf.device.device_type.name == 'rc':
411 confrc = conf
411 confrc = conf
412 confrc.stop_device()
412 confrc.stop_device()
413 break
413 break
414
414
415 '''
415 '''
416 if self.connected_modules() == 0 :
416 if self.connected_modules() == 0 :
417 print("No encuentra modulos")
417 print("No encuentra modulos")
418 self.message = "No ABS Module detected."
418 self.message = "No ABS Module detected."
419 return False
419 return False
420 '''
420 '''
421 #-------------Write each abs module-----------
421 #-------------Write each abs module-----------
422
422
423 if beams:
423 if beams:
424 block_id = 0
424 block_id = 0
425 message = 'SNDF{:03d}{:02d}{:02d}'.format(nbeams, nbeams, block_id)
425 message = 'SNDF{:03d}{:02d}{:02d}'.format(nbeams, nbeams, block_id)
426 for i, status in enumerate(self.module_status):
426 for i, status in enumerate(self.module_status):
427 message += ''.join([fromBinary2Char(beam.module_6bits(i)) for beam in beams])
427 message += ''.join([fromBinary2Char(beam.module_6bits(i)) for beam in beams])
428 status = ['0'] * 64
428 status = ['0'] * 64
429 n = 0
429 n = 0
430
430
431 print("Llega una antes entrar a multicast4")
431 print("Llega una antes entrar a multicast4")
432
432
433 sock = self.send_multicast(message)
433 sock = self.send_multicast(message)
434
434
435 while True:
435 while True:
436 #for i in range(32):
436 #for i in range(32):
437 try:
437 try:
438 data, address = sock.recvfrom(1024)
438 data, address = sock.recvfrom(1024)
439 print (address, data)
439 print (address, data)
440 data = data.decode("utf-8")
440 data = data.decode("utf-8")
441 if data == '1':
441 if data == '1':
442 status[int(address[0][10:])-1] = '3'
442 status[int(address[0][10:])-1] = '3'
443 #print (int(address[0][10:])-1)
443 #print (int(address[0][10:])-1)
444 elif data == '0':
444 elif data == '0':
445 status[int(address[0][10:])-1] = '1'
445 status[int(address[0][10:])-1] = '1'
446 except socket.timeout:
446 except socket.timeout:
447 print('Timeout')
447 print('Timeout')
448 break
448 break
449 except Exception as e:
449 except Exception as e:
450 print ('Error {}'.format(e))
450 print ('Error {}'.format(e))
451 n += 1
451 n += 1
452 sock.close()
452 sock.close()
453 else:
453 else:
454 self.message = "ABS Configuration does not have beams"
454 self.message = "ABS Configuration does not have beams"
455 print('No beams')
455 print('No beams')
456 #Start DDS-RC-JARS
456 #Start DDS-RC-JARS
457 if confdds:
457 if confdds:
458 confdds.start_device()
458 confdds.start_device()
459 if confrc:
459 if confrc:
460 #print confrc
460 #print confrc
461 confrc.start_device()
461 confrc.start_device()
462 if confjars:
462 if confjars:
463 confjars.start_device()
463 confjars.start_device()
464 return False
464 return False
465
465
466 if n == 64:
466 if n == 64:
467 self.message = "Could not write ABS Modules"
467 self.message = "Could not write ABS Modules"
468 self.device.status = 0
468 self.device.status = 0
469 self.module_status = ''.join(status)
469 self.module_status = ''.join(status)
470 self.save()
470 self.save()
471 print('Could not write ABS')
471 print('Could not write ABS')
472 #Start DDS-RC-JARS
472 #Start DDS-RC-JARS
473 if confdds:
473 if confdds:
474 confdds.start_device()
474 confdds.start_device()
475 if confrc:
475 if confrc:
476 #print confrc
476 #print confrc
477 confrc.start_device()
477 confrc.start_device()
478 if confjars:
478 if confjars:
479 confjars.start_device()
479 confjars.start_device()
480 return False
480 return False
481 else:
481 else:
482 self.message = "ABS Beams List have been sent to ABS Modules"
482 self.message = "ABS Beams List have been sent to ABS Modules"
483 print('ABS beams list sent')
483 print('ABS beams list sent')
484 self.active_beam = beams[0].pk
484 self.active_beam = beams[0].pk
485
485
486 #Start DDS-RC-JARS
486 #Start DDS-RC-JARS
487 if confdds:
487 if confdds:
488 confdds.start_device()
488 confdds.start_device()
489 if confrc:
489 if confrc:
490 #print confrc
490 #print confrc
491 confrc.start_device()
491 confrc.start_device()
492 if confjars:
492 if confjars:
493 confjars.start_device()
493 confjars.start_device()
494
494
495 print('Inicia intento de salvar device.status')
495 print('Inicia intento de salvar device.status')
496 self.device.status = 3
496 self.device.status = 3
497 self.module_status = ''.join(status)
497 self.module_status = ''.join(status)
498 #print(status)
498 #print(status)
499 self.save()
499 self.save()
500 print('Estatus salvado')
500 print('Estatus salvado')
501 conf_active, __ = ABSActive.objects.get_or_create(pk=1)
501 conf_active, __ = ABSActive.objects.get_or_create(pk=1)
502 conf_active.conf = self
502 conf_active.conf = self
503 conf_active.save()
503 conf_active.save()
504 return True
504 return True
505
505
506 def write_device_mqtt(self):
506 def write_device_mqtt(self):
507
507
508 if self.experiment is None:
508 if self.experiment is None:
509 confs = []
509 confs = []
510 else:
510 else:
511 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
511 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
512 confdds = ''
512 confdds = ''
513 confjars = ''
513 confjars = ''
514 confrc = ''
514 confrc = ''
515 #TO STOP DEVICES: DDS-JARS-RC
515 #TO STOP DEVICES: DDS-JARS-RC
516 for i in range(0,len(confs)):
516 for i in range(0,len(confs)):
517 if i==0:
517 if i==0:
518 for conf in confs:
518 for conf in confs:
519 if conf.device.device_type.name == 'dds':
519 if conf.device.device_type.name == 'dds':
520 confdds = conf
520 confdds = conf
521 confdds.stop_device()
521 confdds.stop_device()
522 break
522 break
523 if i==1:
523 if i==1:
524 for conf in confs:
524 for conf in confs:
525 if conf.device.device_type.name == 'jars':
525 if conf.device.device_type.name == 'jars':
526 confjars = conf
526 confjars = conf
527 confjars.stop_device()
527 confjars.stop_device()
528 break
528 break
529 if i==2:
529 if i==2:
530 for conf in confs:
530 for conf in confs:
531 if conf.device.device_type.name == 'rc':
531 if conf.device.device_type.name == 'rc':
532 confrc = conf
532 confrc = conf
533 confrc.stop_device()
533 confrc.stop_device()
534 break
534 break
535
535
536 apuntes_up_down=''
536 apuntes_up_down=''
537 beams = ABSBeam.objects.filter(abs_conf=self)
537 beams = ABSBeam.objects.filter(abs_conf=self)
538
538
539 inicializacion="{\"beams\":["
539 inicializacion="{\"beams\":["
540 finalizacion="]}"
540 finalizacion="]}"
541
541
542 for beam in beams:
542 for beam in beams:
543 beam.antenna=beam.antenna[1:]
543 beam.antenna=beam.antenna[1:]
544 info="{\"id\":"+str(beam.id)+","+beam.antenna + ","
544 info="{\"id\":"+str(beam.id)+","+beam.antenna + ","
545 apuntes_up_down=apuntes_up_down+info
545 apuntes_up_down=apuntes_up_down+info
546
546
547 apuntes_up_down=apuntes_up_down[:len(apuntes_up_down)-1]
547 apuntes_up_down=apuntes_up_down[:len(apuntes_up_down)-1]
548 apuntes_up_down=inicializacion+ apuntes_up_down+finalizacion
548 apuntes_up_down=inicializacion+ apuntes_up_down+finalizacion
549 mqtt_client.publish(os.environ.get('TOPIC_ABS', 'abs/beams'),apuntes_up_down)
549 mqtt_client.publish(os.environ.get('TOPIC_ABS', 'abs/beams'),apuntes_up_down)
550
550
551 #Start DDS-RC-JARS
551 #Start DDS-RC-JARS
552 if confdds:
552 if confdds:
553 confdds.start_device()
553 confdds.start_device()
554 if confrc:
554 if confrc:
555 #print confrc
555 #print confrc
556 confrc.start_device()
556 confrc.start_device()
557 if confjars:
557 if confjars:
558 confjars.start_device()
558 confjars.start_device()
559
559
560 return True
560 return True
561
561
562 def read_module(self, module):
562 def read_module(self, module):
563
563
564 """
564 """
565 Read out-bits (up-down) of 1 abs module NOT for Configuration
565 Read out-bits (up-down) of 1 abs module NOT for Configuration
566 """
566 """
567
567
568 ip_address = self.device.ip_address
568 ip_address = self.device.ip_address
569 ip_address = ip_address.split('.')
569 ip_address = ip_address.split('.')
570 module_seq = (ip_address[0],ip_address[1],ip_address[2])
570 module_seq = (ip_address[0],ip_address[1],ip_address[2])
571 dot = '.'
571 dot = '.'
572 module_ip = dot.join(module_seq)+'.'+str(module)
572 module_ip = dot.join(module_seq)+'.'+str(module)
573 module_port = self.device.port_address
573 module_port = self.device.port_address
574 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
574 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
575
575
576 module_status = json.loads(self.module_status)
576 module_status = json.loads(self.module_status)
577 print(read_route)
577 print(read_route)
578
578
579 module_bits = ''
579 module_bits = ''
580
580
581 try:
581 try:
582 r_read = requests.get(read_route, timeout=0.5)
582 r_read = requests.get(read_route, timeout=0.5)
583 answer = r_read.json()
583 answer = r_read.json()
584 module_bits = answer['allbits']
584 module_bits = answer['allbits']
585 except:
585 except:
586 return {}
586 return {}
587
587
588 return module_bits
588 return module_bits
589
589
590 def read_device(self):
590 def read_device(self):
591
591
592 parms = {}
592 parms = {}
593 # Reads active modules.
593 # Reads active modules.
594 module_status = json.loads(self.module_status)
594 module_status = json.loads(self.module_status)
595 total = 0
595 total = 0
596 for status in module_status:
596 for status in module_status:
597 if module_status[status] != 0:
597 if module_status[status] != 0:
598 module_bits = self.read_module(int(status))
598 module_bits = self.read_module(int(status))
599 bits={}
599 bits={}
600 if module_bits:
600 if module_bits:
601 bits = (str(module_bits['um2']) + str(module_bits['um1']) + str(module_bits['um0']) +
601 bits = (str(module_bits['um2']) + str(module_bits['um1']) + str(module_bits['um0']) +
602 str(module_bits['dm2']) + str(module_bits['dm1']) + str(module_bits['dm0']) )
602 str(module_bits['dm2']) + str(module_bits['dm1']) + str(module_bits['dm0']) )
603 parms[str(status)] = bits
603 parms[str(status)] = bits
604
604
605 total +=1
605 total +=1
606
606
607 if total==0:
607 if total==0:
608 self.message = "No ABS Module detected. Please select 'Status'."
608 self.message = "No ABS Module detected. Please select 'Status'."
609 return False
609 return False
610
610
611
611
612
612
613 self.message = "ABS Modules have been read"
613 self.message = "ABS Modules have been read"
614 #monitoreo_tx = JROABSClnt_01CeCnMod000000MNTR10
614 #monitoreo_tx = JROABSClnt_01CeCnMod000000MNTR10
615 return parms
615 return parms
616
616
617
617
618 def connected_modules(self):
618 def connected_modules(self):
619 """
619 """
620 This function returns the number of connected abs-modules without updating.
620 This function returns the number of connected abs-modules without updating.
621 """
621 """
622 num = 0
622 num = 0
623 print(self.module_status)
623 print(self.module_status)
624 for i, status in enumerate(self.module_status):
624 for i, status in enumerate(self.module_status):
625 if status != '0':
625 if status != '0':
626 num += 1
626 num += 1
627 #print('status {}:{}'.format(i+1, status))
627 #print('status {}:{}'.format(i+1, status))
628 return num
628 return num
629
629
630 def send_multicast(self, message):
630 def send_multicast(self, message):
631 #print("Send multicast")
631 #print("Send multicast")
632 multicast_group = ('224.3.29.71', 10000)
632 multicast_group = ('224.3.29.71', 10000)
633 # Create the datagram socket
633 # Create the datagram socket
634 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
634 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
635 sock.settimeout(1)
635 sock.settimeout(1)
636 local_ip = os.environ.get('LOCAL_IP', '0.0.0.0')
636 local_ip = os.environ.get('LOCAL_IP', '0.0.0.0')
637 local_ip = '0.0.0.0'
637 local_ip = '0.0.0.0'
638 print("He llegado a IP local")
638 print("He llegado a IP local")
639
639
640 sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip))
640 sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip))
641 sock.sendto(message.encode(), multicast_group)
641 sock.sendto(message.encode(), multicast_group)
642 print('Sending ' + message)
642 print('Sending ' + message)
643 return sock
643 return sock
644
644
645 def status_device(self):
645 def status_device(self):
646 """
646 """
647 This function returns the status of all abs-modules as one.
647 This function returns the status of all abs-modules as one.
648 If at least one module is connected, its answer is "1"
648 If at least one module is connected, its answer is "1"
649 """
649 """
650 print ('Status device')
650 print ('Status device')
651 print (self.active_beam)
651 print (self.active_beam)
652 beams = ABSBeam.objects.filter(abs_conf=self)
652 beams = ABSBeam.objects.filter(abs_conf=self)
653 #print beams[self.active_beam-1].module_6bits(0)
653 #print beams[self.active_beam-1].module_6bits(0)
654 active = ABSActive.objects.get(pk=1)
654 active = ABSActive.objects.get(pk=1)
655 if active.conf != self:
655 if active.conf != self:
656 self.message = 'La configuracion actual es la del siguiente enlace %s.' % active.conf.get_absolute_url()
656 self.message = 'La configuracion actual es la del siguiente enlace %s.' % active.conf.get_absolute_url()
657 self.message += "\n"
657 self.message += "\n"
658 self.message += 'Se debe realizar un write en esta configuracion para luego obtener un status valido.'
658 self.message += 'Se debe realizar un write en esta configuracion para luego obtener un status valido.'
659
659
660 return False
660 return False
661
661
662 sock = self.send_multicast('MNTR')
662 sock = self.send_multicast('MNTR')
663
663
664 n = 0
664 n = 0
665 status = ['0'] * 64
665 status = ['0'] * 64
666
666
667 while True:
667 while True:
668 #for i in range(32):
668 #for i in range(32):
669 #if True:
669 #if True:
670 try:
670 try:
671 print("Recibiendo")
671 print("Recibiendo")
672 address = None
672 address = None
673 data, address = sock.recvfrom(2)
673 data, address = sock.recvfrom(2)
674 print (address, data)
674 print (address, data)
675 print("!!!!")
675 print("!!!!")
676 data = data.decode()
676 data = data.decode()
677 aux_mon = "1"
677 aux_mon = "1"
678 aux_expected = aux_mon
678 aux_expected = aux_mon
679 if(len(data)==2):
679 if(len(data)==2):
680 print ("data[1]: ")
680 print ("data[1]: ")
681 print (data[1])
681 print (data[1])
682 aux_mon = fromChar2Binary(data[1])
682 aux_mon = fromChar2Binary(data[1])
683 print (aux_mon)
683 print (aux_mon)
684 aux_i = (str(address[0]).split('.'))[3]
684 aux_i = (str(address[0]).split('.'))[3]
685 print (aux_i)
685 print (aux_i)
686 print ('Active beam')
686 print ('Active beam')
687 beam_active = ABSBeam.objects.get(pk=self.active_beam)
687 beam_active = ABSBeam.objects.get(pk=self.active_beam)
688 print (beam_active)
688 print (beam_active)
689 aux_expected = beam_active.module_6bits(int(aux_i)-1)
689 aux_expected = beam_active.module_6bits(int(aux_i)-1)
690 print (aux_expected)
690 print (aux_expected)
691
691
692 print ("data[0]: ")
692 print ("data[0]: ")
693 print (data[0])
693 print (data[0])
694
694
695 if data[0] == '1':
695 if data[0] == '1':
696 status[int(address[0][10:])-1] = '3'
696 status[int(address[0][10:])-1] = '3'
697 if aux_mon == aux_expected:
697 if aux_mon == aux_expected:
698 print ('Es igual')
698 print ('Es igual')
699 else:
699 else:
700 print ('Es diferente')
700 print ('Es diferente')
701 status[int(address[0][10:])-1] = '2'
701 status[int(address[0][10:])-1] = '2'
702
702
703 elif data[0] == '0':
703 elif data[0] == '0':
704 status[int(address[0][10:])-1] = '1'
704 status[int(address[0][10:])-1] = '1'
705 n += 1
705 n += 1
706 print('Module: {} connected'.format(address))
706 print('Module: {} connected'.format(address))
707 except socket.timeout:
707 except socket.timeout:
708 print('Timeout')
708 print('Timeout')
709 break
709 break
710 except:
710 except:
711 print('Module: {} error'.format(address))
711 print('Module: {} error'.format(address))
712 pass
712 pass
713
713
714 sock.close()
714 sock.close()
715
715
716 if n > 0:
716 if n > 0:
717 self.message = 'ABS modules Status have been updated.'
717 self.message = 'ABS modules Status have been updated.'
718 self.device.status = 1
718 self.device.status = 1
719 else:
719 else:
720 self.device.status = 0
720 self.device.status = 0
721 self.message = 'No ABS module is connected.'
721 self.message = 'No ABS module is connected.'
722 self.module_status = ''.join(status)
722 self.module_status = ''.join(status)
723 self.save()
723 self.save()
724
724
725 return self.device.status
725 return self.device.status
726
726
727
727
728 def send_beam(self, beam_pos):
728 def send_beam(self, beam_pos):
729 """
729 """
730 This function connects to a multicast group and sends the beam number
730 This function connects to a multicast group and sends the beam number
731 to all abs modules.
731 to all abs modules.
732 """
732 """
733 print ('Send beam')
733 print ('Send beam')
734 print (self.active_beam)
734 print (self.active_beam)
735 beams = ABSBeam.objects.filter(abs_conf=self)
735 beams = ABSBeam.objects.filter(abs_conf=self)
736 #print beams[self.active_beam-1].module_6bits(0)
736 #print beams[self.active_beam-1].module_6bits(0)
737 active = ABSActive.objects.get(pk=1)
737 active = ABSActive.objects.get(pk=1)
738 if active.conf != self:
738 if active.conf != self:
739 self.message = 'La configuracion actual es la del siguiente enlace %s.' % active.conf.get_absolute_url()
739 self.message = 'La configuracion actual es la del siguiente enlace %s.' % active.conf.get_absolute_url()
740 self.message += "\n"
740 self.message += "\n"
741 self.message += 'Se debe realizar un write en esta configuracion para luego obtener un status valido.'
741 self.message += 'Se debe realizar un write en esta configuracion para luego obtener un status valido.'
742
742
743 return False
743 return False
744
744
745 # Se manda a cero RC para poder realizar cambio de beam
745 # Se manda a cero RC para poder realizar cambio de beam
746 if self.experiment is None:
746 if self.experiment is None:
747 confs = []
747 confs = []
748 else:
748 else:
749 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
749 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
750 confdds = ''
750 confdds = ''
751 confjars = ''
751 confjars = ''
752 confrc = ''
752 confrc = ''
753 #TO STOP DEVICES: DDS-JARS-RC
753 #TO STOP DEVICES: DDS-JARS-RC
754 for i in range(0,len(confs)):
754 for i in range(0,len(confs)):
755 if i==0:
755 if i==0:
756 for conf in confs:
756 for conf in confs:
757 if conf.device.device_type.name == 'dds':
757 if conf.device.device_type.name == 'dds':
758 confdds = conf
758 confdds = conf
759 confdds.stop_device()
759 confdds.stop_device()
760 break
760 break
761 if i==1:
761 if i==1:
762 for conf in confs:
762 for conf in confs:
763 if conf.device.device_type.name == 'jars':
763 if conf.device.device_type.name == 'jars':
764 confjars = conf
764 confjars = conf
765 confjars.stop_device()
765 confjars.stop_device()
766 break
766 break
767 if i==2:
767 if i==2:
768 for conf in confs:
768 for conf in confs:
769 if conf.device.device_type.name == 'rc':
769 if conf.device.device_type.name == 'rc':
770 confrc = conf
770 confrc = conf
771 confrc.stop_device()
771 confrc.stop_device()
772 break
772 break
773 if beam_pos > 0:
773 if beam_pos > 0:
774 beam_pos = beam_pos - 1
774 beam_pos = beam_pos - 1
775 else:
775 else:
776 beam_pos = 0
776 beam_pos = 0
777
777
778 #El indice del apunte debe ser menor que el numero total de apuntes
778 #El indice del apunte debe ser menor que el numero total de apuntes
779 #El servidor tcp en el embebido comienza a contar desde 0
779 #El servidor tcp en el embebido comienza a contar desde 0
780 status = ['0'] * 64
780 status = ['0'] * 64
781 message = 'CHGB{}'.format(beam_pos)
781 message = 'CHGB{}'.format(beam_pos)
782 sock = self.send_multicast(message)
782 sock = self.send_multicast(message)
783 while True:
783 while True:
784 #for i in range(32):
784 #for i in range(32):
785 try:
785 try:
786 data, address = sock.recvfrom(1024)
786 data, address = sock.recvfrom(1024)
787 print (address, data)
787 print (address, data)
788 data = data.decode()
788 data = data.decode()
789 if data == '1':
789 if data == '1':
790 status[int(address[0][10:])-1] = '3'
790 status[int(address[0][10:])-1] = '3'
791 elif data == '0':
791 elif data == '0':
792 status[int(address[0][10:])-1] = '1'
792 status[int(address[0][10:])-1] = '1'
793 except socket.timeout:
793 except socket.timeout:
794 print('Timeout')
794 print('Timeout')
795 break
795 break
796 except Exception as e:
796 except Exception as e:
797 print ('Error {}'.format(e))
797 print ('Error {}'.format(e))
798 pass
798 pass
799
799
800 sock.close()
800 sock.close()
801
801
802 #Start DDS-RC-JARS
802 #Start DDS-RC-JARS
803 if confdds:
803 if confdds:
804 confdds.start_device()
804 confdds.start_device()
805 if confrc:
805 if confrc:
806 #print confrc
806 #print confrc
807 confrc.start_device()
807 confrc.start_device()
808 if confjars:
808 if confjars:
809 confjars.start_device()
809 confjars.start_device()
810
810
811 self.message = "ABS Beam has been changed"
811 self.message = "ABS Beam has been changed"
812 self.module_status = ''.join(status)
812 self.module_status = ''.join(status)
813 self.save()
813 self.save()
814 return True
814 return True
815
815
816
816
817 def get_absolute_url_import(self):
817 def get_absolute_url_import(self):
818 return reverse('url_import_abs_conf', args=[str(self.id)])
818 return reverse('url_import_abs_conf', args=[str(self.id)])
819
819
820 class ABSActive(models.Model):
820 class ABSActive(models.Model):
821 conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration', on_delete=models.CASCADE)
821 conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration', on_delete=models.CASCADE)
822
822
823 class Meta:
823 class Meta:
824 db_table = 'abs_absactive'
824 db_table = 'abs_absactive'
825
825
826 class ABSBeam(models.Model):
826 class ABSBeam(models.Model):
827
827
828 name = models.CharField(max_length=60, default='Beam')
828 name = models.CharField(max_length=60, default='Beam')
829 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
829 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
830 abs_conf = models.ForeignKey('ABSConfiguration', null=True,
830 abs_conf = models.ForeignKey('ABSConfiguration', null=True,
831 verbose_name='ABS Configuration', on_delete=models.CASCADE)
831 verbose_name='ABS Configuration', on_delete=models.CASCADE)
832 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
832 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
833 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
833 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
834 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
834 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
835 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
835 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
836 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
836 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
837 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
837 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
838
838
839 class Meta:
839 class Meta:
840 db_table = 'abs_beams'
840 db_table = 'abs_beams'
841
841
842 def __unicode__(self):
842 def __unicode__(self):
843 return u'%s' % (self.name)
843 return u'%s' % (self.name)
844
844
845 def parms_to_dict(self):
845 def parms_to_dict(self):
846
846
847 parameters = {}
847 parameters = {}
848 parameters['name'] = self.name
848 parameters['name'] = self.name
849 parameters['antenna'] = ast.literal_eval(self.antenna)
849 parameters['antenna'] = ast.literal_eval(self.antenna)
850 parameters['abs_conf'] = self.abs_conf.name
850 parameters['abs_conf'] = self.abs_conf.name
851 parameters['tx'] = ast.literal_eval(self.tx)
851 parameters['tx'] = ast.literal_eval(self.tx)
852 parameters['rx'] = ast.literal_eval(self.rx)
852 parameters['rx'] = ast.literal_eval(self.rx)
853 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
853 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
854 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
854 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
855 parameters['ues'] = ast.literal_eval(self.ues)
855 parameters['ues'] = ast.literal_eval(self.ues)
856 parameters['only_rx'] = json.loads(self.only_rx)
856 parameters['only_rx'] = json.loads(self.only_rx)
857
857
858 return parameters
858 return parameters
859
859
860 def dict_to_parms(self, parameters):
860 def dict_to_parms(self, parameters):
861
861
862 self.name = parameters['name']
862 self.name = parameters['name']
863 self.antenna = json.dumps(parameters['antenna'])
863 self.antenna = json.dumps(parameters['antenna'])
864 #self.abs_conf = parameters['abs_conf']
864 #self.abs_conf = parameters['abs_conf']
865 self.tx = json.dumps(parameters['tx'])
865 self.tx = json.dumps(parameters['tx'])
866 self.rx = json.dumps(parameters['rx'])
866 self.rx = json.dumps(parameters['rx'])
867 #self.s_time = parameters['s_time']
867 #self.s_time = parameters['s_time']
868 #self.e_time = parameters['e_time']
868 #self.e_time = parameters['e_time']
869 self.ues = json.dumps(parameters['ues'])
869 self.ues = json.dumps(parameters['ues'])
870 self.only_rx = json.dumps(parameters['only_rx'])
870 self.only_rx = json.dumps(parameters['only_rx'])
871 self.save()
871 self.save()
872
872
873
873
874 def clone(self, **kwargs):
874 def clone(self, **kwargs):
875
875
876 self.pk = None
876 self.pk = None
877 self.id = None
877 self.id = None
878 for attr, value in kwargs.items():
878 for attr, value in kwargs.items():
879 setattr(self, attr, value)
879 setattr(self, attr, value)
880
880
881 self.save()
881 self.save()
882
882
883 return self
883 return self
884
884
885
885
886 def module_6bits(self, module):
886 def module_6bits(self, module):
887 """
887 """
888 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
888 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
889 """
889 """
890 module += 1
890 module += 1
891 if module > 64:
891 if module > 64:
892 beam_bits = ""
892 beam_bits = ""
893 return beam_bits
893 return beam_bits
894
894
895 data = ast.literal_eval(self.antenna)
895 data = ast.literal_eval(self.antenna)
896 up_data = data['antenna_up']
896 up_data = data['antenna_up']
897 down_data = data['antenna_down']
897 down_data = data['antenna_down']
898
898
899 pos = ip2position(module)
899 pos = ip2position(module)
900 up_value = up_data[pos[0]][pos[1]]
900 up_value = up_data[pos[0]][pos[1]]
901 down_value = down_data[pos[0]][pos[1]]
901 down_value = down_data[pos[0]][pos[1]]
902
902
903 up_bits = up_conv_bits(up_value)
903 up_bits = up_conv_bits(up_value)
904 down_bits = down_conv_bits(down_value)
904 down_bits = down_conv_bits(down_value)
905 beam_bits = up_bits+down_bits
905 beam_bits = up_bits+down_bits
906
906
907 return beam_bits
907 return beam_bits
908
908
909
909
910 @property
910 @property
911 def get_upvalues(self):
911 def get_upvalues(self):
912 """
912 """
913 This function reads antenna pattern and show the up-value of one abs module
913 This function reads antenna pattern and show the up-value of one abs module
914 """
914 """
915
915
916 data = ast.literal_eval(self.antenna)
916 data = ast.literal_eval(self.antenna)
917 up_data = data['antenna_up']
917 up_data = data['antenna_up']
918
918
919 up_values = []
919 up_values = []
920 for data in up_data:
920 for data in up_data:
921 for i in range(0,8):
921 for i in range(0,8):
922 up_values.append(data[i])
922 up_values.append(data[i])
923
923
924 return up_values
924 return up_values
925
925
926 @property
926 @property
927 def antenna_upvalues(self):
927 def antenna_upvalues(self):
928 """
928 """
929 This function reads antenna pattern and show the up - values of one abs beam
929 This function reads antenna pattern and show the up - values of one abs beam
930 in a particular order
930 in a particular order
931 """
931 """
932 data = ast.literal_eval(self.antenna)
932 data = ast.literal_eval(self.antenna)
933 up_data = data['antenna_up']
933 up_data = data['antenna_up']
934
934
935 return up_data
935 return up_data
936
936
937 @property
937 @property
938 def antenna_downvalues(self):
938 def antenna_downvalues(self):
939 """
939 """
940 This function reads antenna pattern and show the down - values of one abs beam
940 This function reads antenna pattern and show the down - values of one abs beam
941 in a particular order
941 in a particular order
942 """
942 """
943 data = ast.literal_eval(self.antenna)
943 data = ast.literal_eval(self.antenna)
944 down_data = data['antenna_down']
944 down_data = data['antenna_down']
945
945
946 return down_data
946 return down_data
947
947
948 @property
948 @property
949 def get_downvalues(self):
949 def get_downvalues(self):
950 """
950 """
951 This function reads antenna pattern and show the down-value of one abs module
951 This function reads antenna pattern and show the down-value of one abs module
952 """
952 """
953
953
954 data = ast.literal_eval(self.antenna)
954 data = ast.literal_eval(self.antenna)
955 down_data = data['antenna_down']
955 down_data = data['antenna_down']
956
956
957 down_values = []
957 down_values = []
958 for data in down_data:
958 for data in down_data:
959 for i in range(0,8):
959 for i in range(0,8):
960 down_values.append(data[i])
960 down_values.append(data[i])
961
961
962 return down_values
962 return down_values
963
963
964 @property
964 @property
965 def get_up_ues(self):
965 def get_up_ues(self):
966 """
966 """
967 This function shows the up-ues-value of one beam
967 This function shows the up-ues-value of one beam
968 """
968 """
969 data = ast.literal_eval(self.ues)
969 data = ast.literal_eval(self.ues)
970 up_ues = data['up']
970 up_ues = data['up']
971
971
972 return up_ues
972 return up_ues
973
973
974 @property
974 @property
975 def get_down_ues(self):
975 def get_down_ues(self):
976 """
976 """
977 This function shows the down-ues-value of one beam
977 This function shows the down-ues-value of one beam
978 """
978 """
979 data = ast.literal_eval(self.ues)
979 data = ast.literal_eval(self.ues)
980 down_ues = data['down']
980 down_ues = data['down']
981
981
982 return down_ues
982 return down_ues
983
983
984 @property
984 @property
985 def get_up_onlyrx(self):
985 def get_up_onlyrx(self):
986 """
986 """
987 This function shows the up-onlyrx-value of one beam
987 This function shows the up-onlyrx-value of one beam
988 """
988 """
989 data = json.loads(self.only_rx)
989 data = json.loads(self.only_rx)
990 up_onlyrx = data['up']
990 up_onlyrx = data['up']
991
991
992 return up_onlyrx
992 return up_onlyrx
993
993
994 @property
994 @property
995 def get_down_onlyrx(self):
995 def get_down_onlyrx(self):
996 """
996 """
997 This function shows the down-onlyrx-value of one beam
997 This function shows the down-onlyrx-value of one beam
998 """
998 """
999 data = json.loads(self.only_rx)
999 data = json.loads(self.only_rx)
1000 down_onlyrx = data['down']
1000 down_onlyrx = data['down']
1001
1001
1002 return down_onlyrx
1002 return down_onlyrx
1003
1003
1004 @property
1004 @property
1005 def get_tx(self):
1005 def get_tx(self):
1006 """
1006 """
1007 This function shows the tx-values of one beam
1007 This function shows the tx-values of one beam
1008 """
1008 """
1009 data = json.loads(self.tx)
1009 data = json.loads(self.tx)
1010
1010
1011 return data
1011 return data
1012
1012
1013 @property
1013 @property
1014 def get_uptx(self):
1014 def get_uptx(self):
1015 """
1015 """
1016 This function shows the up-tx-values of one beam
1016 This function shows the up-tx-values of one beam
1017 """
1017 """
1018 data = json.loads(self.tx)
1018 data = json.loads(self.tx)
1019 up_data = data['up']
1019 up_data = data['up']
1020
1020
1021 up_values = []
1021 up_values = []
1022 for data in up_data:
1022 for data in up_data:
1023 for i in range(0,8):
1023 for i in range(0,8):
1024 up_values.append(data[i])
1024 up_values.append(data[i])
1025
1025
1026 return up_values
1026 return up_values
1027
1027
1028 @property
1028 @property
1029 def get_downtx(self):
1029 def get_downtx(self):
1030 """
1030 """
1031 This function shows the down-tx-values of one beam
1031 This function shows the down-tx-values of one beam
1032 """
1032 """
1033 data = json.loads(self.tx)
1033 data = json.loads(self.tx)
1034 down_data = data['down']
1034 down_data = data['down']
1035
1035
1036 down_values = []
1036 down_values = []
1037 for data in down_data:
1037 for data in down_data:
1038 for i in range(0,8):
1038 for i in range(0,8):
1039 down_values.append(data[i])
1039 down_values.append(data[i])
1040
1040
1041 return down_values
1041 return down_values
1042
1042
1043
1043
1044
1044
1045 @property
1045 @property
1046 def get_rx(self):
1046 def get_rx(self):
1047 """
1047 """
1048 This function shows the rx-values of one beam
1048 This function shows the rx-values of one beam
1049 """
1049 """
1050 data = json.loads(self.rx)
1050 data = json.loads(self.rx)
1051
1051
1052 return data
1052 return data
1053
1053
1054 @property
1054 @property
1055 def get_uprx(self):
1055 def get_uprx(self):
1056 """
1056 """
1057 This function shows the up-rx-values of one beam
1057 This function shows the up-rx-values of one beam
1058 """
1058 """
1059 data = json.loads(self.rx)
1059 data = json.loads(self.rx)
1060 up_data = data['up']
1060 up_data = data['up']
1061
1061
1062 up_values = []
1062 up_values = []
1063 for data in up_data:
1063 for data in up_data:
1064 for i in range(0,8):
1064 for i in range(0,8):
1065 up_values.append(data[i])
1065 up_values.append(data[i])
1066
1066
1067 return up_values
1067 return up_values
1068
1068
1069 @property
1069 @property
1070 def get_downrx(self):
1070 def get_downrx(self):
1071 """
1071 """
1072 This function shows the down-rx-values of one beam
1072 This function shows the down-rx-values of one beam
1073 """
1073 """
1074 data = json.loads(self.rx)
1074 data = json.loads(self.rx)
1075 down_data = data['down']
1075 down_data = data['down']
1076
1076
1077 down_values = []
1077 down_values = []
1078 for data in down_data:
1078 for data in down_data:
1079 for i in range(0,8):
1079 for i in range(0,8):
1080 down_values.append(data[i])
1080 down_values.append(data[i])
1081
1081
1082 return down_values
1082 return down_values
@@ -1,39 +1,39
1 import os
1 import os
2 import paho.mqtt.client as mqtt
2 import paho.mqtt.client as mqtt
3 from radarsys import settings
3 from radarsys import settings
4 from radarsys.socketconfig import sio as sio
4 from radarsys.socketconfig import sio as sio
5
5
6 lista_ack=[
6 lista_ack=[
7 chr( 33 ), chr( 34 ), chr( 35 ), chr( 36 ), chr( 37 ), chr( 38 ), chr( 39 ), chr( 40 ), chr( 41 ), chr( 42 ), chr( 43 ), chr( 44 ), chr( 45 ), chr( 46 ), chr( 47 ), chr( 48 ), chr( 49 ), chr( 50 ), chr( 51 ), chr( 52 ), chr( 53 ), chr( 54 ), chr( 55 ), chr( 56 ), chr( 57 ), chr( 58 ), chr( 59 ), chr( 60 ), chr( 61 ), chr( 62 ), chr( 63 ), chr( 64 ), chr( 65 ), chr( 66 ), chr( 67 ), chr( 68 ), chr( 69 ), chr( 70 ), chr( 71 ), chr( 72 ), chr( 73 ), chr( 74 ), chr( 75 ), chr( 76 ), chr( 77 ), chr( 78 ), chr( 79 ), chr( 80 ), chr( 81 ), chr( 82 ), chr( 83 ), chr( 84 ), chr( 85 ), chr( 86 ), chr( 87 ), chr( 88 ), chr( 89 ), chr( 90 ), chr( 91 ), chr( 92 ), chr( 93 ), chr( 94 ), chr( 95 ), chr( 96 )
7 chr( 33 ), chr( 34 ), chr( 35 ), chr( 36 ), chr( 37 ), chr( 38 ), chr( 39 ), chr( 40 ), chr( 41 ), chr( 42 ), chr( 43 ), chr( 44 ), chr( 45 ), chr( 46 ), chr( 47 ), chr( 48 ), chr( 49 ), chr( 50 ), chr( 51 ), chr( 52 ), chr( 53 ), chr( 54 ), chr( 55 ), chr( 56 ), chr( 57 ), chr( 58 ), chr( 59 ), chr( 60 ), chr( 61 ), chr( 62 ), chr( 63 ), chr( 64 ), chr( 65 ), chr( 66 ), chr( 67 ), chr( 68 ), chr( 69 ), chr( 70 ), chr( 71 ), chr( 72 ), chr( 73 ), chr( 74 ), chr( 75 ), chr( 76 ), chr( 77 ), chr( 78 ), chr( 79 ), chr( 80 ), chr( 81 ), chr( 82 ), chr( 83 ), chr( 84 ), chr( 85 ), chr( 86 ), chr( 87 ), chr( 88 ), chr( 89 ), chr( 90 ), chr( 91 ), chr( 92 ), chr( 93 ), chr( 94 ), chr( 95 ), chr( 96 )
8 ]
8 ]
9
9
10 lista_ack_dismatching=[
10 lista_ack_dismatching=[
11 chr( 97 ), chr( 98 ), chr( 99 ), chr( 100 ), chr( 101 ), chr( 102 ), chr( 103 ), chr( 104 ), chr( 105 ), chr( 106 ), chr( 107 ), chr( 108 ), chr( 109 ), chr( 110 ), chr( 111 ), chr( 112 ), chr( 113 ), chr( 114 ), chr( 115 ), chr( 116 ), chr( 117 ), chr( 118 ), chr( 119 ), chr( 120 ), chr( 121 ), chr( 122 ), chr( 123 ), chr( 124 ), chr( 125 ), chr( 126 ), chr( 127 ), chr( 128 ), chr( 129 ), chr( 130 ), chr( 131 ), chr( 132 ), chr( 133 ), chr( 134 ), chr( 135 ), chr( 136 ), chr( 137 ), chr( 138 ), chr( 139 ), chr( 140 ), chr( 141 ), chr( 142 ), chr( 143 ), chr( 144 ), chr( 145 ), chr( 146 ), chr( 147 ), chr( 148 ), chr( 149 ), chr( 150 ), chr( 151 ), chr( 152 ), chr( 153 ), chr( 154 ), chr( 155 ), chr( 156 ), chr( 157 ), chr( 158 ), chr( 159 ), chr(160)
11 chr( 97 ), chr( 98 ), chr( 99 ), chr( 100 ), chr( 101 ), chr( 102 ), chr( 103 ), chr( 104 ), chr( 105 ), chr( 106 ), chr( 107 ), chr( 108 ), chr( 109 ), chr( 110 ), chr( 111 ), chr( 112 ), chr( 113 ), chr( 114 ), chr( 115 ), chr( 116 ), chr( 117 ), chr( 118 ), chr( 119 ), chr( 120 ), chr( 121 ), chr( 122 ), chr( 123 ), chr( 124 ), chr( 125 ), chr( 126 ), chr( 127 ), chr( 128 ), chr( 129 ), chr( 130 ), chr( 131 ), chr( 132 ), chr( 133 ), chr( 134 ), chr( 135 ), chr( 136 ), chr( 137 ), chr( 138 ), chr( 139 ), chr( 140 ), chr( 141 ), chr( 142 ), chr( 143 ), chr( 144 ), chr( 145 ), chr( 146 ), chr( 147 ), chr( 148 ), chr( 149 ), chr( 150 ), chr( 151 ), chr( 152 ), chr( 153 ), chr( 154 ), chr( 155 ), chr( 156 ), chr( 157 ), chr( 158 ), chr( 159 ), chr(160)
12 ]
12 ]
13
13
14 def on_connect(mqtt_client, userdata, flags, rc):
14 def on_connect(mqtt_client, userdata, flags, rc):
15 if rc == 0:
15 if rc == 0:
16 print('Connected successfully')
16 # print('Connected successfully')
17 mqtt_client.subscribe(os.environ.get('TOPIC_ABS_ACK','abs/beams_ack'))
17 mqtt_client.subscribe(os.environ.get('TOPIC_ABS_ACK','abs/beams_ack'))
18 else:
18 else:
19 print('Bad connection. Code:', rc)
19 print('Bad connection. Code:', rc)
20
20
21 def on_message(mqtt_client, userdata, msg):
21 def on_message(mqtt_client, userdata, msg):
22 # print(f'Received message on topic: {msg.topic} with payload: {msg.payload}', flush=True)
22 # print(f'Received message on topic: {msg.topic} with payload: {msg.payload}', flush=True)
23 # message= str(msg.payload)
23 # message= str(msg.payload)
24 # sio.emit('abs_ws',data={'msg':message})
24 # sio.emit('abs_ws',data={'msg':message})
25 #message=str(msg.payload)
25 #message=str(msg.payload)
26 #lista_ack.pop(message)
26 #lista_ack.pop(message)
27 print("Mientras" ,flush=True)
27 print("Mientras" ,flush=True)
28
28
29
29
30
30
31 client = mqtt.Client()
31 client = mqtt.Client()
32 client.on_connect = on_connect
32 client.on_connect = on_connect
33 client.on_message = on_message
33 client.on_message = on_message
34 client.username_pw_set(os.environ.get('MQTT_USER', 'abs'), os.environ.get('MQTT_PASSWORD', 'abs'))
34 client.username_pw_set(os.environ.get('MQTT_USER', 'abs'), os.environ.get('MQTT_PASSWORD', 'abs'))
35 client.connect(
35 client.connect(
36 host=os.environ.get('MQTT_SERVER', '10.10.10.200'),
36 host=os.environ.get('MQTT_SERVER', '10.10.10.200'),
37 port=int(settings.os.environ.get('MQTT_PORT', 1883)),
37 port=int(settings.os.environ.get('MQTT_PORT', 1883)),
38 keepalive=int(os.environ.get('MQTT_KEEPALIVE', 36000))
38 keepalive=int(os.environ.get('MQTT_KEEPALIVE', 36000))
39 ) No newline at end of file
39 )
@@ -1,39 +1,39
1 import os
1 import os
2 import paho.mqtt.client as mqtt
2 import paho.mqtt.client as mqtt
3 from radarsys import settings
3 from radarsys import settings
4 from radarsys.socketconfig import sio as sio
4 from radarsys.socketconfig import sio as sio
5 import numpy as np
5 import numpy as np
6
6
7 def on_connect(mqtt_client, userdata, flags, rc):
7 def on_connect(mqtt_client, userdata, flags, rc):
8 if rc == 0:
8 if rc == 0:
9 print('Connected successfully')
9 # print('Connected successfully')
10 mqtt_client.subscribe('atrad/test3')
10 mqtt_client.subscribe('atrad/test3')
11 else:
11 else:
12 print('Bad connection. Code:', rc)
12 print('Bad connection. Code:', rc)
13
13
14 def maxima_temp(trs):
14 def maxima_temp(trs):
15 np_array = [np.array(i) for i in trs]
15 np_array = [np.array(i) for i in trs]
16 temps = [max(i[i<40]) for i in np_array]
16 temps = [max(i[i<40]) for i in np_array]
17 return max(temps)
17 return max(temps)
18
18
19 def on_message(mqtt_client, userdata, msg):
19 def on_message(mqtt_client, userdata, msg):
20 # print(f'Received message on topic: {msg.topic} with payload: {msg.payload}', flush=True)
20 # print(f'Received message on topic: {msg.topic} with payload: {msg.payload}', flush=True)
21 trsi = [[],[],[],[]]
21 trsi = [[],[],[],[]]
22 mensaje = str(msg.payload)
22 mensaje = str(msg.payload)
23 datos = [i for i in mensaje[21:-1].split("*")]
23 datos = [i for i in mensaje[21:-1].split("*")]
24 status=''.join([datos[i][3] for i in range(3)])
24 status=''.join([datos[i][3] for i in range(3)])
25 for trs,i in zip(datos,[0,1,2,3]) :
25 for trs,i in zip(datos,[0,1,2,3]) :
26 trsi[i]= [int(i) for i in trs[1:-1].split(",")]
26 trsi[i]= [int(i) for i in trs[1:-1].split(",")]
27 potencias = [trsi[0][34],trsi[0][36],trsi[2][32],trsi[2][34]]
27 potencias = [trsi[0][34],trsi[0][36],trsi[2][32],trsi[2][34]]
28 tmax = maxima_temp(trsi)
28 tmax = maxima_temp(trsi)
29 sio.emit('test', data={'time':mensaje[2:21],'num':trsi[0][0],'pow':potencias,'tmax':str(tmax),'status':status})
29 sio.emit('test', data={'time':mensaje[2:21],'num':trsi[0][0],'pow':potencias,'tmax':str(tmax),'status':status})
30
30
31 client = mqtt.Client()
31 client = mqtt.Client()
32 client.on_connect = on_connect
32 client.on_connect = on_connect
33 client.on_message = on_message
33 client.on_message = on_message
34 client.username_pw_set(os.environ.get('MQTT_USER_ATRAD', 'atrad'), os.environ.get('MQTT_PASSWORD_ATRAD', 'atrad'))
34 client.username_pw_set(os.environ.get('MQTT_USER_ATRAD', 'atrad'), os.environ.get('MQTT_PASSWORD_ATRAD', 'atrad'))
35 client.connect(
35 client.connect(
36 host=os.environ.get('MQTT_SERVER', '10.10.10.200'),
36 host=os.environ.get('MQTT_SERVER', '10.10.10.200'),
37 port=int(settings.os.environ.get('MQTT_PORT', 1883)),
37 port=int(settings.os.environ.get('MQTT_PORT', 1883)),
38 keepalive=int(os.environ.get('MQTT_KEEPALIVE', 36000))
38 keepalive=int(os.environ.get('MQTT_KEEPALIVE', 36000))
39 ) No newline at end of file
39 )
@@ -1,19 +1,103
1 from django.core.management.base import BaseCommand
1 from django.core.management.base import BaseCommand
2
2 from apps.main.models import Campaign, Location
3 from datetime import datetime,timedelta
4 from apps.main.views import radar_start
5 from django.shortcuts import render, redirect,get_object_or_404, HttpResponse
6 from django.urls import reverse
7 from django.utils.timezone import is_aware
8 from django.contrib import messages
9 from django.http import HttpResponseRedirect
10 from apps.main.views import experiment_start
11 from apps.main.models import Experiment, Configuration
3
12
4 class Command(BaseCommand):
13 class Command(BaseCommand):
5 """
14 """
6 Restart experiment every night at 05:00 am.
15 Restart experiment every night at 05:00 am.
7 Example:
16 Example:
8 manage.py restart_experiment
17 manage.py restart_experiment
9 """
18 """
10 def handle(self, *args, **options):
19 def handle(self, *args, **options):
11 print("Hola")
20 print("")
21 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
22 end_date__gte=datetime.now()).order_by('-start_date')
23
24 if campaigns:
25
26 for campaign in campaigns:
27 print(campaign.name)
28 print(campaign.start_date)
29 print(campaign.end_date)
30 print(campaign.experiments.all()[0].id)
31 print("STATUS: ",campaign.experiments.all()[0].status)
32
33 radar=campaign.get_experiments_by_radar(radar=None)
34 radar_id=radar[0]["id"]
35 print(radar_id)
36
37 now = datetime.now()
38 if now<campaign.end_date and now >campaign.start_date:
39 print("La campaΓ±a",campaign.name ,"se ejecuta!",flush=True)
40 radar_start_scheduler(campaign.id,radar_id)
41
42 else:
43 copy_campaigns=Campaign.objects.all()
44 print("-------------Deteniendo procesos-------------")
45 for campaign in copy_campaigns:
46 print(campaign.name)
47 print(campaign.start_date)
48 print(campaign.end_date)
49 print("ID: ",campaign.experiments.all()[0].id)
50 print("STATUS: ",campaign.experiments.all()[0].status)
51 print("----,,,---")
52 radar=campaign.get_experiments_by_radar(radar=None)
53 radar_id=radar[0]["id"]
54
55 if campaign.experiments.all()[0].status !=1:
56 print("Estoy en :",campaign.experiments.all()[0].status)
57 print("Con ID: ",campaign.experiments.all()[0].id)
58 print("\n\n")
59 a=radar_stop_scheduler(campaign.id,radar_id,campaign.experiments.all()[0].id)
60 print("RETURN", a)
61
62
63 def radar_start_scheduler(id_camp,id_radar):
64 print("-------------------")
65 campaign = get_object_or_404(Campaign, pk=id_camp)
66 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
67 now = datetime.now()
68
69 for exp in experiments:
70 exp = get_object_or_404(Experiment, pk=exp.id)
12
71
13 # def main():
72 if exp.status == 2:
14 # print("Hola")
73 print('Experiment {} already runnnig'.format(exp))
74 else:
75 exp.status = exp.start()
76 if exp.status == 0:
77 print('Experiment {} not start'.format(exp))
78 if exp.status == 2:
79 print('Experiment {} started'.format(exp))
80 exp.save()
15
81
16 # if __name__=='__main__':
82 def radar_stop_scheduler(id_camp,id_radar,id_experiment):
17 # main()
83 print("-------------------")
84 '''
85 Stop experiments's devices
86 DDS-JARS-RC-CGS-ABS
87 '''
88 exp=get_object_or_404(Experiment,pk=id_experiment)
18
89
90 if exp.status == 2:
91 confs = Configuration.objects.filter(experiment=id_experiment,type = 0).order_by('device__device_type__sequence')
92 confs = confs.exclude(device__device_type__name='cgs')
93 try:
94 for conf in confs:
95 print("Estoy en conf_scheduler")
96 print(conf)
97 conf.stop_device()
98 exp.status= 1
99 except:
100 exp.status= 0
101 exp.save()
19
102
103 return exp.status No newline at end of file
@@ -1,829 +1,828
1
1
2 import os
2 import os
3 import json
3 import json
4 import requests
4 import requests
5 import time
5 import time
6 from datetime import datetime
6 from datetime import datetime
7
7
8 try:
8 try:
9 from polymorphic.models import PolymorphicModel
9 from polymorphic.models import PolymorphicModel
10 except:
10 except:
11 from polymorphic import PolymorphicModel
11 from polymorphic import PolymorphicModel
12
12
13 from django.template.base import kwarg_re
13 from django.template.base import kwarg_re
14 from django.db import models
14 from django.db import models
15 from django.urls import reverse
15 from django.urls import reverse
16 from django.core.validators import MinValueValidator, MaxValueValidator
16 from django.core.validators import MinValueValidator, MaxValueValidator
17 from django.shortcuts import get_object_or_404
17 from django.shortcuts import get_object_or_404
18 from django.contrib.auth.models import User
18 from django.contrib.auth.models import User
19 from django.db.models.signals import post_save
19 from django.db.models.signals import post_save
20 from django.dispatch import receiver
20 from django.dispatch import receiver
21
21
22 from apps.main.utils import Params
22 from apps.main.utils import Params
23 from apps.rc.utils import RCFile
23 from apps.rc.utils import RCFile
24 from apps.jars.utils import RacpFile
24 from apps.jars.utils import RacpFile
25 from devices.dds import api as dds_api
25 from devices.dds import api as dds_api
26 from devices.dds import data as dds_data
26 from devices.dds import data as dds_data
27
27
28
28
29 DEV_PORTS = {
29 DEV_PORTS = {
30 'rc' : 2000,
30 'rc' : 2000,
31 'dds' : 2000,
31 'dds' : 2000,
32 'jars' : 2000,
32 'jars' : 2000,
33 'usrp' : 2000,
33 'usrp' : 2000,
34 'cgs' : 8080,
34 'cgs' : 8080,
35 'abs' : 8080,
35 'abs' : 8080,
36 'dds_rest': 80
36 'dds_rest': 80
37 }
37 }
38
38
39 RADAR_STATES = (
39 RADAR_STATES = (
40 (0, 'No connected'),
40 (0, 'No connected'),
41 (1, 'Connected'),
41 (1, 'Connected'),
42 (2, 'Configured'),
42 (2, 'Configured'),
43 (3, 'Running'),
43 (3, 'Running'),
44 (4, 'Scheduled'),
44 (4, 'Scheduled'),
45 )
45 )
46
46
47 EXPERIMENT_TYPE = (
47 EXPERIMENT_TYPE = (
48 (0, 'RAW_DATA'),
48 (0, 'RAW_DATA'),
49 (1, 'PDATA'),
49 (1, 'PDATA'),
50 )
50 )
51
51
52 DECODE_TYPE = (
52 DECODE_TYPE = (
53 (0, 'None'),
53 (0, 'None'),
54 (1, 'TimeDomain'),
54 (1, 'TimeDomain'),
55 (2, 'FreqDomain'),
55 (2, 'FreqDomain'),
56 (3, 'InvFreqDomain'),
56 (3, 'InvFreqDomain'),
57 )
57 )
58
58
59 DEV_STATES = (
59 DEV_STATES = (
60 (0, 'No connected'),
60 (0, 'No connected'),
61 (1, 'Connected'),
61 (1, 'Connected'),
62 (2, 'Configured'),
62 (2, 'Configured'),
63 (3, 'Running'),
63 (3, 'Running'),
64 (4, 'Unknown'),
64 (4, 'Unknown'),
65 )
65 )
66
66
67 DEV_TYPES = (
67 DEV_TYPES = (
68 ('', 'Select a device type'),
68 ('', 'Select a device type'),
69 ('rc', 'Radar Controller'),
69 ('rc', 'Radar Controller'),
70 ('dds', 'Direct Digital Synthesizer'),
70 ('dds', 'Direct Digital Synthesizer'),
71 ('jars', 'Jicamarca Radar Acquisition System'),
71 ('jars', 'Jicamarca Radar Acquisition System'),
72 ('usrp', 'Universal Software Radio Peripheral'),
72 ('usrp', 'Universal Software Radio Peripheral'),
73 ('cgs', 'Clock Generator System'),
73 ('cgs', 'Clock Generator System'),
74 ('abs', 'Automatic Beam Switching'),
74 ('abs', 'Automatic Beam Switching'),
75 ('dds_rest', 'Direct Digital Synthesizer_REST'),
75 ('dds_rest', 'Direct Digital Synthesizer_REST'),
76 ('atrad', 'Transmitter ATRAD'),
76 ('atrad', 'Transmitter ATRAD'),
77 )
77 )
78
78
79 EXP_STATES = (
79 EXP_STATES = (
80 (0,'Error'), #RED
80 (0,'Error'), #RED
81 (1,'Cancelled'), #YELLOW
81 (1,'Cancelled'), #YELLOW
82 (2,'Running'), #GREEN
82 (2,'Running'), #GREEN
83 (3,'Scheduled'), #BLUE
83 (3,'Scheduled'), #BLUE
84 (4,'Unknown'), #WHITE
84 (4,'Unknown'), #WHITE
85 )
85 )
86
86
87 CONF_TYPES = (
87 CONF_TYPES = (
88 (0, 'Active'),
88 (0, 'Active'),
89 (1, 'Historical'),
89 (1, 'Historical'),
90 )
90 )
91
91
92 class Profile(models.Model):
92 class Profile(models.Model):
93 user = models.OneToOneField(User, on_delete=models.CASCADE)
93 user = models.OneToOneField(User, on_delete=models.CASCADE)
94 theme = models.CharField(max_length=30, default='spacelab')
94 theme = models.CharField(max_length=30, default='spacelab')
95
95
96
96
97 @receiver(post_save, sender=User)
97 @receiver(post_save, sender=User)
98 def create_user_profile(sender, instance, created, **kwargs):
98 def create_user_profile(sender, instance, created, **kwargs):
99 if created:
99 if created:
100 Profile.objects.create(user=instance)
100 Profile.objects.create(user=instance)
101
101
102 @receiver(post_save, sender=User)
102 @receiver(post_save, sender=User)
103 def save_user_profile(sender, instance, **kwargs):
103 def save_user_profile(sender, instance, **kwargs):
104 instance.profile.save()
104 instance.profile.save()
105
105
106
106
107 class Location(models.Model):
107 class Location(models.Model):
108
108
109 name = models.CharField(max_length = 30)
109 name = models.CharField(max_length = 30)
110 description = models.TextField(blank=True, null=True)
110 description = models.TextField(blank=True, null=True)
111
111
112 class Meta:
112 class Meta:
113 db_table = 'db_location'
113 db_table = 'db_location'
114
114
115 def __str__(self):
115 def __str__(self):
116 return u'%s' % self.name
116 return u'%s' % self.name
117
117
118 def get_absolute_url(self):
118 def get_absolute_url(self):
119 return reverse('url_location', args=[str(self.id)])
119 return reverse('url_location', args=[str(self.id)])
120
120
121
121
122 class DeviceType(models.Model):
122 class DeviceType(models.Model):
123
123
124 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'dds_rest')
124 name = models.CharField(max_length = 10, choices = DEV_TYPES, default = 'dds_rest')
125 sequence = models.PositiveSmallIntegerField(default=55)
125 sequence = models.PositiveSmallIntegerField(default=55)
126 description = models.TextField(blank=True, null=True)
126 description = models.TextField(blank=True, null=True)
127
127
128 class Meta:
128 class Meta:
129 db_table = 'db_device_types'
129 db_table = 'db_device_types'
130
130
131 def __str__(self):
131 def __str__(self):
132 return u'%s' % self.get_name_display()
132 return u'%s' % self.get_name_display()
133
133
134 class Device(models.Model):
134 class Device(models.Model):
135
135
136 device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE)
136 device_type = models.ForeignKey('DeviceType', on_delete=models.CASCADE)
137 location = models.ForeignKey('Location', on_delete=models.CASCADE)
137 location = models.ForeignKey('Location', on_delete=models.CASCADE)
138 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
138 ip_address = models.GenericIPAddressField(protocol='IPv4', default='0.0.0.0')
139 port_address = models.PositiveSmallIntegerField(default=2000)
139 port_address = models.PositiveSmallIntegerField(default=2000)
140 description = models.TextField(blank=True, null=True)
140 description = models.TextField(blank=True, null=True)
141 status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES)
141 status = models.PositiveSmallIntegerField(default=4, choices=DEV_STATES)
142 conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration')
142 conf_active = models.PositiveIntegerField(default=0, verbose_name='Current configuration')
143
143
144 class Meta:
144 class Meta:
145 db_table = 'db_devices'
145 db_table = 'db_devices'
146
146
147 def __str__(self):
147 def __str__(self):
148 ret = u'{} [{}]'.format(self.device_type.name.upper(), self.location.name)
148 ret = u'{} [{}]'.format(self.device_type.name.upper(), self.location.name)
149
149
150 return ret
150 return ret
151
151
152 @property
152 @property
153 def name(self):
153 def name(self):
154 return str(self)
154 return str(self)
155
155
156 def get_status(self):
156 def get_status(self):
157 return self.status
157 return self.status
158
158
159 @property
159 @property
160 def status_color(self):
160 def status_color(self):
161 color = 'muted'
161 color = 'muted'
162 if self.status == 0:
162 if self.status == 0:
163 color = "danger"
163 color = "danger"
164 elif self.status == 1:
164 elif self.status == 1:
165 color = "warning"
165 color = "warning"
166 elif self.status == 2:
166 elif self.status == 2:
167 color = "info"
167 color = "info"
168 elif self.status == 3:
168 elif self.status == 3:
169 color = "success"
169 color = "success"
170
170
171 return color
171 return color
172
172
173 def url(self, path=None):
173 def url(self, path=None):
174
174
175 if path:
175 if path:
176 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
176 return 'http://{}:{}/{}/'.format(self.ip_address, self.port_address, path)
177 else:
177 else:
178 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
178 return 'http://{}:{}/'.format(self.ip_address, self.port_address)
179
179
180 def get_absolute_url(self):
180 def get_absolute_url(self):
181 return reverse('url_device', args=[str(self.id)])
181 return reverse('url_device', args=[str(self.id)])
182
182
183 def get_absolute_url_edit(self):
183 def get_absolute_url_edit(self):
184 return reverse('url_edit_device', args=[str(self.id)])
184 return reverse('url_edit_device', args=[str(self.id)])
185
185
186 def get_absolute_url_delete(self):
186 def get_absolute_url_delete(self):
187 return reverse('url_delete_device', args=[str(self.id)])
187 return reverse('url_delete_device', args=[str(self.id)])
188
188
189 def change_ip(self, ip_address, mask, gateway, dns, **kwargs):
189 def change_ip(self, ip_address, mask, gateway, dns, **kwargs):
190
190
191 if self.device_type.name=='dds':
191 if self.device_type.name=='dds':
192 try:
192 try:
193 answer = dds_api.change_ip(ip = self.ip_address,
193 answer = dds_api.change_ip(ip = self.ip_address,
194 port = self.port_address,
194 port = self.port_address,
195 new_ip = ip_address,
195 new_ip = ip_address,
196 mask = mask,
196 mask = mask,
197 gateway = gateway)
197 gateway = gateway)
198 if answer[0]=='1':
198 if answer[0]=='1':
199 self.message = '25|DDS - {}'.format(answer)
199 self.message = '25|DDS - {}'.format(answer)
200 self.ip_address = ip_address
200 self.ip_address = ip_address
201 self.save()
201 self.save()
202 else:
202 else:
203 self.message = '30|DDS - {}'.format(answer)
203 self.message = '30|DDS - {}'.format(answer)
204 return False
204 return False
205 except Exception as e:
205 except Exception as e:
206 self.message = '40|{}'.format(str(e))
206 self.message = '40|{}'.format(str(e))
207 return False
207 return False
208
208
209 elif self.device_type.name=='rc':
209 elif self.device_type.name=='rc':
210 headers = {'content-type': "application/json",
210 headers = {'content-type': "application/json",
211 'cache-control': "no-cache"}
211 'cache-control': "no-cache"}
212
212
213 ip = [int(x) for x in ip_address.split('.')]
213 ip = [int(x) for x in ip_address.split('.')]
214 dns = [int(x) for x in dns.split('.')]
214 dns = [int(x) for x in dns.split('.')]
215 gateway = [int(x) for x in gateway.split('.')]
215 gateway = [int(x) for x in gateway.split('.')]
216 subnet = [int(x) for x in mask.split('.')]
216 subnet = [int(x) for x in mask.split('.')]
217
217
218 payload = {
218 payload = {
219 "ip": ip,
219 "ip": ip,
220 "dns": dns,
220 "dns": dns,
221 "gateway": gateway,
221 "gateway": gateway,
222 "subnet": subnet
222 "subnet": subnet
223 }
223 }
224
224
225 req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers)
225 req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers)
226 try:
226 try:
227 answer = req.json()
227 answer = req.json()
228 if answer['changeip']=='ok':
228 if answer['changeip']=='ok':
229 self.message = '25|IP succesfully changed'
229 self.message = '25|IP succesfully changed'
230 self.ip_address = ip_address
230 self.ip_address = ip_address
231 self.save()
231 self.save()
232 else:
232 else:
233 self.message = '30|An error ocuur when changing IP'
233 self.message = '30|An error ocuur when changing IP'
234 except Exception as e:
234 except Exception as e:
235 self.message = '40|{}'.format(str(e))
235 self.message = '40|{}'.format(str(e))
236 else:
236 else:
237 self.message = 'Not implemented'
237 self.message = 'Not implemented'
238 return False
238 return False
239
239
240 return True
240 return True
241
241
242
242
243 class Campaign(models.Model):
243 class Campaign(models.Model):
244
244
245 template = models.BooleanField(default=False)
245 template = models.BooleanField(default=False)
246 name = models.CharField(max_length=60, unique=True)
246 name = models.CharField(max_length=60, unique=True)
247 start_date = models.DateTimeField(blank=True, null=True)
247 start_date = models.DateTimeField(blank=True, null=True)
248 end_date = models.DateTimeField(blank=True, null=True)
248 end_date = models.DateTimeField(blank=True, null=True)
249 tags = models.CharField(max_length=40, blank=True, null=True)
249 tags = models.CharField(max_length=40, blank=True, null=True)
250 description = models.TextField(blank=True, null=True)
250 description = models.TextField(blank=True, null=True)
251 experiments = models.ManyToManyField('Experiment', blank=True)
251 experiments = models.ManyToManyField('Experiment', blank=True)
252 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
252 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
253
253
254 class Meta:
254 class Meta:
255 db_table = 'db_campaigns'
255 db_table = 'db_campaigns'
256 ordering = ('name',)
256 ordering = ('name',)
257
257
258 def __str__(self):
258 def __str__(self):
259 if self.template:
259 if self.template:
260 return u'{} (template)'.format(self.name)
260 return u'{} (template)'.format(self.name)
261 else:
261 else:
262 return u'{}'.format(self.name)
262 return u'{}'.format(self.name)
263
263
264 def jsonify(self):
264 def jsonify(self):
265
265
266 data = {}
266 data = {}
267
267
268 ignored = ('template')
268 ignored = ('template')
269
269
270 for field in self._meta.fields:
270 for field in self._meta.fields:
271 if field.name in ignored:
271 if field.name in ignored:
272 continue
272 continue
273 data[field.name] = field.value_from_object(self)
273 data[field.name] = field.value_from_object(self)
274
274
275 data['start_date'] = data['start_date'].strftime('%Y-%m-%d')
275 data['start_date'] = data['start_date'].strftime('%Y-%m-%d')
276 data['end_date'] = data['end_date'].strftime('%Y-%m-%d')
276 data['end_date'] = data['end_date'].strftime('%Y-%m-%d')
277
277
278 return data
278 return data
279
279
280 def parms_to_dict(self):
280 def parms_to_dict(self):
281
281
282 params = Params({})
282 params = Params({})
283 params.add(self.jsonify(), 'campaigns')
283 params.add(self.jsonify(), 'campaigns')
284
284
285 for exp in Experiment.objects.filter(campaign = self):
285 for exp in Experiment.objects.filter(campaign = self):
286 params.add(exp.jsonify(), 'experiments')
286 params.add(exp.jsonify(), 'experiments')
287 configurations = Configuration.objects.filter(experiment=exp, type=0)
287 configurations = Configuration.objects.filter(experiment=exp, type=0)
288
288
289 for conf in configurations:
289 for conf in configurations:
290 params.add(conf.jsonify(), 'configurations')
290 params.add(conf.jsonify(), 'configurations')
291 if conf.device.device_type.name=='rc':
291 if conf.device.device_type.name=='rc':
292 for line in conf.get_lines():
292 for line in conf.get_lines():
293 params.add(line.jsonify(), 'lines')
293 params.add(line.jsonify(), 'lines')
294
294
295 return params.data
295 return params.data
296
296
297 def dict_to_parms(self, parms, CONF_MODELS):
297 def dict_to_parms(self, parms, CONF_MODELS):
298
298
299 experiments = Experiment.objects.filter(campaign = self)
299 experiments = Experiment.objects.filter(campaign = self)
300
300
301 if experiments:
301 if experiments:
302 for experiment in experiments:
302 for experiment in experiments:
303 experiment.delete()
303 experiment.delete()
304
304
305 for id_exp in parms['experiments']['allIds']:
305 for id_exp in parms['experiments']['allIds']:
306 exp_parms = parms['experiments']['byId'][id_exp]
306 exp_parms = parms['experiments']['byId'][id_exp]
307 dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds()
307 dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds()
308 exp = Experiment(name='{}'.format(dum))
308 exp = Experiment(name='{}'.format(dum))
309 exp.save()
309 exp.save()
310 exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp)
310 exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp)
311 self.experiments.add(exp)
311 self.experiments.add(exp)
312
312
313 camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]]
313 camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]]
314
314
315 self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d'))
315 self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d'))
316 self.start_date = camp_parms['start_date']
316 self.start_date = camp_parms['start_date']
317 self.end_date = camp_parms['end_date']
317 self.end_date = camp_parms['end_date']
318 self.tags = camp_parms['tags']
318 self.tags = camp_parms['tags']
319 self.save()
319 self.save()
320
320
321 return self
321 return self
322
322
323 def get_experiments_by_radar(self, radar=None):
323 def get_experiments_by_radar(self, radar=None):
324
324
325 ret = []
325 ret = []
326 if radar:
326 if radar:
327 locations = Location.objects.filter(pk=radar)
327 locations = Location.objects.filter(pk=radar)
328 else:
328 else:
329 locations = set([e.location for e in self.experiments.all()])
329 locations = set([e.location for e in self.experiments.all()])
330
330
331 for loc in locations:
331 for loc in locations:
332 dum = {}
332 dum = {}
333 dum['name'] = loc.name
333 dum['name'] = loc.name
334 dum['id'] = loc.pk
334 dum['id'] = loc.pk
335 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
335 dum['experiments'] = [e for e in self.experiments.all() if e.location==loc]
336 ret.append(dum)
336 ret.append(dum)
337
338 return ret
337 return ret
339
338
340 def get_absolute_url(self):
339 def get_absolute_url(self):
341 return reverse('url_campaign', args=[str(self.id)])
340 return reverse('url_campaign', args=[str(self.id)])
342
341
343 def get_absolute_url_edit(self):
342 def get_absolute_url_edit(self):
344 return reverse('url_edit_campaign', args=[str(self.id)])
343 return reverse('url_edit_campaign', args=[str(self.id)])
345
344
346 def get_absolute_url_delete(self):
345 def get_absolute_url_delete(self):
347 return reverse('url_delete_campaign', args=[str(self.id)])
346 return reverse('url_delete_campaign', args=[str(self.id)])
348
347
349 def get_absolute_url_export(self):
348 def get_absolute_url_export(self):
350 return reverse('url_export_campaign', args=[str(self.id)])
349 return reverse('url_export_campaign', args=[str(self.id)])
351
350
352 def get_absolute_url_import(self):
351 def get_absolute_url_import(self):
353 return reverse('url_import_campaign', args=[str(self.id)])
352 return reverse('url_import_campaign', args=[str(self.id)])
354
353
355
354
356 class RunningExperiment(models.Model):
355 class RunningExperiment(models.Model):
357 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
356 radar = models.OneToOneField('Location', on_delete=models.CASCADE)
358 running_experiment = models.ManyToManyField('Experiment', blank = True)
357 running_experiment = models.ManyToManyField('Experiment', blank = True)
359 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
358 status = models.PositiveSmallIntegerField(default=0, choices=RADAR_STATES)
360
359
361
360
362 class Experiment(models.Model):
361 class Experiment(models.Model):
363
362
364 template = models.BooleanField(default=False)
363 template = models.BooleanField(default=False)
365 name = models.CharField(max_length=40, default='', unique=True)
364 name = models.CharField(max_length=40, default='', unique=True)
366 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
365 location = models.ForeignKey('Location', null=True, blank=True, on_delete=models.CASCADE)
367 freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200)
366 freq = models.FloatField(verbose_name='Operating Freq. (MHz)', validators=[MinValueValidator(1), MaxValueValidator(10000)], default=49.9200)
368 start_time = models.TimeField(default='00:00:00')
367 start_time = models.TimeField(default='00:00:00')
369 end_time = models.TimeField(default='23:59:59')
368 end_time = models.TimeField(default='23:59:59')
370 task = models.CharField(max_length=36, default='', blank=True, null=True)
369 task = models.CharField(max_length=36, default='', blank=True, null=True)
371 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
370 status = models.PositiveSmallIntegerField(default=4, choices=EXP_STATES)
372 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
371 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
373 hash = models.CharField(default='', max_length=64, null=True, blank=True)
372 hash = models.CharField(default='', max_length=64, null=True, blank=True)
374
373
375 class Meta:
374 class Meta:
376 db_table = 'db_experiments'
375 db_table = 'db_experiments'
377 ordering = ('template', 'name')
376 ordering = ('template', 'name')
378
377
379 def __str__(self):
378 def __str__(self):
380 if self.template:
379 if self.template:
381 return u'%s (template)' % (self.name)
380 return u'%s (template)' % (self.name)
382 else:
381 else:
383 return u'%s' % (self.name)
382 return u'%s' % (self.name)
384
383
385 def jsonify(self):
384 def jsonify(self):
386
385
387 data = {}
386 data = {}
388
387
389 ignored = ('template')
388 ignored = ('template')
390
389
391 for field in self._meta.fields:
390 for field in self._meta.fields:
392 if field.name in ignored:
391 if field.name in ignored:
393 continue
392 continue
394 data[field.name] = field.value_from_object(self)
393 data[field.name] = field.value_from_object(self)
395
394
396 data['start_time'] = data['start_time'].strftime('%H:%M:%S')
395 data['start_time'] = data['start_time'].strftime('%H:%M:%S')
397 data['end_time'] = data['end_time'].strftime('%H:%M:%S')
396 data['end_time'] = data['end_time'].strftime('%H:%M:%S')
398 data['location'] = self.location.name
397 data['location'] = self.location.name
399 data['configurations'] = ['{}'.format(conf.pk) for
398 data['configurations'] = ['{}'.format(conf.pk) for
400 conf in Configuration.objects.filter(experiment=self, type=0)]
399 conf in Configuration.objects.filter(experiment=self, type=0)]
401
400
402 return data
401 return data
403
402
404 @property
403 @property
405 def radar_system(self):
404 def radar_system(self):
406 return self.location
405 return self.location
407
406
408 def clone(self, **kwargs):
407 def clone(self, **kwargs):
409
408
410 confs = Configuration.objects.filter(experiment=self, type=0)
409 confs = Configuration.objects.filter(experiment=self, type=0)
411 self.pk = None
410 self.pk = None
412 self.name = '{}_{:%y%m%d%H%M%S}'.format(self.name, datetime.now())
411 self.name = '{}_{:%y%m%d%H%M%S}'.format(self.name, datetime.now())
413 for attr, value in kwargs.items():
412 for attr, value in kwargs.items():
414 setattr(self, attr, value)
413 setattr(self, attr, value)
415
414
416 self.save()
415 self.save()
417
416
418 for conf in confs:
417 for conf in confs:
419 conf.clone(experiment=self, template=False)
418 conf.clone(experiment=self, template=False)
420
419
421 return self
420 return self
422
421
423 def start(self):
422 def start(self):
424 '''
423 '''
425 Configure and start experiments's devices
424 Configure and start experiments's devices
426 ABS-CGS-DDS-RC-JARS
425 ABS-CGS-DDS-RC-JARS
427 '''
426 '''
428
427
429 confs = []
428 confs = []
430 allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence')
429 allconfs = Configuration.objects.filter(experiment=self, type = 0).order_by('-device__device_type__sequence')
431 rc_mix = [conf for conf in allconfs if conf.device.device_type.name=='rc' and conf.mix]
430 rc_mix = [conf for conf in allconfs if conf.device.device_type.name=='rc' and conf.mix]
432 if rc_mix:
431 if rc_mix:
433 for conf in allconfs:
432 for conf in allconfs:
434 if conf.device.device_type.name == 'rc' and not conf.mix:
433 if conf.device.device_type.name == 'rc' and not conf.mix:
435 continue
434 continue
436 confs.append(conf)
435 confs.append(conf)
437 else:
436 else:
438 confs = allconfs
437 confs = allconfs
439
438
440 print("confs: ",confs)
439 print("confs: ",confs)
441 #try:
440 #try:
442 for conf in confs:
441 for conf in confs:
443 print("conf->",conf)
442 print("conf->",conf)
444 conf.stop_device()
443 conf.stop_device()
445 conf.write_device()
444 conf.write_device()
446 conf.device.conf_active = conf.pk
445 conf.device.conf_active = conf.pk
447 conf.device.save()
446 conf.device.save()
448 conf.start_device()
447 conf.start_device()
449 time.sleep(1)
448 time.sleep(1)
450 #except:
449 #except:
451 #return 0
450 #return 0
452 return 2
451 return 2
453
452
454
453
455 def stop(self):
454 def stop(self):
456 '''
455 '''
457 Stop experiments's devices
456 Stop experiments's devices
458 DDS-JARS-RC-CGS-ABS
457 DDS-JARS-RC-CGS-ABS
459 '''
458 '''
460
459
461 confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence')
460 confs = Configuration.objects.filter(experiment=self, type = 0).order_by('device__device_type__sequence')
462 confs = confs.exclude(device__device_type__name='cgs')
461 confs = confs.exclude(device__device_type__name='cgs')
463 try:
462 try:
464 for conf in confs:
463 for conf in confs:
465 conf.stop_device()
464 conf.stop_device()
466 except:
465 except:
467 return 0
466 return 0
468 return 1
467 return 1
469
468
470 def get_status(self):
469 def get_status(self):
471
470
472 if self.status == 3:
471 if self.status == 3:
473 return
472 return
474
473
475 confs = Configuration.objects.filter(experiment=self, type=0)
474 confs = Configuration.objects.filter(experiment=self, type=0)
476
475
477 for conf in confs:
476 for conf in confs:
478 conf.status_device()
477 conf.status_device()
479
478
480 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
479 total = confs.aggregate(models.Sum('device__status'))['device__status__sum']
481
480
482 if total==2*confs.count():
481 if total==2*confs.count():
483 status = 1
482 status = 1
484 elif total == 3*confs.count():
483 elif total == 3*confs.count():
485 status = 2
484 status = 2
486 else:
485 else:
487 status = 0
486 status = 0
488
487
489 self.status = status
488 self.status = status
490 self.save()
489 self.save()
491
490
492 def status_color(self):
491 def status_color(self):
493 color = 'muted'
492 color = 'muted'
494 if self.status == 0:
493 if self.status == 0:
495 color = "danger"
494 color = "danger"
496 elif self.status == 1:
495 elif self.status == 1:
497 color = "warning"
496 color = "warning"
498 elif self.status == 2:
497 elif self.status == 2:
499 color = "success"
498 color = "success"
500 elif self.status == 3:
499 elif self.status == 3:
501 color = "info"
500 color = "info"
502
501
503 return color
502 return color
504
503
505 def parms_to_dict(self):
504 def parms_to_dict(self):
506
505
507 params = Params({})
506 params = Params({})
508 params.add(self.jsonify(), 'experiments')
507 params.add(self.jsonify(), 'experiments')
509
508
510 configurations = Configuration.objects.filter(experiment=self, type=0)
509 configurations = Configuration.objects.filter(experiment=self, type=0)
511
510
512 for conf in configurations:
511 for conf in configurations:
513 params.add(conf.jsonify(), 'configurations')
512 params.add(conf.jsonify(), 'configurations')
514 if conf.device.device_type.name=='rc':
513 if conf.device.device_type.name=='rc':
515 for line in conf.get_lines():
514 for line in conf.get_lines():
516 params.add(line.jsonify(), 'lines')
515 params.add(line.jsonify(), 'lines')
517
516
518 return params.data
517 return params.data
519
518
520 def dict_to_parms(self, parms, CONF_MODELS, id_exp=None):
519 def dict_to_parms(self, parms, CONF_MODELS, id_exp=None):
521
520
522 configurations = Configuration.objects.filter(experiment=self)
521 configurations = Configuration.objects.filter(experiment=self)
523
522
524 if id_exp is not None:
523 if id_exp is not None:
525 exp_parms = parms['experiments']['byId'][id_exp]
524 exp_parms = parms['experiments']['byId'][id_exp]
526 else:
525 else:
527 exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]]
526 exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]]
528
527
529 if configurations:
528 if configurations:
530 for configuration in configurations:
529 for configuration in configurations:
531 configuration.delete()
530 configuration.delete()
532
531
533 for id_conf in exp_parms['configurations']:
532 for id_conf in exp_parms['configurations']:
534 conf_parms = parms['configurations']['byId'][id_conf]
533 conf_parms = parms['configurations']['byId'][id_conf]
535 device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0]
534 device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0]
536 model = CONF_MODELS[conf_parms['device_type']]
535 model = CONF_MODELS[conf_parms['device_type']]
537 conf = model(
536 conf = model(
538 experiment = self,
537 experiment = self,
539 device = device,
538 device = device,
540 )
539 )
541 conf.dict_to_parms(parms, id=id_conf)
540 conf.dict_to_parms(parms, id=id_conf)
542
541
543
542
544 location, created = Location.objects.get_or_create(name=exp_parms['location'])
543 location, created = Location.objects.get_or_create(name=exp_parms['location'])
545 self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d'))
544 self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d'))
546 self.location = location
545 self.location = location
547 self.start_time = exp_parms['start_time']
546 self.start_time = exp_parms['start_time']
548 self.end_time = exp_parms['end_time']
547 self.end_time = exp_parms['end_time']
549 self.save()
548 self.save()
550
549
551 return self
550 return self
552
551
553 def get_absolute_url(self):
552 def get_absolute_url(self):
554 return reverse('url_experiment', args=[str(self.id)])
553 return reverse('url_experiment', args=[str(self.id)])
555
554
556 def get_absolute_url_edit(self):
555 def get_absolute_url_edit(self):
557 return reverse('url_edit_experiment', args=[str(self.id)])
556 return reverse('url_edit_experiment', args=[str(self.id)])
558
557
559 def get_absolute_url_delete(self):
558 def get_absolute_url_delete(self):
560 return reverse('url_delete_experiment', args=[str(self.id)])
559 return reverse('url_delete_experiment', args=[str(self.id)])
561
560
562 def get_absolute_url_import(self):
561 def get_absolute_url_import(self):
563 return reverse('url_import_experiment', args=[str(self.id)])
562 return reverse('url_import_experiment', args=[str(self.id)])
564
563
565 def get_absolute_url_export(self):
564 def get_absolute_url_export(self):
566 return reverse('url_export_experiment', args=[str(self.id)])
565 return reverse('url_export_experiment', args=[str(self.id)])
567
566
568 def get_absolute_url_start(self):
567 def get_absolute_url_start(self):
569 return reverse('url_start_experiment', args=[str(self.id)])
568 return reverse('url_start_experiment', args=[str(self.id)])
570
569
571 def get_absolute_url_stop(self):
570 def get_absolute_url_stop(self):
572 return reverse('url_stop_experiment', args=[str(self.id)])
571 return reverse('url_stop_experiment', args=[str(self.id)])
573
572
574
573
575 class Configuration(PolymorphicModel):
574 class Configuration(PolymorphicModel):
576
575
577 template = models.BooleanField(default=False)
576 template = models.BooleanField(default=False)
578 # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
577 # name = models.CharField(verbose_name="Configuration Name", max_length=40, default='')
579 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
578 device = models.ForeignKey('Device', verbose_name='Device', null=True, on_delete=models.CASCADE)
580 label = models.CharField(verbose_name="Label", max_length=40, default='', blank=True, null=True)
579 label = models.CharField(verbose_name="Label", max_length=40, default='', blank=True, null=True)
581 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
580 experiment = models.ForeignKey('Experiment', verbose_name='Experiment', null=True, blank=True, on_delete=models.CASCADE)
582 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
581 type = models.PositiveSmallIntegerField(default=0, choices=CONF_TYPES)
583 created_date = models.DateTimeField(auto_now_add=True)
582 created_date = models.DateTimeField(auto_now_add=True)
584 programmed_date = models.DateTimeField(auto_now=True)
583 programmed_date = models.DateTimeField(auto_now=True)
585 parameters = models.TextField(default='{}')
584 parameters = models.TextField(default='{}')
586 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
585 author = models.ForeignKey(User, null=True, blank=True,on_delete=models.CASCADE)
587 hash = models.CharField(default='', max_length=64, null=True, blank=True)
586 hash = models.CharField(default='', max_length=64, null=True, blank=True)
588 message = ""
587 message = ""
589
588
590 class Meta:
589 class Meta:
591 db_table = 'db_configurations'
590 db_table = 'db_configurations'
592 ordering = ('device__device_type__name',)
591 ordering = ('device__device_type__name',)
593
592
594 def __str__(self):
593 def __str__(self):
595
594
596 ret = u'{} '.format(self.device.device_type.name.upper())
595 ret = u'{} '.format(self.device.device_type.name.upper())
597
596
598 if 'mix' in [f.name for f in self._meta.get_fields()]:
597 if 'mix' in [f.name for f in self._meta.get_fields()]:
599 if self.mix:
598 if self.mix:
600 ret = '{} MIX '.format(self.device.device_type.name.upper())
599 ret = '{} MIX '.format(self.device.device_type.name.upper())
601
600
602 if 'label' in [f.name for f in self._meta.get_fields()]:
601 if 'label' in [f.name for f in self._meta.get_fields()]:
603 ret += '{}'.format(self.label)
602 ret += '{}'.format(self.label)
604
603
605 if self.template:
604 if self.template:
606 ret += ' (template)'
605 ret += ' (template)'
607
606
608 return ret
607 return ret
609
608
610 @property
609 @property
611 def name(self):
610 def name(self):
612
611
613 return str(self)
612 return str(self)
614
613
615 def jsonify(self):
614 def jsonify(self):
616
615
617 data = {}
616 data = {}
618
617
619 ignored = ('type', 'polymorphic_ctype', 'configuration_ptr',
618 ignored = ('type', 'polymorphic_ctype', 'configuration_ptr',
620 'created_date', 'programmed_date', 'template', 'device',
619 'created_date', 'programmed_date', 'template', 'device',
621 'experiment')
620 'experiment')
622
621
623 for field in self._meta.fields:
622 for field in self._meta.fields:
624 if field.name in ignored:
623 if field.name in ignored:
625 continue
624 continue
626 data[field.name] = field.value_from_object(self)
625 data[field.name] = field.value_from_object(self)
627
626
628 data['device_type'] = self.device.device_type.name
627 data['device_type'] = self.device.device_type.name
629
628
630 if self.device.device_type.name == 'rc':
629 if self.device.device_type.name == 'rc':
631 data['lines'] = ['{}'.format(line.pk) for line in self.get_lines()]
630 data['lines'] = ['{}'.format(line.pk) for line in self.get_lines()]
632 data['delays'] = self.get_delays()
631 data['delays'] = self.get_delays()
633 data['pulses'] = self.get_pulses()
632 data['pulses'] = self.get_pulses()
634
633
635 elif self.device.device_type.name == 'jars':
634 elif self.device.device_type.name == 'jars':
636 data['decode_type'] = DECODE_TYPE[self.decode_data][1]
635 data['decode_type'] = DECODE_TYPE[self.decode_data][1]
637
636
638 elif self.device.device_type.name == 'dds':
637 elif self.device.device_type.name == 'dds':
639 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
638 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
640 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
639 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
641 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
640 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
642 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
641 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
643
642
644 elif self.device.device_type.name == 'dds_rest':
643 elif self.device.device_type.name == 'dds_rest':
645 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
644 data['frequencyA_Mhz'] = float(data['frequencyA_Mhz'])
646 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
645 data['frequencyB_Mhz'] = float(data['frequencyB_Mhz'])
647 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
646 data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees'])
648 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
647 data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees'])
649 data['delta_frequency_Mhz'] = float(data['delta_frequency_Mhz'] or 0.00)
648 data['delta_frequency_Mhz'] = float(data['delta_frequency_Mhz'] or 0.00)
650 data['update_clock_Mhz'] = float(data['update_clock_Mhz'] or 0.00)
649 data['update_clock_Mhz'] = float(data['update_clock_Mhz'] or 0.00)
651 data['ramp_rate_clock_Mhz'] = float(data['ramp_rate_clock_Mhz'] or 0.0)
650 data['ramp_rate_clock_Mhz'] = float(data['ramp_rate_clock_Mhz'] or 0.0)
652 return data
651 return data
653
652
654 def clone(self, **kwargs):
653 def clone(self, **kwargs):
655
654
656 self.pk = None
655 self.pk = None
657 self.id = None
656 self.id = None
658 for attr, value in kwargs.items():
657 for attr, value in kwargs.items():
659 setattr(self, attr, value)
658 setattr(self, attr, value)
660
659
661 self.save()
660 self.save()
662
661
663 return self
662 return self
664
663
665 def parms_to_dict(self):
664 def parms_to_dict(self):
666
665
667 params = Params({})
666 params = Params({})
668 params.add(self.jsonify(), 'configurations')
667 params.add(self.jsonify(), 'configurations')
669
668
670 if self.device.device_type.name=='rc':
669 if self.device.device_type.name=='rc':
671 for line in self.get_lines():
670 for line in self.get_lines():
672 params.add(line.jsonify(), 'lines')
671 params.add(line.jsonify(), 'lines')
673
672
674 return params.data
673 return params.data
675
674
676 def parms_to_text(self):
675 def parms_to_text(self):
677
676
678 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
677 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
679
678
680
679
681 def parms_to_binary(self):
680 def parms_to_binary(self):
682
681
683 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
682 raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper())
684
683
685
684
686 def dict_to_parms(self, parameters, id=None):
685 def dict_to_parms(self, parameters, id=None):
687
686
688 params = Params(parameters)
687 params = Params(parameters)
689
688
690 if id:
689 if id:
691 data = params.get_conf(id_conf=id)
690 data = params.get_conf(id_conf=id)
692 else:
691 else:
693 data = params.get_conf(dtype=self.device.device_type.name)
692 data = params.get_conf(dtype=self.device.device_type.name)
694
693
695 if data['device_type']=='rc':
694 if data['device_type']=='rc':
696 self.clean_lines()
695 self.clean_lines()
697 lines = data.pop('lines', None)
696 lines = data.pop('lines', None)
698 for line_id in lines:
697 for line_id in lines:
699 pass
698 pass
700
699
701 for key, value in data.items():
700 for key, value in data.items():
702 if key not in ('id', 'device_type'):
701 if key not in ('id', 'device_type'):
703 setattr(self, key, value)
702 setattr(self, key, value)
704
703
705 self.save()
704 self.save()
706
705
707
706
708 def export_to_file(self, format="json"):
707 def export_to_file(self, format="json"):
709
708
710 content_type = ''
709 content_type = ''
711
710
712 if format == 'racp':
711 if format == 'racp':
713 content_type = 'text/plain'
712 content_type = 'text/plain'
714 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, 'racp')
713 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, 'racp')
715 content = self.parms_to_text(file_format = 'racp')
714 content = self.parms_to_text(file_format = 'racp')
716
715
717 if format == 'text':
716 if format == 'text':
718 content_type = 'text/plain'
717 content_type = 'text/plain'
719 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
718 filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name)
720 content = self.parms_to_text()
719 content = self.parms_to_text()
721
720
722 if format == 'binary':
721 if format == 'binary':
723 content_type = 'application/octet-stream'
722 content_type = 'application/octet-stream'
724 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
723 filename = '%s_%s.bin' %(self.device.device_type.name, self.name)
725 content = self.parms_to_binary()
724 content = self.parms_to_binary()
726
725
727 if not content_type:
726 if not content_type:
728 content_type = 'application/json'
727 content_type = 'application/json'
729 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
728 filename = '%s_%s.json' %(self.device.device_type.name, self.name)
730 content = json.dumps(self.parms_to_dict(), indent=2)
729 content = json.dumps(self.parms_to_dict(), indent=2)
731
730
732 fields = {'content_type':content_type,
731 fields = {'content_type':content_type,
733 'filename':filename,
732 'filename':filename,
734 'content':content
733 'content':content
735 }
734 }
736
735
737 return fields
736 return fields
738
737
739 def import_from_file(self, fp):
738 def import_from_file(self, fp):
740
739
741 parms = {}
740 parms = {}
742
741
743 path, ext = os.path.splitext(fp.name)
742 path, ext = os.path.splitext(fp.name)
744
743
745 if ext == '.json':
744 if ext == '.json':
746 parms = json.load(fp)
745 parms = json.load(fp)
747
746
748 if ext == '.dds':
747 if ext == '.dds':
749 lines = fp.readlines()
748 lines = fp.readlines()
750 parms = dds_data.text_to_dict(lines)
749 parms = dds_data.text_to_dict(lines)
751
750
752 if ext == '.racp':
751 if ext == '.racp':
753 if self.device.device_type.name == 'jars':
752 if self.device.device_type.name == 'jars':
754 parms = RacpFile(fp).to_dict()
753 parms = RacpFile(fp).to_dict()
755 parms['filter_parms'] = json.loads(self.filter_parms)
754 parms['filter_parms'] = json.loads(self.filter_parms)
756 return parms
755 return parms
757 parms = RCFile(fp).to_dict()
756 parms = RCFile(fp).to_dict()
758
757
759 return parms
758 return parms
760
759
761 def status_device(self):
760 def status_device(self):
762
761
763 self.message = 'Function not implemented'
762 self.message = 'Function not implemented'
764 return False
763 return False
765
764
766
765
767 def stop_device(self):
766 def stop_device(self):
768
767
769 self.message = 'Function not implemented'
768 self.message = 'Function not implemented'
770 return False
769 return False
771
770
772
771
773 def start_device(self):
772 def start_device(self):
774
773
775 self.message = 'Function not implemented'
774 self.message = 'Function not implemented'
776 return False
775 return False
777
776
778
777
779 def write_device(self, parms):
778 def write_device(self, parms):
780
779
781 self.message = 'Function not implemented'
780 self.message = 'Function not implemented'
782 return False
781 return False
783
782
784 def write_device_mqtt(self, parms):
783 def write_device_mqtt(self, parms):
785
784
786 self.message = 'Function not implemented'
785 self.message = 'Function not implemented'
787 return False
786 return False
788
787
789 def read_device(self):
788 def read_device(self):
790
789
791 self.message = 'Function not implemented'
790 self.message = 'Function not implemented'
792 return False
791 return False
793
792
794
793
795 def get_absolute_url(self):
794 def get_absolute_url(self):
796 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
795 return reverse('url_%s_conf' % self.device.device_type.name, args=[str(self.id)])
797
796
798 def get_absolute_url_edit(self):
797 def get_absolute_url_edit(self):
799 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
798 return reverse('url_edit_%s_conf' % self.device.device_type.name, args=[str(self.id)])
800
799
801 def get_absolute_url_delete(self):
800 def get_absolute_url_delete(self):
802 return reverse('url_delete_dev_conf', args=[str(self.id)])
801 return reverse('url_delete_dev_conf', args=[str(self.id)])
803
802
804 def get_absolute_url_import(self):
803 def get_absolute_url_import(self):
805 return reverse('url_import_dev_conf', args=[str(self.id)])
804 return reverse('url_import_dev_conf', args=[str(self.id)])
806
805
807 def get_absolute_url_export(self):
806 def get_absolute_url_export(self):
808 return reverse('url_export_dev_conf', args=[str(self.id)])
807 return reverse('url_export_dev_conf', args=[str(self.id)])
809
808
810 def get_absolute_url_write(self):
809 def get_absolute_url_write(self):
811 return reverse('url_write_dev_conf', args=[str(self.id)])
810 return reverse('url_write_dev_conf', args=[str(self.id)])
812
811
813 def get_absolute_url_write_mqtt(self):
812 def get_absolute_url_write_mqtt(self):
814 return reverse('url_write_mqtt_dev_conf', args=[str(self.id)])
813 return reverse('url_write_mqtt_dev_conf', args=[str(self.id)])
815
814
816 def get_absolute_url_read(self):
815 def get_absolute_url_read(self):
817 return reverse('url_read_dev_conf', args=[str(self.id)])
816 return reverse('url_read_dev_conf', args=[str(self.id)])
818
817
819 def get_absolute_url_start(self):
818 def get_absolute_url_start(self):
820 return reverse('url_start_dev_conf', args=[str(self.id)])
819 return reverse('url_start_dev_conf', args=[str(self.id)])
821
820
822 def get_absolute_url_stop(self):
821 def get_absolute_url_stop(self):
823 return reverse('url_stop_dev_conf', args=[str(self.id)])
822 return reverse('url_stop_dev_conf', args=[str(self.id)])
824
823
825 def get_absolute_url_stop_mqtt(self):
824 def get_absolute_url_stop_mqtt(self):
826 return reverse('url_stop_mqtt_dev_conf', args=[str(self.id)])
825 return reverse('url_stop_mqtt_dev_conf', args=[str(self.id)])
827
826
828 def get_absolute_url_status(self):
827 def get_absolute_url_status(self):
829 return reverse('url_status_dev_conf', args=[str(self.id)])
828 return reverse('url_status_dev_conf', args=[str(self.id)])
@@ -1,62 +1,62
1 import os
1 import os
2 import paho.mqtt.client as mqtt
2 import paho.mqtt.client as mqtt
3 from radarsys import settings
3 from radarsys import settings
4 from radarsys.socketconfig import sio as sio
4 from radarsys.socketconfig import sio as sio
5
5
6
6
7 lista_ack=[
7 lista_ack=[
8 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128
8 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128
9 ]
9 ]
10
10
11
11
12
12
13 def on_connect(mqtt_client, userdata, flags, rc):
13 def on_connect(mqtt_client, userdata, flags, rc):
14 if rc == 0:
14 if rc == 0:
15 print('Connected successfully')
15 #print('Connected successfully')
16 mqtt_client.subscribe(os.environ.get('TOPIC_ABS_ACK','abs/beams_ack'))
16 mqtt_client.subscribe(os.environ.get('TOPIC_ABS_ACK','abs/beams_ack'))
17 else:
17 else:
18 print('Bad connection. Code:', rc)
18 print('Bad connection. Code:', rc)
19
19
20 def on_message(mqtt_client, userdata, msg):
20 def on_message(mqtt_client, userdata, msg):
21 # print(f'Received message on topic: {msg.topic} with payload: {msg.payload}', flush=True)
21 # print(f'Received message on topic: {msg.topic} with payload: {msg.payload}', flush=True)
22 # message= str(msg.payload)
22 # message= str(msg.payload)
23 # sio.emit('abs_ws',data={'msg':message})
23 # sio.emit('abs_ws',data={'msg':message})
24 #print("HOLA",flush=True)
24 #print("HOLA",flush=True)
25 # message=msg.payload[1]
25 # message=msg.payload[1]
26 # print("HOLAAA ",message,flush=True)
26 # print("HOLAAA ",message,flush=True)
27 # #lista_ack.remove(msg.payload)
27 # #lista_ack.remove(msg.payload)
28 # print("LISTA ",lista_ack)
28 # print("LISTA ",lista_ack)
29 global lista_ack
29 global lista_ack
30 global lista_ack_dismatching
30 global lista_ack_dismatching
31 message= str(msg.payload)
31 message= str(msg.payload)
32 message=message[2:len(message)-1]
32 message=message[2:len(message)-1]
33 if(message=="UPDATE"):
33 if(message=="UPDATE"):
34 print("UUPDATE")
34 print("UUPDATE")
35 sio.emit('beams_ack',data={'msg':lista_ack})
35 sio.emit('beams_ack',data={'msg':lista_ack})
36 print(lista_ack,flush=True)
36 print(lista_ack,flush=True)
37 lista_ack=[
37 lista_ack=[
38 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128
38 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128
39 ]
39 ]
40 else:
40 else:
41 message=int(message)
41 message=int(message)
42 if(message<=64):
42 if(message<=64):
43 # print(message,"\t MATCH",flush=True)
43 # print(message,"\t MATCH",flush=True)
44 lista_ack.remove(message+64)
44 lista_ack.remove(message+64)
45
45
46 elif(message>64):
46 elif(message>64):
47 # print(message,"\t DISMATCH",flush=True)
47 # print(message,"\t DISMATCH",flush=True)
48 lista_ack.remove(message-64)
48 lista_ack.remove(message-64)
49 else:
49 else:
50 print(len(message))
50 print(len(message))
51
51
52
52
53
53
54 client = mqtt.Client()
54 client = mqtt.Client()
55 client.on_connect = on_connect
55 client.on_connect = on_connect
56 client.on_message = on_message
56 client.on_message = on_message
57 client.username_pw_set(os.environ.get('MQTT_USER', 'abs'), os.environ.get('MQTT_PASSWORD', 'abs'))
57 client.username_pw_set(os.environ.get('MQTT_USER', 'abs'), os.environ.get('MQTT_PASSWORD', 'abs'))
58 client.connect(
58 client.connect(
59 host=os.environ.get('MQTT_SERVER', '10.10.10.200'),
59 host=os.environ.get('MQTT_SERVER', '10.10.10.200'),
60 port=int(settings.os.environ.get('MQTT_PORT', 1883)),
60 port=int(settings.os.environ.get('MQTT_PORT', 1883)),
61 keepalive=int(os.environ.get('MQTT_KEEPALIVE', 60000))
61 keepalive=int(os.environ.get('MQTT_KEEPALIVE', 60000))
62 ) No newline at end of file
62 )
@@ -1,2110 +1,2110
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 CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
23 from .forms import CampaignForm, ExperimentForm, DeviceForm, ConfigurationForm, LocationForm, UploadFileForm, DownloadFileForm, OperationForm, NewForm
24 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
24 from .forms import OperationSearchForm, FilterForm, ChangeIpForm
25
25
26 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
26 from apps.rc.forms import RCConfigurationForm, RCLineCode, RCMixConfigurationForm
27 from apps.dds.forms import DDSConfigurationForm
27 from apps.dds.forms import DDSConfigurationForm
28 from apps.jars.forms import JARSConfigurationForm
28 from apps.jars.forms import JARSConfigurationForm
29 from apps.cgs.forms import CGSConfigurationForm
29 from apps.cgs.forms import CGSConfigurationForm
30 from apps.abs.forms import ABSConfigurationForm
30 from apps.abs.forms import ABSConfigurationForm
31 from apps.usrp.forms import USRPConfigurationForm
31 from apps.usrp.forms import USRPConfigurationForm
32 from apps.dds_rest.forms import DDSRestConfigurationForm
32 from apps.dds_rest.forms import DDSRestConfigurationForm
33 from apps.atrad.forms import ATRADConfigurationForm
33 from apps.atrad.forms import ATRADConfigurationForm
34 from .utils import Params
34 from .utils import Params
35
35
36 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
36 from .models import Campaign, Experiment, Device, Configuration, Location, RunningExperiment, DEV_STATES
37 from apps.cgs.models import CGSConfiguration
37 from apps.cgs.models import CGSConfiguration
38 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
38 from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE
39 from apps.usrp.models import USRPConfiguration
39 from apps.usrp.models import USRPConfiguration
40 from apps.abs.models import ABSConfiguration, ABSBeam
40 from apps.abs.models import ABSConfiguration, ABSBeam
41 from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock
41 from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock
42 from apps.dds.models import DDSConfiguration
42 from apps.dds.models import DDSConfiguration
43 from apps.dds_rest.models import DDSRestConfiguration
43 from apps.dds_rest.models import DDSRestConfiguration
44 from apps.atrad.models import ATRADConfiguration
44 from apps.atrad.models import ATRADConfiguration
45
45
46 #from .tasks import task_start
46 #from .tasks import task_start
47 from radarsys.celery import app
47 from radarsys.celery import app
48
48
49
49
50 from .mqtt import client as mqtt_client
50 from .mqtt import client as mqtt_client
51 from radarsys.socketconfig import sio as sio
51 from radarsys.socketconfig import sio as sio
52
52
53 #comentario test
53 #comentario test
54 CONF_FORMS = {
54 CONF_FORMS = {
55 'rc': RCConfigurationForm,
55 'rc': RCConfigurationForm,
56 'dds': DDSConfigurationForm,
56 'dds': DDSConfigurationForm,
57 'dds_rest': DDSRestConfigurationForm,
57 'dds_rest': DDSRestConfigurationForm,
58 'jars': JARSConfigurationForm,
58 'jars': JARSConfigurationForm,
59 'cgs': CGSConfigurationForm,
59 'cgs': CGSConfigurationForm,
60 'abs': ABSConfigurationForm,
60 'abs': ABSConfigurationForm,
61 'usrp': USRPConfigurationForm,
61 'usrp': USRPConfigurationForm,
62 'atrad': ATRADConfigurationForm,
62 'atrad': ATRADConfigurationForm,
63 }
63 }
64
64
65 CONF_MODELS = {
65 CONF_MODELS = {
66 'rc': RCConfiguration,
66 'rc': RCConfiguration,
67 'dds': DDSConfiguration,
67 'dds': DDSConfiguration,
68 'dds_rest': DDSRestConfiguration,
68 'dds_rest': DDSRestConfiguration,
69 'jars': JARSConfiguration,
69 'jars': JARSConfiguration,
70 'cgs': CGSConfiguration,
70 'cgs': CGSConfiguration,
71 'abs': ABSConfiguration,
71 'abs': ABSConfiguration,
72 'usrp': USRPConfiguration,
72 'usrp': USRPConfiguration,
73 'atrad': ATRADConfiguration,
73 'atrad': ATRADConfiguration,
74 }
74 }
75
75
76 MIX_MODES = {
76 MIX_MODES = {
77 '0': 'P',
77 '0': 'P',
78 '1': 'S',
78 '1': 'S',
79 }
79 }
80
80
81 MIX_OPERATIONS = {
81 MIX_OPERATIONS = {
82 '0': 'OR',
82 '0': 'OR',
83 '1': 'XOR',
83 '1': 'XOR',
84 '2': 'AND',
84 '2': 'AND',
85 '3': 'NAND',
85 '3': 'NAND',
86 }
86 }
87
87
88
88
89 def is_developer(user):
89 def is_developer(user):
90
90
91 groups = [str(g.name) for g in user.groups.all()]
91 groups = [str(g.name) for g in user.groups.all()]
92 return 'Developer' in groups or user.is_staff
92 return 'Developer' in groups or user.is_staff
93
93
94
94
95 def is_operator(user):
95 def is_operator(user):
96
96
97 groups = [str(g.name) for g in user.groups.all()]
97 groups = [str(g.name) for g in user.groups.all()]
98 return 'Operator' in groups or user.is_staff
98 return 'Operator' in groups or user.is_staff
99
99
100
100
101 def has_been_modified(model):
101 def has_been_modified(model):
102
102
103 prev_hash = model.hash
103 prev_hash = model.hash
104 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
104 new_hash = hashlib.sha256(str(model.parms_to_dict).encode()).hexdigest()
105 if prev_hash != new_hash:
105 if prev_hash != new_hash:
106 model.hash = new_hash
106 model.hash = new_hash
107 model.save()
107 model.save()
108 return True
108 return True
109 return False
109 return False
110
110
111
111
112 def index(request):
112 def index(request):
113 kwargs = {'no_sidebar': True}
113 kwargs = {'no_sidebar': True}
114
114
115 return render(request, 'index.html', kwargs)
115 return render(request, 'index.html', kwargs)
116
116
117
117
118 def locations(request):
118 def locations(request):
119
119
120 page = request.GET.get('page')
120 page = request.GET.get('page')
121 order = ('name',)
121 order = ('name',)
122
122
123 kwargs = get_paginator(Location, page, order)
123 kwargs = get_paginator(Location, page, order)
124
124
125 kwargs['keys'] = ['name', 'description']
125 kwargs['keys'] = ['name', 'description']
126 kwargs['title'] = 'Radar System'
126 kwargs['title'] = 'Radar System'
127 kwargs['suptitle'] = 'List'
127 kwargs['suptitle'] = 'List'
128 kwargs['no_sidebar'] = True
128 kwargs['no_sidebar'] = True
129
129
130 return render(request, 'base_list.html', kwargs)
130 return render(request, 'base_list.html', kwargs)
131
131
132
132
133 def location(request, id_loc):
133 def location(request, id_loc):
134
134
135 location = get_object_or_404(Location, pk=id_loc)
135 location = get_object_or_404(Location, pk=id_loc)
136
136
137 kwargs = {}
137 kwargs = {}
138 kwargs['location'] = location
138 kwargs['location'] = location
139 kwargs['location_keys'] = ['name', 'description']
139 kwargs['location_keys'] = ['name', 'description']
140
140
141 kwargs['title'] = 'Location'
141 kwargs['title'] = 'Location'
142 kwargs['suptitle'] = 'Details'
142 kwargs['suptitle'] = 'Details'
143
143
144 return render(request, 'location.html', kwargs)
144 return render(request, 'location.html', kwargs)
145
145
146
146
147 @login_required
147 @login_required
148 def location_new(request):
148 def location_new(request):
149
149
150 if request.method == 'GET':
150 if request.method == 'GET':
151 form = LocationForm()
151 form = LocationForm()
152
152
153 if request.method == 'POST':
153 if request.method == 'POST':
154 form = LocationForm(request.POST)
154 form = LocationForm(request.POST)
155
155
156 if form.is_valid():
156 if form.is_valid():
157 form.save()
157 form.save()
158 return redirect('url_locations')
158 return redirect('url_locations')
159
159
160 kwargs = {}
160 kwargs = {}
161 kwargs['form'] = form
161 kwargs['form'] = form
162 kwargs['title'] = 'Radar System'
162 kwargs['title'] = 'Radar System'
163 kwargs['suptitle'] = 'New'
163 kwargs['suptitle'] = 'New'
164 kwargs['button'] = 'Create'
164 kwargs['button'] = 'Create'
165
165
166 return render(request, 'base_edit.html', kwargs)
166 return render(request, 'base_edit.html', kwargs)
167
167
168
168
169 @login_required
169 @login_required
170 def location_edit(request, id_loc):
170 def location_edit(request, id_loc):
171
171
172 location = get_object_or_404(Location, pk=id_loc)
172 location = get_object_or_404(Location, pk=id_loc)
173
173
174 if request.method == 'GET':
174 if request.method == 'GET':
175 form = LocationForm(instance=location)
175 form = LocationForm(instance=location)
176
176
177 if request.method == 'POST':
177 if request.method == 'POST':
178 form = LocationForm(request.POST, instance=location)
178 form = LocationForm(request.POST, instance=location)
179
179
180 if form.is_valid():
180 if form.is_valid():
181 form.save()
181 form.save()
182 return redirect('url_locations')
182 return redirect('url_locations')
183
183
184 kwargs = {}
184 kwargs = {}
185 kwargs['form'] = form
185 kwargs['form'] = form
186 kwargs['title'] = 'Location'
186 kwargs['title'] = 'Location'
187 kwargs['suptitle'] = 'Edit'
187 kwargs['suptitle'] = 'Edit'
188 kwargs['button'] = 'Update'
188 kwargs['button'] = 'Update'
189
189
190 return render(request, 'base_edit.html', kwargs)
190 return render(request, 'base_edit.html', kwargs)
191
191
192
192
193 @login_required
193 @login_required
194 def location_delete(request, id_loc):
194 def location_delete(request, id_loc):
195
195
196 location = get_object_or_404(Location, pk=id_loc)
196 location = get_object_or_404(Location, pk=id_loc)
197
197
198 if request.method == 'POST':
198 if request.method == 'POST':
199
199
200 if is_developer(request.user):
200 if is_developer(request.user):
201 location.delete()
201 location.delete()
202 return redirect('url_locations')
202 return redirect('url_locations')
203
203
204 messages.error(request, 'Not enough permission to delete this object')
204 messages.error(request, 'Not enough permission to delete this object')
205 return redirect(location.get_absolute_url())
205 return redirect(location.get_absolute_url())
206
206
207 kwargs = {
207 kwargs = {
208 'title': 'Delete',
208 'title': 'Delete',
209 'suptitle': 'Location',
209 'suptitle': 'Location',
210 'object': location,
210 'object': location,
211 'delete': True
211 'delete': True
212 }
212 }
213
213
214 return render(request, 'confirm.html', kwargs)
214 return render(request, 'confirm.html', kwargs)
215
215
216
216
217 def devices(request):
217 def devices(request):
218
218
219 page = request.GET.get('page')
219 page = request.GET.get('page')
220 order = ('location', 'device_type')
220 order = ('location', 'device_type')
221
221
222 filters = request.GET.copy()
222 filters = request.GET.copy()
223 kwargs = get_paginator(Device, page, order, filters)
223 kwargs = get_paginator(Device, page, order, filters)
224 form = FilterForm(initial=request.GET, extra_fields=['tags'])
224 form = FilterForm(initial=request.GET, extra_fields=['tags'])
225
225
226 kwargs['keys'] = ['device_type', 'location',
226 kwargs['keys'] = ['device_type', 'location',
227 'ip_address', 'port_address', 'actions']
227 'ip_address', 'port_address', 'actions']
228 kwargs['title'] = 'Device'
228 kwargs['title'] = 'Device'
229 kwargs['suptitle'] = 'List'
229 kwargs['suptitle'] = 'List'
230 kwargs['no_sidebar'] = True
230 kwargs['no_sidebar'] = True
231 kwargs['form'] = form
231 kwargs['form'] = form
232 kwargs['add_url'] = reverse('url_add_device')
232 kwargs['add_url'] = reverse('url_add_device')
233 filters.pop('page', None)
233 filters.pop('page', None)
234 kwargs['q'] = urlencode(filters)
234 kwargs['q'] = urlencode(filters)
235 kwargs['menu_devices'] = 'active'
235 kwargs['menu_devices'] = 'active'
236 return render(request, 'base_list.html', kwargs)
236 return render(request, 'base_list.html', kwargs)
237
237
238
238
239 def device(request, id_dev):
239 def device(request, id_dev):
240
240
241 device = get_object_or_404(Device, pk=id_dev)
241 device = get_object_or_404(Device, pk=id_dev)
242
242
243 kwargs = {}
243 kwargs = {}
244 kwargs['device'] = device
244 kwargs['device'] = device
245 kwargs['device_keys'] = ['device_type',
245 kwargs['device_keys'] = ['device_type',
246 'ip_address', 'port_address', 'description']
246 'ip_address', 'port_address', 'description']
247
247
248 kwargs['title'] = 'Device'
248 kwargs['title'] = 'Device'
249 kwargs['suptitle'] = 'Details'
249 kwargs['suptitle'] = 'Details'
250 kwargs['menu_devices'] = 'active'
250 kwargs['menu_devices'] = 'active'
251
251
252 return render(request, 'device.html', kwargs)
252 return render(request, 'device.html', kwargs)
253
253
254
254
255 @login_required
255 @login_required
256 def device_new(request):
256 def device_new(request):
257
257
258 if request.method == 'GET':
258 if request.method == 'GET':
259 form = DeviceForm()
259 form = DeviceForm()
260
260
261 if request.method == 'POST':
261 if request.method == 'POST':
262 form = DeviceForm(request.POST)
262 form = DeviceForm(request.POST)
263
263
264 if form.is_valid():
264 if form.is_valid():
265 form.save()
265 form.save()
266 return redirect('url_devices')
266 return redirect('url_devices')
267
267
268 kwargs = {}
268 kwargs = {}
269 kwargs['form'] = form
269 kwargs['form'] = form
270 kwargs['title'] = 'Device'
270 kwargs['title'] = 'Device'
271 kwargs['suptitle'] = 'New_2'
271 kwargs['suptitle'] = 'New_2'
272 kwargs['button'] = 'Create'
272 kwargs['button'] = 'Create'
273 kwargs['menu_devices'] = 'active'
273 kwargs['menu_devices'] = 'active'
274
274
275 return render(request, 'base_edit.html', kwargs)
275 return render(request, 'base_edit.html', kwargs)
276
276
277
277
278 @login_required
278 @login_required
279 def device_edit(request, id_dev):
279 def device_edit(request, id_dev):
280
280
281 device = get_object_or_404(Device, pk=id_dev)
281 device = get_object_or_404(Device, pk=id_dev)
282
282
283 if request.method == 'GET':
283 if request.method == 'GET':
284 form = DeviceForm(instance=device)
284 form = DeviceForm(instance=device)
285
285
286 if request.method == 'POST':
286 if request.method == 'POST':
287 form = DeviceForm(request.POST, instance=device)
287 form = DeviceForm(request.POST, instance=device)
288
288
289 if form.is_valid():
289 if form.is_valid():
290 form.save()
290 form.save()
291 return redirect(device.get_absolute_url())
291 return redirect(device.get_absolute_url())
292
292
293 kwargs = {}
293 kwargs = {}
294 kwargs['form'] = form
294 kwargs['form'] = form
295 kwargs['title'] = 'Device'
295 kwargs['title'] = 'Device'
296 kwargs['suptitle'] = 'Edit'
296 kwargs['suptitle'] = 'Edit'
297 kwargs['button'] = 'Update'
297 kwargs['button'] = 'Update'
298 kwargs['menu_devices'] = 'active'
298 kwargs['menu_devices'] = 'active'
299
299
300 return render(request, 'base_edit.html', kwargs)
300 return render(request, 'base_edit.html', kwargs)
301
301
302
302
303 @login_required
303 @login_required
304 def device_delete(request, id_dev):
304 def device_delete(request, id_dev):
305
305
306 device = get_object_or_404(Device, pk=id_dev)
306 device = get_object_or_404(Device, pk=id_dev)
307
307
308 if request.method == 'POST':
308 if request.method == 'POST':
309
309
310 if is_developer(request.user):
310 if is_developer(request.user):
311 device.delete()
311 device.delete()
312 return redirect('url_devices')
312 return redirect('url_devices')
313
313
314 messages.error(request, 'Not enough permission to delete this object')
314 messages.error(request, 'Not enough permission to delete this object')
315 return redirect(device.get_absolute_url())
315 return redirect(device.get_absolute_url())
316
316
317 kwargs = {
317 kwargs = {
318 'title': 'Delete',
318 'title': 'Delete',
319 'suptitle': 'Device',
319 'suptitle': 'Device',
320 'object': device,
320 'object': device,
321 'delete': True
321 'delete': True
322 }
322 }
323 kwargs['menu_devices'] = 'active'
323 kwargs['menu_devices'] = 'active'
324
324
325 return render(request, 'confirm.html', kwargs)
325 return render(request, 'confirm.html', kwargs)
326
326
327
327
328 @login_required
328 @login_required
329 def device_change_ip(request, id_dev):
329 def device_change_ip(request, id_dev):
330
330
331 device = get_object_or_404(Device, pk=id_dev)
331 device = get_object_or_404(Device, pk=id_dev)
332
332
333 if request.method == 'POST':
333 if request.method == 'POST':
334
334
335 if is_developer(request.user):
335 if is_developer(request.user):
336 device.change_ip(**request.POST.dict())
336 device.change_ip(**request.POST.dict())
337
337
338 print(device.ip_address, device.message)
338 print(device.ip_address, device.message)
339
339
340 level, message = device.message.split('|')
340 level, message = device.message.split('|')
341 messages.add_message(request, level, message)
341 messages.add_message(request, level, message)
342 else:
342 else:
343 messages.error(
343 messages.error(
344 request, 'Not enough permission to delete this object')
344 request, 'Not enough permission to delete this object')
345 return redirect(device.get_absolute_url())
345 return redirect(device.get_absolute_url())
346
346
347 kwargs = {
347 kwargs = {
348 'title': 'Device',
348 'title': 'Device',
349 'suptitle': 'Change IP',
349 'suptitle': 'Change IP',
350 'object': device,
350 'object': device,
351 'previous': device.get_absolute_url(),
351 'previous': device.get_absolute_url(),
352 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
352 'form': ChangeIpForm(initial={'ip_address': device.ip_address}),
353 'message': ' ',
353 'message': ' ',
354 }
354 }
355 kwargs['menu_devices'] = 'active'
355 kwargs['menu_devices'] = 'active'
356
356
357 return render(request, 'confirm.html', kwargs)
357 return render(request, 'confirm.html', kwargs)
358
358
359
359
360 def campaigns(request):
360 def campaigns(request):
361
361
362 page = request.GET.get('page')
362 page = request.GET.get('page')
363 order = ('-start_date',)
363 order = ('-start_date',)
364 filters = request.GET.copy()
364 filters = request.GET.copy()
365
365
366 kwargs = get_paginator(Campaign, page, order, filters)
366 kwargs = get_paginator(Campaign, page, order, filters)
367
367
368 form = FilterForm(initial=request.GET, extra_fields=[
368 form = FilterForm(initial=request.GET, extra_fields=[
369 'range_date', 'tags', 'template'])
369 'range_date', 'tags', 'template'])
370 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
370 kwargs['keys'] = ['name', 'start_date', 'end_date', 'actions']
371 kwargs['title'] = 'Campaign'
371 kwargs['title'] = 'Campaign'
372 kwargs['suptitle'] = 'List'
372 kwargs['suptitle'] = 'List'
373 kwargs['no_sidebar'] = True
373 kwargs['no_sidebar'] = True
374 kwargs['form'] = form
374 kwargs['form'] = form
375 kwargs['add_url'] = reverse('url_add_campaign')
375 kwargs['add_url'] = reverse('url_add_campaign')
376 filters.pop('page', None)
376 filters.pop('page', None)
377 kwargs['q'] = urlencode(filters)
377 kwargs['q'] = urlencode(filters)
378 kwargs['menu_campaigns'] = 'active'
378 kwargs['menu_campaigns'] = 'active'
379
379
380 return render(request, 'base_list.html', kwargs)
380 return render(request, 'base_list.html', kwargs)
381
381
382
382
383 def campaign(request, id_camp):
383 def campaign(request, id_camp):
384
384
385 campaign = get_object_or_404(Campaign, pk=id_camp)
385 campaign = get_object_or_404(Campaign, pk=id_camp)
386 experiments = Experiment.objects.filter(campaign=campaign)
386 experiments = Experiment.objects.filter(campaign=campaign)
387
387
388 form = CampaignForm(instance=campaign)
388 form = CampaignForm(instance=campaign)
389
389
390 kwargs = {}
390 kwargs = {}
391 kwargs['campaign'] = campaign
391 kwargs['campaign'] = campaign
392 kwargs['campaign_keys'] = ['template', 'name',
392 kwargs['campaign_keys'] = ['template', 'name',
393 'start_date', 'end_date', 'tags', 'description']
393 'start_date', 'end_date', 'tags', 'description']
394
394
395 kwargs['experiments'] = experiments
395 kwargs['experiments'] = experiments
396 kwargs['experiment_keys'] = [
396 kwargs['experiment_keys'] = [
397 'name', 'radar_system', 'start_time', 'end_time']
397 'name', 'radar_system', 'start_time', 'end_time']
398
398
399 kwargs['title'] = 'Campaign'
399 kwargs['title'] = 'Campaign'
400 kwargs['suptitle'] = 'Details'
400 kwargs['suptitle'] = 'Details'
401
401
402 kwargs['form'] = form
402 kwargs['form'] = form
403 kwargs['button'] = 'Add Experiment'
403 kwargs['button'] = 'Add Experiment'
404 kwargs['menu_campaigns'] = 'active'
404 kwargs['menu_campaigns'] = 'active'
405
405
406 return render(request, 'campaign.html', kwargs)
406 return render(request, 'campaign.html', kwargs)
407
407
408
408
409 @login_required
409 @login_required
410 def campaign_new(request):
410 def campaign_new(request):
411
411
412 kwargs = {}
412 kwargs = {}
413
413
414 if request.method == 'GET':
414 if request.method == 'GET':
415
415
416 if 'template' in request.GET:
416 if 'template' in request.GET:
417 if request.GET['template'] == '0':
417 if request.GET['template'] == '0':
418 form = NewForm(initial={'create_from': 2},
418 form = NewForm(initial={'create_from': 2},
419 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
419 template_choices=Campaign.objects.filter(template=True).values_list('id', 'name'))
420 else:
420 else:
421 kwargs['button'] = 'Create'
421 kwargs['button'] = 'Create'
422 kwargs['experiments'] = Configuration.objects.filter(
422 kwargs['experiments'] = Configuration.objects.filter(
423 experiment=request.GET['template'])
423 experiment=request.GET['template'])
424 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
424 kwargs['experiment_keys'] = ['name', 'start_time', 'end_time']
425 camp = Campaign.objects.get(pk=request.GET['template'])
425 camp = Campaign.objects.get(pk=request.GET['template'])
426 form = CampaignForm(instance=camp,
426 form = CampaignForm(instance=camp,
427 initial={'name': '{}_{:%Y%m%d%H%M%S}'.format(camp.name, datetime.now()),
427 initial={'name': '{}_{:%Y%m%d%H%M%S}'.format(camp.name, datetime.now()),
428 'template': False})
428 'template': False})
429 elif 'blank' in request.GET:
429 elif 'blank' in request.GET:
430 kwargs['button'] = 'Create'
430 kwargs['button'] = 'Create'
431 form = CampaignForm()
431 form = CampaignForm()
432 else:
432 else:
433 form = NewForm()
433 form = NewForm()
434
434
435 if request.method == 'POST':
435 if request.method == 'POST':
436 kwargs['button'] = 'Create'
436 kwargs['button'] = 'Create'
437 post = request.POST.copy()
437 post = request.POST.copy()
438 experiments = []
438 experiments = []
439
439
440 for id_exp in post.getlist('experiments'):
440 for id_exp in post.getlist('experiments'):
441 exp = Experiment.objects.get(pk=id_exp)
441 exp = Experiment.objects.get(pk=id_exp)
442 new_exp = exp.clone(template=False)
442 new_exp = exp.clone(template=False)
443 experiments.append(new_exp)
443 experiments.append(new_exp)
444
444
445 post.setlist('experiments', [])
445 post.setlist('experiments', [])
446
446
447 form = CampaignForm(post)
447 form = CampaignForm(post)
448
448
449 if form.is_valid():
449 if form.is_valid():
450 campaign = form.save(commit=False)
450 campaign = form.save(commit=False)
451 campaign.author = request.user
451 campaign.author = request.user
452 campaign.save()
452 campaign.save()
453 for exp in experiments:
453 for exp in experiments:
454 campaign.experiments.add(exp)
454 campaign.experiments.add(exp)
455
455
456 return redirect('url_campaign', id_camp=campaign.id)
456 return redirect('url_campaign', id_camp=campaign.id)
457
457
458 kwargs['form'] = form
458 kwargs['form'] = form
459 kwargs['title'] = 'Campaign'
459 kwargs['title'] = 'Campaign'
460 kwargs['suptitle'] = 'New'
460 kwargs['suptitle'] = 'New'
461 kwargs['menu_campaigns'] = 'active'
461 kwargs['menu_campaigns'] = 'active'
462
462
463 return render(request, 'campaign_edit.html', kwargs)
463 return render(request, 'campaign_edit.html', kwargs)
464
464
465
465
466 @login_required
466 @login_required
467 def campaign_edit(request, id_camp):
467 def campaign_edit(request, id_camp):
468
468
469 campaign = get_object_or_404(Campaign, pk=id_camp)
469 campaign = get_object_or_404(Campaign, pk=id_camp)
470
470
471 if request.method == 'GET':
471 if request.method == 'GET':
472 form = CampaignForm(instance=campaign)
472 form = CampaignForm(instance=campaign)
473
473
474 if request.method == 'POST':
474 if request.method == 'POST':
475 exps = campaign.experiments.all().values_list('pk', flat=True)
475 exps = campaign.experiments.all().values_list('pk', flat=True)
476 post = request.POST.copy()
476 post = request.POST.copy()
477 new_exps = post.getlist('experiments')
477 new_exps = post.getlist('experiments')
478 post.setlist('experiments', [])
478 post.setlist('experiments', [])
479 form = CampaignForm(post, instance=campaign)
479 form = CampaignForm(post, instance=campaign)
480
480
481 if form.is_valid():
481 if form.is_valid():
482 camp = form.save()
482 camp = form.save()
483 for id_exp in new_exps:
483 for id_exp in new_exps:
484 if int(id_exp) in exps:
484 if int(id_exp) in exps:
485 exps.pop(id_exp)
485 exps.pop(id_exp)
486 else:
486 else:
487 exp = Experiment.objects.get(pk=id_exp)
487 exp = Experiment.objects.get(pk=id_exp)
488 if exp.template:
488 if exp.template:
489 camp.experiments.add(exp.clone(template=False))
489 camp.experiments.add(exp.clone(template=False))
490 else:
490 else:
491 camp.experiments.add(exp)
491 camp.experiments.add(exp)
492
492
493 for id_exp in exps:
493 for id_exp in exps:
494 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
494 camp.experiments.remove(Experiment.objects.get(pk=id_exp))
495
495
496 return redirect('url_campaign', id_camp=id_camp)
496 return redirect('url_campaign', id_camp=id_camp)
497
497
498 kwargs = {}
498 kwargs = {}
499 kwargs['form'] = form
499 kwargs['form'] = form
500 kwargs['title'] = 'Campaign'
500 kwargs['title'] = 'Campaign'
501 kwargs['suptitle'] = 'Edit'
501 kwargs['suptitle'] = 'Edit'
502 kwargs['button'] = 'Update'
502 kwargs['button'] = 'Update'
503 kwargs['menu_campaigns'] = 'active'
503 kwargs['menu_campaigns'] = 'active'
504
504
505 return render(request, 'campaign_edit.html', kwargs)
505 return render(request, 'campaign_edit.html', kwargs)
506
506
507
507
508 @login_required
508 @login_required
509 def campaign_delete(request, id_camp):
509 def campaign_delete(request, id_camp):
510
510
511 campaign = get_object_or_404(Campaign, pk=id_camp)
511 campaign = get_object_or_404(Campaign, pk=id_camp)
512
512
513 if request.method == 'POST':
513 if request.method == 'POST':
514 if is_developer(request.user):
514 if is_developer(request.user):
515
515
516 for exp in campaign.experiments.all():
516 for exp in campaign.experiments.all():
517 for conf in Configuration.objects.filter(experiment=exp):
517 for conf in Configuration.objects.filter(experiment=exp):
518 conf.delete()
518 conf.delete()
519 exp.delete()
519 exp.delete()
520 campaign.delete()
520 campaign.delete()
521
521
522 return redirect('url_campaigns')
522 return redirect('url_campaigns')
523
523
524 messages.error(request, 'Not enough permission to delete this object')
524 messages.error(request, 'Not enough permission to delete this object')
525 return redirect(campaign.get_absolute_url())
525 return redirect(campaign.get_absolute_url())
526
526
527 kwargs = {
527 kwargs = {
528 'title': 'Delete',
528 'title': 'Delete',
529 'suptitle': 'Campaign',
529 'suptitle': 'Campaign',
530 'object': campaign,
530 'object': campaign,
531 'delete': True
531 'delete': True
532 }
532 }
533 kwargs['menu_campaigns'] = 'active'
533 kwargs['menu_campaigns'] = 'active'
534
534
535 return render(request, 'confirm.html', kwargs)
535 return render(request, 'confirm.html', kwargs)
536
536
537
537
538 @login_required
538 @login_required
539 def campaign_export(request, id_camp):
539 def campaign_export(request, id_camp):
540
540
541 campaign = get_object_or_404(Campaign, pk=id_camp)
541 campaign = get_object_or_404(Campaign, pk=id_camp)
542 content = campaign.parms_to_dict()
542 content = campaign.parms_to_dict()
543 content_type = 'application/json'
543 content_type = 'application/json'
544 filename = '%s_%s.json' % (campaign.name, campaign.id)
544 filename = '%s_%s.json' % (campaign.name, campaign.id)
545
545
546 response = HttpResponse(content_type=content_type)
546 response = HttpResponse(content_type=content_type)
547 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
547 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
548 response.write(json.dumps(content, indent=2))
548 response.write(json.dumps(content, indent=2))
549
549
550 return response
550 return response
551
551
552
552
553 @login_required
553 @login_required
554 def campaign_import(request, id_camp):
554 def campaign_import(request, id_camp):
555
555
556 campaign = get_object_or_404(Campaign, pk=id_camp)
556 campaign = get_object_or_404(Campaign, pk=id_camp)
557
557
558 if request.method == 'GET':
558 if request.method == 'GET':
559 file_form = UploadFileForm()
559 file_form = UploadFileForm()
560
560
561 if request.method == 'POST':
561 if request.method == 'POST':
562 file_form = UploadFileForm(request.POST, request.FILES)
562 file_form = UploadFileForm(request.POST, request.FILES)
563
563
564 if file_form.is_valid():
564 if file_form.is_valid():
565 new_camp = campaign.dict_to_parms(
565 new_camp = campaign.dict_to_parms(
566 json.load(request.FILES['file']), CONF_MODELS)
566 json.load(request.FILES['file']), CONF_MODELS)
567 messages.success(
567 messages.success(
568 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
568 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
569 return redirect(new_camp.get_absolute_url_edit())
569 return redirect(new_camp.get_absolute_url_edit())
570
570
571 messages.error(request, "Could not import parameters from file")
571 messages.error(request, "Could not import parameters from file")
572
572
573 kwargs = {}
573 kwargs = {}
574 kwargs['title'] = 'Campaign'
574 kwargs['title'] = 'Campaign'
575 kwargs['form'] = file_form
575 kwargs['form'] = file_form
576 kwargs['suptitle'] = 'Importing file'
576 kwargs['suptitle'] = 'Importing file'
577 kwargs['button'] = 'Import'
577 kwargs['button'] = 'Import'
578 kwargs['menu_campaigns'] = 'active'
578 kwargs['menu_campaigns'] = 'active'
579
579
580 return render(request, 'campaign_import.html', kwargs)
580 return render(request, 'campaign_import.html', kwargs)
581
581
582
582
583 def experiments(request):
583 def experiments(request):
584
584
585 page = request.GET.get('page')
585 page = request.GET.get('page')
586 order = ('location',)
586 order = ('location',)
587 filters = request.GET.copy()
587 filters = request.GET.copy()
588
588
589 if 'my experiments' in filters:
589 if 'my experiments' in filters:
590 filters.pop('my experiments', None)
590 filters.pop('my experiments', None)
591 filters['mine'] = request.user.id
591 filters['mine'] = request.user.id
592
592
593 kwargs = get_paginator(Experiment, page, order, filters)
593 kwargs = get_paginator(Experiment, page, order, filters)
594
594
595 fields = ['tags', 'template']
595 fields = ['tags', 'template']
596 if request.user.is_authenticated:
596 if request.user.is_authenticated:
597 fields.append('my experiments')
597 fields.append('my experiments')
598
598
599 form = FilterForm(initial=request.GET, extra_fields=fields)
599 form = FilterForm(initial=request.GET, extra_fields=fields)
600
600
601 kwargs['keys'] = ['name', 'radar_system',
601 kwargs['keys'] = ['name', 'radar_system',
602 'start_time', 'end_time', 'actions']
602 'start_time', 'end_time', 'actions']
603 kwargs['title'] = 'Experiment'
603 kwargs['title'] = 'Experiment'
604 kwargs['suptitle'] = 'List'
604 kwargs['suptitle'] = 'List'
605 kwargs['no_sidebar'] = True
605 kwargs['no_sidebar'] = True
606 kwargs['form'] = form
606 kwargs['form'] = form
607 kwargs['add_url'] = reverse('url_add_experiment')
607 kwargs['add_url'] = reverse('url_add_experiment')
608 filters = request.GET.copy()
608 filters = request.GET.copy()
609 filters.pop('page', None)
609 filters.pop('page', None)
610 kwargs['q'] = urlencode(filters)
610 kwargs['q'] = urlencode(filters)
611 kwargs['menu_experiments'] = 'active'
611 kwargs['menu_experiments'] = 'active'
612
612
613 return render(request, 'base_list.html', kwargs)
613 return render(request, 'base_list.html', kwargs)
614
614
615
615
616 def experiment(request, id_exp):
616 def experiment(request, id_exp):
617
617
618 experiment = get_object_or_404(Experiment, pk=id_exp)
618 experiment = get_object_or_404(Experiment, pk=id_exp)
619
619
620 configurations = Configuration.objects.filter(
620 configurations = Configuration.objects.filter(
621 experiment=experiment, type=0)
621 experiment=experiment, type=0)
622
622
623 kwargs = {}
623 kwargs = {}
624
624
625 kwargs['experiment_keys'] = ['template', 'radar_system',
625 kwargs['experiment_keys'] = ['template', 'radar_system',
626 'name', 'freq', 'start_time', 'end_time']
626 'name', 'freq', 'start_time', 'end_time']
627 kwargs['experiment'] = experiment
627 kwargs['experiment'] = experiment
628 kwargs['configuration_keys'] = ['name', 'device__ip_address',
628 kwargs['configuration_keys'] = ['name', 'device__ip_address',
629 'device__port_address', 'device__status']
629 'device__port_address', 'device__status']
630 kwargs['configurations'] = configurations
630 kwargs['configurations'] = configurations
631 kwargs['title'] = 'Experiment'
631 kwargs['title'] = 'Experiment'
632 kwargs['suptitle'] = 'Details'
632 kwargs['suptitle'] = 'Details'
633 kwargs['button'] = 'Add Configuration'
633 kwargs['button'] = 'Add Configuration'
634 kwargs['menu_experiments'] = 'active'
634 kwargs['menu_experiments'] = 'active'
635
635
636 ###### SIDEBAR ######
636 ###### SIDEBAR ######
637 kwargs.update(sidebar(experiment=experiment))
637 kwargs.update(sidebar(experiment=experiment))
638
638
639 return render(request, 'experiment.html', kwargs)
639 return render(request, 'experiment.html', kwargs)
640
640
641
641
642 @login_required
642 @login_required
643 def experiment_new(request, id_camp=None):
643 def experiment_new(request, id_camp=None):
644
644
645 if not is_developer(request.user):
645 if not is_developer(request.user):
646 messages.error(
646 messages.error(
647 request, 'Developer required, to create new Experiments')
647 request, 'Developer required, to create new Experiments')
648 return redirect('index')
648 return redirect('index')
649 kwargs = {}
649 kwargs = {}
650
650
651 if request.method == 'GET':
651 if request.method == 'GET':
652 if 'template' in request.GET:
652 if 'template' in request.GET:
653 if request.GET['template'] == '0':
653 if request.GET['template'] == '0':
654 form = NewForm(initial={'create_from': 2},
654 form = NewForm(initial={'create_from': 2},
655 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
655 template_choices=Experiment.objects.filter(template=True).values_list('id', 'name'))
656 else:
656 else:
657 kwargs['button'] = 'Create'
657 kwargs['button'] = 'Create'
658 kwargs['configurations'] = Configuration.objects.filter(
658 kwargs['configurations'] = Configuration.objects.filter(
659 experiment=request.GET['template'])
659 experiment=request.GET['template'])
660 kwargs['configuration_keys'] = ['name', 'device__name',
660 kwargs['configuration_keys'] = ['name', 'device__name',
661 'device__ip_address', 'device__port_address']
661 'device__ip_address', 'device__port_address']
662 exp = Experiment.objects.get(pk=request.GET['template'])
662 exp = Experiment.objects.get(pk=request.GET['template'])
663 form = ExperimentForm(instance=exp,
663 form = ExperimentForm(instance=exp,
664 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
664 initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()),
665 'template': False})
665 'template': False})
666 elif 'blank' in request.GET:
666 elif 'blank' in request.GET:
667 kwargs['button'] = 'Create'
667 kwargs['button'] = 'Create'
668 form = ExperimentForm()
668 form = ExperimentForm()
669 else:
669 else:
670 form = NewForm()
670 form = NewForm()
671
671
672 if request.method == 'POST':
672 if request.method == 'POST':
673 form = ExperimentForm(request.POST)
673 form = ExperimentForm(request.POST)
674 if form.is_valid():
674 if form.is_valid():
675 experiment = form.save(commit=False)
675 experiment = form.save(commit=False)
676 experiment.author = request.user
676 experiment.author = request.user
677 experiment.save()
677 experiment.save()
678
678
679 if 'template' in request.GET:
679 if 'template' in request.GET:
680 configurations = Configuration.objects.filter(
680 configurations = Configuration.objects.filter(
681 experiment=request.GET['template'], type=0)
681 experiment=request.GET['template'], type=0)
682 for conf in configurations:
682 for conf in configurations:
683 conf.clone(experiment=experiment, template=False)
683 conf.clone(experiment=experiment, template=False)
684
684
685 return redirect('url_experiment', id_exp=experiment.id)
685 return redirect('url_experiment', id_exp=experiment.id)
686
686
687 kwargs['form'] = form
687 kwargs['form'] = form
688 kwargs['title'] = 'Experiment'
688 kwargs['title'] = 'Experiment'
689 kwargs['suptitle'] = 'New'
689 kwargs['suptitle'] = 'New'
690 kwargs['menu_experiments'] = 'active'
690 kwargs['menu_experiments'] = 'active'
691
691
692 return render(request, 'experiment_edit.html', kwargs)
692 return render(request, 'experiment_edit.html', kwargs)
693
693
694
694
695 @login_required
695 @login_required
696 def experiment_edit(request, id_exp):
696 def experiment_edit(request, id_exp):
697
697
698 experiment = get_object_or_404(Experiment, pk=id_exp)
698 experiment = get_object_or_404(Experiment, pk=id_exp)
699
699
700 if request.method == 'GET':
700 if request.method == 'GET':
701 form = ExperimentForm(instance=experiment)
701 form = ExperimentForm(instance=experiment)
702
702
703 if request.method == 'POST':
703 if request.method == 'POST':
704 form = ExperimentForm(request.POST, instance=experiment)
704 form = ExperimentForm(request.POST, instance=experiment)
705
705
706 if form.is_valid():
706 if form.is_valid():
707 experiment = form.save()
707 experiment = form.save()
708 return redirect('url_experiment', id_exp=experiment.id)
708 return redirect('url_experiment', id_exp=experiment.id)
709
709
710 kwargs = {}
710 kwargs = {}
711 kwargs['form'] = form
711 kwargs['form'] = form
712 kwargs['title'] = 'Experiment'
712 kwargs['title'] = 'Experiment'
713 kwargs['suptitle'] = 'Edit'
713 kwargs['suptitle'] = 'Edit'
714 kwargs['button'] = 'Update'
714 kwargs['button'] = 'Update'
715 kwargs['menu_experiments'] = 'active'
715 kwargs['menu_experiments'] = 'active'
716
716
717 return render(request, 'experiment_edit.html', kwargs)
717 return render(request, 'experiment_edit.html', kwargs)
718
718
719
719
720 @login_required
720 @login_required
721 def experiment_delete(request, id_exp):
721 def experiment_delete(request, id_exp):
722
722
723 experiment = get_object_or_404(Experiment, pk=id_exp)
723 experiment = get_object_or_404(Experiment, pk=id_exp)
724
724
725 if request.method == 'POST':
725 if request.method == 'POST':
726 if is_developer(request.user):
726 if is_developer(request.user):
727 for conf in Configuration.objects.filter(experiment=experiment):
727 for conf in Configuration.objects.filter(experiment=experiment):
728 conf.delete()
728 conf.delete()
729 experiment.delete()
729 experiment.delete()
730 return redirect('url_experiments')
730 return redirect('url_experiments')
731
731
732 messages.error(request, 'Not enough permission to delete this object')
732 messages.error(request, 'Not enough permission to delete this object')
733 return redirect(experiment.get_absolute_url())
733 return redirect(experiment.get_absolute_url())
734
734
735 kwargs = {
735 kwargs = {
736 'title': 'Delete',
736 'title': 'Delete',
737 'suptitle': 'Experiment',
737 'suptitle': 'Experiment',
738 'object': experiment,
738 'object': experiment,
739 'delete': True
739 'delete': True
740 }
740 }
741
741
742 return render(request, 'confirm.html', kwargs)
742 return render(request, 'confirm.html', kwargs)
743
743
744
744
745 @login_required
745 @login_required
746 def experiment_export(request, id_exp):
746 def experiment_export(request, id_exp):
747
747
748 experiment = get_object_or_404(Experiment, pk=id_exp)
748 experiment = get_object_or_404(Experiment, pk=id_exp)
749 content = experiment.parms_to_dict()
749 content = experiment.parms_to_dict()
750 content_type = 'application/json'
750 content_type = 'application/json'
751 filename = '%s_%s.json' % (experiment.name, experiment.id)
751 filename = '%s_%s.json' % (experiment.name, experiment.id)
752
752
753 response = HttpResponse(content_type=content_type)
753 response = HttpResponse(content_type=content_type)
754 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
754 response['Content-Disposition'] = 'attachment; filename="%s"' % filename
755 response.write(json.dumps(content, indent=2))
755 response.write(json.dumps(content, indent=2))
756
756
757 return response
757 return response
758
758
759
759
760 @login_required
760 @login_required
761 def experiment_import(request, id_exp):
761 def experiment_import(request, id_exp):
762
762
763 experiment = get_object_or_404(Experiment, pk=id_exp)
763 experiment = get_object_or_404(Experiment, pk=id_exp)
764 configurations = Configuration.objects.filter(experiment=experiment)
764 configurations = Configuration.objects.filter(experiment=experiment)
765
765
766 if request.method == 'GET':
766 if request.method == 'GET':
767 file_form = UploadFileForm()
767 file_form = UploadFileForm()
768
768
769 if request.method == 'POST':
769 if request.method == 'POST':
770 file_form = UploadFileForm(request.POST, request.FILES)
770 file_form = UploadFileForm(request.POST, request.FILES)
771
771
772 if file_form.is_valid():
772 if file_form.is_valid():
773 new_exp = experiment.dict_to_parms(
773 new_exp = experiment.dict_to_parms(
774 json.load(request.FILES['file']), CONF_MODELS)
774 json.load(request.FILES['file']), CONF_MODELS)
775 messages.success(
775 messages.success(
776 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
776 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
777 return redirect(new_exp.get_absolute_url_edit())
777 return redirect(new_exp.get_absolute_url_edit())
778
778
779 messages.error(request, "Could not import parameters from file")
779 messages.error(request, "Could not import parameters from file")
780
780
781 kwargs = {}
781 kwargs = {}
782 kwargs['title'] = 'Experiment'
782 kwargs['title'] = 'Experiment'
783 kwargs['form'] = file_form
783 kwargs['form'] = file_form
784 kwargs['suptitle'] = 'Importing file'
784 kwargs['suptitle'] = 'Importing file'
785 kwargs['button'] = 'Import'
785 kwargs['button'] = 'Import'
786 kwargs['menu_experiments'] = 'active'
786 kwargs['menu_experiments'] = 'active'
787
787
788 kwargs.update(sidebar(experiment=experiment))
788 kwargs.update(sidebar(experiment=experiment))
789
789
790 return render(request, 'experiment_import.html', kwargs)
790 return render(request, 'experiment_import.html', kwargs)
791
791
792
792
793 @login_required
793 @login_required
794 def experiment_start(request, id_exp):
794 def experiment_start(request, id_exp):
795
795
796 exp = get_object_or_404(Experiment, pk=id_exp)
796 exp = get_object_or_404(Experiment, pk=id_exp)
797
797
798 if exp.status == 2:
798 if exp.status == 2:
799 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
799 messages.warning(request, 'Experiment {} already runnnig'.format(exp))
800 else:
800 else:
801 exp.status = exp.start()
801 exp.status = exp.start()
802 if exp.status == 0:
802 if exp.status == 0:
803 messages.error(request, 'Experiment {} not start'.format(exp))
803 messages.error(request, 'Experiment {} not start'.format(exp))
804 if exp.status == 2:
804 if exp.status == 2:
805 messages.success(request, 'Experiment {} started'.format(exp))
805 messages.success(request, 'Experiment {} started'.format(exp))
806
806
807 exp.save()
807 exp.save()
808
808
809 return redirect(exp.get_absolute_url())
809 return redirect(exp.get_absolute_url())
810
810
811
811
812 @login_required
812 @login_required
813 def experiment_stop(request, id_exp):
813 def experiment_stop(request, id_exp):
814
814
815 exp = get_object_or_404(Experiment, pk=id_exp)
815 exp = get_object_or_404(Experiment, pk=id_exp)
816
816
817 if exp.status == 2:
817 if exp.status == 2:
818 exp.status = exp.stop()
818 exp.status = exp.stop()
819 exp.save()
819 exp.save()
820 messages.success(request, 'Experiment {} stopped'.format(exp))
820 messages.success(request, 'Experiment {} stopped'.format(exp))
821 else:
821 else:
822 messages.error(request, 'Experiment {} not running'.format(exp))
822 messages.error(request, 'Experiment {} not running'.format(exp))
823
823
824 return redirect(exp.get_absolute_url())
824 return redirect(exp.get_absolute_url())
825
825
826
826
827 def experiment_status(request, id_exp):
827 def experiment_status(request, id_exp):
828
828
829 exp = get_object_or_404(Experiment, pk=id_exp)
829 exp = get_object_or_404(Experiment, pk=id_exp)
830
830
831 exp.get_status()
831 exp.get_status()
832
832
833 return redirect(exp.get_absolute_url())
833 return redirect(exp.get_absolute_url())
834
834
835
835
836 @login_required
836 @login_required
837 def experiment_mix(request, id_exp):
837 def experiment_mix(request, id_exp):
838
838
839 experiment = get_object_or_404(Experiment, pk=id_exp)
839 experiment = get_object_or_404(Experiment, pk=id_exp)
840 rc_confs = [conf for conf in RCConfiguration.objects.filter(
840 rc_confs = [conf for conf in RCConfiguration.objects.filter(
841 experiment=id_exp,
841 experiment=id_exp,
842 type=0,
842 type=0,
843 mix=False)]
843 mix=False)]
844
844
845 if len(rc_confs) < 2:
845 if len(rc_confs) < 2:
846 messages.warning(
846 messages.warning(
847 request, 'You need at least two RC Configurations to make a mix')
847 request, 'You need at least two RC Configurations to make a mix')
848 return redirect(experiment.get_absolute_url())
848 return redirect(experiment.get_absolute_url())
849
849
850 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
850 mix_confs = RCConfiguration.objects.filter(experiment=id_exp, mix=True, type=0)
851
851
852 if mix_confs:
852 if mix_confs:
853 mix = mix_confs[0]
853 mix = mix_confs[0]
854 else:
854 else:
855 mix = RCConfiguration(experiment=experiment,
855 mix = RCConfiguration(experiment=experiment,
856 device=rc_confs[0].device,
856 device=rc_confs[0].device,
857 ipp=rc_confs[0].ipp,
857 ipp=rc_confs[0].ipp,
858 clock_in=rc_confs[0].clock_in,
858 clock_in=rc_confs[0].clock_in,
859 clock_divider=rc_confs[0].clock_divider,
859 clock_divider=rc_confs[0].clock_divider,
860 mix=True,
860 mix=True,
861 parameters='')
861 parameters='')
862 mix.save()
862 mix.save()
863
863
864 line_type = RCLineType.objects.get(name='mix')
864 line_type = RCLineType.objects.get(name='mix')
865 print("VIew obteniendo len getlines")
865 print("VIew obteniendo len getlines")
866 print(len(rc_confs[0].get_lines()))
866 print(len(rc_confs[0].get_lines()))
867 for i in range(len(rc_confs[0].get_lines())):
867 for i in range(len(rc_confs[0].get_lines())):
868 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
868 line = RCLine(rc_configuration=mix, line_type=line_type, channel=i)
869 line.save()
869 line.save()
870
870
871 initial = {'name': mix.name,
871 initial = {'name': mix.name,
872 'result': parse_mix_result(mix.parameters),
872 'result': parse_mix_result(mix.parameters),
873 'delay': 0,
873 'delay': 0,
874 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
874 'mask': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
875 }
875 }
876
876
877 if request.method == 'GET':
877 if request.method == 'GET':
878 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
878 form = RCMixConfigurationForm(confs=rc_confs, initial=initial)
879
879
880 if request.method == 'POST':
880 if request.method == 'POST':
881 result = mix.parameters
881 result = mix.parameters
882
882
883 if '{}|'.format(request.POST['experiment']) in result:
883 if '{}|'.format(request.POST['experiment']) in result:
884 messages.error(request, 'Configuration already added')
884 messages.error(request, 'Configuration already added')
885 else:
885 else:
886 if 'operation' in request.POST:
886 if 'operation' in request.POST:
887 operation = MIX_OPERATIONS[request.POST['operation']]
887 operation = MIX_OPERATIONS[request.POST['operation']]
888 else:
888 else:
889 operation = ' '
889 operation = ' '
890
890
891 mode = MIX_MODES[request.POST['mode']]
891 mode = MIX_MODES[request.POST['mode']]
892
892
893 if result:
893 if result:
894 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
894 result = '{}-{}|{}|{}|{}|{}'.format(mix.parameters,
895 request.POST['experiment'],
895 request.POST['experiment'],
896 mode,
896 mode,
897 operation,
897 operation,
898 float(
898 float(
899 request.POST['delay']),
899 request.POST['delay']),
900 parse_mask(
900 parse_mask(
901 request.POST.getlist('mask'))
901 request.POST.getlist('mask'))
902 )
902 )
903 else:
903 else:
904 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
904 result = '{}|{}|{}|{}|{}'.format(request.POST['experiment'],
905 mode,
905 mode,
906 operation,
906 operation,
907 float(request.POST['delay']),
907 float(request.POST['delay']),
908 parse_mask(
908 parse_mask(
909 request.POST.getlist('mask'))
909 request.POST.getlist('mask'))
910 )
910 )
911
911
912 mix.parameters = result
912 mix.parameters = result
913 mix.save()
913 mix.save()
914 mix.update_pulses()
914 mix.update_pulses()
915
915
916 initial['result'] = parse_mix_result(result)
916 initial['result'] = parse_mix_result(result)
917 initial['name'] = mix.name
917 initial['name'] = mix.name
918
918
919 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
919 form = RCMixConfigurationForm(initial=initial, confs=rc_confs)
920
920
921 kwargs = {
921 kwargs = {
922 'title': 'Experiment',
922 'title': 'Experiment',
923 'suptitle': 'Mix Configurations',
923 'suptitle': 'Mix Configurations',
924 'form': form,
924 'form': form,
925 'extra_button': 'Delete',
925 'extra_button': 'Delete',
926 'button': 'Add',
926 'button': 'Add',
927 'cancel': 'Back',
927 'cancel': 'Back',
928 'previous': experiment.get_absolute_url(),
928 'previous': experiment.get_absolute_url(),
929 'id_exp': id_exp,
929 'id_exp': id_exp,
930
930
931 }
931 }
932 kwargs['menu_experiments'] = 'active'
932 kwargs['menu_experiments'] = 'active'
933
933
934 return render(request, 'experiment_mix.html', kwargs)
934 return render(request, 'experiment_mix.html', kwargs)
935
935
936
936
937 @login_required
937 @login_required
938 def experiment_mix_delete(request, id_exp):
938 def experiment_mix_delete(request, id_exp):
939
939
940 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
940 conf = RCConfiguration.objects.get(experiment=id_exp, mix=True, type=0)
941 values = conf.parameters.split('-')
941 values = conf.parameters.split('-')
942 conf.parameters = '-'.join(values[:-1])
942 conf.parameters = '-'.join(values[:-1])
943 conf.save()
943 conf.save()
944
944
945 return redirect('url_mix_experiment', id_exp=id_exp)
945 return redirect('url_mix_experiment', id_exp=id_exp)
946
946
947
947
948 def experiment_summary(request, id_exp):
948 def experiment_summary(request, id_exp):
949
949
950 experiment = get_object_or_404(Experiment, pk=id_exp)
950 experiment = get_object_or_404(Experiment, pk=id_exp)
951 configurations = Configuration.objects.filter(
951 configurations = Configuration.objects.filter(
952 experiment=experiment, type=0)
952 experiment=experiment, type=0)
953
953
954 kwargs = {}
954 kwargs = {}
955 kwargs['experiment_keys'] = ['radar_system',
955 kwargs['experiment_keys'] = ['radar_system',
956 'name', 'freq', 'start_time', 'end_time']
956 'name', 'freq', 'start_time', 'end_time']
957 kwargs['experiment'] = experiment
957 kwargs['experiment'] = experiment
958 kwargs['configurations'] = []
958 kwargs['configurations'] = []
959 kwargs['title'] = 'Experiment Summary'
959 kwargs['title'] = 'Experiment Summary'
960 kwargs['suptitle'] = 'Details'
960 kwargs['suptitle'] = 'Details'
961 kwargs['button'] = 'Verify Parameters'
961 kwargs['button'] = 'Verify Parameters'
962
962
963 c_vel = 3.0*(10**8) # m/s
963 c_vel = 3.0*(10**8) # m/s
964 ope_freq = experiment.freq*(10**6) # 1/s
964 ope_freq = experiment.freq*(10**6) # 1/s
965 radar_lambda = c_vel/ope_freq # m
965 radar_lambda = c_vel/ope_freq # m
966 kwargs['radar_lambda'] = radar_lambda
966 kwargs['radar_lambda'] = radar_lambda
967
967
968 ipp = None
968 ipp = None
969 nsa = 1
969 nsa = 1
970 code_id = 0
970 code_id = 0
971 tx_line = {}
971 tx_line = {}
972
972
973 for configuration in configurations.filter(device__device_type__name = 'rc'):
973 for configuration in configurations.filter(device__device_type__name = 'rc'):
974
974
975 if configuration.mix:
975 if configuration.mix:
976 continue
976 continue
977 conf = {'conf': configuration}
977 conf = {'conf': configuration}
978 conf['keys'] = []
978 conf['keys'] = []
979 conf['NTxs'] = configuration.ntx
979 conf['NTxs'] = configuration.ntx
980 conf['keys'].append('NTxs')
980 conf['keys'].append('NTxs')
981 ipp = configuration.ipp
981 ipp = configuration.ipp
982 conf['IPP'] = ipp
982 conf['IPP'] = ipp
983 conf['keys'].append('IPP')
983 conf['keys'].append('IPP')
984 lines = configuration.get_lines(line_type__name='tx')
984 lines = configuration.get_lines(line_type__name='tx')
985
985
986 for tx_line in lines:
986 for tx_line in lines:
987 tx_params = json.loads(tx_line.params)
987 tx_params = json.loads(tx_line.params)
988 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
988 conf[tx_line.get_name()] = '{} Km'.format(tx_params['pulse_width'])
989 conf['keys'].append(tx_line.get_name())
989 conf['keys'].append(tx_line.get_name())
990 delays = tx_params['delays']
990 delays = tx_params['delays']
991 if delays not in ('', '0'):
991 if delays not in ('', '0'):
992 n = len(delays.split(','))
992 n = len(delays.split(','))
993 taus = '{} Taus: {}'.format(n, delays)
993 taus = '{} Taus: {}'.format(n, delays)
994 else:
994 else:
995 taus = '-'
995 taus = '-'
996 conf['Taus ({})'.format(tx_line.get_name())] = taus
996 conf['Taus ({})'.format(tx_line.get_name())] = taus
997 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
997 conf['keys'].append('Taus ({})'.format(tx_line.get_name()))
998 for code_line in configuration.get_lines(line_type__name='codes'):
998 for code_line in configuration.get_lines(line_type__name='codes'):
999 code_params = json.loads(code_line.params)
999 code_params = json.loads(code_line.params)
1000 code_id = code_params['code']
1000 code_id = code_params['code']
1001 if tx_line.pk == int(code_params['TX_ref']):
1001 if tx_line.pk == int(code_params['TX_ref']):
1002 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
1002 conf['Code ({})'.format(tx_line.get_name())] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']),
1003 '-'.join(code_params['codes']))
1003 '-'.join(code_params['codes']))
1004 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
1004 conf['keys'].append('Code ({})'.format(tx_line.get_name()))
1005
1005
1006 for windows_line in configuration.get_lines(line_type__name='windows'):
1006 for windows_line in configuration.get_lines(line_type__name='windows'):
1007 win_params = json.loads(windows_line.params)
1007 win_params = json.loads(windows_line.params)
1008 if tx_line.pk == int(win_params['TX_ref']):
1008 if tx_line.pk == int(win_params['TX_ref']):
1009 windows = ''
1009 windows = ''
1010 nsa = win_params['params'][0]['number_of_samples']
1010 nsa = win_params['params'][0]['number_of_samples']
1011 for i, params in enumerate(win_params['params']):
1011 for i, params in enumerate(win_params['params']):
1012 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
1012 windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}<br>'.format(
1013 i, **params)
1013 i, **params)
1014 conf['Window'] = mark_safe(windows)
1014 conf['Window'] = mark_safe(windows)
1015 conf['keys'].append('Window')
1015 conf['keys'].append('Window')
1016
1016
1017 kwargs['configurations'].append(conf)
1017 kwargs['configurations'].append(conf)
1018
1018
1019 for configuration in configurations.filter(device__device_type__name = 'jars'):
1019 for configuration in configurations.filter(device__device_type__name = 'jars'):
1020
1020
1021 conf = {'conf': configuration}
1021 conf = {'conf': configuration}
1022 conf['keys'] = []
1022 conf['keys'] = []
1023 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1023 conf['Type of Data'] = EXPERIMENT_TYPE[configuration.exp_type][1]
1024 conf['keys'].append('Type of Data')
1024 conf['keys'].append('Type of Data')
1025 channels_number = configuration.channels_number
1025 channels_number = configuration.channels_number
1026 exp_type = configuration.exp_type
1026 exp_type = configuration.exp_type
1027 fftpoints = configuration.fftpoints
1027 fftpoints = configuration.fftpoints
1028 filter_parms = json.loads(configuration.filter_parms)
1028 filter_parms = json.loads(configuration.filter_parms)
1029 spectral_number = configuration.spectral_number
1029 spectral_number = configuration.spectral_number
1030 acq_profiles = configuration.acq_profiles
1030 acq_profiles = configuration.acq_profiles
1031 cohe_integr = configuration.cohe_integr
1031 cohe_integr = configuration.cohe_integr
1032 profiles_block = configuration.profiles_block
1032 profiles_block = configuration.profiles_block
1033
1033
1034 conf['Num of Profiles'] = acq_profiles
1034 conf['Num of Profiles'] = acq_profiles
1035 conf['keys'].append('Num of Profiles')
1035 conf['keys'].append('Num of Profiles')
1036
1036
1037 conf['Prof per Block'] = profiles_block
1037 conf['Prof per Block'] = profiles_block
1038 conf['keys'].append('Prof per Block')
1038 conf['keys'].append('Prof per Block')
1039
1039
1040 conf['Blocks per File'] = configuration.raw_data_blocks
1040 conf['Blocks per File'] = configuration.raw_data_blocks
1041 conf['keys'].append('Blocks per File')
1041 conf['keys'].append('Blocks per File')
1042
1042
1043 if exp_type == 0: # Short
1043 if exp_type == 0: # Short
1044 bytes_ = 2
1044 bytes_ = 2
1045 b = nsa*2*bytes_*channels_number
1045 b = nsa*2*bytes_*channels_number
1046 else: # Float
1046 else: # Float
1047 bytes_ = 4
1047 bytes_ = 4
1048 channels = channels_number + spectral_number
1048 channels = channels_number + spectral_number
1049 b = nsa*2*bytes_*fftpoints*channels
1049 b = nsa*2*bytes_*fftpoints*channels
1050
1050
1051 codes_num = 7
1051 codes_num = 7
1052 if code_id == 2:
1052 if code_id == 2:
1053 codes_num = 7
1053 codes_num = 7
1054 elif code_id == 12:
1054 elif code_id == 12:
1055 codes_num = 15
1055 codes_num = 15
1056
1056
1057 #Jars filter values:
1057 #Jars filter values:
1058
1058
1059 clock = float(filter_parms['clock'])
1059 clock = float(filter_parms['clock'])
1060 filter_2 = int(filter_parms['cic_2'])
1060 filter_2 = int(filter_parms['cic_2'])
1061 filter_5 = int(filter_parms['cic_5'])
1061 filter_5 = int(filter_parms['cic_5'])
1062 filter_fir = int(filter_parms['fir'])
1062 filter_fir = int(filter_parms['fir'])
1063 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1063 Fs_MHz = clock/(filter_2*filter_5*filter_fir)
1064
1064
1065 #Jars values:
1065 #Jars values:
1066 if ipp is not None:
1066 if ipp is not None:
1067 IPP_units = ipp/0.15*Fs_MHz
1067 IPP_units = ipp/0.15*Fs_MHz
1068 IPP_us = IPP_units / Fs_MHz
1068 IPP_us = IPP_units / Fs_MHz
1069 IPP_s = IPP_units / (Fs_MHz * (10**6))
1069 IPP_s = IPP_units / (Fs_MHz * (10**6))
1070 Ts = 1/(Fs_MHz*(10**6))
1070 Ts = 1/(Fs_MHz*(10**6))
1071
1071
1072 Va = radar_lambda/(4*Ts*cohe_integr)
1072 Va = radar_lambda/(4*Ts*cohe_integr)
1073 rate_bh = ((nsa-codes_num)*channels_number*2 *
1073 rate_bh = ((nsa-codes_num)*channels_number*2 *
1074 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1074 bytes_/IPP_us)*(36*(10**8)/cohe_integr)
1075 rate_gh = rate_bh/(1024*1024*1024)
1075 rate_gh = rate_bh/(1024*1024*1024)
1076
1076
1077 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1077 conf['Time per Block'] = IPP_s * profiles_block * cohe_integr
1078 conf['keys'].append('Time per Block')
1078 conf['keys'].append('Time per Block')
1079 conf['Acq time'] = IPP_s * acq_profiles
1079 conf['Acq time'] = IPP_s * acq_profiles
1080 conf['keys'].append('Acq time')
1080 conf['keys'].append('Acq time')
1081 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1081 conf['Data rate'] = str(rate_gh)+" (GB/h)"
1082 conf['keys'].append('Data rate')
1082 conf['keys'].append('Data rate')
1083 conf['Va (m/s)'] = Va
1083 conf['Va (m/s)'] = Va
1084 conf['keys'].append('Va (m/s)')
1084 conf['keys'].append('Va (m/s)')
1085 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1085 conf['Vrange (m/s)'] = 3/(2*IPP_s*cohe_integr)
1086 conf['keys'].append('Vrange (m/s)')
1086 conf['keys'].append('Vrange (m/s)')
1087
1087
1088 kwargs['configurations'].append(conf)
1088 kwargs['configurations'].append(conf)
1089 kwargs['menu_experiments'] = 'active'
1089 kwargs['menu_experiments'] = 'active'
1090
1090
1091 ###### SIDEBAR ######
1091 ###### SIDEBAR ######
1092 kwargs.update(sidebar(experiment=experiment))
1092 kwargs.update(sidebar(experiment=experiment))
1093
1093
1094 return render(request, 'experiment_summary.html', kwargs)
1094 return render(request, 'experiment_summary.html', kwargs)
1095
1095
1096
1096
1097 @login_required
1097 @login_required
1098 def experiment_verify(request, id_exp):
1098 def experiment_verify(request, id_exp):
1099
1099
1100 experiment = get_object_or_404(Experiment, pk=id_exp)
1100 experiment = get_object_or_404(Experiment, pk=id_exp)
1101 experiment_data = experiment.parms_to_dict()
1101 experiment_data = experiment.parms_to_dict()
1102 configurations = Configuration.objects.filter(
1102 configurations = Configuration.objects.filter(
1103 experiment=experiment, type=0)
1103 experiment=experiment, type=0)
1104
1104
1105 kwargs = {}
1105 kwargs = {}
1106
1106
1107 kwargs['experiment_keys'] = ['template',
1107 kwargs['experiment_keys'] = ['template',
1108 'radar_system', 'name', 'start_time', 'end_time']
1108 'radar_system', 'name', 'start_time', 'end_time']
1109 kwargs['experiment'] = experiment
1109 kwargs['experiment'] = experiment
1110
1110
1111 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1111 kwargs['configuration_keys'] = ['name', 'device__ip_address',
1112 'device__port_address', 'device__status']
1112 'device__port_address', 'device__status']
1113 kwargs['configurations'] = configurations
1113 kwargs['configurations'] = configurations
1114 kwargs['experiment_data'] = experiment_data
1114 kwargs['experiment_data'] = experiment_data
1115
1115
1116 kwargs['title'] = 'Verify Experiment'
1116 kwargs['title'] = 'Verify Experiment'
1117 kwargs['suptitle'] = 'Parameters'
1117 kwargs['suptitle'] = 'Parameters'
1118
1118
1119 kwargs['button'] = 'Update'
1119 kwargs['button'] = 'Update'
1120
1120
1121 jars_conf = False
1121 jars_conf = False
1122 rc_conf = False
1122 rc_conf = False
1123 dds_conf = False
1123 dds_conf = False
1124
1124
1125 for configuration in configurations:
1125 for configuration in configurations:
1126 #-------------------- JARS -----------------------:
1126 #-------------------- JARS -----------------------:
1127 if configuration.device.device_type.name == 'jars':
1127 if configuration.device.device_type.name == 'jars':
1128 jars_conf = True
1128 jars_conf = True
1129 jars = configuration
1129 jars = configuration
1130 kwargs['jars_conf'] = jars_conf
1130 kwargs['jars_conf'] = jars_conf
1131 filter_parms = json.loads(jars.filter_parms)
1131 filter_parms = json.loads(jars.filter_parms)
1132 kwargs['filter_parms'] = filter_parms
1132 kwargs['filter_parms'] = filter_parms
1133 #--Sampling Frequency
1133 #--Sampling Frequency
1134 clock = filter_parms['clock']
1134 clock = filter_parms['clock']
1135 filter_2 = filter_parms['cic_2']
1135 filter_2 = filter_parms['cic_2']
1136 filter_5 = filter_parms['cic_5']
1136 filter_5 = filter_parms['cic_5']
1137 filter_fir = filter_parms['fir']
1137 filter_fir = filter_parms['fir']
1138 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1138 samp_freq_jars = clock/filter_2/filter_5/filter_fir
1139
1139
1140 kwargs['samp_freq_jars'] = samp_freq_jars
1140 kwargs['samp_freq_jars'] = samp_freq_jars
1141 kwargs['jars'] = configuration
1141 kwargs['jars'] = configuration
1142
1142
1143 #--------------------- RC ----------------------:
1143 #--------------------- RC ----------------------:
1144 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1144 if configuration.device.device_type.name == 'rc' and not configuration.mix:
1145 rc_conf = True
1145 rc_conf = True
1146 rc = configuration
1146 rc = configuration
1147
1147
1148 rc_parms = configuration.parms_to_dict()
1148 rc_parms = configuration.parms_to_dict()
1149
1149
1150 win_lines = rc.get_lines(line_type__name='windows')
1150 win_lines = rc.get_lines(line_type__name='windows')
1151 if win_lines:
1151 if win_lines:
1152 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1152 dh = json.loads(win_lines[0].params)['params'][0]['resolution']
1153 #--Sampling Frequency
1153 #--Sampling Frequency
1154 samp_freq_rc = 0.15/dh
1154 samp_freq_rc = 0.15/dh
1155 kwargs['samp_freq_rc'] = samp_freq_rc
1155 kwargs['samp_freq_rc'] = samp_freq_rc
1156
1156
1157 kwargs['rc_conf'] = rc_conf
1157 kwargs['rc_conf'] = rc_conf
1158 kwargs['rc'] = configuration
1158 kwargs['rc'] = configuration
1159
1159
1160 #-------------------- DDS ----------------------:
1160 #-------------------- DDS ----------------------:
1161 if configuration.device.device_type.name == 'dds':
1161 if configuration.device.device_type.name == 'dds':
1162 dds_conf = True
1162 dds_conf = True
1163 dds = configuration
1163 dds = configuration
1164 dds_parms = configuration.parms_to_dict()
1164 dds_parms = configuration.parms_to_dict()
1165
1165
1166 kwargs['dds_conf'] = dds_conf
1166 kwargs['dds_conf'] = dds_conf
1167 kwargs['dds'] = configuration
1167 kwargs['dds'] = configuration
1168
1168
1169 #------------Validation------------:
1169 #------------Validation------------:
1170 #Clock
1170 #Clock
1171 if dds_conf and rc_conf and jars_conf:
1171 if dds_conf and rc_conf and jars_conf:
1172 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']):
1172 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']):
1173 messages.warning(request, "Devices don't have the same clock.")
1173 messages.warning(request, "Devices don't have the same clock.")
1174 elif rc_conf and jars_conf:
1174 elif rc_conf and jars_conf:
1175 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1175 if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']):
1176 messages.warning(request, "Devices don't have the same clock.")
1176 messages.warning(request, "Devices don't have the same clock.")
1177 elif rc_conf and dds_conf:
1177 elif rc_conf and dds_conf:
1178 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1178 if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']):
1179 messages.warning(request, "Devices don't have the same clock.")
1179 messages.warning(request, "Devices don't have the same clock.")
1180 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1180 if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']):
1181 messages.warning(
1181 messages.warning(
1182 request, "Devices don't have the same Frequency A.")
1182 request, "Devices don't have the same Frequency A.")
1183
1183
1184 #------------POST METHOD------------:
1184 #------------POST METHOD------------:
1185 if request.method == 'POST':
1185 if request.method == 'POST':
1186 if request.POST['suggest_clock']:
1186 if request.POST['suggest_clock']:
1187 try:
1187 try:
1188 suggest_clock = float(request.POST['suggest_clock'])
1188 suggest_clock = float(request.POST['suggest_clock'])
1189 except:
1189 except:
1190 messages.warning(request, "Invalid value in CLOCK IN.")
1190 messages.warning(request, "Invalid value in CLOCK IN.")
1191 return redirect('url_verify_experiment', id_exp=experiment.id)
1191 return redirect('url_verify_experiment', id_exp=experiment.id)
1192 else:
1192 else:
1193 suggest_clock = ""
1193 suggest_clock = ""
1194 if suggest_clock:
1194 if suggest_clock:
1195 if rc_conf:
1195 if rc_conf:
1196 rc.clock_in = suggest_clock
1196 rc.clock_in = suggest_clock
1197 rc.save()
1197 rc.save()
1198 if jars_conf:
1198 if jars_conf:
1199 filter_parms = jars.filter_parms
1199 filter_parms = jars.filter_parms
1200 filter_parms = ast.literal_eval(filter_parms)
1200 filter_parms = ast.literal_eval(filter_parms)
1201 filter_parms['clock'] = suggest_clock
1201 filter_parms['clock'] = suggest_clock
1202 jars.filter_parms = json.dumps(filter_parms)
1202 jars.filter_parms = json.dumps(filter_parms)
1203 jars.save()
1203 jars.save()
1204 kwargs['filter_parms'] = filter_parms
1204 kwargs['filter_parms'] = filter_parms
1205 if dds_conf:
1205 if dds_conf:
1206 dds.clock = suggest_clock
1206 dds.clock = suggest_clock
1207 dds.save()
1207 dds.save()
1208
1208
1209 if request.POST['suggest_frequencyA']:
1209 if request.POST['suggest_frequencyA']:
1210 try:
1210 try:
1211 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1211 suggest_frequencyA = float(request.POST['suggest_frequencyA'])
1212 except:
1212 except:
1213 messages.warning(request, "Invalid value in FREQUENCY A.")
1213 messages.warning(request, "Invalid value in FREQUENCY A.")
1214 return redirect('url_verify_experiment', id_exp=experiment.id)
1214 return redirect('url_verify_experiment', id_exp=experiment.id)
1215 else:
1215 else:
1216 suggest_frequencyA = ""
1216 suggest_frequencyA = ""
1217 if suggest_frequencyA:
1217 if suggest_frequencyA:
1218 if jars_conf:
1218 if jars_conf:
1219 filter_parms = jars.filter_parms
1219 filter_parms = jars.filter_parms
1220 filter_parms = ast.literal_eval(filter_parms)
1220 filter_parms = ast.literal_eval(filter_parms)
1221 filter_parms['fch'] = suggest_frequencyA
1221 filter_parms['fch'] = suggest_frequencyA
1222 jars.filter_parms = json.dumps(filter_parms)
1222 jars.filter_parms = json.dumps(filter_parms)
1223 jars.save()
1223 jars.save()
1224 kwargs['filter_parms'] = filter_parms
1224 kwargs['filter_parms'] = filter_parms
1225 if dds_conf:
1225 if dds_conf:
1226 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1226 dds.frequencyA_Mhz = request.POST['suggest_frequencyA']
1227 dds.save()
1227 dds.save()
1228
1228
1229 kwargs['menu_experiments'] = 'active'
1229 kwargs['menu_experiments'] = 'active'
1230 kwargs.update(sidebar(experiment=experiment))
1230 kwargs.update(sidebar(experiment=experiment))
1231 return render(request, 'experiment_verify.html', kwargs)
1231 return render(request, 'experiment_verify.html', kwargs)
1232
1232
1233
1233
1234 def parse_mix_result(s):
1234 def parse_mix_result(s):
1235
1235
1236 values = s.split('-')
1236 values = s.split('-')
1237 html = 'EXP MOD OPE DELAY MASK\r\n'
1237 html = 'EXP MOD OPE DELAY MASK\r\n'
1238
1238
1239 if not values or values[0] in ('', ' '):
1239 if not values or values[0] in ('', ' '):
1240 return mark_safe(html)
1240 return mark_safe(html)
1241
1241
1242 for i, value in enumerate(values):
1242 for i, value in enumerate(values):
1243 if not value:
1243 if not value:
1244 continue
1244 continue
1245 pk, mode, operation, delay, mask = value.split('|')
1245 pk, mode, operation, delay, mask = value.split('|')
1246 conf = RCConfiguration.objects.get(pk=pk)
1246 conf = RCConfiguration.objects.get(pk=pk)
1247 if i == 0:
1247 if i == 0:
1248 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1248 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1249 conf.name,
1249 conf.name,
1250 mode,
1250 mode,
1251 ' ',
1251 ' ',
1252 delay,
1252 delay,
1253 mask)
1253 mask)
1254 else:
1254 else:
1255 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1255 html += '{:20.18}{:3}{:4}{:9}km{:>6}\r\n'.format(
1256 conf.name,
1256 conf.name,
1257 mode,
1257 mode,
1258 operation,
1258 operation,
1259 delay,
1259 delay,
1260 mask)
1260 mask)
1261
1261
1262 return mark_safe(html)
1262 return mark_safe(html)
1263
1263
1264
1264
1265 def parse_mask(l):
1265 def parse_mask(l):
1266
1266
1267 values = []
1267 values = []
1268
1268
1269 for x in range(16):
1269 for x in range(16):
1270 if '{}'.format(x) in l:
1270 if '{}'.format(x) in l:
1271 values.append(1)
1271 values.append(1)
1272 else:
1272 else:
1273 values.append(0)
1273 values.append(0)
1274
1274
1275 values.reverse()
1275 values.reverse()
1276
1276
1277 return int(''.join([str(x) for x in values]), 2)
1277 return int(''.join([str(x) for x in values]), 2)
1278
1278
1279
1279
1280 def dev_confs(request):
1280 def dev_confs(request):
1281
1281
1282 page = request.GET.get('page')
1282 page = request.GET.get('page')
1283 order = ('-programmed_date', )
1283 order = ('-programmed_date', )
1284 filters = request.GET.copy()
1284 filters = request.GET.copy()
1285 if 'my configurations' in filters:
1285 if 'my configurations' in filters:
1286 filters.pop('my configurations', None)
1286 filters.pop('my configurations', None)
1287 filters['mine'] = request.user.id
1287 filters['mine'] = request.user.id
1288 kwargs = get_paginator(Configuration, page, order, filters)
1288 kwargs = get_paginator(Configuration, page, order, filters)
1289 fields = ['tags', 'template', 'historical']
1289 fields = ['tags', 'template', 'historical']
1290 if request.user.is_authenticated:
1290 if request.user.is_authenticated:
1291 fields.append('my configurations')
1291 fields.append('my configurations')
1292 form = FilterForm(initial=request.GET, extra_fields=fields)
1292 form = FilterForm(initial=request.GET, extra_fields=fields)
1293 kwargs['keys'] = ['name', 'experiment',
1293 kwargs['keys'] = ['name', 'experiment',
1294 'type', 'programmed_date', 'actions']
1294 'type', 'programmed_date', 'actions']
1295 kwargs['title'] = 'Configuration'
1295 kwargs['title'] = 'Configuration'
1296 kwargs['suptitle'] = 'List'
1296 kwargs['suptitle'] = 'List'
1297 kwargs['no_sidebar'] = True
1297 kwargs['no_sidebar'] = True
1298 kwargs['form'] = form
1298 kwargs['form'] = form
1299 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1299 kwargs['add_url'] = reverse('url_add_dev_conf', args=[0])
1300 filters = request.GET.copy()
1300 filters = request.GET.copy()
1301 filters.pop('page', None)
1301 filters.pop('page', None)
1302 kwargs['q'] = urlencode(filters)
1302 kwargs['q'] = urlencode(filters)
1303 kwargs['menu_configurations'] = 'active'
1303 kwargs['menu_configurations'] = 'active'
1304
1304
1305 return render(request, 'base_list.html', kwargs)
1305 return render(request, 'base_list.html', kwargs)
1306
1306
1307
1307
1308 def dev_conf(request, id_conf):
1308 def dev_conf(request, id_conf):
1309
1309
1310 conf = get_object_or_404(Configuration, pk=id_conf)
1310 conf = get_object_or_404(Configuration, pk=id_conf)
1311
1311
1312 return redirect(conf.get_absolute_url())
1312 return redirect(conf.get_absolute_url())
1313
1313
1314
1314
1315 @login_required
1315 @login_required
1316 def dev_conf_new(request, id_exp=0, id_dev=0):
1316 def dev_conf_new(request, id_exp=0, id_dev=0):
1317
1317
1318 if not is_developer(request.user):
1318 if not is_developer(request.user):
1319 messages.error(
1319 messages.error(
1320 request, 'Developer required, to create new configurations')
1320 request, 'Developer required, to create new configurations')
1321 return redirect('index')
1321 return redirect('index')
1322
1322
1323 initial = {}
1323 initial = {}
1324 kwargs = {}
1324 kwargs = {}
1325
1325
1326 if id_exp != 0:
1326 if id_exp != 0:
1327 initial['experiment'] = id_exp
1327 initial['experiment'] = id_exp
1328
1328
1329 if id_dev != 0:
1329 if id_dev != 0:
1330 initial['device'] = id_dev
1330 initial['device'] = id_dev
1331
1331
1332 if request.method == 'GET':
1332 if request.method == 'GET':
1333
1333
1334 if id_dev:
1334 if id_dev:
1335 kwargs['button'] = 'Create'
1335 kwargs['button'] = 'Create'
1336 device = Device.objects.get(pk=id_dev)
1336 device = Device.objects.get(pk=id_dev)
1337 DevConfForm = CONF_FORMS[device.device_type.name]
1337 DevConfForm = CONF_FORMS[device.device_type.name]
1338 initial['name'] = request.GET['name']
1338 initial['name'] = request.GET['name']
1339 form = DevConfForm(initial=initial)
1339 form = DevConfForm(initial=initial)
1340 else:
1340 else:
1341 if 'template' in request.GET:
1341 if 'template' in request.GET:
1342 if request.GET['template'] == '0':
1342 if request.GET['template'] == '0':
1343 choices = [(conf.pk, '{}'.format(conf))
1343 choices = [(conf.pk, '{}'.format(conf))
1344 for conf in Configuration.objects.filter(template=True)]
1344 for conf in Configuration.objects.filter(template=True)]
1345 form = NewForm(initial={'create_from': 2},
1345 form = NewForm(initial={'create_from': 2},
1346 template_choices=choices)
1346 template_choices=choices)
1347 else:
1347 else:
1348 kwargs['button'] = 'Create'
1348 kwargs['button'] = 'Create'
1349 conf = Configuration.objects.get(
1349 conf = Configuration.objects.get(
1350 pk=request.GET['template'])
1350 pk=request.GET['template'])
1351 id_dev = conf.device.pk
1351 id_dev = conf.device.pk
1352 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1352 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1353 form = DevConfForm(instance=conf,
1353 form = DevConfForm(instance=conf,
1354 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1354 initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()),
1355 'template': False,
1355 'template': False,
1356 'experiment': id_exp})
1356 'experiment': id_exp})
1357 elif 'blank' in request.GET:
1357 elif 'blank' in request.GET:
1358 kwargs['button'] = 'Create'
1358 kwargs['button'] = 'Create'
1359 form = ConfigurationForm(initial=initial)
1359 form = ConfigurationForm(initial=initial)
1360 else:
1360 else:
1361 form = NewForm()
1361 form = NewForm()
1362
1362
1363 if request.method == 'POST':
1363 if request.method == 'POST':
1364
1364
1365 device = Device.objects.get(pk=request.POST['device'])
1365 device = Device.objects.get(pk=request.POST['device'])
1366 DevConfForm = CONF_FORMS[device.device_type.name]
1366 DevConfForm = CONF_FORMS[device.device_type.name]
1367
1367
1368 form = DevConfForm(request.POST)
1368 form = DevConfForm(request.POST)
1369 kwargs['button'] = 'Create'
1369 kwargs['button'] = 'Create'
1370 if form.is_valid():
1370 if form.is_valid():
1371 conf = form.save(commit=False)
1371 conf = form.save(commit=False)
1372 conf.author = request.user
1372 conf.author = request.user
1373 conf.save()
1373 conf.save()
1374
1374
1375 if 'template' in request.GET and conf.device.device_type.name == 'rc':
1375 if 'template' in request.GET and conf.device.device_type.name == 'rc':
1376 lines = RCLine.objects.filter(
1376 lines = RCLine.objects.filter(
1377 rc_configuration=request.GET['template'])
1377 rc_configuration=request.GET['template'])
1378 for line in lines:
1378 for line in lines:
1379 line.clone(rc_configuration=conf)
1379 line.clone(rc_configuration=conf)
1380
1380
1381 new_lines = conf.get_lines()
1381 new_lines = conf.get_lines()
1382 for line in new_lines:
1382 for line in new_lines:
1383 line_params = json.loads(line.params)
1383 line_params = json.loads(line.params)
1384 if 'TX_ref' in line_params:
1384 if 'TX_ref' in line_params:
1385 ref_line = RCLine.objects.get(pk=line_params['TX_ref'])
1385 ref_line = RCLine.objects.get(pk=line_params['TX_ref'])
1386 line_params['TX_ref'] = ['{}'.format(
1386 line_params['TX_ref'] = ['{}'.format(
1387 l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0]
1387 l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0]
1388 line.params = json.dumps(line_params)
1388 line.params = json.dumps(line_params)
1389 line.save()
1389 line.save()
1390 elif conf.device.device_type.name == 'rc':
1390 elif conf.device.device_type.name == 'rc':
1391 clk = RCClock(rc_configuration=conf)
1391 clk = RCClock(rc_configuration=conf)
1392 clk.save()
1392 clk.save()
1393
1393
1394 return redirect('url_dev_conf', id_conf=conf.pk)
1394 return redirect('url_dev_conf', id_conf=conf.pk)
1395
1395
1396 kwargs['id_exp'] = id_exp
1396 kwargs['id_exp'] = id_exp
1397 kwargs['form'] = form
1397 kwargs['form'] = form
1398 kwargs['title'] = 'Configuration'
1398 kwargs['title'] = 'Configuration'
1399 kwargs['suptitle'] = 'New'
1399 kwargs['suptitle'] = 'New'
1400 kwargs['menu_configurations'] = 'active'
1400 kwargs['menu_configurations'] = 'active'
1401
1401
1402 if id_dev != 0:
1402 if id_dev != 0:
1403 device = Device.objects.get(pk=id_dev)
1403 device = Device.objects.get(pk=id_dev)
1404 kwargs['device'] = device.device_type.name
1404 kwargs['device'] = device.device_type.name
1405 print(id_exp)
1405 print(id_exp)
1406 return render(request, 'dev_conf_edit.html', kwargs)
1406 return render(request, 'dev_conf_edit.html', kwargs)
1407
1407
1408
1408
1409 @login_required
1409 @login_required
1410 def dev_conf_edit(request, id_conf):
1410 def dev_conf_edit(request, id_conf):
1411
1411
1412 conf = get_object_or_404(Configuration, pk=id_conf)
1412 conf = get_object_or_404(Configuration, pk=id_conf)
1413
1413
1414 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1414 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1415
1415
1416 if request.method == 'GET':
1416 if request.method == 'GET':
1417 form = DevConfForm(instance=conf)
1417 form = DevConfForm(instance=conf)
1418
1418
1419 if request.method == 'POST':
1419 if request.method == 'POST':
1420 form = DevConfForm(request.POST, instance=conf)
1420 form = DevConfForm(request.POST, instance=conf)
1421
1421
1422 if form.is_valid():
1422 if form.is_valid():
1423 form.save()
1423 form.save()
1424 return redirect('url_dev_conf', id_conf=id_conf)
1424 return redirect('url_dev_conf', id_conf=id_conf)
1425
1425
1426 kwargs = {}
1426 kwargs = {}
1427 kwargs['form'] = form
1427 kwargs['form'] = form
1428 kwargs['title'] = 'Device Configuration'
1428 kwargs['title'] = 'Device Configuration'
1429 kwargs['suptitle'] = 'Edit'
1429 kwargs['suptitle'] = 'Edit'
1430 kwargs['button'] = 'Update'
1430 kwargs['button'] = 'Update'
1431 kwargs['menu_configurations'] = 'active'
1431 kwargs['menu_configurations'] = 'active'
1432
1432
1433 ###### SIDEBAR ######
1433 ###### SIDEBAR ######
1434 kwargs.update(sidebar(conf=conf))
1434 kwargs.update(sidebar(conf=conf))
1435
1435
1436 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1436 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1437
1437
1438
1438
1439 @login_required
1439 @login_required
1440 def dev_conf_start(request, id_conf):
1440 def dev_conf_start(request, id_conf):
1441
1441
1442 conf = get_object_or_404(Configuration, pk=id_conf)
1442 conf = get_object_or_404(Configuration, pk=id_conf)
1443
1443
1444 if conf.start_device():
1444 if conf.start_device():
1445 messages.success(request, conf.message)
1445 messages.success(request, conf.message)
1446 else:
1446 else:
1447 messages.error(request, conf.message)
1447 messages.error(request, conf.message)
1448
1448
1449 #conf.status_device()
1449 #conf.status_device()
1450
1450
1451 return redirect(conf.get_absolute_url())
1451 return redirect(conf.get_absolute_url())
1452
1452
1453
1453
1454 @login_required
1454 @login_required
1455 def dev_conf_stop(request, id_conf):
1455 def dev_conf_stop(request, id_conf):
1456
1456
1457 conf = get_object_or_404(Configuration, pk=id_conf)
1457 conf = get_object_or_404(Configuration, pk=id_conf)
1458
1458
1459 if conf.stop_device():
1459 if conf.stop_device():
1460 messages.success(request, conf.message)
1460 messages.success(request, conf.message)
1461 else:
1461 else:
1462 messages.error(request, conf.message)
1462 messages.error(request, conf.message)
1463
1463
1464 #conf.status_device()
1464 #conf.status_device()
1465
1465
1466 return redirect(conf.get_absolute_url())
1466 return redirect(conf.get_absolute_url())
1467
1467
1468 @login_required
1468 @login_required
1469 def dev_conf_stop_mqtt(request, id_conf):
1469 def dev_conf_stop_mqtt(request, id_conf):
1470
1470
1471 conf = get_object_or_404(Configuration, pk=id_conf)
1471 conf = get_object_or_404(Configuration, pk=id_conf)
1472
1472
1473 if conf.stop_device_mqtt():
1473 if conf.stop_device_mqtt():
1474 messages.success(request, conf.message)
1474 messages.success(request, conf.message)
1475 else:
1475 else:
1476 messages.error(request, conf.message)
1476 messages.error(request, conf.message)
1477
1477
1478 #conf.status_device()
1478 #conf.status_device()
1479
1479
1480 return redirect(conf.get_absolute_url())
1480 return redirect(conf.get_absolute_url())
1481
1481
1482 @login_required
1482 @login_required
1483 def dev_conf_status(request, id_conf):
1483 def dev_conf_status(request, id_conf):
1484
1484
1485 conf = get_object_or_404(Configuration, pk=id_conf)
1485 conf = get_object_or_404(Configuration, pk=id_conf)
1486
1486
1487 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1487 conf_active = Configuration.objects.filter(pk=conf.device.conf_active).first()
1488 if conf_active!=conf:
1488 if conf_active!=conf:
1489 url = '#' if conf_active is None else conf_active.get_absolute_url()
1489 url = '#' if conf_active is None else conf_active.get_absolute_url()
1490 label = 'None' if conf_active is None else conf_active.label
1490 label = 'None' if conf_active is None else conf_active.label
1491 messages.warning(
1491 messages.warning(
1492 request,
1492 request,
1493 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1493 mark_safe('The current configuration has not been written to device, the active configuration is <a href="{}">{}</a>'.format(
1494 url,
1494 url,
1495 label
1495 label
1496 ))
1496 ))
1497 )
1497 )
1498
1498
1499 return redirect(conf.get_absolute_url())
1499 return redirect(conf.get_absolute_url())
1500
1500
1501 if conf.status_device():
1501 if conf.status_device():
1502 messages.success(request, conf.message)
1502 messages.success(request, conf.message)
1503 else:
1503 else:
1504 messages.error(request, conf.message)
1504 messages.error(request, conf.message)
1505
1505
1506 return redirect(conf.get_absolute_url())
1506 return redirect(conf.get_absolute_url())
1507
1507
1508
1508
1509 @login_required
1509 @login_required
1510 def dev_conf_reset(request, id_conf):
1510 def dev_conf_reset(request, id_conf):
1511
1511
1512 conf = get_object_or_404(Configuration, pk=id_conf)
1512 conf = get_object_or_404(Configuration, pk=id_conf)
1513
1513
1514 if conf.reset_device():
1514 if conf.reset_device():
1515 messages.success(request, conf.message)
1515 messages.success(request, conf.message)
1516 else:
1516 else:
1517 messages.error(request, conf.message)
1517 messages.error(request, conf.message)
1518
1518
1519 return redirect(conf.get_absolute_url())
1519 return redirect(conf.get_absolute_url())
1520
1520
1521
1521
1522 @login_required
1522 @login_required
1523 def dev_conf_write(request, id_conf):
1523 def dev_conf_write(request, id_conf):
1524
1524
1525 conf = get_object_or_404(Configuration, pk=id_conf)
1525 conf = get_object_or_404(Configuration, pk=id_conf)
1526
1526
1527 if request.method == 'POST':
1527 if request.method == 'POST':
1528 if conf.write_device():
1528 if conf.write_device():
1529 conf.device.conf_active = conf.pk
1529 conf.device.conf_active = conf.pk
1530 conf.device.save()
1530 conf.device.save()
1531 messages.success(request, conf.message)
1531 messages.success(request, conf.message)
1532 if has_been_modified(conf):
1532 if has_been_modified(conf):
1533 conf.clone(type=1, template=False)
1533 conf.clone(type=1, template=False)
1534 else:
1534 else:
1535 messages.error(request, conf.message)
1535 messages.error(request, conf.message)
1536
1536
1537 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1537 return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1538
1538
1539 kwargs = {
1539 kwargs = {
1540 'title': 'Write Configuration',
1540 'title': 'Write Configuration',
1541 'suptitle': conf.label,
1541 'suptitle': conf.label,
1542 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1542 'message': 'Are you sure yo want to write this {} configuration?'.format(conf.device),
1543 'delete': False
1543 'delete': False
1544 }
1544 }
1545 kwargs['menu_configurations'] = 'active'
1545 kwargs['menu_configurations'] = 'active'
1546
1546
1547 return render(request, 'confirm.html', kwargs)
1547 return render(request, 'confirm.html', kwargs)
1548
1548
1549
1549
1550 @login_required
1550 @login_required
1551 def dev_conf_write_mqtt(request,id_conf):
1551 def dev_conf_write_mqtt(request,id_conf):
1552
1552
1553 conf = get_object_or_404(Configuration, pk=id_conf)
1553 conf = get_object_or_404(Configuration, pk=id_conf)
1554 beams = ABSBeam.objects.filter(abs_conf=conf)
1554 beams = ABSBeam.objects.filter(abs_conf=conf)
1555
1555
1556 if request.method == 'POST':
1556 if request.method == 'POST':
1557 if conf.write_device_mqtt():
1557 if conf.write_device_mqtt():
1558 conf.device.conf_active = conf.pk
1558 conf.device.conf_active = conf.pk
1559 conf.device.save()
1559 conf.device.save()
1560 messages.success(request, conf.message)
1560 messages.success(request, conf.message)
1561 if has_been_modified(conf):
1561 if has_been_modified(conf):
1562 conf.clone(type=1, template=False)
1562 conf.clone(type=1, template=False)
1563 else:
1563 else:
1564 messages.error(request, conf.message)
1564 messages.error(request, conf.message)
1565 print("return",flush=True)
1565 print("return",flush=True)
1566 #return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1566 #return redirect(get_object_or_404(Configuration, pk=id_conf).get_absolute_url())
1567
1567
1568 module_messages = json.loads(conf.module_messages)
1568 module_messages = json.loads(conf.module_messages)
1569 kwargs = {}
1569 kwargs = {}
1570 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
1570 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
1571 kwargs['dev_conf'] = conf
1571 kwargs['dev_conf'] = conf
1572
1572
1573 if conf.operation_mode == 0:
1573 if conf.operation_mode == 0:
1574 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
1574 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
1575 else:
1575 else:
1576 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
1576 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
1577
1577
1578 kwargs['title'] = 'ABS Configuration'
1578 kwargs['title'] = 'ABS Configuration'
1579 kwargs['suptitle'] = 'Details'
1579 kwargs['suptitle'] = 'Details'
1580 kwargs['button'] = 'Edit Configuration'
1580 kwargs['button'] = 'Edit Configuration'
1581
1581
1582 if conf.active_beam != 0:
1582 if conf.active_beam != 0:
1583 kwargs['active_beam'] = int(conf.active_beam)
1583 kwargs['active_beam'] = int(conf.active_beam)
1584
1584
1585
1585
1586 kwargs['beams'] = beams
1586 kwargs['beams'] = beams
1587 # kwargs['modules_status'] = all_status
1587 # kwargs['modules_status'] = all_status
1588 # kwargs['color_status'] = color_status
1588 # kwargs['color_status'] = color_status
1589
1589
1590
1590
1591 kwargs['module_messages'] = module_messages
1591 kwargs['module_messages'] = module_messages
1592
1592
1593 ###### SIDEBAR ######
1593 ###### SIDEBAR ######
1594 kwargs.update(sidebar(conf=conf))
1594 kwargs.update(sidebar(conf=conf))
1595
1595
1596
1596
1597 return render(request, 'abs_conf_mqtt.html',kwargs)
1597 return render(request, 'abs_conf_mqtt.html',kwargs)
1598
1598
1599 kwargs = {
1599 kwargs = {
1600 'title': 'MQTT Write Configuration',
1600 'title': 'MQTT Write Configuration',
1601 'suptitle': conf.label,
1601 'suptitle': conf.label,
1602 'message': 'Are you sure yo want to write through MQTT this {} configuration?'.format(conf.device),
1602 'message': 'Are you sure yo want to write through MQTT this {} configuration?'.format(conf.device),
1603 'delete': False
1603 'delete': False
1604 }
1604 }
1605 kwargs['menu_configurations'] = 'active'
1605 kwargs['menu_configurations'] = 'active'
1606 print("Confirm",flush=True)
1606 print("Confirm",flush=True)
1607 return render(request, 'confirm.html', kwargs)
1607 return render(request, 'confirm.html', kwargs)
1608
1608
1609
1609
1610 @login_required
1610 @login_required
1611 def dev_conf_read(request, id_conf):
1611 def dev_conf_read(request, id_conf):
1612
1612
1613 conf = get_object_or_404(Configuration, pk=id_conf)
1613 conf = get_object_or_404(Configuration, pk=id_conf)
1614
1614
1615 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1615 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1616
1616
1617 if request.method == 'GET':
1617 if request.method == 'GET':
1618
1618
1619 parms = conf.read_device()
1619 parms = conf.read_device()
1620 #conf.status_device()
1620 #conf.status_device()
1621
1621
1622 if not parms:
1622 if not parms:
1623 messages.error(request, conf.message)
1623 messages.error(request, conf.message)
1624 return redirect(conf.get_absolute_url())
1624 return redirect(conf.get_absolute_url())
1625
1625
1626 form = DevConfForm(initial=parms, instance=conf)
1626 form = DevConfForm(initial=parms, instance=conf)
1627
1627
1628 if request.method == 'POST':
1628 if request.method == 'POST':
1629 form = DevConfForm(request.POST, instance=conf)
1629 form = DevConfForm(request.POST, instance=conf)
1630
1630
1631 if form.is_valid():
1631 if form.is_valid():
1632 form.save()
1632 form.save()
1633 return redirect(conf.get_absolute_url())
1633 return redirect(conf.get_absolute_url())
1634
1634
1635 messages.error(request, "Parameters could not be saved")
1635 messages.error(request, "Parameters could not be saved")
1636
1636
1637 kwargs = {}
1637 kwargs = {}
1638 kwargs['id_dev'] = conf.id
1638 kwargs['id_dev'] = conf.id
1639 kwargs['form'] = form
1639 kwargs['form'] = form
1640 kwargs['title'] = 'Device Configuration'
1640 kwargs['title'] = 'Device Configuration'
1641 kwargs['suptitle'] = 'Parameters read from device'
1641 kwargs['suptitle'] = 'Parameters read from device'
1642 kwargs['button'] = 'Save'
1642 kwargs['button'] = 'Save'
1643
1643
1644 ###### SIDEBAR ######
1644 ###### SIDEBAR ######
1645 kwargs.update(sidebar(conf=conf))
1645 kwargs.update(sidebar(conf=conf))
1646
1646
1647 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1647 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1648
1648
1649
1649
1650 @login_required
1650 @login_required
1651 def dev_conf_import(request, id_conf):
1651 def dev_conf_import(request, id_conf):
1652
1652
1653 conf = get_object_or_404(Configuration, pk=id_conf)
1653 conf = get_object_or_404(Configuration, pk=id_conf)
1654 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1654 DevConfForm = CONF_FORMS[conf.device.device_type.name]
1655
1655
1656 if request.method == 'GET':
1656 if request.method == 'GET':
1657 file_form = UploadFileForm()
1657 file_form = UploadFileForm()
1658
1658
1659 if request.method == 'POST':
1659 if request.method == 'POST':
1660 file_form = UploadFileForm(request.POST, request.FILES)
1660 file_form = UploadFileForm(request.POST, request.FILES)
1661
1661
1662 if file_form.is_valid():
1662 if file_form.is_valid():
1663
1663
1664 data = conf.import_from_file(request.FILES['file'])
1664 data = conf.import_from_file(request.FILES['file'])
1665 parms = Params(data=data).get_conf(
1665 parms = Params(data=data).get_conf(
1666 dtype=conf.device.device_type.name)
1666 dtype=conf.device.device_type.name)
1667
1667
1668 if parms:
1668 if parms:
1669
1669
1670 form = DevConfForm(initial=parms, instance=conf)
1670 form = DevConfForm(initial=parms, instance=conf)
1671
1671
1672 kwargs = {}
1672 kwargs = {}
1673 kwargs['id_dev'] = conf.id
1673 kwargs['id_dev'] = conf.id
1674 kwargs['form'] = form
1674 kwargs['form'] = form
1675 kwargs['title'] = 'Device Configuration'
1675 kwargs['title'] = 'Device Configuration'
1676 kwargs['suptitle'] = 'Parameters imported'
1676 kwargs['suptitle'] = 'Parameters imported'
1677 kwargs['button'] = 'Save'
1677 kwargs['button'] = 'Save'
1678 kwargs['action'] = conf.get_absolute_url_edit()
1678 kwargs['action'] = conf.get_absolute_url_edit()
1679 kwargs['previous'] = conf.get_absolute_url()
1679 kwargs['previous'] = conf.get_absolute_url()
1680
1680
1681 ###### SIDEBAR ######
1681 ###### SIDEBAR ######
1682 kwargs.update(sidebar(conf=conf))
1682 kwargs.update(sidebar(conf=conf))
1683
1683
1684 messages.success(
1684 messages.success(
1685 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1685 request, "Parameters imported from: '%s'." % request.FILES['file'].name)
1686
1686
1687 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1687 return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs)
1688
1688
1689 messages.error(request, "Could not import parameters from file")
1689 messages.error(request, "Could not import parameters from file")
1690
1690
1691 kwargs = {}
1691 kwargs = {}
1692 kwargs['id_dev'] = conf.id
1692 kwargs['id_dev'] = conf.id
1693 kwargs['title'] = 'Device Configuration'
1693 kwargs['title'] = 'Device Configuration'
1694 kwargs['form'] = file_form
1694 kwargs['form'] = file_form
1695 kwargs['suptitle'] = 'Importing file'
1695 kwargs['suptitle'] = 'Importing file'
1696 kwargs['button'] = 'Import'
1696 kwargs['button'] = 'Import'
1697 kwargs['menu_configurations'] = 'active'
1697 kwargs['menu_configurations'] = 'active'
1698
1698
1699 kwargs.update(sidebar(conf=conf))
1699 kwargs.update(sidebar(conf=conf))
1700
1700
1701 return render(request, 'dev_conf_import.html', kwargs)
1701 return render(request, 'dev_conf_import.html', kwargs)
1702
1702
1703
1703
1704 @login_required
1704 @login_required
1705 def dev_conf_export(request, id_conf):
1705 def dev_conf_export(request, id_conf):
1706
1706
1707 conf = get_object_or_404(Configuration, pk=id_conf)
1707 conf = get_object_or_404(Configuration, pk=id_conf)
1708
1708
1709 if request.method == 'GET':
1709 if request.method == 'GET':
1710 file_form = DownloadFileForm(conf.device.device_type.name)
1710 file_form = DownloadFileForm(conf.device.device_type.name)
1711
1711
1712 if request.method == 'POST':
1712 if request.method == 'POST':
1713 file_form = DownloadFileForm(
1713 file_form = DownloadFileForm(
1714 conf.device.device_type.name, request.POST)
1714 conf.device.device_type.name, request.POST)
1715
1715
1716 if file_form.is_valid():
1716 if file_form.is_valid():
1717 fields = conf.export_to_file(
1717 fields = conf.export_to_file(
1718 format=file_form.cleaned_data['format'])
1718 format=file_form.cleaned_data['format'])
1719 if not fields['content']:
1719 if not fields['content']:
1720 messages.error(request, conf.message)
1720 messages.error(request, conf.message)
1721 return redirect(conf.get_absolute_url_export())
1721 return redirect(conf.get_absolute_url_export())
1722 response = HttpResponse(content_type=fields['content_type'])
1722 response = HttpResponse(content_type=fields['content_type'])
1723 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1723 response['Content-Disposition'] = 'attachment; filename="%s"' % fields['filename']
1724 response.write(fields['content'])
1724 response.write(fields['content'])
1725
1725
1726 return response
1726 return response
1727
1727
1728 messages.error(request, "Could not export parameters")
1728 messages.error(request, "Could not export parameters")
1729
1729
1730 kwargs = {}
1730 kwargs = {}
1731 kwargs['id_dev'] = conf.id
1731 kwargs['id_dev'] = conf.id
1732 kwargs['title'] = 'Device Configuration'
1732 kwargs['title'] = 'Device Configuration'
1733 kwargs['form'] = file_form
1733 kwargs['form'] = file_form
1734 kwargs['suptitle'] = 'Exporting file'
1734 kwargs['suptitle'] = 'Exporting file'
1735 kwargs['button'] = 'Export'
1735 kwargs['button'] = 'Export'
1736 kwargs['menu_configurations'] = 'active'
1736 kwargs['menu_configurations'] = 'active'
1737
1737
1738 return render(request, 'dev_conf_export.html', kwargs)
1738 return render(request, 'dev_conf_export.html', kwargs)
1739
1739
1740
1740
1741 @login_required
1741 @login_required
1742 def dev_conf_delete(request, id_conf):
1742 def dev_conf_delete(request, id_conf):
1743
1743
1744 conf = get_object_or_404(Configuration, pk=id_conf)
1744 conf = get_object_or_404(Configuration, pk=id_conf)
1745
1745
1746 if request.method == 'POST':
1746 if request.method == 'POST':
1747 if is_developer(request.user):
1747 if is_developer(request.user):
1748 conf.delete()
1748 conf.delete()
1749 return redirect('url_dev_confs')
1749 return redirect('url_dev_confs')
1750
1750
1751 messages.error(request, 'Not enough permission to delete this object')
1751 messages.error(request, 'Not enough permission to delete this object')
1752 return redirect(conf.get_absolute_url())
1752 return redirect(conf.get_absolute_url())
1753
1753
1754 kwargs = {
1754 kwargs = {
1755 'title': 'Delete',
1755 'title': 'Delete',
1756 'suptitle': 'Configuration',
1756 'suptitle': 'Configuration',
1757 'object': conf,
1757 'object': conf,
1758 'delete': True
1758 'delete': True
1759 }
1759 }
1760 kwargs['menu_configurations'] = 'active'
1760 kwargs['menu_configurations'] = 'active'
1761
1761
1762 return render(request, 'confirm.html', kwargs)
1762 return render(request, 'confirm.html', kwargs)
1763
1763
1764
1764
1765 def sidebar(**kwargs):
1765 def sidebar(**kwargs):
1766
1766
1767 side_data = {}
1767 side_data = {}
1768
1768
1769 conf = kwargs.get('conf', None)
1769 conf = kwargs.get('conf', None)
1770 experiment = kwargs.get('experiment', None)
1770 experiment = kwargs.get('experiment', None)
1771
1771
1772 if not experiment:
1772 if not experiment:
1773 experiment = conf.experiment
1773 experiment = conf.experiment
1774
1774
1775 if experiment:
1775 if experiment:
1776 side_data['experiment'] = experiment
1776 side_data['experiment'] = experiment
1777 campaign = experiment.campaign_set.all()
1777 campaign = experiment.campaign_set.all()
1778 if campaign:
1778 if campaign:
1779 side_data['campaign'] = campaign[0]
1779 side_data['campaign'] = campaign[0]
1780 experiments = campaign[0].experiments.all().order_by('name')
1780 experiments = campaign[0].experiments.all().order_by('name')
1781 else:
1781 else:
1782 experiments = [experiment]
1782 experiments = [experiment]
1783 configurations = experiment.configuration_set.filter(type=0)
1783 configurations = experiment.configuration_set.filter(type=0)
1784 side_data['side_experiments'] = experiments
1784 side_data['side_experiments'] = experiments
1785 side_data['side_configurations'] = configurations.order_by(
1785 side_data['side_configurations'] = configurations.order_by(
1786 'device__device_type__name')
1786 'device__device_type__name')
1787
1787
1788 return side_data
1788 return side_data
1789
1789
1790 def get_paginator(model, page, order, filters={}, n=8):
1790 def get_paginator(model, page, order, filters={}, n=8):
1791 kwargs = {}
1791 kwargs = {}
1792 query = Q()
1792 query = Q()
1793 if isinstance(filters, QueryDict):
1793 if isinstance(filters, QueryDict):
1794 filters = filters.dict()
1794 filters = filters.dict()
1795 copy_filters=filters.copy()
1795 copy_filters=filters.copy()
1796 [filters.pop(key) for key in copy_filters.keys() if copy_filters[key] in (' ', ' ')]
1796 [filters.pop(key) for key in copy_filters.keys() if copy_filters[key] in (' ', ' ')]
1797 filters.pop('page', None)
1797 filters.pop('page', None)
1798
1798
1799 fields = [f.name for f in model._meta.get_fields()]
1799 fields = [f.name for f in model._meta.get_fields()]
1800
1800
1801 if 'template' in copy_filters:
1801 if 'template' in copy_filters:
1802 filters['template'] = True
1802 filters['template'] = True
1803 if 'historical' in copy_filters:
1803 if 'historical' in copy_filters:
1804 filters.pop('historical')
1804 filters.pop('historical')
1805 filters['type'] = 1
1805 filters['type'] = 1
1806 elif 'type' in fields:
1806 elif 'type' in fields:
1807 filters['type'] = 0
1807 filters['type'] = 0
1808 if 'start_date' in copy_filters:
1808 if 'start_date' in copy_filters:
1809 filters['start_date__gte'] =filters.pop('start_date')
1809 filters['start_date__gte'] =filters.pop('start_date')
1810 if 'end_date' in copy_filters:
1810 if 'end_date' in copy_filters:
1811 filters['start_date__lte'] =filters.pop('end_date')
1811 filters['start_date__lte'] =filters.pop('end_date')
1812 if 'tags' in copy_filters:
1812 if 'tags' in copy_filters:
1813 tags =filters.pop('tags')
1813 tags =filters.pop('tags')
1814 if 'tags' in fields:
1814 if 'tags' in fields:
1815 query = query | Q(tags__icontains=tags)
1815 query = query | Q(tags__icontains=tags)
1816 if 'label' in fields:
1816 if 'label' in fields:
1817 query = query | Q(label__icontains=tags)
1817 query = query | Q(label__icontains=tags)
1818 if 'location' in fields:
1818 if 'location' in fields:
1819 query = query | Q(location__name__icontains=tags)
1819 query = query | Q(location__name__icontains=tags)
1820 if 'device' in fields:
1820 if 'device' in fields:
1821 query = query | Q(device__device_type__name__icontains=tags)
1821 query = query | Q(device__device_type__name__icontains=tags)
1822 query = query | Q(device__location__name__icontains=tags)
1822 query = query | Q(device__location__name__icontains=tags)
1823 if 'device_type' in fields:
1823 if 'device_type' in fields:
1824 query = query | Q(device_type__name__icontains=tags)
1824 query = query | Q(device_type__name__icontains=tags)
1825
1825
1826 if 'mine' in copy_filters:
1826 if 'mine' in copy_filters:
1827 filters['author_id'] =filters['mine']
1827 filters['author_id'] =filters['mine']
1828 filters.pop('mine')
1828 filters.pop('mine')
1829 object_list = model.objects.filter(query, **filters).order_by(*order)
1829 object_list = model.objects.filter(query, **filters).order_by(*order)
1830 paginator = Paginator(object_list, n)
1830 paginator = Paginator(object_list, n)
1831
1831
1832 try:
1832 try:
1833 objects = paginator.page(page)
1833 objects = paginator.page(page)
1834 except PageNotAnInteger:
1834 except PageNotAnInteger:
1835 objects = paginator.page(1)
1835 objects = paginator.page(1)
1836 except EmptyPage:
1836 except EmptyPage:
1837 objects = paginator.page(paginator.num_pages)
1837 objects = paginator.page(paginator.num_pages)
1838
1838
1839 kwargs['objects'] = objects
1839 kwargs['objects'] = objects
1840 kwargs['offset'] = (int(page)-1)*n if page else 0
1840 kwargs['offset'] = (int(page)-1)*n if page else 0
1841
1841
1842 return kwargs
1842 return kwargs
1843
1843
1844 # def get_paginator(model, page, order, filters={}, n=8):
1844 # def get_paginator(model, page, order, filters={}, n=8):
1845 # kwargs = {}
1845 # kwargs = {}
1846 # query = Q()
1846 # query = Q()
1847 # if isinstance(filters, QueryDict):
1847 # if isinstance(filters, QueryDict):
1848 # filters = filters.dict()
1848 # filters = filters.dict()
1849 # [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1849 # [filters.pop(key) for key in filters.keys() if filters[key] in ('', ' ')]
1850 # filters.pop('page', None)
1850 # filters.pop('page', None)
1851
1851
1852 # fields = [f.name for f in model._meta.get_fields()]
1852 # fields = [f.name for f in model._meta.get_fields()]
1853
1853
1854 # if 'template' in filters:
1854 # if 'template' in filters:
1855 # filters['template'] = True
1855 # filters['template'] = True
1856 # if 'historical' in filters:
1856 # if 'historical' in filters:
1857 # filters.pop('historical')
1857 # filters.pop('historical')
1858 # filters['type'] = 1
1858 # filters['type'] = 1
1859 # elif 'type' in fields:
1859 # elif 'type' in fields:
1860 # filters['type'] = 0
1860 # filters['type'] = 0
1861 # if 'start_date' in filters:
1861 # if 'start_date' in filters:
1862 # filters['start_date__gte'] = filters.pop('start_date')
1862 # filters['start_date__gte'] = filters.pop('start_date')
1863 # if 'end_date' in filters:
1863 # if 'end_date' in filters:
1864 # filters['start_date__lte'] = filters.pop('end_date')
1864 # filters['start_date__lte'] = filters.pop('end_date')
1865 # if 'tags' in filters:
1865 # if 'tags' in filters:
1866 # tags = filters.pop('tags')
1866 # tags = filters.pop('tags')
1867 # if 'tags' in fields:
1867 # if 'tags' in fields:
1868 # query = query | Q(tags__icontains=tags)
1868 # query = query | Q(tags__icontains=tags)
1869 # if 'label' in fields:
1869 # if 'label' in fields:
1870 # query = query | Q(label__icontains=tags)
1870 # query = query | Q(label__icontains=tags)
1871 # if 'location' in fields:
1871 # if 'location' in fields:
1872 # query = query | Q(location__name__icontains=tags)
1872 # query = query | Q(location__name__icontains=tags)
1873 # if 'device' in fields:
1873 # if 'device' in fields:
1874 # query = query | Q(device__device_type__name__icontains=tags)
1874 # query = query | Q(device__device_type__name__icontains=tags)
1875 # query = query | Q(device__location__name__icontains=tags)
1875 # query = query | Q(device__location__name__icontains=tags)
1876 # if 'device_type' in fields:
1876 # if 'device_type' in fields:
1877 # query = query | Q(device_type__name__icontains=tags)
1877 # query = query | Q(device_type__name__icontains=tags)
1878
1878
1879 # if 'mine' in filters:
1879 # if 'mine' in filters:
1880 # filters['author_id'] = filters['mine']
1880 # filters['author_id'] = filters['mine']
1881 # filters.pop('mine')
1881 # filters.pop('mine')
1882 # object_list = model.objects.filter(query, **filters).order_by(*order)
1882 # object_list = model.objects.filter(query, **filters).order_by(*order)
1883 # paginator = Paginator(object_list, n)
1883 # paginator = Paginator(object_list, n)
1884
1884
1885 # try:
1885 # try:
1886 # objects = paginator.page(page)
1886 # objects = paginator.page(page)
1887 # except PageNotAnInteger:
1887 # except PageNotAnInteger:
1888 # objects = paginator.page(1)
1888 # objects = paginator.page(1)
1889 # except EmptyPage:
1889 # except EmptyPage:
1890 # objects = paginator.page(paginator.num_pages)
1890 # objects = paginator.page(paginator.num_pages)
1891
1891
1892 # kwargs['objects'] = objects
1892 # kwargs['objects'] = objects
1893 # kwargs['offset'] = (int(page)-1)*n if page else 0
1893 # kwargs['offset'] = (int(page)-1)*n if page else 0
1894
1894
1895 # return kwargs
1895 # return kwargs
1896
1896
1897
1897
1898 def operation(request, id_camp=None):
1898 def operation(request, id_camp=None):
1899
1899
1900 kwargs = {}
1900 kwargs = {}
1901 kwargs['title'] = 'Radars Operation'
1901 kwargs['title'] = 'Radars Operation'
1902 kwargs['no_sidebar'] = True
1902 kwargs['no_sidebar'] = True
1903 kwargs['menu_operation'] = 'active'
1903 kwargs['menu_operation'] = 'active'
1904 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1904 campaigns = Campaign.objects.filter(start_date__lte=datetime.now(),
1905 end_date__gte=datetime.now()).order_by('-start_date')
1905 end_date__gte=datetime.now()).order_by('-start_date')
1906
1906
1907 if id_camp:
1907 if id_camp:
1908 campaign = get_object_or_404(Campaign, pk=id_camp)
1908 campaign = get_object_or_404(Campaign, pk=id_camp)
1909 form = OperationForm(
1909 form = OperationForm(
1910 initial={'campaign': campaign.id}, campaigns=campaigns)
1910 initial={'campaign': campaign.id}, campaigns=campaigns)
1911 kwargs['campaign'] = campaign
1911 kwargs['campaign'] = campaign
1912 else:
1912 else:
1913 # form = OperationForm(campaigns=campaigns)
1913 # form = OperationForm(campaigns=campaigns)
1914 kwargs['campaigns'] = campaigns
1914 kwargs['campaigns'] = campaigns
1915 return render(request, 'operation.html', kwargs)
1915 return render(request, 'operation.html', kwargs)
1916
1916
1917 #---Experiment
1917 #---Experiment
1918 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1918 keys = ['id', 'name', 'start_time', 'end_time', 'status']
1919 kwargs['experiment_keys'] = keys[1:]
1919 kwargs['experiment_keys'] = keys[1:]
1920 kwargs['experiments'] = experiments
1920 kwargs['experiments'] = experiments
1921 #---Radar
1921 #---Radar
1922 kwargs['locations'] = campaign.get_experiments_by_radar()
1922 kwargs['locations'] = campaign.get_experiments_by_radar()
1923 kwargs['form'] = form
1923 kwargs['form'] = form
1924
1924
1925 return render(request, 'operation.html', kwargs)
1925 return render(request, 'operation.html', kwargs)
1926
1926
1927
1927
1928 @login_required
1928 @login_required
1929 def radar_start(request, id_camp, id_radar):
1929 def radar_start(request, id_camp, id_radar):
1930
1930 print("Boton presionados",flush=True)
1931 campaign = get_object_or_404(Campaign, pk=id_camp)
1931 campaign = get_object_or_404(Campaign, pk=id_camp)
1932 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1932 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
1933 now = datetime.now()
1933 now = datetime.now()
1934
1934
1935 for exp in experiments:
1935 for exp in experiments:
1936 #app.control.revoke(exp.task)
1936 #app.control.revoke(exp.task)
1937 print("----------------------")
1937 print("----------------------")
1938 print("status:->", exp.status)
1938 print("status:->", exp.status,flush=True)
1939 start = datetime.combine(datetime.now().date(), exp.start_time)
1939 start = datetime.combine(datetime.now().date(), exp.start_time)
1940 end = datetime.combine(datetime.now().date(), exp.end_time)
1940 end = datetime.combine(datetime.now().date(), exp.end_time)
1941 print("start exp: ",exp.start_time)
1941 print("start exp: ",exp.start_time,flush=True)
1942 print("end exp: ",exp.end_time)
1942 print("end exp: ",exp.end_time,flush=True)
1943
1943
1944 print("start comb: ",start)
1944 print("start comb: ",start,flush=True)
1945 print("end comb: ",end)
1945 print("end comb: ",end,flush=True)
1946 print(is_aware(start))
1946 print(is_aware(start),flush=True)
1947 print("start camp",campaign.start_date)
1947 print("start camp",campaign.start_date,flush=True)
1948 print("end camp",campaign.end_date)
1948 print("end camp",campaign.end_date,flush=True)
1949 print(is_aware(campaign.start_date))
1949 print(is_aware(campaign.start_date),flush=True)
1950 if end < start:
1950 if end < start:
1951 end += timedelta(1)
1951 end += timedelta(1)
1952
1952
1953 if exp.status == 2:
1953 if exp.status == 2:
1954 messages.warning(
1954 messages.warning(
1955 request, 'Experiment {} already running'.format(exp))
1955 request, 'Experiment {} already running'.format(exp))
1956 #continue
1956 #continue
1957
1957
1958 if exp.status == 3:
1958 if exp.status == 3:
1959 messages.warning(
1959 messages.warning(
1960 request, 'Experiment {} already programmed'.format(exp))
1960 request, 'Experiment {} already programmed'.format(exp))
1961 #continue
1961 #continue
1962
1962
1963 if exp.status == 1:
1963 if exp.status == 1:
1964 messages.warning(
1964 messages.warning(
1965 request, 'Experiment {} stopped'.format(exp))
1965 request, 'Experiment {} stopped'.format(exp))
1966 #continue
1966 #continue
1967
1967
1968 if start > campaign.end_date:
1968 if start > campaign.end_date:
1969 messages.warning(
1969 messages.warning(
1970 request, 'Experiment {} out of date'.format(exp))
1970 request, 'Experiment {} out of date'.format(exp))
1971
1971
1972 #app.control.revoke(exp.task)
1972 #app.control.revoke(exp.task)
1973 print("Llego luego del revoke")
1973 print("Llego luego del revoke",flush=True)
1974 if now >= start and now <= end:
1974 if now >= start and now <= end:
1975
1975
1976 print("Caso now > start and < end -- (1)")
1976 print("Caso now > start and < end -- (1)",flush=True)
1977
1977
1978 # -------------------------------------------
1978 # -------------------------------------------
1979
1979
1980 # task = task_start.delay(exp.id)
1980 # task = task_start.delay(exp.id)
1981 # exp.task = task.id
1981 # exp.task = task.id
1982 # exp.status = task.get()
1982 # exp.status = task.get()
1983 # -------------------------------------------
1983 # -------------------------------------------
1984
1984
1985 #exp.status = task.wait()
1985 #exp.status = task.wait()
1986
1986
1987 if exp.status == 0:
1987 if exp.status == 0:
1988 messages.error(request, 'Experiment {} not start'.format(exp))
1988 messages.error(request, 'Experiment {} not start'.format(exp))
1989 if exp.status == 2:
1989 if exp.status == 2:
1990 messages.success(request, 'Experiment {} started'.format(exp))
1990 messages.success(request, 'Experiment {} started'.format(exp))
1991 elif now < start:
1991 elif now < start:
1992 print("Caso now <= start -- (2)",exp.pk)
1992 print("Caso now <= start -- (2)",exp.pk)
1993 #task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5))
1993 #task = task_start.apply_async((exp.pk, ), eta=start)#start+timedelta(hours=5))
1994 # task = task_start.apply_async((exp.pk, ), eta=start+timedelta(hours=5))#)
1994 # task = task_start.apply_async((exp.pk, ), eta=start+timedelta(hours=5))#)
1995 # exp.task = task.id
1995 # exp.task = task.id
1996 # exp.status = 3
1996 # exp.status = 3
1997 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start))
1997 messages.success(request, 'Experiment {} programmed to start at {}'.format(exp, start))
1998 else:
1998 else:
1999 print("Caso now > end -- (3)")
1999 print("Caso now > end -- (3)")
2000 exp.status = 4
2000 exp.status = 4
2001 messages.warning(
2001 messages.warning(
2002 request, 'Experiment {} out of date'.format(exp))
2002 request, 'Experiment {} out of date'.format(exp))
2003
2003
2004 exp.save()
2004 exp.save()
2005
2005
2006 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2006 return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2007
2007
2008
2008
2009 @login_required
2009 @login_required
2010 def radar_stop(request, id_camp, id_radar):
2010 def radar_stop(request, id_camp, id_radar):
2011
2011
2012 campaign = get_object_or_404(Campaign, pk=id_camp)
2012 campaign = get_object_or_404(Campaign, pk=id_camp)
2013 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
2013 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
2014 print("Ingreso en stop radar_stop")
2014 print("Ingreso en stop radar_stop")
2015 #for exp in experiments:
2015 #for exp in experiments:
2016
2016
2017 # if exp.task:
2017 # if exp.task:
2018 # print("Ingreso antes de revoke stop")
2018 # print("Ingreso antes de revoke stop")
2019 # app.control.revoke(exp.task)
2019 # app.control.revoke(exp.task)
2020
2020
2021
2021
2022 # if exp.status == 2: #status 2 es started
2022 # if exp.status == 2: #status 2 es started
2023 # print("llama a exp.stop")
2023 # print("llama a exp.stop")
2024 # exp.stop()
2024 # exp.stop()
2025 # messages.warning(request, 'Experiment {} stopped'.format(exp))
2025 # messages.warning(request, 'Experiment {} stopped'.format(exp))
2026 # exp.status = 1
2026 # exp.status = 1
2027 # exp.save()
2027 # exp.save()
2028
2028
2029 #return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2029 #return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2030
2030
2031
2031
2032 @login_required
2032 @login_required
2033 def radar_refresh(request, id_camp, id_radar):
2033 def radar_refresh(request, id_camp, id_radar):
2034
2034
2035 campaign = get_object_or_404(Campaign, pk=id_camp)
2035 campaign = get_object_or_404(Campaign, pk=id_camp)
2036 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
2036 experiments = campaign.get_experiments_by_radar(id_radar)[0]['experiments']
2037
2037
2038 i = app.control.inspect()
2038 i = app.control.inspect()
2039 print("inspect",i)
2039 print("inspect",i)
2040 print(i.scheduled())
2040 print(i.scheduled())
2041 print(i.scheduled().values())
2041 print(i.scheduled().values())
2042 scheduled = list(i.scheduled().values())[0]
2042 scheduled = list(i.scheduled().values())[0]
2043 revoked = list(i.revoked().values())[0]
2043 revoked = list(i.revoked().values())[0]
2044
2044
2045 # for exp in experiments:
2045 # for exp in experiments:
2046 # if exp.task in revoked:
2046 # if exp.task in revoked:
2047 # exp.status = 1
2047 # exp.status = 1
2048 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
2048 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_stop' in t['request']['name']]:
2049 # exp.status = 2
2049 # exp.status = 2
2050 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
2050 # elif exp.task in [t['request']['id'] for t in scheduled if 'task_start' in t['request']['name']]:
2051 # exp.status = 3
2051 # exp.status = 3
2052 # else:
2052 # else:
2053 # exp.status = 4
2053 # exp.status = 4
2054 # exp.save()
2054 # exp.save()
2055 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2055 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2056
2056
2057 #@login_required
2057 #@login_required
2058 # def revoke_tasks(request, id_camp):
2058 # def revoke_tasks(request, id_camp):
2059
2059
2060 # i = app.control.inspect()
2060 # i = app.control.inspect()
2061 # scheduled = list(i.scheduled().values())[0]
2061 # scheduled = list(i.scheduled().values())[0]
2062 # revoked = list(i.revoked().values())[0]
2062 # revoked = list(i.revoked().values())[0]
2063
2063
2064 # for t in scheduled:
2064 # for t in scheduled:
2065 # if t['request']['id'] in revoked:
2065 # if t['request']['id'] in revoked:
2066 # continue
2066 # continue
2067 # app.control.revoke(t['request']['id'])
2067 # app.control.revoke(t['request']['id'])
2068 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
2068 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
2069 # eta = t['eta']
2069 # eta = t['eta']
2070 # #task = t['request']['name'].split('.')[-1]
2070 # #task = t['request']['name'].split('.')[-1]
2071 # messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
2071 # messages.warning(request, 'Scheduled {} at {} for experiment {} revoked'.format(task, eta, exp.name))
2072
2072
2073 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2073 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2074
2074
2075 # @login_required
2075 # @login_required
2076 # def show_tasks(request, id_camp):
2076 # def show_tasks(request, id_camp):
2077
2077
2078 # i = app.control.inspect()
2078 # i = app.control.inspect()
2079 # scheduled = list(i.scheduled().values())[0]
2079 # scheduled = list(i.scheduled().values())[0]
2080 # revoked = list(i.revoked().values())[0]
2080 # revoked = list(i.revoked().values())[0]
2081
2081
2082 # for t in scheduled:
2082 # for t in scheduled:
2083 # if t['request']['id'] in revoked:
2083 # if t['request']['id'] in revoked:
2084 # continue
2084 # continue
2085 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
2085 # exp = Experiment.objects.get(pk=eval(str(t['request']['args']))[0])
2086 # eta = t['eta']
2086 # eta = t['eta']
2087 # #task = t['request']['name'].split('.')[-1]
2087 # #task = t['request']['name'].split('.')[-1]
2088 # #messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
2088 # #messages.success(request, 'Task {} scheduled at {} for experiment {}'.format(task, eta, exp.name))
2089
2089
2090 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2090 # return HttpResponseRedirect(reverse('url_operation', args=[id_camp]))
2091
2091
2092 def real_time(request):
2092 def real_time(request):
2093
2093
2094 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
2094 graphic_path = "/home/fiorella/Pictures/catwbeanie.jpg"
2095
2095
2096 kwargs = {}
2096 kwargs = {}
2097 kwargs['title'] = 'CLAIRE'
2097 kwargs['title'] = 'CLAIRE'
2098 kwargs['suptitle'] = 'Real Time'
2098 kwargs['suptitle'] = 'Real Time'
2099 kwargs['no_sidebar'] = True
2099 kwargs['no_sidebar'] = True
2100 kwargs['graphic_path'] = graphic_path
2100 kwargs['graphic_path'] = graphic_path
2101 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
2101 kwargs['graphic1_path'] = 'http://www.bluemaize.net/im/girls-accessories/shark-beanie-11.jpg'
2102
2102
2103 return render(request, 'real_time.html', kwargs)
2103 return render(request, 'real_time.html', kwargs)
2104
2104
2105 def theme(request, theme):
2105 def theme(request, theme):
2106
2106
2107 user = request.user
2107 user = request.user
2108 user.profile.theme = theme
2108 user.profile.theme = theme
2109 user.save()
2109 user.save()
2110 return redirect('index')
2110 return redirect('index')
General Comments 0
You need to be logged in to leave comments. Login now