models.py
298 lines
| 8.5 KiB
| text/x-python
|
PythonLexer
|
r45 | import ast | ||
|
r25 | import json | ||
|
r175 | import requests | ||
|
r45 | import numpy as np | ||
r345 | import base64 | |||
|
r185 | from struct import pack | ||
|
r25 | |||
|
r0 | from django.db import models | ||
r335 | from django.urls import reverse | |||
|
r23 | from django.core.validators import MinValueValidator, MaxValueValidator | ||
|
r6 | from apps.main.models import Configuration | ||
|
r79 | |||
r345 | BOARD_VALUE = ( | |||
('1', 'A:AB'), | ||||
('2', 'AB') | ||||
) | ||||
ANT_VALUE = ( | ||||
r346 | ('1', 'RX'), | |||
('2', 'TX') | ||||
r345 | ) | |||
CLK_VALUE = ( | ||||
('1', 'internal'), | ||||
('2', 'external') | ||||
) | ||||
TIME_VALUE = ( | ||||
('1', 'internal'), | ||||
('2', 'external') | ||||
) | ||||
|
r6 | |||
r346 | class USRPRXConfiguration(Configuration): | |||
|
r172 | |||
r345 | daughterboard = models.CharField( | |||
verbose_name='Daughterboard', | ||||
max_length=3, | ||||
choices=BOARD_VALUE, | ||||
null=False, | ||||
blank=False | ||||
) | ||||
|
r6 | |||
r345 | antenna = models.CharField( | |||
verbose_name='Antenna', | ||||
max_length=3, | ||||
choices=ANT_VALUE, | ||||
null=False, | ||||
blank=False | ||||
) | ||||
|
r172 | |||
r345 | samplerate = models.FloatField( | |||
verbose_name='Sample Rate', | ||||
blank=False, | ||||
null=False | ||||
) | ||||
|
r172 | |||
r345 | frequency = models.FloatField( | |||
verbose_name='Frequency', | ||||
blank=False, | ||||
null=False | ||||
) | ||||
|
r172 | |||
r345 | datadir = models.CharField( | |||
verbose_name="Data Directory", | ||||
max_length=100, | ||||
default='', | ||||
blank=False, | ||||
null=False | ||||
) | ||||
|
r172 | |||
r345 | clocksource = models.CharField( | |||
verbose_name='Clock Source', | ||||
max_length=3, | ||||
choices=CLK_VALUE, | ||||
null=False, | ||||
blank=False | ||||
) | ||||
timesource = models.CharField( | ||||
verbose_name='Time Source', | ||||
max_length=3, | ||||
choices=TIME_VALUE, | ||||
null=False, | ||||
blank=False | ||||
) | ||||
clockrate = models.FloatField( | ||||
verbose_name='Clock Rate', | ||||
blank=False, | ||||
null=False | ||||
) | ||||
|
r172 | |||
r345 | class Meta: | |||
r346 | db_table = 'usrp_rx_configurations' | |||
r345 | ||||
def __str__(self): | ||||
return self.label | ||||
def get_absolute_url_plot(self): | ||||
return reverse('url_plot_usrp_rx_pulses', args=[str(self.id)]) | ||||
|
r79 | |||
|
r264 | def request(self, cmd, method='get', **kwargs): | ||
r345 | ||||
|
r264 | req = getattr(requests, method)(self.device.url(cmd), **kwargs) | ||
payload = req.json() | ||||
return payload | ||||
|
r175 | def status_device(self): | ||
|
r172 | |||
|
r222 | try: | ||
self.device.status = 0 | ||||
|
r264 | payload = self.request('status') | ||
if payload['status']=='enable': | ||||
|
r236 | self.device.status = 3 | ||
|
r264 | elif payload['status']=='disable': | ||
|
r222 | self.device.status = 2 | ||
|
r185 | else: | ||
|
r243 | self.device.status = 1 | ||
|
r222 | self.device.save() | ||
r346 | self.message = 'USRP Rx status: {}'.format(payload['status']) | |||
|
r222 | return False | ||
|
r185 | except Exception as e: | ||
|
r222 | if 'No route to host' not in str(e): | ||
self.device.status = 4 | ||||
self.device.save() | ||||
r346 | self.message = 'USRP Rx status: {}'.format(str(e)) | |||
|
r185 | return False | ||
|
r243 | |||
self.device.save() | ||||
return True | ||||
|
r175 | |||
def reset_device(self): | ||||
|
r243 | |||
|
r185 | try: | ||
|
r264 | payload = self.request('reset', 'post') | ||
|
r222 | if payload['reset']=='ok': | ||
r346 | self.message = 'USRP Rx restarted OK' | |||
|
r264 | self.device.status = 2 | ||
self.device.save() | ||||
|
r185 | else: | ||
r346 | self.message = 'USRP Rx restart fail' | |||
|
r185 | self.device.status = 4 | ||
self.device.save() | ||||
except Exception as e: | ||||
r346 | self.message = 'USRP Rx reset: {}'.format(str(e)) | |||
|
r185 | return False | ||
|
r243 | |||
|
r185 | return True | ||
|
r243 | |||
|
r175 | def stop_device(self): | ||
|
r172 | |||
|
r185 | try: | ||
r346 | command = self.device.url() + "stop" | |||
r = requests.get(command) | ||||
if r: | ||||
self.device.status = 4 | ||||
|
r185 | self.device.save() | ||
r346 | self.message = 'USRP stopped' | |||
|
r185 | else: | ||
self.device.status = 4 | ||||
self.device.save() | ||||
return False | ||||
except Exception as e: | ||||
|
r222 | if 'No route to host' not in str(e): | ||
self.device.status = 4 | ||||
else: | ||||
self.device.status = 0 | ||||
r346 | self.message = 'USRP Rx stop: {}'.format(str(e)) | |||
|
r222 | self.device.save() | ||
|
r243 | return False | ||
|
r185 | return True | ||
|
r172 | |||
r345 | def start_device(self): | |||
print("Entró al start") | ||||
|
r185 | try: | ||
r346 | usrp = USRPRXConfiguration.objects.get(pk=self) | |||
r345 | usrp_daughterboard = usrp.get_daughterboard_display() | |||
usrp_antenna = usrp.get_antenna_display() | ||||
usrp_clocksource = usrp.get_clocksource_display() | ||||
usrp_timesource = usrp.get_timesource_display() | ||||
print(usrp) | ||||
payload = {'daughterboard': usrp_daughterboard, 'antenna': usrp_antenna, 'sample_rate': usrp.samplerate, 'frequency': usrp.frequency, | ||||
'datadir': usrp.datadir, 'clock_source': usrp_clocksource, 'time_source': usrp_timesource, 'clock_rate':usrp.clockrate} | ||||
print(payload) | ||||
r346 | r = requests.post(self.device.url("usrp"), json=payload) | |||
print(r.text) | ||||
r345 | #payload = self.request('usrp', 'post', data=json.dumps(data)) | |||
#print(payload) | ||||
r346 | if r: | |||
|
r185 | self.device.status = 3 | ||
self.device.save() | ||||
r346 | self.message = 'USRP Rx configured and started' | |||
|
r185 | else: | ||
return False | ||||
except Exception as e: | ||||
|
r222 | if 'No route to host' not in str(e): | ||
self.device.status = 4 | ||||
else: | ||||
self.device.status = 0 | ||||
r346 | self.message = 'USRP Rx start: {}'.format(str(e)) | |||
|
r222 | self.device.save() | ||
|
r185 | return False | ||
|
r243 | |||
|
r185 | return True | ||
|
r172 | |||
r346 | #def write_device(self, raw=False): | |||
r299 | ||||
|
r328 | if not raw: | ||
clock = RCClock.objects.get(rc_configuration=self) | ||||
r345 | print(clock) | |||
|
r328 | 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)) | ||||
r345 | print(payload) | |||
r335 | if payload['command'] != 'ok': | |||
r346 | self.message = 'USRP Rx write: {}'.format(payload['command']) | |||
|
r328 | else: | ||
self.message = payload['programming'] | ||||
if payload['programming'] == 'fail': | ||||
r346 | self.message = 'USRP Rx write: error programming CGS chip' | |||
|
r328 | |||
r299 | values = [] | |||
for pulse, delay in zip(self.get_pulses(), self.get_delays()): | ||||
r302 | while delay>65536: | |||
r299 | values.append((pulse, 65535)) | |||
r302 | delay -= 65536 | |||
r299 | values.append((pulse, delay-1)) | |||
|
r236 | data = bytearray() | ||
|
r243 | #reset | ||
data.extend((128, 0)) | ||||
#disable | ||||
|
r236 | data.extend((129, 0)) | ||
r304 | #SW switch | |||
if self.control_sw: | ||||
data.extend((130, 2)) | ||||
else: | ||||
data.extend((130, 0)) | ||||
|
r243 | #divider | ||
data.extend((131, self.clock_divider-1)) | ||||
|
r236 | #enable writing | ||
data.extend((139, 62)) | ||||
|
r243 | |||
|
r236 | last = 0 | ||
|
r243 | for tup in values: | ||
vals = pack('<HH', last^tup[0], tup[1]) | ||||
|
r236 | last = tup[0] | ||
|
r243 | data.extend((133, vals[1], 132, vals[0], 133, vals[3], 132, vals[2])) | ||
|
r236 | #enable | ||
data.extend((129, 1)) | ||||
|
r243 | |||
|
r316 | if raw: | ||
return b64encode(data) | ||||
|
r185 | try: | ||
r299 | payload = self.request('stop', 'post') | |||
payload = self.request('reset', 'post') | ||||
#payload = self.request('divider', 'post', data={'divider': self.clock_divider-1}) | ||||
#payload = self.request('write', 'post', data=b64encode(bytearray((139, 62))), timeout=20) | ||||
n = len(data) | ||||
x = 0 | ||||
#while x < n: | ||||
|
r264 | payload = self.request('write', 'post', data=b64encode(data)) | ||
r299 | # x += 1024 | |||
|
r222 | if payload['write']=='ok': | ||
|
r264 | self.device.status = 3 | ||
|
r185 | self.device.save() | ||
r346 | self.message = 'USRP Rx configured and started' | |||
|
r185 | else: | ||
|
r236 | self.device.status = 1 | ||
|
r185 | self.device.save() | ||
r346 | self.message = 'USRP Rx write: {}'.format(payload['write']) | |||
|
r185 | return False | ||
|
r243 | |||
r299 | #payload = self.request('start', 'post') | |||
|
r185 | except Exception as e: | ||
|
r222 | if 'No route to host' not in str(e): | ||
self.device.status = 4 | ||||
else: | ||||
self.device.status = 0 | ||||
r346 | self.message = 'USRP Rx write: {}'.format(str(e)) | |||
|
r222 | self.device.save() | ||
|
r185 | return False | ||
|
r243 | |||
|
r185 | return True | ||
|
r172 | |||
|
r264 | def get_absolute_url_import(self): | ||
r345 | return reverse('url_import_usrp_rx_conf', args=[str(self.id)]) | |||
|
r172 | |||
|
r328 | |||