diff --git a/apps/main/fixtures/main_initial_data.json b/apps/main/fixtures/main_initial_data.json index 018f83a..134aa56 100644 --- a/apps/main/fixtures/main_initial_data.json +++ b/apps/main/fixtures/main_initial_data.json @@ -1,11 +1,13 @@ -[ +[[ {"fields": {"name": "JRO", "description": ""}, "model": "main.location", "pk": 1}, {"fields": {"name": "JASMET", "description": ""}, "model": "main.location", "pk": 2}, {"fields": {"name": "SOUSY", "description": ""}, "model": "main.location", "pk": 3}, {"fields": {"name": "JULIA", "description": ""}, "model": "main.location", "pk": 4}, +{"fields": {"name": "CLAIRE", "description": ""}, "model": "main.location", "pk": 4}, {"fields": {"name": "rc", "description": ""}, "model": "main.devicetype", "pk": 1}, {"fields": {"name": "dds", "description": ""}, "model": "main.devicetype", "pk": 2}, {"fields": {"name": "cgs", "description": ""}, "model": "main.devicetype", "pk": 3}, {"fields": {"name": "jars", "description": ""}, "model": "main.devicetype", "pk": 4}, -{"fields": {"name": "abs", "description": ""}, "model": "main.devicetype", "pk": 5} +{"fields": {"name": "abs", "description": ""}, "model": "main.devicetype", "pk": 5}, +{"fields": {"password": "pbkdf2_sha256$24000$6RRL7xETgdgN$ORRPhrITZKzTTZHCm8T+Er6ght415kYKeU7QP3rry5M=", "last_login": null, "is_superuser": true, "username": "admin", "first_name": "", "last_name": "", "email": "admin@admin.com", "is_staff": true, "is_active": true, "date_joined": "2017-01-12T16:10:24.383", "groups": [], "user_permissions": []}, "model": "auth.user", "pk": 1} ] diff --git a/apps/main/forms.py b/apps/main/forms.py index ab8a5a2..505a3cf 100644 --- a/apps/main/forms.py +++ b/apps/main/forms.py @@ -1,7 +1,6 @@ from django import forms from django.utils.safestring import mark_safe -from .models import Device, Experiment, Campaign, Location -from apps.main.models import Configuration +from apps.main.models import Device, Experiment, Campaign, Location, Configuration from django.template.defaultfilters import default FILE_FORMAT = ( @@ -80,6 +79,12 @@ class ExperimentForm(forms.ModelForm): self.fields['start_time'].widget = TimepickerWidget(self.fields['start_time'].widget.attrs) self.fields['end_time'].widget = TimepickerWidget(self.fields['end_time'].widget.attrs) + def save(self): + exp = super(ExperimentForm, self).save() + exp.name = exp.name.replace(' ', '') + exp.save() + return exp + class Meta: model = Experiment exclude = ['status'] @@ -106,10 +111,6 @@ class ConfigurationForm(forms.ModelForm): model = Configuration exclude = ['type', 'created_date', 'programmed_date', 'parameters'] -#class DeviceTypeForm(forms.Form): -# device_type = forms.ChoiceField(choices=add_empty_choice(DeviceType.objects.all().order_by('name').values_list('id', 'name'))) - - class UploadFileForm(forms.Form): file = forms.FileField() @@ -184,9 +185,9 @@ class FilterForm(forms.Form): self.fields[field] = forms.CharField(required=False) class ChangeIpForm(forms.Form): - + ip_address = forms.GenericIPAddressField() mask = forms.GenericIPAddressField(initial='255.255.255.0') gateway = forms.GenericIPAddressField(initial='0.0.0.0') - + dns = forms.GenericIPAddressField(initial='0.0.0.0') diff --git a/apps/main/models.py b/apps/main/models.py index 1dafee7..97ac426 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -1,30 +1,54 @@ +import os +import json import requests +import time from datetime import datetime -from django.template.base import kwarg_re try: from polymorphic.models import PolymorphicModel except: from polymorphic import PolymorphicModel +from django.template.base import kwarg_re from django.db import models from django.core.urlresolvers import reverse +from django.core.validators import MinValueValidator, MaxValueValidator from django.shortcuts import get_object_or_404 +from apps.main.utils import Params +from apps.rc.utils import RCFile from devices.dds import api as dds_api +from devices.dds import data as dds_data -EXP_STATES = ( - (0,'Error'), #RED - (1,'Configured'), #BLUE - (2,'Running'), #GREEN - (3,'Scheduled'), #YELLOW - (4,'Not Configured'), #WHITE + +DEV_PORTS = { + 'rc' : 2000, + 'dds' : 2000, + 'jars' : 2000, + 'usrp' : 2000, + 'cgs' : 8080, + 'abs' : 8080 + } + +RADAR_STATES = ( + (0, 'No connected'), + (1, 'Connected'), + (2, 'Configured'), + (3, 'Running'), + (4, 'Scheduled'), ) -CONF_TYPES = ( - (0, 'Active'), - (1, 'Historical'), +EXPERIMENT_TYPE = ( + (0, 'RAW_DATA'), + (1, 'PDATA'), + ) + +DECODE_TYPE = ( + (0, 'None'), + (1, 'TimeDomain'), + (2, 'FreqDomain'), + (3, 'InvFreqDomain'), ) DEV_STATES = ( @@ -45,23 +69,18 @@ DEV_TYPES = ( ('abs', 'Automatic Beam Switching'), ) -DEV_PORTS = { - 'rc' : 2000, - 'dds' : 2000, - 'jars' : 2000, - 'usrp' : 2000, - 'cgs' : 8080, - 'abs' : 8080 - } - -RADAR_STATES = ( - (0, 'No connected'), - (1, 'Connected'), - (2, 'Configured'), - (3, 'Running'), - (4, 'Scheduled'), +EXP_STATES = ( + (0,'Error'), #RED + (1,'Configured'), #BLUE + (2,'Running'), #GREEN + (3,'Scheduled'), #YELLOW + (4,'Not Configured'), #WHITE ) +CONF_TYPES = ( + (0, 'Active'), + (1, 'Historical'), + ) class Location(models.Model): @@ -136,7 +155,7 @@ class Device(models.Model): return reverse('url_device', args=[str(self.id)]) - def change_ip(self, ip_address, mask, gateway, **kwargs): + def change_ip(self, ip_address, mask, gateway, dns, **kwargs): if self.device_type.name=='dds': try: @@ -157,11 +176,22 @@ class Device(models.Model): return False elif self.device_type.name=='rc': - payload = {'ip': ip_address, - 'dns': kwargs.get('dns', '8.8.8.8'), - 'gateway': gateway, - 'subnet': mask} - req = requests.post(self.url('changeip'), data=payload) + headers = {'content-type': "application/json", + 'cache-control': "no-cache"} + + ip = [int(x) for x in ip_address.split('.')] + dns = [int(x) for x in dns.split('.')] + gateway = [int(x) for x in gateway.split('.')] + subnet = [int(x) for x in mask.split('.')] + + payload = { + "ip": ip, + "dns": dns, + "gateway": gateway, + "subnet": subnet + } + + req = requests.post(self.url('changeip'), data=json.dumps(payload), headers=headers) try: answer = req.json() if answer['changeip']=='ok': @@ -199,78 +229,66 @@ class Campaign(models.Model): else: return u'{}'.format(self.name) - def parms_to_dict(self): - - import json - - parameters = {} - exp_parameters = {} - experiments = Experiment.objects.filter(campaign = self) - - i=1 - for experiment in experiments: - exp_parameters['experiment-'+str(i)] = json.loads(experiment.parms_to_dict()) - i += 1 + def jsonify(self): + data = {} - parameters['experiments'] = exp_parameters - parameters['end_date'] = self.end_date.strftime("%Y-%m-%d") - parameters['start_date'] = self.start_date.strftime("%Y-%m-%d") - parameters['campaign'] = self.__str__() - parameters['tags'] =self.tags + ignored = ('template') - parameters = json.dumps(parameters, indent=2, sort_keys=False) + for field in self._meta.fields: + if field.name in ignored: + continue + data[field.name] = field.value_from_object(self) - return parameters + data['start_date'] = data['start_date'].strftime('%Y-%m-%d') + data['end_date'] = data['end_date'].strftime('%Y-%m-%d') - def import_from_file(self, fp): + return data - import os, json + def parms_to_dict(self): - parms = {} + params = Params() + params.add(self.jsonify(), 'campaigns') - path, ext = os.path.splitext(fp.name) + for exp in Experiment.objects.filter(campaign = self): + params.add(exp.jsonify(), 'experiments') + configurations = Configuration.objects.filter(experiment=exp, type=0) - if ext == '.json': - parms = json.loads(fp.read()) + for conf in configurations: + params.add(conf.jsonify(), 'configurations') + if conf.device.device_type.name=='rc': + for line in conf.get_lines(): + params.add(line.jsonify(), 'lines') - return parms + return params.data def dict_to_parms(self, parms, CONF_MODELS): experiments = Experiment.objects.filter(campaign = self) - configurations = Configuration.objects.filter(experiment = experiments) - - if configurations: - for configuration in configurations: - configuration.delete() if experiments: for experiment in experiments: experiment.delete() - for parms_exp in parms['experiments']: - location = Location.objects.get(name = parms['experiments'][parms_exp]['radar']) - new_exp = Experiment( - name = parms['experiments'][parms_exp]['experiment'], - location = location, - start_time = parms['experiments'][parms_exp]['start_time'], - end_time = parms['experiments'][parms_exp]['end_time'], - ) - new_exp.save() - new_exp.dict_to_parms(parms['experiments'][parms_exp],CONF_MODELS) - new_exp.save() - - self.name = parms['campaign'] - self.start_date = parms['start_date'] - self.end_date = parms['end_date'] - self.tags = parms['tags'] - self.experiments.add(new_exp) - self.save() + for id_exp in parms['experiments']['allIds']: + exp_parms = parms['experiments']['byId'][id_exp] + dum = (datetime.now() - datetime(1970, 1, 1)).total_seconds() + exp = Experiment(name='{}'.format(dum)) + exp.save() + exp.dict_to_parms(parms, CONF_MODELS, id_exp=id_exp) + self.experiments.add(exp) + + camp_parms = parms['campaigns']['byId'][parms['campaigns']['allIds'][0]] + + self.name = '{}-{}'.format(camp_parms['name'], datetime.now().strftime('%y%m%d')) + self.start_date = camp_parms['start_date'] + self.end_date = camp_parms['end_date'] + self.tags = camp_parms['tags'] + self.save() return self - def get_experiments_by_radar(self, radar=None): + def get_experiments_by_radar(self, radar=None): ret = [] if radar: @@ -326,6 +344,25 @@ class Experiment(models.Model): else: return u'%s' % (self.name) + def jsonify(self): + + data = {} + + ignored = ('template') + + for field in self._meta.fields: + if field.name in ignored: + continue + data[field.name] = field.value_from_object(self) + + data['start_time'] = data['start_time'].strftime('%H:%M:%S') + data['end_time'] = data['end_time'].strftime('%H:%M:%S') + data['location'] = self.location.name + data['configurations'] = ['{}'.format(conf.pk) for + conf in Configuration.objects.filter(experiment=self)] + + return data + @property def radar_system(self): return self.location @@ -353,27 +390,24 @@ class Experiment(models.Model): result = 2 - confs = Configuration.objects.filter(experiment=self).order_by('device__device_type__sequence') + confs = Configuration.objects.filter(experiment=self).filter(type = 0).order_by('-device__device_type__sequence') #Only Configured Devices. for conf in confs: - if conf.device.device_type.name == 'rc': - continue - #if conf.device.status in [0,4]: - # result = 0 - # return result - for conf in confs: - if conf.device.device_type.name == 'rc': - continue - if conf.device.status == 1: - pass#conf.write_device() - elif conf.device.status == 3: - pass#conf.stop_device() - #Start Device - for conf in confs: - if conf.device.device_type.name == 'rc': - continue - print 'start: '#conf.start_device() - print conf + dev_status = conf.device.status + if dev_status in [0,4]: + result = 0 + return result + else: + if conf.device.device_type.name != 'jars': + conf.write_device() + time.sleep(1) + print conf.device.name+' has started...' + else: + conf.stop_device() + conf.write_device() + conf.start_device() + print conf.device.name+' has started...' + return result @@ -385,33 +419,22 @@ class Experiment(models.Model): result = 1 - confs = Configuration.objects.filter(experiment=self).order_by('-device__device_type__sequence') - #Only Running Devices. - for conf in confs: - if conf.device.device_type.name == 'rc': - continue - #if conf.device.status in [0,4]: - # result = 0 - # return result - - #Stop Device - for conf in confs: - if conf.device.device_type.name == 'dds': - #conf.stop_device() - confs=confs.exclude(device__device_type__name='dds') - break + confs = Configuration.objects.filter(experiment=self).filter(type = 0).order_by('device__device_type__sequence') for conf in confs: - if conf.device.device_type.name == 'jars': - #conf.stop_device() - confs=confs.exclude(device__device_type__name='jars') - break + dev_status = conf.device.status + if dev_status in [0,4]: + result = 0 + return result + #Stop Device + confs=confs.exclude(device__device_type__name='cgs') for conf in confs: - if conf.device.device_type.name == 'rc': - continue - print 'start: '#conf.stop_device() - print conf + if conf.device.device_type.name != 'rc': + conf.stop_device() + else: + conf.reset_device() + print conf.device.name+' has stopped...' return result @@ -451,79 +474,48 @@ class Experiment(models.Model): def parms_to_dict(self): - import json - - configurations = Configuration.objects.filter(experiment=self).filter(type=0) - conf_parameters = {} - parameters={} - - for configuration in configurations: - conf_parameters[configuration.name] = configuration.parms_to_dict() + params = Params() + params.add(self.jsonify(), 'experiments') - parameters['configurations'] = conf_parameters - parameters['end_time'] = self.end_time.strftime("%H:%M:%S") - parameters['start_time'] = self.start_time.strftime("%H:%M:%S") - parameters['radar'] = self.radar_system.name - parameters['experiment'] = self.name - parameters = json.dumps(parameters, indent=2) + configurations = Configuration.objects.filter(experiment=self, type=0) - return parameters + for conf in configurations: + params.add(conf.jsonify(), 'configurations') + if conf.device.device_type.name=='rc': + for line in conf.get_lines(): + params.add(line.jsonify(), 'lines') - def import_from_file(self, fp): + return params.data - import os, json - - parms = {} - - path, ext = os.path.splitext(fp.name) - - if ext == '.json': - parms = json.loads(fp.read().decode('utf-8')) - - return parms - - def dict_to_parms(self, parms, CONF_MODELS): + def dict_to_parms(self, parms, CONF_MODELS, id_exp=None): configurations = Configuration.objects.filter(experiment=self) + if id_exp is not None: + exp_parms = parms['experiments']['byId'][id_exp] + else: + exp_parms = parms['experiments']['byId'][parms['experiments']['allIds'][0]] + if configurations: 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'] - self.location = location - self.start_time = parms['start_time'] - self.end_time = parms['end_time'] + + for id_conf in exp_parms['configurations']: + conf_parms = parms['configurations']['byId'][id_conf] + device = Device.objects.filter(device_type__name=conf_parms['device_type'])[0] + model = CONF_MODELS[conf_parms['device_type']] + conf = model( + experiment = self, + device = device, + ) + conf.dict_to_parms(parms, id=id_conf) + + + location, created = Location.objects.get_or_create(name=exp_parms['location']) + self.name = '{}-{}'.format(exp_parms['name'], datetime.now().strftime('%y%m%d')) + self.location = location + self.start_time = exp_parms['start_time'] + self.end_time = exp_parms['end_time'] self.save() return self @@ -581,6 +573,37 @@ class Configuration(PolymorphicModel): else: return u'{} {}'.format(device, self.name) + def jsonify(self): + + data = {} + + ignored = ('type', 'polymorphic_ctype', 'configuration_ptr', + 'created_date', 'programmed_date', 'template', 'device', + 'experiment') + + for field in self._meta.fields: + if field.name in ignored: + continue + data[field.name] = field.value_from_object(self) + + data['device_type'] = self.device.device_type.name + + if self.device.device_type.name == 'rc': + data['lines'] = ['{}'.format(line.pk) for line in self.get_lines()] + data['delays'] = self.get_delays() + data['pulses'] = self.get_pulses() + + elif self.device.device_type.name == 'jars': + data['decode_type'] = DECODE_TYPE[self.decode_data][1] + + elif self.device.device_type.name == 'dds': + data['frequencyA_Mhz'] = float(data['frequencyA_Mhz']) + data['frequencyB_Mhz'] = float(data['frequencyB_Mhz']) + data['phaseA'] = dds_data.phase_to_binary(data['phaseA_degrees']) + data['phaseB'] = dds_data.phase_to_binary(data['phaseB_degrees']) + + return data + def clone(self, **kwargs): self.pk = None @@ -594,12 +617,14 @@ class Configuration(PolymorphicModel): def parms_to_dict(self): - parameters = {} + params = Params() + params.add(self.jsonify(), 'configurations') - for key in self.__dict__.keys(): - parameters[key] = getattr(self, key) + if self.device.device_type.name=='rc': + for line in self.get_lines(): + params.add(line.jsonify(), 'lines') - return parameters + return params.data def parms_to_text(self): @@ -611,17 +636,28 @@ class Configuration(PolymorphicModel): raise NotImplementedError("This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper()) - def dict_to_parms(self, parameters): + def dict_to_parms(self, parameters, id=None): + + params = Params(parameters) + + if id: + data = params.get_conf(id_conf=id) + else: + data = params.get_conf(dtype=self.device.device_type.name) - if type(parameters) != type({}): - return + if data['device_type']=='rc': + self.clean_lines() + lines = data.pop('lines', None) + for line_id in lines: + pass - for key in parameters.keys(): - setattr(self, key, parameters[key]) + for key, value in data.items(): + if key not in ('id', 'device_type'): + setattr(self, key, value) - def export_to_file(self, format="json"): + self.save() - import json + def export_to_file(self, format="json"): content_type = '' @@ -632,7 +668,7 @@ class Configuration(PolymorphicModel): if format == 'binary': content_type = 'application/octet-stream' - filename = '%s_%s.dat' %(self.device.device_type.name, self.name) + filename = '%s_%s.bin' %(self.device.device_type.name, self.name) content = self.parms_to_binary() if not content_type: @@ -647,9 +683,7 @@ class Configuration(PolymorphicModel): return fields - def import_from_file(self, fp): - - import os, json + def import_from_file(self, fp): parms = {} @@ -658,6 +692,13 @@ class Configuration(PolymorphicModel): if ext == '.json': parms = json.load(fp) + if ext == '.dds': + lines = fp.readlines() + parms = dds_data.text_to_dict(lines) + + if ext == '.racp': + parms = RCFile(fp).to_dict() + return parms def status_device(self): diff --git a/apps/main/views.py b/apps/main/views.py index 5897e4c..a0d5d14 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -479,7 +479,7 @@ def campaign_export(request, id_camp): response = HttpResponse(content_type=content_type) response['Content-Disposition'] = 'attachment; filename="%s"' %filename - response.write(content) + response.write(json.dumps(content, indent=2)) return response @@ -496,17 +496,9 @@ def campaign_import(request, id_camp): file_form = UploadFileForm(request.POST, request.FILES) if file_form.is_valid(): - - parms = campaign.import_from_file(request.FILES['file']) - - if parms: - parms['name'] = parms['campaign'] - - new_camp = campaign.dict_to_parms(parms, CONF_MODELS) - - messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name) - - return redirect(new_camp.get_absolute_url_edit()) + new_camp = campaign.dict_to_parms(json.load(request.FILES['file']), CONF_MODELS) + messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name) + return redirect(new_camp.get_absolute_url_edit()) messages.error(request, "Could not import parameters from file") @@ -543,12 +535,12 @@ def experiments(request): def experiment(request, id_exp): experiment = get_object_or_404(Experiment, pk=id_exp) - #experiment.get_status() + configurations = Configuration.objects.filter(experiment=experiment, type=0) kwargs = {} - kwargs['experiment_keys'] = ['radar_system', 'name', 'start_time', 'end_time'] + kwargs['experiment_keys'] = ['template', 'radar_system', 'name', 'freq', 'start_time', 'end_time'] kwargs['experiment'] = experiment kwargs['configuration_keys'] = ['name', 'device__ip_address', 'device__port_address', 'device__status'] @@ -581,7 +573,7 @@ def experiment_new(request, id_camp=None): kwargs['configuration_keys'] = ['name', 'device__name', 'device__ip_address', 'device__port_address'] exp=Experiment.objects.get(pk=request.GET['template']) form = ExperimentForm(instance=exp, - initial={'name': '{} [{:%Y/%m/%d}]'.format(exp.name, datetime.now()), + initial={'name': '{}_{:%y%m%d}'.format(exp.name, datetime.now()), 'template': False}) elif 'blank' in request.GET: kwargs['button'] = 'Create' @@ -668,7 +660,7 @@ def experiment_export(request, id_exp): response = HttpResponse(content_type=content_type) response['Content-Disposition'] = 'attachment; filename="%s"' %filename - response.write(content) + response.write(json.dumps(content, indent=2)) return response @@ -686,20 +678,9 @@ def experiment_import(request, id_exp): file_form = UploadFileForm(request.POST, request.FILES) if file_form.is_valid(): - - parms = experiment.import_from_file(request.FILES['file']) - - if parms: - - 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()) + new_exp = experiment.dict_to_parms(json.load(request.FILES['file']), CONF_MODELS) + messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name) + return redirect(new_exp.get_absolute_url_edit()) messages.error(request, "Could not import parameters from file") @@ -717,32 +698,19 @@ def experiment_import(request, id_exp): @user_passes_test(lambda u:u.is_staff) def experiment_start(request, id_exp): - exp = get_object_or_404(Experiment, pk=id_exp) - - confs = Configuration.objects.filter(experiment=exp, type=0) - if not confs: - messages.error(request, 'Experiment not running. No Device Configurations detected.') - return redirect(exp.get_absolute_url()) - - for conf in confs: - conf.status_device() - if conf.device.status != 2: - messages.error(request, 'Experiment not running. Configuration {} state: '.format(conf) + DEV_STATES[conf.device.status][1]) - return redirect(exp.get_absolute_url()) + def experiment_start(request, id_exp): - exp.get_status() + exp = get_object_or_404(Experiment, pk=id_exp) if exp.status == 2: - messages.warning(request, 'Experiment {} already running'.format(exp)) + messages.warning(request, 'Experiment {} already runnnig'.format(exp)) else: - task = task_start.delay(exp.pk) - exp.status = task.wait() - + exp.status = exp.start() if exp.status==0: messages.error(request, 'Experiment {} not start'.format(exp)) if exp.status==2: messages.success(request, 'Experiment {} started'.format(exp)) - task_status.delay(exp.pk) #background get_status function + exp.save() return redirect(exp.get_absolute_url()) @@ -752,24 +720,26 @@ def experiment_start(request, id_exp): def experiment_stop(request, id_exp): exp = get_object_or_404(Experiment, pk=id_exp) - confs = Configuration.objects.filter(experiment=exp, type=0) - if not confs: - messages.error(request, 'No Device Configurations detected.') - return redirect(exp.get_absolute_url()) - - exp.get_status() if exp.status == 2: - task = task_stop.delay(exp.pk) - exp.status = task.wait() - messages.warning(request, 'Experiment {} stopped'.format(exp)) + exp.status = exp.stop() exp.save() + messages.success(request, 'Experiment {} stopped'.format(exp)) else: messages.error(request, 'Experiment {} not running'.format(exp)) return redirect(exp.get_absolute_url()) +def experiment_status(request, id_exp): + + exp = get_object_or_404(Experiment, pk=id_exp) + + exp.get_status() + + return redirect(exp.get_absolute_url()) + + @user_passes_test(lambda u:u.is_staff) def experiment_mix(request, id_exp): @@ -882,7 +852,7 @@ def experiment_summary(request, id_exp): kwargs = {} - kwargs['experiment_keys'] = ['radar_system', 'name', 'start_time', 'end_time'] + kwargs['experiment_keys'] = ['radar_system', 'name', 'freq', 'start_time', 'end_time'] kwargs['experiment'] = experiment kwargs['configurations'] = [] @@ -892,8 +862,15 @@ def experiment_summary(request, id_exp): kwargs['button'] = 'Verify Parameters' + c_vel = 3.0*(10**8) #m/s + ope_freq = experiment.freq*(10**6) #1/s + radar_lambda = c_vel/ope_freq #m + kwargs['radar_lambda'] = radar_lambda + jars_conf = False rc_conf = False + code_id = 0 + tx_line = {} for configuration in configurations: @@ -907,6 +884,9 @@ def experiment_summary(request, id_exp): configuration.tx_lines = [] for tx_line in lines: + if tx_line.get_name()[-1] == 'A': + txa_line = tx_line + txa_params = json.loads(txa_line.params) line = {'name':tx_line.get_name()} tx_params = json.loads(tx_line.params) line['width'] = tx_params['pulse_width'] @@ -922,6 +902,7 @@ def experiment_summary(request, id_exp): for code_line in configuration.get_lines(line_type__name='codes'): code_params = json.loads(code_line.params) + code_id = code_params['code'] if tx_line.pk==int(code_params['TX_ref']): line['codes'] = '{}:{}'.format(RCLineCode.objects.get(pk=code_params['code']), '-'.join(code_params['codes'])) @@ -930,12 +911,16 @@ def experiment_summary(request, id_exp): win_params = json.loads(windows_line.params) if tx_line.pk==int(win_params['TX_ref']): windows = '' + nsa = win_params['params'][0]['number_of_samples'] for i, params in enumerate(win_params['params']): windows += 'W{}: Ho={first_height} km DH={resolution} km NSA={number_of_samples}
'.format(i, **params) line['windows'] = mark_safe(windows) configuration.tx_lines.append(line) + if txa_line: + kwargs['duty_cycle'] = float(txa_params['pulse_width'])/ipp*100 + #-------------------- JARS -----------------------: if configuration.device.device_type.name == 'jars': jars_conf = True @@ -946,34 +931,71 @@ def experiment_summary(request, id_exp): filter_parms = configuration.filter_parms filter_parms = ast.literal_eval(filter_parms) spectral_number = configuration.spectral_number + acq_profiles = configuration.acq_profiles + cohe_integr = configuration.cohe_integr + profiles_block = configuration.profiles_block + if filter_parms.__class__.__name__=='str': + filter_parms = eval(filter_parms) kwargs['configurations'].append(configuration) #------ RC & JARS ------: - ipp = 937.5 # - nsa = 200# - dh = 1.5 # - channels_number = 5 # - if rc_conf and jars_conf: + #RC filter values: + if exp_type == 0: #Short - bytes = 2 - b = nsa*2*bytes*channels_number + bytes_ = 2 + b = nsa*2*bytes_*channels_number else: #Float - bytes = 4 + bytes_ = 4 channels = channels_number + spectral_number - b = nsa*2*bytes*fftpoints*channels - - ipps = (ipp*pow(10,-6))/0.15 - GB = 1048576.0*1024.0 - Hour = 3600 - rate = b/ipps - rate = rate *(1/GB)*(Hour) - kwargs['rate'] = str(rate)+" GB/h" + b = nsa*2*bytes_*fftpoints*channels + + codes_num = 7 + if code_id == 2: + codes_num = 7 + elif code_id == 12: + codes_num = 15 + + #Jars filter values: + try: + clock = eval(filter_parms['clock']) + filter_2 = eval(filter_parms['filter_2']) + filter_5 = eval(filter_parms['filter_5']) + filter_fir = eval(filter_parms['filter_fir']) + except: + clock = float(filter_parms['clock']) + filter_2 = int(filter_parms['filter_2']) + filter_5 = int(filter_parms['filter_5']) + filter_fir = int(filter_parms['filter_fir']) + Fs_MHz = clock/(filter_2*filter_5*filter_fir) + + #Jars values: + IPP_units = ipp/0.15*Fs_MHz + IPP_us = IPP_units / Fs_MHz + IPP_s = IPP_units / (Fs_MHz * (10**6)) + Ts = 1/(Fs_MHz*(10**6)) + + #Values + Va = radar_lambda/(4*Ts*cohe_integr) + rate_bh = ((nsa-codes_num)*channels_number*2*bytes_/IPP_us)*(36*(10**8)/cohe_integr) + rate_gh = rate_bh/(1024*1024*1024) + kwargs['rate_bh'] = str(rate_bh) + " (Bytes/h)" + kwargs['rate_gh'] = str(rate_gh)+" (GBytes/h)" + kwargs['va'] = Va + kwargs['time_per_block'] = IPP_s * profiles_block * cohe_integr + kwargs['acqtime'] = IPP_s * acq_profiles + kwargs['vrange'] = 3/(2*IPP_s*cohe_integr) + else: - kwargs['rate'] = '' + kwargs['rate_bh'] = '' + kwargs['rate_gh'] = '' + kwargs['va'] = '' + kwargs['time_per_block'] = '' + kwargs['acqtime'] = '' + kwargs['vrange'] = '' ###### SIDEBAR ###### kwargs.update(sidebar(experiment=experiment)) @@ -985,7 +1007,7 @@ def experiment_summary(request, id_exp): def experiment_verify(request, id_exp): experiment = get_object_or_404(Experiment, pk=id_exp) - experiment_data = json.loads(experiment.parms_to_dict()) + experiment_data = experiment.parms_to_dict() configurations = Configuration.objects.filter(experiment=experiment, type=0) kwargs = {} @@ -1012,14 +1034,14 @@ def experiment_verify(request, id_exp): jars_conf = True jars = configuration kwargs['jars_conf'] = jars_conf - filter_parms = configuration.filter_parms + filter_parms = jars.filter_parms filter_parms = ast.literal_eval(filter_parms) kwargs['filter_parms'] = filter_parms #--Sampling Frequency - clock = filter_parms['clock'] - filter_2 = filter_parms['filter_2'] - filter_5 = filter_parms['filter_5'] - filter_fir = filter_parms['filter_fir'] + clock = eval(filter_parms['clock']) + filter_2 = eval(filter_parms['filter_2']) + filter_5 = eval(filter_parms['filter_5']) + filter_fir = eval(filter_parms['filter_fir']) samp_freq_jars = clock/filter_2/filter_5/filter_fir kwargs['samp_freq_jars'] = samp_freq_jars @@ -1055,15 +1077,15 @@ def experiment_verify(request, id_exp): #------------Validation------------: #Clock if dds_conf and rc_conf and jars_conf: - if float(filter_parms['clock']) != float(rc_parms['clock_in']) and float(rc_parms['clock_in']) != float(dds_parms['clock']): + if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) and float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']): messages.warning(request, "Devices don't have the same clock.") elif rc_conf and jars_conf: - if float(filter_parms['clock']) != float(rc_parms['clock_in']): + if float(filter_parms['clock']) != float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']): messages.warning(request, "Devices don't have the same clock.") elif rc_conf and dds_conf: - if float(rc_parms['clock_in']) != float(dds_parms['clock']): + if float(rc_parms['configurations']['byId'][str(rc.pk)]['clock_in']) != float(dds_parms['configurations']['byId'][str(dds.pk)]['clock']): messages.warning(request, "Devices don't have the same clock.") - if float(samp_freq_rc) != float(dds_parms['frequencyA']): + if float(samp_freq_rc) != float(dds_parms['configurations']['byId'][str(dds.pk)]['frequencyA']): messages.warning(request, "Devices don't have the same Frequency A.") @@ -1228,7 +1250,7 @@ def dev_conf_new(request, id_exp=0, id_dev=0): id_dev = conf.device.pk DevConfForm = CONF_FORMS[conf.device.device_type.name] form = DevConfForm(instance=conf, - initial={'name': '{} [{:%Y/%m/%d}]'.format(conf.name, datetime.now()), + initial={'name': '{}_{:%y%m%d}'.format(conf.name, datetime.now()), 'template': False, 'experiment':id_exp}) elif 'blank' in request.GET: @@ -1252,6 +1274,15 @@ def dev_conf_new(request, id_exp=0, id_dev=0): for line in lines: line.clone(rc_configuration=conf) + new_lines = conf.get_lines() + for line in new_lines: + line_params = json.loads(line.params) + if 'TX_ref' in line_params: + ref_line = RCLine.objects.get(pk=line_params['TX_ref']) + line_params['TX_ref'] = ['{}'.format(l.pk) for l in new_lines if l.get_name()==ref_line.get_name()][0] + line.params = json.dumps(line_params) + line.save() + if conf.device.device_type.name=='jars': conf.add_parms_to_filter() @@ -1342,6 +1373,19 @@ def dev_conf_status(request, id_conf): @user_passes_test(lambda u:u.is_staff) +def dev_conf_reset(request, id_conf): + + conf = get_object_or_404(Configuration, pk=id_conf) + + if conf.reset_device(): + messages.success(request, conf.message) + else: + messages.error(request, conf.message) + + return redirect(conf.get_absolute_url()) + + +@user_passes_test(lambda u:u.is_staff) def dev_conf_write(request, id_conf): conf = get_object_or_404(Configuration, pk=id_conf) @@ -1409,10 +1453,11 @@ def dev_conf_import(request, id_conf): if file_form.is_valid(): - parms = conf.import_from_file(request.FILES['file']) + data = conf.import_from_file(request.FILES['file']) + parms = Params(data=data).get_conf(dtype=conf.device.device_type.name) if parms: - messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name) + form = DevConfForm(initial=parms, instance=conf) kwargs = {} @@ -1427,6 +1472,8 @@ def dev_conf_import(request, id_conf): ###### SIDEBAR ###### kwargs.update(sidebar(conf=conf)) + messages.success(request, "Parameters imported from: '%s'." %request.FILES['file'].name) + return render(request, '%s_conf_edit.html' % conf.device.device_type.name, kwargs) messages.error(request, "Could not import parameters from file")