From dcc1f42e1d88b2dc25ad9eff7ba2341fe3b45248 2017-02-20 22:21:45 From: Fiorella Quino Date: 2017-02-20 22:21:45 Subject: [PATCH] import/export functions have been updated git-svn-id: http://jro-dev.igp.gob.pe/svn/jro_hard/radarsys/trunk/webapp@269 aa17d016-51d5-4e8b-934c-7b2bbb1bbe71 --- diff --git a/apps/cgs/models.py b/apps/cgs/models.py index f36b588..97b5231 100644 --- a/apps/cgs/models.py +++ b/apps/cgs/models.py @@ -37,6 +37,7 @@ class CGSConfiguration(Configuration): parameters = {} parameters['device_id'] = self.device.id + parameters['device_type'] = self.device.device_type.name if self.freq0 == None or self.freq0 == '': parameters['freq0'] = 0 diff --git a/apps/dds/models.py b/apps/dds/models.py index 16f9fd6..d77d69a 100644 --- a/apps/dds/models.py +++ b/apps/dds/models.py @@ -74,6 +74,7 @@ class DDSConfiguration(Configuration): parameters = {} parameters['device_id'] = self.device.id + parameters['device_type'] = self.device.device_type.name parameters['clock'] = float(self.clock) parameters['multiplier'] = int(self.multiplier) @@ -155,18 +156,18 @@ class DDSConfiguration(Configuration): try: answer = api.status(ip = self.device.ip_address, - port = self.device.port_address) - if 'clock' in answer: + port = self.device.port_address) + if 'clock' in answer: self.device.status = 1 else: - self.device.status = answer[0] - self.message = 'DDS - {}'.format(answer[2:]) + self.device.status = answer[0] + self.message = 'DDS - {}'.format(answer[2:]) except Exception as e: - self.message = str(e) + self.message = str(e) self.device.status = 0 - + self.device.save() - + if self.device.status in (0, '0'): return False else: @@ -189,9 +190,9 @@ class DDSConfiguration(Configuration): try: answer = api.disable_rf(ip = self.device.ip_address, port = self.device.port_address) - + return self.status_device() - + except Exception as e: self.message = str(e) return False @@ -201,9 +202,9 @@ class DDSConfiguration(Configuration): try: answer = api.enable_rf(ip = self.device.ip_address, port = self.device.port_address) - + return self.status_device() - + except Exception as e: self.message = str(e) return False @@ -226,12 +227,12 @@ class DDSConfiguration(Configuration): answer = api.write_config(ip = self.device.ip_address, port = self.device.port_address, parms = self.parms_to_dict()) - + return self.status_device() - + except Exception as e: self.message = str(e) - return False - + return False + class Meta: db_table = 'dds_configurations' diff --git a/apps/jars/models.py b/apps/jars/models.py index 7b0d1a2..f6ca8fc 100644 --- a/apps/jars/models.py +++ b/apps/jars/models.py @@ -112,6 +112,7 @@ class JARSConfiguration(Configuration): parameters['device_id'] = self.device.id parameters['name'] = self.name + parameters['device_type'] = self.device.device_type.name #parameters['rc'] = self.rc.name parameters['exp_type'] = self.exp_type parameters['exptype'] = EXPERIMENT_TYPE[self.exp_type][1] diff --git a/apps/main/models.py b/apps/main/models.py index 9368bd5..03ca940 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -139,7 +139,7 @@ class Device(models.Model): def change_ip(self, ip_address, mask, gateway, **kwargs): if self.device_type.name=='dds': - try: + try: answer = dds_api.change_ip(ip = self.ip_address, port = self.port_address, new_ip = ip_address, @@ -155,16 +155,16 @@ class Device(models.Model): except Exception as e: self.message = '40|{}'.format(str(e)) return False - + elif self.device_type.name=='rc': payload = {'ip': ip_address, 'dns': kwargs.get('dns', '8.8.8.8'), 'gateway': gateway, - 'subnet': mask} + 'subnet': mask} req = requests.post(self.url('changeip'), data=payload) try: answer = req.json() - if answer['changeip']=='ok': + if answer['changeip']=='ok': self.message = '25|IP succesfully changed' self.ip_address = ip_address self.save() @@ -396,7 +396,7 @@ class Experiment(models.Model): result = 1 confs = Configuration.objects.filter(experiment=self).order_by('-device__device_type__sequence') - for i in range(0,len(confs)): + for i in range(0,len(confs)): if i==0: for conf in confs: if conf.device.device_type.name == 'abs': @@ -431,10 +431,10 @@ class Experiment(models.Model): def get_status(self): confs = Configuration.objects.filter(experiment=self) - + for conf in confs: conf.status_device() - + total = confs.aggregate(models.Sum('device__status'))['device__status__sum'] if total==2*confs.count(): @@ -465,23 +465,12 @@ class Experiment(models.Model): import json - configurations = Configuration.objects.filter(experiment=self) + configurations = Configuration.objects.filter(experiment=self).filter(type=0) conf_parameters = {} parameters={} for configuration in configurations: - if 'cgs' in configuration.device.device_type.name: - conf_parameters['cgs'] = configuration.parms_to_dict() - if 'dds' in configuration.device.device_type.name: - conf_parameters['dds'] = configuration.parms_to_dict() - if 'rc' in configuration.device.device_type.name: - conf_parameters['rc'] = configuration.parms_to_dict() - if 'jars' in configuration.device.device_type.name: - conf_parameters['jars'] = configuration.parms_to_dict() - if 'usrp' in configuration.device.device_type.name: - conf_parameters['usrp'] = configuration.parms_to_dict() - if 'abs' in configuration.device.device_type.name: - conf_parameters['abs'] = configuration.parms_to_dict() + conf_parameters[configuration.name] = configuration.parms_to_dict() parameters['configurations'] = conf_parameters parameters['end_time'] = self.end_time.strftime("%H:%M:%S") @@ -510,56 +499,37 @@ class Experiment(models.Model): configurations = Configuration.objects.filter(experiment=self) if configurations: - for configuration in configurations: - configuration.delete() - - for conf_type in parms['configurations']: - #--For ABS Device: - #--For USRP Device: - #--For JARS Device: - if conf_type == 'jars': - device = get_object_or_404(Device, pk=parms['configurations']['jars']['device_id']) - DevConfModel = CONF_MODELS[conf_type] - confjars_form = DevConfModel( - experiment = self, - name = 'JARS', - device=device, - ) - confjars_form.dict_to_parms(parms['configurations']['jars']) - confjars_form.save() - #--For RC Device: - if conf_type == 'rc': - device = get_object_or_404(Device, pk=parms['configurations']['rc']['device_id']) - DevConfModel = CONF_MODELS[conf_type] - confrc_form = DevConfModel( - experiment = self, - name = 'RC', - device=device, - ) - confrc_form.dict_to_parms(parms['configurations']['rc']) - confrc_form.save() - #--For DDS Device: - if conf_type == 'dds': - device = get_object_or_404(Device, pk=parms['configurations']['dds']['device_id']) - DevConfModel = CONF_MODELS[conf_type] - confdds_form = DevConfModel( - experiment = self, - name = 'DDS', - device=device, - ) - confdds_form.dict_to_parms(parms['configurations']['dds']) - confdds_form.save() - #--For CGS Device: - if conf_type == 'cgs': - device = get_object_or_404(Device, pk=parms['configurations']['cgs']['device_id']) - DevConfModel = CONF_MODELS[conf_type] - confcgs_form = DevConfModel( - experiment = self, - name = 'CGS', - device=device, - ) - confcgs_form.dict_to_parms(parms['configurations']['cgs']) - confcgs_form.save() + for configuration in configurations: + configuration.delete() + #If device is missing. + for configuration in parms['configurations']: + try: + device = Device.objects.filter(device_type__name=parms['configurations'][configuration]['device_type'])[0] + except: + return {'Error': 'Device is not in database. Please create new '+str(parms['configurations'][configuration]['device_type'])+ ' device.'} + + for configuration in parms['configurations']: + device = Device.objects.filter(device_type__name=parms['configurations'][configuration]['device_type'])[0] + if parms['configurations'][configuration]['device_type'] == 'rc': + if bool(parms['configurations'][configuration]['mix']) == False: + DevConfModel = CONF_MODELS[parms['configurations'][configuration]['device_type']] + new_conf = DevConfModel( + experiment = self, + name = configuration, + device = device, + ) + new_conf.dict_to_parms(parms['configurations'][configuration]) + new_conf.save() + else: + DevConfModel = CONF_MODELS[parms['configurations'][configuration]['device_type']] + new_conf = DevConfModel( + experiment = self, + name = configuration, + device = device, + ) + new_conf.dict_to_parms(parms['configurations'][configuration]) + new_conf.save() + location = Location.objects.get(name = parms['radar']) self.name = parms['experiment'] diff --git a/apps/main/templates/experiment_import.html b/apps/main/templates/experiment_import.html index b74ae08..09d4e43 100644 --- a/apps/main/templates/experiment_import.html +++ b/apps/main/templates/experiment_import.html @@ -1 +1 @@ -{% extends "experiment_edit.html" %} \ No newline at end of file +{% extends "experiment_edit.html" %} diff --git a/apps/main/views.py b/apps/main/views.py index 8b777ef..be60248 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -684,7 +684,7 @@ def experiment_import(request, id_exp): if request.method == 'POST': file_form = UploadFileForm(request.POST, request.FILES) - print 'aqui 1' + if file_form.is_valid(): parms = experiment.import_from_file(request.FILES['file']) @@ -693,6 +693,10 @@ def experiment_import(request, id_exp): new_exp = experiment.dict_to_parms(parms, CONF_MODELS) + if new_exp.__class__.__name__=='dict': + messages.error(request, new_exp['Error'] ) + return redirect(experiment.get_absolute_url_import()) + messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name) return redirect(new_exp.get_absolute_url_edit()) diff --git a/apps/rc/models.py b/apps/rc/models.py index b6d369f..8438abd 100644 --- a/apps/rc/models.py +++ b/apps/rc/models.py @@ -135,8 +135,8 @@ class RCConfiguration(Configuration): ''' ''' - ignored = ('parameters', 'type', 'polymorphic_ctype', 'configuration_ptr', - 'created_date', 'programmed_date') + ignored = ('parameters', 'type','polymorphic_ctype', 'configuration_ptr', + 'created_date', 'programmed_date', 'mix') data = {} for field in self._meta.fields: @@ -145,7 +145,9 @@ class RCConfiguration(Configuration): data[field.name] = '{}'.format(field.value_from_object(self)) data['device_id'] = data.pop('device') + data['device_type'] = self.device.device_type.name data['lines'] = [] + data['mix'] = self.mix for line in self.get_lines(): line_data = json.loads(line.params) @@ -237,36 +239,36 @@ class RCConfiguration(Configuration): def get_pulses(self, binary=True): - - pulses = [line.pulses_as_points() for line in self.get_lines()] - tuples = [tup for tups in pulses for tup in tups] + + pulses = [line.pulses_as_points() for line in self.get_lines()] + tuples = [tup for tups in pulses for tup in tups] points = set([x for tup in tuples for x in tup]) points = list(points) - points.sort() + points.sort() states = [] last = [0 for x in pulses] - + for x in points: dum = [] for i,tups in enumerate(pulses): ups = [tup[0] for tup in tups] - dws = [tup[1] for tup in tups] + dws = [tup[1] for tup in tups] if x in ups: dum.append(1) elif x in dws: dum.append(0) else: - dum.append(last[i]) + dum.append(last[i]) states.append(dum) - last = dum + last = dum if binary: ret = [] for flips in states: flips.reverse() - ret.append(int(''.join([str(x) for x in flips]), 2)) + ret.append(int(''.join([str(x) for x in flips]), 2)) states = ret - + return states[:-1] def add_cmd(self, cmd): @@ -277,7 +279,7 @@ class RCConfiguration(Configuration): def add_data(self, value): return (254, value-1) - + def parms_to_binary(self, dat=True): ''' Create "dat" stream to be send to CR @@ -321,9 +323,9 @@ class RCConfiguration(Configuration): states = self.get_pulses(binary=True) - + last = 0 - for flip, delay in zip(states, delays): + for flip, delay in zip(states, delays): data.extend(self.add_data((flip^last)+1)) last = flip while delay>252: @@ -344,7 +346,7 @@ class RCConfiguration(Configuration): data.extend(self.add_data(dh)) # write enable - data.extend(self.add_cmd('ENABLE')) + data.extend(self.add_cmd('ENABLE')) if not dat: return data @@ -401,7 +403,7 @@ class RCConfiguration(Configuration): ax.set_yticks(range(len(labels))) ax.set_yticklabels(labels) ax.set_xlabel = 'Units' - plot = to_bokeh(fig, use_pandas=False) + plot = to_bokeh(fig, use_pandas=False) plot.tools = [PanTool(dimensions=['width']), WheelZoomTool(dimensions=['width']), ResetTool(), SaveTool()] plot.toolbar_location="above" @@ -417,36 +419,36 @@ class RCConfiguration(Configuration): from bokeh.models.sources import ColumnDataSource lines = self.get_lines().reverse() - + N = len(lines) npoints = self.total_units/self.km2unit if km else self.total_units ipp = self.ipp if km else self.ipp*self.km2unit - + hover = HoverTool(tooltips=[("Line", "@name"), ("IPP", "@ipp"), ("X", "@left")]) - - tools = [PanTool(dimensions=['width']), - WheelZoomTool(dimensions=['width']), + + tools = [PanTool(dimensions=['width']), + WheelZoomTool(dimensions=['width']), hover, SaveTool()] - - plot = figure(width=1000, - height=40+N*50, + + plot = figure(width=1000, + height=40+N*50, y_range = (0, N), - tools=tools, + tools=tools, toolbar_location='above', - toolbar_sticky=False,) - + toolbar_sticky=False,) + plot.xaxis.axis_label = 'Km' if km else 'Units' plot.xaxis[0].formatter = PrintfTickFormatter(format='%d') - plot.yaxis.axis_label = 'Pulses' + plot.yaxis.axis_label = 'Pulses' plot.yaxis[0].ticker=FixedTicker(ticks=list(range(N))) plot.yaxis[0].formatter = PrintfTickFormatter(format='Line %d') - for i, line in enumerate(lines): - + for i, line in enumerate(lines): + points = [tup for tup in line.pulses_as_points(km=km) if tup!=(0,0)] - + source = ColumnDataSource(data = dict( bottom = [i for tup in points], top = [i+0.5 for tup in points], @@ -455,7 +457,7 @@ class RCConfiguration(Configuration): ipp = [int(tup[0]/ipp) for tup in points], name = [line.get_name() for tup in points] )) - + plot.quad( bottom = 'bottom', top = 'top', @@ -465,7 +467,7 @@ class RCConfiguration(Configuration): fill_alpha = 0, #line_color = 'blue', ) - + plot.line([0, npoints], [i, i])#, color='blue') return components(plot, CDN) @@ -481,7 +483,7 @@ class RCConfiguration(Configuration): elif payload['status']=='disabled': self.device.status = 2 else: - self.device.status = 1 + self.device.status = 1 self.device.save() self.message = payload['status'] return False @@ -491,32 +493,32 @@ class RCConfiguration(Configuration): self.device.save() self.message = str(e) return False - - self.device.save() - return True + + self.device.save() + return True def reset_device(self): - + try: req = requests.post(self.device.url('reset')) - payload = req.json() + payload = req.json() if payload['reset']=='ok': self.message = 'RC restarted' else: - self.message = 'RC restart not ok' + self.message = 'RC restart not ok' self.device.status = 4 self.device.save() except Exception as e: self.message = str(e) return False - + return True - + def stop_device(self): try: req = requests.post(self.device.url('stop')) - payload = req.json() + payload = req.json() if payload['stop']=='ok': self.device.status = 2 self.device.save() @@ -531,10 +533,10 @@ class RCConfiguration(Configuration): self.device.status = 4 else: self.device.status = 0 - self.message = str(e) + self.message = str(e) self.device.save() - return False - + return False + return True def start_device(self): @@ -554,39 +556,39 @@ class RCConfiguration(Configuration): self.device.status = 4 else: self.device.status = 0 - self.message = str(e) + self.message = str(e) self.device.save() return False - + return True def write_device(self): - - values = zip(self.get_pulses(), + + values = zip(self.get_pulses(), [x-1 for x in self.get_delays()]) - + data = bytearray() - #reset - data.extend((128, 0)) - #disable + #reset + data.extend((128, 0)) + #disable data.extend((129, 0)) - #divider - data.extend((131, self.clock_divider-1)) + #divider + data.extend((131, self.clock_divider-1)) #enable writing data.extend((139, 62)) - + last = 0 - for tup in values: - vals = pack('0 and ranges[0]!='0': dum = self.mask_ranges(tx.pulses_as_points(), ranges) else: - dum = tx.pulses_as_points() - + dum = tx.pulses_as_points() + for i, tup in enumerate(dum): if tup==(0,0): continue code = codes[i%n] - y.extend([(c[0]+tup[0], c[1]+tup[0]) for c in code]) + y.extend([(c[0]+tup[0], c[1]+tup[0]) for c in code]) elif self.line_type.name=='sync': params = json.loads(self.params) @@ -851,7 +853,7 @@ class RCLine(models.Model): y.extend(y_pp) elif self.line_type.name=='windows': - params = json.loads(self.params) + params = json.loads(self.params) if 'params' in params and len(params['params'])>0: tr_params = json.loads(self.get_lines(line_type__name='tr')[0].params) tr_ranges = tr_params['range'].split(',') @@ -861,11 +863,11 @@ class RCLine(models.Model): before=int(self.rc_configuration.time_before*us2unit), sync=self.rc_configuration.sync+self.get_win_ref(p, params['TX_ref'], km2unit)) - + if len(tr_ranges)>0 and tr_ranges[0]!='0': y_win = self.mask_ranges(y_win, tr_ranges) - y.extend(y_win) + y.extend(y_win) elif self.line_type.name=='mix': values = self.rc_configuration.parameters.split('-')