|
8 | 8 | >>> device.disconnect()
|
9 | 9 | """
|
10 | 10 |
|
| 11 | +from __future__ import annotations |
| 12 | + |
11 | 13 | try:
|
12 | 14 | import grp
|
13 | 15 | except ImportError:
|
|
18 | 20 | import platform
|
19 | 21 | import struct
|
20 | 22 | import time
|
| 23 | +from dataclasses import dataclass |
21 | 24 | from functools import partial, update_wrapper
|
22 | 25 | from typing import List, Union
|
23 | 26 |
|
@@ -64,6 +67,29 @@ def _get_version(port: str) -> str:
|
64 | 67 | return version.decode("utf-8")
|
65 | 68 |
|
66 | 69 |
|
| 70 | +@dataclass |
| 71 | +class FirmwareVersion: |
| 72 | + """Version of pslab-firmware running on connected device. |
| 73 | +
|
| 74 | + Uses semantic versioning conventions. |
| 75 | +
|
| 76 | + Attributes |
| 77 | + ---------- |
| 78 | + major : int |
| 79 | + Major version. Incremented when backward imcompatible changes are made. |
| 80 | + minor : int |
| 81 | + Minor version. Incremented when new functionality is added, or existing |
| 82 | + functionality is changed in a backward compatible manner. |
| 83 | + patch : int |
| 84 | + Patch version. Incremented when bug fixes are made with do not change the |
| 85 | + PSLab's documented behavior. |
| 86 | + """ |
| 87 | + |
| 88 | + major: int |
| 89 | + minor: int |
| 90 | + patch: int |
| 91 | + |
| 92 | + |
67 | 93 | class SerialHandler:
|
68 | 94 | """Provides methods for communicating with the PSLab hardware.
|
69 | 95 |
|
@@ -105,6 +131,7 @@ def __init__(
|
105 | 131 | self.check_serial_access_permission()
|
106 | 132 | self.connect(port=port, baudrate=baudrate, timeout=timeout)
|
107 | 133 | self.connected = self.interface.is_open
|
| 134 | + self.firmware = self.get_firmware_version() |
108 | 135 |
|
109 | 136 | @staticmethod
|
110 | 137 | def check_serial_access_permission():
|
@@ -264,6 +291,30 @@ def get_version(self) -> str:
|
264 | 291 | version = self.interface.readline()
|
265 | 292 | return version.decode("utf-8")
|
266 | 293 |
|
| 294 | + def get_firmware_version(self) -> FirmwareVersion: |
| 295 | + """Get firmware version. |
| 296 | +
|
| 297 | + Returns |
| 298 | + ------- |
| 299 | + tuple[int, int, int] |
| 300 | + major, minor, patch. |
| 301 | +
|
| 302 | + """ |
| 303 | + self.send_byte(CP.COMMON) |
| 304 | + self.send_byte(CP.GET_FW_VERSION) |
| 305 | + |
| 306 | + try: |
| 307 | + # Firmware version query was added in firmware version 3.0.0. |
| 308 | + major = self.get_byte() |
| 309 | + minor = self.get_byte() |
| 310 | + patch = self.get_byte() |
| 311 | + except serial.SerialException: |
| 312 | + major = 2 |
| 313 | + minor = 0 |
| 314 | + patch = 0 |
| 315 | + |
| 316 | + return FirmwareVersion(major, minor, patch) |
| 317 | + |
267 | 318 | def get_ack(self) -> int:
|
268 | 319 | """Get response code from PSLab.
|
269 | 320 |
|
|
0 commit comments