Skip to content

Commit 6841313

Browse files
authored
Merge pull request #50 from samatjain/type-annotations
lint: add almost all annotations to pass `mypy --strict`
2 parents 973ae0b + ccc0d22 commit 6841313

6 files changed

+161
-63
lines changed

adafruit_tinylora/adafruit_tinylora.py

Lines changed: 72 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,31 @@
2727

2828
import time
2929
from random import randint
30-
from micropython import const
30+
3131
import adafruit_bus_device.spi_device
32+
from micropython import const
33+
3234
from adafruit_tinylora.adafruit_tinylora_encryption import AES
3335

36+
try: # typing
37+
from types import TracebackType
38+
from typing import Optional, Type, Union
39+
40+
import busio
41+
import digitalio
42+
from typing_extensions import Self # Python <3.11
43+
from typing_extensions import Annotated, TypeAlias
44+
45+
# type aliases
46+
bytearray2: TypeAlias = Annotated[bytearray, 2]
47+
bytearray4: TypeAlias = Annotated[bytearray, 4]
48+
bytearray16: TypeAlias = Annotated[bytearray, 16]
49+
50+
registeraddress: TypeAlias = Union[const, int]
51+
except ImportError:
52+
pass
53+
54+
3455
__version__ = "0.0.0+auto.0"
3556
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_TinyLoRa.git"
3657

@@ -70,7 +91,13 @@
7091
class TTN:
7192
"""TTN Class"""
7293

73-
def __init__(self, dev_address, net_key, app_key, country="US"):
94+
def __init__(
95+
self,
96+
dev_address: bytearray4,
97+
net_key: bytearray16,
98+
app_key: bytearray16,
99+
country: str = "US",
100+
):
74101
"""Interface for TheThingsNetwork
75102
:param bytearray dev_address: TTN Device Address.
76103
:param bytearray net_key: TTN Network Key.
@@ -83,22 +110,22 @@ def __init__(self, dev_address, net_key, app_key, country="US"):
83110
self.region = country
84111

85112
@property
86-
def country(self):
113+
def country(self) -> str:
87114
"""Returns the TTN Frequency Country."""
88115
return self.region
89116

90117
@property
91-
def device_address(self):
118+
def device_address(self) -> bytearray4:
92119
"""Returns the TTN Device Address."""
93120
return self.dev_addr
94121

95122
@property
96-
def application_key(self):
123+
def application_key(self) -> bytearray16:
97124
"""Returns the TTN Application Key."""
98125
return self.app_key
99126

100127
@property
101-
def network_key(self):
128+
def network_key(self) -> bytearray16:
102129
"""Returns the TTN Network Key."""
103130
return self.net_key
104131

@@ -108,10 +135,18 @@ class TinyLoRa:
108135
"""TinyLoRa Interface"""
109136

110137
# SPI Write Buffer
111-
_BUFFER = bytearray(2)
138+
_BUFFER: bytearray2 = bytearray(2)
112139

113140
# pylint: disable=too-many-arguments,invalid-name
114-
def __init__(self, spi, cs, irq, rst, ttn_config, channel=None):
141+
def __init__(
142+
self,
143+
spi: busio.SPI,
144+
cs: digitalio.DigitalInOut,
145+
irq: digitalio.DigitalInOut,
146+
rst: digitalio.DigitalInOut,
147+
ttn_config: digitalio.DigitalInOut,
148+
channel: Optional[int] = None,
149+
):
115150
"""Interface for a HopeRF RFM95/6/7/8(w) radio module. Sets module up for sending to
116151
The Things Network.
117152
@@ -141,13 +176,13 @@ def __init__(self, spi, cs, irq, rst, ttn_config, channel=None):
141176
if self._version != 18:
142177
raise TypeError("Can not detect LoRa Module. Please check wiring!")
143178
# Set Frequency registers
144-
self._rfm_msb = None
145-
self._rfm_mid = None
146-
self._rfm_lsb = None
179+
self._rfm_msb: Optional[registeraddress] = None
180+
self._rfm_mid: Optional[registeraddress] = None
181+
self._rfm_lsb: Optional[registeraddress] = None
147182
# Set datarate registers
148-
self._sf = None
149-
self._bw = None
150-
self._modemcfg = None
183+
self._sf: Optional[registeraddress] = None
184+
self._bw: Optional[registeraddress] = None
185+
self._modemcfg: Optional[registeraddress] = None
151186
self.set_datarate("SF7BW125")
152187
# Set regional frequency plan
153188
# pylint: disable=import-outside-toplevel
@@ -201,13 +236,18 @@ def __init__(self, spi, cs, irq, rst, ttn_config, channel=None):
201236
# Give the lora object ttn configuration
202237
self._ttn_config = ttn_config
203238

204-
def __enter__(self):
239+
def __enter__(self) -> Self:
205240
return self
206241

207-
def __exit__(self, exception_type, exception_value, traceback):
242+
def __exit__(
243+
self,
244+
exception_type: Optional[Type[type]],
245+
exception_value: Optional[BaseException],
246+
traceback: Optional[TracebackType],
247+
) -> None:
208248
self.deinit()
209249

210-
def deinit(self):
250+
def deinit(self) -> None:
211251
"""Deinitializes the TinyLoRa object properties and pins."""
212252
self._irq = None
213253
self._rst = None
@@ -220,7 +260,9 @@ def deinit(self):
220260
self._bw = None
221261
self._modemcfg = None
222262

223-
def send_data(self, data, data_length, frame_counter, timeout=2):
263+
def send_data(
264+
self, data: bytearray, data_length: int, frame_counter: int, timeout: int = 2
265+
) -> None:
224266
"""Function to assemble and send data
225267
:param data: data to send
226268
:param data_length: length of data to send
@@ -258,15 +300,17 @@ def send_data(self, data, data_length, frame_counter, timeout=2):
258300
# recalculate packet length
259301
lora_pkt_len += data_length
260302
# Calculate MIC
261-
mic = bytearray(4)
303+
mic: bytearray4 = bytearray(4)
262304
mic = aes.calculate_mic(lora_pkt, lora_pkt_len, mic)
263305
# load mic in package
264306
lora_pkt[lora_pkt_len : lora_pkt_len + 4] = mic[0:4]
265307
# recalculate packet length (add MIC length)
266308
lora_pkt_len += 4
267309
self.send_packet(lora_pkt, lora_pkt_len, timeout)
268310

269-
def send_packet(self, lora_packet, packet_length, timeout):
311+
def send_packet(
312+
self, lora_packet: bytearray, packet_length: int, timeout: int
313+
) -> None:
270314
"""Sends a LoRa packet using the RFM Module
271315
:param bytearray lora_packet: assembled LoRa packet from send_data
272316
:param int packet_length: length of LoRa packet to send
@@ -312,10 +356,11 @@ def send_packet(self, lora_packet, packet_length, timeout):
312356
if timed_out:
313357
raise RuntimeError("Timeout during packet send")
314358

315-
def set_datarate(self, datarate):
359+
def set_datarate(self, datarate: str) -> None:
316360
"""Sets the RFM Datarate
317361
:param datarate: Bandwidth and Frequency Plan
318362
"""
363+
# TODO: Convert these to enum
319364
data_rates = {
320365
"SF7BW125": (0x74, 0x72, 0x04),
321366
"SF7BW250": (0x74, 0x82, 0x04),
@@ -330,13 +375,15 @@ def set_datarate(self, datarate):
330375
except KeyError as err:
331376
raise KeyError("Invalid or Unsupported Datarate.") from err
332377

333-
def set_channel(self, channel):
378+
def set_channel(self, channel: int) -> None:
334379
"""Sets the RFM Channel (if single-channel)
335380
:param int channel: Transmit Channel (0 through 7).
336381
"""
337382
self._rfm_msb, self._rfm_mid, self._rfm_lsb = self._frequencies[channel]
338383

339-
def _read_into(self, address, buf, length=None):
384+
def _read_into(
385+
self, address: registeraddress, buf: bytearray2, length: Optional[int] = None
386+
) -> None:
340387
"""Read a number of bytes from the specified address into the
341388
provided buffer. If length is not specified (default) the entire buffer
342389
will be filled.
@@ -353,14 +400,14 @@ def _read_into(self, address, buf, length=None):
353400
device.write(self._BUFFER, end=1)
354401
device.readinto(buf, end=length)
355402

356-
def _read_u8(self, address):
403+
def _read_u8(self, address: registeraddress) -> int:
357404
"""Read a single byte from the provided address and return it.
358405
:param bytearray address: Register Address.
359406
"""
360407
self._read_into(address, self._BUFFER, length=1)
361408
return self._BUFFER[0]
362409

363-
def _write_u8(self, address, val):
410+
def _write_u8(self, address: registeraddress, val: int) -> None:
364411
"""Writes to the RFM register given an address and data.
365412
:param bytearray address: Register Address.
366413
:param val: Data to write.

0 commit comments

Comments
 (0)