|
13 | 13 | from .robot_definitions import *
|
14 | 14 | from .constants import *
|
15 | 15 |
|
| 16 | +from .__init__ import __version__ |
| 17 | +from .__init__ import __required_firmware_version__ |
| 18 | + |
16 | 19 |
|
17 | 20 | class ArduinoAlvik:
|
18 | 21 | _update_thread_running = False
|
@@ -73,7 +76,9 @@ def __init__(self):
|
73 | 76 | self._angular_velocity = None
|
74 | 77 | self._last_ack = None
|
75 | 78 | self._waiting_ack = None
|
76 |
| - self._version = [None, None, None] |
| 79 | + self._version = list(map(int, __version__.split('.'))) |
| 80 | + self._fw_version = [None, None, None] |
| 81 | + self._required_fw_version = list(map(int, __required_firmware_version__.split('.'))) |
77 | 82 | self._touch_events = _ArduinoAlvikTouchEvents()
|
78 | 83 | self._move_events = _ArduinoAlvikMoveEvents()
|
79 | 84 | self._timer_events = _ArduinoAlvikTimerEvents(-1)
|
@@ -208,6 +213,9 @@ def begin(self) -> int:
|
208 | 213 | self._flush_uart()
|
209 | 214 | self._snake_robot(1000)
|
210 | 215 | self._wait_for_ack()
|
| 216 | + if not self._wait_for_fw_check(): |
| 217 | + print('\n********** PLEASE UPDATE ALVIK FIRMWARE! Check documentation **********\n') |
| 218 | + sys.exit(-2) |
211 | 219 | self._snake_robot(2000)
|
212 | 220 | self.set_illuminator(True)
|
213 | 221 | self.set_behaviour(1)
|
@@ -241,6 +249,18 @@ def _wait_for_ack(self) -> None:
|
241 | 249 | sleep_ms(20)
|
242 | 250 | self._waiting_ack = None
|
243 | 251 |
|
| 252 | + def _wait_for_fw_check(self) -> bool: |
| 253 | + """ |
| 254 | + Waits until receives version from robot, check required version and return true if everything is ok |
| 255 | + :return: |
| 256 | + """ |
| 257 | + while self._fw_version == [None, None, None]: |
| 258 | + sleep_ms(20) |
| 259 | + if self.check_firmware_compatibility(): |
| 260 | + return True |
| 261 | + else: |
| 262 | + return False |
| 263 | + |
244 | 264 | @staticmethod
|
245 | 265 | def _flush_uart():
|
246 | 266 | """
|
@@ -689,7 +709,7 @@ def _parse_message(self) -> int:
|
689 | 709 | _, self._x, self._y, self._theta = self._packeter.unpacketC3F()
|
690 | 710 | elif code == 0x7E:
|
691 | 711 | # firmware version
|
692 |
| - _, *self._version = self._packeter.unpacketC3B() |
| 712 | + _, *self._fw_version = self._packeter.unpacketC3B() |
693 | 713 | else:
|
694 | 714 | return -1
|
695 | 715 |
|
@@ -1053,20 +1073,56 @@ def get_distance_bottom(self, unit: str = 'cm') -> float | None:
|
1053 | 1073 | """
|
1054 | 1074 | return convert_distance(self._bottom_tof, 'mm', unit)
|
1055 | 1075 |
|
1056 |
| - def get_version(self) -> str: |
| 1076 | + def get_version(self, version: str = 'fw') -> str: |
| 1077 | + """ |
| 1078 | + Returns the version of the Alvik firmware or micropython library |
| 1079 | + :param version: |
| 1080 | + :return: |
| 1081 | + """ |
| 1082 | + if version == 'fw' or version == 'FW' or version == 'firmware': |
| 1083 | + return self.get_fw_version() |
| 1084 | + elif version == 'lib' or version == 'LIB': |
| 1085 | + return self.get_lib_version() |
| 1086 | + else: |
| 1087 | + return f'{None, None, None}' |
| 1088 | + |
| 1089 | + def get_lib_version(self) -> str: |
1057 | 1090 | """
|
1058 |
| - Returns the firmware version of the Alvik |
| 1091 | + Returns the micropython library version of the Alvik |
1059 | 1092 | :return:
|
1060 | 1093 | """
|
1061 | 1094 | return f'{self._version[0]}.{self._version[1]}.{self._version[2]}'
|
| 1095 | + |
| 1096 | + def get_fw_version(self) -> str: |
| 1097 | + """ |
| 1098 | + Returns the firmware version of the Alvik Carrier |
| 1099 | + :return: |
| 1100 | + """ |
| 1101 | + return f'{self._fw_version[0]}.{self._fw_version[1]}.{self._fw_version[2]}' |
| 1102 | + |
| 1103 | + def get_required_fw_version(self) -> str: |
| 1104 | + """ |
| 1105 | + Returns the required firmware version of the Alvik Carrier for this micropython library |
| 1106 | + :return: |
| 1107 | + """ |
| 1108 | + return f'{self._required_fw_version[0]}.{self._required_fw_version[1]}.{self._required_fw_version[2]}' |
| 1109 | + |
| 1110 | + def check_firmware_compatibility(self) -> bool: |
| 1111 | + """ |
| 1112 | + Returns true if the library and the firmware are compatible |
| 1113 | + :return: |
| 1114 | + """ |
| 1115 | + return self._fw_version == self._required_fw_version |
1062 | 1116 |
|
1063 | 1117 | def print_status(self):
|
1064 | 1118 | """
|
1065 | 1119 | Prints the Alvik status
|
1066 | 1120 | :return:
|
1067 | 1121 | """
|
1068 | 1122 | print('---ALVIK STATUS---')
|
1069 |
| - print(f'VERSION: {self._version}') |
| 1123 | + print(f'LIBRARY VERSION: {self._version}') |
| 1124 | + print(f'REQUIRED FW VERSION: {self._required_fw_version}') |
| 1125 | + print(f'FIRMWARE VERSION: {self._fw_version}') |
1070 | 1126 |
|
1071 | 1127 | print('---SENSORS---')
|
1072 | 1128 | print(f'TOF: T:{self._top_tof} B:{self._bottom_tof} L:{self._left_tof} CL:{self._center_left_tof}' +
|
|
0 commit comments