33
33
from adafruit_register .i2c_bits import ROBits
34
34
import digitalio
35
35
36
+ try :
37
+ from typing import Optional
38
+ from typing_extensions import Literal
39
+ from busio import I2C
40
+ except ImportError :
41
+ pass
42
+
36
43
__version__ = "0.0.0-auto.0"
37
44
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_TCA8418.git"
38
45
@@ -71,8 +78,13 @@ class TCA8418_register:
71
78
72
79
# pylint: disable=too-many-arguments
73
80
def __init__ (
74
- self , tca , base_addr , invert_value = False , read_only = False , initial_value = None
75
- ):
81
+ self ,
82
+ tca : "TCA8418" ,
83
+ base_addr : int ,
84
+ invert_value : bool = False ,
85
+ read_only : bool = False ,
86
+ initial_value : Optional [int ] = None ,
87
+ ) -> None :
76
88
self ._tca = tca
77
89
self ._baseaddr = base_addr
78
90
self ._invert = invert_value
@@ -84,7 +96,7 @@ def __init__(
84
96
self ._tca ._write_reg (base_addr + 1 , initial_value )
85
97
self ._tca ._write_reg (base_addr + 2 , initial_value )
86
98
87
- def __index__ (self ):
99
+ def __index__ (self ) -> int :
88
100
"""Read all 18 bits of register data and return as one integer"""
89
101
val = self ._tca ._read_reg (self ._baseaddr + 2 )
90
102
val <<= 8
@@ -94,14 +106,14 @@ def __index__(self):
94
106
val &= 0x3FFFF
95
107
return val
96
108
97
- def __getitem__ (self , pin_number ) :
109
+ def __getitem__ (self , pin_number : int ) -> bool :
98
110
"""Read the single bit at 'pin_number' offset"""
99
111
value = self ._tca ._get_gpio_register (self ._baseaddr , pin_number )
100
112
if self ._invert :
101
113
value = not value
102
114
return value
103
115
104
- def __setitem__ (self , pin_number , value ) :
116
+ def __setitem__ (self , pin_number : int , value : bool ) -> None :
105
117
"""Set a single bit at 'pin_number' offset to 'value'"""
106
118
if self ._ro :
107
119
raise NotImplementedError ("Read only register" )
@@ -156,7 +168,7 @@ class TCA8418:
156
168
157
169
# pylint: enable=invalid-name
158
170
159
- def __init__ (self , i2c_bus , address = TCA8418_I2CADDR_DEFAULT ):
171
+ def __init__ (self , i2c_bus : I2C , address : int = TCA8418_I2CADDR_DEFAULT ) -> None :
160
172
# pylint: disable=no-member
161
173
self .i2c_device = i2c_device .I2CDevice (i2c_bus , address )
162
174
self ._buf = bytearray (2 )
@@ -214,26 +226,28 @@ def __init__(self, i2c_bus, address=TCA8418_I2CADDR_DEFAULT):
214
226
self .gpi_int = False
215
227
216
228
@property
217
- def next_event (self ):
229
+ def next_event (self ) -> int :
218
230
"""The next key event"""
219
231
220
232
if self .events_count == 0 :
221
233
raise RuntimeError ("No events in FIFO" )
222
234
return self ._read_reg (_TCA8418_REG_KEYEVENT )
223
235
224
- def _set_gpio_register (self , reg_base_addr , pin_number , value ):
236
+ def _set_gpio_register (
237
+ self , reg_base_addr : int , pin_number : int , value : bool
238
+ ) -> None :
225
239
if not 0 <= pin_number <= 17 :
226
240
raise ValueError ("Pin number must be between 0 & 17" )
227
241
reg_base_addr += pin_number // 8
228
242
self ._set_reg_bit (reg_base_addr , pin_number % 8 , value )
229
243
230
- def _get_gpio_register (self , reg_base_addr , pin_number ) :
244
+ def _get_gpio_register (self , reg_base_addr : int , pin_number : int ) -> bool :
231
245
if not 0 <= pin_number <= 17 :
232
246
raise ValueError ("Pin number must be between 0 & 17" )
233
247
reg_base_addr += pin_number // 8
234
248
return self ._get_reg_bit (reg_base_addr , pin_number % 8 )
235
249
236
- def get_pin (self , pin ) :
250
+ def get_pin (self , pin : int ) -> "DigitalInOut" :
237
251
"""Convenience function to create an instance of the DigitalInOut class
238
252
pointing at the specified pin of this TCA8418 device.
239
253
@@ -245,25 +259,25 @@ def get_pin(self, pin):
245
259
246
260
# register helpers
247
261
248
- def _set_reg_bit (self , addr , bitoffset , value ) :
262
+ def _set_reg_bit (self , addr : int , bitoffset : int , value : bool ) -> None :
249
263
temp = self ._read_reg (addr )
250
264
if value :
251
265
temp |= 1 << bitoffset
252
266
else :
253
267
temp &= ~ (1 << bitoffset )
254
268
self ._write_reg (addr , temp )
255
269
256
- def _get_reg_bit (self , addr , bitoffset ) :
270
+ def _get_reg_bit (self , addr : int , bitoffset : int ) -> bool :
257
271
temp = self ._read_reg (addr )
258
272
return bool (temp & (1 << bitoffset ))
259
273
260
- def _write_reg (self , addr , val ) :
274
+ def _write_reg (self , addr : int , val : int ) -> None :
261
275
with self .i2c_device as i2c :
262
276
self ._buf [0 ] = addr
263
277
self ._buf [1 ] = val
264
278
i2c .write (self ._buf , end = 2 )
265
279
266
- def _read_reg (self , addr ) :
280
+ def _read_reg (self , addr : int ) -> int :
267
281
with self .i2c_device as i2c :
268
282
self ._buf [0 ] = addr
269
283
i2c .write_then_readinto (self ._buf , self ._buf , out_end = 1 , in_end = 1 )
@@ -285,7 +299,7 @@ class DigitalInOut:
285
299
:param TCA8418 tca: The TCA8418 object associated with the DIO
286
300
"""
287
301
288
- def __init__ (self , pin_number , tca ) :
302
+ def __init__ (self , pin_number : int , tca : "TCA8418" ) -> None :
289
303
"""Specify the pin number of the TCA8418 0..17, and instance."""
290
304
self ._pin = pin_number
291
305
self ._tca = tca
@@ -296,14 +310,14 @@ def __init__(self, pin_number, tca):
296
310
# is unused by this class). Do not remove them, instead turn off pylint
297
311
# in this case.
298
312
# pylint: disable=unused-argument
299
- def switch_to_output (self , value = False , ** kwargs ):
313
+ def switch_to_output (self , value : bool = False , ** kwargs ) -> None :
300
314
"""Switch the pin state to a digital output with the provided starting
301
315
value (True/False for high or low, default is False/low).
302
316
"""
303
317
self .direction = digitalio .Direction .OUTPUT
304
318
self .value = value
305
319
306
- def switch_to_input (self , pull = None , ** kwargs ):
320
+ def switch_to_input (self , pull : Optional [ digitalio . Pull ] = None , ** kwargs ) -> None :
307
321
"""Switch the pin state to a digital input which is the same as
308
322
setting the light pullup on. Note that true tri-state or
309
323
pull-down resistors are NOT supported!
@@ -314,25 +328,25 @@ def switch_to_input(self, pull=None, **kwargs):
314
328
# pylint: enable=unused-argument
315
329
316
330
@property
317
- def value (self ):
331
+ def value (self ) -> bool :
318
332
"""The value of the pin, either True for high/pulled-up or False for
319
333
low.
320
334
"""
321
335
return self ._tca .input_value [self ._pin ]
322
336
323
337
@value .setter
324
- def value (self , val ) :
338
+ def value (self , val : bool ) -> None :
325
339
self ._tca .output_value [self ._pin ] = val
326
340
327
341
@property
328
- def direction (self ):
342
+ def direction (self ) -> digitalio . Direction :
329
343
"""The direction of the pin, works identically to
330
344
the one in `digitalio`
331
345
"""
332
346
return self ._dir
333
347
334
348
@direction .setter
335
- def direction (self , val ) :
349
+ def direction (self , val : digitalio . Direction ) -> None :
336
350
if val == digitalio .Direction .INPUT :
337
351
self ._tca .gpio_direction [self ._pin ] = False
338
352
elif val == digitalio .Direction .OUTPUT :
@@ -343,7 +357,7 @@ def direction(self, val):
343
357
self ._dir = val
344
358
345
359
@property
346
- def pull (self ):
360
+ def pull (self ) -> Optional [ Literal [ digitalio . Pull . UP ]] :
347
361
"""The pull setting for the digital IO, either `digitalio.Pull.UP`
348
362
for pull up, or ``None`` for no pull up
349
363
"""
@@ -353,7 +367,7 @@ def pull(self):
353
367
return None
354
368
355
369
@pull .setter
356
- def pull (self , val ) :
370
+ def pull (self , val : Optional [ Literal [ digitalio . Pull . UP ]]) -> None :
357
371
if val is digitalio .Pull .UP :
358
372
# for inputs, turn on the pullup (write high)
359
373
self ._tca .pullup [self ._pin ] = True
0 commit comments