From 678cf1e292aba4da1a602e612a3ee835a95aba0a 2018-06-27 13:57:49 From: Juan C. Espinoza Date: 2018-06-27 13:57:49 Subject: [PATCH] Review & fix ABS module --- diff --git a/apps/abs/models.py b/apps/abs/models.py index 2208421..944aafd 100644 --- a/apps/abs/models.py +++ b/apps/abs/models.py @@ -76,20 +76,10 @@ rx_default = json.dumps({ [0,0,0,0,1,1,1,1]], }) -conf_default = {} -status_default = {} +status_default = '0000000000000000000000000000000000000000000000000000000000000000' default_messages = {} -default_modulemode = {"1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, "7": 0, "8": 0, "9": 0, "10": 0, - "11": 0, "12": 0, "13": 0, "14": 0, "15": 0, "16": 0, "17": 0, "18": 0, "19": 0, "20": 0, - "21": 0, "22": 0, "23": 0, "24": 0, "25": 0, "26": 0, "27": 0, "28": 0, "29": 0, "30": 0, - "31": 0, "32": 0, "33": 0, "34": 0, "35": 0, "36": 0, "37": 0, "38": 0, "39": 0, "40": 0, - "41": 0, "42": 0, "43": 0, "44": 0, "45": 0, "46": 0, "47": 0, "48": 0, "49": 0, "50": 0, - "51": 0, "52": 0, "53": 0, "54": 0, "55": 0, "56": 0, "57": 0, "58": 0, "59": 0, "60": 0, - "61": 0, "62": 0, "63": 0, "64": 0} # 0 : Socket // 1: API Rest for i in range(1,65): - conf_default[str(i)] = "" - status_default[str(i)] = 0 default_messages[str(i)] = "Module "+str(i) @@ -219,12 +209,11 @@ OPERATION_MODES = ( class ABSConfiguration(Configuration): - active_beam = models.CharField(verbose_name='Active Beam', max_length=20000, default="{}") + active_beam = models.PositiveSmallIntegerField(verbose_name='Active Beam', default=0) module_status = models.CharField(verbose_name='Module Status', max_length=10000, default=json.dumps(status_default)) operation_mode = models.PositiveSmallIntegerField(verbose_name='Operation Mode', choices=OPERATION_MODES, default = 0) operation_value = models.FloatField(verbose_name='Periodic (seconds)', default="10", null=True, blank=True) module_messages = models.CharField(verbose_name='Modules Messages', max_length=10000, default=json.dumps(default_messages)) - module_mode = models.CharField(verbose_name='Modules Mode', max_length=10000, default=json.dumps(default_modulemode)) class Meta: db_table = 'abs_configurations' @@ -332,11 +321,8 @@ class ABSConfiguration(Configuration): beam.clone(abs_conf=self) #-----For Active Beam----- - active_beam = json.loads(self.active_beam) new_beams = ABSBeam.objects.filter(abs_conf=self) - active_beam['active_beam'] = new_beams[0].id - - self.active_beam = json.dumps(active_beam) + self.active_beam = new_beams[0].id self.save() #-----For Active Beam----- #-----For Device Status--- @@ -376,69 +362,6 @@ class ABSConfiguration(Configuration): return True - def monitoring_device(self): - - monitoreo_tx = 'JROABSClnt_01CeCnMod000000MNTR10' - beam_tx = 'JROABSCeCnModCnMod01000001CHGB10' - - beam_pos = 1 - module_address = ('192.168.1.63', 5500) - - message_tx = monitoreo_tx - # Create the datagram socket - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect(module_address) - - sock.send(message_tx) - t = sock.recv(1024) - print 'Respuesta: \n',t - sock.close() - sock = None - - return True - - - def module_conf(self, module_num, beams): - """ - This function creates beam configurations for one abs module. - """ - ip_address = self.device.ip_address - ip_address = ip_address.split('.') - module_seq = (ip_address[0],ip_address[1],ip_address[2]) - dot = '.' - module_ip = dot.join(module_seq)+'.'+str(module_num) - module_port = self.device.port_address - write_route = 'http://'+module_ip+':'+str(module_port)+'/write' - - #header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1' - #module = 'ABS_'+str(module_num) - bs = '' #{} - i=1 - - for beam in beams: - #bs[i] = fromBinary2Char(beam.module_6bits(module_num)) - bs = bs + fromBinary2Char(beam.module_6bits(module_num)) - i=i+1 - - beams = bs - - parameters = {} - parameters['beams'] = beams #json.dumps(beams) - print parameters - answer = '' - - try: - #r_write = requests.post(write_route, parameters, timeout=0.5) - r_write = requests.post(write_route, json = parameters, timeout=0.7) - answer = r_write.json() - #self.message = answer['message'] - except: - #self.message = "Could not write ABS parameters" - return False - - return answer - - def write_device(self): @@ -448,62 +371,51 @@ class ABSConfiguration(Configuration): """ beams = ABSBeam.objects.filter(abs_conf=self) - connected_modules = ast.literal_eval(self.module_status) - suma_connected_modules = 0 - - for c in connected_modules: - suma_connected_modules = suma_connected_modules+connected_modules[c] - if not suma_connected_modules > 0 : + nbeams = len(beams) + if self.connected_modules() == 0 : self.message = "No ABS Module detected." return False #-------------Write each abs module----------- if beams: - beams_status = ast.literal_eval(self.module_status) - disconnected_modules = 0 - for i in range(1,65): #(62,65) - #--------------JUEVES------------- - if beams_status[str(i)] != 0: - try: - answer = self.module_conf(i,beams) - if answer: - if answer['status']: - beams_status[str(i)] = 3 - print answer - - except: - beams_status[str(i)] = 1 - - pass - else: - disconnected_modules += 1 + message = 'SNDF{:02d}'.format(nbeams) + for i, status in enumerate(self.module_status): + message += ''.join([fromBinary2Char(beam.module_6bits(i)) for beam in beams]) + status = ['0'] * 64 + n = 0 + + sock = self.send_multicast(message) + for i in range(64): + try: + data, address = sock.recvfrom(1024) + if data == '1': + status[int(address[0][10:])-1] = '3' + elif data == '0': + status[int(address[0][10:])-1] = '1' + except: + n += 1 + sock.close() else: self.message = "ABS Configuration does not have beams" return False - #self.device.status = 1 - ## - #-------------Jueves------------- - if disconnected_modules == 64: + if n == 64: self.message = "Could not write ABS Modules" self.device.status = 0 + self.module_status = ''.join(status) + self.save() return False else: self.message = "ABS Beams List have been sent to ABS Modules" beams[0].set_as_activebeam() self.device.status = 3 - self.module_status = json.dumps(beams_status) - - - + self.module_status = ''.join(status) self.save() return True - - def read_module(self, module): """ @@ -560,240 +472,66 @@ class ABSConfiguration(Configuration): return parms - def absmodule_status(self): - """ - This function gets the status of each abs module. It sends GET method to Web Application - in Python Bottle. - This function updates "module_status" field from ABSconfiguration. - """ - ip_address = self.device.ip_address - ip_address = ip_address.split('.') - module_seq = (ip_address[0],ip_address[1],ip_address[2]) - dot = '.' - module_port = self.device.port_address - - modules_status = json.loads(self.module_status) - module_messages = json.loads(self.module_messages) - - for i in range(1,65): - module_ip = dot.join(module_seq)+'.'+str(i) - print module_ip - - route = 'http://'+module_ip+':'+str(module_port)+'/status' - - try: - r = requests.get(route, timeout=0.8)#, timeout=0.7) - answer = r.json() - modules_status[str(i)] = answer['status'] - module_messages[str(i)] = answer['message'] - except: - modules_status[str(i)] = 0 - pass - - - self.module_status = json.dumps(modules_status) - self.module_messages = json.dumps(module_messages) - self.save() - - print 'Termino (=' - - return - - def connected_modules(self): """ This function returns the number of connected abs-modules without updating. """ - modules_status = json.loads(self.module_status) num = 0 - for status in modules_status: - if modules_status[status] != 0: + print(self.module_status) + for i, status in enumerate(self.module_status): + if status != '0': num += 1 - + print('status {}:{}'.format(i+1, status)) return num + def send_multicast(self, message): + + multicast_group = ('224.3.29.71', 10000) + # Create the datagram socket + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.settimeout(0.01) + local_ip = "0.0.0.0" + sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip)) + sent = sock.sendto(message, multicast_group) + print('Sending ' + message) + return sock def status_device(self): """ This function returns the status of all abs-modules as one. If at least one module is connected, its answer is "1" """ - #self.absmodule_status() - send_task('status_absdevice', [self.id],) - connected_modules = self.connected_modules() - if connected_modules>0: + + sock = self.send_multicast('MNTR') + + n = 0 + status = ['0'] * 64 + for i in range(64): + try: + data, address = sock.recvfrom(1024) + if data == '1': + status[int(address[0][10:])-1] = '3' + elif data == '0': + status[int(address[0][10:])-1] = '1' + n += 1 + print('Module: {} connected'.format(address)) + except: + pass + sock.close() + + if n > 0: self.message = 'ABS modules Status have been updated.' - return 1 + self.device.status = 1 else: - self.device.status=0 - - self.message = 'No ABS module is connected.' + self.device.status = 0 + self.message = 'No ABS module is connected.' + self.module_status = ''.join(status) self.save() - return 0 - - - - def write_module(self, module): - - """ - Send configuration to one abs module - """ - - parameters = {} - ip_address = self.device.ip_address - ip_address = ip_address.split('.') - module_seq = (ip_address[0],ip_address[1],ip_address[2]) - dot = '.' - module_ip = dot.join(module_seq)+'.'+str(module) - module_port = self.device.port_address - write_route = 'http://'+module_ip+':'+str(module_port)+'/write' - - #print write_route - - #header = 'JROABSCeCnModCnMod01000108SNDFexperimento1.ab1' - #module = 'ABS_'+str(module) - beams = '!`*3 0: - beam_pos = beam_pos - 1 - else: - beam_pos = 0 - - #El indice del apunte debe ser menor que el numero total de apuntes - #El servidor tcp en el embebido comienza a contar desde 0 - beams_list = ABSBeam.objects.filter(abs_conf=self) - if len(beams_list) < beam_pos: - return 0 - - flag = 1 - if beam_pos>9: - flag = 2 - - module_address = ('192.168.1.'+str(module), 5500) - header = 'JROABSCeCnModCnMod0100000' - numbers = len(str(beam_pos)) - function = 'CHGB' - - message_tx = header+str(numbers)+function+str(beam_pos)+'0' - - # Create the datagram socket - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - #sock.connect(module_address) - try: - sock.connect(module_address) - sock.send(message_tx) - sock.close() - print("Writing abs module:"+module_address[0]+"...") - except: - sock = None - print("Problem writing abs module:"+module_address[0]) - return 0 - - return 1 - - - def change_beam(self, beam_pos): - """ - This function selects the beam number for all absmodules. - """ - for i in range(1,65): - try: - self.beam_selector(i,beam_pos) - except: - print("Problem with module: 192.168.1."+str(i)) - self.message = "Problem with module: 192.168.1."+str(i) - #return 0 - return 1 - - - def send_beam_num(self, beam_pos): + def send_beam(self, beam_pos): """ This function connects to a multicast group and sends the beam number to all abs modules. @@ -833,52 +571,22 @@ class ABSConfiguration(Configuration): #El indice del apunte debe ser menor que el numero total de apuntes #El servidor tcp en el embebido comienza a contar desde 0 - beams_list = ABSBeam.objects.filter(abs_conf=self) - if len(beams_list) < beam_pos: - return 0 - - flag = 1 - if beam_pos>9: - flag = 2 - - header = 'JROABSCeCnModCnMod0100000' - flag = str(flag) - function = 'CHGB' - message_tx = header+flag+function+str(beam_pos)+'0' - print message_tx - multicast_group = '224.3.29.71' - server_address = ('',10000) - #Specific Netwrok Interface - local_ip='192.168.1.153' - # Create the socket - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - # Bind to the server address - sock.bind(server_address) - # Telling the OS add the socket to the multicast on all interfaces - group = socket.inet_aton(multicast_group) - mreq = struct.pack('4sL', group, 1) #socket.INADDR_ANY + status = ['0'] * 64 + message = 'CHGB{}'.format(beam_pos) + sock = self.send_multicast(message) - try: - #sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) - sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_ip)) #Specific Netwrok Interface - except Exception as e: - self.message = str(e) - print str(e) - sock.close() - sock = None - return False + for i in range(64): + try: + data, address = sock.recvfrom(1024) + print address, data + if data == '1': + status[int(address[0][10:])-1] = '3' + elif data == '0': + status[int(address[0][10:])-1] = '1' + except: + pass - #print 'sending acknowledgement to all: \n' + message_tx - try: - sock.sendto(message_tx, (multicast_group, 10000)) - except Exception as e: - self.message = str(e) - print str(e) - sock.close() - sock = None - return False sock.close() - sock = None #Start DDS-RC-JARS if confdds: @@ -890,171 +598,15 @@ class ABSConfiguration(Configuration): confjars.start_device() self.message = "ABS Beam has been changed" - print self.message - + self.module_status = ''.join(status) + self.save() return True - def test1(self): - t1 = time.time() - t2 = 0 - while (t2-t1)<100:#300 - t2 = time.time() - self.send_beam_num(2) - time.sleep(0.04) - self.send_beam_num(1) - time.sleep(0.04) - return - - def change_procs_test1(self, module): - - for i in range (1,300):#300 - beam_pos = 1 - module_address = ('192.168.1.'+str(module), 5500) - header = 'JROABSCeCnModCnMod0100000' - numbers = len(str(beam_pos)) - function = 'CHGB' - - message_tx = header+str(numbers)+function+str(beam_pos)+'0' - - # Create the datagram socket - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect(module_address) - - sock.send(message_tx) - #t = sock.recv(1024) - sock.close() - sock = None - - - time.sleep(0.04) - - - beam_pos = 0 - numbers = len(str(beam_pos)) - - message_tx = header+str(numbers)+function+str(beam_pos)+'0' - - # Create the datagram socket - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - sock.connect(module_address) - sock.send(message_tx) - sock.close() - sock = None - - time.sleep(0.04) - - - def multi_procs_test1(self): - - """ - This function sends the beam number to all abs modules using multiprocessing. - """ - - #if __name__ == "__main__": - size = 10000000 # Number of random numbers to add - procs = 65 # (Number-1) of processes to create (absmodule) - - # Create a list of jobs and then iterate through - # the number of processes appending each process to - # the job list - jobs = [] - for i in range(1, procs): - - process = multiprocessing.Process(target=self.change_procs_test1,args=(i,)) - jobs.append(process) - #print jobs - - # Start the processes (i.e. calculate the random number lists) - for j in jobs: - #time.sleep(0.4) - #print j - j.start() - - # Ensure all of the processes have finished - for j in jobs: - j.join() - - print("List processing complete.") - return 1 - - - - def multi_procs_test2(self): - """ - This function use multiprocessing python library. Importing Pool we can select - the number of cores we want to use - After 'nproc' linux command, we know how many cores computer has. - NOT WORKING - """ - import multiprocessing - pool = multiprocessing.Pool(3) # cores - - tasks = [] - procs = 65 - for i in range(62, procs): - tasks.append( (i,)) - #print tasks - #pool.apply_async(self.change_procs_test1, 62) - results = [pool.apply( self.change_procs_test1, t ) for t in tasks] - #for result in results: - #result.get() - #(plotNum, plotFilename) = result.get() - #print("Result: plot %d written to %s" % (plotNum, plotFilename) ) - - return 1 - - - def multi_procs_test3(self): - """ - This function use multiprocessing python library. Importing Pool we can select - the number of cores we want to use - After 'nproc' linux command, we know how many cores computer has. - """ - from multiprocessing import Pool - import time - - def f(x): - return x*x - - tasks = [] - procs = 65 - pool = Pool(processes=4) - - #for i in range(62, procs): - #result = pool.map(f, range(62,65)) - it = pool.imap(self.change_procs_test1, range(62,65)) - #result.get(timeout=5) - - return 1 - - - def multi_procs_test4(self): - import multiprocessing as mp - - - num_workers = mp.cpu_count() - - pool = mp.Pool(num_workers) - procs = 65 - for i in range(62, procs): - #for task in tasks: - pool.apply_async(self.f, args = (i,)) - - pool.close() - pool.join() - - return 1 - def get_absolute_url_import(self): return reverse('url_import_abs_conf', args=[str(self.id)]) - def get_absolute_url_status(self): - return reverse('url_status_abs_conf', args=[str(self.id)]) - - - class ABSBeam(models.Model): name = models.CharField(max_length=60, default='Beam') @@ -1064,7 +616,6 @@ class ABSBeam(models.Model): rx = models.CharField(verbose_name='Rx', max_length=1000, default=rx_default) s_time = models.TimeField(verbose_name='Star Time', default='00:00:00') e_time = models.TimeField(verbose_name='End Time', default='23:59:59') - modules_conf = models.CharField(verbose_name='Modules', max_length=2000, default=json.dumps(conf_default)) ues = models.CharField(verbose_name='Ues', max_length=100, default=ues_default) only_rx = models.CharField(verbose_name='Only RX', max_length=40, default=onlyrx_default) @@ -1076,11 +627,7 @@ class ABSBeam(models.Model): def parms_to_dict(self): - #Update data - self.modules_6bits() - parameters = {} - parameters['name'] = self.name parameters['antenna'] = ast.literal_eval(self.antenna) parameters['abs_conf'] = self.abs_conf.name @@ -1088,7 +635,6 @@ class ABSBeam(models.Model): parameters['rx'] = ast.literal_eval(self.rx) parameters['s_time'] = self.s_time.strftime("%H:%M:%S") parameters['e_time'] = self.e_time.strftime("%H:%M:%S") - parameters['configuration'] = ast.literal_eval(self.modules_conf) parameters['ues'] = ast.literal_eval(self.ues) parameters['only_rx'] = json.loads(self.only_rx) @@ -1105,8 +651,6 @@ class ABSBeam(models.Model): #self.e_time = parameters['e_time'] self.ues = json.dumps(parameters['ues']) self.only_rx = json.dumps(parameters['only_rx']) - - self.modules_6bits() self.save() @@ -1122,7 +666,6 @@ class ABSBeam(models.Model): return self - def module_6bits(self, module): """ This function reads antenna pattern and choose 6bits (upbits-downbits) for one abs module @@ -1145,30 +688,6 @@ class ABSBeam(models.Model): return beam_bits - def modules_6bits(self): - """ - This function returns 6bits from every abs module (1-64) in a dict - """ - modules_configuration = ast.literal_eval(self.modules_conf) - - for i in range(1,65): - modules_configuration[str(i)] = self.module_6bits(i) - - self.modules_conf = json.dumps(modules_configuration) - self.save() - - return self.modules_conf - - - def set_as_activebeam(self): - """ - This function set this beam as the active beam of its ABS Configuration. - """ - self.abs_conf.active_beam = json.dumps({'active_beam': self.id}) - self.abs_conf.save() - - return - @property def get_upvalues(self): diff --git a/apps/abs/templates/abs_conf.html b/apps/abs/templates/abs_conf.html index 06849ab..70e1469 100644 --- a/apps/abs/templates/abs_conf.html +++ b/apps/abs/templates/abs_conf.html @@ -1,550 +1,476 @@ -{% extends "dev_conf.html" %} - -{% load static %} -{% load bootstrap3 %} -{% load main_tags %} - -{% block extra-menu-actions %} -
  • View Patterns
  • -{% endblock %} - -{% block extra-content %} +{% extends "dev_conf.html" %} {% load static %} {% load bootstrap3 %} {% load main_tags %} +{% block extra-head %} - -{% if status_request %} - -{% endif %} - - +{% endblock %} +{% block extra-menu-actions %} +
  • + + View Patterns +
  • +{% endblock %} +{% block extra-content %} {% if beams %} - - - -

    Beams:

    -
    - - - -
    -
    - - {% if active_beam %} -

    Active Beam: {{active_beam.name}}

    - - - - - - - - - - -
    North Quarter - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{active_beam.get_upvalues.0}} {{active_beam.get_upvalues.1}} {{active_beam.get_upvalues.2}} {{active_beam.get_upvalues.3}}
    {{active_beam.get_downvalues.0}} {{active_beam.get_downvalues.1}} {{active_beam.get_downvalues.2}} {{active_beam.get_downvalues.3}}
    {{active_beam.get_upvalues.8}} {{active_beam.get_upvalues.9}} {{active_beam.get_upvalues.10}} {{active_beam.get_upvalues.11}}
    {{active_beam.get_downvalues.8}} {{active_beam.get_downvalues.9}} {{active_beam.get_downvalues.10}} {{active_beam.get_downvalues.11}}
    {{active_beam.get_upvalues.16}} {{active_beam.get_upvalues.17}} {{active_beam.get_upvalues.18}} {{active_beam.get_upvalues.19}}
    {{active_beam.get_downvalues.16}} {{active_beam.get_downvalues.17}} {{active_beam.get_downvalues.18}} {{active_beam.get_downvalues.19}}
    {{active_beam.get_upvalues.24}} {{active_beam.get_upvalues.25}} {{active_beam.get_upvalues.26}} {{active_beam.get_upvalues.27}}
    {{active_beam.get_downvalues.24}} {{active_beam.get_downvalues.25}} {{active_beam.get_downvalues.26}} {{active_beam.get_downvalues.27}}
    -
    East Quarter - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{active_beam.get_upvalues.4}} {{active_beam.get_upvalues.5}} {{active_beam.get_upvalues.6}} {{active_beam.get_upvalues.7}}
    {{active_beam.get_downvalues.4}} {{active_beam.get_downvalues.5}} {{active_beam.get_downvalues.6}} {{active_beam.get_downvalues.7}}
    {{active_beam.get_upvalues.12}} {{active_beam.get_upvalues.13}} {{active_beam.get_upvalues.14}} {{active_beam.get_upvalues.15}}
    {{active_beam.get_downvalues.12}} {{active_beam.get_downvalues.13}} {{active_beam.get_downvalues.14}} {{active_beam.get_downvalues.15}}
    {{active_beam.get_upvalues.20}} {{active_beam.get_upvalues.21}} {{active_beam.get_upvalues.22}} {{active_beam.get_upvalues.23}}
    {{active_beam.get_downvalues.20}} {{active_beam.get_downvalues.21}} {{active_beam.get_downvalues.22}} {{active_beam.get_downvalues.23}}
    {{active_beam.get_upvalues.28}} {{active_beam.get_upvalues.29}} {{active_beam.get_upvalues.30}} {{active_beam.get_upvalues.31}}
    {{active_beam.get_downvalues.28}} {{active_beam.get_downvalues.29}} {{active_beam.get_downvalues.30}} {{active_beam.get_downvalues.31}}
    -
    West Quarter - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{active_beam.get_upvalues.32}} {{active_beam.get_upvalues.33}} {{active_beam.get_upvalues.34}} {{active_beam.get_upvalues.35}}
    {{active_beam.get_downvalues.32}} {{active_beam.get_downvalues.33}} {{active_beam.get_downvalues.34}} {{active_beam.get_downvalues.35}}
    {{active_beam.get_upvalues.40}} {{active_beam.get_upvalues.41}} {{active_beam.get_upvalues.42}} {{active_beam.get_upvalues.43}}
    {{active_beam.get_downvalues.40}} {{active_beam.get_downvalues.41}} {{active_beam.get_downvalues.42}} {{active_beam.get_downvalues.43}}
    {{active_beam.get_upvalues.48}} {{active_beam.get_upvalues.49}} {{active_beam.get_upvalues.50}} {{active_beam.get_upvalues.51}}
    {{active_beam.get_downvalues.48}} {{active_beam.get_downvalues.49}} {{active_beam.get_downvalues.50}} {{active_beam.get_downvalues.51}}
    {{active_beam.get_upvalues.56}} {{active_beam.get_upvalues.57}} {{active_beam.get_upvalues.58}} {{active_beam.get_upvalues.59}}
    {{active_beam.get_downvalues.56}} {{active_beam.get_downvalues.57}} {{active_beam.get_downvalues.58}} {{active_beam.get_downvalues.59}}
    -
    South Quarter - - - - - - - - - - - - - - - - - - - - - - - - - -
    {{active_beam.get_upvalues.36}} {{active_beam.get_upvalues.37}} {{active_beam.get_upvalues.38}} {{active_beam.get_upvalues.39}}
    {{active_beam.get_downvalues.36}} {{active_beam.get_downvalues.37}} {{active_beam.get_downvalues.38}} {{active_beam.get_downvalues.39}}
    {{active_beam.get_upvalues.44}} {{active_beam.get_upvalues.45}} {{active_beam.get_upvalues.46}} {{active_beam.get_upvalues.47}}
    {{active_beam.get_downvalues.44}} {{active_beam.get_downvalues.45}} {{active_beam.get_downvalues.46}} {{active_beam.get_downvalues.47}}
    {{active_beam.get_upvalues.52}} {{active_beam.get_upvalues.53}} {{active_beam.get_upvalues.54}} {{active_beam.get_upvalues.55}}
    {{active_beam.get_downvalues.52}} {{active_beam.get_downvalues.53}} {{active_beam.get_downvalues.54}} {{active_beam.get_downvalues.55}}
    {{active_beam.get_upvalues.60}} {{active_beam.get_upvalues.61}} {{active_beam.get_upvalues.62}} {{active_beam.get_upvalues.63}}
    {{active_beam.get_downvalues.60}} {{active_beam.get_downvalues.61}} {{active_beam.get_downvalues.62}} {{active_beam.get_downvalues.63}}
    -
    - - - - - - - - - - - - - - - - - -
    Legend
    REDDisconnected
    ORANGEConnected
    GREENRunning
    - - - - - {% else %} -

    This ABS Configuration does not have a current active ABS Beam...
    - Please send Beam List to ABS modules.

    - - {% endif %} - - +

    Beams:

    +
    + + +
    + {% for beam in beams %} + + {% endfor %}
    +
    - {% else %} -

    No Beams...

    - {% endif %} - -{% endblock extra-content %} - - - -{% block extra-js%} +{% else %} +

    + No Beams... +

    +{% endif %} {% endblock extra-content %} {% block extra-js%} -{% endblock %} + }); + {% endblock %} \ No newline at end of file diff --git a/apps/abs/urls.py b/apps/abs/urls.py index 85e4433..488f016 100644 --- a/apps/abs/urls.py +++ b/apps/abs/urls.py @@ -6,7 +6,7 @@ urlpatterns = ( url(r'^(?P-?\d+)/$', views.abs_conf, name='url_abs_conf'), url(r'^(?P-?\d+)/edit/$', views.abs_conf_edit, name='url_edit_abs_conf'), url(r'^(?P-?\d+)/import/$', views.import_file, name='url_import_abs_conf'), - url(r'^(?P-?\d+)/status/', views.abs_conf, {'status_request':True},name='url_status_abs_conf'), + #url(r'^(?P-?\d+)/status/', views.abs_conf, {'status_request':True},name='url_status_abs_conf'), url(r'^(?P-?\d+)/change_beam/(?P-?\d+)/$', views.send_beam, name='url_send_beam'), url(r'^(?P-?\d+)/plot/$', views.plot_patterns, name='url_plot_abs_patterns'), url(r'^(?P-?\d+)/plot/(?P-?\d+)/$', views.plot_patterns, name='url_plot_abs_patterns'), diff --git a/apps/abs/views.py b/apps/abs/views.py index 75e37d1..ac83510 100644 --- a/apps/abs/views.py +++ b/apps/abs/views.py @@ -119,32 +119,31 @@ def get_values_from_form(form_data): return beam_data +def abs_conf(request, id_conf): -def abs_conf(request, id_conf, status_request=None): - - conf = get_object_or_404(ABSConfiguration, pk=id_conf) - beams = ABSBeam.objects.filter(abs_conf=conf) - active_beam_id = json.loads(conf.active_beam) - + conf = get_object_or_404(ABSConfiguration, pk=id_conf) + beams = ABSBeam.objects.filter(abs_conf=conf) #------------Colors for Active Beam:------------- - modules_status = json.loads(conf.module_status) + all_status = {} module_messages = json.loads(conf.module_messages) color_status = {} - for status in modules_status: - if modules_status[status] == 3: #Running background-color: #00cc00; - color_status[status] = 'class=text-success'#'bgcolor=#00cc00' - elif modules_status[status] == 1: #Connected background-color: #ee902c; - color_status[status] = 'class=text-warning'#'bgcolor=#ee902c' - else: #Disconnected background-color: #ff0000; - color_status[status] = 'class=text-danger'#'bgcolor=#FF0000' + for i, status in enumerate(conf.module_status): + if status == '3': #Running background-color: #00cc00; + all_status['{}'.format(i+1)] = 2 + color_status['{}'.format(i+1)] = 'class=text-success'#'bgcolor=#00cc00' + elif status == '1': #Connected background-color: #ee902c; + all_status['{}'.format(i+1)] = 1 + color_status['{}'.format(i+1)] = 'class=text-warning'#'bgcolor=#ee902c' + else: #Disconnected background-color: #ff0000; + all_status['{}'.format(i+1)] = 0 + color_status['{}'.format(i+1)] = 'class=text-danger'#'bgcolor=#FF0000' #------------------------------------------------ kwargs = {} - #kwargs['status'] = conf.device.get_status_display() kwargs['connected_modules'] = str(conf.connected_modules())+'/64' - kwargs['dev_conf'] = conf + if conf.operation_mode == 0: kwargs['dev_conf_keys'] = ['name', 'operation_mode'] else: @@ -152,42 +151,18 @@ def abs_conf(request, id_conf, status_request=None): kwargs['title'] = 'ABS Configuration' kwargs['suptitle'] = 'Details' - #kwargs['no_play'] = True - kwargs['button'] = 'Edit Configuration' - #------------------Active Beam----------------------- - try: - active_beam_id = active_beam_id['active_beam'] - active_beam = ABSBeam.objects.get(pk=active_beam_id) - kwargs['active_beam'] = active_beam - for beam in beams: - if beam.id == active_beam.id: - beam.color_status = color_status - beam.module_messages = module_messages - except: - active_beam = '' - #---------------------------------------------------- - kwargs['beams'] = beams - kwargs['modules_status'] = modules_status + + if conf.active_beam != 0: + kwargs['active_beam'] = int(conf.active_beam) + + kwargs['beams'] = beams + kwargs['modules_status'] = all_status kwargs['color_status'] = color_status kwargs['module_messages'] = module_messages - - #if conf.device.status in [0,1]: - if conf.connected_modules() == 0: - conf.device.status = 0 - messages.error(request, 'No ABS module is connected.')#conf.message) - conf.device.save() - else: - messages.success(request, 'ABS modules are connected.')#conf.message) - ###### SIDEBAR ###### kwargs.update(sidebar(conf=conf)) - if status_request: - conf.status_device() - kwargs['status_request'] = True - return render(request, 'abs_conf.html', kwargs) - return render(request, 'abs_conf.html', kwargs) @@ -196,7 +171,6 @@ def abs_conf_edit(request, id_conf): conf = get_object_or_404(ABSConfiguration, pk=id_conf) beams = ABSBeam.objects.filter(abs_conf=conf) - print beams if request.method=='GET': form = ABSConfigurationForm(instance=conf) @@ -262,9 +236,8 @@ def send_beam(request, id_conf, id_beam): conf = get_object_or_404(ABSConfiguration, pk=id_conf) beam = get_object_or_404(ABSBeam, pk=id_beam) beams_list = ABSBeam.objects.filter(abs_conf=conf) - #To set this beam as an Active Beam - beam.set_as_activebeam() - #To send beam position to abs-modules + conf.active_beam = id_beam + i = 0 for b in beams_list: if b.id == int(id_beam): @@ -273,7 +246,7 @@ def send_beam(request, id_conf, id_beam): i += 1 beam_pos = i + 1 #Estandarizar print '%s Position: %s' % (beam.name, str(beam_pos)) - conf.send_beam_num(beam_pos) + conf.send_beam(beam_pos) return redirect('url_abs_conf', conf.id) @@ -284,7 +257,6 @@ def add_beam(request, id_conf): confs = Configuration.objects.all() if request.method=='GET': - #form = ABSBeamEditForm() form = ABSBeamAddForm() if request.method=='POST': @@ -293,18 +265,15 @@ def add_beam(request, id_conf): beam_data = get_values_from_form(request.POST) new_beam = ABSBeam( - name =beam_data['name'], - antenna =json.dumps(beam_data['antenna']), - abs_conf=conf, - tx =json.dumps(beam_data['tx']), - rx =json.dumps(beam_data['rx']), - ues =json.dumps(beam_data['ues']), - only_rx =json.dumps(beam_data['only_rx']) + name = beam_data['name'], + antenna = json.dumps(beam_data['antenna']), + abs_conf = conf, + tx = json.dumps(beam_data['tx']), + rx = json.dumps(beam_data['rx']), + ues = json.dumps(beam_data['ues']), + only_rx = json.dumps(beam_data['only_rx']) ) new_beam.save() - #---Update 6bits configuration and add beam to abs configuration beams list. - new_beam.modules_6bits() - #new_beam.add_beam2list() messages.success(request, 'Beam: "%s" has been added.' % new_beam.name) return redirect('url_edit_abs_conf', conf.id)