models.py
107 lines
| 3.9 KiB
| text/x-python
|
PythonLexer
|
r23 | |||
|
r25 | import json | ||
|
r23 | from polymorphic import PolymorphicModel | ||
|
r0 | from django.db import models | ||
|
r23 | from django.core.validators import MinValueValidator, MaxValueValidator | ||
|
r6 | from apps.main.models import Configuration | ||
|
r0 | # Create your models here. | ||
|
r6 | |||
|
r23 | LINE_TYPES = ( | ||
('tr', 'Transmission/reception selector signal'), | ||||
('tx', 'A modulating signal (Transmission pulse)'), | ||||
('codes', 'BPSK modulating signal'), | ||||
('windows', 'Sample window signal'), | ||||
('sync', 'Synchronizing signal'), | ||||
('flip', 'IPP related periodic signal'), | ||||
('prog_pulses', 'Programmable pulse'), | ||||
) | ||||
LINE_PARAMS = { | ||||
"tr": [{"name":"time_after", "value": 0}], | ||||
"tx": [{"name": "pulse_width", "value": 0},{"name":"delays", "value":""}], | ||||
"codes": [{"name":"tx_ref", "value": ""},{"name":"code", "value": "", "choices":"RCLineCode"}], | ||||
"windows": [{"name":"tx_ref","value":""}, {"name":"first_height", "value":0}, {"name":"number_of_samples","value":0}, {"name":"resolution","value":0}, {"name":"last_height","value":0}], | ||||
"sync": [{"name": "delay", "value": 0}], | ||||
"flip": [{"name":"number_of_flips", "value": 0}], | ||||
"prog_pulses": [{"name": "begin", "value": 0}, {"name": "end","value": 0}], | ||||
} | ||||
|
r6 | class RCConfiguration(Configuration): | ||
|
r23 | |||
clock = models.FloatField(verbose_name='Clock Master (MHz)', validators=[MinValueValidator(0), MaxValueValidator(80)], blank=True, null=True) | ||||
clock_divider = models.PositiveIntegerField(verbose_name='Clock divider', validators=[MinValueValidator(0), MaxValueValidator(256)], blank=True, null=True) | ||||
ipp = models.PositiveIntegerField(verbose_name='Inter pulse period (Km)', default=10) | ||||
ntx = models.PositiveIntegerField(verbose_name='Number of pulse of transmit', default=1) | ||||
time_before = models.PositiveIntegerField(verbose_name='Number of pulse of transmit', default=0) | ||||
|
r6 | |||
class Meta: | ||||
db_table = 'rc_configurations' | ||||
|
r23 | |||
def get_number_position(self): | ||||
lines = RCLine.objects.filter(rc_configuration=self.rc_configuration) | ||||
if lines: | ||||
return max([line.position for line in lines]) | ||||
|
r25 | def get_refs_lines(self): | ||
lines = RCLine.objects.filter(rc_configuration=self.pk, line_type__name='tx') | ||||
return [(line.pk, line.get_name()) for line in lines] | ||||
|
r23 | class RCLineCode(models.Model): | ||
|
r25 | name = models.CharField(max_length=40) | ||
|
r23 | bits_per_code = models.PositiveIntegerField(default=0) | ||
number_of_codes = models.PositiveIntegerField(default=0) | ||||
codes = models.TextField(blank=True, null=True) | ||||
class Meta: | ||||
db_table = 'rc_line_codes' | ||||
|
r25 | ordering = ('name',) | ||
def __unicode__(self): | ||||
return u'%s' % self.name | ||||
|
r23 | |||
class RCLineType(models.Model): | ||||
name = models.CharField(choices=LINE_TYPES, max_length=40) | ||||
description = models.TextField(blank=True, null=True) | ||||
params = models.TextField(default='[]') | ||||
class Meta: | ||||
db_table = 'rc_line_types' | ||||
def __unicode__(self): | ||||
return u'%s - %s' % (self.name.upper(), self.get_name_display()) | ||||
class RCLine(models.Model): | ||||
rc_configuration = models.ForeignKey(RCConfiguration) | ||||
line_type = models.ForeignKey(RCLineType) | ||||
channel = models.PositiveIntegerField(default=0) | ||||
position = models.PositiveIntegerField(default=0) | ||||
params = models.TextField(default='{}') | ||||
class Meta: | ||||
db_table = 'rc_lines' | ||||
def __unicode__(self): | ||||
return u'%s - %s' % (self.rc_configuration, self.get_name()) | ||||
def get_name(self): | ||||
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | ||||
|
r25 | if self.line_type.name in ('tx', 'tr',): | ||
return '%s %s' % (self.line_type.name.upper(), chars[self.position]) | ||||
elif self.line_type.name in ('codes', 'windows',): | ||||
pk = json.loads(self.params)['TX_ref'] | ||||
ref = RCLine.objects.get(pk=pk) | ||||
return '%s %s' % (self.line_type.name.upper(), chars[ref.position]) | ||||
else: | ||||
return self.line_type.name.upper() | ||||