Skip to content

Commit 004ba6f

Browse files
committed
Use self._i2cbus instead of self.i2cbus
Using self.i2cbus currently goes through __getattr__(), which adds ~100us in CircuitPython and MicroPython. That adds up quickly when performing lots of I2C bus operations! Also change to create the platform bus object within __init__() instead of doing a lazy connect.
1 parent f2bc310 commit 004ba6f

File tree

3 files changed

+60
-60
lines changed

3 files changed

+60
-60
lines changed

qwiic_i2c/circuitpy_i2c.py

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ def __init__(self, sda=None, scl=None, freq=100000, *args, **argk):
112112
self._scl = scl
113113
self._freq = freq
114114

115+
self._i2cbus = _connectToI2CBus(sda=self._sda, scl=self._scl, freq=self._freq)
116+
115117
# Okay, are we running on a circuit py system?
116118
@classmethod
117119
def isPlatform(cls):
@@ -133,8 +135,6 @@ def is_platform(cls):
133135
def __getattr__(self, name):
134136

135137
if(name == "i2cbus"):
136-
if( self._i2cbus == None):
137-
self._i2cbus = _connectToI2CBus(sda=self._sda, scl=self._scl, freq=self._freq)
138138
return self._i2cbus
139139

140140
else:
@@ -156,18 +156,18 @@ def __setattr__(self, name, value):
156156
# read Data Command
157157

158158
def readWord(self, address, commandCode):
159-
if not self.i2cbus.try_lock():
159+
if not self._i2cbus.try_lock():
160160
raise Exception("Unable to lock I2C bus")
161161

162162
buffer = bytearray(2)
163163

164164
try:
165-
self.i2cbus.writeto_then_readfrom(address, bytes([commandCode]), buffer)
165+
self._i2cbus.writeto_then_readfrom(address, bytes([commandCode]), buffer)
166166
except Exception as e:
167-
self.i2cbus.unlock()
167+
self._i2cbus.unlock()
168168
raise e
169169
else:
170-
self.i2cbus.unlock()
170+
self._i2cbus.unlock()
171171

172172
# build and return a word
173173
return (buffer[1] << 8 ) | buffer[0]
@@ -177,18 +177,18 @@ def read_word(self, address, commandCode):
177177

178178
#----------------------------------------------------------
179179
def readByte(self, address, commandCode):
180-
if not self.i2cbus.try_lock():
180+
if not self._i2cbus.try_lock():
181181
raise Exception("Unable to lock I2C bus")
182182

183183
buffer = bytearray(1)
184184

185185
try:
186-
self.i2cbus.writeto_then_readfrom(address, bytes([commandCode]), buffer)
186+
self._i2cbus.writeto_then_readfrom(address, bytes([commandCode]), buffer)
187187
except Exception as e:
188-
self.i2cbus.unlock()
188+
self._i2cbus.unlock()
189189
raise e
190190
else:
191-
self.i2cbus.unlock()
191+
self._i2cbus.unlock()
192192

193193
return buffer[0]
194194

@@ -197,18 +197,18 @@ def read_byte(self, address, commandCode = None):
197197

198198
#----------------------------------------------------------
199199
def readBlock(self, address, commandCode, nBytes):
200-
if not self.i2cbus.try_lock():
200+
if not self._i2cbus.try_lock():
201201
raise Exception("Unable to lock I2C bus")
202202

203203
buffer = bytearray(nBytes)
204204

205205
try:
206-
self.i2cbus.writeto_then_readfrom(address, bytes([commandCode]), buffer)
206+
self._i2cbus.writeto_then_readfrom(address, bytes([commandCode]), buffer)
207207
except Exception as e:
208-
self.i2cbus.unlock()
208+
self._i2cbus.unlock()
209209
raise e
210210
else:
211-
self.i2cbus.unlock()
211+
self._i2cbus.unlock()
212212

213213
return list(buffer)
214214

@@ -224,86 +224,86 @@ def read_block(self, address, commandCode, nBytes):
224224
#
225225

226226
def writeCommand(self, address, commandCode):
227-
if not self.i2cbus.try_lock():
227+
if not self._i2cbus.try_lock():
228228
raise Exception("Unable to lock I2C bus")
229229

230230
try:
231-
self.i2cbus.writeto(address, bytes([commandCode]))
231+
self._i2cbus.writeto(address, bytes([commandCode]))
232232
except Exception as e:
233-
self.i2cbus.unlock()
233+
self._i2cbus.unlock()
234234
raise e
235235
else:
236-
self.i2cbus.unlock()
236+
self._i2cbus.unlock()
237237

238238
def write_command(self, address, commandCode):
239239
return self.writeCommand(address, commandCode)
240240

241241
#----------------------------------------------------------
242242
def writeWord(self, address, commandCode, value):
243-
if not self.i2cbus.try_lock():
243+
if not self._i2cbus.try_lock():
244244
raise Exception("Unable to lock I2C bus")
245245

246246
buffer = [0, 0]
247247
buffer[0] = value & 0xFF
248248
buffer[1] = (value >> 8) & 0xFF
249249

250250
try:
251-
self.i2cbus.writeto(address, bytes([commandCode] + buffer))
251+
self._i2cbus.writeto(address, bytes([commandCode] + buffer))
252252
except Exception as e:
253-
self.i2cbus.unlock()
253+
self._i2cbus.unlock()
254254
raise e
255255
else:
256-
self.i2cbus.unlock()
256+
self._i2cbus.unlock()
257257

258258
def write_word(self, address, commandCode, value):
259259
return self.writeWord(address, commandCode, value)
260260

261261
#----------------------------------------------------------
262262
def writeByte(self, address, commandCode, value):
263-
if not self.i2cbus.try_lock():
263+
if not self._i2cbus.try_lock():
264264
raise Exception("Unable to lock I2C bus")
265265

266266
try:
267-
self.i2cbus.writeto(address, bytes([commandCode] + [value]))
267+
self._i2cbus.writeto(address, bytes([commandCode] + [value]))
268268
except Exception as e:
269-
self.i2cbus.unlock()
269+
self._i2cbus.unlock()
270270
raise e
271271
else:
272-
self.i2cbus.unlock()
272+
self._i2cbus.unlock()
273273

274274
def write_byte(self, address, commandCode, value):
275275
return self.writeByte(address, commandCode, value)
276276

277277
#----------------------------------------------------------
278278
def writeBlock(self, address, commandCode, value):
279-
if not self.i2cbus.try_lock():
279+
if not self._i2cbus.try_lock():
280280
raise Exception("Unable to lock I2C bus")
281281

282282
try:
283-
self.i2cbus.writeto(address, bytes([commandCode] + value))
283+
self._i2cbus.writeto(address, bytes([commandCode] + value))
284284
except Exception as e:
285-
self.i2cbus.unlock()
285+
self._i2cbus.unlock()
286286
raise e
287287
else:
288-
self.i2cbus.unlock()
288+
self._i2cbus.unlock()
289289

290290
def write_block(self, address, commandCode, value):
291291
return self.writeBlock(address, commandCode, value)
292292

293293
def isDeviceConnected(self, devAddress):
294-
if not self.i2cbus.try_lock():
294+
if not self._i2cbus.try_lock():
295295
raise Exception("Unable to lock I2C bus")
296296

297297
isConnected = False
298298
try:
299299
# Try to write nothing to the device
300300
# If it throws an I/O error - the device isn't connected
301-
self.i2cbus.writeto(devAddress, bytearray())
301+
self._i2cbus.writeto(devAddress, bytearray())
302302
isConnected = True
303303
except:
304304
pass
305305
finally:
306-
self.i2cbus.unlock()
306+
self._i2cbus.unlock()
307307

308308
return isConnected
309309

@@ -320,15 +320,15 @@ def ping(self, devAddress):
320320
#
321321
def scan(self):
322322
""" Returns a list of addresses for the devices connected to the I2C bus."""
323-
if not self.i2cbus.try_lock():
323+
if not self._i2cbus.try_lock():
324324
raise Exception("Unable to lock I2C bus")
325325

326326
try:
327-
devices = self.i2cbus.scan()
327+
devices = self._i2cbus.scan()
328328
except Exception as e:
329-
self.i2cbus.unlock()
329+
self._i2cbus.unlock()
330330
raise e
331331
else:
332-
self.i2cbus.unlock()
332+
self._i2cbus.unlock()
333333

334334
return devices

qwiic_i2c/linux_i2c.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ def __init__(self, iBus=1, *args, **argk):
110110

111111
self._iBus = iBus
112112

113+
self._i2cbus = _connectToI2CBus(self._iBus)
114+
113115
# Okay, are we running on a Linux system?
114116
@classmethod
115117
def isPlatform(cls):
@@ -129,8 +131,6 @@ def is_platform(cls):
129131
def __getattr__(self, name):
130132

131133
if(name == "i2cbus"):
132-
if( self._i2cbus == None):
133-
self._i2cbus = _connectToI2CBus(self._iBus)
134134
return self._i2cbus
135135

136136
else:
@@ -158,7 +158,7 @@ def readWord(self, address, commandCode):
158158
# add some error handling and recovery....
159159
for i in range(_retry_count):
160160
try:
161-
data = self.i2cbus.read_word_data(address, commandCode)
161+
data = self._i2cbus.read_word_data(address, commandCode)
162162

163163
break # break if try succeeds
164164

@@ -178,9 +178,9 @@ def readByte(self, address, commandCode = None):
178178
for i in range(_retry_count):
179179
try:
180180
if commandCode == None:
181-
data = self.i2cbus.read_byte(address)
181+
data = self._i2cbus.read_byte(address)
182182
elif commandCode != None:
183-
data = self.i2cbus.read_byte_data(address, commandCode)
183+
data = self._i2cbus.read_byte_data(address, commandCode)
184184

185185
break # break if try succeeds
186186

@@ -199,7 +199,7 @@ def readBlock(self, address, commandCode, nBytes):
199199
data = 0
200200
for i in range(_retry_count):
201201
try:
202-
data = self.i2cbus.read_i2c_block_data(address, commandCode, nBytes)
202+
data = self._i2cbus.read_i2c_block_data(address, commandCode, nBytes)
203203

204204
break # break if try succeeds
205205

@@ -224,21 +224,21 @@ def read_block(self, address, commandCode, nBytes):
224224

225225
def writeCommand(self, address, commandCode):
226226

227-
return self.i2cbus.write_byte(address, commandCode)
227+
return self._i2cbus.write_byte(address, commandCode)
228228

229229
def write_command(self, address, commandCode):
230230
return self.writeCommand(address, commandCode)
231231

232232
def writeWord(self, address, commandCode, value):
233233

234-
return self.i2cbus.write_word_data(address, commandCode, value)
234+
return self._i2cbus.write_word_data(address, commandCode, value)
235235

236236
def write_word(self, address, commandCode, value):
237237
return self.writeWord(address, commandCode, value)
238238

239239
def writeByte(self, address, commandCode, value):
240240

241-
return self.i2cbus.write_byte_data(address, commandCode, value)
241+
return self._i2cbus.write_byte_data(address, commandCode, value)
242242

243243
def write_byte(self, address, commandCode, value):
244244
return self.writeByte(address, commandCode, value)
@@ -248,7 +248,7 @@ def writeBlock(self, address, commandCode, value):
248248
# if value is a bytearray - convert to list of ints (it's what
249249
# required by this call)
250250
tmpVal = list(value) if type(value) == bytearray else value
251-
self.i2cbus.write_i2c_block_data(address, commandCode, tmpVal)
251+
self._i2cbus.write_i2c_block_data(address, commandCode, tmpVal)
252252

253253
def write_block(self, address, commandCode, value):
254254
return self.writeBlock(address, commandCode, value)
@@ -258,7 +258,7 @@ def isDeviceConnected(self, devAddress):
258258
try:
259259
# Try to write nothing to the device
260260
# If it throws an I/O error - the device isn't connected
261-
self.i2cbus.write_quick(devAddress)
261+
self._i2cbus.write_quick(devAddress)
262262
isConnected = True
263263
except:
264264
pass
@@ -312,7 +312,7 @@ def __i2c_rdwr__(self, address, write_message, read_nbytes):
312312
# Read Register
313313
for i in range(_retry_count):
314314
try:
315-
self.i2cbus.i2c_rdwr(write, read)
315+
self._i2cbus.i2c_rdwr(write, read)
316316

317317
break # break if try succeeds
318318

qwiic_i2c/micropython_i2c.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ def __init__(self, sda=18, scl=19, freq=100000, *args, **argk):
7676
self._scl = scl
7777
self._freq = freq
7878

79+
self._i2cbus = _connectToI2CBus(sda=self._sda, scl=self._scl, freq=self._freq)
80+
7981
@classmethod
8082
def isPlatform(cls):
8183
try:
@@ -96,8 +98,6 @@ def is_platform(cls):
9698
def __getattr__(self, name):
9799

98100
if(name == "i2cbus"):
99-
if( self._i2cbus == None):
100-
self._i2cbus = _connectToI2CBus(sda=self._sda, scl=self._scl, freq=self._freq)
101101
return self._i2cbus
102102

103103
else:
@@ -117,45 +117,45 @@ def __setattr__(self, name, value):
117117

118118
# read commands ----------------------------------------------------------
119119
def readWord(self, address, commandCode):
120-
buffer = self.i2cbus.readfrom_mem(address, commandCode, 2)
120+
buffer = self._i2cbus.readfrom_mem(address, commandCode, 2)
121121
return (buffer[1] << 8 ) | buffer[0]
122122

123123
def read_word(self, address, commandCode):
124124
return self.readWord(address, commandCode)
125125

126126
def readByte(self, address, commandCode):
127-
return self.i2cbus.readfrom_mem(address, commandCode, 1)[0]
127+
return self._i2cbus.readfrom_mem(address, commandCode, 1)[0]
128128

129129
def read_byte(self, address, commandCode = None):
130130
return self.readByte(address, commandCode)
131131

132132
def readBlock(self, address, commandCode, nBytes):
133-
return self.i2cbus.readfrom_mem(address, commandCode, nBytes)
133+
return self._i2cbus.readfrom_mem(address, commandCode, nBytes)
134134

135135
def read_block(self, address, commandCode, nBytes):
136136
return self.readBlock(address, commandCode, nBytes)
137137

138138
# write commands----------------------------------------------------------
139139
def writeCommand(self, address, commandCode):
140-
self.i2cbus.writeto(address, commandCode.to_bytes(1, 'little'))
140+
self._i2cbus.writeto(address, commandCode.to_bytes(1, 'little'))
141141

142142
def write_command(self, address, commandCode):
143143
return self.writeCommand(address, commandCode)
144144

145145
def writeWord(self, address, commandCode, value):
146-
self.i2cbus.writeto_mem(address, commandCode, value.to_bytes(2, 'little'))
146+
self._i2cbus.writeto_mem(address, commandCode, value.to_bytes(2, 'little'))
147147

148148
def write_word(self, address, commandCode, value):
149149
return self.writeWord(address, commandCode, value)
150150

151151
def writeByte(self, address, commandCode, value):
152-
self.i2cbus.writeto_mem(address, commandCode, value.to_bytes(1, 'little'))
152+
self._i2cbus.writeto_mem(address, commandCode, value.to_bytes(1, 'little'))
153153

154154
def write_byte(self, address, commandCode, value):
155155
return self.writeByte(address, commandCode, value)
156156

157157
def writeBlock(self, address, commandCode, value):
158-
self.i2cbus.writeto_mem(address, commandCode, bytes(value))
158+
self._i2cbus.writeto_mem(address, commandCode, bytes(value))
159159

160160
def write_block(self, address, commandCode, value):
161161
return self.writeBlock(address, commandCode, value)
@@ -165,7 +165,7 @@ def isDeviceConnected(self, devAddress):
165165
try:
166166
# Try to write nothing to the device
167167
# If it throws an I/O error - the device isn't connected
168-
self.i2cbus.writeto(devAddress, bytearray())
168+
self._i2cbus.writeto(devAddress, bytearray())
169169
isConnected = True
170170
except:
171171
pass
@@ -181,4 +181,4 @@ def ping(self, devAddress):
181181
# scan -------------------------------------------------------------------
182182
def scan(self):
183183
""" Returns a list of addresses for the devices connected to the I2C bus."""
184-
return self.i2cbus.scan()
184+
return self._i2cbus.scan()

0 commit comments

Comments
 (0)