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