48
48
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_CAP1188.git"
49
49
50
50
# pylint: disable=bad-whitespace
51
- CAP1188_MID = const (0x5D )
52
- CAP1188_PID = const (0x50 )
53
- CAP1188_MAIN_CONTROL = const (0x00 )
54
- CAP1188_GENERAL_STATUS = const (0x02 )
55
- CAP1188_INPUT_STATUS = const (0x03 )
56
- CAP1188_LED_STATUS = const (0x04 )
57
- CAP1188_NOISE_FLAGS = const (0x0A )
58
- CAP1188_DELTA_COUNT = (const (0x10 ),
51
+ _CAP1188_MID = const (0x5D )
52
+ _CAP1188_PID = const (0x50 )
53
+ _CAP1188_MAIN_CONTROL = const (0x00 )
54
+ _CAP1188_GENERAL_STATUS = const (0x02 )
55
+ _CAP1188_INPUT_STATUS = const (0x03 )
56
+ _CAP1188_LED_STATUS = const (0x04 )
57
+ _CAP1188_NOISE_FLAGS = const (0x0A )
58
+ _CAP1188_DELTA_COUNT = (const (0x10 ),
59
59
const (0x11 ),
60
60
const (0x12 ),
61
61
const (0x13 ),
62
62
const (0x14 ),
63
63
const (0x15 ),
64
64
const (0x16 ),
65
65
const (0x17 ))
66
- CAP1188_CAL_ACTIVATE = const (0x26 )
67
- CAP1188_MULTI_TOUCH_CFG = const (0x2A )
68
- CAP1188_STANDBY_CFG = const (0x41 )
69
- CAP1188_LED_LINKING = const (0x72 )
70
- CAP1188_PRODUCT_ID = const (0xFD )
71
- CAP1188_MANU_ID = const (0xFE )
72
- CAP1188_REVISION = const (0xFF )
66
+ _CAP1188_SENSITIVTY = const (0x1F )
67
+ _CAP1188_CAL_ACTIVATE = const (0x26 )
68
+ _CAP1188_MULTI_TOUCH_CFG = const (0x2A )
69
+ _CAP1188_THESHOLD_1 = const (0x30 )
70
+ _CAP1188_STANDBY_CFG = const (0x41 )
71
+ _CAP1188_LED_LINKING = const (0x72 )
72
+ _CAP1188_PRODUCT_ID = const (0xFD )
73
+ _CAP1188_MANU_ID = const (0xFE )
74
+ _CAP1188_REVISION = const (0xFF )
73
75
# pylint: enable=bad-whitespace
74
76
77
+ _SENSITIVITY = (128 , 64 , 32 , 16 , 8 , 4 , 2 , 1 )
78
+
75
79
class CAP1188_Channel :
80
+ # pylint: disable=protected-access
76
81
"""Helper class to represent a touch channel on the CAP1188. Not meant to
77
82
be used directly."""
78
83
def __init__ (self , cap1188 , pin ):
@@ -89,6 +94,18 @@ def raw_value(self):
89
94
"""The raw touch measurement."""
90
95
return self ._cap1188 .delta_count (self ._pin )
91
96
97
+ @property
98
+ def threshold (self ):
99
+ """The touch threshold value."""
100
+ return self ._cap1188 ._read_register (_CAP1188_THESHOLD_1 + self ._pin - 1 )
101
+
102
+ @threshold .setter
103
+ def threshold (self , value ):
104
+ value = int (value )
105
+ if not 0 <= value <= 127 :
106
+ raise ValueError ("Threshold value must be in range 0 to 127." )
107
+ self ._cap1188 ._write_register (_CAP1188_THESHOLD_1 + self ._pin - 1 , value )
108
+
92
109
def recalibrate (self ):
93
110
"""Perform a self recalibration."""
94
111
self ._cap1188 .recalibrate_pins (1 << self ._pin - 1 )
@@ -97,15 +114,16 @@ def recalibrate(self):
97
114
class CAP1188 :
98
115
"""CAP1188 driver base, must be extended for I2C/SPI interfacing."""
99
116
def __init__ (self ):
100
- mid = self ._read_register (CAP1188_MANU_ID )
101
- if mid != CAP1188_MID :
117
+ mid = self ._read_register (_CAP1188_MANU_ID )
118
+ if mid != _CAP1188_MID :
102
119
raise RuntimeError ('Failed to find CAP1188! Manufacturer ID: 0x{:02x}' .format (mid ))
103
- pid = self ._read_register (CAP1188_PRODUCT_ID )
104
- if pid != CAP1188_PID :
120
+ pid = self ._read_register (_CAP1188_PRODUCT_ID )
121
+ if pid != _CAP1188_PID :
105
122
raise RuntimeError ('Failed to find CAP1188! Product ID: 0x{:02x}' .format (pid ))
106
123
self ._channels = [None ]* 8
107
- self ._write_register (CAP1188_LED_LINKING , 0xFF ) # turn on LED linking
108
- self ._write_register (CAP1188_MULTI_TOUCH_CFG , 0x00 ) # allow multi touch
124
+ self ._write_register (_CAP1188_LED_LINKING , 0xFF ) # turn on LED linking
125
+ self ._write_register (_CAP1188_MULTI_TOUCH_CFG , 0x00 ) # allow multi touch
126
+ self ._write_register (0x2F , 0x10 ) # turn off input-1-sets-all-inputs feature
109
127
self .recalibrate ()
110
128
111
129
def __getitem__ (self , key ):
@@ -126,10 +144,39 @@ def touched_pins(self):
126
144
def touched (self ):
127
145
"""Return 8 bit value representing touch state of all pins."""
128
146
# clear the INT bit and any previously touched pins
129
- current = self ._read_register (CAP1188_MAIN_CONTROL )
130
- self ._write_register (CAP1188_MAIN_CONTROL , current & ~ 0x01 )
147
+ current = self ._read_register (_CAP1188_MAIN_CONTROL )
148
+ self ._write_register (_CAP1188_MAIN_CONTROL , current & ~ 0x01 )
131
149
# return only currently touched pins
132
- return self ._read_register (CAP1188_INPUT_STATUS )
150
+ return self ._read_register (_CAP1188_INPUT_STATUS )
151
+
152
+ @property
153
+ def sensitivity (self ):
154
+ """The sensitvity of touch detections. Range is 1 (least) to 128 (most)."""
155
+ return _SENSITIVITY [self ._read_register (_CAP1188_SENSITIVTY ) >> 4 & 0x07 ]
156
+
157
+ @sensitivity .setter
158
+ def sensitivity (self , value ):
159
+ if value not in _SENSITIVITY :
160
+ raise ValueError ("Sensitivty must be one of: {}" .format (_SENSITIVITY ))
161
+ value = _SENSITIVITY .index (value ) << 4
162
+ new_setting = self ._read_register (_CAP1188_SENSITIVTY ) & 0x8F | value
163
+ self ._write_register (_CAP1188_SENSITIVTY , new_setting )
164
+
165
+ @property
166
+ def thresholds (self ):
167
+ """Touch threshold value for all channels."""
168
+ return self .threshold_values ()
169
+
170
+ @thresholds .setter
171
+ def thresholds (self , value ):
172
+ value = int (value )
173
+ if not 0 <= value <= 127 :
174
+ raise ValueError ("Threshold value must be in range 0 to 127." )
175
+ self ._write_block (_CAP1188_THESHOLD_1 , bytearray ((value ,)* 8 ))
176
+
177
+ def threshold_values (self ):
178
+ """Return tuple of touch threshold values for all channels."""
179
+ return tuple (self ._read_block (_CAP1188_THESHOLD_1 , 8 ))
133
180
134
181
def recalibrate (self ):
135
182
"""Perform a self recalibration on all the pins."""
@@ -140,13 +187,13 @@ def delta_count(self, pin):
140
187
if pin < 1 or pin > 8 :
141
188
raise IndexError ('Pin must be a value 1-8.' )
142
189
# 8 bit 2's complement
143
- raw_value = self ._read_register (CAP1188_DELTA_COUNT [pin - 1 ])
190
+ raw_value = self ._read_register (_CAP1188_DELTA_COUNT [pin - 1 ])
144
191
raw_value = raw_value - 256 if raw_value & 128 else raw_value
145
192
return raw_value
146
193
147
194
def recalibrate_pins (self , mask ):
148
195
"""Recalibrate pins specified by bit mask."""
149
- self ._write_register (CAP1188_CAL_ACTIVATE , mask )
196
+ self ._write_register (_CAP1188_CAL_ACTIVATE , mask )
150
197
151
198
def _read_register (self , address ):
152
199
"""Return 8 bit value of register at address."""
@@ -155,3 +202,11 @@ def _read_register(self, address):
155
202
def _write_register (self , address , value ):
156
203
"""Write 8 bit value to registter at address."""
157
204
raise NotImplementedError
205
+
206
+ def _read_block (self , start , length ):
207
+ """Return byte array of values from start address to length."""
208
+ raise NotImplementedError
209
+
210
+ def _write_block (self , start , data ):
211
+ """Write out data beginning at start address."""
212
+ raise NotImplementedError
0 commit comments