##// END OF EJS Templates
Update DDS model...
Juan C. Espinoza -
r187:86a52b303502
parent child
Show More
@@ -1,229 +1,260
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 In (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 try:
157 port = self.device.port_address)
157 answer = api.status(ip = self.device.ip_address,
158
158 port = self.device.port_address)
159 self.device.status = int(answer[0])
159 status = answer[0]
160 self.message = answer[2:]
160 if status=='0':
161
161 self.device.status = 1
162 self.device.save()
162 else:
163
163 self.device.status = status
164 return self.device.status
164 self.message = answer[2:]
165 self.device.save()
166 except Exception as e:
167 self.message = str(e)
168 self.device.status = 0
169 self.device.save()
170 return False
171
172 return True
165
173
166 def reset_device(self):
174 def reset_device(self):
167
175
168 answer = api.reset(ip = self.device.ip_address,
176 answer = api.reset(ip = self.device.ip_address,
169 port = self.device.port_address)
177 port = self.device.port_address)
170
178
171 if answer[0] != "1":
179 if answer[0] != "1":
172 self.message = answer[0:]
180 self.message = answer[0:]
173 return 0
181 return 0
174
182
175 self.message = answer[2:]
183 self.message = answer[2:]
176 return 1
184 return 1
177
185
178 def stop_device(self):
186 def stop_device(self):
179
187
180 answer = api.disable_rf(ip = self.device.ip_address,
188 try:
181 port = self.device.port_address)
189 answer = api.disable_rf(ip = self.device.ip_address,
190 port = self.device.port_address)
191 if answer[0] == '1':
192 self.message = answer[2:]
193 self.device.status = 2
194 else:
195 self.message = self.message = answer[2:]
196 self.device.status = 1
197 self.device.save()
198 return False
199 except Exception as e:
200 self.message = str(e)
201 return False
182
202
183 if answer[0] != "1":
203 self.device.save()
184 self.message = answer[0:]
204 return True
185 return 0
186
187 self.message = answer[2:]
188 return 1
189
205
190 def start_device(self):
206 def start_device(self):
191
207
192 answer = api.enable_rf(ip = self.device.ip_address,
208 try:
193 port = self.device.port_address)
209 answer = api.enable_rf(ip = self.device.ip_address,
194
210 port = self.device.port_address)
195 if answer[0] != "1":
211 if answer[0] == '1':
196 self.message = answer[0:]
212 self.message = 'DDS - RF Enable'
197 return 0
213 self.device.status = 3
214 else:
215 self.message = self.message = answer[2:]
216 self.device.status = 1
217 self.device.save()
218 return False
219 except Exception as e:
220 self.message = str(e)
221 return False
198
222
199 self.message = answer[2:]
223 self.device.save()
200 return 1
224 return True
201
225
202 def read_device(self):
226 def read_device(self):
203
227
204 parms = api.read_config(ip = self.device.ip_address,
228 parms = api.read_config(ip = self.device.ip_address,
205 port = self.device.port_address)
229 port = self.device.port_address)
206
207 if not parms:
230 if not parms:
208 self.message = "Could not read DDS parameters from this device"
231 self.message = "Could not read DDS parameters from this device"
209 return parms
232 return parms
210
233
211 self.message = ""
234 self.message = ""
212 return parms
235 return parms
213
236
214
237
215 def write_device(self):
238 def write_device(self):
216
239
217 answer = api.write_config(ip = self.device.ip_address,
240 try:
218 port = self.device.port_address,
241 answer = api.write_config(ip = self.device.ip_address,
219 parms = self.parms_to_dict())
242 port = self.device.port_address,
220
243 parms = self.parms_to_dict())
221 if answer[0] != "1":
244 if answer[0] == '1':
222 self.message = answer[0:]
245 self.message = answer[2:]
223 return 0
246 self.device.status = 3
224
247 else:
225 self.message = answer[2:]
248 self.message = answer[2:]
226 return 1
249 self.device.status = 1
250 self.device.save()
251 return False
252 except Exception as e:
253 self.message = str(e)
254 return False
227
255
256 self.device.save()
257 return True
258
228 class Meta:
259 class Meta:
229 db_table = 'dds_configurations'
260 db_table = 'dds_configurations'
General Comments 0
You need to be logged in to leave comments. Login now