diff --git a/apps/dds/forms.py b/apps/dds/forms.py index 1415a5c..a4d57d6 100644 --- a/apps/dds/forms.py +++ b/apps/dds/forms.py @@ -4,11 +4,6 @@ from .models import DDSConfiguration # from django.core.validators import MinValueValidator, MaxValueValidator -EXT_TYPES = ( - ('dds', '.dds'), - ('json', '.json'), -) - class DDSConfigurationForm(forms.ModelForm): def __init__(self, *args, **kwargs): @@ -26,10 +21,10 @@ class DDSConfigurationForm(forms.ModelForm): self.fields['device'].widget.choices = [(device.id, device) for device in devices] - - def clean(self): - # Custom validation to force an integer when type of unit = "Unit" - return +# +# def clean(self): +# # Custom validation to force an integer when type of unit = "Unit" +# return class Meta: model = DDSConfiguration diff --git a/apps/dds/models.py b/apps/dds/models.py index 0c44067..ba2d7d0 100644 --- a/apps/dds/models.py +++ b/apps/dds/models.py @@ -5,7 +5,7 @@ from apps.main.models import Configuration from django.core.validators import MinValueValidator, MaxValueValidator from django.core.exceptions import ValidationError -from devices.dds import api, data, files +from devices.dds import api, data ENABLE_TYPE = ( (False, 'Disabled'), @@ -32,10 +32,10 @@ class DDSConfiguration(Configuration): frequencyB_Mhz = models.DecimalField(verbose_name='Frequency B (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16, blank=True, null=True) frequencyB = models.BigIntegerField(verbose_name='Frequency B (Decimal)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True) - phaseB_degrees = models.FloatField(verbose_name='Phase B (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True) - phaseA_degrees = models.FloatField(verbose_name='Phase A (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], default=0) + phaseB_degrees = models.FloatField(verbose_name='Phase B (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True) + modulation = models.PositiveIntegerField(verbose_name='Modulation Type', choices = MOD_TYPES, default = 0) amplitude_enabled = models.BooleanField(verbose_name='Amplitude Control', choices=ENABLE_TYPE, default=False) @@ -61,7 +61,10 @@ class DDSConfiguration(Configuration): raise ValidationError({ 'phaseB': 'Phase modulation has to be defined when BPSK modulation is selected' }) - + + self.frequencyA_Mhz = data.binary_to_freq(self.frequencyA, self.clock*self.multiplier) + self.frequencyB_Mhz = data.binary_to_freq(self.frequencyB, self.clock*self.multiplier) + def verify_frequencies(self): return True @@ -72,17 +75,30 @@ class DDSConfiguration(Configuration): parameters['clock'] = float(self.clock) parameters['multiplier'] = int(self.multiplier) + parameters['frequencyA'] = int(self.frequencyA) - parameters['frequencyB'] = int(self.frequencyB) + parameters['frequencyA_Mhz'] = float(self.frequencyA_Mhz) + parameters['phaseA'] = data.phase_to_binary(self.phaseA_degrees) - parameters['phaseB'] = data.phase_to_binary(self.phaseB_degrees) - parameters['frequencyA_Mhz'] = int(self.frequencyA_Mhz) - parameters['frequencyB_Mhz'] = int(self.frequencyB_Mhz) parameters['phaseA_degrees'] = float(self.phaseA_degrees) - parameters['phaseB_degrees'] = float(self.phaseB_degrees) + parameters['modulation'] = int(self.modulation) - parameters['amplitude_enabled'] = int(self.amplitude_enabled) + parameters['amplitude_enabled'] = bool(self.amplitude_enabled) + + if self.frequencyB: + parameters['frequencyB'] = int(self.frequencyB) + parameters['frequencyB_Mhz'] = float(self.frequencyB_Mhz) + else: + parameters['frequencyB'] = 0 + parameters['frequencyB_Mhz'] = 0 + if self.phaseB_degrees: + parameters['phaseB_degrees'] = float(self.phaseB_degrees) + parameters['phaseB'] = data.phase_to_binary(self.phaseB_degrees) + else: + parameters['phaseB_degrees'] = 0 + parameters['phaseB'] = 0 + if self.amplitudeI: parameters['amplitudeI'] = int(self.amplitudeI) else: @@ -95,6 +111,14 @@ class DDSConfiguration(Configuration): return parameters + def parms_to_text(self): + + my_dict = self.parms_to_dict() + + text = data.dict_to_text(my_dict) + + return text + def dict_to_parms(self, parameters): self.clock = parameters['clock'] @@ -109,18 +133,19 @@ class DDSConfiguration(Configuration): self.amplitude_enabled = parameters['amplitude_enabled'] def import_from_file(self, fp): - - import os - + + import os, json + parms = {} - - path, ext = os.path.splitext(fp) - + + path, ext = os.path.splitext(fp.name) + if ext == '.json': - parms = files.read_json_file(fp) - + parms = json.load(fp) + if ext == '.dds': - parms = files.read_dds_file(fp) + lines = fp.readlines() + parms = data.text_to_dict(lines) return parms diff --git a/apps/dds/views.py b/apps/dds/views.py index a83ee90..8cb7d4b 100644 --- a/apps/dds/views.py +++ b/apps/dds/views.py @@ -14,7 +14,7 @@ def dds_conf(request, id_conf): kwargs = {} - kwargs['status'] = conf.device.status + kwargs['status'] = conf.device.get_status_display() # if not kwargs['connected']: # messages.error(request, message=answer) @@ -65,7 +65,7 @@ def dds_conf_edit(request, id_conf): return redirect('url_dds_conf', id_conf=conf.id) ##ERRORS - + kwargs = {} kwargs['id_dev'] = conf.id kwargs['form'] = form diff --git a/apps/main/forms.py b/apps/main/forms.py index 7e611f0..23c643d 100644 --- a/apps/main/forms.py +++ b/apps/main/forms.py @@ -3,6 +3,20 @@ from django.utils.safestring import mark_safe from .models import DeviceType, Device, Experiment, Campaign, Configuration, Location +FILE_FORMAT = ( + ('json', 'json'), + ) + +DDS_FILE_FORMAT = ( + ('json', 'json'), + ('text', 'dds') + ) + +RC_FILE_FORMAT = ( + ('json', 'json'), + ('text', 'rc') + ) + def add_empty_choice(choices, pos=0, label='-----'): if len(choices)>0: choices = list(choices) @@ -68,10 +82,22 @@ class DeviceTypeForm(forms.Form): class UploadFileForm(forms.Form): file = forms.FileField() - + class DownloadFileForm(forms.Form): - format = forms.ComboField() + format = forms.ChoiceField(choices= ((0, 'json'),) ) + + def __init__(self, device_type, *args, **kwargs): + + super(DownloadFileForm, self).__init__(*args, **kwargs) + + self.fields['format'].choices = FILE_FORMAT + + if device_type == 'dds': + self.fields['format'].choices = DDS_FILE_FORMAT + + if device_type == 'rc': + self.fields['format'].choices = RC_FILE_FORMAT class OperationForm(forms.Form): # today = datetime.today() diff --git a/apps/main/models.py b/apps/main/models.py index ac9c19a..eb6bd0d 100644 --- a/apps/main/models.py +++ b/apps/main/models.py @@ -163,9 +163,9 @@ class Configuration(PolymorphicModel): db_table = 'db_configurations' def __unicode__(self): - return u'[%s - %s]: %s' % (self.experiment.name, - self.experiment.name, - self.device.name) + return u'[%s, %s]: %s' % (self.experiment.name, + self.device.name, + self.name) def parms_to_dict(self): @@ -176,6 +176,18 @@ class Configuration(PolymorphicModel): return parameters + def parms_to_text(self): + + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() + + return '' + + def parms_to_binary(self): + + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() + + return '' + def dict_to_parms(self, parameters): if type(parameters) != type({}): @@ -188,19 +200,22 @@ class Configuration(PolymorphicModel): import json - content_type = 'application/json' - filename = '%s.json' %self.name - content = json.dumps(self.params_to_dict()) + content_type = '' if format == 'text': content_type = 'text/plain' - filename = '%s.%s' %(self.name, self.device.device_type.name) - content = self.params_to_text() + filename = '%s_%s.%s' %(self.device.device_type.name, self.name, self.device.device_type.name) + content = self.parms_to_text() if format == 'binary': content_type = 'application/octet-stream' - filename = '%s.bin' %self.name - content = self.params_to_binary() + filename = '%s_%s.bin' %(self.device.device_type.name, self.name) + content = self.parms_to_binary() + + if not content_type: + content_type = 'application/json' + filename = '%s_%s.json' %(self.device.device_type.name, self.name) + content = json.dumps(self.parms_to_dict()) fields = {'content_type':content_type, 'filename':filename, @@ -209,39 +224,46 @@ class Configuration(PolymorphicModel): return fields - def import_from_file(self, filename): + def import_from_file(self, fp): + + import os, json + + parms = {} + + path, ext = os.path.splitext(fp.name) - raise NotImplementedError, "This method should be implemented in each Configuration model" + if ext == '.json': + parms = json.load(fp) - return {} + return parms def status_device(self): - raise NotImplementedError, "This method should be implemented in each Configuration model" + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() return None def stop_device(self): - raise NotImplementedError, "This method should be implemented in each Configuration model" + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() return None def start_device(self): - raise NotImplementedError, "This method should be implemented in each Configuration model" + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() return None def write_device(self, parms): - raise NotImplementedError, "This method should be implemented in each Configuration model" + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() return None def read_device(self): - raise NotImplementedError, "This method should be implemented in each Configuration model" + raise NotImplementedError, "This method should be implemented in %s Configuration model" %str(self.device.device_type.name).upper() return None diff --git a/apps/main/templates/base.html b/apps/main/templates/base.html index 926318d..73f6681 100644 --- a/apps/main/templates/base.html +++ b/apps/main/templates/base.html @@ -41,11 +41,13 @@