@@ -149,6 +149,8 @@ def __init__(self, keymap=KEYMAP, pairs=(), verbose=True):
149
149
self .usb_status = 0
150
150
self .leds = None
151
151
152
+ self ._current_conn = ""
153
+
152
154
self .data = array .array ('L' , microcontroller .nvm [:272 ])
153
155
if self .data [0 ] != 0x424b5950 :
154
156
self .data [0 ] = 0x424b5950
@@ -165,15 +167,32 @@ def __init__(self, keymap=KEYMAP, pairs=(), verbose=True):
165
167
self .ble_hid = HID (ble_hid .devices )
166
168
self .usb_hid = HID (usb_hid .devices )
167
169
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
+
168
185
def check (self ):
169
186
if self .adv_timeout :
170
187
if self .ble .connected :
171
188
self .adv_timeout = 0
172
189
self .backlight .set_bt_led (None )
173
-
174
190
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" )
177
196
self .log ('ble connection interval {}' .format (c .connection_interval ))
178
197
elif time .time () > self .adv_timeout :
179
198
self .stop_advertising ()
@@ -195,22 +214,20 @@ def check(self):
195
214
self .leds = leds
196
215
self .backlight .set_hid_leds (leds )
197
216
self .log ('keyboard leds {}' .format (bin (leds )))
217
+ self .update_current_conn ()
198
218
199
219
def setup (self ):
200
220
convert = lambda a : array .array ('H' , (get_action_code (k ) for k in a ))
201
221
self .actonmap = tuple (convert (layer ) for layer in self .keymap )
222
+
202
223
self .action_maps = {}
203
224
for key in self .profiles :
204
225
self .action_maps [key ] = tuple (convert (layer ) for layer in self .profiles [key ])
205
226
206
227
for pair in self .pairs :
207
228
for key in pair :
208
229
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 ()
214
231
215
232
def start_advertising (self ):
216
233
self .ble .start_advertising (self .advertisement )
@@ -234,7 +251,7 @@ def change_bt(self, n):
234
251
235
252
if 0 > n or n > 9 :
236
253
return
237
-
254
+
238
255
uid = self .uid [n :n + 6 ]
239
256
uid [- 1 ] = uid [- 1 ] | 0xC0
240
257
address = _bleio .Address (uid , _bleio .Address .RANDOM_STATIC )
@@ -251,7 +268,6 @@ def change_bt(self, n):
251
268
print (e )
252
269
self .log (self .ble ._adapter .address )
253
270
self .start_advertising ()
254
- print (self .current_channel ())
255
271
256
272
def toggle_bt (self ):
257
273
if self .ble .connected :
@@ -261,24 +277,22 @@ def toggle_bt(self):
261
277
self .stop_advertising ()
262
278
else :
263
279
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 ()
270
281
271
282
def toggle_usb (self ):
272
283
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 ()
275
289
276
290
def action_code (self , position ):
277
291
position = COORDS [position ]
278
292
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 ):
280
294
if (layer_mask >> layer ) & 1 :
281
- code = self .get_actionmap () [layer ][position ]
295
+ code = self .current_keymap [layer ][position ]
282
296
if code == 1 : # TRANSPARENT
283
297
continue
284
298
return code
0 commit comments