Skip to content

Commit 391d31f

Browse files
committed
Cleaup and avoid soft device error 0008 on mac
1 parent 8b32e62 commit 391d31f

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

keyboard/__init__.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ def __init__(self, keymap=KEYMAP, pairs=(), verbose=True):
149149
self.usb_status = 0
150150
self.leds = None
151151

152+
self._current_conn = ""
153+
152154
self.data = array.array('L', microcontroller.nvm[:272])
153155
if self.data[0] != 0x424b5950:
154156
self.data[0] = 0x424b5950
@@ -165,15 +167,32 @@ def __init__(self, keymap=KEYMAP, pairs=(), verbose=True):
165167
self.ble_hid = HID(ble_hid.devices)
166168
self.usb_hid = HID(usb_hid.devices)
167169

170+
def update_current_conn(self):
171+
if usb_is_connected() and self.usb_status == 3:
172+
conn = "USB"
173+
elif self.ble.connected:
174+
conn = "BT%d" % self.ble_id
175+
else:
176+
conn = ""
177+
if conn != self._current_conn:
178+
self._current_conn = conn
179+
if conn in self.action_maps:
180+
self.current_keymap = self.action_maps[self._current_conn]
181+
else:
182+
self.current_keymap = self.actonmap
183+
print("Current connection changed to %s" % self._current_conn)
184+
168185
def check(self):
169186
if self.adv_timeout:
170187
if self.ble.connected:
171188
self.adv_timeout = 0
172189
self.backlight.set_bt_led(None)
173-
174190
for c in self.ble.connections:
175-
if c.connection_interval > 11.25:
176-
c.connection_interval = 11.25
191+
try:
192+
if c.connection_interval > 11.25:
193+
c.connection_interval = 11.25
194+
except _bleio.BluetoothError:
195+
self.log("failed to set ble connection interval")
177196
self.log('ble connection interval {}'.format(c.connection_interval))
178197
elif time.time() > self.adv_timeout:
179198
self.stop_advertising()
@@ -195,22 +214,20 @@ def check(self):
195214
self.leds = leds
196215
self.backlight.set_hid_leds(leds)
197216
self.log('keyboard leds {}'.format(bin(leds)))
217+
self.update_current_conn()
198218

199219
def setup(self):
200220
convert = lambda a: array.array('H', (get_action_code(k) for k in a))
201221
self.actonmap = tuple(convert(layer) for layer in self.keymap)
222+
202223
self.action_maps = {}
203224
for key in self.profiles:
204225
self.action_maps[key] = tuple(convert(layer) for layer in self.profiles[key])
205226

206227
for pair in self.pairs:
207228
for key in pair:
208229
self.pair_keys.add(key)
209-
210-
def get_actionmap(self):
211-
if self.current_channel() in self.action_maps:
212-
return self.action_maps[self.current_channel()]
213-
return self.actonmap
230+
self.update_current_conn()
214231

215232
def start_advertising(self):
216233
self.ble.start_advertising(self.advertisement)
@@ -234,7 +251,7 @@ def change_bt(self, n):
234251

235252
if 0 > n or n > 9:
236253
return
237-
254+
238255
uid = self.uid[n:n+6]
239256
uid[-1] = uid[-1] | 0xC0
240257
address = _bleio.Address(uid, _bleio.Address.RANDOM_STATIC)
@@ -251,7 +268,6 @@ def change_bt(self, n):
251268
print(e)
252269
self.log(self.ble._adapter.address)
253270
self.start_advertising()
254-
print(self.current_channel())
255271

256272
def toggle_bt(self):
257273
if self.ble.connected:
@@ -261,24 +277,22 @@ def toggle_bt(self):
261277
self.stop_advertising()
262278
else:
263279
self.start_advertising()
264-
print(self.current_channel())
265-
266-
def current_channel(self):
267-
if self.ble.connected:
268-
return "BT%d" % self.ble_id
269-
return "USB"
280+
self.update_current_conn()
270281

271282
def toggle_usb(self):
272283
if usb_is_connected():
273-
self.usb_status = 1 if self.usb_status == 3 else 3
274-
print(self.current_channel())
284+
if self.usb_status == 1:
285+
self.usb_status = 3
286+
else:
287+
self.usb_status = 1
288+
self.update_current_conn()
275289

276290
def action_code(self, position):
277291
position = COORDS[position]
278292
layer_mask = self.layer_mask
279-
for layer in range(len(self.get_actionmap()) - 1, -1, -1):
293+
for layer in range(len(self.current_keymap) - 1, -1, -1):
280294
if (layer_mask >> layer) & 1:
281-
code = self.get_actionmap()[layer][position]
295+
code = self.current_keymap[layer][position]
282296
if code == 1: # TRANSPARENT
283297
continue
284298
return code

0 commit comments

Comments
 (0)