ME 405 Romi
Loading...
Searching...
No Matches
ui.py
Go to the documentation of this file.
1from pyb import USB_VCP
2from pyb import UART
3
8class ui:
9
30 def __init__(self, testing_flg, m_state_l, m_state_r, position, velocity, times, PWM_l, PWM_r,
31 delay, uart_obj,fwd_ref, arc_ref, piv_ref, c_state, velocity2, need_Calibrate, ready_Black,
32 ready_White, automatic_mode, imu_flg):
33 self.testing_flg = testing_flg
34 self.m_state_l = m_state_l
35 self.m_state_r = m_state_r
36 self.position = position
37 self.velocity = velocity
38 self.times = times
39 self.state=0
40 self.ser=USB_VCP()
41 self.output = 10
42 self.last_test = 2
43 self.next_test = 0
44 self.time_idx = 0
45 self.PWM_l = PWM_l
46 self.PWM_r = PWM_r
47 self.delay=delay
48 self.uart = uart_obj
49 self.headers_v = 0
50 self.headers_p = 0
51 self.ui_delay = 0
52 self.fwd_ref = fwd_ref
53 self.msg_send = 0
54 self.arc_ref = arc_ref
55 self.piv_ref = piv_ref
56 self.c_state = c_state
57 self.velocity2 = velocity2
58 self.which_test = 0
59 self.test_ref = 0
60 self.ref_got = False
61 self.need_Calibrate = need_Calibrate
62 self.ready_Black = ready_Black
63 self.ready_White = ready_White
65 self.c_state.put(0)
66 self.automatic_mode = automatic_mode
67 self.imu_flg = imu_flg
68
69
99 def run(self):
100
101 while True:
102 # Check for start command from bluetooth
103 if self.state==0:
104 # Comment out if you want to run tests on the bot
105 # Keep in if you want bot to just try to follow a line
106 #print("checking if needs calibration")
107 #print(self.need_Calibrate.get())
108 if self.need_Calibrate.get() == 1:
109 print("checked Need calibrate)")
110 if self.data_requested == 0:
111 self.uart.write(b"Need Calibration Data\r\n")
112 self.data_requested = 1
113 self.state = 10
114
115 self.delay.put(0)
116 #self.uart.write(b"still running rn")
117 if self.uart.any():
118 print("waiting")
119 # char_in = self.uart.read(1).decode()
120 # Full motor step response test
121 if char_in == "s":
122 self.state=1
123 # Straight drive
124 elif char_in == "1":
125 self.state=4
126 self.ref_got = False
127 # Arced turn
128 elif char_in == "2":
129 self.state=5
130 self.ref_got = False
131 # Pivot turn
132 elif char_in == "3":
133 self.state=6
134 self.ref_got = False
135 # Stop command
136 elif char_in == "0":
137 self.state = 7
138 self.ref_got = False
139 # Testing state
140 elif char_in == "t":
141 print("got a t")
142 self.state = 8
143 self.ref_got = False
144 self.which_test = 0
145 self.test_ref = 0
146 elif char_in == "g":
147 self.state = 12
148 elif char_in == "i":
149 self.state = 13
150 yield 0
151 # Test Setup
152 elif self.state == 1:
153 # Check for motor delays
154 if self.delay.get() == 0:
155 if self.testing_flg.get() == 0:
156 self.m_state_l.put(5)
157 self.m_state_r.put(5)
158 # Send start commands
159 if self.m_state_l.get()==1 and self.m_state_r.get() ==1:
160 # Flush queues
161 while self.velocity.any() == True:
162 self.velocity.get()
163 while self.position.any() == True:
164 self.position.get()
165 # Set motors
166 self.PWM_l.put(self.output)
167 self.PWM_r.put(self.output)
168 # Check for time for next kind of test
169 if self.next_test != 1:
170 self.testing_flg.put(self.last_test)
171 # If next kind of test go to new test
172 else:
173 self.testing_flg.put(self.last_test + 1)
174 # Go to next state and tell motors to update
175 self.state = 2
176 self.delay.put(0)
177 self.m_state_l.put(2)
178 self.m_state_r.put(2)
179 yield 1
180 # Waiting for data
181 elif self.state == 2:
182 # Velocity Tests
183 if self.testing_flg.get() <= 3:
184 if self.velocity.full() == True:
185 if self.output == 10 and self.headers_v == 0:
186 self.uart.write(b"Times, Velocity(mm/s)\r\n")
187 self.headers_v = 1
188 while self.velocity.any() == True:
189 self.uart.write(str(self.time_idx).encode())
190 self.uart.write(", ")
191 vel = (self.velocity.get())
192 self.uart.write(f"{vel:.3f}".encode())
193 self.uart.write(b"\r\n")
194 self.time_idx += 1
195 self.output += 10
196 #If that was the last test go to next test type
197 if self.output >= 110:
198 self.last_test = self.testing_flg.get()
199 self.next_test = 1
200 self.output = 10
201 self.time_idx = 0
202 self.testing_flg.put(0)
203 self.state = 3
204 yield 2
205 # Position Tests
206 else:
207 if self.position.full() == True:
208 if self.output == 10 and self.headers_p == 0:
209 self.uart.write(b"Times, Position(mm)\r\n")
210 self.headers_p = 1
211 while self.position.any() == True:
212 self.uart.write(str(self.time_idx).encode())
213 self.uart.write(", ")
214 pos = (self.position.get())
215 self.uart.write(f"{pos:.3f}".encode())
216 self.uart.write(b"\r\n")
217 self.time_idx += 1
218 self.output += 10
219 self.time_idx = 0
220 # If that was the last test go to wait state
221 if self.output >= 110:
222 self.last_test = self.testing_flg.get()
223 if self.last_test == 5:
224 # Reset variables for next test
225 self.testing_flg.put(0)
226 self.next_test = 0
227 self.PWM_l.put(0)
228 self.PWM_r.put(0)
229 self.delay.put(1)
230 self.m_state_l.put(2)
231 self.m_state_r.put(2)
232 self.output = 10
233 self.last_test = 2
234 self.state = 0
235 self.headers_p = 0
236 self.headers_v = 0
237 yield 2
238 self.next_test = 1
239 self.output = 10
240 self.testing_flg.put(0)
241 self.state = 3
242 yield 2
243 elif self.state == 3:
244 self.ui_delay += 1
245 if self.ui_delay >= 10:
246 self.state = 1
247 self.ui_delay = 0
248 yield 3
249 # Go forward state
250 elif self.state == 4:
251 if self.uart.any():
252 if self.ref_got == False:
253 self.fwd_ref.put(int(self.uart.readline().decode().strip()))
254 #print(self.fwd_ref.get())
255 self.ref_got = True
256 self.c_state.put(1)
257 if self.ref_got == True:
258 self.state = 0
259 yield 4
260 # Turn in an arc state
261 elif self.state == 5:
262 if self.uart.any():
263 if self.ref_got == False:
264 self.arc_ref.put(int(self.uart.readline().decode().strip()))
265 self.ref_got = True
266 self.c_state.put(2)
267 if self.ref_got == True:
268 self.state = 0
269 yield 5
270
271 # Pivot in place state
272 elif self.state == 6:
273 if self.uart.any():
274 if self.ref_got == False:
275 self.piv_ref.put(int(self.uart.readline().decode().strip()))
276 self.ref_got = True
277 self.c_state.put(3)
278 if self.ref_got == True:
279 self.state = 0
280 yield 6
281
282 # Stop command
283 elif self.state == 7:
284 print("Went to state 7")
285 self.arc_ref.put(0)
286 self.fwd_ref.put(0)
287 self.piv_ref.put(0)
288 self.c_state.put(4)
289 self.automatic_mode.put(0)
290 self.state = 0
291 yield 7
292
293 # Testing check
294 elif self.state == 8:
295 if self.uart.any():
296 if self.which_test == 0:
297 self.which_test = int(self.uart.readline().decode().strip())
298 print("Got which test")
299 print(self.which_test)
300 else:
301 self.test_ref = int(self.uart.readline().decode().strip())
302 print("Got a test ref")
303 print(self.test_ref)
304
305 # Setting up test
306 if self.test_ref != 0:
307 # Check for motor delays
308 if self.delay.get() == 0:
309
310 if self.testing_flg.get() == 0:
311 self.m_state_l.put(5)
312 self.m_state_r.put(5)
313
314 # Send start commands if delay over
315 if self.delay.get() == 1:
316 #if self.m_state_l.get()==1 and self.m_state_r.get() ==1:
317 # Flush queues
318 print("flsuh queues")
319 while self.velocity.any() == True:
320 self.velocity.get()
321 while self.velocity2.any() == True:
322 self.velocity2.get()
323 print("setting testing flag")
324 self.testing_flg.put(6)
325 else:
326 yield 8
327 continue
328 # Set up correct controller state
329 print("setting up controller")
330 if self.which_test == 1:
331 self.fwd_ref.put(self.test_ref)
332 self.c_state.put(1)
333 elif self.which_test == 2:
334 self.arc_ref.put(self.test_ref)
335 self.c_state.put(2)
336 elif self.which_test == 3:
337 self.piv_ref.put(self.test_ref)
338 self.c_state.put(3)
339 self.state = 9
340 yield 8
341 # Waiting for Data
342 elif self.state == 9:
343
344 if (self.velocity.full() == True) & (self.velocity2.full() == True):
345 print("About to send headers")
346 self.uart.write(b"Times, Velocity(mm/s)\r\n")
347 while self.velocity.any() == True:
348 print("About to send left motor data")
349 self.uart.write(str(self.time_idx).encode())
350 self.uart.write(", ")
351 vel = (self.velocity.get())
352 self.uart.write(f"{vel:.3f}".encode())
353 self.uart.write(b"\r\n")
354 self.time_idx += 1
355 print("Sent that bitch")
356 self.time_idx = 0
357 while self.velocity2.any() == True:
358 print("About to send right motor data")
359 self.uart.write(str(self.time_idx).encode())
360 self.uart.write(", ")
361 vel = (self.velocity2.get())
362 self.uart.write(f"{vel:.3f}".encode())
363 self.uart.write(b"\r\n")
364 self.time_idx += 1
365 print("Sent it")
366 self.time_idx = 0
367 self.delay.put(0)
368 self.testing_flg.put(0)
369 print("Asking motors to turn off")
370 self.state = 7
371 # Wait to get Black Calibration Data
372 elif self.state == 10:
373 if self.uart.any():
374 char_in = self.uart.read(1).decode()
375 if char_in == "1":
376 self.ready_Black.put(1)
377 self.state = 11
378 # Wait to get White Calibration Data
379 elif self.state == 11:
380 if self.uart.any():
381 char_in = self.uart.read(1).decode()
382 if char_in == "1":
383 self.ready_White.put(1)
384 self.state = 0
385 # Wait for go
386 elif self.state == 12:
387 print("went to state 12")
388 self.automatic_mode.put(1)
389 self.state = 0
390 yield 12
391 elif self.state == 13:
392 self.imu_flg.put(1)
393 self.state = 0
394 yield 13
395 else:
396 raise ValueError("Not that many states")
397 yield self.state
398
399
Initializes User Interface.
Definition ui.py:8
ready_White
Definition ui.py:63
PWM_l
Definition ui.py:45
times
Definition ui.py:38
velocity2
Definition ui.py:57
delay
Definition ui.py:47
uart
Definition ui.py:48
bool ref_got
Definition ui.py:60
m_state_l
Definition ui.py:34
int headers_v
Definition ui.py:49
int data_requested
Definition ui.py:64
run(self)
Runs the various tasks in UI.
Definition ui.py:99
automatic_mode
Definition ui.py:66
testing_flg
Definition ui.py:33
int state
Definition ui.py:39
imu_flg
Definition ui.py:67
int which_test
Definition ui.py:58
PWM_r
Definition ui.py:46
int next_test
Definition ui.py:43
need_Calibrate
Definition ui.py:61
int output
Definition ui.py:41
c_state
Definition ui.py:56
__init__(self, testing_flg, m_state_l, m_state_r, position, velocity, times, PWM_l, PWM_r, delay, uart_obj, fwd_ref, arc_ref, piv_ref, c_state, velocity2, need_Calibrate, ready_Black, ready_White, automatic_mode, imu_flg)
User Interface Initialization.
Definition ui.py:32
int test_ref
Definition ui.py:59
position
Definition ui.py:36
ser
Definition ui.py:40
int last_test
Definition ui.py:42
m_state_r
Definition ui.py:35
int msg_send
Definition ui.py:53
int headers_p
Definition ui.py:50
velocity
Definition ui.py:37
int time_idx
Definition ui.py:44
int ui_delay
Definition ui.py:51
fwd_ref
Definition ui.py:52
arc_ref
Definition ui.py:54
ready_Black
Definition ui.py:62
piv_ref
Definition ui.py:55