import ast import json import requests import base64 import struct from struct import pack import time from django.contrib import messages from django.db import models from django.urls import reverse from django.core.validators import MinValueValidator, MaxValueValidator from apps.main.models import Configuration MODE_VALUE = ( ('SPD', 'speed'), ('POS', 'position') ) AXIS_VALUE = ( ('AZI', 'azimuth'), ('ELE', 'elevation') ) class PedestalDevConfiguration(Configuration): mode = models.CharField( verbose_name='Mode', max_length=3, choices=MODE_VALUE, null=False, blank=False ) axis = models.CharField( verbose_name='Axis', max_length=3, choices=AXIS_VALUE, null=False, blank=False ) speed = models.FloatField( verbose_name='Speed', validators=[MinValueValidator(-20), MaxValueValidator(20)], blank=True, null=True ) position = models.FloatField( verbose_name='Position', validators=[MinValueValidator(0), MaxValueValidator(360)], blank=True, null =True ) class Meta: db_table = 'pedestal_dev_configurations' def __str__(self): return str(self.label) def get_absolute_url_plot(self): return reverse('url_plot_pedestal_dev_pulses', args=[str(self.id)]) def request(self, cmd, method='get', **kwargs): req = getattr(requests, method)(self.device.url(cmd), **kwargs) payload = req.json() return payload def status_device(self): try: #self.device.status = 0 #payload = self.request('status') payload = requests.get(self.device.url()) print(payload) if payload: self.device.status = 1 elif payload['status']=='disable': self.device.status = 2 else: self.device.status = 1 self.device.save() self.message = 'Pedestal Dev status: {}'.format(payload['status']) return False except Exception as e: if 'No route to host' not in str(e): self.device.status = 4 self.device.save() self.message = 'Pedestal Dev status: {}'.format(str(e)) return False self.device.save() return True def reset_device(self): try: payload = self.request('reset', 'post') if payload['reset']=='ok': self.message = 'Pedestal Dev restarted OK' self.device.status = 2 self.device.save() else: self.message = 'Pedestal Dev restart fail' self.device.status = 4 self.device.save() except Exception as e: self.message = 'Pedestal Dev reset: {}'.format(str(e)) return False return True def stop_device(self): try: command = self.device.url() + "stop" r = requests.get(command) if r: self.device.status = 4 self.device.save() self.message = 'Pedestal Dev stopped' else: self.device.status = 4 self.device.save() return False except Exception as e: if 'No route to host' not in str(e): self.device.status = 4 else: self.device.status = 0 #self.message = 'Pedestal Dev stop: {}'.format(str(e)) self.message = "Pedestal Dev can't start, please check network/device connection or IP address/port configuration" self.device.save() return False return True def start_device(self): try: pedestal = PedestalDevConfiguration.objects.get(pk=self) print(pedestal) pedestal_axis = pedestal.get_axis_display() print(pedestal_axis) if pedestal.mode=='SPD': data = {'axis': pedestal_axis, 'speed': pedestal.speed} json_data = json.dumps(data) elif pedestal.mode=='POS': data = {'axis': pedestal_axis, 'position': pedestal.position} json_data = json.dumps(data) print(json_data) base64_mode = base64.urlsafe_b64encode(json_data.encode('ascii')) mode_url = self.device.url() + "aspeed?params=" complete_url = mode_url + base64_mode.decode('ascii') print(complete_url) #time.sleep(10) r = requests.get(complete_url) if r: self.device.status = 3 self.device.save() self.message = 'Pedestal Dev configured and started' else: return False except Exception as e: if 'No route to host' not in str(e): self.device.status = 4 else: self.device.status = 0 #self.message = 'Pedestal Dev start: {}'.format(str(e)) self.message = "Pedestal Dev can't start, please check network/device connection or IP address/port configuration" self.device.save() return False return True #def write_device(self, raw=False): if not raw: clock = RCClock.objects.get(rc_configuration=self) print(clock) 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)) print(payload) if payload['command'] != 'ok': self.message = 'Pedestal Dev write: {}'.format(payload['command']) else: self.message = payload['programming'] if payload['programming'] == 'fail': self.message = 'Pedestal Dev write: error programming CGS chip' values = [] for pulse, delay in zip(self.get_pulses(), self.get_delays()): while delay>65536: values.append((pulse, 65535)) delay -= 65536 values.append((pulse, delay-1)) data = bytearray() #reset data.extend((128, 0)) #disable data.extend((129, 0)) #SW switch if self.control_sw: data.extend((130, 2)) else: data.extend((130, 0)) #divider data.extend((131, self.clock_divider-1)) #enable writing data.extend((139, 62)) last = 0 for tup in values: vals = pack('