Skip to content

Commit f4b3ab5

Browse files
authored
Merge pull request #39 from arduino/dev
1.1.2 - mpy 1.24 compatibility
2 parents 6934df7 + ec88c74 commit f4b3ab5

33 files changed

+546
-385
lines changed

arduino_alvik/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
__author__ = "Lucio Rossi <[email protected]>, Giovanni Bruno <[email protected]>"
66
__license__ = "MPL 2.0"
7-
__version__ = "1.1.1"
7+
__version__ = "1.1.2"
88
__maintainer__ = "Lucio Rossi <[email protected]>, Giovanni Bruno <[email protected]>"
99
__required_firmware_version__ = "1.1.0"
1010

arduino_alvik/arduino_alvik.py

+45-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import sys
2-
import gc
32
import struct
43
from machine import I2C
54
import _thread
@@ -84,6 +83,14 @@ def __init__(self):
8483
self._move_events = _ArduinoAlvikMoveEvents()
8584
self._timer_events = _ArduinoAlvikTimerEvents(-1)
8685

86+
def __del__(self):
87+
"""
88+
This method is a stub. __del__ is not implemented in MicroPython (https://docs.micropython.org/en/latest/genrst/core_language.html#special-method-del-not-implemented-for-user-defined-classes)
89+
:return:
90+
"""
91+
...
92+
# self.__class__._instance = None
93+
8794
@staticmethod
8895
def is_on() -> bool:
8996
"""
@@ -254,13 +261,19 @@ def _wait_for_ack(self) -> None:
254261
sleep_ms(20)
255262
self._waiting_ack = None
256263

257-
def _wait_for_fw_check(self) -> bool:
264+
def _wait_for_fw_check(self, timeout=5) -> bool:
258265
"""
259266
Waits until receives version from robot, check required version and return true if everything is ok
267+
:param timeout: wait for fw timeout in seconds
260268
:return:
261269
"""
270+
start = ticks_ms()
262271
while self._fw_version == [None, None, None]:
263272
sleep_ms(20)
273+
if ticks_diff(ticks_ms(), start) > timeout * 1000:
274+
print("Could not get FW version")
275+
return False
276+
264277
if self.check_firmware_compatibility():
265278
return True
266279
else:
@@ -272,8 +285,7 @@ def _flush_uart():
272285
Empties the UART buffer
273286
:return:
274287
"""
275-
while uart.any():
276-
uart.read(1)
288+
uart.read(uart.any())
277289

278290
def _begin_update_thread(self):
279291
"""
@@ -377,10 +389,6 @@ def stop(self):
377389
# stop touch events thread
378390
self._stop_events_thread()
379391

380-
# delete _instance
381-
del self.__class__._instance
382-
gc.collect()
383-
384392
@staticmethod
385393
def _reset_hw():
386394
"""
@@ -641,21 +649,22 @@ def _update(self, delay_=1):
641649
self.set_behaviour(2)
642650
if not ArduinoAlvik._update_thread_running:
643651
break
644-
if self._read_message():
645-
self._parse_message()
652+
self._read_message()
646653
sleep_ms(delay_)
647654

648-
def _read_message(self) -> bool:
655+
def _read_message(self) -> None:
649656
"""
650657
Read a message from the uC
651658
:return: True if a message terminator was reached
652659
"""
653-
while uart.any():
654-
b = uart.read(1)[0]
655-
self._packeter.buffer.push(b)
656-
if b == self._packeter.end_index and self._packeter.checkPayload():
657-
return True
658-
return False
660+
buf = bytearray(uart.any())
661+
uart.readinto(buf)
662+
if len(buf):
663+
uart.readinto(buf)
664+
for b in buf:
665+
self._packeter.buffer.push(b)
666+
if b == self._packeter.end_index and self._packeter.checkPayload():
667+
self._parse_message()
659668

660669
def _parse_message(self) -> int:
661670
"""
@@ -2096,6 +2105,19 @@ def update_firmware(file_path: str):
20962105
STM32_eraseMEM,
20972106
STM32_writeMEM, )
20982107

2108+
def flash_toggle():
2109+
i = 0
2110+
2111+
while True:
2112+
if i == 0:
2113+
LEDR.value(1)
2114+
LEDG.value(0)
2115+
else:
2116+
LEDR.value(0)
2117+
LEDG.value(1)
2118+
i = (i + 1) % 2
2119+
yield
2120+
20992121
if CHECK_STM32.value() is not 1:
21002122
print("Turn on your Alvik to continue...")
21012123
while CHECK_STM32.value() is not 1:
@@ -2112,8 +2134,13 @@ def update_firmware(file_path: str):
21122134
STM32_eraseMEM(0xFFFF)
21132135

21142136
print("\nWRITING MEM")
2115-
STM32_writeMEM(file_path)
2137+
toggle = flash_toggle()
2138+
STM32_writeMEM(file_path, toggle)
2139+
21162140
print("\nDONE")
21172141
print("\nLower Boot0 and reset STM32")
21182142

2143+
LEDR.value(1)
2144+
LEDG.value(1)
2145+
21192146
STM32_endCommunication()

arduino_alvik/stm32_flash.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ def STM32_readMEM(pages: int):
296296
_incrementAddress(readAddress)
297297

298298

299-
def STM32_writeMEM(file_path: str):
299+
def STM32_writeMEM(file_path: str, toggle: "Generator" = None):
300300

301301
with open(file_path, 'rb') as f:
302302
print(f"Flashing {file_path}\n")
@@ -326,6 +326,8 @@ def STM32_writeMEM(file_path: str):
326326
sys.stdout.write(f"{int((i/file_pages)*100)}%")
327327
i = i + 1
328328
_incrementAddress(writeAddress)
329+
if toggle is not None:
330+
next(toggle)
329331

330332

331333
def _STM32_standardEraseMEM(pages: int, page_list: bytearray = None):

examples/actuators/leds_setting.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from arduino_alvik import ArduinoAlvik
22
from time import sleep_ms
3-
import sys
3+
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
@@ -34,4 +34,4 @@
3434
except KeyboardInterrupt as e:
3535
print('over')
3636
alvik.stop()
37-
sys.exit()
37+
break

examples/actuators/move_wheels.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from arduino_alvik import ArduinoAlvik
22
from time import sleep_ms
3-
import sys
3+
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
@@ -33,4 +33,4 @@
3333
except KeyboardInterrupt as e:
3434
print('over')
3535
alvik.stop()
36-
sys.exit()
36+
break

examples/actuators/pose_example.py

+62-64
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,80 @@
11
from arduino_alvik import ArduinoAlvik
22
from time import sleep_ms
3-
import sys
3+
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
77

8-
while True:
9-
try:
8+
try:
9+
10+
alvik.move(100.0, 'mm')
11+
print("on target after move")
12+
13+
alvik.move(50.0, 'mm')
14+
print("on target after move")
15+
16+
alvik.rotate(90.0, 'deg')
17+
print("on target after rotation")
1018

11-
alvik.move(100.0, 'mm')
12-
print("on target after move")
19+
alvik.rotate(-45.00, 'deg')
20+
print("on target after rotation")
1321

14-
alvik.move(50.0, 'mm')
15-
print("on target after move")
22+
x, y, theta = alvik.get_pose()
23+
print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
1624

17-
alvik.rotate(90.0, 'deg')
18-
print("on target after rotation")
25+
alvik.reset_pose(0, 0, 0)
1926

20-
alvik.rotate(-45.00, 'deg')
21-
print("on target after rotation")
27+
x, y, theta = alvik.get_pose()
28+
print(f'Updated pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
29+
sleep_ms(500)
2230

23-
x, y, theta = alvik.get_pose()
24-
print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
31+
print("___________NON-BLOCKING__________________")
2532

26-
alvik.reset_pose(0, 0, 0)
33+
alvik.move(50.0, 'mm', blocking=False)
2734

28-
x, y, theta = alvik.get_pose()
29-
print(f'Updated pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
35+
while not alvik.is_target_reached():
36+
alvik.left_led.set_color(1, 0, 0)
37+
sleep_ms(500)
38+
alvik.left_led.set_color(0, 0, 0)
39+
sleep_ms(500)
40+
print("on target after move")
41+
42+
alvik.rotate(45.0, 'deg', blocking=False)
43+
while not alvik.is_target_reached():
44+
alvik.left_led.set_color(1, 0, 0)
45+
sleep_ms(500)
46+
alvik.left_led.set_color(0, 0, 0)
3047
sleep_ms(500)
48+
print("on target after rotation")
3149

32-
print("___________NON-BLOCKING__________________")
33-
34-
alvik.move(50.0, 'mm', blocking=False)
35-
36-
while not alvik.is_target_reached():
37-
alvik.left_led.set_color(1, 0, 0)
38-
sleep_ms(500)
39-
alvik.left_led.set_color(0, 0, 0)
40-
sleep_ms(500)
41-
print("on target after move")
42-
43-
alvik.rotate(45.0, 'deg', blocking=False)
44-
while not alvik.is_target_reached():
45-
alvik.left_led.set_color(1, 0, 0)
46-
sleep_ms(500)
47-
alvik.left_led.set_color(0, 0, 0)
48-
sleep_ms(500)
49-
print("on target after rotation")
50-
51-
alvik.move(100.0, 'mm', blocking=False)
52-
while not alvik.is_target_reached():
53-
alvik.left_led.set_color(1, 0, 0)
54-
sleep_ms(500)
55-
alvik.left_led.set_color(0, 0, 0)
56-
sleep_ms(500)
57-
print("on target after move")
58-
59-
alvik.rotate(-90.00, 'deg', blocking=False)
60-
while not alvik.is_target_reached():
61-
alvik.left_led.set_color(1, 0, 0)
62-
sleep_ms(500)
63-
alvik.left_led.set_color(0, 0, 0)
64-
sleep_ms(500)
65-
print("on target after rotation")
66-
67-
x, y, theta = alvik.get_pose()
68-
print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
69-
70-
alvik.reset_pose(0, 0, 0)
71-
72-
x, y, theta = alvik.get_pose()
73-
print(f'Updated pose is x={x}, y={y}, theta(deg)={theta}')
50+
alvik.move(100.0, 'mm', blocking=False)
51+
while not alvik.is_target_reached():
52+
alvik.left_led.set_color(1, 0, 0)
7453
sleep_ms(500)
54+
alvik.left_led.set_color(0, 0, 0)
55+
sleep_ms(500)
56+
print("on target after move")
57+
58+
alvik.rotate(-90.00, 'deg', blocking=False)
59+
while not alvik.is_target_reached():
60+
alvik.left_led.set_color(1, 0, 0)
61+
sleep_ms(500)
62+
alvik.left_led.set_color(0, 0, 0)
63+
sleep_ms(500)
64+
print("on target after rotation")
65+
66+
x, y, theta = alvik.get_pose()
67+
print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}')
68+
69+
alvik.reset_pose(0, 0, 0)
70+
71+
x, y, theta = alvik.get_pose()
72+
print(f'Updated pose is x={x}, y={y}, theta(deg)={theta}')
73+
sleep_ms(500)
7574

76-
alvik.stop()
77-
sys.exit()
75+
except KeyboardInterrupt as e:
76+
print('Test interrupted')
7877

79-
except KeyboardInterrupt as e:
80-
print('over')
81-
alvik.stop()
82-
sys.exit()
78+
finally:
79+
alvik.stop()
80+
print("END of pose example")

examples/actuators/set_servo.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from arduino_alvik import ArduinoAlvik
22
from time import sleep_ms
3-
import sys
3+
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
@@ -19,4 +19,4 @@
1919
except KeyboardInterrupt as e:
2020
print('over')
2121
alvik.stop()
22-
sys.exit()
22+
break

examples/actuators/wheels_position.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from arduino_alvik import ArduinoAlvik
22
from time import sleep, sleep_ms
3-
import sys
3+
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
@@ -62,4 +62,4 @@
6262
except KeyboardInterrupt as e:
6363
print('over')
6464
alvik.stop()
65-
sys.exit()
65+
break

examples/actuators/wheels_speed.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from arduino_alvik import ArduinoAlvik
22
from time import sleep_ms
3-
import sys
3+
44

55
alvik = ArduinoAlvik()
66
alvik.begin()
@@ -21,4 +21,4 @@
2121
except KeyboardInterrupt as e:
2222
print('over')
2323
alvik.stop()
24-
sys.exit()
24+
break

0 commit comments

Comments
 (0)