##// END OF EJS Templates
Juan C. Espinoza -
r317:3c0c2e8703c8 merge
parent child
Show More
@@ -1,864 +1,876
1 from django.db import models
1 from django.db import models
2 from apps.main.models import Configuration
2 from apps.main.models import Configuration
3 from django.core.urlresolvers import reverse
3 from django.core.urlresolvers import reverse
4 # Create your models here.
4 # Create your models here.
5 from celery.execute import send_task
5 from celery.execute import send_task
6 from datetime import datetime
6 from datetime import datetime
7 import ast
7 import ast
8 import socket
8 import socket
9 import json
9 import json
10 import requests
10 import requests
11 import struct
11 import struct
12 import os, sys, time
12 import os, sys, time
13
13
14 import multiprocessing
14 import multiprocessing
15
15
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
210
211 class ABSConfiguration(Configuration):
211 class ABSConfiguration(Configuration):
212 active_beam = models.PositiveSmallIntegerField(verbose_name='Active Beam', default=0)
212 active_beam = models.PositiveSmallIntegerField(verbose_name='Active Beam', default=0)
213 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default))
213 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default))
214 operation_mode = models.PositiveSmallIntegerField(verbose_name='Operation Mode', choices=OPERATION_MODES, default = 0)
214 operation_mode = models.PositiveSmallIntegerField(verbose_name='Operation Mode', choices=OPERATION_MODES, default = 0)
215 operation_value = models.FloatField(verbose_name='Periodic (seconds)', default="10", null=True, blank=True)
215 operation_value = models.FloatField(verbose_name='Periodic (seconds)', default="10", null=True, blank=True)
216 module_messages = models.CharField(verbose_name='Modules Messages', max_length=10000, default=json.dumps(default_messages))
216 module_messages = models.CharField(verbose_name='Modules Messages', max_length=10000, default=json.dumps(default_messages))
217
217
218 class Meta:
218 class Meta:
219 db_table = 'abs_configurations'
219 db_table = 'abs_configurations'
220
220
221 def get_absolute_url_plot(self):
221 def get_absolute_url_plot(self):
222 return reverse('url_plot_abs_patterns', args=[str(self.id)])
222 return reverse('url_plot_abs_patterns', args=[str(self.id)])
223
223
224
224
225 def parms_to_dict(self):
225 def parms_to_dict(self):
226
226
227 parameters = {}
227 parameters = {}
228
228
229 parameters['device_id'] = self.device.id
229 parameters['device_id'] = self.device.id
230 parameters['label'] = self.label
230 parameters['label'] = self.label
231 parameters['device_type'] = self.device.device_type.name
231 parameters['device_type'] = self.device.device_type.name
232 parameters['beams'] = {}
232 parameters['beams'] = {}
233
233
234 beams = ABSBeam.objects.filter(abs_conf=self)
234 beams = ABSBeam.objects.filter(abs_conf=self)
235 b=1
235 b=1
236 for beam in beams:
236 for beam in beams:
237 #absbeam = ABSBeam.objects.get(pk=beams[beam])
237 #absbeam = ABSBeam.objects.get(pk=beams[beam])
238 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
238 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
239 b+=1
239 b+=1
240
240
241 return parameters
241 return parameters
242
242
243
243
244 def dict_to_parms(self, parameters):
244 def dict_to_parms(self, parameters):
245
245
246 self.label = parameters['label']
246 self.label = parameters['label']
247
247
248 absbeams = ABSBeam.objects.filter(abs_conf=self)
248 absbeams = ABSBeam.objects.filter(abs_conf=self)
249 beams = parameters['beams']
249 beams = parameters['beams']
250
250
251 if absbeams:
251 if absbeams:
252 beams_number = len(beams)
252 beams_number = len(beams)
253 absbeams_number = len(absbeams)
253 absbeams_number = len(absbeams)
254 if beams_number==absbeams_number:
254 if beams_number==absbeams_number:
255 i = 1
255 i = 1
256 for absbeam in absbeams:
256 for absbeam in absbeams:
257 absbeam.dict_to_parms(beams['beam'+str(i)])
257 absbeam.dict_to_parms(beams['beam'+str(i)])
258 i = i+1
258 i = i+1
259 elif beams_number > absbeams_number:
259 elif beams_number > absbeams_number:
260 i = 1
260 i = 1
261 for absbeam in absbeams:
261 for absbeam in absbeams:
262 absbeam.dict_to_parms(beams['beam'+str(i)])
262 absbeam.dict_to_parms(beams['beam'+str(i)])
263 i=i+1
263 i=i+1
264 for x in range(i,beams_number+1):
264 for x in range(i,beams_number+1):
265 new_beam = ABSBeam(
265 new_beam = ABSBeam(
266 name =beams['beam'+str(i)]['name'],
266 name =beams['beam'+str(i)]['name'],
267 antenna =json.dumps(beams['beam'+str(i)]['antenna']),
267 antenna =json.dumps(beams['beam'+str(i)]['antenna']),
268 abs_conf = self,
268 abs_conf = self,
269 tx =json.dumps(beams['beam'+str(i)]['tx']),
269 tx =json.dumps(beams['beam'+str(i)]['tx']),
270 rx =json.dumps(beams['beam'+str(i)]['rx']),
270 rx =json.dumps(beams['beam'+str(i)]['rx']),
271 ues =json.dumps(beams['beam'+str(i)]['ues']),
271 ues =json.dumps(beams['beam'+str(i)]['ues']),
272 only_rx =json.dumps(beams['beam'+str(i)]['only_rx'])
272 only_rx =json.dumps(beams['beam'+str(i)]['only_rx'])
273 )
273 )
274 new_beam.save()
274 new_beam.save()
275 i=i+1
275 i=i+1
276 else: #beams_number < absbeams_number:
276 else: #beams_number < absbeams_number:
277 i = 1
277 i = 1
278 for absbeam in absbeams:
278 for absbeam in absbeams:
279 if i <= beams_number:
279 if i <= beams_number:
280 absbeam.dict_to_parms(beams['beam'+str(i)])
280 absbeam.dict_to_parms(beams['beam'+str(i)])
281 i=i+1
281 i=i+1
282 else:
282 else:
283 absbeam.delete()
283 absbeam.delete()
284 else:
284 else:
285 for beam in beams:
285 for beam in beams:
286 new_beam = ABSBeam(
286 new_beam = ABSBeam(
287 name =beams[beam]['name'],
287 name =beams[beam]['name'],
288 antenna =json.dumps(beams[beam]['antenna']),
288 antenna =json.dumps(beams[beam]['antenna']),
289 abs_conf = self,
289 abs_conf = self,
290 tx =json.dumps(beams[beam]['tx']),
290 tx =json.dumps(beams[beam]['tx']),
291 rx =json.dumps(beams[beam]['rx']),
291 rx =json.dumps(beams[beam]['rx']),
292 ues =json.dumps(beams[beam]['ues']),
292 ues =json.dumps(beams[beam]['ues']),
293 only_rx =json.dumps(beams[beam]['only_rx'])
293 only_rx =json.dumps(beams[beam]['only_rx'])
294 )
294 )
295 new_beam.save()
295 new_beam.save()
296
296
297
297
298
298
299 def update_from_file(self, parameters):
299 def update_from_file(self, parameters):
300
300
301 self.dict_to_parms(parameters)
301 self.dict_to_parms(parameters)
302 self.save()
302 self.save()
303
303
304
304
305 def get_beams(self, **kwargs):
305 def get_beams(self, **kwargs):
306 '''
306 '''
307 This function returns ABS Configuration beams
307 This function returns ABS Configuration beams
308 '''
308 '''
309 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
309 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
310
310
311 def clone(self, **kwargs):
311 def clone(self, **kwargs):
312
312
313 beams = self.get_beams()
313 beams = self.get_beams()
314 self.pk = None
314 self.pk = None
315 self.id = None
315 self.id = None
316 for attr, value in kwargs.items():
316 for attr, value in kwargs.items():
317 setattr(self, attr, value)
317 setattr(self, attr, value)
318 self.save()
318 self.save()
319
319
320 for beam in beams:
320 for beam in beams:
321 beam.clone(abs_conf=self)
321 beam.clone(abs_conf=self)
322
322
323 #-----For Active Beam-----
323 #-----For Active Beam-----
324 new_beams = ABSBeam.objects.filter(abs_conf=self)
324 new_beams = ABSBeam.objects.filter(abs_conf=self)
325 self.active_beam = new_beams[0].id
325 self.active_beam = new_beams[0].id
326 self.save()
326 self.save()
327 #-----For Active Beam-----
327 #-----For Active Beam-----
328 #-----For Device Status---
328 #-----For Device Status---
329 self.device.status = 3
329 self.device.status = 3
330 self.device.save()
330 self.device.save()
331 #-----For Device Status---
331 #-----For Device Status---
332
332
333 return self
333 return self
334
334
335
335
336 def start_device(self):
336 def start_device(self):
337
337
338 if self.device.status == 3:
338 if self.device.status == 3:
339
339
340 try:
340 try:
341 #self.write_device()
341 #self.write_device()
342 send_task('task_change_beam', [self.id],)
342 send_task('task_change_beam', [self.id],)
343 self.message = 'ABS running'
343 self.message = 'ABS running'
344
344
345 except Exception as e:
345 except Exception as e:
346 self.message = str(e)
346 self.message = str(e)
347 return False
347 return False
348
348
349 return True
349 return True
350
350
351 else:
351 else:
352 self.message = 'Please, select Write ABS Device first.'
352 self.message = 'Please, select Write ABS Device first.'
353 return False
353 return False
354
354
355
355
356 def stop_device(self):
356 def stop_device(self):
357
357
358 self.device.status = 2
358 self.device.status = 2
359 self.device.save()
359 self.device.save()
360 self.message = 'ABS has been stopped.'
360 self.message = 'ABS has been stopped.'
361 self.save()
361 self.save()
362
362
363 return True
363 return True
364
364
365
365
366 def write_device(self):
366 def write_device(self):
367
367
368 """
368 """
369 This function sends the beams list to every abs module.
369 This function sends the beams list to every abs module.
370 It needs 'module_conf' function
370 It needs 'module_conf' function
371 """
371 """
372
372
373 beams = ABSBeam.objects.filter(abs_conf=self)
373 beams = ABSBeam.objects.filter(abs_conf=self)
374 nbeams = len(beams)
374 nbeams = len(beams)
375 if self.connected_modules() == 0 :
375 if self.connected_modules() == 0 :
376 self.message = "No ABS Module detected."
376 self.message = "No ABS Module detected."
377 return False
377 return False
378
378
379 #-------------Write each abs module-----------
379 #-------------Write each abs module-----------
380
380 if beams:
381 if beams:
381 message = 'SNDF{:02d}'.format(nbeams)
382 block_id = 0
383 message = 'SNDF{:03d}{:02d}{:02d}'.format(nbeams, nbeams, block_id)
382 for i, status in enumerate(self.module_status):
384 for i, status in enumerate(self.module_status):
383 message += ''.join([fromBinary2Char(beam.module_6bits(i)) for beam in beams])
385 message += ''.join([fromBinary2Char(beam.module_6bits(i)) for beam in beams])
384 status = ['0'] * 64
386 status = ['0'] * 64
385 n = 0
387 n = 0
386
388
387 sock = self.send_multicast(message)
389 sock = self.send_multicast(message)
388
390
389 for i in range(64):
391 for i in range(32):
390 try:
392 try:
391 data, address = sock.recvfrom(1024)
393 data, address = sock.recvfrom(1024)
394 print address, data
392 if data == '1':
395 if data == '1':
393 status[int(address[0][10:])-1] = '3'
396 status[int(address[0][10:])-1] = '3'
394 elif data == '0':
397 elif data == '0':
395 status[int(address[0][10:])-1] = '1'
398 status[int(address[0][10:])-1] = '1'
396 except:
399 except Exception as e:
400 print 'Error {}'.format(e)
397 n += 1
401 n += 1
398 sock.close()
402 sock.close()
399 else:
403 else:
400 self.message = "ABS Configuration does not have beams"
404 self.message = "ABS Configuration does not have beams"
401 return False
405 return False
402
406
403 if n == 64:
407 if n == 64:
404 self.message = "Could not write ABS Modules"
408 self.message = "Could not write ABS Modules"
405 self.device.status = 0
409 self.device.status = 0
406 self.module_status = ''.join(status)
410 self.module_status = ''.join(status)
407 self.save()
411 self.save()
408 return False
412 return False
409 else:
413 else:
410 self.message = "ABS Beams List have been sent to ABS Modules"
414 self.message = "ABS Beams List have been sent to ABS Modules"
411 self.active_beam = beams[0].pk
415 self.active_beam = beams[0].pk
412
416
413 self.device.status = 3
417 self.device.status = 3
414 self.module_status = ''.join(status)
418 self.module_status = ''.join(status)
415 self.save()
419 self.save()
416 return True
420 return True
417
421
418
422
419 def read_module(self, module):
423 def read_module(self, module):
420
424
421 """
425 """
422 Read out-bits (up-down) of 1 abs module NOT for Configuration
426 Read out-bits (up-down) of 1 abs module NOT for Configuration
423 """
427 """
424
428
425 ip_address = self.device.ip_address
429 ip_address = self.device.ip_address
426 ip_address = ip_address.split('.')
430 ip_address = ip_address.split('.')
427 module_seq = (ip_address[0],ip_address[1],ip_address[2])
431 module_seq = (ip_address[0],ip_address[1],ip_address[2])
428 dot = '.'
432 dot = '.'
429 module_ip = dot.join(module_seq)+'.'+str(module)
433 module_ip = dot.join(module_seq)+'.'+str(module)
430 module_port = self.device.port_address
434 module_port = self.device.port_address
431 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
435 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
432
436
433 module_status = json.loads(self.module_status)
437 module_status = json.loads(self.module_status)
434 print(read_route)
438 print(read_route)
435
439
436 module_bits = ''
440 module_bits = ''
437
441
438 try:
442 try:
439 r_read = requests.get(read_route, timeout=0.5)
443 r_read = requests.get(read_route, timeout=0.5)
440 answer = r_read.json()
444 answer = r_read.json()
441 module_bits = answer['allbits']
445 module_bits = answer['allbits']
442 except:
446 except:
443 return {}
447 return {}
444
448
445 return module_bits
449 return module_bits
446
450
447 def read_device(self):
451 def read_device(self):
448
452
449 parms = {}
453 parms = {}
450 # Reads active modules.
454 # Reads active modules.
451 module_status = json.loads(self.module_status)
455 module_status = json.loads(self.module_status)
452 total = 0
456 total = 0
453 for status in module_status:
457 for status in module_status:
454 if module_status[status] != 0:
458 if module_status[status] != 0:
455 module_bits = self.read_module(int(status))
459 module_bits = self.read_module(int(status))
456 bits={}
460 bits={}
457 if module_bits:
461 if module_bits:
458 bits = (str(module_bits['um2']) + str(module_bits['um1']) + str(module_bits['um0']) +
462 bits = (str(module_bits['um2']) + str(module_bits['um1']) + str(module_bits['um0']) +
459 str(module_bits['dm2']) + str(module_bits['dm1']) + str(module_bits['dm0']) )
463 str(module_bits['dm2']) + str(module_bits['dm1']) + str(module_bits['dm0']) )
460 parms[str(status)] = bits
464 parms[str(status)] = bits
461
465
462 total +=1
466 total +=1
463
467
464 if total==0:
468 if total==0:
465 self.message = "No ABS Module detected. Please select 'Status'."
469 self.message = "No ABS Module detected. Please select 'Status'."
466 return False
470 return False
467
471
468
472
469
473
470 self.message = "ABS Modules have been read"
474 self.message = "ABS Modules have been read"
471 #monitoreo_tx = JROABSClnt_01CeCnMod000000MNTR10
475 #monitoreo_tx = JROABSClnt_01CeCnMod000000MNTR10
472 return parms
476 return parms
473
477
474
478
475 def connected_modules(self):
479 def connected_modules(self):
476 """
480 """
477 This function returns the number of connected abs-modules without updating.
481 This function returns the number of connected abs-modules without updating.
478 """
482 """
479 num = 0
483 num = 0
480 print(self.module_status)
484 print(self.module_status)
481 for i, status in enumerate(self.module_status):
485 for i, status in enumerate(self.module_status):
482 if status != '0':
486 if status != '0':
483 num += 1
487 num += 1
484 print('status {}:{}'.format(i+1, status))
488 #print('status {}:{}'.format(i+1, status))
485 return num
489 return num
486
490
487 def send_multicast(self, message):
491 def send_multicast(self, message):
488
492
489 multicast_group = ('224.3.29.71', 10000)
493 multicast_group = ('224.3.29.71', 10000)
490 # Create the datagram socket
494 # Create the datagram socket
491 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
495 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
492 sock.settimeout(0.01)
496 sock.settimeout(1)
497 # sock.bind((local_ip, 10000))
493 local_ip = os.environ.get('LOCAL_IP', '127.0.0.1')
498 local_ip = os.environ.get('LOCAL_IP', '127.0.0.1')
499 local_ip = '192.168.1.128'
494 sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip))
500 sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip))
495 sent = sock.sendto(message, multicast_group)
501 sent = sock.sendto(message, multicast_group)
496 print('Sending ' + message)
502 print('Sending ' + message)
497 return sock
503 return sock
498
504
499 def status_device(self):
505 def status_device(self):
500 """
506 """
501 This function returns the status of all abs-modules as one.
507 This function returns the status of all abs-modules as one.
502 If at least one module is connected, its answer is "1"
508 If at least one module is connected, its answer is "1"
503 """
509 """
504
510
505 sock = self.send_multicast('MNTR')
511 sock = self.send_multicast('MNTR')
506
512
507 n = 0
513 n = 0
508 status = ['0'] * 64
514 status = ['0'] * 64
509 for i in range(64):
515 for i in range(32):
516 #if True:
510 try:
517 try:
518 address = None
511 data, address = sock.recvfrom(1024)
519 data, address = sock.recvfrom(1024)
520 print address, data
512 if data == '1':
521 if data == '1':
513 status[int(address[0][10:])-1] = '3'
522 status[int(address[0][10:])-1] = '3'
514 elif data == '0':
523 elif data == '0':
515 status[int(address[0][10:])-1] = '1'
524 status[int(address[0][10:])-1] = '1'
516 n += 1
525 n += 1
517 print('Module: {} connected'.format(address))
526 print('Module: {} connected'.format(address))
518 except:
527 except:
528 print('Module: {} error'.format(address))
519 pass
529 pass
520 sock.close()
530 sock.close()
521
531
522 if n > 0:
532 if n > 0:
523 self.message = 'ABS modules Status have been updated.'
533 self.message = 'ABS modules Status have been updated.'
524 self.device.status = 1
534 self.device.status = 1
525 else:
535 else:
526 self.device.status = 0
536 self.device.status = 0
527 self.message = 'No ABS module is connected.'
537 self.message = 'No ABS module is connected.'
528 self.module_status = ''.join(status)
538 self.module_status = ''.join(status)
529 self.save()
539 self.save()
530
540
531 return self.device.status
541 return self.device.status
532
542
533
543
534 def send_beam(self, beam_pos):
544 def send_beam(self, beam_pos):
535 """
545 """
536 This function connects to a multicast group and sends the beam number
546 This function connects to a multicast group and sends the beam number
537 to all abs modules.
547 to all abs modules.
538 """
548 """
539
549
540 # Se manda a cero RC para poder realizar cambio de beam
550 # Se manda a cero RC para poder realizar cambio de beam
541 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
551 if self.experiment is None:
552 confs = []
553 else:
554 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
542 confdds = ''
555 confdds = ''
543 confjars = ''
556 confjars = ''
544 confrc = ''
557 confrc = ''
545
546 #TO STOP DEVICES: DDS-JARS-RC
558 #TO STOP DEVICES: DDS-JARS-RC
547 for i in range(0,len(confs)):
559 for i in range(0,len(confs)):
548 if i==0:
560 if i==0:
549 for conf in confs:
561 for conf in confs:
550 if conf.device.device_type.name == 'dds':
562 if conf.device.device_type.name == 'dds':
551 confdds = conf
563 confdds = conf
552 confdds.stop_device()
564 confdds.stop_device()
553 break
565 break
554 if i==1:
566 if i==1:
555 for conf in confs:
567 for conf in confs:
556 if conf.device.device_type.name == 'jars':
568 if conf.device.device_type.name == 'jars':
557 confjars = conf
569 confjars = conf
558 confjars.stop_device()
570 confjars.stop_device()
559 break
571 break
560 if i==2:
572 if i==2:
561 for conf in confs:
573 for conf in confs:
562 if conf.device.device_type.name == 'rc':
574 if conf.device.device_type.name == 'rc':
563 confrc = conf
575 confrc = conf
564 confrc.stop_device()
576 confrc.stop_device()
565 break
577 break
566
567 if beam_pos > 0:
578 if beam_pos > 0:
568 beam_pos = beam_pos - 1
579 beam_pos = beam_pos - 1
569 else:
580 else:
570 beam_pos = 0
581 beam_pos = 0
571
582
572 #El indice del apunte debe ser menor que el numero total de apuntes
583 #El indice del apunte debe ser menor que el numero total de apuntes
573 #El servidor tcp en el embebido comienza a contar desde 0
584 #El servidor tcp en el embebido comienza a contar desde 0
574 status = ['0'] * 64
585 status = ['0'] * 64
575 message = 'CHGB{}'.format(beam_pos)
586 message = 'CHGB{}'.format(beam_pos)
576 sock = self.send_multicast(message)
587 sock = self.send_multicast(message)
577
588 for i in range(32):
578 for i in range(64):
579 try:
589 try:
580 data, address = sock.recvfrom(1024)
590 data, address = sock.recvfrom(1024)
581 print address, data
591 print address, data
582 if data == '1':
592 if data == '1':
583 status[int(address[0][10:])-1] = '3'
593 status[int(address[0][10:])-1] = '3'
584 elif data == '0':
594 elif data == '0':
585 status[int(address[0][10:])-1] = '1'
595 status[int(address[0][10:])-1] = '1'
586 except:
596 except Exception as e:
597 print 'Error {}'.format(e)
587 pass
598 pass
588
599
589 sock.close()
600 sock.close()
590
601
591 #Start DDS-RC-JARS
602 #Start DDS-RC-JARS
592 if confdds:
603 if confdds:
593 confdds.start_device()
604 confdds.start_device()
594 if confrc:
605 if confrc:
595 #print confrc
606 #print confrc
596 confrc.start_device()
607 confrc.start_device()
597 if confjars:
608 if confjars:
598 confjars.start_device()
609 confjars.start_device()
599
610
600 self.message = "ABS Beam has been changed"
611 self.message = "ABS Beam has been changed"
601 self.module_status = ''.join(status)
612 self.module_status = ''.join(status)
602 self.save()
613 self.save()
603 return True
614 return True
604
615
605
616
606 def get_absolute_url_import(self):
617 def get_absolute_url_import(self):
607 return reverse('url_import_abs_conf', args=[str(self.id)])
618 return reverse('url_import_abs_conf', args=[str(self.id)])
608
619
609
620
610 class ABSBeam(models.Model):
621 class ABSBeam(models.Model):
611
622
612 name = models.CharField(max_length=60, default='Beam')
623 name = models.CharField(max_length=60, default='Beam')
613 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
624 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
614 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
625 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
615 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
626 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
616 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
627 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
617 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
628 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
618 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
629 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
619 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
630 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
620 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
631 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
621
632
622 class Meta:
633 class Meta:
623 db_table = 'abs_beams'
634 db_table = 'abs_beams'
624
635
625 def __unicode__(self):
636 def __unicode__(self):
626 return u'%s' % (self.name)
637 return u'%s' % (self.name)
627
638
628 def parms_to_dict(self):
639 def parms_to_dict(self):
629
640
630 parameters = {}
641 parameters = {}
631 parameters['name'] = self.name
642 parameters['name'] = self.name
632 parameters['antenna'] = ast.literal_eval(self.antenna)
643 parameters['antenna'] = ast.literal_eval(self.antenna)
633 parameters['abs_conf'] = self.abs_conf.name
644 parameters['abs_conf'] = self.abs_conf.name
634 parameters['tx'] = ast.literal_eval(self.tx)
645 parameters['tx'] = ast.literal_eval(self.tx)
635 parameters['rx'] = ast.literal_eval(self.rx)
646 parameters['rx'] = ast.literal_eval(self.rx)
636 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
647 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
637 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
648 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
638 parameters['ues'] = ast.literal_eval(self.ues)
649 parameters['ues'] = ast.literal_eval(self.ues)
639 parameters['only_rx'] = json.loads(self.only_rx)
650 parameters['only_rx'] = json.loads(self.only_rx)
640
651
641 return parameters
652 return parameters
642
653
643 def dict_to_parms(self, parameters):
654 def dict_to_parms(self, parameters):
644
655
645 self.name = parameters['name']
656 self.name = parameters['name']
646 self.antenna = json.dumps(parameters['antenna'])
657 self.antenna = json.dumps(parameters['antenna'])
647 #self.abs_conf = parameters['abs_conf']
658 #self.abs_conf = parameters['abs_conf']
648 self.tx = json.dumps(parameters['tx'])
659 self.tx = json.dumps(parameters['tx'])
649 self.rx = json.dumps(parameters['rx'])
660 self.rx = json.dumps(parameters['rx'])
650 #self.s_time = parameters['s_time']
661 #self.s_time = parameters['s_time']
651 #self.e_time = parameters['e_time']
662 #self.e_time = parameters['e_time']
652 self.ues = json.dumps(parameters['ues'])
663 self.ues = json.dumps(parameters['ues'])
653 self.only_rx = json.dumps(parameters['only_rx'])
664 self.only_rx = json.dumps(parameters['only_rx'])
654 self.save()
665 self.save()
655
666
656
667
657 def clone(self, **kwargs):
668 def clone(self, **kwargs):
658
669
659 self.pk = None
670 self.pk = None
660 self.id = None
671 self.id = None
661 for attr, value in kwargs.items():
672 for attr, value in kwargs.items():
662 setattr(self, attr, value)
673 setattr(self, attr, value)
663
674
664 self.save()
675 self.save()
665
676
666 return self
677 return self
667
678
668
679
669 def module_6bits(self, module):
680 def module_6bits(self, module):
670 """
681 """
671 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
682 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
672 """
683 """
684 module += 1
673 if module > 64:
685 if module > 64:
674 beam_bits = ""
686 beam_bits = ""
675 return beam_bits
687 return beam_bits
676
688
677 data = ast.literal_eval(self.antenna)
689 data = ast.literal_eval(self.antenna)
678 up_data = data['antenna_up']
690 up_data = data['antenna_up']
679 down_data = data['antenna_down']
691 down_data = data['antenna_down']
680
692
681 pos = ip2position(module)
693 pos = ip2position(module)
682 up_value = up_data[pos[0]][pos[1]]
694 up_value = up_data[pos[0]][pos[1]]
683 down_value = down_data[pos[0]][pos[1]]
695 down_value = down_data[pos[0]][pos[1]]
684
696
685 up_bits = up_conv_bits(up_value)
697 up_bits = up_conv_bits(up_value)
686 down_bits = down_conv_bits(down_value)
698 down_bits = down_conv_bits(down_value)
687 beam_bits = up_bits+down_bits
699 beam_bits = up_bits+down_bits
688
700
689 return beam_bits
701 return beam_bits
690
702
691
703
692 @property
704 @property
693 def get_upvalues(self):
705 def get_upvalues(self):
694 """
706 """
695 This function reads antenna pattern and show the up-value of one abs module
707 This function reads antenna pattern and show the up-value of one abs module
696 """
708 """
697
709
698 data = ast.literal_eval(self.antenna)
710 data = ast.literal_eval(self.antenna)
699 up_data = data['antenna_up']
711 up_data = data['antenna_up']
700
712
701 up_values = []
713 up_values = []
702 for data in up_data:
714 for data in up_data:
703 for i in range(0,8):
715 for i in range(0,8):
704 up_values.append(data[i])
716 up_values.append(data[i])
705
717
706 return up_values
718 return up_values
707
719
708 @property
720 @property
709 def antenna_upvalues(self):
721 def antenna_upvalues(self):
710 """
722 """
711 This function reads antenna pattern and show the up - values of one abs beam
723 This function reads antenna pattern and show the up - values of one abs beam
712 in a particular order
724 in a particular order
713 """
725 """
714 data = ast.literal_eval(self.antenna)
726 data = ast.literal_eval(self.antenna)
715 up_data = data['antenna_up']
727 up_data = data['antenna_up']
716
728
717 return up_data
729 return up_data
718
730
719 @property
731 @property
720 def antenna_downvalues(self):
732 def antenna_downvalues(self):
721 """
733 """
722 This function reads antenna pattern and show the down - values of one abs beam
734 This function reads antenna pattern and show the down - values of one abs beam
723 in a particular order
735 in a particular order
724 """
736 """
725 data = ast.literal_eval(self.antenna)
737 data = ast.literal_eval(self.antenna)
726 down_data = data['antenna_down']
738 down_data = data['antenna_down']
727
739
728 return down_data
740 return down_data
729
741
730 @property
742 @property
731 def get_downvalues(self):
743 def get_downvalues(self):
732 """
744 """
733 This function reads antenna pattern and show the down-value of one abs module
745 This function reads antenna pattern and show the down-value of one abs module
734 """
746 """
735
747
736 data = ast.literal_eval(self.antenna)
748 data = ast.literal_eval(self.antenna)
737 down_data = data['antenna_down']
749 down_data = data['antenna_down']
738
750
739 down_values = []
751 down_values = []
740 for data in down_data:
752 for data in down_data:
741 for i in range(0,8):
753 for i in range(0,8):
742 down_values.append(data[i])
754 down_values.append(data[i])
743
755
744 return down_values
756 return down_values
745
757
746 @property
758 @property
747 def get_up_ues(self):
759 def get_up_ues(self):
748 """
760 """
749 This function shows the up-ues-value of one beam
761 This function shows the up-ues-value of one beam
750 """
762 """
751 data = ast.literal_eval(self.ues)
763 data = ast.literal_eval(self.ues)
752 up_ues = data['up']
764 up_ues = data['up']
753
765
754 return up_ues
766 return up_ues
755
767
756 @property
768 @property
757 def get_down_ues(self):
769 def get_down_ues(self):
758 """
770 """
759 This function shows the down-ues-value of one beam
771 This function shows the down-ues-value of one beam
760 """
772 """
761 data = ast.literal_eval(self.ues)
773 data = ast.literal_eval(self.ues)
762 down_ues = data['down']
774 down_ues = data['down']
763
775
764 return down_ues
776 return down_ues
765
777
766 @property
778 @property
767 def get_up_onlyrx(self):
779 def get_up_onlyrx(self):
768 """
780 """
769 This function shows the up-onlyrx-value of one beam
781 This function shows the up-onlyrx-value of one beam
770 """
782 """
771 data = json.loads(self.only_rx)
783 data = json.loads(self.only_rx)
772 up_onlyrx = data['up']
784 up_onlyrx = data['up']
773
785
774 return up_onlyrx
786 return up_onlyrx
775
787
776 @property
788 @property
777 def get_down_onlyrx(self):
789 def get_down_onlyrx(self):
778 """
790 """
779 This function shows the down-onlyrx-value of one beam
791 This function shows the down-onlyrx-value of one beam
780 """
792 """
781 data = json.loads(self.only_rx)
793 data = json.loads(self.only_rx)
782 down_onlyrx = data['down']
794 down_onlyrx = data['down']
783
795
784 return down_onlyrx
796 return down_onlyrx
785
797
786 @property
798 @property
787 def get_tx(self):
799 def get_tx(self):
788 """
800 """
789 This function shows the tx-values of one beam
801 This function shows the tx-values of one beam
790 """
802 """
791 data = json.loads(self.tx)
803 data = json.loads(self.tx)
792
804
793 return data
805 return data
794
806
795 @property
807 @property
796 def get_uptx(self):
808 def get_uptx(self):
797 """
809 """
798 This function shows the up-tx-values of one beam
810 This function shows the up-tx-values of one beam
799 """
811 """
800 data = json.loads(self.tx)
812 data = json.loads(self.tx)
801 up_data = data['up']
813 up_data = data['up']
802
814
803 up_values = []
815 up_values = []
804 for data in up_data:
816 for data in up_data:
805 for i in range(0,8):
817 for i in range(0,8):
806 up_values.append(data[i])
818 up_values.append(data[i])
807
819
808 return up_values
820 return up_values
809
821
810 @property
822 @property
811 def get_downtx(self):
823 def get_downtx(self):
812 """
824 """
813 This function shows the down-tx-values of one beam
825 This function shows the down-tx-values of one beam
814 """
826 """
815 data = json.loads(self.tx)
827 data = json.loads(self.tx)
816 down_data = data['down']
828 down_data = data['down']
817
829
818 down_values = []
830 down_values = []
819 for data in down_data:
831 for data in down_data:
820 for i in range(0,8):
832 for i in range(0,8):
821 down_values.append(data[i])
833 down_values.append(data[i])
822
834
823 return down_values
835 return down_values
824
836
825
837
826
838
827 @property
839 @property
828 def get_rx(self):
840 def get_rx(self):
829 """
841 """
830 This function shows the rx-values of one beam
842 This function shows the rx-values of one beam
831 """
843 """
832 data = json.loads(self.rx)
844 data = json.loads(self.rx)
833
845
834 return data
846 return data
835
847
836 @property
848 @property
837 def get_uprx(self):
849 def get_uprx(self):
838 """
850 """
839 This function shows the up-rx-values of one beam
851 This function shows the up-rx-values of one beam
840 """
852 """
841 data = json.loads(self.rx)
853 data = json.loads(self.rx)
842 up_data = data['up']
854 up_data = data['up']
843
855
844 up_values = []
856 up_values = []
845 for data in up_data:
857 for data in up_data:
846 for i in range(0,8):
858 for i in range(0,8):
847 up_values.append(data[i])
859 up_values.append(data[i])
848
860
849 return up_values
861 return up_values
850
862
851 @property
863 @property
852 def get_downrx(self):
864 def get_downrx(self):
853 """
865 """
854 This function shows the down-rx-values of one beam
866 This function shows the down-rx-values of one beam
855 """
867 """
856 data = json.loads(self.rx)
868 data = json.loads(self.rx)
857 down_data = data['down']
869 down_data = data['down']
858
870
859 down_values = []
871 down_values = []
860 for data in down_data:
872 for data in down_data:
861 for i in range(0,8):
873 for i in range(0,8):
862 down_values.append(data[i])
874 down_values.append(data[i])
863
875
864 return down_values
876 return down_values
@@ -1,17 +1,18
1 from django.conf.urls import url
1 from django.conf.urls import url
2
2
3 from apps.abs import views
3 from apps.abs import views
4
4
5 urlpatterns = (
5 urlpatterns = (
6 url(r'^(?P<id_conf>-?\d+)/$', views.abs_conf, name='url_abs_conf'),
6 url(r'^(?P<id_conf>-?\d+)/$', views.abs_conf, name='url_abs_conf'),
7 url(r'^(?P<id_conf>-?\d+)/edit/$', views.abs_conf_edit, name='url_edit_abs_conf'),
7 url(r'^(?P<id_conf>-?\d+)/edit/$', views.abs_conf_edit, name='url_edit_abs_conf'),
8 url(r'^alert/$', views.abs_conf_alert, name='url_alert_abs_conf'),
8 url(r'^(?P<id_conf>-?\d+)/import/$', views.import_file, name='url_import_abs_conf'),
9 url(r'^(?P<id_conf>-?\d+)/import/$', views.import_file, name='url_import_abs_conf'),
9 #url(r'^(?P<id_conf>-?\d+)/status/', views.abs_conf, {'status_request':True},name='url_status_abs_conf'),
10 #url(r'^(?P<id_conf>-?\d+)/status/', views.abs_conf, {'status_request':True},name='url_status_abs_conf'),
10 url(r'^(?P<id_conf>-?\d+)/change_beam/(?P<id_beam>-?\d+)/$', views.send_beam, name='url_send_beam'),
11 url(r'^(?P<id_conf>-?\d+)/change_beam/(?P<id_beam>-?\d+)/$', views.send_beam, name='url_send_beam'),
11 url(r'^(?P<id_conf>-?\d+)/plot/$', views.plot_patterns, name='url_plot_abs_patterns'),
12 url(r'^(?P<id_conf>-?\d+)/plot/$', views.plot_patterns, name='url_plot_abs_patterns'),
12 url(r'^(?P<id_conf>-?\d+)/plot/(?P<id_beam>-?\d+)/$', views.plot_patterns, name='url_plot_abs_patterns'),
13 url(r'^(?P<id_conf>-?\d+)/plot/(?P<id_beam>-?\d+)/$', views.plot_patterns, name='url_plot_abs_patterns'),
13 url(r'^(?P<id_conf>-?\d+)/plot/(?P<id_beam>-?\d+)/(?P<antenna>[\w\-]+)/pattern.png$', views.plot_pattern, name='url_plot_beam'),
14 url(r'^(?P<id_conf>-?\d+)/plot/(?P<id_beam>-?\d+)/(?P<antenna>[\w\-]+)/pattern.png$', views.plot_pattern, name='url_plot_beam'),
14 url(r'^(?P<id_conf>-?\d+)/add_beam/$', views.add_beam, name='url_add_abs_beam'),
15 url(r'^(?P<id_conf>-?\d+)/add_beam/$', views.add_beam, name='url_add_abs_beam'),
15 url(r'^(?P<id_conf>-?\d+)/beam/(?P<id_beam>-?\d+)/delete/$', views.remove_beam, name='url_remove_abs_beam'),
16 url(r'^(?P<id_conf>-?\d+)/beam/(?P<id_beam>-?\d+)/delete/$', views.remove_beam, name='url_remove_abs_beam'),
16 url(r'^(?P<id_conf>-?\d+)/beam/(?P<id_beam>-?\d+)/edit/$', views.edit_beam, name='url_edit_abs_beam'),
17 url(r'^(?P<id_conf>-?\d+)/beam/(?P<id_beam>-?\d+)/edit/$', views.edit_beam, name='url_edit_abs_beam'),
17 )
18 )
@@ -1,406 +1,415
1 from django.shortcuts import render_to_response
1 from django.shortcuts import render_to_response
2 from django.template import RequestContext
2 from django.template import RequestContext
3 from django.shortcuts import redirect, render, get_object_or_404
3 from django.shortcuts import redirect, render, get_object_or_404
4 from django.contrib import messages
4 from django.contrib import messages
5 from django.conf import settings
5 from django.conf import settings
6 from django.http import HttpResponse
6 from django.http import HttpResponse
7 from django.core.urlresolvers import reverse
7 from django.core.urlresolvers import reverse
8 from django.views.decorators.csrf import csrf_exempt
8
9
9 from datetime import datetime
10 from datetime import datetime
10 from time import sleep
11 from time import sleep
11 import os
12 import os
12 import io
13 import io
13
14
14 from apps.main.models import Device, Configuration, Experiment
15 from apps.main.models import Device, Configuration, Experiment
15 from apps.main.views import sidebar
16 from apps.main.views import sidebar
16
17
17 from .models import ABSConfiguration, ABSBeam
18 from .models import ABSConfiguration, ABSBeam
18 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm, ABSImportForm
19 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm, ABSImportForm
19
20
20 from .utils.overJroShow import overJroShow
21 from .utils.overJroShow import overJroShow
21 from .utils.OverJRO import OverJRO
22 from .utils.OverJRO import OverJRO
22 # Create your views here.
23 # Create your views here.
23 import json, ast
24 import json, ast
24
25
25
26
26 def get_values_from_form(form_data):
27 def get_values_from_form(form_data):
27
28
28 sublistup = []
29 sublistup = []
29 sublistdown = []
30 sublistdown = []
30 subtxlistup = []
31 subtxlistup = []
31 subtxlistdown = []
32 subtxlistdown = []
32 subrxlistup = []
33 subrxlistup = []
33 subrxlistdown = []
34 subrxlistdown = []
34
35
35 up_values_list = []
36 up_values_list = []
36 down_values_list = []
37 down_values_list = []
37 up_txvalues_list = []
38 up_txvalues_list = []
38 down_txvalues_list = []
39 down_txvalues_list = []
39 up_rxvalues_list = []
40 up_rxvalues_list = []
40 down_rxvalues_list = []
41 down_rxvalues_list = []
41
42
42 values_list = {}
43 values_list = {}
43 cont = 1
44 cont = 1
44
45
45 for i in range(1,65):
46 for i in range(1,65):
46 x = float(form_data['abs_up'+str(i)])
47 x = float(form_data['abs_up'+str(i)])
47 y = float(form_data['abs_down'+str(i)])
48 y = float(form_data['abs_down'+str(i)])
48 sublistup.append(x)
49 sublistup.append(x)
49 sublistdown.append(y)
50 sublistdown.append(y)
50
51
51 if str(i) in form_data.getlist('uptx_checks'):
52 if str(i) in form_data.getlist('uptx_checks'):
52 subtxlistup.append(1)
53 subtxlistup.append(1)
53 else:
54 else:
54 subtxlistup.append(0)
55 subtxlistup.append(0)
55 if str(i) in form_data.getlist('downtx_checks'):
56 if str(i) in form_data.getlist('downtx_checks'):
56 subtxlistdown.append(1)
57 subtxlistdown.append(1)
57 else:
58 else:
58 subtxlistdown.append(0)
59 subtxlistdown.append(0)
59
60
60 if str(i) in form_data.getlist('uprx_checks'):
61 if str(i) in form_data.getlist('uprx_checks'):
61 subrxlistup.append(1)
62 subrxlistup.append(1)
62 else:
63 else:
63 subrxlistup.append(0)
64 subrxlistup.append(0)
64 if str(i) in form_data.getlist('downrx_checks'):
65 if str(i) in form_data.getlist('downrx_checks'):
65 subrxlistdown.append(1)
66 subrxlistdown.append(1)
66 else:
67 else:
67 subrxlistdown.append(0)
68 subrxlistdown.append(0)
68
69
69 cont = cont+1
70 cont = cont+1
70
71
71 if cont == 9:
72 if cont == 9:
72 up_values_list.append(sublistup)
73 up_values_list.append(sublistup)
73 down_values_list.append(sublistdown)
74 down_values_list.append(sublistdown)
74 sublistup = []
75 sublistup = []
75 sublistdown = []
76 sublistdown = []
76
77
77 up_txvalues_list.append(subtxlistup)
78 up_txvalues_list.append(subtxlistup)
78 down_txvalues_list.append(subtxlistdown)
79 down_txvalues_list.append(subtxlistdown)
79 subtxlistup = []
80 subtxlistup = []
80 subtxlistdown = []
81 subtxlistdown = []
81 up_rxvalues_list.append(subrxlistup)
82 up_rxvalues_list.append(subrxlistup)
82 down_rxvalues_list.append(subrxlistdown)
83 down_rxvalues_list.append(subrxlistdown)
83 subrxlistup = []
84 subrxlistup = []
84 subrxlistdown = []
85 subrxlistdown = []
85 cont = 1
86 cont = 1
86
87
87
88
88 list_uesup = []
89 list_uesup = []
89 list_uesdown = []
90 list_uesdown = []
90 for i in range(1,5):
91 for i in range(1,5):
91 if form_data['ues_up'+str(i)] == '':
92 if form_data['ues_up'+str(i)] == '':
92 list_uesup.append(0.0)
93 list_uesup.append(0.0)
93 else:
94 else:
94 list_uesup.append(float(form_data['ues_up'+str(i)]))
95 list_uesup.append(float(form_data['ues_up'+str(i)]))
95
96
96 if form_data['ues_down'+str(i)] == '':
97 if form_data['ues_down'+str(i)] == '':
97 list_uesdown.append(0.0)
98 list_uesdown.append(0.0)
98 else:
99 else:
99 list_uesdown.append(float(form_data['ues_down'+str(i)]))
100 list_uesdown.append(float(form_data['ues_down'+str(i)]))
100
101
101 onlyrx_list = form_data.getlist('onlyrx')
102 onlyrx_list = form_data.getlist('onlyrx')
102 only_rx = {}
103 only_rx = {}
103 if '1' in onlyrx_list:
104 if '1' in onlyrx_list:
104 only_rx['up'] = True
105 only_rx['up'] = True
105 else:
106 else:
106 only_rx['up'] = False
107 only_rx['up'] = False
107 if '2' in onlyrx_list:
108 if '2' in onlyrx_list:
108 only_rx['down'] = True
109 only_rx['down'] = True
109 else:
110 else:
110 only_rx['down'] = False
111 only_rx['down'] = False
111
112
112 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
113 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
113 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
114 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
114 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
115 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
115 ues = {'up': list_uesup, 'down': list_uesdown}
116 ues = {'up': list_uesup, 'down': list_uesdown}
116 name = str(form_data['beam_name'])
117 name = str(form_data['beam_name'])
117
118
118 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
119 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
119
120
120 return beam_data
121 return beam_data
121
122
122
123
123 def abs_conf(request, id_conf):
124 def abs_conf(request, id_conf):
124
125
125 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
126 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
126 beams = ABSBeam.objects.filter(abs_conf=conf)
127 beams = ABSBeam.objects.filter(abs_conf=conf)
127 #------------Colors for Active Beam:-------------
128 #------------Colors for Active Beam:-------------
128 all_status = {}
129 all_status = {}
129 module_messages = json.loads(conf.module_messages)
130 module_messages = json.loads(conf.module_messages)
130
131
131 color_status = {}
132 color_status = {}
132 for i, status in enumerate(conf.module_status):
133 for i, status in enumerate(conf.module_status):
133 if status == '3': #Running background-color: #00cc00;
134 if status == '3': #Running background-color: #00cc00;
134 all_status['{}'.format(i+1)] = 2
135 all_status['{}'.format(i+1)] = 2
135 color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00'
136 color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00'
136 elif status == '1': #Connected background-color: #ee902c;
137 elif status == '1': #Connected background-color: #ee902c;
137 all_status['{}'.format(i+1)] = 1
138 all_status['{}'.format(i+1)] = 1
138 color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c'
139 color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c'
139 else: #Disconnected background-color: #ff0000;
140 else: #Disconnected background-color: #ff0000;
140 all_status['{}'.format(i+1)] = 0
141 all_status['{}'.format(i+1)] = 0
141 color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000'
142 color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000'
142 #------------------------------------------------
143 #------------------------------------------------
143
144
144 kwargs = {}
145 kwargs = {}
145 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
146 kwargs['connected_modules'] = str(conf.connected_modules())+'/64'
146 kwargs['dev_conf'] = conf
147 kwargs['dev_conf'] = conf
147
148
148 if conf.operation_mode == 0:
149 if conf.operation_mode == 0:
149 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
150 kwargs['dev_conf_keys'] = ['label', 'operation_mode']
150 else:
151 else:
151 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
152 kwargs['dev_conf_keys'] = ['label', 'operation_mode', 'operation_value']
152
153
153 kwargs['title'] = 'ABS Configuration'
154 kwargs['title'] = 'ABS Configuration'
154 kwargs['suptitle'] = 'Details'
155 kwargs['suptitle'] = 'Details'
155 kwargs['button'] = 'Edit Configuration'
156 kwargs['button'] = 'Edit Configuration'
156
157
157 if conf.active_beam != 0:
158 if conf.active_beam != 0:
158 kwargs['active_beam'] = int(conf.active_beam)
159 kwargs['active_beam'] = int(conf.active_beam)
159
160
160 kwargs['beams'] = beams
161 kwargs['beams'] = beams
161 kwargs['modules_status'] = all_status
162 kwargs['modules_status'] = all_status
162 kwargs['color_status'] = color_status
163 kwargs['color_status'] = color_status
163 kwargs['module_messages'] = module_messages
164 kwargs['module_messages'] = module_messages
164 ###### SIDEBAR ######
165 ###### SIDEBAR ######
165 kwargs.update(sidebar(conf=conf))
166 kwargs.update(sidebar(conf=conf))
166
167
167 return render(request, 'abs_conf.html', kwargs)
168 return render(request, 'abs_conf.html', kwargs)
168
169
169
170
170 def abs_conf_edit(request, id_conf):
171 def abs_conf_edit(request, id_conf):
171
172
172 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
173 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
173
174
174 beams = ABSBeam.objects.filter(abs_conf=conf)
175 beams = ABSBeam.objects.filter(abs_conf=conf)
175
176
176 if request.method=='GET':
177 if request.method=='GET':
177 form = ABSConfigurationForm(instance=conf)
178 form = ABSConfigurationForm(instance=conf)
178
179
179 if request.method=='POST':
180 if request.method=='POST':
180 form = ABSConfigurationForm(request.POST, instance=conf)
181 form = ABSConfigurationForm(request.POST, instance=conf)
181
182
182 if form.is_valid():
183 if form.is_valid():
183 conf = form.save(commit=False)
184 conf = form.save(commit=False)
184 conf.save()
185 conf.save()
185 return redirect('url_abs_conf', id_conf=conf.id)
186 return redirect('url_abs_conf', id_conf=conf.id)
186
187
187 ###### SIDEBAR ######
188 ###### SIDEBAR ######
188 kwargs = {}
189 kwargs = {}
189
190
190 kwargs['dev_conf'] = conf
191 kwargs['dev_conf'] = conf
191 #kwargs['id_dev'] = conf.id
192 #kwargs['id_dev'] = conf.id
192 kwargs['id_conf'] = conf.id
193 kwargs['id_conf'] = conf.id
193 kwargs['form'] = form
194 kwargs['form'] = form
194 kwargs['abs_beams'] = beams
195 kwargs['abs_beams'] = beams
195 kwargs['title'] = 'Device Configuration'
196 kwargs['title'] = 'Device Configuration'
196 kwargs['suptitle'] = 'Edit'
197 kwargs['suptitle'] = 'Edit'
197 kwargs['button'] = 'Save'
198 kwargs['button'] = 'Save'
198
199
199 kwargs['edit'] = True
200 kwargs['edit'] = True
200
201
201 return render(request, 'abs_conf_edit.html', kwargs)
202 return render(request, 'abs_conf_edit.html', kwargs)
202
203
204 @csrf_exempt
205 def abs_conf_alert(request):
206
207 if request.method == 'POST':
208 print request.POST
209 return HttpResponse(json.dumps({'result':1}), content_type='application/json')
210 else:
211 return redirect('index')
212
203
213
204 def import_file(request, id_conf):
214 def import_file(request, id_conf):
205
215
206 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
216 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
207 if request.method=='POST':
217 if request.method=='POST':
208 form = ABSImportForm(request.POST, request.FILES)
218 form = ABSImportForm(request.POST, request.FILES)
209 if form.is_valid():
219 if form.is_valid():
210 try:
220 try:
211 parms = conf.import_from_file(request.FILES['file_name'])
221 parms = conf.import_from_file(request.FILES['file_name'])
212
222
213 if parms:
223 if parms:
214 conf.update_from_file(parms)
224 conf.update_from_file(parms)
215 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
225 messages.success(request, 'Configuration "%s" loaded succesfully' % request.FILES['file_name'])
216 return redirect(conf.get_absolute_url_edit())
226 return redirect(conf.get_absolute_url_edit())
217
227
218 except Exception as e:
228 except Exception as e:
219 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
229 messages.error(request, 'Error parsing file: "%s" - %s' % (request.FILES['file_name'], e))
220
230
221 else:
231 else:
222 messages.warning(request, 'Your current configuration will be replaced')
232 messages.warning(request, 'Your current configuration will be replaced')
223 form = ABSImportForm()
233 form = ABSImportForm()
224
234
225 kwargs = {}
235 kwargs = {}
226 kwargs['form'] = form
236 kwargs['form'] = form
227 kwargs['title'] = 'ABS Configuration'
237 kwargs['title'] = 'ABS Configuration'
228 kwargs['suptitle'] = 'Import file'
238 kwargs['suptitle'] = 'Import file'
229 kwargs['button'] = 'Upload'
239 kwargs['button'] = 'Upload'
230 kwargs['previous'] = conf.get_absolute_url()
240 kwargs['previous'] = conf.get_absolute_url()
231
241
232 return render(request, 'abs_import.html', kwargs)
242 return render(request, 'abs_import.html', kwargs)
233
243
234
244
235 def send_beam(request, id_conf, id_beam):
245 def send_beam(request, id_conf, id_beam):
236
246
237 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
247 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
238 beam = get_object_or_404(ABSBeam, pk=id_beam)
248 beam = get_object_or_404(ABSBeam, pk=id_beam)
239 beams_list = ABSBeam.objects.filter(abs_conf=conf)
249 beams_list = ABSBeam.objects.filter(abs_conf=conf)
240 conf.active_beam = id_beam
250 conf.active_beam = id_beam
241
251
242 i = 0
252 i = 0
243 for b in beams_list:
253 for b in beams_list:
244 if b.id == int(id_beam):
254 if b.id == int(id_beam):
245 break
255 break
246 else:
256 else:
247 i += 1
257 i += 1
248 beam_pos = i + 1 #Estandarizar
258 beam_pos = i + 1 #Estandarizar
249 print '%s Position: %s' % (beam.name, str(beam_pos))
259 print '%s Position: %s' % (beam.name, str(beam_pos))
250 conf.send_beam(beam_pos)
260 conf.send_beam(beam_pos)
251
261
252 return redirect('url_abs_conf', conf.id)
262 return redirect('url_abs_conf', conf.id)
253
263
254
264
255 def add_beam(request, id_conf):
265 def add_beam(request, id_conf):
256
266
257 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
267 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
258 confs = Configuration.objects.all()
268 confs = Configuration.objects.all()
259
269
260 if request.method=='GET':
270 if request.method=='GET':
261 form = ABSBeamAddForm()
271 form = ABSBeamAddForm()
262
272
263 if request.method=='POST':
273 if request.method=='POST':
264 form = ABSBeamAddForm(request.POST)
274 form = ABSBeamAddForm(request.POST)
265
275
266 beam_data = get_values_from_form(request.POST)
276 beam_data = get_values_from_form(request.POST)
267
277
268 new_beam = ABSBeam(
278 new_beam = ABSBeam(
269 name = beam_data['name'],
279 name = beam_data['name'],
270 antenna = json.dumps(beam_data['antenna']),
280 antenna = json.dumps(beam_data['antenna']),
271 abs_conf = conf,
281 abs_conf = conf,
272 tx = json.dumps(beam_data['tx']),
282 tx = json.dumps(beam_data['tx']),
273 rx = json.dumps(beam_data['rx']),
283 rx = json.dumps(beam_data['rx']),
274 ues = json.dumps(beam_data['ues']),
284 ues = json.dumps(beam_data['ues']),
275 only_rx = json.dumps(beam_data['only_rx'])
285 only_rx = json.dumps(beam_data['only_rx'])
276 )
286 )
277 new_beam.save()
287 new_beam.save()
278 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
288 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
279
289
280 return redirect('url_edit_abs_conf', conf.id)
290 return redirect('url_edit_abs_conf', conf.id)
281
291
282 ###### SIDEBAR ######
292 ###### SIDEBAR ######
283 kwargs = {}
293 kwargs = {}
284
294
285 #kwargs['dev_conf'] = conf.device
295 #kwargs['dev_conf'] = conf.device
286 #kwargs['id_dev'] = conf.device
296 #kwargs['id_dev'] = conf.device
287 kwargs['id_conf'] = conf.id
297 kwargs['id_conf'] = conf.id
288 kwargs['form'] = form
298 kwargs['form'] = form
289 kwargs['title'] = 'ABS Beams'
299 kwargs['title'] = 'ABS Beams'
290 kwargs['suptitle'] = 'Add Beam'
300 kwargs['suptitle'] = 'Add Beam'
291 kwargs['button'] = 'Add'
301 kwargs['button'] = 'Add'
292 kwargs['no_sidebar'] = True
302 kwargs['no_sidebar'] = True
293
303
294 #kwargs['previous'] = conf.get_absolute_url_edit()
304 #kwargs['previous'] = conf.get_absolute_url_edit()
295 kwargs['edit'] = True
305 kwargs['edit'] = True
296
306
297 return render(request, 'abs_add_beam.html', kwargs)
307 return render(request, 'abs_add_beam.html', kwargs)
298
308
299
309
300 def edit_beam(request, id_conf, id_beam):
310 def edit_beam(request, id_conf, id_beam):
301
311
302 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
312 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
303 beam = get_object_or_404(ABSBeam, pk=id_beam)
313 beam = get_object_or_404(ABSBeam, pk=id_beam)
304
314
305 if request.method=='GET':
315 if request.method=='GET':
306 form = ABSBeamEditForm(initial={'beam': beam})
316 form = ABSBeamEditForm(initial={'beam': beam})
307
317
308 if request.method=='POST':
318 if request.method=='POST':
309 form = ABSBeamEditForm(request.POST)
319 form = ABSBeamEditForm(request.POST)
310
320
311 beam_data = get_values_from_form(request.POST)
321 beam_data = get_values_from_form(request.POST)
312
322
313 beam.dict_to_parms(beam_data)
323 beam.dict_to_parms(beam_data)
314 beam.save()
324 beam.save()
315
325
316 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
326 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
317
327
318 return redirect('url_edit_abs_conf', conf.id)
328 return redirect('url_edit_abs_conf', conf.id)
319
329
320 ###### SIDEBAR ######
330 ###### SIDEBAR ######
321 kwargs = {}
331 kwargs = {}
322
332
323 kwargs['id_conf'] = conf.id
333 kwargs['id_conf'] = conf.id
324 kwargs['form'] = form
334 kwargs['form'] = form
325 kwargs['title'] = 'ABS Beams'
335 kwargs['title'] = 'ABS Beams'
326 kwargs['suptitle'] = 'Edit Beam'
336 kwargs['suptitle'] = 'Edit Beam'
327 kwargs['button'] = 'Save'
337 kwargs['button'] = 'Save'
328 kwargs['no_sidebar'] = True
338 kwargs['no_sidebar'] = True
329
339
330 #kwargs['previous'] = conf.get_absolute_url_edit()
340 #kwargs['previous'] = conf.get_absolute_url_edit()
331 kwargs['edit'] = True
341 kwargs['edit'] = True
332
342
333 return render(request, 'abs_edit_beam.html', kwargs)
343 return render(request, 'abs_edit_beam.html', kwargs)
334
344
335
345
336
346
337 def remove_beam(request, id_conf, id_beam):
347 def remove_beam(request, id_conf, id_beam):
338
348
339 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
349 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
340 beam = get_object_or_404(ABSBeam, pk=id_beam)
350 beam = get_object_or_404(ABSBeam, pk=id_beam)
341
351
342 if request.method=='POST':
352 if request.method=='POST':
343 if beam:
353 if beam:
344 try:
354 try:
345 beam.remove_beamfromlist()
346 beam.delete()
355 beam.delete()
347 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
356 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
348 except:
357 except:
349 messages.error(request, 'Unable to delete beam: "%s".' % beam)
358 messages.error(request, 'Unable to delete beam: "%s".' % beam)
350
359
351 return redirect('url_edit_abs_conf', conf.id)
360 return redirect('url_edit_abs_conf', conf.id)
352
361
353 ###### SIDEBAR ######
362 ###### SIDEBAR ######
354 kwargs = {}
363 kwargs = {}
355
364
356 kwargs['object'] = beam
365 kwargs['object'] = beam
357 kwargs['delete'] = True
366 kwargs['delete'] = True
358 kwargs['title'] = 'Delete'
367 kwargs['title'] = 'Delete'
359 kwargs['suptitle'] = 'Beam'
368 kwargs['suptitle'] = 'Beam'
360 kwargs['previous'] = conf.get_absolute_url_edit()
369 kwargs['previous'] = conf.get_absolute_url_edit()
361 return render(request, 'confirm.html', kwargs)
370 return render(request, 'confirm.html', kwargs)
362
371
363
372
364
373
365 def plot_patterns(request, id_conf, id_beam=None):
374 def plot_patterns(request, id_conf, id_beam=None):
366
375
367 kwargs = {}
376 kwargs = {}
368 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
377 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
369 beams = ABSBeam.objects.filter(abs_conf=conf)
378 beams = ABSBeam.objects.filter(abs_conf=conf)
370
379
371 if id_beam:
380 if id_beam:
372 beam = get_object_or_404(ABSBeam, pk=id_beam)
381 beam = get_object_or_404(ABSBeam, pk=id_beam)
373 kwargs['beam'] = beam
382 kwargs['beam'] = beam
374
383
375 ###### SIDEBAR ######
384 ###### SIDEBAR ######
376
385
377 kwargs['dev_conf'] = conf.device
386 kwargs['dev_conf'] = conf.device
378 kwargs['id_dev'] = conf.device
387 kwargs['id_dev'] = conf.device
379 kwargs['id_conf'] = conf.id
388 kwargs['id_conf'] = conf.id
380 kwargs['abs_beams'] = beams
389 kwargs['abs_beams'] = beams
381 kwargs['title'] = 'ABS Patterns'
390 kwargs['title'] = 'ABS Patterns'
382 kwargs['suptitle'] = conf.name
391 kwargs['suptitle'] = conf.name
383 kwargs['no_sidebar'] = True
392 kwargs['no_sidebar'] = True
384
393
385 return render(request, 'abs_patterns.html', kwargs)
394 return render(request, 'abs_patterns.html', kwargs)
386
395
387
396
388 def plot_pattern(request, id_conf, id_beam, antenna):
397 def plot_pattern(request, id_conf, id_beam, antenna):
389
398
390 if antenna=='down':
399 if antenna=='down':
391 sleep(3)
400 sleep(3)
392
401
393 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
402 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
394 beam = get_object_or_404(ABSBeam, pk=id_beam)
403 beam = get_object_or_404(ABSBeam, pk=id_beam)
395 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
404 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
396 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
405 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
397 gain_tx = json.loads(beam.tx)[antenna]
406 gain_tx = json.loads(beam.tx)[antenna]
398 gain_rx = json.loads(beam.rx)[antenna]
407 gain_rx = json.loads(beam.rx)[antenna]
399 ues = json.loads(beam.ues)[antenna]
408 ues = json.loads(beam.ues)[antenna]
400 newOverJro = overJroShow(beam.name)
409 newOverJro = overJroShow(beam.name)
401 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
410 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
402 buf = io.BytesIO()
411 buf = io.BytesIO()
403 fig.savefig(buf, format='png')
412 fig.savefig(buf, format='png')
404 response = HttpResponse(buf.getvalue(), content_type='image/png')
413 response = HttpResponse(buf.getvalue(), content_type='image/png')
405 return response
414 return response
406 No newline at end of file
415
General Comments 0
You need to be logged in to leave comments. Login now