##// END OF EJS Templates
Task #714: Modulo Web ABS: send beam position function (models, views, urls, abs_conf) ...
Fiorella Quino -
r183:f7d08e6ebe60
parent child
Show More
@@ -1,967 +1,979
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
5
6 import ast
6 import ast
7 import socket
7 import socket
8 import json
8 import json
9 import requests
9 import requests
10 import struct
10 import struct
11 import sys, time
11 import sys, time
12
12
13 import multiprocessing
13 import multiprocessing
14
14
15
15
16 antenna_default = json.dumps({
16 antenna_default = json.dumps({
17 "antenna_up": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
17 "antenna_up": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
18 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
18 [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.5,0.5,0.5,0.5,1.0,1.0,1.0,1.0],
21 [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],
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 ]
25 ]
26 ,
26 ,
27 "antenna_down": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
27 "antenna_down": [[0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
28 [0.0,0.0,0.0,0.0,0.5,0.5,0.5,0.5],
28 [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.5,0.5,0.5,0.5,3.0,3.0,3.0,3.0],
31 [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],
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 })
35 })
36
36
37
37
38 tx_default = json.dumps({
38 tx_default = json.dumps({
39 "up": [[1,1,1,1,0,0,0,0],
39 "up": [[1,1,1,1,0,0,0,0],
40 [1,1,1,1,0,0,0,0],
40 [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 [0,0,0,0,1,1,1,1],
43 [0,0,0,0,1,1,1,1],
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
47
48 "down": [[1,1,1,1,0,0,0,0],
48 "down": [[1,1,1,1,0,0,0,0],
49 [1,1,1,1,0,0,0,0],
49 [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 [0,0,0,0,1,1,1,1],
52 [0,0,0,0,1,1,1,1],
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 })
56 })
57
57
58 rx_default = json.dumps({
58 rx_default = json.dumps({
59 "up": [[1,1,1,1,0,0,0,0],
59 "up": [[1,1,1,1,0,0,0,0],
60 [1,1,1,1,0,0,0,0],
60 [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 [0,0,0,0,1,1,1,1],
63 [0,0,0,0,1,1,1,1],
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
67
68 "down": [[1,1,1,1,0,0,0,0],
68 "down": [[1,1,1,1,0,0,0,0],
69 [1,1,1,1,0,0,0,0],
69 [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 [0,0,0,0,1,1,1,1],
72 [0,0,0,0,1,1,1,1],
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 })
76 })
77
77
78 conf_default = {}
78 conf_default = {}
79 status_default = {}
79 status_default = {}
80 for i in range(1,65):
80 for i in range(1,65):
81 conf_default[str(i)] = ""
81 conf_default[str(i)] = ""
82 status_default[str(i)] = 0
82 status_default[str(i)] = 0
83
83
84 ues_default = json.dumps({
84 ues_default = json.dumps({
85 "up": [0.533333,0.00000,1.06667,0.00000],
85 "up": [0.533333,0.00000,1.06667,0.00000],
86 "down": [0.533333,0.00000,1.06667,0.00000]
86 "down": [0.533333,0.00000,1.06667,0.00000]
87 })
87 })
88
88
89 onlyrx_default = json.dumps({
89 onlyrx_default = json.dumps({
90 "up": False,
90 "up": False,
91 "down": False
91 "down": False
92 })
92 })
93
93
94 def up_convertion(cadena):
94 def up_convertion(cadena):
95 valores = []
95 valores = []
96 for c in cadena:
96 for c in cadena:
97 if c == 1.0: valores=valores+['000']
97 if c == 1.0: valores=valores+['000']
98 if c == 2.0: valores=valores+['001']
98 if c == 2.0: valores=valores+['001']
99 if c == 3.0: valores=valores+['010']
99 if c == 3.0: valores=valores+['010']
100 if c == 0.0: valores=valores+['011']
100 if c == 0.0: valores=valores+['011']
101 if c == 0.5: valores=valores+['100']
101 if c == 0.5: valores=valores+['100']
102 if c == 1.5: valores=valores+['101']
102 if c == 1.5: valores=valores+['101']
103 if c == 2.5: valores=valores+['110']
103 if c == 2.5: valores=valores+['110']
104 if c == 3.5: valores=valores+['111']
104 if c == 3.5: valores=valores+['111']
105
105
106 return valores
106 return valores
107
107
108 def up_conv_bits(value):
108 def up_conv_bits(value):
109
109
110 if value == 1.0: bits="000"
110 if value == 1.0: bits="000"
111 if value == 2.0: bits="001"
111 if value == 2.0: bits="001"
112 if value == 3.0: bits="010"
112 if value == 3.0: bits="010"
113 if value == 0.0: bits="011"
113 if value == 0.0: bits="011"
114 if value == 0.5: bits="100"
114 if value == 0.5: bits="100"
115 if value == 1.5: bits="101"
115 if value == 1.5: bits="101"
116 if value == 2.5: bits="110"
116 if value == 2.5: bits="110"
117 if value == 3.5: bits="111"
117 if value == 3.5: bits="111"
118
118
119 return bits
119 return bits
120
120
121 def down_convertion(cadena):
121 def down_convertion(cadena):
122 valores = []
122 valores = []
123 for c in cadena:
123 for c in cadena:
124 if c == 1.0: valores=valores+['000']
124 if c == 1.0: valores=valores+['000']
125 if c == 2.0: valores=valores+['001']
125 if c == 2.0: valores=valores+['001']
126 if c == 3.0: valores=valores+['010']
126 if c == 3.0: valores=valores+['010']
127 if c == 0.0: valores=valores+['011']
127 if c == 0.0: valores=valores+['011']
128 if c == 0.5: valores=valores+['100']
128 if c == 0.5: valores=valores+['100']
129 if c == 1.5: valores=valores+['101']
129 if c == 1.5: valores=valores+['101']
130 if c == 2.5: valores=valores+['110']
130 if c == 2.5: valores=valores+['110']
131 if c == 3.5: valores=valores+['111']
131 if c == 3.5: valores=valores+['111']
132
132
133 return valores
133 return valores
134
134
135 def down_conv_bits(value):
135 def down_conv_bits(value):
136
136
137 if value == 1.0: bits="000"
137 if value == 1.0: bits="000"
138 if value == 2.0: bits="001"
138 if value == 2.0: bits="001"
139 if value == 3.0: bits="010"
139 if value == 3.0: bits="010"
140 if value == 0.0: bits="011"
140 if value == 0.0: bits="011"
141 if value == 0.5: bits="100"
141 if value == 0.5: bits="100"
142 if value == 1.5: bits="101"
142 if value == 1.5: bits="101"
143 if value == 2.5: bits="110"
143 if value == 2.5: bits="110"
144 if value == 3.5: bits="111"
144 if value == 3.5: bits="111"
145
145
146 return bits
146 return bits
147
147
148 def ip2position(module_number):
148 def ip2position(module_number):
149 j=0
149 j=0
150 i=0
150 i=0
151 for x in range(0,module_number-1):
151 for x in range(0,module_number-1):
152 j=j+1
152 j=j+1
153 if j==8:
153 if j==8:
154 i=i+1
154 i=i+1
155 j=0
155 j=0
156
156
157 pos = [i,j]
157 pos = [i,j]
158 return pos
158 return pos
159
159
160
160
161 def fromBinary2Char(binary_string):
161 def fromBinary2Char(binary_string):
162 number = int(binary_string, 2)
162 number = int(binary_string, 2)
163 #Plus 33 to avoid more than 1 characters values such as: '\x01'-'\x1f'
163 #Plus 33 to avoid more than 1 characters values such as: '\x01'-'\x1f'
164 number = number + 33
164 number = number + 33
165 char = chr(number)
165 char = chr(number)
166 return char
166 return char
167
167
168 def fromChar2Binary(char):
168 def fromChar2Binary(char):
169 number = ord(char) - 33
169 number = ord(char) - 33
170 #Minus 33 to get the real value
170 #Minus 33 to get the real value
171 bits = bin(number)[2:]
171 bits = bin(number)[2:]
172 #To ensure we have a string with 6bits
172 #To ensure we have a string with 6bits
173 if len(bits) < 6:
173 if len(bits) < 6:
174 bits = bits.zfill(6)
174 bits = bits.zfill(6)
175 return bits
175 return bits
176
176
177
177
178 class ABSConfiguration(Configuration):
178 class ABSConfiguration(Configuration):
179 active_beam = models.CharField(verbose_name='Active Beam', max_length=20000, default="{}")
179 active_beam = models.CharField(verbose_name='Active Beam', max_length=20000, default="{}")
180 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default))
180 module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default))
181
181
182 class Meta:
182 class Meta:
183 db_table = 'abs_configurations'
183 db_table = 'abs_configurations'
184
184
185 def get_absolute_url_plot(self):
185 def get_absolute_url_plot(self):
186 return reverse('url_plot_abs_patterns', args=[str(self.id)])
186 return reverse('url_plot_abs_patterns', args=[str(self.id)])
187
187
188
188
189 def parms_to_dict(self):
189 def parms_to_dict(self):
190
190
191 parameters = {}
191 parameters = {}
192
192
193 parameters['device_id'] = self.device.id
193 parameters['device_id'] = self.device.id
194 parameters['name'] = self.name
194 parameters['name'] = self.name
195 parameters['beams'] = {}
195 parameters['beams'] = {}
196
196
197 beams = ABSBeam.objects.get(pk=self.id)
197 beams = ABSBeam.objects.get(pk=self.id)
198 b=1
198 b=1
199 for beam in beams:
199 for beam in beams:
200 #absbeam = ABSBeam.objects.get(pk=beams[beam])
200 #absbeam = ABSBeam.objects.get(pk=beams[beam])
201 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
201 parameters['beams']['beam'+str(b)] = beam.parms_to_dict()#absbeam.parms_to_dict()
202 b+=1
202 b+=1
203
203
204 return parameters
204 return parameters
205
205
206 def get_beams(self, **kwargs):
206 def get_beams(self, **kwargs):
207 '''
207 '''
208 This function returns ABS Configuration beams
208 This function returns ABS Configuration beams
209 '''
209 '''
210 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
210 return ABSBeam.objects.filter(abs_conf=self.pk, **kwargs)
211
211
212 def clone(self, **kwargs):
212 def clone(self, **kwargs):
213
213
214 beams = self.get_beams()
214 beams = self.get_beams()
215 self.pk = None
215 self.pk = None
216 self.id = None
216 self.id = None
217 for attr, value in kwargs.items():
217 for attr, value in kwargs.items():
218 setattr(self, attr, value)
218 setattr(self, attr, value)
219 self.save()
219 self.save()
220
220
221 for beam in beams:
221 for beam in beams:
222 beam.clone(abs_conf=self)
222 beam.clone(abs_conf=self)
223
223
224 return self
224 return self
225
225
226
226
227 def module_conf(self, module_num, beams):
227 def module_conf(self, module_num, beams):
228 """
228 """
229 This function creates beam configurations for one abs module.
229 This function creates beam configurations for one abs module.
230 """
230 """
231 ip_address = self.device.ip_address
231 ip_address = self.device.ip_address
232 ip_address = ip_address.split('.')
232 ip_address = ip_address.split('.')
233 module_seq = (ip_address[0],ip_address[1],ip_address[2])
233 module_seq = (ip_address[0],ip_address[1],ip_address[2])
234 dot = '.'
234 dot = '.'
235 module_ip = dot.join(module_seq)+'.'+str(module_num)
235 module_ip = dot.join(module_seq)+'.'+str(module_num)
236 module_port = self.device.port_address
236 module_port = self.device.port_address
237 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
237 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
238
238
239 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
239 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
240 module = 'ABS_'+str(module_num)
240 module = 'ABS_'+str(module_num)
241 bs = '' #{}
241 bs = '' #{}
242 i=1
242 i=1
243 #beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
243 #beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
244 # 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
244 # 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
245 for beam in beams:
245 for beam in beams:
246 #bs[i] = fromBinary2Char(beam.module_6bits(module_num))
246 #bs[i] = fromBinary2Char(beam.module_6bits(module_num))
247 bs = bs + fromBinary2Char(beam.module_6bits(module_num))
247 bs = bs + fromBinary2Char(beam.module_6bits(module_num))
248 i=i+1
248 i=i+1
249
249
250 beams = bs
250 beams = bs
251
251
252 parameters = {}
252 parameters = {}
253 parameters['header'] = header
253 parameters['header'] = header
254 parameters['module'] = module
254 parameters['module'] = module
255 parameters['beams'] = beams #json.dumps(beams)
255 parameters['beams'] = beams #json.dumps(beams)
256 print parameters['beams']
256 print parameters['beams']
257 answer = ''
257 answer = ''
258
258
259 try:
259 try:
260 r_write = requests.post(write_route, parameters, timeout=0.5)
260 r_write = requests.post(write_route, parameters, timeout=0.5)
261 answer = r_write.json()
261 answer = r_write.json()
262 self.message = answer['message']
262 self.message = answer['message']
263 except:
263 except:
264 self.message = "Could not write ABS parameters"
264 self.message = "Could not write ABS parameters"
265 return 0
265 return 0
266 return 1
266 return 1
267
267
268 def read_module(self, module):
268 def read_module(self, module):
269
269
270 """
270 """
271 Read out-bits (up-down) of 1 abs module NOT for Configuration
271 Read out-bits (up-down) of 1 abs module NOT for Configuration
272 """
272 """
273
273
274 parameters = {}
274 parameters = {}
275 ip_address = self.device.ip_address
275 ip_address = self.device.ip_address
276 ip_address = ip_address.split('.')
276 ip_address = ip_address.split('.')
277 module_seq = (ip_address[0],ip_address[1],ip_address[2])
277 module_seq = (ip_address[0],ip_address[1],ip_address[2])
278 dot = '.'
278 dot = '.'
279 module_ip = dot.join(module_seq)+'.'+str(module)
279 module_ip = dot.join(module_seq)+'.'+str(module)
280 module_port = self.device.port_address
280 module_port = self.device.port_address
281 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
281 read_route = 'http://'+module_ip+':'+str(module_port)+'/read'
282
282
283 print(read_route)
283 print(read_route)
284
284
285 answer = ''
285 answer = ''
286 module_bits = ''
286 module_bits = ''
287
287
288 try:
288 try:
289 r_write = requests.get(read_route, timeout=0.7)
289 r_write = requests.get(read_route, timeout=0.7)
290 answer = r_write.json()
290 answer = r_write.json()
291 self.message = answer['message']
291 self.message = answer['message']
292 module_bits = answer['allbits']
292 module_bits = answer['allbits']
293 except:
293 except:
294 #message = "Could not read ABS parameters"
294 #message = "Could not read ABS parameters"
295 return 0
295 return 0
296
296
297 return module_bits
297 return module_bits
298
298
299 def status_device(self):
299 def status_device(self):
300 """
300 """
301 This function gets the status of each abs module. It sends GET method to Web Application
301 This function gets the status of each abs module. It sends GET method to Web Application
302 in Python Bottle.
302 in Python Bottle.
303 """
303 """
304 ip_address = self.device.ip_address
304 ip_address = self.device.ip_address
305 ip_address = ip_address.split('.')
305 ip_address = ip_address.split('.')
306 module_seq = (ip_address[0],ip_address[1],ip_address[2])
306 module_seq = (ip_address[0],ip_address[1],ip_address[2])
307 dot = '.'
307 dot = '.'
308 module_port = self.device.port_address
308 module_port = self.device.port_address
309
309
310 modules_status = json.loads(self.module_status)
310 modules_status = json.loads(self.module_status)
311
311
312 for i in range(1,65):
312 for i in range(1,65):
313 module_ip = dot.join(module_seq)+'.'+str(i)
313 module_ip = dot.join(module_seq)+'.'+str(i)
314 print module_ip
314 print module_ip
315
315
316 route = 'http://'+module_ip+':'+str(module_port)+'/hello'
316 route = 'http://'+module_ip+':'+str(module_port)+'/hello'
317
317
318 try:
318 try:
319 r = requests.get(route, timeout=0.7)
319 r = requests.get(route, timeout=0.7)
320 modules_status[str(i)] = 1
320 modules_status[str(i)] = 1
321 except:
321 except:
322 modules_status[str(i)] = 0
322 modules_status[str(i)] = 0
323 pass
323 pass
324
324
325 self.message = 'ABS modules Status have been updated.'
325 self.message = 'ABS modules Status have been updated.'
326 self.module_status=json.dumps(modules_status)
326 self.module_status=json.dumps(modules_status)
327 self.save()
327 self.save()
328
328
329 return
329 return
330
330
331
331
332 def write_device(self):
332 def write_device(self):
333 """
333 """
334 This function sends the beams list to every abs module.
334 This function sends the beams list to every abs module.
335 It needs 'module_conf' function
335 It needs 'module_conf' function
336 """
336 """
337
337
338 ###beams_list = ast.literal_eval(self.beams)
338 ###beams_list = ast.literal_eval(self.beams)
339 ###beams = []
339 ###beams = []
340 beams = ABSBeam.objects.filter(abs_conf=self)
340 beams = ABSBeam.objects.filter(abs_conf=self)
341 ###for bl in range(1,len(beams_list)+1):
341 ###for bl in range(1,len(beams_list)+1):
342 ### b = ABSBeam.objects.get(pk=beams_list['beam'+str(bl)])
342 ### b = ABSBeam.objects.get(pk=beams_list['beam'+str(bl)])
343 ### beams.append(b)
343 ### beams.append(b)
344
344
345 #---Write each abs module---
345 #---Write each abs module---
346 if beams:
346 if beams:
347 beams_status = ast.literal_eval(self.module_status)
347 beams_status = ast.literal_eval(self.module_status)
348 for i in range(62,65): #(62,65)
348 for i in range(62,65): #(62,65)
349 try:
349 try:
350 answer = self.module_conf(i, beams)
350 answer = self.module_conf(i, beams)
351 beams_status[str(i)] = 1
351 beams_status[str(i)] = 1
352 self.module_status = json.dumps(beams_status)
352 self.module_status = json.dumps(beams_status)
353 self.save()
353 self.save()
354 #self.module_conf(63,beams)
354 #self.module_conf(63,beams)
355 #beams_status[str(63)] = 1
355 #beams_status[str(63)] = 1
356 #self.module_status = json.dumps(beams_status)
356 #self.module_status = json.dumps(beams_status)
357 except:
357 except:
358 beams_status[str(i)] = 0
358 beams_status[str(i)] = 0
359 self.module_status = json.dumps(beams_status)
359 self.module_status = json.dumps(beams_status)
360 self.save()
360 self.save()
361 answer = 0
361 answer = 0
362 return 0
362 return 0
363 else:
363 else:
364 self.message = "ABS Configuration does not have beams"
364 self.message = "ABS Configuration does not have beams"
365 return 0
365 return 0
366
366
367 #self.device.status = 1
367 #self.device.status = 1
368 ##
368 ##
369 if answer==1:
369 if answer==1:
370 self.message = "ABS Beams List have been sent to ABS Modules"
370 self.message = "ABS Beams List have been sent to ABS Modules"
371 else:
371 else:
372 self.message = "Could not read ABS parameters"
372 self.message = "Could not read ABS parameters"
373
373
374 ##
374 ##
375 self.save()
375 self.save()
376 return 1
376 return 1
377
377
378
378
379 def write_module(self, module):
379 def write_module(self, module):
380
380
381 """
381 """
382 Send configuration to one abs module
382 Send configuration to one abs module
383 """
383 """
384
384
385 parameters = {}
385 parameters = {}
386 ip_address = self.abs_conf.device.ip_address
386 ip_address = self.abs_conf.device.ip_address
387 ip_address = ip_address.split('.')
387 ip_address = ip_address.split('.')
388 module_seq = (ip_address[0],ip_address[1],ip_address[2])
388 module_seq = (ip_address[0],ip_address[1],ip_address[2])
389 dot = '.'
389 dot = '.'
390 module_ip = dot.join(module_seq)+'.'+str(module)
390 module_ip = dot.join(module_seq)+'.'+str(module)
391 module_port = self.abs_conf.device.port_address
391 module_port = self.abs_conf.device.port_address
392 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
392 write_route = 'http://'+module_ip+':'+str(module_port)+'/configure'
393
393
394 #print write_route
394 #print write_route
395
395
396 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
396 header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1'
397 module = 'ABS_'+str(module)
397 module = 'ABS_'+str(module)
398 beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
398 beams = {1: '001000', 2: '010001', 3: '010010', 4: '000011', 5: '101100', 6: '101101',
399 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
399 7: '110110', 8: '111111', 9: '000000', 10: '001001', 11: '010010', 12: '011011'}
400
400
401 parameters['header'] = header
401 parameters['header'] = header
402 parameters['module'] = module
402 parameters['module'] = module
403 parameters['beams'] = json.dumps(beams)
403 parameters['beams'] = json.dumps(beams)
404
404
405 answer = ''
405 answer = ''
406
406
407 try:
407 try:
408 r_write = requests.post(write_route, parameters, timeout=0.5)
408 r_write = requests.post(write_route, parameters, timeout=0.5)
409 answer = r_write.json()
409 answer = r_write.json()
410 self.message = answer['message']
410 self.message = answer['message']
411 except:
411 except:
412 self.message = "Could not write ABS parameters"
412 self.message = "Could not write ABS parameters"
413 return 0
413 return 0
414
414
415
415
416 #self.device.status = int(answer['status'])
416 #self.device.status = int(answer['status'])
417
417
418 return 1
418 return 1
419
419
420
420
421 def beam_selector(self, module, beam_pos):
421 def beam_selector(self, module, beam_pos):
422 """
422 """
423 This function selects the beam number for one absmodule.
423 This function selects the beam number for one absmodule.
424 """
424 """
425
425
426 if beam_pos > 0:
426 if beam_pos > 0:
427 beam_pos = beam_pos - 1
427 beam_pos = beam_pos - 1
428 else:
428 else:
429 beam_pos = 0
429 beam_pos = 0
430
430
431 #El indice del apunte debe ser menor que el numero total de apuntes
431 #El indice del apunte debe ser menor que el numero total de apuntes
432 #El servidor tcp en el embebido comienza a contar desde 0
432 #El servidor tcp en el embebido comienza a contar desde 0
433 beams_list = ABSBeam.objects.filter(abs_conf=self)
433 beams_list = ABSBeam.objects.filter(abs_conf=self)
434 if len(beams_list) < beam_pos:
434 if len(beams_list) < beam_pos:
435 return 0
435 return 0
436
436
437 flag = 1
437 flag = 1
438 if beam_pos>9:
438 if beam_pos>9:
439 flag = 2
439 flag = 2
440
440
441 module_address = ('192.168.1.'+str(module), 5500)
441 module_address = ('192.168.1.'+str(module), 5500)
442 header = 'JROABSCeCnModCnMod0100000'
442 header = 'JROABSCeCnModCnMod0100000'
443 numbers = len(str(beam_pos))
443 numbers = len(str(beam_pos))
444 function = 'CHGB'
444 function = 'CHGB'
445
445
446 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
446 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
447
447
448 # Create the datagram socket
448 # Create the datagram socket
449 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
449 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
450 #sock.connect(module_address)
450 #sock.connect(module_address)
451 try:
451 try:
452 sock.connect(module_address)
452 sock.connect(module_address)
453 sock.send(message_tx)
453 sock.send(message_tx)
454 sock.close()
454 sock.close()
455 print("Writing abs module:"+module_address[0]+"...")
455 print("Writing abs module:"+module_address[0]+"...")
456 except:
456 except:
457 sock = None
457 sock = None
458 print("Problem writing abs module:"+module_address[0])
458 print("Problem writing abs module:"+module_address[0])
459 return 0
459 return 0
460
460
461 return 1
461 return 1
462
462
463
463
464 def change_beam(self, beam_pos):
464 def change_beam(self, beam_pos):
465 """
465 """
466 This function selects the beam number for all absmodules.
466 This function selects the beam number for all absmodules.
467 """
467 """
468 for i in range(1,65):
468 for i in range(1,65):
469 try:
469 try:
470 self.beam_selector(i,beam_pos)
470 self.beam_selector(i,beam_pos)
471 except:
471 except:
472 print("Problem with module: 192.168.1."+str(i))
472 print("Problem with module: 192.168.1."+str(i))
473 self.message = "Problem with module: 192.168.1."+str(i)
473 self.message = "Problem with module: 192.168.1."+str(i)
474 #return 0
474 #return 0
475 return 1
475 return 1
476
476
477
477
478 def send_beam_num(self, beam_pos):
478 def send_beam_num(self, beam_pos):
479 """
479 """
480 This function connects to a multicast group and sends the beam number
480 This function connects to a multicast group and sends the beam number
481 to all abs modules.
481 to all abs modules.
482 """
482 """
483
483
484 if beam_pos > 0:
484 if beam_pos > 0:
485 beam_pos = beam_pos - 1
485 beam_pos = beam_pos - 1
486 else:
486 else:
487 beam_pos = 0
487 beam_pos = 0
488
488
489 #El indice del apunte debe ser menor que el numero total de apuntes
489 #El indice del apunte debe ser menor que el numero total de apuntes
490 #El servidor tcp en el embebido comienza a contar desde 0
490 #El servidor tcp en el embebido comienza a contar desde 0
491 beams_list = ABSBeam.objects.filter(abs_conf=self)
491 beams_list = ABSBeam.objects.filter(abs_conf=self)
492 if len(beams_list) < beam_pos:
492 if len(beams_list) < beam_pos:
493 return 0
493 return 0
494
494
495 flag = 1
495 flag = 1
496 if beam_pos>9:
496 if beam_pos>9:
497 flag = 2
497 flag = 2
498
498
499 header = 'JROABSCeCnModCnMod0100000'
499 header = 'JROABSCeCnModCnMod0100000'
500 flag = str(flag)
500 flag = str(flag)
501 function = 'CHGB'
501 function = 'CHGB'
502 message_tx = header+flag+function+str(beam_pos)+'0'
502 message_tx = header+flag+function+str(beam_pos)+'0'
503
503
504 multicast_group = '224.3.29.71'
504 multicast_group = '224.3.29.71'
505 server_address = ('',10000)
505 server_address = ('',10000)
506
506
507 # Create the socket
507 # Create the socket
508 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
508 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
509 # Bind to the server address
509 # Bind to the server address
510 sock.bind(server_address)
510 sock.bind(server_address)
511 # Telling the OS add the socket to the multicast on all interfaces
511 # Telling the OS add the socket to the multicast on all interfaces
512 group = socket.inet_aton(multicast_group)
512 group = socket.inet_aton(multicast_group)
513 mreq = struct.pack('4sL', group, socket.INADDR_ANY)
513 mreq = struct.pack('4sL', group, socket.INADDR_ANY)
514 sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
514 sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
515
515
516 #print 'sending acknowledgement to all: \n' + message_tx
516 #print 'sending acknowledgement to all: \n' + message_tx
517 sock.sendto(message_tx, (multicast_group, 10000))
517 sock.sendto(message_tx, (multicast_group, 10000))
518 sock.close()
518 sock.close()
519 sock = None
519 sock = None
520
520
521 return 1
521 return 1
522
522
523 def test1(self):
523 def test1(self):
524 t1 = time.time()
524 t1 = time.time()
525 t2 = 0
525 t2 = 0
526 while (t2-t1)<100:#300
526 while (t2-t1)<100:#300
527 t2 = time.time()
527 t2 = time.time()
528 self.send_beam_num(2)
528 self.send_beam_num(2)
529 time.sleep(0.04)
529 time.sleep(0.04)
530 self.send_beam_num(1)
530 self.send_beam_num(1)
531 time.sleep(0.04)
531 time.sleep(0.04)
532 return
532 return
533
533
534 def change_procs_test1(self, module):
534 def change_procs_test1(self, module):
535
535
536 for i in range (1,300):#300
536 for i in range (1,300):#300
537 beam_pos = 1
537 beam_pos = 1
538 module_address = ('192.168.1.'+str(module), 5500)
538 module_address = ('192.168.1.'+str(module), 5500)
539 header = 'JROABSCeCnModCnMod0100000'
539 header = 'JROABSCeCnModCnMod0100000'
540 numbers = len(str(beam_pos))
540 numbers = len(str(beam_pos))
541 function = 'CHGB'
541 function = 'CHGB'
542
542
543 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
543 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
544
544
545 # Create the datagram socket
545 # Create the datagram socket
546 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
546 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
547 sock.connect(module_address)
547 sock.connect(module_address)
548
548
549 sock.send(message_tx)
549 sock.send(message_tx)
550 #t = sock.recv(1024)
550 #t = sock.recv(1024)
551 sock.close()
551 sock.close()
552 sock = None
552 sock = None
553
553
554
554
555 time.sleep(0.04)
555 time.sleep(0.04)
556
556
557
557
558 beam_pos = 0
558 beam_pos = 0
559 numbers = len(str(beam_pos))
559 numbers = len(str(beam_pos))
560
560
561 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
561 message_tx = header+str(numbers)+function+str(beam_pos)+'0'
562
562
563 # Create the datagram socket
563 # Create the datagram socket
564 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
564 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
565 sock.connect(module_address)
565 sock.connect(module_address)
566 sock.send(message_tx)
566 sock.send(message_tx)
567 sock.close()
567 sock.close()
568 sock = None
568 sock = None
569
569
570 time.sleep(0.04)
570 time.sleep(0.04)
571
571
572
572
573 def multi_procs_test1(self):
573 def multi_procs_test1(self):
574
574
575 """
575 """
576 This function sends the beam number to all abs modules using multiprocessing.
576 This function sends the beam number to all abs modules using multiprocessing.
577 """
577 """
578
578
579 #if __name__ == "__main__":
579 #if __name__ == "__main__":
580 size = 10000000 # Number of random numbers to add
580 size = 10000000 # Number of random numbers to add
581 procs = 65 # (Number-1) of processes to create (absmodule)
581 procs = 65 # (Number-1) of processes to create (absmodule)
582
582
583 # Create a list of jobs and then iterate through
583 # Create a list of jobs and then iterate through
584 # the number of processes appending each process to
584 # the number of processes appending each process to
585 # the job list
585 # the job list
586 jobs = []
586 jobs = []
587 for i in range(1, procs):
587 for i in range(1, procs):
588
588
589 process = multiprocessing.Process(target=self.change_procs_test1,args=(i,))
589 process = multiprocessing.Process(target=self.change_procs_test1,args=(i,))
590 jobs.append(process)
590 jobs.append(process)
591 #print jobs
591 #print jobs
592
592
593 # Start the processes (i.e. calculate the random number lists)
593 # Start the processes (i.e. calculate the random number lists)
594 for j in jobs:
594 for j in jobs:
595 #time.sleep(0.4)
595 #time.sleep(0.4)
596 #print j
596 #print j
597 j.start()
597 j.start()
598
598
599 # Ensure all of the processes have finished
599 # Ensure all of the processes have finished
600 for j in jobs:
600 for j in jobs:
601 j.join()
601 j.join()
602
602
603 print("List processing complete.")
603 print("List processing complete.")
604 return 1
604 return 1
605
605
606
606
607
607
608 def multi_procs_test2(self):
608 def multi_procs_test2(self):
609 """
609 """
610 This function use multiprocessing python library. Importing Pool we can select
610 This function use multiprocessing python library. Importing Pool we can select
611 the number of cores we want to use
611 the number of cores we want to use
612 After 'nproc' linux command, we know how many cores computer has.
612 After 'nproc' linux command, we know how many cores computer has.
613 NOT WORKING
613 NOT WORKING
614 """
614 """
615 import multiprocessing
615 import multiprocessing
616 pool = multiprocessing.Pool(3) # cores
616 pool = multiprocessing.Pool(3) # cores
617
617
618 tasks = []
618 tasks = []
619 procs = 65
619 procs = 65
620 for i in range(62, procs):
620 for i in range(62, procs):
621 tasks.append( (i,))
621 tasks.append( (i,))
622 #print tasks
622 #print tasks
623 #pool.apply_async(self.change_procs_test1, 62)
623 #pool.apply_async(self.change_procs_test1, 62)
624 results = [pool.apply( self.change_procs_test1, t ) for t in tasks]
624 results = [pool.apply( self.change_procs_test1, t ) for t in tasks]
625 #for result in results:
625 #for result in results:
626 #result.get()
626 #result.get()
627 #(plotNum, plotFilename) = result.get()
627 #(plotNum, plotFilename) = result.get()
628 #print("Result: plot %d written to %s" % (plotNum, plotFilename) )
628 #print("Result: plot %d written to %s" % (plotNum, plotFilename) )
629
629
630 return 1
630 return 1
631
631
632
632
633 def multi_procs_test3(self):
633 def multi_procs_test3(self):
634 """
634 """
635 This function use multiprocessing python library. Importing Pool we can select
635 This function use multiprocessing python library. Importing Pool we can select
636 the number of cores we want to use
636 the number of cores we want to use
637 After 'nproc' linux command, we know how many cores computer has.
637 After 'nproc' linux command, we know how many cores computer has.
638 """
638 """
639 from multiprocessing import Pool
639 from multiprocessing import Pool
640 import time
640 import time
641
641
642 def f(x):
642 def f(x):
643 return x*x
643 return x*x
644
644
645 tasks = []
645 tasks = []
646 procs = 65
646 procs = 65
647 pool = Pool(processes=4)
647 pool = Pool(processes=4)
648
648
649 #for i in range(62, procs):
649 #for i in range(62, procs):
650 #result = pool.map(f, range(62,65))
650 #result = pool.map(f, range(62,65))
651 it = pool.imap(self.change_procs_test1, range(62,65))
651 it = pool.imap(self.change_procs_test1, range(62,65))
652 #result.get(timeout=5)
652 #result.get(timeout=5)
653
653
654 return 1
654 return 1
655
655
656
656
657 def f(x):
657 def f(x):
658 print x
658 print x
659 return
659 return
660
660
661 def multi_procs_test4(self):
661 def multi_procs_test4(self):
662 import multiprocessing as mp
662 import multiprocessing as mp
663
663
664
664
665 num_workers = mp.cpu_count()
665 num_workers = mp.cpu_count()
666
666
667 pool = mp.Pool(num_workers)
667 pool = mp.Pool(num_workers)
668 procs = 65
668 procs = 65
669 for i in range(62, procs):
669 for i in range(62, procs):
670 #for task in tasks:
670 #for task in tasks:
671 pool.apply_async(self.f, args = (i,))
671 pool.apply_async(self.f, args = (i,))
672
672
673 pool.close()
673 pool.close()
674 pool.join()
674 pool.join()
675
675
676 return 1
676 return 1
677
677
678
678
679
679
680
680
681 class ABSBeam(models.Model):
681 class ABSBeam(models.Model):
682
682
683 name = models.CharField(max_length=60, default='Beam')
683 name = models.CharField(max_length=60, default='Beam')
684 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
684 antenna = models.CharField(verbose_name='Antenna', max_length=1000, default=antenna_default)
685 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
685 abs_conf = models.ForeignKey(ABSConfiguration, null=True, verbose_name='ABS Configuration')
686 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
686 tx = models.CharField(verbose_name='Tx', max_length=1000, default=tx_default)
687 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
687 rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default)
688 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
688 s_time = models.TimeField(verbose_name='Star Time', default='00:00:00')
689 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
689 e_time = models.TimeField(verbose_name='End Time', default='23:59:59')
690 modules_conf = models.CharField(verbose_name='Modules', max_length=2000, default=json.dumps(conf_default))
690 modules_conf = models.CharField(verbose_name='Modules', max_length=2000, default=json.dumps(conf_default))
691 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
691 ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default)
692 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
692 only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default)
693
693
694 class Meta:
694 class Meta:
695 db_table = 'abs_beams'
695 db_table = 'abs_beams'
696
696
697 def __unicode__(self):
697 def __unicode__(self):
698 return u'%s' % (self.name)
698 return u'%s' % (self.name)
699
699
700 def parms_to_dict(self):
700 def parms_to_dict(self):
701
701
702 #Update data
702 #Update data
703 self.modules_6bits()
703 self.modules_6bits()
704
704
705 parameters = {}
705 parameters = {}
706
706
707 parameters['name'] = self.name
707 parameters['name'] = self.name
708 parameters['antenna'] = ast.literal_eval(self.antenna)
708 parameters['antenna'] = ast.literal_eval(self.antenna)
709 parameters['abs_conf'] = self.abs_conf.name
709 parameters['abs_conf'] = self.abs_conf.name
710 parameters['tx'] = ast.literal_eval(self.tx)
710 parameters['tx'] = ast.literal_eval(self.tx)
711 parameters['rx'] = ast.literal_eval(self.rx)
711 parameters['rx'] = ast.literal_eval(self.rx)
712 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
712 parameters['s_time'] = self.s_time.strftime("%H:%M:%S")
713 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
713 parameters['e_time'] = self.e_time.strftime("%H:%M:%S")
714 parameters['configuration'] = ast.literal_eval(self.modules_conf)
714 parameters['configuration'] = ast.literal_eval(self.modules_conf)
715 parameters['ues'] = ast.literal_eval(self.ues)
715 parameters['ues'] = ast.literal_eval(self.ues)
716 parameters['only_rx'] = json.loads(self.only_rx)
716 parameters['only_rx'] = json.loads(self.only_rx)
717
717
718 return parameters
718 return parameters
719
719
720 def dict_to_parms(self, parameters):
720 def dict_to_parms(self, parameters):
721
721
722 self.name = parameters['name']
722 self.name = parameters['name']
723 self.antenna = json.dumps(parameters['antenna'])
723 self.antenna = json.dumps(parameters['antenna'])
724 #self.abs_conf = parameters['abs_conf']
724 #self.abs_conf = parameters['abs_conf']
725 self.tx = json.dumps(parameters['tx'])
725 self.tx = json.dumps(parameters['tx'])
726 self.rx = json.dumps(parameters['rx'])
726 self.rx = json.dumps(parameters['rx'])
727 #parameters['s_time']
727 #parameters['s_time']
728 #parameters['e_time']
728 #parameters['e_time']
729 self.ues = json.dumps(parameters['ues'])
729 self.ues = json.dumps(parameters['ues'])
730 self.only_rx = json.dumps(parameters['only_rx'])
730 self.only_rx = json.dumps(parameters['only_rx'])
731
731
732 self.modules_6bits()
732 self.modules_6bits()
733 self.save()
733 self.save()
734
734
735 return parameters
735 return parameters
736
736
737 def clone(self, **kwargs):
737 def clone(self, **kwargs):
738
738
739 self.pk = None
739 self.pk = None
740 self.id = None
740 self.id = None
741 for attr, value in kwargs.items():
741 for attr, value in kwargs.items():
742 setattr(self, attr, value)
742 setattr(self, attr, value)
743
743
744 self.save()
744 self.save()
745
745
746 return self
746 return self
747
747
748 def set_activebeam(self):
749 """
750 This function change de active beam of ABS Configuration
751 """
752 conf = self.abs_conf
753 active_beam = {}
754 active_beam['active_beam'] = self.id
755 conf.active_beam = json.dumps(active_beam)
756 conf.save()
757
758 return
759
748
760
749
761
750 def module_6bits(self, module):
762 def module_6bits(self, module):
751 """
763 """
752 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
764 This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module
753 """
765 """
754 if module > 64:
766 if module > 64:
755 beam_bits = ""
767 beam_bits = ""
756 return beam_bits
768 return beam_bits
757
769
758 data = ast.literal_eval(self.antenna)
770 data = ast.literal_eval(self.antenna)
759 up_data = data['antenna_up']
771 up_data = data['antenna_up']
760 down_data = data['antenna_down']
772 down_data = data['antenna_down']
761
773
762 pos = ip2position(module)
774 pos = ip2position(module)
763 up_value = up_data[pos[0]][pos[1]]
775 up_value = up_data[pos[0]][pos[1]]
764 down_value = down_data[pos[0]][pos[1]]
776 down_value = down_data[pos[0]][pos[1]]
765
777
766 up_bits = up_conv_bits(up_value)
778 up_bits = up_conv_bits(up_value)
767 down_bits = down_conv_bits(down_value)
779 down_bits = down_conv_bits(down_value)
768 beam_bits = up_bits+down_bits
780 beam_bits = up_bits+down_bits
769
781
770 return beam_bits
782 return beam_bits
771
783
772 def modules_6bits(self):
784 def modules_6bits(self):
773 """
785 """
774 This function returns 6bits from every abs module (1-64) in a dict
786 This function returns 6bits from every abs module (1-64) in a dict
775 """
787 """
776 modules_configuration = ast.literal_eval(self.modules_conf)
788 modules_configuration = ast.literal_eval(self.modules_conf)
777
789
778 for i in range(1,65):
790 for i in range(1,65):
779 modules_configuration[str(i)] = self.module_6bits(i)
791 modules_configuration[str(i)] = self.module_6bits(i)
780
792
781 self.modules_conf = json.dumps(modules_configuration)
793 self.modules_conf = json.dumps(modules_configuration)
782 self.save()
794 self.save()
783
795
784 return self.modules_conf
796 return self.modules_conf
785
797
786
798
787 def active_beam(self):
799 def active_beam(self):
788 """
800 """
789 This function set this beam as the active beam of its ABS Configuration.
801 This function set this beam as the active beam of its ABS Configuration.
790 """
802 """
791 self.abs_conf.active_beam = json.dumps({'active_beam': self.id})
803 self.abs_conf.active_beam = json.dumps({'active_beam': self.id})
792 self.abs_conf.save()
804 self.abs_conf.save()
793 return
805 return
794
806
795 @property
807 @property
796 def get_upvalues(self):
808 def get_upvalues(self):
797 """
809 """
798 This function reads antenna pattern and show the up-value of one abs module
810 This function reads antenna pattern and show the up-value of one abs module
799 """
811 """
800
812
801 data = ast.literal_eval(self.antenna)
813 data = ast.literal_eval(self.antenna)
802 up_data = data['antenna_up']
814 up_data = data['antenna_up']
803
815
804 up_values = []
816 up_values = []
805 for data in up_data:
817 for data in up_data:
806 for i in range(0,8):
818 for i in range(0,8):
807 up_values.append(data[i])
819 up_values.append(data[i])
808
820
809 return up_values
821 return up_values
810
822
811 @property
823 @property
812 def antenna_upvalues(self):
824 def antenna_upvalues(self):
813 """
825 """
814 This function reads antenna pattern and show the up - values of one abs beam
826 This function reads antenna pattern and show the up - values of one abs beam
815 in a particular order
827 in a particular order
816 """
828 """
817 data = ast.literal_eval(self.antenna)
829 data = ast.literal_eval(self.antenna)
818 up_data = data['antenna_up']
830 up_data = data['antenna_up']
819
831
820 return up_data
832 return up_data
821
833
822 @property
834 @property
823 def antenna_downvalues(self):
835 def antenna_downvalues(self):
824 """
836 """
825 This function reads antenna pattern and show the down - values of one abs beam
837 This function reads antenna pattern and show the down - values of one abs beam
826 in a particular order
838 in a particular order
827 """
839 """
828 data = ast.literal_eval(self.antenna)
840 data = ast.literal_eval(self.antenna)
829 down_data = data['antenna_down']
841 down_data = data['antenna_down']
830
842
831 return down_data
843 return down_data
832
844
833 @property
845 @property
834 def get_downvalues(self):
846 def get_downvalues(self):
835 """
847 """
836 This function reads antenna pattern and show the down-value of one abs module
848 This function reads antenna pattern and show the down-value of one abs module
837 """
849 """
838
850
839 data = ast.literal_eval(self.antenna)
851 data = ast.literal_eval(self.antenna)
840 down_data = data['antenna_down']
852 down_data = data['antenna_down']
841
853
842 down_values = []
854 down_values = []
843 for data in down_data:
855 for data in down_data:
844 for i in range(0,8):
856 for i in range(0,8):
845 down_values.append(data[i])
857 down_values.append(data[i])
846
858
847 return down_values
859 return down_values
848
860
849 @property
861 @property
850 def get_up_ues(self):
862 def get_up_ues(self):
851 """
863 """
852 This function shows the up-ues-value of one beam
864 This function shows the up-ues-value of one beam
853 """
865 """
854 data = ast.literal_eval(self.ues)
866 data = ast.literal_eval(self.ues)
855 up_ues = data['up']
867 up_ues = data['up']
856
868
857 return up_ues
869 return up_ues
858
870
859 @property
871 @property
860 def get_down_ues(self):
872 def get_down_ues(self):
861 """
873 """
862 This function shows the down-ues-value of one beam
874 This function shows the down-ues-value of one beam
863 """
875 """
864 data = ast.literal_eval(self.ues)
876 data = ast.literal_eval(self.ues)
865 down_ues = data['down']
877 down_ues = data['down']
866
878
867 return down_ues
879 return down_ues
868
880
869 @property
881 @property
870 def get_up_onlyrx(self):
882 def get_up_onlyrx(self):
871 """
883 """
872 This function shows the up-onlyrx-value of one beam
884 This function shows the up-onlyrx-value of one beam
873 """
885 """
874 data = json.loads(self.only_rx)
886 data = json.loads(self.only_rx)
875 up_onlyrx = data['up']
887 up_onlyrx = data['up']
876
888
877 return up_onlyrx
889 return up_onlyrx
878
890
879 @property
891 @property
880 def get_down_onlyrx(self):
892 def get_down_onlyrx(self):
881 """
893 """
882 This function shows the down-onlyrx-value of one beam
894 This function shows the down-onlyrx-value of one beam
883 """
895 """
884 data = json.loads(self.only_rx)
896 data = json.loads(self.only_rx)
885 down_onlyrx = data['down']
897 down_onlyrx = data['down']
886
898
887 return down_onlyrx
899 return down_onlyrx
888
900
889 @property
901 @property
890 def get_tx(self):
902 def get_tx(self):
891 """
903 """
892 This function shows the tx-values of one beam
904 This function shows the tx-values of one beam
893 """
905 """
894 data = json.loads(self.tx)
906 data = json.loads(self.tx)
895
907
896 return data
908 return data
897
909
898 @property
910 @property
899 def get_uptx(self):
911 def get_uptx(self):
900 """
912 """
901 This function shows the up-tx-values of one beam
913 This function shows the up-tx-values of one beam
902 """
914 """
903 data = json.loads(self.tx)
915 data = json.loads(self.tx)
904 up_data = data['up']
916 up_data = data['up']
905
917
906 up_values = []
918 up_values = []
907 for data in up_data:
919 for data in up_data:
908 for i in range(0,8):
920 for i in range(0,8):
909 up_values.append(data[i])
921 up_values.append(data[i])
910
922
911 return up_values
923 return up_values
912
924
913 @property
925 @property
914 def get_downtx(self):
926 def get_downtx(self):
915 """
927 """
916 This function shows the down-tx-values of one beam
928 This function shows the down-tx-values of one beam
917 """
929 """
918 data = json.loads(self.tx)
930 data = json.loads(self.tx)
919 down_data = data['down']
931 down_data = data['down']
920
932
921 down_values = []
933 down_values = []
922 for data in down_data:
934 for data in down_data:
923 for i in range(0,8):
935 for i in range(0,8):
924 down_values.append(data[i])
936 down_values.append(data[i])
925
937
926 return down_values
938 return down_values
927
939
928
940
929
941
930 @property
942 @property
931 def get_rx(self):
943 def get_rx(self):
932 """
944 """
933 This function shows the rx-values of one beam
945 This function shows the rx-values of one beam
934 """
946 """
935 data = json.loads(self.rx)
947 data = json.loads(self.rx)
936
948
937 return data
949 return data
938
950
939 @property
951 @property
940 def get_uprx(self):
952 def get_uprx(self):
941 """
953 """
942 This function shows the up-rx-values of one beam
954 This function shows the up-rx-values of one beam
943 """
955 """
944 data = json.loads(self.rx)
956 data = json.loads(self.rx)
945 up_data = data['up']
957 up_data = data['up']
946
958
947 up_values = []
959 up_values = []
948 for data in up_data:
960 for data in up_data:
949 for i in range(0,8):
961 for i in range(0,8):
950 up_values.append(data[i])
962 up_values.append(data[i])
951
963
952 return up_values
964 return up_values
953
965
954 @property
966 @property
955 def get_downrx(self):
967 def get_downrx(self):
956 """
968 """
957 This function shows the down-rx-values of one beam
969 This function shows the down-rx-values of one beam
958 """
970 """
959 data = json.loads(self.rx)
971 data = json.loads(self.rx)
960 down_data = data['down']
972 down_data = data['down']
961
973
962 down_values = []
974 down_values = []
963 for data in down_data:
975 for data in down_data:
964 for i in range(0,8):
976 for i in range(0,8):
965 down_values.append(data[i])
977 down_values.append(data[i])
966
978
967 return down_values
979 return down_values
@@ -1,533 +1,538
1 {% extends "dev_conf.html" %}
1 {% extends "dev_conf.html" %}
2
2
3 {% block extra-menu-actions %}
3 {% block extra-menu-actions %}
4 <li><a href="{{ dev_conf.get_absolute_url_plot }}" target="_blank"><span class="glyphicon glyphicon-picture" aria-hidden="true"></span> View Patterns </a></li>
4 <li><a href="{{ dev_conf.get_absolute_url_plot }}" target="_blank"><span class="glyphicon glyphicon-picture" aria-hidden="true"></span> View Patterns </a></li>
5 <!--<li><a href="{{ dev_conf.get_absolute_url_write }}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span> Write</a></li>-->
5 <!--<li><a href="{{ dev_conf.get_absolute_url_write }}"><span class="glyphicon glyphicon-download" aria-hidden="true"></span> Write</a></li>-->
6 {% endblock %}
6 {% endblock %}
7
7
8 {% block extra-content %}
8 {% block extra-content %}
9 <style>
9 <style>
10
10
11 .abs {
11 .abs {
12 border: 2px solid #00334d;
12 border: 2px solid #00334d;
13 vertical-align: center;
13 vertical-align: center;
14 display: inline-block;
14 display: inline-block;
15 }
15 }
16 .abs tr:nth-child(1){
16 .abs tr:nth-child(1){
17 border-bottom: 1px dashed #00334d;
17 border-bottom: 1px dashed #00334d;
18 }
18 }
19 .abs tr{
19 .abs tr{
20 border-bottom: 0px solid #00334d;
20 border-bottom: 0px solid #00334d;
21 }
21 }
22 .abs td {
22 .abs td {
23 border-right: 1px dashed #00334d;
23 border-right: 1px dashed #00334d;
24 text-align: center;
24 text-align: center;
25 padding: 5px;
25 padding: 5px;
26 }
26 }
27
27
28
28
29 .legend {
29 .legend {
30 margin-left: 15px;
30 margin-left: 15px;
31 display: inline-block;
31 display: inline-block;
32 border: 2px solid #00334d;
32 border: 2px solid #00334d;
33 vertical-align: top;
33 vertical-align: top;
34 }
34 }
35 .legend th{
35 .legend th{
36 border-bottom: 1px dashed #00334d;
36 border-bottom: 1px dashed #00334d;
37 font-weight: bold;
37 font-weight: bold;
38 vertical-align: center;
38 vertical-align: center;
39 text-align: center;
39 text-align: center;
40 }
40 }
41 .legend td {
41 .legend td {
42 padding: 2px;
42 padding: 2px;
43 text-align: center;
43 text-align: center;
44 }
44 }
45
45
46
46
47 .north {
47 .north {
48 border: 2px solid #00334d;
48 border: 2px solid #00334d;
49 vertical-align: center;
49 vertical-align: center;
50 font-weight: bold;
50 font-weight: bold;
51 }
51 }
52 .north tr{
52 .north tr{
53 border: 1px solid #ffffff;
53 border: 1px solid #ffffff;
54
54
55 }
55 }
56 .north td{
56 .north td{
57 border: 2px solid #e2e2e7;
57 border: 2px solid #e2e2e7;
58 text-align: center;
58 text-align: center;
59 padding: 1px 15px 1px 15px;
59 padding: 1px 15px 1px 15px;
60 }
60 }
61 .north tr:nth-child(even) td:nth-child(n){
61 .north tr:nth-child(even) td:nth-child(n){
62 border-bottom: 12px solid #e2e2e7;
62 border-bottom: 12px solid #e2e2e7;
63 }
63 }
64 .north td:nth-child(n) {
64 .north td:nth-child(n) {
65 border-right: 12px solid #e2e2e7;
65 border-right: 12px solid #e2e2e7;
66 }
66 }
67 .north td:nth-last-child(4n+1) {
67 .north td:nth-last-child(4n+1) {
68 border-right: 2px solid #e2e2e7;
68 border-right: 2px solid #e2e2e7;
69 }
69 }
70 .north tr:nth-last-child(1) td:nth-child(n){
70 .north tr:nth-last-child(1) td:nth-child(n){
71 border-bottom: 3px solid #e2e2e7;
71 border-bottom: 3px solid #e2e2e7;
72 }
72 }
73
73
74
74
75
75
76 .east {
76 .east {
77 border: 2px solid #00334d;
77 border: 2px solid #00334d;
78 vertical-align: center;
78 vertical-align: center;
79 font-weight: bold;
79 font-weight: bold;
80 }
80 }
81 .east tr{
81 .east tr{
82 border: 1px solid #ffffff;
82 border: 1px solid #ffffff;
83 }
83 }
84 .east td{
84 .east td{
85 border: 2px solid #e2e2e7;
85 border: 2px solid #e2e2e7;
86 text-align: center;
86 text-align: center;
87 padding: 1px 15px 1px 15px;
87 padding: 1px 15px 1px 15px;
88 }
88 }
89 .east tr:nth-child(even) td:nth-child(n){
89 .east tr:nth-child(even) td:nth-child(n){
90 border-bottom: 12px solid #e2e2e7;
90 border-bottom: 12px solid #e2e2e7;
91 }
91 }
92 .east td:nth-child(n) {
92 .east td:nth-child(n) {
93 border-right: 12px solid #e2e2e7;
93 border-right: 12px solid #e2e2e7;
94 }
94 }
95 .east td:nth-last-child(4n+1) {
95 .east td:nth-last-child(4n+1) {
96 border-right: 2px solid #e2e2e7;
96 border-right: 2px solid #e2e2e7;
97 }
97 }
98 .east tr:nth-last-child(1) td:nth-child(n){
98 .east tr:nth-last-child(1) td:nth-child(n){
99 border-bottom: 3px solid #e2e2e7;
99 border-bottom: 3px solid #e2e2e7;
100 }
100 }
101
101
102
102
103
103
104
104
105 .west {
105 .west {
106 border: 2px solid #00334d;
106 border: 2px solid #00334d;
107 vertical-align: center;
107 vertical-align: center;
108 font-weight: bold;
108 font-weight: bold;
109 }
109 }
110 .west tr{
110 .west tr{
111 border: 1px solid #ffffff;
111 border: 1px solid #ffffff;
112 }
112 }
113 .west td{
113 .west td{
114 border: 2px solid #e2e2e7;
114 border: 2px solid #e2e2e7;
115 text-align: center;
115 text-align: center;
116 padding: 1px 15px 1px 15px;
116 padding: 1px 15px 1px 15px;
117 }
117 }
118 .west tr:nth-child(even) td:nth-child(n){
118 .west tr:nth-child(even) td:nth-child(n){
119 border-bottom: 12px solid #e2e2e7;
119 border-bottom: 12px solid #e2e2e7;
120 }
120 }
121 .west td:nth-child(n) {
121 .west td:nth-child(n) {
122 border-right: 12px solid #e2e2e7;
122 border-right: 12px solid #e2e2e7;
123 }
123 }
124 .west td:nth-last-child(4n+1) {
124 .west td:nth-last-child(4n+1) {
125 border-right: 2px solid #e2e2e7;
125 border-right: 2px solid #e2e2e7;
126 }
126 }
127 .west tr:nth-last-child(1) td:nth-child(n){
127 .west tr:nth-last-child(1) td:nth-child(n){
128 border-bottom: 3px solid #e2e2e7;
128 border-bottom: 3px solid #e2e2e7;
129 }
129 }
130
130
131
131
132
132
133
133
134 .south {
134 .south {
135 border: 2px solid #00334d;
135 border: 2px solid #00334d;
136 vertical-align: center;
136 vertical-align: center;
137 font-weight: bold;
137 font-weight: bold;
138 }
138 }
139 .south tr{
139 .south tr{
140 border: 1px solid #ffffff;
140 border: 1px solid #ffffff;
141 }
141 }
142 .south td{
142 .south td{
143 border: 2px solid #e2e2e7;
143 border: 2px solid #e2e2e7;
144 text-align: center;
144 text-align: center;
145 padding: 1px 15px 1px 15px;
145 padding: 1px 15px 1px 15px;
146 }
146 }
147 .south tr:nth-child(even) td:nth-child(n){
147 .south tr:nth-child(even) td:nth-child(n){
148 border-bottom: 12px solid #e2e2e7;
148 border-bottom: 12px solid #e2e2e7;
149 }
149 }
150 .south td:nth-child(n) {
150 .south td:nth-child(n) {
151 border-right: 12px solid #e2e2e7;
151 border-right: 12px solid #e2e2e7;
152 }
152 }
153 .south td:nth-last-child(4n+1) {
153 .south td:nth-last-child(4n+1) {
154 border-right: 2px solid #e2e2e7;
154 border-right: 2px solid #e2e2e7;
155 }
155 }
156 .south tr:nth-last-child(1) td:nth-child(n){
156 .south tr:nth-last-child(1) td:nth-child(n){
157 border-bottom: 3px solid #e2e2e7;
157 border-bottom: 3px solid #e2e2e7;
158 }
158 }
159
159
160
160
161
161
162
162
163 </style>
163 </style>
164
164
165
165
166 {% if beams %}
166 {% if beams %}
167
167
168
168
169
169
170 <h4>Beams:</h4>
170 <h4>Beams:</h4>
171 <div class="container">
171 <div class="container">
172 <ul class="nav nav-pills">
172 <ul class="nav nav-pills">
173 {% for beam in beams %}
173 {% for beam in beams %}
174 <li >
174 <li >
175 <a data-toggle="pill" href="#menu{{forloop.counter}}">{{forloop.counter}}</a>
175 <a data-toggle="pill" href="#menu{{forloop.counter}}">{{forloop.counter}}</a>
176 </li>
176 </li>
177 {% endfor %}
177 {% endfor %}
178 </ul>
178 </ul>
179
179
180
180
181 <div class="tab-content">
181 <div class="tab-content">
182 <div id="home" class="tab-pane fade in active">
182 <div id="home" class="tab-pane fade in active">
183 <!---->
183 <!---->
184 {% if active_beam %}
184 {% if active_beam %}
185 <h3>Active Beam: {{active_beam.name}}</h3>
185 <h3>Active Beam: {{active_beam.name}}</h3>
186
186
187 <table id="abs_pattern" class="abs">
187 <table id="abs_pattern" class="abs">
188 <tr>
188 <tr>
189 <td> <b>North Quarter</b>
189 <td> <b>North Quarter</b>
190 <table class="north ">
190 <table class="north ">
191 <tr>
191 <tr>
192 <td {{color_status.1}}>{{active_beam.get_upvalues.0}}</td> <td {{color_status.2}}>{{active_beam.get_upvalues.1}}</td> <td {{color_status.3}}>{{active_beam.get_upvalues.2}}</td> <td {{color_status.4}}>{{active_beam.get_upvalues.3}}</td>
192 <td {{color_status.1}}>{{active_beam.get_upvalues.0}}</td> <td {{color_status.2}}>{{active_beam.get_upvalues.1}}</td> <td {{color_status.3}}>{{active_beam.get_upvalues.2}}</td> <td {{color_status.4}}>{{active_beam.get_upvalues.3}}</td>
193 </tr>
193 </tr>
194 <tr>
194 <tr>
195 <td {{color_status.1}}>{{active_beam.get_downvalues.0}}</td> <td {{color_status.2}}>{{active_beam.get_downvalues.1}}</td> <td {{color_status.3}}>{{active_beam.get_downvalues.2}}</td> <td {{color_status.4}}>{{active_beam.get_downvalues.3}}</td>
195 <td {{color_status.1}}>{{active_beam.get_downvalues.0}}</td> <td {{color_status.2}}>{{active_beam.get_downvalues.1}}</td> <td {{color_status.3}}>{{active_beam.get_downvalues.2}}</td> <td {{color_status.4}}>{{active_beam.get_downvalues.3}}</td>
196 </tr>
196 </tr>
197 <tr>
197 <tr>
198 <td {{color_status.9}}>{{active_beam.get_upvalues.8}}</td> <td {{color_status.10}}>{{active_beam.get_upvalues.9}}</td> <td {{color_status.11}}>{{active_beam.get_upvalues.10}}</td> <td {{color_status.12}}>{{active_beam.get_upvalues.11}}</td>
198 <td {{color_status.9}}>{{active_beam.get_upvalues.8}}</td> <td {{color_status.10}}>{{active_beam.get_upvalues.9}}</td> <td {{color_status.11}}>{{active_beam.get_upvalues.10}}</td> <td {{color_status.12}}>{{active_beam.get_upvalues.11}}</td>
199 </tr>
199 </tr>
200 <tr>
200 <tr>
201 <td {{color_status.9}}>{{active_beam.get_downvalues.8}}</td> <td {{color_status.10}}>{{active_beam.get_downvalues.9}}</td> <td {{color_status.11}}>{{active_beam.get_downvalues.10}}</td> <td {{color_status.12}}>{{active_beam.get_downvalues.11}}</td>
201 <td {{color_status.9}}>{{active_beam.get_downvalues.8}}</td> <td {{color_status.10}}>{{active_beam.get_downvalues.9}}</td> <td {{color_status.11}}>{{active_beam.get_downvalues.10}}</td> <td {{color_status.12}}>{{active_beam.get_downvalues.11}}</td>
202 </tr>
202 </tr>
203 <tr>
203 <tr>
204 <td {{color_status.17}}>{{active_beam.get_upvalues.16}}</td> <td {{color_status.18}}>{{active_beam.get_upvalues.17}}</td> <td {{color_status.19}}>{{active_beam.get_upvalues.18}}</td> <td {{color_status.20}}>{{active_beam.get_upvalues.19}}</td>
204 <td {{color_status.17}}>{{active_beam.get_upvalues.16}}</td> <td {{color_status.18}}>{{active_beam.get_upvalues.17}}</td> <td {{color_status.19}}>{{active_beam.get_upvalues.18}}</td> <td {{color_status.20}}>{{active_beam.get_upvalues.19}}</td>
205 </tr>
205 </tr>
206 <tr>
206 <tr>
207 <td {{color_status.17}}>{{active_beam.get_downvalues.16}}</td> <td {{color_status.18}}>{{active_beam.get_downvalues.17}}</td> <td {{color_status.19}}>{{active_beam.get_downvalues.18}}</td> <td {{color_status.20}}>{{active_beam.get_downvalues.19}}</td>
207 <td {{color_status.17}}>{{active_beam.get_downvalues.16}}</td> <td {{color_status.18}}>{{active_beam.get_downvalues.17}}</td> <td {{color_status.19}}>{{active_beam.get_downvalues.18}}</td> <td {{color_status.20}}>{{active_beam.get_downvalues.19}}</td>
208 </tr>
208 </tr>
209 <tr>
209 <tr>
210 <td {{color_status.25}}>{{active_beam.get_upvalues.24}}</td> <td {{color_status.26}}>{{active_beam.get_upvalues.25}}</td> <td {{color_status.27}}>{{active_beam.get_upvalues.26}}</td> <td {{color_status.28}}>{{active_beam.get_upvalues.27}}</td>
210 <td {{color_status.25}}>{{active_beam.get_upvalues.24}}</td> <td {{color_status.26}}>{{active_beam.get_upvalues.25}}</td> <td {{color_status.27}}>{{active_beam.get_upvalues.26}}</td> <td {{color_status.28}}>{{active_beam.get_upvalues.27}}</td>
211 </tr>
211 </tr>
212 <tr>
212 <tr>
213 <td {{color_status.25}}>{{active_beam.get_downvalues.24}}</td> <td {{color_status.26}}>{{active_beam.get_downvalues.25}}</td> <td {{color_status.27}}>{{active_beam.get_downvalues.26}}</td> <td {{color_status.28}}>{{active_beam.get_downvalues.27}}</td>
213 <td {{color_status.25}}>{{active_beam.get_downvalues.24}}</td> <td {{color_status.26}}>{{active_beam.get_downvalues.25}}</td> <td {{color_status.27}}>{{active_beam.get_downvalues.26}}</td> <td {{color_status.28}}>{{active_beam.get_downvalues.27}}</td>
214 </tr>
214 </tr>
215 </table>
215 </table>
216 </td>
216 </td>
217 <td> <b>East Quarter</b>
217 <td> <b>East Quarter</b>
218 <table class="east ">
218 <table class="east ">
219 <tr>
219 <tr>
220 <td {{color_status.5}}>{{active_beam.get_upvalues.4}}</td> <td {{color_status.6}}>{{active_beam.get_upvalues.5}}</td> <td {{color_status.7}}>{{active_beam.get_upvalues.6}}</td> <td {{color_status.8}}>{{active_beam.get_upvalues.7}}</td>
220 <td {{color_status.5}}>{{active_beam.get_upvalues.4}}</td> <td {{color_status.6}}>{{active_beam.get_upvalues.5}}</td> <td {{color_status.7}}>{{active_beam.get_upvalues.6}}</td> <td {{color_status.8}}>{{active_beam.get_upvalues.7}}</td>
221 </tr>
221 </tr>
222 <tr>
222 <tr>
223 <td {{color_status.5}}>{{active_beam.get_downvalues.4}}</td> <td {{color_status.6}}>{{active_beam.get_downvalues.5}}</td> <td {{color_status.7}}>{{active_beam.get_downvalues.6}}</td> <td {{color_status.8}}>{{active_beam.get_downvalues.7}}</td>
223 <td {{color_status.5}}>{{active_beam.get_downvalues.4}}</td> <td {{color_status.6}}>{{active_beam.get_downvalues.5}}</td> <td {{color_status.7}}>{{active_beam.get_downvalues.6}}</td> <td {{color_status.8}}>{{active_beam.get_downvalues.7}}</td>
224 </tr>
224 </tr>
225 <tr>
225 <tr>
226 <td {{color_status.13}}>{{active_beam.get_upvalues.12}}</td> <td {{color_status.14}}>{{active_beam.get_upvalues.13}}</td> <td {{color_status.15}}>{{active_beam.get_upvalues.14}}</td> <td {{color_status.16}}>{{active_beam.get_upvalues.15}}</td>
226 <td {{color_status.13}}>{{active_beam.get_upvalues.12}}</td> <td {{color_status.14}}>{{active_beam.get_upvalues.13}}</td> <td {{color_status.15}}>{{active_beam.get_upvalues.14}}</td> <td {{color_status.16}}>{{active_beam.get_upvalues.15}}</td>
227 </tr>
227 </tr>
228 <tr>
228 <tr>
229 <td {{color_status.13}}>{{active_beam.get_downvalues.12}}</td> <td {{color_status.14}}>{{active_beam.get_downvalues.13}}</td> <td {{color_status.15}}>{{active_beam.get_downvalues.14}}</td> <td {{color_status.16}}>{{active_beam.get_downvalues.15}}</td>
229 <td {{color_status.13}}>{{active_beam.get_downvalues.12}}</td> <td {{color_status.14}}>{{active_beam.get_downvalues.13}}</td> <td {{color_status.15}}>{{active_beam.get_downvalues.14}}</td> <td {{color_status.16}}>{{active_beam.get_downvalues.15}}</td>
230 </tr>
230 </tr>
231 <tr>
231 <tr>
232 <td {{color_status.21}}>{{active_beam.get_upvalues.20}}</td> <td {{color_status.22}}>{{active_beam.get_upvalues.21}}</td> <td {{color_status.23}}>{{active_beam.get_upvalues.22}}</td> <td {{color_status.24}}>{{active_beam.get_upvalues.23}}</td>
232 <td {{color_status.21}}>{{active_beam.get_upvalues.20}}</td> <td {{color_status.22}}>{{active_beam.get_upvalues.21}}</td> <td {{color_status.23}}>{{active_beam.get_upvalues.22}}</td> <td {{color_status.24}}>{{active_beam.get_upvalues.23}}</td>
233 </tr>
233 </tr>
234 <tr>
234 <tr>
235 <td {{color_status.21}}>{{active_beam.get_downvalues.20}}</td> <td {{color_status.22}}>{{active_beam.get_downvalues.21}}</td> <td {{color_status.23}}>{{active_beam.get_downvalues.22}}</td> <td {{color_status.24}}>{{active_beam.get_downvalues.23}}</td>
235 <td {{color_status.21}}>{{active_beam.get_downvalues.20}}</td> <td {{color_status.22}}>{{active_beam.get_downvalues.21}}</td> <td {{color_status.23}}>{{active_beam.get_downvalues.22}}</td> <td {{color_status.24}}>{{active_beam.get_downvalues.23}}</td>
236 </tr>
236 </tr>
237 <tr>
237 <tr>
238 <td {{color_status.29}}>{{active_beam.get_upvalues.28}}</td> <td {{color_status.30}}>{{active_beam.get_upvalues.29}}</td> <td {{color_status.31}}>{{active_beam.get_upvalues.30}}</td> <td {{color_status.32}}>{{active_beam.get_upvalues.31}}</td>
238 <td {{color_status.29}}>{{active_beam.get_upvalues.28}}</td> <td {{color_status.30}}>{{active_beam.get_upvalues.29}}</td> <td {{color_status.31}}>{{active_beam.get_upvalues.30}}</td> <td {{color_status.32}}>{{active_beam.get_upvalues.31}}</td>
239 </tr>
239 </tr>
240 <tr>
240 <tr>
241 <td {{color_status.29}}>{{active_beam.get_downvalues.28}}</td> <td {{color_status.30}}>{{active_beam.get_downvalues.29}}</td> <td {{color_status.31}}>{{active_beam.get_downvalues.30}}</td> <td {{color_status.32}}>{{active_beam.get_downvalues.31}}</td>
241 <td {{color_status.29}}>{{active_beam.get_downvalues.28}}</td> <td {{color_status.30}}>{{active_beam.get_downvalues.29}}</td> <td {{color_status.31}}>{{active_beam.get_downvalues.30}}</td> <td {{color_status.32}}>{{active_beam.get_downvalues.31}}</td>
242 </tr>
242 </tr>
243 </table>
243 </table>
244 </td>
244 </td>
245 </tr>
245 </tr>
246 <tr>
246 <tr>
247 <td> <b>West Quarter</b>
247 <td> <b>West Quarter</b>
248 <table class="west ">
248 <table class="west ">
249 <tr>
249 <tr>
250 <td {{color_status.33}}>{{active_beam.get_upvalues.32}}</td> <td {{color_status.34}}>{{active_beam.get_upvalues.33}}</td> <td {{color_status.35}}>{{active_beam.get_upvalues.34}}</td> <td {{color_status.36}}>{{active_beam.get_upvalues.35}}</td>
250 <td {{color_status.33}}>{{active_beam.get_upvalues.32}}</td> <td {{color_status.34}}>{{active_beam.get_upvalues.33}}</td> <td {{color_status.35}}>{{active_beam.get_upvalues.34}}</td> <td {{color_status.36}}>{{active_beam.get_upvalues.35}}</td>
251 </tr>
251 </tr>
252 <tr>
252 <tr>
253 <td {{color_status.33}}>{{active_beam.get_downvalues.32}}</td> <td {{color_status.34}}>{{active_beam.get_downvalues.33}}</td> <td {{color_status.35}}>{{active_beam.get_downvalues.34}}</td> <td {{color_status.36}}>{{active_beam.get_downvalues.35}}</td>
253 <td {{color_status.33}}>{{active_beam.get_downvalues.32}}</td> <td {{color_status.34}}>{{active_beam.get_downvalues.33}}</td> <td {{color_status.35}}>{{active_beam.get_downvalues.34}}</td> <td {{color_status.36}}>{{active_beam.get_downvalues.35}}</td>
254 </tr>
254 </tr>
255 <tr>
255 <tr>
256 <td {{color_status.41}}>{{active_beam.get_upvalues.40}}</td> <td {{color_status.42}}>{{active_beam.get_upvalues.41}}</td> <td {{color_status.43}}>{{active_beam.get_upvalues.42}}</td> <td {{color_status.44}}>{{active_beam.get_upvalues.43}}</td>
256 <td {{color_status.41}}>{{active_beam.get_upvalues.40}}</td> <td {{color_status.42}}>{{active_beam.get_upvalues.41}}</td> <td {{color_status.43}}>{{active_beam.get_upvalues.42}}</td> <td {{color_status.44}}>{{active_beam.get_upvalues.43}}</td>
257 </tr>
257 </tr>
258 <tr>
258 <tr>
259 <td {{color_status.41}}>{{active_beam.get_downvalues.40}}</td> <td {{color_status.42}}>{{active_beam.get_downvalues.41}}</td> <td {{color_status.43}}>{{active_beam.get_downvalues.42}}</td> <td {{color_status.44}}>{{active_beam.get_downvalues.43}}</td>
259 <td {{color_status.41}}>{{active_beam.get_downvalues.40}}</td> <td {{color_status.42}}>{{active_beam.get_downvalues.41}}</td> <td {{color_status.43}}>{{active_beam.get_downvalues.42}}</td> <td {{color_status.44}}>{{active_beam.get_downvalues.43}}</td>
260 </tr>
260 </tr>
261 <tr>
261 <tr>
262 <td {{color_status.49}}>{{active_beam.get_upvalues.48}}</td> <td {{color_status.50}}>{{active_beam.get_upvalues.49}}</td> <td {{color_status.51}}>{{active_beam.get_upvalues.50}}</td> <td {{color_status.52}}>{{active_beam.get_upvalues.51}}</td>
262 <td {{color_status.49}}>{{active_beam.get_upvalues.48}}</td> <td {{color_status.50}}>{{active_beam.get_upvalues.49}}</td> <td {{color_status.51}}>{{active_beam.get_upvalues.50}}</td> <td {{color_status.52}}>{{active_beam.get_upvalues.51}}</td>
263 </tr>
263 </tr>
264 <tr>
264 <tr>
265 <td {{color_status.49}}>{{active_beam.get_downvalues.48}}</td> <td {{color_status.50}}>{{active_beam.get_downvalues.49}}</td> <td {{color_status.51}}>{{active_beam.get_downvalues.50}}</td> <td {{color_status.52}}>{{active_beam.get_downvalues.51}}</td>
265 <td {{color_status.49}}>{{active_beam.get_downvalues.48}}</td> <td {{color_status.50}}>{{active_beam.get_downvalues.49}}</td> <td {{color_status.51}}>{{active_beam.get_downvalues.50}}</td> <td {{color_status.52}}>{{active_beam.get_downvalues.51}}</td>
266 </tr>
266 </tr>
267 <tr>
267 <tr>
268 <td {{color_status.57}}>{{active_beam.get_upvalues.56}}</td> <td {{color_status.58}}>{{active_beam.get_upvalues.57}}</td> <td {{color_status.59}}>{{active_beam.get_upvalues.58}}</td> <td {{color_status.60}}>{{active_beam.get_upvalues.59}}</td>
268 <td {{color_status.57}}>{{active_beam.get_upvalues.56}}</td> <td {{color_status.58}}>{{active_beam.get_upvalues.57}}</td> <td {{color_status.59}}>{{active_beam.get_upvalues.58}}</td> <td {{color_status.60}}>{{active_beam.get_upvalues.59}}</td>
269 </tr>
269 </tr>
270 <tr>
270 <tr>
271 <td {{color_status.57}}>{{active_beam.get_downvalues.56}}</td> <td {{color_status.58}}>{{active_beam.get_downvalues.57}}</td> <td {{color_status.59}}>{{active_beam.get_downvalues.58}}</td> <td {{color_status.60}}>{{active_beam.get_downvalues.59}}</td>
271 <td {{color_status.57}}>{{active_beam.get_downvalues.56}}</td> <td {{color_status.58}}>{{active_beam.get_downvalues.57}}</td> <td {{color_status.59}}>{{active_beam.get_downvalues.58}}</td> <td {{color_status.60}}>{{active_beam.get_downvalues.59}}</td>
272 </tr>
272 </tr>
273 </table>
273 </table>
274 </td>
274 </td>
275 <td> <b>South Quarter</b>
275 <td> <b>South Quarter</b>
276 <table class="south ">
276 <table class="south ">
277 <tr>
277 <tr>
278 <td {{color_status.37}}>{{active_beam.get_upvalues.36}}</td> <td {{color_status.38}}>{{active_beam.get_upvalues.37}}</td> <td {{color_status.39}}>{{active_beam.get_upvalues.38}}</td> <td {{color_status.40}}>{{active_beam.get_upvalues.39}}</td>
278 <td {{color_status.37}}>{{active_beam.get_upvalues.36}}</td> <td {{color_status.38}}>{{active_beam.get_upvalues.37}}</td> <td {{color_status.39}}>{{active_beam.get_upvalues.38}}</td> <td {{color_status.40}}>{{active_beam.get_upvalues.39}}</td>
279 </tr>
279 </tr>
280 <tr>
280 <tr>
281 <td {{color_status.37}}>{{active_beam.get_downvalues.36}}</td> <td {{color_status.38}}>{{active_beam.get_downvalues.37}}</td> <td {{color_status.39}}>{{active_beam.get_downvalues.38}}</td> <td {{color_status.40}}>{{active_beam.get_downvalues.39}}</td>
281 <td {{color_status.37}}>{{active_beam.get_downvalues.36}}</td> <td {{color_status.38}}>{{active_beam.get_downvalues.37}}</td> <td {{color_status.39}}>{{active_beam.get_downvalues.38}}</td> <td {{color_status.40}}>{{active_beam.get_downvalues.39}}</td>
282 </tr>
282 </tr>
283 <tr>
283 <tr>
284 <td {{color_status.45}}>{{active_beam.get_upvalues.44}}</td> <td {{color_status.46}}>{{active_beam.get_upvalues.45}}</td> <td {{color_status.47}}>{{active_beam.get_upvalues.46}}</td> <td {{color_status.48}}>{{active_beam.get_upvalues.47}}</td>
284 <td {{color_status.45}}>{{active_beam.get_upvalues.44}}</td> <td {{color_status.46}}>{{active_beam.get_upvalues.45}}</td> <td {{color_status.47}}>{{active_beam.get_upvalues.46}}</td> <td {{color_status.48}}>{{active_beam.get_upvalues.47}}</td>
285 </tr>
285 </tr>
286 <tr>
286 <tr>
287 <td {{color_status.45}}>{{active_beam.get_downvalues.44}}</td> <td {{color_status.46}}>{{active_beam.get_downvalues.45}}</td> <td {{color_status.47}}>{{active_beam.get_downvalues.46}}</td> <td {{color_status.48}}>{{active_beam.get_downvalues.47}}</td>
287 <td {{color_status.45}}>{{active_beam.get_downvalues.44}}</td> <td {{color_status.46}}>{{active_beam.get_downvalues.45}}</td> <td {{color_status.47}}>{{active_beam.get_downvalues.46}}</td> <td {{color_status.48}}>{{active_beam.get_downvalues.47}}</td>
288 </tr>
288 </tr>
289 <tr>
289 <tr>
290 <td {{color_status.53}}>{{active_beam.get_upvalues.52}}</td> <td {{color_status.54}}>{{active_beam.get_upvalues.53}}</td> <td {{color_status.55}}>{{active_beam.get_upvalues.54}}</td> <td {{color_status.56}}>{{active_beam.get_upvalues.55}}</td>
290 <td {{color_status.53}}>{{active_beam.get_upvalues.52}}</td> <td {{color_status.54}}>{{active_beam.get_upvalues.53}}</td> <td {{color_status.55}}>{{active_beam.get_upvalues.54}}</td> <td {{color_status.56}}>{{active_beam.get_upvalues.55}}</td>
291 </tr>
291 </tr>
292 <tr>
292 <tr>
293 <td {{color_status.53}}>{{active_beam.get_downvalues.52}}</td> <td {{color_status.54}}>{{active_beam.get_downvalues.53}}</td> <td {{color_status.55}}>{{active_beam.get_downvalues.54}}</td> <td {{color_status.56}}>{{active_beam.get_downvalues.55}}</td>
293 <td {{color_status.53}}>{{active_beam.get_downvalues.52}}</td> <td {{color_status.54}}>{{active_beam.get_downvalues.53}}</td> <td {{color_status.55}}>{{active_beam.get_downvalues.54}}</td> <td {{color_status.56}}>{{active_beam.get_downvalues.55}}</td>
294 </tr>
294 </tr>
295 <tr>
295 <tr>
296 <td {{color_status.61}}>{{active_beam.get_upvalues.60}}</td> <td {{color_status.62}}>{{active_beam.get_upvalues.61}}</td> <td {{color_status.63}}>{{active_beam.get_upvalues.62}}</td> <td {{color_status.64}}>{{active_beam.get_upvalues.63}}</td>
296 <td {{color_status.61}}>{{active_beam.get_upvalues.60}}</td> <td {{color_status.62}}>{{active_beam.get_upvalues.61}}</td> <td {{color_status.63}}>{{active_beam.get_upvalues.62}}</td> <td {{color_status.64}}>{{active_beam.get_upvalues.63}}</td>
297 </tr>
297 </tr>
298 <tr>
298 <tr>
299 <td {{color_status.61}}>{{active_beam.get_downvalues.60}}</td> <td {{color_status.62}}>{{active_beam.get_downvalues.61}}</td> <td {{color_status.63}}>{{active_beam.get_downvalues.62}}</td> <td {{color_status.64}}>{{active_beam.get_downvalues.63}}</td>
299 <td {{color_status.61}}>{{active_beam.get_downvalues.60}}</td> <td {{color_status.62}}>{{active_beam.get_downvalues.61}}</td> <td {{color_status.63}}>{{active_beam.get_downvalues.62}}</td> <td {{color_status.64}}>{{active_beam.get_downvalues.63}}</td>
300 </tr>
300 </tr>
301 </table>
301 </table>
302 </td>
302 </td>
303 </tr>
303 </tr>
304 </table>
304 </table>
305
305
306
306
307
307
308 <table class="legend">
308 <table class="legend">
309 <tr>
309 <tr>
310 <th colspan="2">Legend</th>
310 <th colspan="2">Legend</th>
311 </tr>
311 </tr>
312 <tr>
312 <tr>
313 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
313 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
314 </tr>
314 </tr>
315 <tr>
315 <tr>
316 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
316 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
317 </tr>
317 </tr>
318 <tr>
318 <tr>
319 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running
319 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running
320 </td>
320 </td>
321 </tr>
321 </tr>
322 <!--
322 <!--
323 <tr>
323 <tr>
324 <td colspan="2">
324 <td colspan="2">
325 <button style="margin: 10px;" id="sendbeam" type="button" class="btn btn-default">
325 <button style="margin: 10px;" id="sendbeam" type="button" class="btn btn-default">
326 <span class="glyphicon glyphicon-export" aria-hidden="true"></span>
326 <span class="glyphicon glyphicon-export" aria-hidden="true"></span>
327 Change Beam</button>
327 Change Beam</button>
328 </td>
328 </td>
329 </tr>
329 </tr>
330 -->
330 -->
331 </table>
331 </table>
332
332
333
333
334
334
335
335
336 {% else %}
336 {% else %}
337 <p><i>This ABS Configuration does not have a current active ABS Beam...<br>
337 <p><i>This ABS Configuration does not have a current active ABS Beam...<br>
338 Please send Beam List to ABS modules. </i></p>
338 Please send Beam List to ABS modules. </i></p>
339
339
340 {% endif %}
340 {% endif %}
341
341
342
342
343 </div>
343 </div>
344
344
345
345
346
346
347 {% for beam in beams %}
347 {% for beam in beams %}
348 <div id="menu{{forloop.counter}}" class="tab-pane fade">
348 <div id="menu{{forloop.counter}}" class="tab-pane fade">
349 <h3>{%if active_beam.id == beam.id%}Active Beam: {%endif%}{{beam.name}}</h3>
349 <h3>{%if active_beam.id == beam.id%}Active Beam: {%endif%}{{beam.name}}</h3>
350 <!--<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>-->
350 <!--<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>-->
351 <table id="abs_pattern{{forloop.counter}}" class="abs">
351 <table id="abs_pattern{{forloop.counter}}" class="abs">
352 <tr>
352 <tr>
353 <td> <b>North Quarter</b>
353 <td> <b>North Quarter</b>
354 <table class="north ">
354 <table class="north ">
355 <tr>
355 <tr>
356 <td {{beam.color_status.1}}>{{beam.get_upvalues.0}}</td> <td {{beam.color_status.2}}>{{beam.get_upvalues.1}}</td> <td {{beam.color_status.3}}>{{beam.get_upvalues.2}}</td> <td {{beam.color_status.4}}>{{beam.get_upvalues.3}}</td>
356 <td {{beam.color_status.1}}>{{beam.get_upvalues.0}}</td> <td {{beam.color_status.2}}>{{beam.get_upvalues.1}}</td> <td {{beam.color_status.3}}>{{beam.get_upvalues.2}}</td> <td {{beam.color_status.4}}>{{beam.get_upvalues.3}}</td>
357 </tr>
357 </tr>
358 <tr>
358 <tr>
359 <td {{beam.color_status.1}}>{{beam.get_downvalues.0}}</td> <td {{beam.color_status.2}}>{{beam.get_downvalues.1}}</td> <td {{beam.color_status.3}}>{{beam.get_downvalues.2}}</td> <td {{beam.color_status.4}}>{{beam.get_downvalues.3}}</td>
359 <td {{beam.color_status.1}}>{{beam.get_downvalues.0}}</td> <td {{beam.color_status.2}}>{{beam.get_downvalues.1}}</td> <td {{beam.color_status.3}}>{{beam.get_downvalues.2}}</td> <td {{beam.color_status.4}}>{{beam.get_downvalues.3}}</td>
360 </tr>
360 </tr>
361 <tr>
361 <tr>
362 <td {{beam.color_status.9}}>{{beam.get_upvalues.8}}</td> <td {{beam.color_status.10}}>{{beam.get_upvalues.9}}</td> <td {{beam.color_status.11}}>{{beam.get_upvalues.10}}</td> <td {{beam.color_status.12}}>{{beam.get_upvalues.11}}</td>
362 <td {{beam.color_status.9}}>{{beam.get_upvalues.8}}</td> <td {{beam.color_status.10}}>{{beam.get_upvalues.9}}</td> <td {{beam.color_status.11}}>{{beam.get_upvalues.10}}</td> <td {{beam.color_status.12}}>{{beam.get_upvalues.11}}</td>
363 </tr>
363 </tr>
364 <tr>
364 <tr>
365 <td {{beam.color_status.9}}>{{beam.get_downvalues.8}}</td> <td {{beam.color_status.10}}>{{beam.get_downvalues.9}}</td> <td {{beam.color_status.11}}>{{beam.get_downvalues.10}}</td> <td {{beam.color_status.12}}>{{beam.get_downvalues.11}}</td>
365 <td {{beam.color_status.9}}>{{beam.get_downvalues.8}}</td> <td {{beam.color_status.10}}>{{beam.get_downvalues.9}}</td> <td {{beam.color_status.11}}>{{beam.get_downvalues.10}}</td> <td {{beam.color_status.12}}>{{beam.get_downvalues.11}}</td>
366 </tr>
366 </tr>
367 <tr>
367 <tr>
368 <td {{beam.color_status.17}}>{{beam.get_upvalues.16}}</td> <td {{beam.color_status.18}}>{{beam.get_upvalues.17}}</td> <td {{beam.color_status.19}}>{{beam.get_upvalues.18}}</td> <td {{beam.color_status.20}}>{{beam.get_upvalues.19}}</td>
368 <td {{beam.color_status.17}}>{{beam.get_upvalues.16}}</td> <td {{beam.color_status.18}}>{{beam.get_upvalues.17}}</td> <td {{beam.color_status.19}}>{{beam.get_upvalues.18}}</td> <td {{beam.color_status.20}}>{{beam.get_upvalues.19}}</td>
369 </tr>
369 </tr>
370 <tr>
370 <tr>
371 <td {{beam.color_status.17}}>{{beam.get_downvalues.16}}</td> <td {{beam.color_status.18}}>{{beam.get_downvalues.17}}</td> <td {{beam.color_status.19}}>{{beam.get_downvalues.18}}</td> <td {{beam.color_status.20}}>{{beam.get_downvalues.19}}</td>
371 <td {{beam.color_status.17}}>{{beam.get_downvalues.16}}</td> <td {{beam.color_status.18}}>{{beam.get_downvalues.17}}</td> <td {{beam.color_status.19}}>{{beam.get_downvalues.18}}</td> <td {{beam.color_status.20}}>{{beam.get_downvalues.19}}</td>
372 </tr>
372 </tr>
373 <tr>
373 <tr>
374 <td {{beam.color_status.25}}>{{beam.get_upvalues.24}}</td> <td {{beam.color_status.26}}>{{beam.get_upvalues.25}}</td> <td {{beam.color_status.27}}>{{beam.get_upvalues.26}}</td> <td {{beam.color_status.28}}>{{beam.get_upvalues.27}}</td>
374 <td {{beam.color_status.25}}>{{beam.get_upvalues.24}}</td> <td {{beam.color_status.26}}>{{beam.get_upvalues.25}}</td> <td {{beam.color_status.27}}>{{beam.get_upvalues.26}}</td> <td {{beam.color_status.28}}>{{beam.get_upvalues.27}}</td>
375 </tr>
375 </tr>
376 <tr>
376 <tr>
377 <td {{beam.color_status.25}}>{{beam.get_downvalues.24}}</td> <td {{beam.color_status.26}}>{{beam.get_downvalues.25}}</td> <td {{beam.color_status.27}}>{{beam.get_downvalues.26}}</td> <td {{beam.color_status.28}}>{{beam.get_downvalues.27}}</td>
377 <td {{beam.color_status.25}}>{{beam.get_downvalues.24}}</td> <td {{beam.color_status.26}}>{{beam.get_downvalues.25}}</td> <td {{beam.color_status.27}}>{{beam.get_downvalues.26}}</td> <td {{beam.color_status.28}}>{{beam.get_downvalues.27}}</td>
378 </tr>
378 </tr>
379 </table>
379 </table>
380 </td>
380 </td>
381 <td> <b>East Quarter</b>
381 <td> <b>East Quarter</b>
382 <table class="east ">
382 <table class="east ">
383 <tr>
383 <tr>
384 <td {{beam.color_status.5}}>{{beam.get_upvalues.4}}</td> <td {{beam.color_status.6}}>{{beam.get_upvalues.5}}</td> <td {{beam.color_status.7}}>{{beam.get_upvalues.6}}</td> <td {{beam.color_status.8}}>{{beam.get_upvalues.7}}</td>
384 <td {{beam.color_status.5}}>{{beam.get_upvalues.4}}</td> <td {{beam.color_status.6}}>{{beam.get_upvalues.5}}</td> <td {{beam.color_status.7}}>{{beam.get_upvalues.6}}</td> <td {{beam.color_status.8}}>{{beam.get_upvalues.7}}</td>
385 </tr>
385 </tr>
386 <tr>
386 <tr>
387 <td {{beam.color_status.5}}>{{beam.get_downvalues.4}}</td> <td {{beam.color_status.6}}>{{beam.get_downvalues.5}}</td> <td {{beam.color_status.7}}>{{beam.get_downvalues.6}}</td> <td {{beam.color_status.8}}>{{beam.get_downvalues.7}}</td>
387 <td {{beam.color_status.5}}>{{beam.get_downvalues.4}}</td> <td {{beam.color_status.6}}>{{beam.get_downvalues.5}}</td> <td {{beam.color_status.7}}>{{beam.get_downvalues.6}}</td> <td {{beam.color_status.8}}>{{beam.get_downvalues.7}}</td>
388 </tr>
388 </tr>
389 <tr>
389 <tr>
390 <td {{beam.color_status.13}}>{{beam.get_upvalues.12}}</td> <td {{beam.color_status.14}}>{{beam.get_upvalues.13}}</td> <td {{beam.color_status.15}}>{{beam.get_upvalues.14}}</td> <td {{beam.color_status.16}}>{{beam.get_upvalues.15}}</td>
390 <td {{beam.color_status.13}}>{{beam.get_upvalues.12}}</td> <td {{beam.color_status.14}}>{{beam.get_upvalues.13}}</td> <td {{beam.color_status.15}}>{{beam.get_upvalues.14}}</td> <td {{beam.color_status.16}}>{{beam.get_upvalues.15}}</td>
391 </tr>
391 </tr>
392 <tr>
392 <tr>
393 <td {{beam.color_status.13}}>{{beam.get_downvalues.12}}</td> <td {{beam.color_status.14}}>{{beam.get_downvalues.13}}</td> <td {{beam.color_status.15}}>{{beam.get_downvalues.14}}</td> <td {{beam.color_status.16}}>{{beam.get_downvalues.15}}</td>
393 <td {{beam.color_status.13}}>{{beam.get_downvalues.12}}</td> <td {{beam.color_status.14}}>{{beam.get_downvalues.13}}</td> <td {{beam.color_status.15}}>{{beam.get_downvalues.14}}</td> <td {{beam.color_status.16}}>{{beam.get_downvalues.15}}</td>
394 </tr>
394 </tr>
395 <tr>
395 <tr>
396 <td {{beam.color_status.21}}>{{beam.get_upvalues.20}}</td> <td {{beam.color_status.22}}>{{beam.get_upvalues.21}}</td> <td {{beam.color_status.23}}>{{beam.get_upvalues.22}}</td> <td {{beam.color_status.24}}>{{beam.get_upvalues.23}}</td>
396 <td {{beam.color_status.21}}>{{beam.get_upvalues.20}}</td> <td {{beam.color_status.22}}>{{beam.get_upvalues.21}}</td> <td {{beam.color_status.23}}>{{beam.get_upvalues.22}}</td> <td {{beam.color_status.24}}>{{beam.get_upvalues.23}}</td>
397 </tr>
397 </tr>
398 <tr>
398 <tr>
399 <td {{beam.color_status.21}}>{{beam.get_downvalues.20}}</td> <td {{beam.color_status.22}}>{{beam.get_downvalues.21}}</td> <td {{beam.color_status.23}}>{{beam.get_downvalues.22}}</td> <td {{beam.color_status.24}}>{{beam.get_downvalues.23}}</td>
399 <td {{beam.color_status.21}}>{{beam.get_downvalues.20}}</td> <td {{beam.color_status.22}}>{{beam.get_downvalues.21}}</td> <td {{beam.color_status.23}}>{{beam.get_downvalues.22}}</td> <td {{beam.color_status.24}}>{{beam.get_downvalues.23}}</td>
400 </tr>
400 </tr>
401 <tr>
401 <tr>
402 <td {{beam.color_status.29}}>{{beam.get_upvalues.28}}</td> <td {{beam.color_status.30}}>{{beam.get_upvalues.29}}</td> <td {{beam.color_status.31}}>{{beam.get_upvalues.30}}</td> <td {{beam.color_status.32}}>{{beam.get_upvalues.31}}</td>
402 <td {{beam.color_status.29}}>{{beam.get_upvalues.28}}</td> <td {{beam.color_status.30}}>{{beam.get_upvalues.29}}</td> <td {{beam.color_status.31}}>{{beam.get_upvalues.30}}</td> <td {{beam.color_status.32}}>{{beam.get_upvalues.31}}</td>
403 </tr>
403 </tr>
404 <tr>
404 <tr>
405 <td {{beam.color_status.29}}>{{beam.get_downvalues.28}}</td> <td {{beam.color_status.30}}>{{beam.get_downvalues.29}}</td> <td {{beam.color_status.31}}>{{beam.get_downvalues.30}}</td> <td {{beam.color_status.32}}>{{beam.get_downvalues.31}}</td>
405 <td {{beam.color_status.29}}>{{beam.get_downvalues.28}}</td> <td {{beam.color_status.30}}>{{beam.get_downvalues.29}}</td> <td {{beam.color_status.31}}>{{beam.get_downvalues.30}}</td> <td {{beam.color_status.32}}>{{beam.get_downvalues.31}}</td>
406 </tr>
406 </tr>
407 </table>
407 </table>
408 </td>
408 </td>
409 </tr>
409 </tr>
410 <tr>
410 <tr>
411 <td> <b>West Quarter</b>
411 <td> <b>West Quarter</b>
412 <table class="west ">
412 <table class="west ">
413 <tr>
413 <tr>
414 <td {{beam.color_status.33}}>{{beam.get_upvalues.32}}</td> <td {{beam.color_status.34}}>{{beam.get_upvalues.33}}</td> <td {{beam.color_status.35}}>{{beam.get_upvalues.34}}</td> <td {{beam.color_status.36}}>{{beam.get_upvalues.35}}</td>
414 <td {{beam.color_status.33}}>{{beam.get_upvalues.32}}</td> <td {{beam.color_status.34}}>{{beam.get_upvalues.33}}</td> <td {{beam.color_status.35}}>{{beam.get_upvalues.34}}</td> <td {{beam.color_status.36}}>{{beam.get_upvalues.35}}</td>
415 </tr>
415 </tr>
416 <tr>
416 <tr>
417 <td {{beam.color_status.33}}>{{beam.get_downvalues.32}}</td> <td {{beam.color_status.34}}>{{beam.get_downvalues.33}}</td> <td {{beam.color_status.35}}>{{beam.get_downvalues.34}}</td> <td {{beam.color_status.36}}>{{beam.get_downvalues.35}}</td>
417 <td {{beam.color_status.33}}>{{beam.get_downvalues.32}}</td> <td {{beam.color_status.34}}>{{beam.get_downvalues.33}}</td> <td {{beam.color_status.35}}>{{beam.get_downvalues.34}}</td> <td {{beam.color_status.36}}>{{beam.get_downvalues.35}}</td>
418 </tr>
418 </tr>
419 <tr>
419 <tr>
420 <td {{beam.color_status.41}}>{{beam.get_upvalues.40}}</td> <td {{beam.color_status.42}}>{{beam.get_upvalues.41}}</td> <td {{beam.color_status.43}}>{{beam.get_upvalues.42}}</td> <td {{beam.color_status.44}}>{{beam.get_upvalues.43}}</td>
420 <td {{beam.color_status.41}}>{{beam.get_upvalues.40}}</td> <td {{beam.color_status.42}}>{{beam.get_upvalues.41}}</td> <td {{beam.color_status.43}}>{{beam.get_upvalues.42}}</td> <td {{beam.color_status.44}}>{{beam.get_upvalues.43}}</td>
421 </tr>
421 </tr>
422 <tr>
422 <tr>
423 <td {{beam.color_status.41}}>{{beam.get_downvalues.40}}</td> <td {{beam.color_status.42}}>{{beam.get_downvalues.41}}</td> <td {{beam.color_status.43}}>{{beam.get_downvalues.42}}</td> <td {{beam.color_status.44}}>{{beam.get_downvalues.43}}</td>
423 <td {{beam.color_status.41}}>{{beam.get_downvalues.40}}</td> <td {{beam.color_status.42}}>{{beam.get_downvalues.41}}</td> <td {{beam.color_status.43}}>{{beam.get_downvalues.42}}</td> <td {{beam.color_status.44}}>{{beam.get_downvalues.43}}</td>
424 </tr>
424 </tr>
425 <tr>
425 <tr>
426 <td {{beam.color_status.49}}>{{beam.get_upvalues.48}}</td> <td {{beam.color_status.50}}>{{beam.get_upvalues.49}}</td> <td {{beam.color_status.51}}>{{beam.get_upvalues.50}}</td> <td {{beam.color_status.52}}>{{beam.get_upvalues.51}}</td>
426 <td {{beam.color_status.49}}>{{beam.get_upvalues.48}}</td> <td {{beam.color_status.50}}>{{beam.get_upvalues.49}}</td> <td {{beam.color_status.51}}>{{beam.get_upvalues.50}}</td> <td {{beam.color_status.52}}>{{beam.get_upvalues.51}}</td>
427 </tr>
427 </tr>
428 <tr>
428 <tr>
429 <td {{beam.color_status.49}}>{{beam.get_downvalues.48}}</td> <td {{beam.color_status.50}}>{{beam.get_downvalues.49}}</td> <td {{beam.color_status.51}}>{{beam.get_downvalues.50}}</td> <td {{beam.color_status.52}}>{{beam.get_downvalues.51}}</td>
429 <td {{beam.color_status.49}}>{{beam.get_downvalues.48}}</td> <td {{beam.color_status.50}}>{{beam.get_downvalues.49}}</td> <td {{beam.color_status.51}}>{{beam.get_downvalues.50}}</td> <td {{beam.color_status.52}}>{{beam.get_downvalues.51}}</td>
430 </tr>
430 </tr>
431 <tr>
431 <tr>
432 <td {{beam.color_status.57}}>{{beam.get_upvalues.56}}</td> <td {{beam.color_status.58}}>{{beam.get_upvalues.57}}</td> <td {{beam.color_status.59}}>{{beam.get_upvalues.58}}</td> <td {{beam.color_status.60}}>{{beam.get_upvalues.59}}</td>
432 <td {{beam.color_status.57}}>{{beam.get_upvalues.56}}</td> <td {{beam.color_status.58}}>{{beam.get_upvalues.57}}</td> <td {{beam.color_status.59}}>{{beam.get_upvalues.58}}</td> <td {{beam.color_status.60}}>{{beam.get_upvalues.59}}</td>
433 </tr>
433 </tr>
434 <tr>
434 <tr>
435 <td {{beam.color_status.57}}>{{beam.get_downvalues.56}}</td> <td {{beam.color_status.58}}>{{beam.get_downvalues.57}}</td> <td {{beam.color_status.59}}>{{beam.get_downvalues.58}}</td> <td {{beam.color_status.60}}>{{beam.get_downvalues.59}}</td>
435 <td {{beam.color_status.57}}>{{beam.get_downvalues.56}}</td> <td {{beam.color_status.58}}>{{beam.get_downvalues.57}}</td> <td {{beam.color_status.59}}>{{beam.get_downvalues.58}}</td> <td {{beam.color_status.60}}>{{beam.get_downvalues.59}}</td>
436 </tr>
436 </tr>
437 </table>
437 </table>
438 </td>
438 </td>
439 <td> <b>South Quarter</b>
439 <td> <b>South Quarter</b>
440 <table class="south ">
440 <table class="south ">
441 <tr>
441 <tr>
442 <td {{beam.color_status.37}}>{{beam.get_upvalues.36}}</td> <td {{beam.color_status.38}}>{{beam.get_upvalues.37}}</td> <td {{beam.color_status.39}}>{{beam.get_upvalues.38}}</td> <td {{beam.color_status.40}}>{{beam.get_upvalues.39}}</td>
442 <td {{beam.color_status.37}}>{{beam.get_upvalues.36}}</td> <td {{beam.color_status.38}}>{{beam.get_upvalues.37}}</td> <td {{beam.color_status.39}}>{{beam.get_upvalues.38}}</td> <td {{beam.color_status.40}}>{{beam.get_upvalues.39}}</td>
443 </tr>
443 </tr>
444 <tr>
444 <tr>
445 <td {{beam.color_status.37}}>{{beam.get_downvalues.36}}</td> <td {{beam.color_status.38}}>{{beam.get_downvalues.37}}</td> <td {{beam.color_status.39}}>{{beam.get_downvalues.38}}</td> <td {{beam.color_status.40}}>{{beam.get_downvalues.39}}</td>
445 <td {{beam.color_status.37}}>{{beam.get_downvalues.36}}</td> <td {{beam.color_status.38}}>{{beam.get_downvalues.37}}</td> <td {{beam.color_status.39}}>{{beam.get_downvalues.38}}</td> <td {{beam.color_status.40}}>{{beam.get_downvalues.39}}</td>
446 </tr>
446 </tr>
447 <tr>
447 <tr>
448 <td {{beam.color_status.45}}>{{beam.get_upvalues.44}}</td> <td {{beam.color_status.46}}>{{beam.get_upvalues.45}}</td> <td {{beam.color_status.47}}>{{beam.get_upvalues.46}}</td> <td {{beam.color_status.48}}>{{beam.get_upvalues.47}}</td>
448 <td {{beam.color_status.45}}>{{beam.get_upvalues.44}}</td> <td {{beam.color_status.46}}>{{beam.get_upvalues.45}}</td> <td {{beam.color_status.47}}>{{beam.get_upvalues.46}}</td> <td {{beam.color_status.48}}>{{beam.get_upvalues.47}}</td>
449 </tr>
449 </tr>
450 <tr>
450 <tr>
451 <td {{beam.color_status.45}}>{{beam.get_downvalues.44}}</td> <td {{beam.color_status.46}}>{{beam.get_downvalues.45}}</td> <td {{beam.color_status.47}}>{{beam.get_downvalues.46}}</td> <td {{beam.color_status.48}}>{{beam.get_downvalues.47}}</td>
451 <td {{beam.color_status.45}}>{{beam.get_downvalues.44}}</td> <td {{beam.color_status.46}}>{{beam.get_downvalues.45}}</td> <td {{beam.color_status.47}}>{{beam.get_downvalues.46}}</td> <td {{beam.color_status.48}}>{{beam.get_downvalues.47}}</td>
452 </tr>
452 </tr>
453 <tr>
453 <tr>
454 <td {{beam.color_status.53}}>{{beam.get_upvalues.52}}</td> <td {{beam.color_status.54}}>{{beam.get_upvalues.53}}</td> <td {{beam.color_status.55}}>{{beam.get_upvalues.54}}</td> <td {{beam.color_status.56}}>{{beam.get_upvalues.55}}</td>
454 <td {{beam.color_status.53}}>{{beam.get_upvalues.52}}</td> <td {{beam.color_status.54}}>{{beam.get_upvalues.53}}</td> <td {{beam.color_status.55}}>{{beam.get_upvalues.54}}</td> <td {{beam.color_status.56}}>{{beam.get_upvalues.55}}</td>
455 </tr>
455 </tr>
456 <tr>
456 <tr>
457 <td {{beam.color_status.53}}>{{beam.get_downvalues.52}}</td> <td {{beam.color_status.54}}>{{beam.get_downvalues.53}}</td> <td {{beam.color_status.55}}>{{beam.get_downvalues.54}}</td> <td {{beam.color_status.56}}>{{beam.get_downvalues.55}}</td>
457 <td {{beam.color_status.53}}>{{beam.get_downvalues.52}}</td> <td {{beam.color_status.54}}>{{beam.get_downvalues.53}}</td> <td {{beam.color_status.55}}>{{beam.get_downvalues.54}}</td> <td {{beam.color_status.56}}>{{beam.get_downvalues.55}}</td>
458 </tr>
458 </tr>
459 <tr>
459 <tr>
460 <td {{beam.color_status.61}}>{{beam.get_upvalues.60}}</td> <td {{beam.color_status.62}}>{{beam.get_upvalues.61}}</td> <td {{beam.color_status.63}}>{{beam.get_upvalues.62}}</td> <td {{beam.color_status.64}}>{{beam.get_upvalues.63}}</td>
460 <td {{beam.color_status.61}}>{{beam.get_upvalues.60}}</td> <td {{beam.color_status.62}}>{{beam.get_upvalues.61}}</td> <td {{beam.color_status.63}}>{{beam.get_upvalues.62}}</td> <td {{beam.color_status.64}}>{{beam.get_upvalues.63}}</td>
461 </tr>
461 </tr>
462 <tr>
462 <tr>
463 <td {{beam.color_status.61}}>{{beam.get_downvalues.60}}</td> <td {{beam.color_status.62}}>{{beam.get_downvalues.61}}</td> <td {{beam.color_status.63}}>{{beam.get_downvalues.62}}</td> <td {{beam.color_status.64}}>{{beam.get_downvalues.63}}</td>
463 <td {{beam.color_status.61}}>{{beam.get_downvalues.60}}</td> <td {{beam.color_status.62}}>{{beam.get_downvalues.61}}</td> <td {{beam.color_status.63}}>{{beam.get_downvalues.62}}</td> <td {{beam.color_status.64}}>{{beam.get_downvalues.63}}</td>
464 </tr>
464 </tr>
465 </table>
465 </table>
466 </td>
466 </td>
467 </tr>
467 </tr>
468 </table>
468 </table>
469
469
470 {% if active_beam.id != beam.id %}
470 {% if active_beam.id != beam.id %}
471 <div style="vertical-align: top; display:inline-block;">
471 <div style="vertical-align: top; display:inline-block;">
472 <button style="" id="sendbeam" type="button" class="btn btn-default">
472 <button style="" id="send_beam{{forloop.counter}}" type="button" class="btn btn-default">
473 <span class="glyphicon glyphicon-export" aria-hidden="true"></span>
473 <span class="glyphicon glyphicon-export" aria-hidden="true"></span>
474 Change Beam</button>
474 Change Beam</button>
475 </div>
475 </div>
476 {% endif %}
476 {% endif %}
477
477
478
478
479
479
480
480
481 {% if active_beam %}
481 {% if active_beam %}
482 {% if active_beam.id == beam.id %}
482 {% if active_beam.id == beam.id %}
483 <table class="legend">
483 <table class="legend">
484 <tr>
484 <tr>
485 <th colspan="2">Legend</th>
485 <th colspan="2">Legend</th>
486 </tr>
486 </tr>
487 <tr>
487 <tr>
488 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
488 <td style="color:#ff0000;"><i>RED</i></td><td>Disconnected</td>
489 </tr>
489 </tr>
490 <tr>
490 <tr>
491 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
491 <td style="color:#ee902c;"><i>ORANGE</i></td><td>Connected</td>
492 </tr>
492 </tr>
493 <tr>
493 <tr>
494 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running
494 <td style="color:#00cc00;"><i>GREEN</i></td><td>Running
495 </td>
495 </td>
496 </tr>
496 </tr>
497 </table>
497 </table>
498
498
499 {% endif %}
499 {% endif %}
500 {% endif %}
500 {% endif %}
501
501
502
502
503 </div>
503 </div>
504
504
505
505
506 {% endfor %}
506 {% endfor %}
507
507
508
508
509
509
510 </div>
510 </div>
511 </div>
511 </div>
512
512
513
513
514
514
515
515
516 <script>
516 <script>
517 $(document).ready(function() {
517 $(document).ready(function() {
518
518
519 {% for beam in beams %}
520 $("#send_beam{{forloop.counter}}").click(function() {
521 document.location = "{% url 'url_send_beam' dev_conf.id beam.id %}";
522 });
523 {%endfor%}
519
524
520 });
525 });
521 </script>
526 </script>
522
527
523
528
524
529
525
530
526
531
527
532
528 {% else %}
533 {% else %}
529 <p style="color:#b4bcc2; margin-left: 5%;"><i>No Beams...</i></p>
534 <p style="color:#b4bcc2; margin-left: 5%;"><i>No Beams...</i></p>
530 {% endif %}
535 {% endif %}
531
536
532
537
533 {% endblock %}
538 {% endblock %}
@@ -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'^(?P<id_conf>-?\d+)/read/$', views.dev_conf_read, name='url_read_abs_conf'),
8 #url(r'^(?P<id_conf>-?\d+)/read/$', views.dev_conf_read, name='url_read_abs_conf'),
9 #url(r'^(?P<id_conf>-?\d+)/import/$', views.dev_conf_import, name='url_import_abs_conf'),
9 #url(r'^(?P<id_conf>-?\d+)/import/$', views.dev_conf_import, name='url_import_abs_conf'),
10 #url(r'^(?P<id_conf>-?\d+)/export/$', views.dev_conf_export, name='url_export_abs_conf'),
10 #url(r'^(?P<id_conf>-?\d+)/export/$', views.dev_conf_export, name='url_export_abs_conf'),
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,373 +1,393
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
8
8 from datetime import datetime
9 from datetime import datetime
9 from time import sleep
10 from time import sleep
10 import os
11 import os
11
12
12 from apps.main.models import Device, Configuration
13 from apps.main.models import Device, Configuration
13 from apps.main.views import sidebar
14 from apps.main.views import sidebar
14
15
15 from .models import ABSConfiguration, ABSBeam
16 from .models import ABSConfiguration, ABSBeam
16 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm
17 from .forms import ABSConfigurationForm, ABSBeamEditForm, ABSBeamAddForm
17
18
18 from .utils.overJroShow import overJroShow
19 from .utils.overJroShow import overJroShow
19 from .utils.OverJRO import OverJRO
20 from .utils.OverJRO import OverJRO
20 # Create your views here.
21 # Create your views here.
21 import json, ast
22 import json, ast
22
23
23
24
24 def get_values_from_form(form_data):
25 def get_values_from_form(form_data):
25
26
26 sublistup = []
27 sublistup = []
27 sublistdown = []
28 sublistdown = []
28 subtxlistup = []
29 subtxlistup = []
29 subtxlistdown = []
30 subtxlistdown = []
30 subrxlistup = []
31 subrxlistup = []
31 subrxlistdown = []
32 subrxlistdown = []
32
33
33 up_values_list = []
34 up_values_list = []
34 down_values_list = []
35 down_values_list = []
35 up_txvalues_list = []
36 up_txvalues_list = []
36 down_txvalues_list = []
37 down_txvalues_list = []
37 up_rxvalues_list = []
38 up_rxvalues_list = []
38 down_rxvalues_list = []
39 down_rxvalues_list = []
39
40
40 values_list = {}
41 values_list = {}
41 cont = 1
42 cont = 1
42
43
43 for i in range(1,65):
44 for i in range(1,65):
44 x = float(form_data['abs_up'+str(i)])
45 x = float(form_data['abs_up'+str(i)])
45 y = float(form_data['abs_down'+str(i)])
46 y = float(form_data['abs_down'+str(i)])
46 sublistup.append(x)
47 sublistup.append(x)
47 sublistdown.append(y)
48 sublistdown.append(y)
48
49
49 if str(i) in form_data.getlist('uptx_checks'):
50 if str(i) in form_data.getlist('uptx_checks'):
50 subtxlistup.append(1)
51 subtxlistup.append(1)
51 else:
52 else:
52 subtxlistup.append(0)
53 subtxlistup.append(0)
53 if str(i) in form_data.getlist('downtx_checks'):
54 if str(i) in form_data.getlist('downtx_checks'):
54 subtxlistdown.append(1)
55 subtxlistdown.append(1)
55 else:
56 else:
56 subtxlistdown.append(0)
57 subtxlistdown.append(0)
57
58
58 if str(i) in form_data.getlist('uprx_checks'):
59 if str(i) in form_data.getlist('uprx_checks'):
59 subrxlistup.append(1)
60 subrxlistup.append(1)
60 else:
61 else:
61 subrxlistup.append(0)
62 subrxlistup.append(0)
62 if str(i) in form_data.getlist('downrx_checks'):
63 if str(i) in form_data.getlist('downrx_checks'):
63 subrxlistdown.append(1)
64 subrxlistdown.append(1)
64 else:
65 else:
65 subrxlistdown.append(0)
66 subrxlistdown.append(0)
66
67
67 cont = cont+1
68 cont = cont+1
68
69
69 if cont == 9:
70 if cont == 9:
70 up_values_list.append(sublistup)
71 up_values_list.append(sublistup)
71 down_values_list.append(sublistdown)
72 down_values_list.append(sublistdown)
72 sublistup = []
73 sublistup = []
73 sublistdown = []
74 sublistdown = []
74
75
75 up_txvalues_list.append(subtxlistup)
76 up_txvalues_list.append(subtxlistup)
76 down_txvalues_list.append(subtxlistdown)
77 down_txvalues_list.append(subtxlistdown)
77 subtxlistup = []
78 subtxlistup = []
78 subtxlistdown = []
79 subtxlistdown = []
79 up_rxvalues_list.append(subrxlistup)
80 up_rxvalues_list.append(subrxlistup)
80 down_rxvalues_list.append(subrxlistdown)
81 down_rxvalues_list.append(subrxlistdown)
81 subrxlistup = []
82 subrxlistup = []
82 subrxlistdown = []
83 subrxlistdown = []
83 cont = 1
84 cont = 1
84
85
85
86
86 list_uesup = []
87 list_uesup = []
87 list_uesdown = []
88 list_uesdown = []
88 for i in range(1,5):
89 for i in range(1,5):
89 if form_data['ues_up'+str(i)] == '':
90 if form_data['ues_up'+str(i)] == '':
90 list_uesup.append(0.0)
91 list_uesup.append(0.0)
91 else:
92 else:
92 list_uesup.append(float(form_data['ues_up'+str(i)]))
93 list_uesup.append(float(form_data['ues_up'+str(i)]))
93
94
94 if form_data['ues_down'+str(i)] == '':
95 if form_data['ues_down'+str(i)] == '':
95 list_uesdown.append(0.0)
96 list_uesdown.append(0.0)
96 else:
97 else:
97 list_uesdown.append(float(form_data['ues_down'+str(i)]))
98 list_uesdown.append(float(form_data['ues_down'+str(i)]))
98
99
99 onlyrx_list = form_data.getlist('onlyrx')
100 onlyrx_list = form_data.getlist('onlyrx')
100 only_rx = {}
101 only_rx = {}
101 if '1' in onlyrx_list:
102 if '1' in onlyrx_list:
102 only_rx['up'] = True
103 only_rx['up'] = True
103 else:
104 else:
104 only_rx['up'] = False
105 only_rx['up'] = False
105 if '2' in onlyrx_list:
106 if '2' in onlyrx_list:
106 only_rx['down'] = True
107 only_rx['down'] = True
107 else:
108 else:
108 only_rx['down'] = False
109 only_rx['down'] = False
109
110
110 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
111 antenna = {'antenna_up': up_values_list, 'antenna_down': down_values_list}
111 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
112 tx = {'up': up_txvalues_list, 'down': down_txvalues_list}
112 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
113 rx = {'up': up_rxvalues_list, 'down': down_rxvalues_list}
113 ues = {'up': list_uesup, 'down': list_uesdown}
114 ues = {'up': list_uesup, 'down': list_uesdown}
114 name = str(form_data['beam_name'])
115 name = str(form_data['beam_name'])
115
116
116 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
117 beam_data = {'name': name, 'antenna': antenna, 'tx': tx, 'rx': rx, 'ues': ues, 'only_rx': only_rx}
117
118
118 return beam_data
119 return beam_data
119
120
120
121
121
122
122 def abs_conf(request, id_conf):
123 def abs_conf(request, id_conf):
123
124
124 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
125 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
125 beams = ABSBeam.objects.filter(abs_conf=conf)
126 beams = ABSBeam.objects.filter(abs_conf=conf)
126 active_beam_id = json.loads(conf.active_beam)
127 active_beam_id = json.loads(conf.active_beam)
127
128
128 #------------Colors for Active Beam:-------------
129 #------------Colors for Active Beam:-------------
129 modules_status = json.loads(conf.module_status)
130 modules_status = json.loads(conf.module_status)
130
131
131 color_status = {}
132 color_status = {}
132 for status in modules_status:
133 for status in modules_status:
133 if modules_status[status] == 2: #Running background-color: #ff0000;
134 if modules_status[status] == 2: #Running background-color: #ff0000;
134 color_status[status] = 'bgcolor=#00cc00'
135 color_status[status] = 'bgcolor=#00cc00'
135 elif modules_status[status] == 1: #Connected background-color: #ee902c;
136 elif modules_status[status] == 1: #Connected background-color: #ee902c;
136 color_status[status] = 'bgcolor=#ee902c'
137 color_status[status] = 'bgcolor=#ee902c'
137 else: #Disconnected background-color: #00cc00;
138 else: #Disconnected background-color: #00cc00;
138 color_status[status] = 'bgcolor=#FF0000'
139 color_status[status] = 'bgcolor=#FF0000'
139 #------------------------------------------------
140 #------------------------------------------------
140
141
141 kwargs = {}
142 kwargs = {}
142 kwargs['status'] = conf.device.get_status_display()
143 kwargs['status'] = conf.device.get_status_display()
143
144
144
145
145 kwargs['dev_conf'] = conf
146 kwargs['dev_conf'] = conf
146 kwargs['dev_conf_keys'] = ['name',]
147 kwargs['dev_conf_keys'] = ['name',]
147
148
148 kwargs['title'] = 'ABS Configuration'
149 kwargs['title'] = 'ABS Configuration'
149 kwargs['suptitle'] = 'Details'
150 kwargs['suptitle'] = 'Details'
150 kwargs['no_play'] = True
151 kwargs['no_play'] = True
151
152
152 kwargs['button'] = 'Edit Configuration'
153 kwargs['button'] = 'Edit Configuration'
153 #------------------Active Beam-----------------------
154 #------------------Active Beam-----------------------
154 try:
155 try:
155 active_beam_id = active_beam_id['active_beam']
156 active_beam_id = active_beam_id['active_beam']
156 active_beam = ABSBeam.objects.get(pk=active_beam_id)
157 active_beam = ABSBeam.objects.get(pk=active_beam_id)
157 kwargs['active_beam'] = active_beam
158 kwargs['active_beam'] = active_beam
158 for beam in beams:
159 for beam in beams:
159 if beam.id == active_beam.id:
160 if beam.id == active_beam.id:
160 beam.color_status=color_status
161 beam.color_status=color_status
161 except:
162 except:
162 active_beam = ''
163 active_beam = ''
163 #----------------------------------------------------
164 #----------------------------------------------------
164 kwargs['beams'] = beams
165 kwargs['beams'] = beams
165 kwargs['modules_status'] = modules_status
166 kwargs['modules_status'] = modules_status
166 kwargs['color_status'] = color_status
167 kwargs['color_status'] = color_status
167
168
168 kwargs['only_stop'] = True
169 kwargs['only_stop'] = True
169
170
170 ###### SIDEBAR ######
171 ###### SIDEBAR ######
171 kwargs.update(sidebar(conf=conf))
172 kwargs.update(sidebar(conf=conf))
172
173
173 return render(request, 'abs_conf.html', kwargs)
174 return render(request, 'abs_conf.html', kwargs)
174
175
175 def abs_conf_edit(request, id_conf):
176 def abs_conf_edit(request, id_conf):
176
177
177 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
178 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
178
179
179 beams = ABSBeam.objects.filter(abs_conf=conf)
180 beams = ABSBeam.objects.filter(abs_conf=conf)
180 print beams
181 print beams
181
182
182 if request.method=='GET':
183 if request.method=='GET':
183 form = ABSConfigurationForm(instance=conf)
184 form = ABSConfigurationForm(instance=conf)
184
185
185 if request.method=='POST':
186 if request.method=='POST':
186 form = ABSConfigurationForm(request.POST, instance=conf)
187 form = ABSConfigurationForm(request.POST, instance=conf)
187
188
188 if form.is_valid():
189 if form.is_valid():
189 conf = form.save(commit=False)
190 conf = form.save(commit=False)
190 conf.save()
191 conf.save()
191 return redirect('url_abs_conf', id_conf=conf.id)
192 return redirect('url_abs_conf', id_conf=conf.id)
192
193
193 ###### SIDEBAR ######
194 ###### SIDEBAR ######
194 kwargs = {}
195 kwargs = {}
195
196
196 kwargs['dev_conf'] = conf
197 kwargs['dev_conf'] = conf
197 #kwargs['id_dev'] = conf.id
198 #kwargs['id_dev'] = conf.id
198 kwargs['id_conf'] = conf.id
199 kwargs['id_conf'] = conf.id
199 kwargs['form'] = form
200 kwargs['form'] = form
200 kwargs['abs_beams'] = beams
201 kwargs['abs_beams'] = beams
201 kwargs['title'] = 'Device Configuration'
202 kwargs['title'] = 'Device Configuration'
202 kwargs['suptitle'] = 'Edit'
203 kwargs['suptitle'] = 'Edit'
203 kwargs['button'] = 'Save'
204 kwargs['button'] = 'Save'
204
205
205 kwargs['edit'] = True
206 kwargs['edit'] = True
206
207
207 return render(request, 'abs_conf_edit.html', kwargs)
208 return render(request, 'abs_conf_edit.html', kwargs)
208
209
209
210
211 def send_beam(request, id_conf, id_beam):
212
213 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
214 beam = get_object_or_404(ABSBeam, pk=id_beam)
215 beams_list = ABSBeam.objects.filter(abs_conf=conf)
216 #To set this beam as an Active Beam
217 beam.set_activebeam()
218 #To send beam position to abs-modules
219 i = 0
220 for b in beams_list:
221 if b.id == int(id_beam):
222 break
223 else:
224 i += 1
225 beam_pos = i + 1 #Estandarizar
226 print 'Position: ',beam_pos
227 conf.send_beam_num(beam_pos)
228
229 return redirect('url_abs_conf', conf.id)
210
230
211
231
212 def add_beam(request, id_conf):
232 def add_beam(request, id_conf):
213
233
214 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
234 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
215 confs = Configuration.objects.all()
235 confs = Configuration.objects.all()
216
236
217 if request.method=='GET':
237 if request.method=='GET':
218 #form = ABSBeamEditForm()
238 #form = ABSBeamEditForm()
219 form = ABSBeamAddForm()
239 form = ABSBeamAddForm()
220
240
221 if request.method=='POST':
241 if request.method=='POST':
222 form = ABSBeamAddForm(request.POST)
242 form = ABSBeamAddForm(request.POST)
223
243
224 beam_data = get_values_from_form(request.POST)
244 beam_data = get_values_from_form(request.POST)
225
245
226 new_beam = ABSBeam(
246 new_beam = ABSBeam(
227 name =beam_data['name'],
247 name =beam_data['name'],
228 antenna =json.dumps(beam_data['antenna']),
248 antenna =json.dumps(beam_data['antenna']),
229 abs_conf=conf,
249 abs_conf=conf,
230 tx =json.dumps(beam_data['tx']),
250 tx =json.dumps(beam_data['tx']),
231 rx =json.dumps(beam_data['rx']),
251 rx =json.dumps(beam_data['rx']),
232 ues =json.dumps(beam_data['ues']),
252 ues =json.dumps(beam_data['ues']),
233 only_rx =json.dumps(beam_data['only_rx'])
253 only_rx =json.dumps(beam_data['only_rx'])
234 )
254 )
235 new_beam.save()
255 new_beam.save()
236 #---Update 6bits configuration and add beam to abs configuration beams list.
256 #---Update 6bits configuration and add beam to abs configuration beams list.
237 new_beam.modules_6bits()
257 new_beam.modules_6bits()
238 #new_beam.add_beam2list()
258 #new_beam.add_beam2list()
239 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
259 messages.success(request, 'Beam: "%s" has been added.' % new_beam.name)
240
260
241 return redirect('url_edit_abs_conf', conf.id)
261 return redirect('url_edit_abs_conf', conf.id)
242
262
243 ###### SIDEBAR ######
263 ###### SIDEBAR ######
244 kwargs = {}
264 kwargs = {}
245
265
246 #kwargs['dev_conf'] = conf.device
266 #kwargs['dev_conf'] = conf.device
247 #kwargs['id_dev'] = conf.device
267 #kwargs['id_dev'] = conf.device
248 kwargs['id_conf'] = conf.id
268 kwargs['id_conf'] = conf.id
249 kwargs['form'] = form
269 kwargs['form'] = form
250 kwargs['title'] = 'ABS Beams'
270 kwargs['title'] = 'ABS Beams'
251 kwargs['suptitle'] = 'Add Beam'
271 kwargs['suptitle'] = 'Add Beam'
252 kwargs['button'] = 'Add'
272 kwargs['button'] = 'Add'
253 kwargs['no_sidebar'] = True
273 kwargs['no_sidebar'] = True
254
274
255 #kwargs['previous'] = conf.get_absolute_url_edit()
275 #kwargs['previous'] = conf.get_absolute_url_edit()
256 kwargs['edit'] = True
276 kwargs['edit'] = True
257
277
258 return render(request, 'abs_add_beam.html', kwargs)
278 return render(request, 'abs_add_beam.html', kwargs)
259
279
260
280
261 def edit_beam(request, id_conf, id_beam):
281 def edit_beam(request, id_conf, id_beam):
262
282
263 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
283 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
264 beam = get_object_or_404(ABSBeam, pk=id_beam)
284 beam = get_object_or_404(ABSBeam, pk=id_beam)
265
285
266 if request.method=='GET':
286 if request.method=='GET':
267 form = ABSBeamEditForm(initial={'beam': beam})
287 form = ABSBeamEditForm(initial={'beam': beam})
268
288
269 if request.method=='POST':
289 if request.method=='POST':
270 form = ABSBeamEditForm(request.POST)
290 form = ABSBeamEditForm(request.POST)
271
291
272 beam_data = get_values_from_form(request.POST)
292 beam_data = get_values_from_form(request.POST)
273
293
274 beam.dict_to_parms(beam_data)
294 beam.dict_to_parms(beam_data)
275 beam.save()
295 beam.save()
276
296
277 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
297 messages.success(request, 'Beam: "%s" has been updated.' % beam.name)
278
298
279 return redirect('url_edit_abs_conf', conf.id)
299 return redirect('url_edit_abs_conf', conf.id)
280
300
281 ###### SIDEBAR ######
301 ###### SIDEBAR ######
282 kwargs = {}
302 kwargs = {}
283
303
284 kwargs['id_conf'] = conf.id
304 kwargs['id_conf'] = conf.id
285 kwargs['form'] = form
305 kwargs['form'] = form
286 kwargs['title'] = 'ABS Beams'
306 kwargs['title'] = 'ABS Beams'
287 kwargs['suptitle'] = 'Edit Beam'
307 kwargs['suptitle'] = 'Edit Beam'
288 kwargs['button'] = 'Save'
308 kwargs['button'] = 'Save'
289 kwargs['no_sidebar'] = True
309 kwargs['no_sidebar'] = True
290
310
291 #kwargs['previous'] = conf.get_absolute_url_edit()
311 #kwargs['previous'] = conf.get_absolute_url_edit()
292 kwargs['edit'] = True
312 kwargs['edit'] = True
293
313
294 return render(request, 'abs_edit_beam.html', kwargs)
314 return render(request, 'abs_edit_beam.html', kwargs)
295
315
296
316
297
317
298 def remove_beam(request, id_conf, id_beam):
318 def remove_beam(request, id_conf, id_beam):
299
319
300 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
320 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
301 beam = get_object_or_404(ABSBeam, pk=id_beam)
321 beam = get_object_or_404(ABSBeam, pk=id_beam)
302
322
303 if request.method=='POST':
323 if request.method=='POST':
304 if beam:
324 if beam:
305 try:
325 try:
306 beam.remove_beamfromlist()
326 beam.remove_beamfromlist()
307 beam.delete()
327 beam.delete()
308 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
328 messages.success(request, 'Beam: "%s" has been deleted.' % beam)
309 except:
329 except:
310 messages.error(request, 'Unable to delete beam: "%s".' % beam)
330 messages.error(request, 'Unable to delete beam: "%s".' % beam)
311
331
312 return redirect('url_edit_abs_conf', conf.id)
332 return redirect('url_edit_abs_conf', conf.id)
313
333
314 ###### SIDEBAR ######
334 ###### SIDEBAR ######
315 kwargs = {}
335 kwargs = {}
316
336
317 kwargs['object'] = beam
337 kwargs['object'] = beam
318 kwargs['delete'] = True
338 kwargs['delete'] = True
319 kwargs['title'] = 'Delete'
339 kwargs['title'] = 'Delete'
320 kwargs['suptitle'] = 'Beam'
340 kwargs['suptitle'] = 'Beam'
321 kwargs['previous'] = conf.get_absolute_url_edit()
341 kwargs['previous'] = conf.get_absolute_url_edit()
322 return render(request, 'confirm.html', kwargs)
342 return render(request, 'confirm.html', kwargs)
323
343
324
344
325
345
326 def plot_patterns(request, id_conf, id_beam=None):
346 def plot_patterns(request, id_conf, id_beam=None):
327
347
328 kwargs = {}
348 kwargs = {}
329 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
349 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
330 beams = ABSBeam.objects.filter(abs_conf=conf)
350 beams = ABSBeam.objects.filter(abs_conf=conf)
331
351
332 if id_beam:
352 if id_beam:
333 beam = get_object_or_404(ABSBeam, pk=id_beam)
353 beam = get_object_or_404(ABSBeam, pk=id_beam)
334 kwargs['beam'] = beam
354 kwargs['beam'] = beam
335
355
336
356
337 ###### SIDEBAR ######
357 ###### SIDEBAR ######
338
358
339 kwargs['dev_conf'] = conf.device
359 kwargs['dev_conf'] = conf.device
340 kwargs['id_dev'] = conf.device
360 kwargs['id_dev'] = conf.device
341 kwargs['id_conf'] = conf.id
361 kwargs['id_conf'] = conf.id
342 kwargs['abs_beams'] = beams
362 kwargs['abs_beams'] = beams
343 kwargs['title'] = 'ABS Patterns'
363 kwargs['title'] = 'ABS Patterns'
344 kwargs['suptitle'] = conf.name
364 kwargs['suptitle'] = conf.name
345 kwargs['no_sidebar'] = True
365 kwargs['no_sidebar'] = True
346
366
347 return render(request, 'abs_patterns.html', kwargs)
367 return render(request, 'abs_patterns.html', kwargs)
348
368
349
369
350 def plot_pattern(request, id_conf, id_beam, antenna):
370 def plot_pattern(request, id_conf, id_beam, antenna):
351
371
352 if antenna=='down':
372 if antenna=='down':
353 sleep(3)
373 sleep(3)
354
374
355 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
375 conf = get_object_or_404(ABSConfiguration, pk=id_conf)
356 beam = get_object_or_404(ABSBeam, pk=id_beam)
376 beam = get_object_or_404(ABSBeam, pk=id_beam)
357
377
358 name = conf.experiment.name
378 name = conf.experiment.name
359
379
360 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
380 just_rx = 1 if json.loads(beam.only_rx)[antenna] else 0
361 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
381 phases = json.loads(beam.antenna)['antenna_{}'.format(antenna)]
362 gain_tx = json.loads(beam.tx)[antenna]
382 gain_tx = json.loads(beam.tx)[antenna]
363 gain_rx = json.loads(beam.rx)[antenna]
383 gain_rx = json.loads(beam.rx)[antenna]
364 ues = json.loads(beam.ues)[antenna]
384 ues = json.loads(beam.ues)[antenna]
365
385
366 newOverJro = overJroShow(name)
386 newOverJro = overJroShow(name)
367 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
387 fig = newOverJro.plotPattern2(datetime.today(), phases, gain_tx, gain_rx, ues, just_rx)
368
388
369 response=HttpResponse(content_type='image/png')
389 response=HttpResponse(content_type='image/png')
370
390
371 fig.canvas.print_png(response)
391 fig.canvas.print_png(response)
372
392
373 return response
393 return response
General Comments 0
You need to be logged in to leave comments. Login now