##// END OF EJS Templates
Update abs operations
jespinoza -
r313:9bf21dca53e0
parent child
Show More
@@ -1,864 +1,878
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 sys, time
12 import 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['name'] = self.name
230 parameters['name'] = self.name
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.name = parameters['name']
246 self.name = parameters['name']
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:
397 n += 1
400 n += 1
398 sock.close()
401 sock.close()
399 else:
402 else:
400 self.message = "ABS Configuration does not have beams"
403 self.message = "ABS Configuration does not have beams"
401 return False
404 return False
402
405
403 if n == 64:
406 if n == 64:
404 self.message = "Could not write ABS Modules"
407 self.message = "Could not write ABS Modules"
405 self.device.status = 0
408 self.device.status = 0
406 self.module_status = ''.join(status)
409 self.module_status = ''.join(status)
407 self.save()
410 self.save()
408 return False
411 return False
409 else:
412 else:
410 self.message = "ABS Beams List have been sent to ABS Modules"
413 self.message = "ABS Beams List have been sent to ABS Modules"
411 beams[0].set_as_activebeam()
414 self.active_beam = beams[0].pk
412
415
413 self.device.status = 3
416 self.device.status = 3
414 self.module_status = ''.join(status)
417 self.module_status = ''.join(status)
415 self.save()
418 self.save()
416 return True
419 return True
417
420
418
421
419 def read_module(self, module):
422 def read_module(self, module):
420
423
421 """
424 """
422 Read out-bits (up-down) of 1 abs module NOT for Configuration
425 Read out-bits (up-down) of 1 abs module NOT for Configuration
423 """
426 """
424
427
425 ip_address = self.device.ip_address
428 ip_address = self.device.ip_address
426 ip_address = ip_address.split('.')
429 ip_address = ip_address.split('.')
427 module_seq = (ip_address[0],ip_address[1],ip_address[2])
430 module_seq = (ip_address[0],ip_address[1],ip_address[2])
428 dot = '.'
431 dot = '.'
429 module_ip = dot.join(module_seq)+'.'+str(module)
432 module_ip = dot.join(module_seq)+'.'+str(module)
430 module_port = self.device.port_address
433 module_port = self.device.port_address
431 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
434 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
432
435
433 module_status = json.loads(self.module_status)
436 module_status = json.loads(self.module_status)
434 print(read_route)
437 print(read_route)
435
438
436 module_bits = ''
439 module_bits = ''
437
440
438 try:
441 try:
439 r_read = requests.get(read_route, timeout=0.5)
442 r_read = requests.get(read_route, timeout=0.5)
440 answer = r_read.json()
443 answer = r_read.json()
441 module_bits = answer['allbits']
444 module_bits = answer['allbits']
442 except:
445 except:
443 return {}
446 return {}
444
447
445 return module_bits
448 return module_bits
446
449
447 def read_device(self):
450 def read_device(self):
448
451
449 parms = {}
452 parms = {}
450 # Reads active modules.
453 # Reads active modules.
451 module_status = json.loads(self.module_status)
454 module_status = json.loads(self.module_status)
452 total = 0
455 total = 0
453 for status in module_status:
456 for status in module_status:
454 if module_status[status] != 0:
457 if module_status[status] != 0:
455 module_bits = self.read_module(int(status))
458 module_bits = self.read_module(int(status))
456 bits={}
459 bits={}
457 if module_bits:
460 if module_bits:
458 bits = (str(module_bits['um2']) + str(module_bits['um1']) + str(module_bits['um0']) +
461 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']) )
462 str(module_bits['dm2']) + str(module_bits['dm1']) + str(module_bits['dm0']) )
460 parms[str(status)] = bits
463 parms[str(status)] = bits
461
464
462 total +=1
465 total +=1
463
466
464 if total==0:
467 if total==0:
465 self.message = "No ABS Module detected. Please select 'Status'."
468 self.message = "No ABS Module detected. Please select 'Status'."
466 return False
469 return False
467
470
468
471
469
472
470 self.message = "ABS Modules have been read"
473 self.message = "ABS Modules have been read"
471 #monitoreo_tx = JROABSClnt_01CeCnMod000000MNTR10
474 #monitoreo_tx = JROABSClnt_01CeCnMod000000MNTR10
472 return parms
475 return parms
473
476
474
477
475 def connected_modules(self):
478 def connected_modules(self):
476 """
479 """
477 This function returns the number of connected abs-modules without updating.
480 This function returns the number of connected abs-modules without updating.
478 """
481 """
479 num = 0
482 num = 0
480 print(self.module_status)
483 print(self.module_status)
481 for i, status in enumerate(self.module_status):
484 for i, status in enumerate(self.module_status):
482 if status != '0':
485 if status != '0':
483 num += 1
486 num += 1
484 print('status {}:{}'.format(i+1, status))
487 #print('status {}:{}'.format(i+1, status))
485 return num
488 return num
486
489
487 def send_multicast(self, message):
490 def send_multicast(self, message):
488
491
489 multicast_group = ('224.3.29.71', 10000)
492 multicast_group = ('224.3.29.71', 10000)
490 # Create the datagram socket
493 # Create the datagram socket
491 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
494 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
492 sock.settimeout(0.01)
495 sock.settimeout(0.5)
493 local_ip = "0.0.0.0"
496 local_ip = "192.168.1.128"
497 sock.bind((local_ip, 10000))
494 sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip))
498 sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip))
495 sent = sock.sendto(message, multicast_group)
499 sent = sock.sendto(message, multicast_group)
496 print('Sending ' + message)
500 print('Sending ' + message)
497 return sock
501 return sock
498
502
499 def status_device(self):
503 def status_device(self):
500 """
504 """
501 This function returns the status of all abs-modules as one.
505 This function returns the status of all abs-modules as one.
502 If at least one module is connected, its answer is "1"
506 If at least one module is connected, its answer is "1"
503 """
507 """
504
508
505 sock = self.send_multicast('MNTR')
509 sock = self.send_multicast('MNTR')
506
510
507 n = 0
511 n = 0
508 status = ['0'] * 64
512 status = ['0'] * 64
509 for i in range(64):
513 for i in range(32):
514 #if True:
510 try:
515 try:
511 data, address = sock.recvfrom(1024)
516 data, address = sock.recvfrom(1024)
517 print address, data
512 if data == '1':
518 if data == '1':
513 status[int(address[0][10:])-1] = '3'
519 status[int(address[0][10:])-1] = '3'
514 elif data == '0':
520 elif data == '0':
515 status[int(address[0][10:])-1] = '1'
521 status[int(address[0][10:])-1] = '1'
516 n += 1
522 n += 1
517 print('Module: {} connected'.format(address))
523 print('Module: {} connected'.format(address))
518 except:
524 except:
525 print('Module: {} error'.format(address))
519 pass
526 pass
520 sock.close()
527 sock.close()
521
528
522 if n > 0:
529 if n > 0:
523 self.message = 'ABS modules Status have been updated.'
530 self.message = 'ABS modules Status have been updated.'
524 self.device.status = 1
531 self.device.status = 1
525 else:
532 else:
526 self.device.status = 0
533 self.device.status = 0
527 self.message = 'No ABS module is connected.'
534 self.message = 'No ABS module is connected.'
528 self.module_status = ''.join(status)
535 self.module_status = ''.join(status)
529 self.save()
536 self.save()
530
537
531 return self.device.status
538 return self.device.status
532
539
533
540
534 def send_beam(self, beam_pos):
541 def send_beam(self, beam_pos):
535 """
542 """
536 This function connects to a multicast group and sends the beam number
543 This function connects to a multicast group and sends the beam number
537 to all abs modules.
544 to all abs modules.
538 """
545 """
539
546
540 # Se manda a cero RC para poder realizar cambio de beam
547 # Se manda a cero RC para poder realizar cambio de beam
541 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
548 if self.experiment is None:
549 confs = []
550 else:
551 confs = Configuration.objects.filter(experiment = self.experiment).filter(type=0)
542 confdds = ''
552 confdds = ''
543 confjars = ''
553 confjars = ''
544 confrc = ''
554 confrc = ''
545
555 print 'Starting...', self.experiment
546 #TO STOP DEVICES: DDS-JARS-RC
556 #TO STOP DEVICES: DDS-JARS-RC
547 for i in range(0,len(confs)):
557 for i in range(0,len(confs)):
558 print i
548 if i==0:
559 if i==0:
549 for conf in confs:
560 for conf in confs:
550 if conf.device.device_type.name == 'dds':
561 if conf.device.device_type.name == 'dds':
551 confdds = conf
562 confdds = conf
552 confdds.stop_device()
563 confdds.stop_device()
553 break
564 break
554 if i==1:
565 if i==1:
555 for conf in confs:
566 for conf in confs:
556 if conf.device.device_type.name == 'jars':
567 if conf.device.device_type.name == 'jars':
557 confjars = conf
568 confjars = conf
558 confjars.stop_device()
569 confjars.stop_device()
559 break
570 break
560 if i==2:
571 if i==2:
561 for conf in confs:
572 for conf in confs:
573 print conf
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
578 print 'Stop devices'
567 if beam_pos > 0:
579 if beam_pos > 0:
568 beam_pos = beam_pos - 1
580 beam_pos = beam_pos - 1
569 else:
581 else:
570 beam_pos = 0
582 beam_pos = 0
571
583
572 #El indice del apunte debe ser menor que el numero total de apuntes
584 #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
585 #El servidor tcp en el embebido comienza a contar desde 0
574 status = ['0'] * 64
586 status = ['0'] * 64
575 message = 'CHGB{}'.format(beam_pos)
587 message = 'CHGB{}'.format(beam_pos)
588 print 'Before send'
576 sock = self.send_multicast(message)
589 sock = self.send_multicast(message)
577
590 print 'Waiting'
578 for i in range(64):
591 for i in range(32):
579 try:
592 try:
580 data, address = sock.recvfrom(1024)
593 data, address = sock.recvfrom(1024)
581 print address, data
594 print address, data
582 if data == '1':
595 if data == '1':
583 status[int(address[0][10:])-1] = '3'
596 status[int(address[0][10:])-1] = '3'
584 elif data == '0':
597 elif data == '0':
585 status[int(address[0][10:])-1] = '1'
598 status[int(address[0][10:])-1] = '1'
586 except:
599 except:
587 pass
600 pass
588
601
589 sock.close()
602 sock.close()
590
603
591 #Start DDS-RC-JARS
604 #Start DDS-RC-JARS
592 if confdds:
605 if confdds:
593 confdds.start_device()
606 confdds.start_device()
594 if confrc:
607 if confrc:
595 #print confrc
608 #print confrc
596 confrc.start_device()
609 confrc.start_device()
597 if confjars:
610 if confjars:
598 confjars.start_device()
611 confjars.start_device()
599
612
600 self.message = "ABS Beam has been changed"
613 self.message = "ABS Beam has been changed"
601 self.module_status = ''.join(status)
614 self.module_status = ''.join(status)
602 self.save()
615 self.save()
603 return True
616 return True
604
617
605
618
606 def get_absolute_url_import(self):
619 def get_absolute_url_import(self):
607 return reverse('url_import_abs_conf', args=[str(self.id)])
620 return reverse('url_import_abs_conf', args=[str(self.id)])
608
621
609
622
610 class ABSBeam(models.Model):
623 class ABSBeam(models.Model):
611
624
612 name = models.CharField(max_length=60, default='Beam')
625 name = models.CharField(max_length=60, default='Beam')
613 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
626 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
614 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
627 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
615 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
628 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)
629 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')
630 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')
631 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)
632 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)
633 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
621
634
622 class Meta:
635 class Meta:
623 db_table = 'abs_beams'
636 db_table = 'abs_beams'
624
637
625 def __unicode__(self):
638 def __unicode__(self):
626 return u'%s' % (self.name)
639 return u'%s' % (self.name)
627
640
628 def parms_to_dict(self):
641 def parms_to_dict(self):
629
642
630 parameters = {}
643 parameters = {}
631 parameters['name'] = self.name
644 parameters['name'] = self.name
632 parameters['antenna'] = ast.literal_eval(self.antenna)
645 parameters['antenna'] = ast.literal_eval(self.antenna)
633 parameters['abs_conf'] = self.abs_conf.name
646 parameters['abs_conf'] = self.abs_conf.name
634 parameters['tx'] = ast.literal_eval(self.tx)
647 parameters['tx'] = ast.literal_eval(self.tx)
635 parameters['rx'] = ast.literal_eval(self.rx)
648 parameters['rx'] = ast.literal_eval(self.rx)
636 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
649 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
637 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
650 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
638 parameters['ues'] = ast.literal_eval(self.ues)
651 parameters['ues'] = ast.literal_eval(self.ues)
639 parameters['only_rx'] = json.loads(self.only_rx)
652 parameters['only_rx'] = json.loads(self.only_rx)
640
653
641 return parameters
654 return parameters
642
655
643 def dict_to_parms(self, parameters):
656 def dict_to_parms(self, parameters):
644
657
645 self.name = parameters['name']
658 self.name = parameters['name']
646 self.antenna = json.dumps(parameters['antenna'])
659 self.antenna = json.dumps(parameters['antenna'])
647 #self.abs_conf = parameters['abs_conf']
660 #self.abs_conf = parameters['abs_conf']
648 self.tx = json.dumps(parameters['tx'])
661 self.tx = json.dumps(parameters['tx'])
649 self.rx = json.dumps(parameters['rx'])
662 self.rx = json.dumps(parameters['rx'])
650 #self.s_time = parameters['s_time']
663 #self.s_time = parameters['s_time']
651 #self.e_time = parameters['e_time']
664 #self.e_time = parameters['e_time']
652 self.ues = json.dumps(parameters['ues'])
665 self.ues = json.dumps(parameters['ues'])
653 self.only_rx = json.dumps(parameters['only_rx'])
666 self.only_rx = json.dumps(parameters['only_rx'])
654 self.save()
667 self.save()
655
668
656
669
657 def clone(self, **kwargs):
670 def clone(self, **kwargs):
658
671
659 self.pk = None
672 self.pk = None
660 self.id = None
673 self.id = None
661 for attr, value in kwargs.items():
674 for attr, value in kwargs.items():
662 setattr(self, attr, value)
675 setattr(self, attr, value)
663
676
664 self.save()
677 self.save()
665
678
666 return self
679 return self
667
680
668
681
669 def module_6bits(self, module):
682 def module_6bits(self, module):
670 """
683 """
671 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
684 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
672 """
685 """
686 module += 1
673 if module > 64:
687 if module > 64:
674 beam_bits = ""
688 beam_bits = ""
675 return beam_bits
689 return beam_bits
676
690
677 data = ast.literal_eval(self.antenna)
691 data = ast.literal_eval(self.antenna)
678 up_data = data['antenna_up']
692 up_data = data['antenna_up']
679 down_data = data['antenna_down']
693 down_data = data['antenna_down']
680
694
681 pos = ip2position(module)
695 pos = ip2position(module)
682 up_value = up_data[pos[0]][pos[1]]
696 up_value = up_data[pos[0]][pos[1]]
683 down_value = down_data[pos[0]][pos[1]]
697 down_value = down_data[pos[0]][pos[1]]
684
698
685 up_bits = up_conv_bits(up_value)
699 up_bits = up_conv_bits(up_value)
686 down_bits = down_conv_bits(down_value)
700 down_bits = down_conv_bits(down_value)
687 beam_bits = up_bits+down_bits
701 beam_bits = up_bits+down_bits
688
702
689 return beam_bits
703 return beam_bits
690
704
691
705
692 @property
706 @property
693 def get_upvalues(self):
707 def get_upvalues(self):
694 """
708 """
695 This function reads antenna pattern and show the up-value of one abs module
709 This function reads antenna pattern and show the up-value of one abs module
696 """
710 """
697
711
698 data = ast.literal_eval(self.antenna)
712 data = ast.literal_eval(self.antenna)
699 up_data = data['antenna_up']
713 up_data = data['antenna_up']
700
714
701 up_values = []
715 up_values = []
702 for data in up_data:
716 for data in up_data:
703 for i in range(0,8):
717 for i in range(0,8):
704 up_values.append(data[i])
718 up_values.append(data[i])
705
719
706 return up_values
720 return up_values
707
721
708 @property
722 @property
709 def antenna_upvalues(self):
723 def antenna_upvalues(self):
710 """
724 """
711 This function reads antenna pattern and show the up - values of one abs beam
725 This function reads antenna pattern and show the up - values of one abs beam
712 in a particular order
726 in a particular order
713 """
727 """
714 data = ast.literal_eval(self.antenna)
728 data = ast.literal_eval(self.antenna)
715 up_data = data['antenna_up']
729 up_data = data['antenna_up']
716
730
717 return up_data
731 return up_data
718
732
719 @property
733 @property
720 def antenna_downvalues(self):
734 def antenna_downvalues(self):
721 """
735 """
722 This function reads antenna pattern and show the down - values of one abs beam
736 This function reads antenna pattern and show the down - values of one abs beam
723 in a particular order
737 in a particular order
724 """
738 """
725 data = ast.literal_eval(self.antenna)
739 data = ast.literal_eval(self.antenna)
726 down_data = data['antenna_down']
740 down_data = data['antenna_down']
727
741
728 return down_data
742 return down_data
729
743
730 @property
744 @property
731 def get_downvalues(self):
745 def get_downvalues(self):
732 """
746 """
733 This function reads antenna pattern and show the down-value of one abs module
747 This function reads antenna pattern and show the down-value of one abs module
734 """
748 """
735
749
736 data = ast.literal_eval(self.antenna)
750 data = ast.literal_eval(self.antenna)
737 down_data = data['antenna_down']
751 down_data = data['antenna_down']
738
752
739 down_values = []
753 down_values = []
740 for data in down_data:
754 for data in down_data:
741 for i in range(0,8):
755 for i in range(0,8):
742 down_values.append(data[i])
756 down_values.append(data[i])
743
757
744 return down_values
758 return down_values
745
759
746 @property
760 @property
747 def get_up_ues(self):
761 def get_up_ues(self):
748 """
762 """
749 This function shows the up-ues-value of one beam
763 This function shows the up-ues-value of one beam
750 """
764 """
751 data = ast.literal_eval(self.ues)
765 data = ast.literal_eval(self.ues)
752 up_ues = data['up']
766 up_ues = data['up']
753
767
754 return up_ues
768 return up_ues
755
769
756 @property
770 @property
757 def get_down_ues(self):
771 def get_down_ues(self):
758 """
772 """
759 This function shows the down-ues-value of one beam
773 This function shows the down-ues-value of one beam
760 """
774 """
761 data = ast.literal_eval(self.ues)
775 data = ast.literal_eval(self.ues)
762 down_ues = data['down']
776 down_ues = data['down']
763
777
764 return down_ues
778 return down_ues
765
779
766 @property
780 @property
767 def get_up_onlyrx(self):
781 def get_up_onlyrx(self):
768 """
782 """
769 This function shows the up-onlyrx-value of one beam
783 This function shows the up-onlyrx-value of one beam
770 """
784 """
771 data = json.loads(self.only_rx)
785 data = json.loads(self.only_rx)
772 up_onlyrx = data['up']
786 up_onlyrx = data['up']
773
787
774 return up_onlyrx
788 return up_onlyrx
775
789
776 @property
790 @property
777 def get_down_onlyrx(self):
791 def get_down_onlyrx(self):
778 """
792 """
779 This function shows the down-onlyrx-value of one beam
793 This function shows the down-onlyrx-value of one beam
780 """
794 """
781 data = json.loads(self.only_rx)
795 data = json.loads(self.only_rx)
782 down_onlyrx = data['down']
796 down_onlyrx = data['down']
783
797
784 return down_onlyrx
798 return down_onlyrx
785
799
786 @property
800 @property
787 def get_tx(self):
801 def get_tx(self):
788 """
802 """
789 This function shows the tx-values of one beam
803 This function shows the tx-values of one beam
790 """
804 """
791 data = json.loads(self.tx)
805 data = json.loads(self.tx)
792
806
793 return data
807 return data
794
808
795 @property
809 @property
796 def get_uptx(self):
810 def get_uptx(self):
797 """
811 """
798 This function shows the up-tx-values of one beam
812 This function shows the up-tx-values of one beam
799 """
813 """
800 data = json.loads(self.tx)
814 data = json.loads(self.tx)
801 up_data = data['up']
815 up_data = data['up']
802
816
803 up_values = []
817 up_values = []
804 for data in up_data:
818 for data in up_data:
805 for i in range(0,8):
819 for i in range(0,8):
806 up_values.append(data[i])
820 up_values.append(data[i])
807
821
808 return up_values
822 return up_values
809
823
810 @property
824 @property
811 def get_downtx(self):
825 def get_downtx(self):
812 """
826 """
813 This function shows the down-tx-values of one beam
827 This function shows the down-tx-values of one beam
814 """
828 """
815 data = json.loads(self.tx)
829 data = json.loads(self.tx)
816 down_data = data['down']
830 down_data = data['down']
817
831
818 down_values = []
832 down_values = []
819 for data in down_data:
833 for data in down_data:
820 for i in range(0,8):
834 for i in range(0,8):
821 down_values.append(data[i])
835 down_values.append(data[i])
822
836
823 return down_values
837 return down_values
824
838
825
839
826
840
827 @property
841 @property
828 def get_rx(self):
842 def get_rx(self):
829 """
843 """
830 This function shows the rx-values of one beam
844 This function shows the rx-values of one beam
831 """
845 """
832 data = json.loads(self.rx)
846 data = json.loads(self.rx)
833
847
834 return data
848 return data
835
849
836 @property
850 @property
837 def get_uprx(self):
851 def get_uprx(self):
838 """
852 """
839 This function shows the up-rx-values of one beam
853 This function shows the up-rx-values of one beam
840 """
854 """
841 data = json.loads(self.rx)
855 data = json.loads(self.rx)
842 up_data = data['up']
856 up_data = data['up']
843
857
844 up_values = []
858 up_values = []
845 for data in up_data:
859 for data in up_data:
846 for i in range(0,8):
860 for i in range(0,8):
847 up_values.append(data[i])
861 up_values.append(data[i])
848
862
849 return up_values
863 return up_values
850
864
851 @property
865 @property
852 def get_downrx(self):
866 def get_downrx(self):
853 """
867 """
854 This function shows the down-rx-values of one beam
868 This function shows the down-rx-values of one beam
855 """
869 """
856 data = json.loads(self.rx)
870 data = json.loads(self.rx)
857 down_data = data['down']
871 down_data = data['down']
858
872
859 down_values = []
873 down_values = []
860 for data in down_data:
874 for data in down_data:
861 for i in range(0,8):
875 for i in range(0,8):
862 down_values.append(data[i])
876 down_values.append(data[i])
863
877
864 return down_values
878 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'] = ['name', 'operation_mode']
150 kwargs['dev_conf_keys'] = ['name', 'operation_mode']
150 else:
151 else:
151 kwargs['dev_conf_keys'] = ['name', 'operation_mode', 'operation_value']
152 kwargs['dev_conf_keys'] = ['name', '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