diff --git a/apps/jars/fixtures/initial_filters_data.json b/apps/jars/fixtures/initial_filters_data.json index 17c914d..bd469eb 100644 --- a/apps/jars/fixtures/initial_filters_data.json +++ b/apps/jars/fixtures/initial_filters_data.json @@ -1,2 +1,3 @@ -[{"fields": {"name": "49_920MHz_clock60MHz_F0MHz_12_25_2", "clock": "60", "mult": 5, "fch": 49.92, "fch_decimal": 721554505, "filter_fir": 6, "filter_2": 10, "filter_5": 1, "speed": 0}, "model": "jars.jarsfilter", "pk": 1} - ] +[{"fields": {"name": "49_92MHz_clock60MHz_F1KHz_12_25_2", "clock": 60, "mult": 5, "fch": 49.92, "fch_decimal": 721554506, "filter_fir": 2, "filter_2": 12, "filter_5": 25}, "model": "jars.jarsfilter", "pk": 1} +{"fields": {"name": "49_920MHz_clock60MHz_F1MHz_10_1_6", "clock": 60, "mult": 5, "fch": 49.92, "fch_decimal": 721554506, "filter_fir": 6, "filter_2": 10, "filter_5": 1}, "model": "jars.jarsfilter", "pk": 2} +] diff --git a/apps/jars/forms.py b/apps/jars/forms.py index 8fc4108..6b3125a 100644 --- a/apps/jars/forms.py +++ b/apps/jars/forms.py @@ -4,6 +4,14 @@ from django import forms from apps.main.models import Device, Experiment from .models import JARSConfiguration, JARSfilter from .widgets import SpectralWidget +from apps.main.forms import add_empty_choice + +def create_choices_from_model(model, filter_id=None): + + #instance = globals()[model] + choices = model.objects.all().values_list('pk', 'name') + choices = add_empty_choice(choices) + return choices class JARSConfigurationForm(forms.ModelForm): def __init__(self, *args, **kwargs): @@ -41,16 +49,36 @@ class JARSfilterForm(forms.ModelForm): instance = getattr(self, 'instance', None) self.fields['fch_decimal'].widget.attrs['readonly'] = True - + if 'initial' in kwargs: - self.fields.pop('name') - #self.fields['name'].widget.attrs['disabled'] = 'disabled' - + if 'filter_id' not in kwargs['initial']: + self.fields.pop('name') + else: + self.fields['name'] = forms.ChoiceField(choices=create_choices_from_model(JARSfilter)) + filter_id = kwargs['initial']['filter_id'] + + if filter_id == 0: + for value in self.fields: + if value != 'name': + self.fields.pop(value) + self.fields['name'].label = "Filter Template Name" + else: + self.fields['name'] = forms.ChoiceField(choices=create_choices_from_model(JARSfilter, kwargs['initial']['filter_id'])) + jars_filter = JARSfilter.objects.get(pk=kwargs['initial']['filter_id']) + labels = [f.name for f in jars_filter._meta.get_fields()] + + for label in ['id', 'jarsconfiguration']: + labels.remove(label) + for label in labels: + self.fields['name'].initial = kwargs['initial']['filter_id'] + self.fields[label].initial = getattr(jars_filter,label) + self.fields['name'].label = "Filter Template Name" class Meta: model = JARSfilter exclude = ('type', 'parameters', 'status') + class ExtFileField(forms.FileField): """ Same as forms.FileField, but you can specify a file extension whitelist. diff --git a/apps/jars/models.py b/apps/jars/models.py index ed93116..57f889c 100644 --- a/apps/jars/models.py +++ b/apps/jars/models.py @@ -33,12 +33,11 @@ class JARSfilter(models.Model): name = models.CharField(max_length=60, unique=True, default='') clock = models.FloatField(verbose_name='Clock In (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)], null=True, default=60) mult = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=5) - fch = models.DecimalField(verbose_name='Frequency (MHz)', validators=[MaxValueValidator(150)], max_digits=19, decimal_places=16, null=True, default=49.9200) + fch = models.FloatField(verbose_name='Frequency (MHz)', validators=[MaxValueValidator(150)], null=True, default=49.9200) fch_decimal = models.BigIntegerField(verbose_name='Frequency (Decimal)',validators=[MinValueValidator(-9223372036854775808), MaxValueValidator(2**JARS_NBITS-1)], null=True, default=721554505) filter_2 = models.PositiveIntegerField(verbose_name='Filter 2',validators=[MinValueValidator(2), MaxValueValidator(100)], default = 10) filter_5 = models.PositiveIntegerField(verbose_name='Filter 5',validators=[MinValueValidator(1), MaxValueValidator(100)], default = 1) filter_fir = models.PositiveIntegerField(verbose_name='FIR Filter',validators=[MinValueValidator(1), MaxValueValidator(100)], default = 6) - #speed = models.PositiveIntegerField(verbose_name='Speed',validators=[MinValueValidator(0), MaxValueValidator(100000)], default = 0) class Meta: db_table = 'jars_filters' @@ -58,7 +57,6 @@ class JARSfilter(models.Model): parameters['filter_fir'] = int(self.filter_fir) parameters['filter_2'] = int(self.filter_2) parameters['filter_5'] = int(self.filter_5) - #parameters['speed'] = int(self.speed) return parameters @@ -72,7 +70,6 @@ class JARSfilter(models.Model): self.filter_fir = parameters['filter_fir'] self.filter_2 = parameters['filter_2'] self.filter_5 = parameters['filter_5'] - #self.speed = parameters['speed'] class JARSConfiguration(Configuration): @@ -83,13 +80,10 @@ class JARSConfiguration(Configuration): BEGIN_ON_START = True REFRESH_RATE = 1 - #rc = models.ForeignKey(RCConfiguration, on_delete=models.CASCADE, null=True) exp_type = models.PositiveIntegerField(verbose_name='Experiment Type', choices=EXPERIMENT_TYPE, default=0) cards_number = models.PositiveIntegerField(verbose_name='Number of Cards', validators=[MinValueValidator(1), MaxValueValidator(4)], default = 1) channels_number = models.PositiveIntegerField(verbose_name='Number of Channels', validators=[MinValueValidator(1), MaxValueValidator(8)], default = 5) channels = models.CharField(verbose_name='Channels', max_length=15, default = '1,2,3,4,5') - #rd_directory = models.CharField(verbose_name='Raw Data Directory', max_length=200, default='', blank=True, null=True) - #pd_directory = models.CharField(verbose_name='Process Data Directory', max_length=200, default='', blank=True, null=True) data_type = models.PositiveIntegerField(verbose_name='Data Type', choices=DATA_TYPE, default=0) raw_data_blocks = models.PositiveIntegerField(verbose_name='Raw Data Blocks', validators=[MaxValueValidator(5000)], default=60) profiles_block = models.PositiveIntegerField(verbose_name='Profiles Per Block', default=400) @@ -106,11 +100,10 @@ class JARSConfiguration(Configuration): spectral = models.CharField(verbose_name='Combinations', max_length=5000, default = '[0, 0],') create_directory = models.BooleanField(verbose_name='Create Directory Per Day', default=True) include_expname = models.BooleanField(verbose_name='Experiment Name in Directory', default=False) - #acq_link = models.BooleanField(verbose_name='Acquisition Link', default=True) #view_raw_data = models.BooleanField(verbose_name='View Raw Data', default=True) save_ch_dc = models.BooleanField(verbose_name='Save Channels DC', default=True) save_data = models.BooleanField(verbose_name='Save Data', default=True) - filter_parms = models.CharField(max_length=10000, default='{}') + filter_parms = models.CharField(max_length=10000, default='{"name": "49_92MHz_clock60MHz_F1KHz_12_25_2", "clock": 60, "mult": 5, "fch": 49.92, "fch_decimal": 721554506, "filter_fir": 2, "filter_2": 12, "filter_5": 25}, "model": "jars.jarsfilter", "pk": 1}') class Meta: db_table = 'jars_configurations' @@ -119,6 +112,19 @@ class JARSConfiguration(Configuration): self.filter_parms = self.filter.parms_to_dict() self.save() + def filter_resolution(self): + filter_parms = eval(self.filter_parms) + if filter_parms.__class__.__name__=='str': + filter_parms = eval(filter_parms) + + filter_clock = filter_parms['clock'] + filter_2 = filter_parms['filter_2'] + filter_5 = filter_parms['filter_5'] + filter_fir = filter_parms['filter_fir'] + + resolution = round((filter_clock/(filter_2*filter_5*filter_fir)),2) + return resolution + def dict_to_parms(self, params, id=None): if id is not None: diff --git a/apps/jars/templates/change_jars_filter.html b/apps/jars/templates/change_jars_filter.html new file mode 100644 index 0000000..01a062f --- /dev/null +++ b/apps/jars/templates/change_jars_filter.html @@ -0,0 +1,13 @@ +{% extends "dev_conf_edit.html" %} + +{% block extra-js%} + + +{% endblock %} diff --git a/apps/jars/templates/jars_conf.html b/apps/jars/templates/jars_conf.html index 99944d7..233a273 100644 --- a/apps/jars/templates/jars_conf.html +++ b/apps/jars/templates/jars_conf.html @@ -1 +1,16 @@ -{% extends "dev_conf.html" %} \ No newline at end of file +{% extends "dev_conf.html" %} +{% load static %} +{% load bootstrap3 %} +{% load main_tags %} + + +{% block extra-content %} + +
+

JARS filter: {{resolution}} (MHz)

+
+
+{% include "jars_filter.html" %} +
+ +{% endblock extra-content%} diff --git a/apps/jars/templates/jars_conf_edit.html b/apps/jars/templates/jars_conf_edit.html index 99085fe..f802bde 100644 --- a/apps/jars/templates/jars_conf_edit.html +++ b/apps/jars/templates/jars_conf_edit.html @@ -8,26 +8,25 @@ {% csrf_token %} {% bootstrap_form form layout='horizontal' size='medium' %}
-
-
- - - - +

JARS filter

+
+
+ {% include "jars_filter_edit.html" %}
+
+
{% endblock %} + {% block extra-js%} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/apps/jars/templates/jars_filter.html b/apps/jars/templates/jars_filter.html index 4405559..2922925 100644 --- a/apps/jars/templates/jars_filter.html +++ b/apps/jars/templates/jars_filter.html @@ -1,13 +1,7 @@ -{% extends "base.html" %} {% load bootstrap3 %} {% load static %} {% load main_tags %} -{% block search-active %}active{% endblock %} - -{% block content-title %}{{title}}{% endblock %} -{% block content-suptitle %}{{suptitle}}{% endblock %} - {% block content %} {% block menu-actions %} @@ -15,45 +9,19 @@ {% endblock %} - - {% for key in dev_conf_keys %} - - - - - {% endfor %} + + + + + + + + +
{% get_verbose_field_name dev_conf key %}{{dev_conf|attr:key}}
Clock in (MHz){{filter.clock}}
Multiplier{{filter.mult}}
Frequency (MHz){{filter.fch}}
Frequency (Decimal){{filter.fch_decimal}}
Filter 2{{filter.filter_2}}
Filter 5{{filter.filter_5}}
FIR Filter{{filter.filter_fir}}
-{% if button %} -
- - - -
-{% endif %} -{% block extra-content %} -{% endblock %} +{% block extra-content %} {% endblock %} -{% block sidebar%} -{% include "sidebar_devices.html" %} {% endblock %} - -{% block extra-js%} - -{% endblock %} \ No newline at end of file diff --git a/apps/jars/templates/jars_filter_edit.html b/apps/jars/templates/jars_filter_edit.html index 18bde10..cb3929b 100644 --- a/apps/jars/templates/jars_filter_edit.html +++ b/apps/jars/templates/jars_filter_edit.html @@ -1,4 +1,3 @@ -{% extends "dev_conf_edit.html" %} {% load bootstrap3 %} {% load static %} {% load main_tags %} @@ -6,16 +5,25 @@ {% block content %}
{% csrf_token %} - {% bootstrap_form form layout='horizontal' size='medium' %} + {% bootstrap_form filter_form layout='horizontal' size='medium' %}

- - + + +
{% endblock %} {% block extra-js%} -{% endblock %} \ No newline at end of file + + +{% endblock %} diff --git a/apps/jars/urls.py b/apps/jars/urls.py index b9836f9..618e8d7 100644 --- a/apps/jars/urls.py +++ b/apps/jars/urls.py @@ -6,6 +6,8 @@ urlpatterns = ( url(r'^(?P-?\d+)/$', views.jars_conf, name='url_jars_conf'), url(r'^(?P-?\d+)/edit/$', views.jars_conf_edit, name='url_edit_jars_conf'), url(r'^(?P-?\d+)/new_filter/$', views.new_filter, name='url_new_jars_filter'), + url(r'^(?P-?\d+)/change_filter/$', views.change_filter, name='url_change_jars_filter'), + url(r'^(?P-?\d+)/change_filter/(?P-?\d+)/$', views.change_filter, name='url_change_jars_filter'), url(r'^(?P-?\d+)/view_filter/(?P-?\d+)/$', views.view_filter, name='url_jars_filter'), url(r'^(?P-?\d+)/view_filter/(?P-?\d+)/edit$', views.edit_filter, name='url_edit_jars_filter'), url(r'^(?P-?\d+)/import/$', views.import_file, name='url_import_jars_conf'), diff --git a/apps/jars/views.py b/apps/jars/views.py index 3853264..3fee39a 100644 --- a/apps/jars/views.py +++ b/apps/jars/views.py @@ -8,16 +8,25 @@ from apps.main.views import sidebar from .models import JARSConfiguration, JARSfilter from .forms import JARSConfigurationForm, JARSfilterForm, JARSImportForm + +import json # Create your views here. def jars_conf(request, id_conf): conf = get_object_or_404(JARSConfiguration, pk=id_conf) - ip=conf.device.ip_address - port=conf.device.port_address + filter_parms = eval(conf.filter_parms) + if filter_parms.__class__.__name__=='str': + filter_parms = eval(filter_parms) kwargs = {} + kwargs['filter'] = filter_parms + kwargs['filter_keys'] = ['clock', 'mult', 'fch', 'fch_decimal', + 'filter_fir', 'filter_2', 'filter_5'] + filter_resolution=conf.filter_resolution() + kwargs['resolution'] = filter_resolution + kwargs['status'] = conf.device.get_status_display() @@ -50,24 +59,36 @@ def jars_conf_edit(request, id_conf): conf = get_object_or_404(JARSConfiguration, pk=id_conf) + filter_parms = eval(conf.filter_parms) + if filter_parms.__class__.__name__=='str': + filter_parms = eval(filter_parms) + if request.method=='GET': form = JARSConfigurationForm(instance=conf) + filter_form = JARSfilterForm(initial=filter_parms) if request.method=='POST': form = JARSConfigurationForm(request.POST, instance=conf) + filter_form = JARSfilterForm(request.POST) + + if filter_form.is_valid(): + jars_filter = filter_form.cleaned_data + try: + jars_filter.pop('name') + except: + pass if form.is_valid(): conf = form.save(commit=False) + conf.filter_parms = json.dumps(jars_filter) conf.save() return redirect('url_jars_conf', id_conf=conf.id) - ##ERRORS - kwargs = {} - kwargs['filter_id'] = 1 kwargs['id_dev'] = conf.id kwargs['form'] = form + kwargs['filter_form'] = filter_form kwargs['title'] = 'Device Configuration' kwargs['suptitle'] = 'Edit' kwargs['button'] = 'Save' @@ -244,3 +265,29 @@ def new_filter(request, conf_id): kwargs['dev_conf'] = conf return render(request, 'jars_new_filter.html', kwargs) + + +def change_filter(request, conf_id, filter_id=None): + + conf = get_object_or_404(JARSConfiguration, pk=conf_id) + + if filter_id: + if filter_id.__class__.__name__ not in ['int', 'float']: + filter_id = eval(filter_id) + + if filter_id == 0: + return redirect('url_change_jars_filter', conf_id=conf.id) + + if request.method=='GET': + if not filter_id: + form = JARSfilterForm(initial={'jars_configuration':conf_id, 'filter_id': 0}) + else: + form = JARSfilterForm(initial={'jars_configuration':conf_id, 'filter_id': filter_id}) + + kwargs = {} + kwargs['title'] = 'JARS Configuration' + kwargs['suptitle'] = 'Change Filter' + kwargs['form'] = form + kwargs['conf_id'] = conf.id + kwargs['filter_id'] = filter_id + return render(request, 'change_jars_filter.html', kwargs)