Skip to content

Commit 2e45db0

Browse files
committed
Improve bus selection
Added *args, **argk parameters to several functions and methods in order to pass through bus selection parameters linux_i2c.py accepts iBus as a parameter micropython_i2c.py and circuitpy_i2c.py both accept sda, scl, and freq as parameters
1 parent 7d53f98 commit 2e45db0

File tree

5 files changed

+73
-133
lines changed

5 files changed

+73
-133
lines changed

qwiic_i2c/__init__.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
#
9292
# If no driver is found, a None value is returned
9393

94-
def getI2CDriver():
94+
def getI2CDriver(*args, **argk):
9595
"""
9696
.. function:: getI2CDriver()
9797
@@ -119,13 +119,13 @@ def getI2CDriver():
119119
# Does this class/driverd support this platform?
120120
if driverClass.isPlatform():
121121

122-
_theDriver = driverClass()
122+
_theDriver = driverClass(*args, **argk)
123123
# Yes - return the driver object
124124
return _theDriver
125125

126126
return None
127127

128-
def get_i2c_driver():
128+
def get_i2c_driver(*args, **argk):
129129
"""
130130
.. function:: get_i2c_driver()
131131
@@ -140,12 +140,12 @@ def get_i2c_driver():
140140
>>> i2cDriver = qwiic_i2c.get_i2c_driver()
141141
>>> myData = i2cDriver.readByte(0x73, 0x34)
142142
"""
143-
return getI2CDriver()
143+
return getI2CDriver(*args, **argk)
144144

145145
#-------------------------------------------------
146146
# Method to determine if a particular device (at the provided address)
147147
# is connected to the bus.
148-
def isDeviceConnected(devAddress):
148+
def isDeviceConnected(devAddress, *args, **argk):
149149
"""
150150
.. function:: isDeviceConnected()
151151
@@ -158,15 +158,15 @@ def isDeviceConnected(devAddress):
158158
:rtype: bool
159159
160160
"""
161-
i2c = getI2CDriver()
161+
i2c = getI2CDriver(*args, **argk)
162162

163163
if not i2c:
164164
print("Unable to load the I2C driver for this device")
165165
return False
166166

167167
return i2c.isDeviceConnected(devAddress)
168168

169-
def is_device_connected(devAddress):
169+
def is_device_connected(devAddress, *args, **argk):
170170
"""
171171
.. function:: is_device_connected()
172172
@@ -179,12 +179,12 @@ def is_device_connected(devAddress):
179179
:rtype: bool
180180
181181
"""
182-
return isDeviceConnected(devAddress)
182+
return isDeviceConnected(devAddress, *args, **argk)
183183

184184
#-------------------------------------------------
185185
# Method to determine if a particular device (at the provided address)
186186
# is connected to the bus.
187-
def ping(devAddress):
187+
def ping(devAddress, *args, **argk):
188188
"""
189189
.. function:: ping()
190190
@@ -197,4 +197,4 @@ def ping(devAddress):
197197
:rtype: bool
198198
199199
"""
200-
return isDeviceConnected(devAddress)
200+
return isDeviceConnected(devAddress, *args, **argk)

qwiic_i2c/circuitpy_i2c.py

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
# Attempts to fail elegantly. Put this in a central place to support
5050
# error handling -- especially on non-circuitpy platforms
5151
#
52-
def _connectToI2CBus():
52+
def _connectToI2CBus(sda=None, scl=None, freq=100000, *args, **argk):
5353

5454
try:
5555
import board
@@ -65,10 +65,12 @@ def _connectToI2CBus():
6565
# Connect - catch errors
6666

6767
try:
68-
if hasattr(board, "STEMMA_I2C"):
68+
if sda != None and scl != None:
69+
daBus = busio.I2C(scl, sda, frequency=freq)
70+
elif hasattr(board, "STEMMA_I2C"):
6971
daBus = board.STEMMA_I2C()
7072
else:
71-
daBus = busio.I2C(board.SCL, board.SDA)
73+
daBus = busio.I2C(board.SCL, board.SDA, frequency=freq)
7274
except Exception as ee:
7375
if type(ee) is RuntimeError:
7476
print("Error:\tUnable to connect to I2C bus. %s" % (ee))
@@ -85,8 +87,8 @@ def _connectToI2CBus():
8587

8688
return daBus
8789

88-
def _connect_to_i2c_bus():
89-
return _connectToI2CBus()
90+
def _connect_to_i2c_bus(*args, **argk):
91+
return _connectToI2CBus(*args, **argk)
9092

9193
# notes on determining CirPy platform
9294
#
@@ -100,12 +102,16 @@ class CircuitPythonI2C(I2CDriver):
100102

101103
_i2cbus = None
102104

103-
def __init__(self):
105+
def __init__(self, sda=None, scl=None, freq=100000, *args, **argk):
104106

105107
# Call the super class. The super calss will use default values if not
106108
# proviced
107109
I2CDriver.__init__(self)
108110

111+
self._sda = sda
112+
self._scl = scl
113+
self._freq = freq
114+
109115
# Okay, are we running on a circuit py system?
110116
@classmethod
111117
def isPlatform(cls):
@@ -128,7 +134,7 @@ def __getattr__(self, name):
128134

129135
if(name == "i2cbus"):
130136
if( self._i2cbus == None):
131-
self._i2cbus = _connectToI2CBus()
137+
self._i2cbus = _connectToI2CBus(sda=self._sda, scl=self._scl, freq=self._freq)
132138
return self._i2cbus
133139

134140
else:
@@ -284,53 +290,32 @@ def writeBlock(self, address, commandCode, value):
284290
def write_block(self, address, commandCode, value):
285291
return self.writeBlock(address, commandCode, value)
286292

287-
@classmethod
288-
def isDeviceConnected(cls, devAddress):
289-
if cls._i2cbus == None:
290-
cls._i2cbus = _connectToI2CBus()
291-
if cls._i2cbus == None:
292-
return False
293-
if not cls._i2cbus.try_lock():
294-
return False
295-
293+
def isDeviceConnected(self, devAddress):
296294
isConnected = False
297295
try:
298296
# Try to write nothing to the device
299297
# If it throws an I/O error - the device isn't connected
300-
cls._i2cbus.writeto(devAddress, bytearray())
298+
self.i2cbus.writeto(devAddress, bytearray())
301299
isConnected = True
302300
except Exception as ee:
303301
print("Error connecting to Device: %X, %s" % (devAddress, ee))
304302
pass
305303
finally:
306-
cls._i2cbus.unlock()
304+
self.i2cbus.unlock()
307305

308306
return isConnected
309307

310-
@classmethod
311-
def is_device_connected(cls, devAddress):
308+
def is_device_connected(self, devAddress):
312309
return cls.isDeviceConnected(devAddress)
313310

314-
@classmethod
315-
def ping(cls, devAddress):
311+
def ping(self, devAddress):
316312
return cls.isDeviceConnected(devAddress)
317313

318314
#-----------------------------------------------------------------------
319315
# scan()
320316
#
321317
# Scans the I2C bus and returns a list of addresses that have a devices connected
322318
#
323-
@classmethod
324-
def scan(cls):
319+
def scan(self):
325320
""" Returns a list of addresses for the devices connected to the I2C bus."""
326-
327-
if cls._i2cbus == None:
328-
cls._i2cbus = _connectToI2CBus()
329-
if cls._i2cbus == None:
330-
return []
331-
if not cls._i2cbus.try_lock():
332-
return []
333-
334-
result = cls._i2cbus.scan()
335-
cls._i2cbus.unlock()
336-
return result
321+
return self.i2cbus.scan()

qwiic_i2c/i2c_driver.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class I2CDriver(object):
7878
# stubs
7979
name = 'qwiic I2C abstract base class'
8080

81-
def __init__(self):
81+
def __init__(self, *args, **argk):
8282
pass
8383

8484

@@ -313,8 +313,7 @@ def write_block(self, address, commandCode, value):
313313
"""
314314
return None
315315

316-
@classmethod
317-
def isDeviceConnected(cls, devAddress):
316+
def isDeviceConnected(self, devAddress):
318317
"""
319318
Determines if a particular device (at the provided address)
320319
is connected to the bus.
@@ -327,8 +326,7 @@ def isDeviceConnected(cls, devAddress):
327326
"""
328327
return None
329328

330-
@classmethod
331-
def is_device_connected(cls, devAddress):
329+
def is_device_connected(self, devAddress):
332330
"""
333331
Determines if a particular device (at the provided address)
334332
is connected to the bus.
@@ -341,8 +339,7 @@ def is_device_connected(cls, devAddress):
341339
"""
342340
return None
343341

344-
@classmethod
345-
def ping(cls, devAddress):
342+
def ping(self, devAddress):
346343
"""
347344
Determines if a particular device (at the provided address)
348345
is connected to the bus.
@@ -355,8 +352,7 @@ def ping(cls, devAddress):
355352
"""
356353
return None
357354

358-
@classmethod
359-
def scan(cls):
355+
def scan(self):
360356
"""
361357
Used to scan the I2C bus, returning a list of I2C address attached to the computer.
362358

qwiic_i2c/linux_i2c.py

Lines changed: 14 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,14 @@
5050
# Attempts to fail elegantly - often an issue with permissions with the I2C
5151
# bus. Users of this system should be added to the system i2c group
5252
#
53-
def _connectToI2CBus():
53+
def _connectToI2CBus(iBus=1, *args, **argk):
5454

5555
try:
5656
import smbus2
5757
except Exception as ee:
5858
print("Error: Unable to load smbus module. Unable to continue", file=sys.stderr)
5959
return None
6060

61-
iBus = 1
6261
daBus = None
6362

6463
error=False
@@ -82,8 +81,8 @@ def _connectToI2CBus():
8281

8382
return daBus
8483

85-
def _connect_to_i2c_bus():
86-
return _connectToI2CBus()
84+
def _connect_to_i2c_bus(*args, **argk):
85+
return _connectToI2CBus(*args, **argk)
8786

8887
# notes on determining Linux platform
8988
#
@@ -103,13 +102,13 @@ class LinuxI2C(I2CDriver):
103102
_i2cbus = None
104103
_i2c_msg = None
105104

106-
def __init__(self):
105+
def __init__(self, iBus=1, *args, **argk):
107106

108107
# Call the super class. The super calss will use default values if not
109108
# proviced
110109
I2CDriver.__init__(self)
111110

112-
111+
self._iBus = iBus
113112

114113
# Okay, are we running on a Linux system?
115114
@classmethod
@@ -131,7 +130,7 @@ def __getattr__(self, name):
131130

132131
if(name == "i2cbus"):
133132
if( self._i2cbus == None):
134-
self._i2cbus = _connectToI2CBus()
133+
self._i2cbus = _connectToI2CBus(self._iBus)
135134
return self._i2cbus
136135

137136
else:
@@ -254,65 +253,33 @@ def writeBlock(self, address, commandCode, value):
254253
def write_block(self, address, commandCode, value):
255254
return self.writeBlock(address, commandCode, value)
256255

257-
@classmethod
258-
def isDeviceConnected(cls, devAddress):
259-
if cls._i2cbus == None:
260-
cls._i2cbus = _connectToI2CBus()
261-
262-
if cls._i2cbus == None:
263-
return False
264-
256+
def isDeviceConnected(self, devAddress):
265257
isConnected = False
266258
try:
267259
# Try to write nothing to the device
268260
# If it throws an I/O error - the device isn't connected
269-
cls._i2cbus.write_quick(devAddress)
261+
self.i2cbus.write_quick(devAddress)
270262
isConnected = True
271263
except Exception as ee:
272264
print("Error connecting to Device: %X, %s" % (devAddress, ee))
273265
pass
274266

275267
return isConnected
276268

277-
@classmethod
278-
def is_device_connected(cls, devAddress):
279-
return cls.isDeviceConnected(devAddress)
269+
def is_device_connected(self, devAddress):
270+
return self.isDeviceConnected(devAddress)
280271

281-
@classmethod
282-
def ping(cls, devAddress):
283-
return cls.isDeviceConnected(devAddress)
272+
def ping(self, devAddress):
273+
return self.isDeviceConnected(devAddress)
284274

285275
#-----------------------------------------------------------------------
286276
# scan()
287277
#
288278
# Scans the I2C bus and returns a list of addresses that have a devices connected
289279
#
290-
@classmethod
291-
def scan(cls):
280+
def scan(self):
292281
""" Returns a list of addresses for the devices connected to the I2C bus."""
293-
294-
# The plan - loop through the I2C address space and read a byte. If an
295-
# OSError occures, a device isn't at that address.
296-
297-
if cls._i2cbus == None:
298-
cls._i2cbus = _connectToI2CBus()
299-
300-
if cls._i2cbus == None:
301-
return []
302-
303-
foundDevices = []
304-
305-
# Loop over the address space - which is 7 bits (0-127 range)
306-
for currAddress in range(0, 128):
307-
try:
308-
cls._i2cbus.read_byte(currAddress)
309-
except Exception:
310-
continue
311-
312-
foundDevices.append(currAddress)
313-
314-
315-
return foundDevices
282+
return self.i2cbus.scan()
316283

317284
#-----------------------------------------------------------------------
318285
# Custom method for reading +8-bit register using `i2c_msg` from `smbus2`

0 commit comments

Comments
 (0)