From e61e12b2d8beea7447c06bf2db2e1fc86346c80b 2019-03-05 19:32:08 From: Juan C. Espinoza Date: 2019-03-05 19:32:08 Subject: [PATCH] Add compatibility with embed CGS in RC --- diff --git a/.env b/.env index e713735..cf2fd7f 100644 --- a/.env +++ b/.env @@ -1,10 +1,10 @@ REDIS_HOST=radarsys-redis REDIS_PORT=6379 -POSTGRES_DB_NAME=radarsys POSTGRES_PORT_5432_TCP_ADDR=radarsys-postgres POSTGRES_PORT_5432_TCP_PORT=5432 -POSTGRES_USER=docker -POSTGRES_PASSWORD=docker +DB_NAME=radarsys +DB_USER=docker +DB_PASSWORD=docker PGDATA=/var/lib/postgresql/data LC_ALL=C.UTF-8 TZ=America/Lima diff --git a/apps/main/templates/dev_conf.html b/apps/main/templates/dev_conf.html index 33aaba9..9c20ff9 100644 --- a/apps/main/templates/dev_conf.html +++ b/apps/main/templates/dev_conf.html @@ -33,6 +33,7 @@ {% endblock %} +{% block content-detail %} @@ -46,6 +47,7 @@ {% endfor %}
Status
+{% endblock %} {% block extra-content %} {% endblock %} diff --git a/apps/main/views.py b/apps/main/views.py index 09bf64d..4bce831 100644 --- a/apps/main/views.py +++ b/apps/main/views.py @@ -36,7 +36,7 @@ from apps.cgs.models import CGSConfiguration from apps.jars.models import JARSConfiguration, EXPERIMENT_TYPE from apps.usrp.models import USRPConfiguration from apps.abs.models import ABSConfiguration -from apps.rc.models import RCConfiguration, RCLine, RCLineType +from apps.rc.models import RCConfiguration, RCLine, RCLineType, RCClock from apps.dds.models import DDSConfiguration from radarsys.celery import app @@ -1368,6 +1368,9 @@ def dev_conf_new(request, id_exp=0, id_dev=0): l.pk) for l in new_lines if l.get_name() == ref_line.get_name()][0] line.params = json.dumps(line_params) line.save() + elif conf.device.device_type.name == 'rc': + clk = RCClock(rc_configuration=conf) + clk.save() return redirect('url_dev_conf', id_conf=conf.pk) diff --git a/apps/rc/admin.py b/apps/rc/admin.py index 92356f0..555c362 100644 --- a/apps/rc/admin.py +++ b/apps/rc/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import RCConfiguration, RCLine, RCLineType, RCLineCode +from .models import RCConfiguration, RCLine, RCLineType, RCLineCode, RCClock # Register your models here. @@ -7,3 +7,4 @@ admin.site.register(RCConfiguration) admin.site.register(RCLine) admin.site.register(RCLineType) admin.site.register(RCLineCode) +admin.site.register(RCClock) diff --git a/apps/rc/forms.py b/apps/rc/forms.py index b8d40d9..fec2b2e 100644 --- a/apps/rc/forms.py +++ b/apps/rc/forms.py @@ -5,7 +5,7 @@ from django import forms from django.utils.safestring import mark_safe from apps.main.models import Device from apps.main.forms import add_empty_choice -from .models import RCConfiguration, RCLine, RCLineType, RCLineCode +from .models import RCConfiguration, RCLine, RCLineType, RCLineCode, RCClock from .widgets import KmUnitWidget, KmUnitHzWidget, KmUnitDcWidget, UnitKmWidget, DefaultWidget, CodesWidget, HiddenWidget, HCheckboxSelectMultiple def create_choices_from_model(model, conf_id, all_choice=False): @@ -78,7 +78,7 @@ class RCConfigurationForm(forms.ModelForm): class Meta: model = RCConfiguration - exclude = ('type', 'parameters', 'status', 'total_units', 'mix', 'author', 'hash') + exclude = ('type', 'parameters', 'status', 'total_units', 'mix', 'author', 'hash', 'clock_in') def clean(self): form_data = super(RCConfigurationForm, self).clean() @@ -382,3 +382,34 @@ class RCLineCodesForm(forms.ModelForm): class Meta: model = RCLineCode exclude = ('name',) + +class RCClockForm(forms.ModelForm): + + def __init__(self, *args, **kwargs): + super(RCClockForm, self).__init__(*args, **kwargs) + + instance = getattr(self, 'instance', None) + + if instance is not None and instance.mode: + self.fields['multiplier'].widget.attrs['readonly'] = True + self.fields['divisor'].widget.attrs['readonly'] = True + self.fields['reference'].widget.attrs['readonly'] = True + + + class Meta: + model = RCClock + exclude = ('rc_configuration',) + + def clean(self): + + form_data = self.cleaned_data + + if form_data['mode'] is True and float(form_data['frequency']) not in (60., 55.): + self.add_error('frequency', 'Only 60 and 55 are valid values in auto mode') + elif form_data['mode'] is False: + if form_data['reference']==0 and not 24<=form_data['multiplier']<=36: + self.add_error('multiplier', 'For 25MHz, valid values are between 24 and 36') + elif form_data['reference']==1 and not 60<=form_data['multiplier']<=90: + self.add_error('multiplier', 'For 10MHz, valid values are between 60 and 90') + + return form_data \ No newline at end of file diff --git a/apps/rc/models.py b/apps/rc/models.py index 538bd1c..405c906 100644 --- a/apps/rc/models.py +++ b/apps/rc/models.py @@ -547,6 +547,20 @@ class RCConfiguration(Configuration): def write_device(self, raw=False): + if not raw: + clock = RCClock.objects.get(rc_configuration=self) + if clock.mode: + data = {'default': clock.frequency} + else: + data = {'manual': [clock.multiplier, clock.divisor, clock.reference]} + payload = self.request('setfreq', 'post', data=json.dumps(data)) + if payload['command'] <> 'ok': + self.message = 'RC write: {}'.format(payload['command']) + else: + self.message = payload['programming'] + if payload['programming'] == 'fail': + self.message = 'RC write: error programming CGS chip' + values = [] for pulse, delay in zip(self.get_pulses(), self.get_delays()): while delay>65536: @@ -1002,3 +1016,12 @@ class RCLine(models.Model): Y = [(int(ipp*x+before+delay[x%delays]+sync), int(ipp*x+width+before+delay[x%delays]+after+sync)) for x in range(ntx)] return Y + +class RCClock(models.Model): + + rc_configuration = models.ForeignKey(RCConfiguration, on_delete=models.CASCADE) + mode = models.BooleanField(default=True, choices=((True, 'Auto'), (False, 'Manual'))) + multiplier = models.PositiveIntegerField(default=60) + divisor = models.PositiveIntegerField(default=10) + reference = models.PositiveSmallIntegerField(default=1, choices=((0, 'Internal (25MHz)'), (1, 'External (10MHz)'))) + frequency = models.FloatField(default=60.0) \ No newline at end of file diff --git a/apps/rc/static/js/cr.js b/apps/rc/static/js/cr.js index 06d50e0..97d9e38 100644 --- a/apps/rc/static/js/cr.js +++ b/apps/rc/static/js/cr.js @@ -107,14 +107,55 @@ function updateWindows(label) { } } - - $("#id_clock_in").change(function() { - $("#id_clock").val(parseFloat($('#id_clock_in').val())/parseFloat($('#id_clock_divider').val())); + +function updateClock() { + if ($("#id_reference").val()==0){ + var ref = 25; + }else{ + var ref = 10; + } + $("#id_frequency").val(parseFloat($('#id_multiplier').val())*ref/parseFloat($('#id_divisor').val())); + $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val())); + updateUnits(); +} + + + $("#id_frequency").change(function() { + $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val())); updateUnits(); }); $("#id_clock_divider").change(function() { - $("#id_clock").val(parseFloat($('#id_clock_in').val())/parseFloat($('#id_clock_divider').val())); + $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val())); updateUnits(); }); + $("#id_mode").change(function() { + if ($("#id_mode").val()=="False"){ + $('#id_multiplier').removeProp("readonly"); + $('#id_divisor').removeProp("readonly"); + $('#id_reference').removeProp("readonly"); + $('#id_frequency').prop("readonly", true); + updateClock(); + }else{ + $('#id_frequency').removeProp("readonly"); + $('#id_multiplier').prop("readonly", true); + $('#id_divisor').prop("readonly", true); + $('#id_reference').prop("readonly", true); + $('#id_reference').val(1) + $('#id_frequency').val(60); + $("#id_clock").val(parseFloat($('#id_frequency').val())/parseFloat($('#id_clock_divider').val())); + } + }); + + $("#id_multiplier").change(function() { + updateClock(); + }); + + $("#id_divisor").change(function() { + updateClock(); + }); + + $("#id_reference").change(function() { + updateClock(); + }); \ No newline at end of file diff --git a/apps/rc/templates/rc_conf.html b/apps/rc/templates/rc_conf.html index 7a8c59d..3e20179 100644 --- a/apps/rc/templates/rc_conf.html +++ b/apps/rc/templates/rc_conf.html @@ -7,6 +7,40 @@
  • View Pulses
  • {% endblock %} +{% block content-detail %} + +

    Clock

    + + + + + + + + + + + + + +
    Mode{{clock.get_mode_display}}
    Reference{{clock.get_reference_display}}
    Frequency{{clock.frequency}}
    +
    +

    RC

    + + + + + + + {% for key in dev_conf_keys %} + + + + + {% endfor %} +
    Status{{dev_conf.device.get_status_display}}
    {% get_verbose_field_name dev_conf key %}{{dev_conf|attr:key}}
    +{% endblock %} + {% block extra-content %}
    diff --git a/apps/rc/templates/rc_conf_edit.html b/apps/rc/templates/rc_conf_edit.html index caefff5..0895330 100644 --- a/apps/rc/templates/rc_conf_edit.html +++ b/apps/rc/templates/rc_conf_edit.html @@ -14,9 +14,13 @@ {% block content %}
    {% csrf_token %} +

    Clock

    + {% bootstrap_form form_clock layout='horizontal' size='medium' %} +
    +

    RC

    {% bootstrap_form form layout='horizontal' size='medium' %}
    -

    RC Lines


    +

    RC Lines

    {% include "rc_lines.html" %}
    diff --git a/apps/rc/views.py b/apps/rc/views.py index c2e80c5..b7a841a 100644 --- a/apps/rc/views.py +++ b/apps/rc/views.py @@ -9,8 +9,8 @@ from django.contrib.auth.decorators import login_required from apps.main.models import Experiment, Device from apps.main.views import sidebar -from .models import RCConfiguration, RCLine, RCLineType, RCLineCode -from .forms import RCConfigurationForm, RCLineForm, RCLineViewForm, RCLineEditForm, RCImportForm, RCLineCodesForm +from .models import RCConfiguration, RCLine, RCLineType, RCLineCode, RCClock +from .forms import RCConfigurationForm, RCLineForm, RCLineViewForm, RCLineEditForm, RCImportForm, RCLineCodesForm, RCClockForm def conf(request, conf_id): @@ -18,6 +18,7 @@ def conf(request, conf_id): conf = get_object_or_404(RCConfiguration, pk=conf_id) lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') + clk = RCClock.objects.get(rc_configuration=conf) for line in lines: params = json.loads(line.params) @@ -26,9 +27,10 @@ def conf(request, conf_id): line.subforms = [RCLineViewForm(extra_fields=fields, line=line, subform=True) for fields in params['params']] kwargs = {} + kwargs['clock'] = clk kwargs['dev_conf'] = conf kwargs['rc_lines'] = lines - kwargs['dev_conf_keys'] = ['ipp_unit', 'ntx', 'clock_in', 'clock_divider', 'clock', + kwargs['dev_conf_keys'] = ['ipp_unit', 'ntx', 'clock_divider', 'clock', 'time_before', 'time_after', 'sync', 'sampling_reference', 'control_tx', 'control_sw'] @@ -45,7 +47,7 @@ def conf(request, conf_id): def conf_edit(request, conf_id): conf = get_object_or_404(RCConfiguration, pk=conf_id) - + clock = RCClock.objects.get(rc_configuration=conf) lines = RCLine.objects.filter(rc_configuration=conf).order_by('channel') for line in lines: @@ -60,11 +62,13 @@ def conf_edit(request, conf_id): if request.method=='GET': form = RCConfigurationForm(instance=conf) + form_clock = RCClockForm(instance=clock) elif request.method=='POST': line_data = {} conf_data = {} + clock_data = {} extras = [] #classified post fields @@ -73,7 +77,10 @@ def conf_edit(request, conf_id): continue if label.count('|')==0: - conf_data[label] = value + if label in ('mode', 'multiplier', 'divisor', 'reference', 'frequency'): + clock_data[label] = value + else: + conf_data[label] = value continue elif label.split('|')[0]!='-1': @@ -91,10 +98,12 @@ def conf_edit(request, conf_id): line_data[pk] = {name:value} #update conf + + form_clock = RCClockForm(clock_data, instance=clock) form = RCConfigurationForm(conf_data, instance=conf) - if form.is_valid(): - + if form_clock.is_valid() and form.is_valid(): + form_clock.save() form.save() #update lines fields @@ -127,6 +136,7 @@ def conf_edit(request, conf_id): kwargs = {} kwargs['dev_conf'] = conf kwargs['form'] = form + kwargs['form_clock'] = form_clock kwargs['rc_lines'] = lines kwargs['edit'] = True diff --git a/postgres/docker-entrypoint-initdb.d/create_db.sh b/postgres/docker-entrypoint-initdb.d/create_db.sh index 5d1def8..ff7fd3d 100755 --- a/postgres/docker-entrypoint-initdb.d/create_db.sh +++ b/postgres/docker-entrypoint-initdb.d/create_db.sh @@ -1,5 +1,9 @@ -#!/bin/env bash -echo "Creating database..." -psql -U postgres -c "CREATE USER $POSTGRES_USER WITH PASSWORD '$POSTGRES_PASSWORD';" -psql -U postgres -c "CREATE DATABASE $POSTGRES_DB_NAME;" -psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE $POSTGRES_DB_NAME to $POSTGRES_USER;" +#!/bin/bash +set -e + +echo "Creating database & user" +psql -v --username "postgres" --dbname "postgres" <<-EOSQL + CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD'; + CREATE DATABASE $DB_NAME; + GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER; +EOSQL diff --git a/radarsys/settings.py b/radarsys/settings.py index 4e5e8a8..dc301f3 100644 --- a/radarsys/settings.py +++ b/radarsys/settings.py @@ -91,11 +91,11 @@ DATABASES = { # } 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': os.environ.get('POSTGRES_DB_NAME', 'radarsys'), - 'USER': os.environ.get('POSTGRES_USER', 'docker'), - 'PASSWORD': os.environ.get('POSTGRES_PASSWORD', 'docker'), - 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'postgres'), - 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', ''), + 'NAME': os.environ.get('DB_NAME', 'radarsys'), + 'USER': os.environ.get('DB_USER', 'docker'), + 'PASSWORD': os.environ.get('DB_PASSWORD', 'docker'), + 'HOST': os.environ.get('POSTGRES_PORT_5432_TCP_ADDR', 'localhost'), + 'PORT': os.environ.get('POSTGRES_PORT_5432_TCP_PORT', '5400'), } } @@ -104,7 +104,7 @@ DATABASES = { LANGUAGE_CODE = 'en-us' -TIME_ZONE = os.environ.get('TZ', 'UTC') +TIME_ZONE = os.environ.get('TZ', 'America/Lima') USE_I18N = True @@ -128,7 +128,7 @@ STATICFILES_FINDERS = ( # Celery stuff REDIS_HOST = os.environ.get('REDIS_HOST', '127.0.0.1') -REDIS_PORT = os.environ.get('REDIS_PORT', 6379) +REDIS_PORT = os.environ.get('REDIS_PORT', 6300) BROKER_TRANSPORT = 'redis' BROKER_URL = 'redis://{}:{}/0'.format(REDIS_HOST, REDIS_PORT)