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