17
17
import busio
18
18
from micropython import const
19
19
20
+ try :
21
+ from typing import Optional , List , Tuple
22
+ from microcontroller import Pin
23
+ except ImportError :
24
+ pass
25
+
20
26
_SEARCH_ROM = const (0xF0 )
21
27
_MATCH_ROM = const (0x55 )
22
28
_SKIP_ROM = const (0xCC )
@@ -30,56 +36,56 @@ class OneWireError(Exception):
30
36
class OneWireAddress :
31
37
"""A class to represent a 1-Wire address."""
32
38
33
- def __init__ (self , rom ) :
39
+ def __init__ (self , rom : bytearray ) -> None :
34
40
self ._rom = rom
35
41
36
42
@property
37
- def rom (self ):
43
+ def rom (self ) -> bytearray :
38
44
"""The unique 64 bit ROM code."""
39
45
return self ._rom
40
46
41
47
@property
42
- def crc (self ):
48
+ def crc (self ) -> int :
43
49
"""The 8 bit CRC."""
44
50
return self ._rom [7 ]
45
51
46
52
@property
47
- def serial_number (self ):
53
+ def serial_number (self ) -> bytearray :
48
54
"""The 48 bit serial number."""
49
55
return self ._rom [1 :7 ]
50
56
51
57
@property
52
- def family_code (self ):
58
+ def family_code (self ) -> int :
53
59
"""The 8 bit family code."""
54
60
return self ._rom [0 ]
55
61
56
62
57
63
class OneWireBus :
58
64
"""A class to represent a 1-Wire bus."""
59
65
60
- def __init__ (self , pin ) :
66
+ def __init__ (self , pin : Pin ) -> None :
61
67
# pylint: disable=no-member
62
68
self ._ow = busio .OneWire (pin )
63
69
self ._readbit = self ._ow .read_bit
64
70
self ._writebit = self ._ow .write_bit
65
71
self ._maximum_devices = _MAX_DEV
66
72
67
73
@property
68
- def maximum_devices (self ):
74
+ def maximum_devices (self ) -> int :
69
75
"""The maximum number of devices the bus will scan for. Valid range is 1 to 255.
70
76
It is an error to have more devices on the bus than this number. Having less is OK.
71
77
"""
72
78
return self ._maximum_devices
73
79
74
80
@maximum_devices .setter
75
- def maximum_devices (self , count ) :
81
+ def maximum_devices (self , count : int ) -> None :
76
82
if not isinstance (count , int ):
77
83
raise ValueError ("Maximum must be an integer value 1 - 255." )
78
84
if count < 1 or count > 0xFF :
79
85
raise ValueError ("Maximum must be an integer value 1 - 255." )
80
86
self ._maximum_devices = count
81
87
82
- def reset (self , required = False ):
88
+ def reset (self , required : bool = False ) -> bool :
83
89
"""
84
90
Perform a reset and check for presence pulse.
85
91
@@ -90,7 +96,9 @@ def reset(self, required=False):
90
96
raise OneWireError ("No presence pulse found. Check devices and wiring." )
91
97
return not reset
92
98
93
- def readinto (self , buf , * , start = 0 , end = None ):
99
+ def readinto (
100
+ self , buf : bytearray , * , start : int = 0 , end : Optional [int ] = None
101
+ ) -> None :
94
102
"""
95
103
Read into ``buf`` from the device. The number of bytes read will be the
96
104
length of ``buf``.
@@ -108,7 +116,9 @@ def readinto(self, buf, *, start=0, end=None):
108
116
for i in range (start , end ):
109
117
buf [i ] = self ._readbyte ()
110
118
111
- def write (self , buf , * , start = 0 , end = None ):
119
+ def write (
120
+ self , buf : bytearray , * , start : int = 0 , end : Optional [int ] = None
121
+ ) -> None :
112
122
"""
113
123
Write the bytes from ``buf`` to the device.
114
124
@@ -125,11 +135,11 @@ def write(self, buf, *, start=0, end=None):
125
135
for i in range (start , end ):
126
136
self ._writebyte (buf [i ])
127
137
128
- def scan (self ):
138
+ def scan (self ) -> List [ OneWireAddress ] :
129
139
"""Scan for devices on the bus and return a list of addresses."""
130
140
devices = []
131
141
diff = 65
132
- rom = False
142
+ rom = None
133
143
count = 0
134
144
for _ in range (0xFF ):
135
145
rom , diff = self ._search_rom (rom , diff )
@@ -146,18 +156,20 @@ def scan(self):
146
156
break
147
157
return devices
148
158
149
- def _readbyte (self ):
159
+ def _readbyte (self ) -> int :
150
160
val = 0
151
161
for i in range (8 ):
152
162
val |= self ._ow .read_bit () << i
153
163
return val
154
164
155
- def _writebyte (self , value ) :
165
+ def _writebyte (self , value : int ) -> None :
156
166
for i in range (8 ):
157
167
bit = (value >> i ) & 0x1
158
168
self ._ow .write_bit (bit )
159
169
160
- def _search_rom (self , l_rom , diff ):
170
+ def _search_rom (
171
+ self , l_rom : Optional [bytearray ], diff : int
172
+ ) -> Tuple [bytearray , int ]:
161
173
if not self .reset ():
162
174
return None , 0
163
175
self ._writebyte (_SEARCH_ROM )
@@ -185,7 +197,7 @@ def _search_rom(self, l_rom, diff):
185
197
return rom , next_diff
186
198
187
199
@staticmethod
188
- def crc8 (data ) :
200
+ def crc8 (data : bytearray ) -> int :
189
201
"""
190
202
Perform the 1-Wire CRC check on the provided data.
191
203
0 commit comments