##// END OF EJS Templates
Update models.py Pedestal (reset_device)
eynilupu -
r395:cca183391e32
parent child
Show More
@@ -1,245 +1,255
1 1 import ast
2 2 import json
3 3 import requests
4 4 import base64
5 5 import struct
6 6 from struct import pack
7 7 import time
8 8 from django.contrib import messages
9 9 from django.db import models
10 10 from django.urls import reverse
11 11 from django.core.validators import MinValueValidator, MaxValueValidator
12 12
13 13 from apps.main.models import Configuration
14 14
15 15 MODE_VALUE = (
16 16 ('position', 'Position'),
17 17 ('speed', 'Speed'),
18 18 ('table', 'Table')
19 19 )
20 20
21 21 class PedestalConfiguration(Configuration):
22 22
23 23 mode = models.CharField(
24 24 verbose_name='Mode',
25 25 max_length=10,
26 26 choices=MODE_VALUE,
27 27 null=False,
28 28 blank=False
29 29 )
30 30
31 31 axis = models.CharField(
32 32 verbose_name="Axis",
33 33 max_length=100,
34 34 default='az',
35 35 blank=False,
36 36 null=False,
37 37 help_text="Please separate the values with commas when using table mode"
38 38 )
39 39
40 40 speed = models.CharField(
41 41 verbose_name='Speed',
42 42 max_length=100,
43 43 blank=False,
44 44 null=False,
45 45 default=6
46 46 )
47 47
48 48 angle = models.CharField(
49 49 verbose_name="Angle(s)",
50 50 max_length=100,
51 51 default='0',
52 52 blank=False,
53 53 null=False,
54 54 help_text="Please separate the values with commas when using table mode"
55 55 )
56 56
57 57 min_value = models.FloatField(
58 58 verbose_name='Min angle',
59 59 validators=[MinValueValidator(-5), MaxValueValidator(185)],
60 60 blank=False,
61 61 null=False,
62 62 default=0
63 63 )
64 64
65 65 max_value = models.FloatField(
66 66 verbose_name='Max angle',
67 67 validators=[MinValueValidator(-5), MaxValueValidator(185)],
68 68 blank=False,
69 69 null=False,
70 70 default=40
71 71 )
72 72
73 73 class Meta:
74 74 db_table = 'pedestal_configurations'
75 75
76 76 def __str__(self):
77 77 if self.mode=='position':
78 78 return u'Position: {}ΒΊ {}'.format(self.angle, self.axis.upper())
79 79 if self.mode=='speed':
80 80 return u'Speed: {}ΒΊ/s {}'.format(self.speed, self.axis.upper())
81 81 if self.mode=='table':
82 82 axis = [x.strip().upper() for x in self.axis.split(',')]
83 83 speeds = [float(x.strip()) for x in self.speed.split(',')]
84 84 table = [float(x.strip()) for x in self.angle.split(',')]
85 85 return u'Table: Axis {}, Speed {}ΒΊ/s, Steps {}'.format(axis, speeds, table)
86 86
87 87 @property
88 88 def label(self):
89 89 return str(self)
90 90
91 91 def get_absolute_url_plot(self):
92 92 return reverse('url_plot_pedestal_pulses', args=[str(self.id)])
93 93
94 94 def request(self, cmd, method='get', **kwargs):
95 95
96 96 req = getattr(requests, method)(self.device.url(cmd), **kwargs)
97 97 payload = req.json()
98 98
99 99 return payload
100 100
101 101 def status_device(self):
102 102
103 103 try:
104 104 payload = requests.get(self.device.url())
105 105
106 106 if payload:
107 107 self.device.status = 1
108 108 elif payload['status']=='disable':
109 109 self.device.status = 2
110 110 else:
111 111 self.device.status = 1
112 112 self.device.save()
113 113 self.message = 'Pedestal status: {}'.format(payload['status'])
114 114 return False
115 115 except Exception as e:
116 116 if 'No route to host' not in str(e):
117 117 self.device.status = 4
118 118 self.device.save()
119 119 self.message = 'Pedestal status: {}'.format(str(e))
120 120 return False
121 121
122 122 self.device.save()
123 123 return True
124 124
125 def reset_device(self):
125 def reset_device(self, axi, angle):
126 126
127 127 try:
128 128 url = self.device.url() + "position?params="
129 129
130 payload_el = {'axis': 'elevation', 'position': 0}
130 payload_el = {'axis': 'elevation'}
131 payload_az = {'axis': 'azimuth'}
132
133 if axi == 'elevation':
134 payload_az['position'] = angle
135 payload_el['position'] = 0
136 elif axi == 'azimuth':
137 payload_el['position'] = angle
138 payload_az['position'] = 0
139 else:
140 payload_el['position'] = 0
141 payload_az['position'] = 0
142
131 143 json_data_el = json.dumps(payload_el)
144 json_data_az = json.dumps(payload_az)
145
132 146 base64_table_el = base64.standard_b64encode(json_data_el.encode('ascii'))
147 base64_table_az = base64.standard_b64encode(json_data_az.encode('ascii'))
133 148
134 149 r = requests.get(url + base64_table_el.decode('ascii'))
135
136 payload_az = {'axis': 'azimuth', 'position': 0}
137 json_data_az = json.dumps(payload_az)
138 base64_table_az = base64.standard_b64encode(json_data_az.encode('ascii'))
139
140 150 r = requests.get(url + base64_table_az.decode('ascii'))
141
151
142 152 if r:
143 153 self.device.status = 3
144 154 self.device.save()
145 155 self.message = 'Pedestal reset'
146 156 else:
147 157 return False
148 158
149 159 except Exception as e:
150 160 self.message = 'Pedestal reset: {}'.format(str(e))
151 161 return False
152 162
153 163 return True
154 164
155 165 def stop_device(self):
156 166
157 167 try:
158 168 command = self.device.url() + "stop"
159 169 r = requests.get(command)
160 170 if r:
161 171 self.device.status = 4
162 172 self.device.save()
163 173 self.message = 'Pedestal stopped'
164 174 else:
165 175 self.device.status = 4
166 176 self.device.save()
167 177 return False
168 178 except Exception as e:
169 179 if 'No route to host' not in str(e):
170 180 self.device.status = 4
171 181 else:
172 182 self.device.status = 0
173 183 #self.message = 'Pedestal stop: {}'.format(str(e))
174 184 self.message = "Pedestal can't start, please check network/device connection or IP address/port configuration"
175 185 self.device.save()
176 186 return False
177 187
178 188 return True
179 189
180 190 def start_device(self):
181 191
182 192 AX = {'az':'azimuth', 'el':'elevation'}
183 193 axis = [AX[x.lower().strip()] for x in self.axis.split(',')]
184 194 if len(axis)==1:
185 195 axis = axis[0]
186 196
187 197 try:
188 198 if self.mode == 'position':
189 199 url = self.device.url() + "position?params="
190 200 payload = {'axis': axis, 'position': float(self.angle)}
191 201 elif self.mode == 'speed':
192 202 url = self.device.url() + "speed?params="
193 203 payload = {'axis': axis, 'speed': float(self.speed)}
194 204 elif self.mode == 'table':
195 self.reset_device()
196 205 url = self.device.url() + "combinedtable?params="
197 206 list_of_floats = [float(x.strip()) for x in self.angle.split(",")]
198 207 byte_table = []
199 208 for x in list_of_floats:
200 209 temp = bytearray(struct.pack("f", x))
201 210 byte_table.append(temp[3])
202 211 byte_table.append(temp[2])
203 212 byte_table.append(temp[1])
204 213 byte_table.append(temp[0])
205 214
206 215 coded_table = base64.standard_b64encode(bytes(byte_table))
207 216 coded_table_ascii = coded_table.decode('ascii')
208 217 speed = [float(x.strip()) for x in self.speed.split(',')]
209 218 payload = {
210 219 'arraylength': len(speed),
211 220 'axis': axis,
212 221 'speed': speed,
213 222 'bottom': self.min_value,
214 223 'top': self.max_value,
215 224 'table': coded_table_ascii
216 225 }
226 self.reset_device(axis[0], list_of_floats[0])
217 227 time.sleep(15)
218 228
219 229 json_data = json.dumps(payload)
220 230 print(json_data)
221 231 base64_table = base64.standard_b64encode(json_data.encode('ascii'))
222 232 url += base64_table.decode('ascii')
223 233 print(url)
224 234 r = requests.get(url)
225 235
226 236 if r:
227 237 self.device.status = 3
228 238 self.device.save()
229 239 self.message = 'Pedestal configured and started'
230 240 else:
231 241 return False
232 242 except Exception as e:
233 243 if 'No route to host' not in str(e):
234 244 self.device.status = 4
235 245 else:
236 246 self.device.status = 0
237 247 #self.message = 'Pedestal start: {}'.format(str(e))
238 248 self.message = "Pedestal can't start, please check network/device connection or IP address/port configuration"
239 249 self.device.save()
240 250 return False
241 251
242 252 return True
243 253
244 254 def get_absolute_url_import(self):
245 255 return reverse('url_import_pedestal_conf', args=[str(self.id)])
General Comments 0
You need to be logged in to leave comments. Login now