##// END OF EJS Templates
git-svn-id: http://jro-dev.igp.gob.pe/svn/jro_hard/radarsys/trunk/webapp@166 aa17d016-51d5-4e8b-934c-7b2bbb1bbe71
Fiorella Quino -
r145:d4ce9204eab8
parent child
Show More
@@ -1,230 +1,230
1 from django.db import models
1 from django.db import models
2 from apps.main.models import Configuration
2 from apps.main.models import Configuration
3 # Create your models here.
3 # Create your models here.
4
4
5 from django.core.validators import MinValueValidator, MaxValueValidator
5 from django.core.validators import MinValueValidator, MaxValueValidator
6 from django.core.exceptions import ValidationError
6 from django.core.exceptions import ValidationError
7
7
8 from devices.dds import api, data
8 from devices.dds import api, data
9
9
10 ENABLE_TYPE = (
10 ENABLE_TYPE = (
11 (False, 'Disabled'),
11 (False, 'Disabled'),
12 (True, 'Enabled'),
12 (True, 'Enabled'),
13 )
13 )
14 MOD_TYPES = (
14 MOD_TYPES = (
15 (0, 'Single Tone'),
15 (0, 'Single Tone'),
16 (1, 'FSK'),
16 (1, 'FSK'),
17 (2, 'Ramped FSK'),
17 (2, 'Ramped FSK'),
18 (3, 'Chirp'),
18 (3, 'Chirp'),
19 (4, 'BPSK'),
19 (4, 'BPSK'),
20 )
20 )
21
21
22 class DDSConfiguration(Configuration):
22 class DDSConfiguration(Configuration):
23
23
24 DDS_NBITS = 48
24 DDS_NBITS = 48
25
25
26 clock = models.FloatField(verbose_name='Clock Input (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)], null=True, default=60)
26 clock = models.FloatField(verbose_name='Clock In (MHz)',validators=[MinValueValidator(5), MaxValueValidator(75)], null=True, default=60)
27 multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4)
27 multiplier = models.PositiveIntegerField(verbose_name='Multiplier',validators=[MinValueValidator(1), MaxValueValidator(20)], default=4)
28
28
29 frequencyA_Mhz = models.DecimalField(verbose_name='Frequency A (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16, null=True, default=49.9200)
29 frequencyA_Mhz = models.DecimalField(verbose_name='Frequency A (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16, null=True, default=49.9200)
30 frequencyA = models.BigIntegerField(verbose_name='Frequency A (Decimal)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True)
30 frequencyA = models.BigIntegerField(verbose_name='Frequency A (Decimal)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True)
31
31
32 frequencyB_Mhz = models.DecimalField(verbose_name='Frequency B (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16, blank=True, null=True)
32 frequencyB_Mhz = models.DecimalField(verbose_name='Frequency B (MHz)', validators=[MinValueValidator(0), MaxValueValidator(150)], max_digits=19, decimal_places=16, blank=True, null=True)
33 frequencyB = models.BigIntegerField(verbose_name='Frequency B (Decimal)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True)
33 frequencyB = models.BigIntegerField(verbose_name='Frequency B (Decimal)',validators=[MinValueValidator(0), MaxValueValidator(2**DDS_NBITS-1)], blank=True, null=True)
34
34
35 phaseA_degrees = models.FloatField(verbose_name='Phase A (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], default=0)
35 phaseA_degrees = models.FloatField(verbose_name='Phase A (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], default=0)
36
36
37 phaseB_degrees = models.FloatField(verbose_name='Phase B (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True)
37 phaseB_degrees = models.FloatField(verbose_name='Phase B (Degrees)', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null=True)
38
38
39 modulation = models.PositiveIntegerField(verbose_name='Modulation Type', choices = MOD_TYPES, default = 0)
39 modulation = models.PositiveIntegerField(verbose_name='Modulation Type', choices = MOD_TYPES, default = 0)
40
40
41 amplitude_enabled = models.BooleanField(verbose_name='Amplitude Control', choices=ENABLE_TYPE, default=False)
41 amplitude_enabled = models.BooleanField(verbose_name='Amplitude Control', choices=ENABLE_TYPE, default=False)
42
42
43 amplitudeI = models.PositiveIntegerField(verbose_name='Amplitude CH1',validators=[MinValueValidator(0), MaxValueValidator(2**12-1)], blank=True, null=True)
43 amplitudeI = models.PositiveIntegerField(verbose_name='Amplitude CH1',validators=[MinValueValidator(0), MaxValueValidator(2**12-1)], blank=True, null=True)
44 amplitudeQ = models.PositiveIntegerField(verbose_name='Amplitude CH2',validators=[MinValueValidator(0), MaxValueValidator(2**12-1)], blank=True, null=True)
44 amplitudeQ = models.PositiveIntegerField(verbose_name='Amplitude CH2',validators=[MinValueValidator(0), MaxValueValidator(2**12-1)], blank=True, null=True)
45
45
46
46
47 def get_nbits(self):
47 def get_nbits(self):
48
48
49 return self.DDS_NBITS
49 return self.DDS_NBITS
50
50
51 def clean(self):
51 def clean(self):
52
52
53 if self.modulation in [1,2,3]:
53 if self.modulation in [1,2,3]:
54 if self.frequencyB is None or self.frequencyB_Mhz is None:
54 if self.frequencyB is None or self.frequencyB_Mhz is None:
55 raise ValidationError({
55 raise ValidationError({
56 'frequencyB': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected'
56 'frequencyB': 'Frequency modulation has to be defined when FSK or Chirp modulation is selected'
57 })
57 })
58
58
59 if self.modulation in [4,]:
59 if self.modulation in [4,]:
60 if self.phaseB_degrees is None:
60 if self.phaseB_degrees is None:
61 raise ValidationError({
61 raise ValidationError({
62 'phaseB': 'Phase modulation has to be defined when BPSK modulation is selected'
62 'phaseB': 'Phase modulation has to be defined when BPSK modulation is selected'
63 })
63 })
64
64
65 self.frequencyA_Mhz = data.binary_to_freq(self.frequencyA, self.clock*self.multiplier)
65 self.frequencyA_Mhz = data.binary_to_freq(self.frequencyA, self.clock*self.multiplier)
66 self.frequencyB_Mhz = data.binary_to_freq(self.frequencyB, self.clock*self.multiplier)
66 self.frequencyB_Mhz = data.binary_to_freq(self.frequencyB, self.clock*self.multiplier)
67
67
68 def verify_frequencies(self):
68 def verify_frequencies(self):
69
69
70 return True
70 return True
71
71
72 def parms_to_dict(self):
72 def parms_to_dict(self):
73
73
74 parameters = {}
74 parameters = {}
75
75
76 parameters['device_id'] = self.device.id
76 parameters['device_id'] = self.device.id
77
77
78 parameters['clock'] = float(self.clock)
78 parameters['clock'] = float(self.clock)
79 parameters['multiplier'] = int(self.multiplier)
79 parameters['multiplier'] = int(self.multiplier)
80
80
81 parameters['frequencyA'] = int(self.frequencyA)
81 parameters['frequencyA'] = int(self.frequencyA)
82 parameters['frequencyA_Mhz'] = float(self.frequencyA_Mhz)
82 parameters['frequencyA_Mhz'] = float(self.frequencyA_Mhz)
83
83
84 parameters['phaseA'] = data.phase_to_binary(self.phaseA_degrees)
84 parameters['phaseA'] = data.phase_to_binary(self.phaseA_degrees)
85 parameters['phaseA_degrees'] = float(self.phaseA_degrees)
85 parameters['phaseA_degrees'] = float(self.phaseA_degrees)
86
86
87 parameters['modulation'] = int(self.modulation)
87 parameters['modulation'] = int(self.modulation)
88 parameters['amplitude_enabled'] = bool(self.amplitude_enabled)
88 parameters['amplitude_enabled'] = bool(self.amplitude_enabled)
89
89
90 if self.frequencyB:
90 if self.frequencyB:
91 parameters['frequencyB'] = int(self.frequencyB)
91 parameters['frequencyB'] = int(self.frequencyB)
92 parameters['frequencyB_Mhz'] = float(self.frequencyB_Mhz)
92 parameters['frequencyB_Mhz'] = float(self.frequencyB_Mhz)
93 else:
93 else:
94 parameters['frequencyB'] = 0
94 parameters['frequencyB'] = 0
95 parameters['frequencyB_Mhz'] = 0
95 parameters['frequencyB_Mhz'] = 0
96
96
97 if self.phaseB_degrees:
97 if self.phaseB_degrees:
98 parameters['phaseB_degrees'] = float(self.phaseB_degrees)
98 parameters['phaseB_degrees'] = float(self.phaseB_degrees)
99 parameters['phaseB'] = data.phase_to_binary(self.phaseB_degrees)
99 parameters['phaseB'] = data.phase_to_binary(self.phaseB_degrees)
100 else:
100 else:
101 parameters['phaseB_degrees'] = 0
101 parameters['phaseB_degrees'] = 0
102 parameters['phaseB'] = 0
102 parameters['phaseB'] = 0
103
103
104 if self.amplitudeI:
104 if self.amplitudeI:
105 parameters['amplitudeI'] = int(self.amplitudeI)
105 parameters['amplitudeI'] = int(self.amplitudeI)
106 else:
106 else:
107 parameters['amplitudeI'] = 0
107 parameters['amplitudeI'] = 0
108
108
109 if self.amplitudeQ:
109 if self.amplitudeQ:
110 parameters['amplitudeQ'] = int(self.amplitudeQ)
110 parameters['amplitudeQ'] = int(self.amplitudeQ)
111 else:
111 else:
112 parameters['amplitudeQ'] = 0
112 parameters['amplitudeQ'] = 0
113
113
114 return parameters
114 return parameters
115
115
116 def parms_to_text(self):
116 def parms_to_text(self):
117
117
118 my_dict = self.parms_to_dict()
118 my_dict = self.parms_to_dict()
119
119
120 text = data.dict_to_text(my_dict)
120 text = data.dict_to_text(my_dict)
121
121
122 return text
122 return text
123
123
124 def dict_to_parms(self, parameters):
124 def dict_to_parms(self, parameters):
125
125
126 self.clock = parameters['clock']
126 self.clock = parameters['clock']
127 self.multiplier = parameters['multiplier']
127 self.multiplier = parameters['multiplier']
128 self.frequencyA = parameters['frequencyA']
128 self.frequencyA = parameters['frequencyA']
129 self.frequencyB = parameters['frequencyB']
129 self.frequencyB = parameters['frequencyB']
130 self.frequencyA_Mhz = parameters['frequencyA_Mhz']
130 self.frequencyA_Mhz = parameters['frequencyA_Mhz']
131 self.frequencyB_Mhz = parameters['frequencyB_Mhz']
131 self.frequencyB_Mhz = parameters['frequencyB_Mhz']
132 self.phaseA_degrees = parameters['phaseA_degrees']
132 self.phaseA_degrees = parameters['phaseA_degrees']
133 self.phaseB_degrees = parameters['phaseB_degrees']
133 self.phaseB_degrees = parameters['phaseB_degrees']
134 self.modulation = parameters['modulation']
134 self.modulation = parameters['modulation']
135 self.amplitude_enabled = parameters['amplitude_enabled']
135 self.amplitude_enabled = parameters['amplitude_enabled']
136
136
137 def import_from_file(self, fp):
137 def import_from_file(self, fp):
138
138
139 import os, json
139 import os, json
140
140
141 parms = {}
141 parms = {}
142
142
143 path, ext = os.path.splitext(fp.name)
143 path, ext = os.path.splitext(fp.name)
144
144
145 if ext == '.json':
145 if ext == '.json':
146 parms = json.load(fp)
146 parms = json.load(fp)
147
147
148 if ext == '.dds':
148 if ext == '.dds':
149 lines = fp.readlines()
149 lines = fp.readlines()
150 parms = data.text_to_dict(lines)
150 parms = data.text_to_dict(lines)
151
151
152 return parms
152 return parms
153
153
154 def status_device(self):
154 def status_device(self):
155
155
156 answer = api.status(ip = self.device.ip_address,
156 answer = api.status(ip = self.device.ip_address,
157 port = self.device.port_address)
157 port = self.device.port_address)
158
158
159 self.device.status = int(answer[0])
159 self.device.status = int(answer[0])
160 self.message = answer[2:]
160 self.message = answer[2:]
161
161
162 self.device.save()
162 self.device.save()
163
163
164 return self.device.status
164 return self.device.status
165
165
166 def reset_device(self):
166 def reset_device(self):
167
167
168 answer = api.reset(ip = self.device.ip_address,
168 answer = api.reset(ip = self.device.ip_address,
169 port = self.device.port_address)
169 port = self.device.port_address)
170
170
171 if answer[0] != "1":
171 if answer[0] != "1":
172 self.message = answer[0:]
172 self.message = answer[0:]
173 return 0
173 return 0
174
174
175 self.message = answer[2:]
175 self.message = answer[2:]
176 return 1
176 return 1
177
177
178 def stop_device(self):
178 def stop_device(self):
179
179
180 answer = api.disable_rf(ip = self.device.ip_address,
180 answer = api.disable_rf(ip = self.device.ip_address,
181 port = self.device.port_address)
181 port = self.device.port_address)
182
182
183 if answer[0] != "1":
183 if answer[0] != "1":
184 self.message = answer[0:]
184 self.message = answer[0:]
185 return 0
185 return 0
186
186
187 self.message = answer[2:]
187 self.message = answer[2:]
188 return 1
188 return 1
189
189
190 def start_device(self):
190 def start_device(self):
191
191
192 answer = api.enable_rf(ip = self.device.ip_address,
192 answer = api.enable_rf(ip = self.device.ip_address,
193 port = self.device.port_address)
193 port = self.device.port_address)
194
194
195 if answer[0] != "1":
195 if answer[0] != "1":
196 self.message = answer[0:]
196 self.message = answer[0:]
197 return 0
197 return 0
198
198
199 self.message = answer[2:]
199 self.message = answer[2:]
200 return 1
200 return 1
201
201
202 def read_device(self):
202 def read_device(self):
203
203
204 parms = api.read_config(ip = self.device.ip_address,
204 parms = api.read_config(ip = self.device.ip_address,
205 port = self.device.port_address)
205 port = self.device.port_address)
206
206
207 if not parms:
207 if not parms:
208 self.message = "Could not read DDS parameters from this device"
208 self.message = "Could not read DDS parameters from this device"
209 return parms
209 return parms
210
210
211 self.message = ""
211 self.message = ""
212 return parms
212 return parms
213
213
214
214
215 def write_device(self):
215 def write_device(self):
216
216
217 answer = api.write_config(ip = self.device.ip_address,
217 answer = api.write_config(ip = self.device.ip_address,
218 port = self.device.port_address,
218 port = self.device.port_address,
219 parms = self.parms_to_dict())
219 parms = self.parms_to_dict())
220
220
221 if answer[0] != "1":
221 if answer[0] != "1":
222 self.message = answer[0:]
222 self.message = answer[0:]
223 return 0
223 return 0
224
224
225 self.message = answer[2:]
225 self.message = answer[2:]
226 return 1
226 return 1
227
227
228 class Meta:
228 class Meta:
229 db_table = 'dds_configurations'
229 db_table = 'dds_configurations'
230 No newline at end of file
230
General Comments 0
You need to be logged in to leave comments. Login now