59
59
QWIIC_TWIST_ADDR = const (0x3F ) # default I2C Address
60
60
QWIIC_TWIST_ID = const (0x5c ) # value returned by id register
61
61
62
-
63
-
64
62
# private constants
65
63
66
64
# bit constants
88
86
_TWIST_TURN_INT_TIMEOUT = const (0x16 )
89
87
_TWIST_CHANGE_ADDRESS = const (0x18 )
90
88
89
+ # private functions
90
+ def _signed_int16 (value ):
91
+ # convert a 16-bit value into a signed integer
92
+ result = value
93
+
94
+ if result & (1 << 15 ):
95
+ result -= 1 << 16
96
+
97
+ return result
98
+
91
99
# class
92
100
class Sparkfun_QwiicTwist :
93
101
"""CircuitPython class for the Sparkfun QwiicTwist RGB Rotary Encoder"""
@@ -157,13 +165,53 @@ def clicked(self):
157
165
158
166
return clicked
159
167
168
+ @property
169
+ def difference (self ):
170
+ """
171
+ Return the difference in number of clicks since previous check.
172
+ The value is cleared after it is read.
173
+ """
174
+ value = self ._read_register16 (_TWIST_DIFFERENCE )
175
+ diff = _signed_int16 (value )
176
+
177
+ self ._write_register16 (_TWIST_DIFFERENCE , 0 )
178
+
179
+ return diff
180
+
181
+ @property
182
+ def time_since_last_movement (self ):
183
+ """Return the number of milliseconds since the last encoder movement"""
184
+ # unsigned 16-bit value
185
+ elapsed_time = self ._read_register16 (_TWIST_LAST_ENCODER_EVENT )
186
+
187
+ # This value seems to be cleared regardless
188
+ # Clearing it sometimes returns 0 after write, so commenting out
189
+ # Clear the current value
190
+ # self._write_register16(_TWIST_LAST_ENCODER_EVENT, 0)
191
+
192
+ return elapsed_time
193
+
194
+ @property
195
+ def time_since_last_press (self ):
196
+ """Return the number of milliseconds since the last button press and release"""
197
+ # unsigned 16-bit value
198
+ elapsed_time = self ._read_register16 (_TWIST_LAST_BUTTON_EVENT )
199
+
200
+ # This value seems to be cleared regardless
201
+ # Clearing it sometimes returns 0 after write, so commenting out
202
+ # Clear the current value if requested
203
+ # self._write_register16(_TWIST_LAST_BUTTON_EVENT, 0)
204
+
205
+ return elapsed_time
206
+
207
+
160
208
# public properties (read-write)
161
209
162
210
@property
163
211
def count (self ):
164
212
"""Returns the number of indents since the user turned the knob."""
165
213
value = self ._read_register16 (_TWIST_COUNT )
166
- return self . _signed_int16 (value )
214
+ return _signed_int16 (value )
167
215
168
216
169
217
@count .setter
@@ -205,7 +253,7 @@ def blue(self, value):
205
253
def red_connection (self ):
206
254
"""Get the value of the red LED connection"""
207
255
value = self ._read_register16 (_TWIST_CONNECT_RED )
208
- return self . _signed_int16 (value )
256
+ return _signed_int16 (value )
209
257
210
258
@red_connection .setter
211
259
def red_connection (self , value ):
@@ -221,13 +269,13 @@ def green_connection(self):
221
269
def green_connection (self , value ):
222
270
"""Set the value of the green LED connection"""
223
271
value = self ._write_register16 (_TWIST_CONNECT_GREEN , value )
224
- return self . _signed_int16 (value )
272
+ return _signed_int16 (value )
225
273
226
274
@property
227
275
def blue_connection (self ):
228
276
"""Get the value of the blue LED connection."""
229
277
value = self ._read_register16 (_TWIST_CONNECT_BLUE )
230
- return self . _signed_int16 (value )
278
+ return _signed_int16 (value )
231
279
232
280
@blue_connection .setter
233
281
def blue_connection (self , value ):
@@ -246,35 +294,7 @@ def int_timeout(self, value):
246
294
the end of knob turning and interrupt firing."""
247
295
self ._write_register16 (_TWIST_TURN_INT_TIMEOUT , value )
248
296
249
- # public functions
250
-
251
- def get_difference (self , clear = True ):
252
- """"Return the number of clicks since last check."""
253
- value = self ._read_register16 (_TWIST_DIFFERENCE )
254
- diff = self ._signed_int16 (value )
255
-
256
- if clear :
257
- self ._write_register16 (_TWIST_DIFFERENCE , 0 )
258
- return diff
259
-
260
- def time_since_last_movement (self , clear = True ):
261
- """Return the number of milliseconds since the last encoder movement"""
262
- # unsigned 16-bit value
263
- elapsed_time = self ._read_register16 (_TWIST_LAST_ENCODER_EVENT )
264
-
265
- # Clear the current value if requested
266
- if clear :
267
- self ._write_register16 (_TWIST_LAST_ENCODER_EVENT , 0 )
268
- return elapsed_time
269
-
270
- def time_since_last_press (self , clear = True ):
271
- """Return the number of milliseconds since the last button press and release"""
272
- # unsigned 16-bit value
273
- elapsed_time = self ._read_register16 (_TWIST_LAST_BUTTON_EVENT )
274
- # Clear the current value if requested
275
- if clear :
276
- self ._write_register16 (_TWIST_LAST_BUTTON_EVENT , 0 )
277
- return elapsed_time
297
+ # public methods
278
298
279
299
def clear_interrupts (self ):
280
300
"""Clears the moved, clicked, and pressed bits"""
@@ -318,25 +338,12 @@ def change_address(self, new_address):
318
338
319
339
# No i2c begin function is needed since I2Cdevice class takes care of that
320
340
321
- # private functions
322
-
323
- def _signed_int16 (self , value ):
324
- # convert a 16-bit value into a signed integer
325
- result = value
326
- if self ._debug :
327
- print ('Unsigned 16-bit value = ' + str (result ))
328
-
329
- if result & (1 << 15 ):
330
- result -= 1 << 16
331
-
332
- if self ._debug :
333
- print ('Signed 16-bit value = ' + str (result ))
334
- return result
341
+ # private methods
335
342
336
343
def _read_register8 (self , addr ):
337
344
# Read and return a byte from the specified 8-bit register address.
338
345
with self ._device as device :
339
- device .write (bytes ([addr & 0xFF ]))
346
+ device .write (bytes ([addr & 0xFF ]), stop = False )
340
347
result = bytearray (1 )
341
348
device .readinto (result )
342
349
if self ._debug :
@@ -353,7 +360,7 @@ def _write_register8(self, addr, value):
353
360
def _read_register16 (self , addr ):
354
361
# Read and return a 16-bit value from the specified 8-bit register address.
355
362
with self ._device as device :
356
- device .write (bytes ([addr & 0xFF ]))
363
+ device .write (bytes ([addr & 0xFF ]), stop = False )
357
364
result = bytearray (2 )
358
365
device .readinto (result )
359
366
if self ._debug :
0 commit comments