1
-
2
1
import array
3
2
import time
4
3
import struct
25
24
L3B = LAYER_TAP (3 , B )
26
25
27
26
# Semicolon & Ctrl
28
- SCC = MODS_TAP (MODS (RCTRL ), ';' )
29
-
27
+ SCC = MODS_TAP (MODS (RCTRL ), ";" )
30
28
29
+ # fmt: off
31
30
KEYMAP = (
32
31
# layer 0
33
32
(
65
64
___ , ___ , ___ , ___ , ___ , ___ , ___ , ___
66
65
),
67
66
)
67
+ # fmt: on
68
+
68
69
69
70
@micropython .asm_thumb
70
71
def mem (r0 ):
71
72
ldr (r0 , [r0 , 0 ])
72
73
74
+
73
75
def usb_is_connected ():
74
76
return mem (0x40000438 ) == 0x3
75
77
78
+
76
79
def reset_into_bootloader ():
77
80
microcontroller .on_next_reset (microcontroller .RunMode .BOOTLOADER )
78
81
microcontroller .reset ()
@@ -87,7 +90,9 @@ def is_tapped(matrix, key):
87
90
if target == matrix .view (0 ):
88
91
return True
89
92
else :
90
- n = matrix .wait (200 - matrix .ms (matrix .time () - matrix .get_keydown_time (key )))
93
+ n = matrix .wait (
94
+ 200 - matrix .ms (matrix .time () - matrix .get_keydown_time (key ))
95
+ )
91
96
if n == 2 and target == matrix .view (1 ):
92
97
return True
93
98
@@ -152,11 +157,12 @@ def __init__(self, keymap=KEYMAP, pairs=(), verbose=True):
152
157
153
158
self ._current_conn = ""
154
159
155
- self .data = array .array ('L' , microcontroller .nvm [:272 ])
156
- if self .data [0 ] != 0x424b5950 :
157
- self .data [0 ] = 0x424b5950
160
+ self .data = array .array ("L" , microcontroller .nvm [:272 ])
161
+ if self .data [0 ] != 0x424B5950 :
162
+ self .data [0 ] = 0x424B5950
158
163
self .data [1 ] = 1
159
- for i in range (4 , 68 ): self .data [i ] = 0
164
+ for i in range (4 , 68 ):
165
+ self .data [i ] = 0
160
166
self .ble_id = self .data [1 ]
161
167
self .heatmap = memoryview (self .data )[4 :]
162
168
@@ -188,7 +194,7 @@ def update_current_conn(self):
188
194
self .layer_mask = 1
189
195
190
196
def check (self ):
191
- if self .adv_timeout :
197
+ if self .adv_timeout :
192
198
if self .ble .connected :
193
199
self .adv_timeout = 0
194
200
self .backlight .set_bt_led (None )
@@ -219,21 +225,23 @@ def check(self):
219
225
if leds != self .leds :
220
226
self .leds = leds
221
227
self .backlight .set_hid_leds (leds )
222
- self .log (' keyboard leds {}' .format (bin (leds )))
228
+ self .log (" keyboard leds {}" .format (bin (leds )))
223
229
self .update_current_conn ()
224
230
225
231
# update battery level
226
232
if time .time () > self .battery_update_time :
227
233
self .battery_update_time = time .time () + 360
228
234
self .battery .level = battery_level ()
229
-
235
+
230
236
def setup (self ):
231
- convert = lambda a : array .array ('H' , (get_action_code (k ) for k in a ))
237
+ convert = lambda a : array .array ("H" , (get_action_code (k ) for k in a ))
232
238
self .actonmap = tuple (convert (layer ) for layer in self .keymap )
233
239
234
240
self .action_maps = {}
235
241
for key in self .profiles :
236
- self .action_maps [key ] = tuple (convert (layer ) for layer in self .profiles [key ])
242
+ self .action_maps [key ] = tuple (
243
+ convert (layer ) for layer in self .profiles [key ]
244
+ )
237
245
238
246
for pair in self .pairs :
239
247
for key in pair :
@@ -263,18 +271,18 @@ def change_bt(self, n):
263
271
if 0 > n or n > 9 :
264
272
return
265
273
266
- uid = self .uid [n : n + 6 ]
274
+ uid = self .uid [n : n + 6 ]
267
275
uid [- 1 ] = uid [- 1 ] | 0xC0
268
276
address = _bleio .Address (uid , _bleio .Address .RANDOM_STATIC )
269
277
try :
270
278
self .ble ._adapter .address = address
271
- name = ' PYKB {}' .format (n )
279
+ name = " PYKB {}" .format (n )
272
280
self .advertisement .complete_name = name
273
281
self .ble .name = name
274
282
self .ble_id = n
275
283
if self .data [1 ] != n :
276
284
self .data [1 ] = n
277
- microcontroller .nvm [:272 ] = struct .pack (' 68L' , * self .data )
285
+ microcontroller .nvm [:272 ] = struct .pack (" 68L" , * self .data )
278
286
except Exception as e :
279
287
print (e )
280
288
self .log (self .ble ._adapter .address )
@@ -304,7 +312,7 @@ def action_code(self, position):
304
312
for layer in range (len (self .current_keymap ) - 1 , - 1 , - 1 ):
305
313
if (layer_mask >> layer ) & 1 :
306
314
code = self .current_keymap [layer ][position ]
307
- if code == 1 : # TRANSPARENT
315
+ if code == 1 : # TRANSPARENT
308
316
continue
309
317
return code
310
318
return 0
@@ -384,7 +392,9 @@ def run(self):
384
392
if n == 1 :
385
393
key = matrix .view (0 )
386
394
if key < 0x80 and key in self .pair_keys :
387
- n = matrix .wait (10 - ms (matrix .time () - matrix .get_keydown_time (key )))
395
+ n = matrix .wait (
396
+ 10 - ms (matrix .time () - matrix .get_keydown_time (key ))
397
+ )
388
398
389
399
if n >= 2 :
390
400
pair = {matrix .view (0 ), matrix .view (1 )}
@@ -393,8 +403,10 @@ def run(self):
393
403
key1 = self .get ()
394
404
key2 = self .get ()
395
405
396
- dt = ms (matrix .get_keydown_time (key2 ) - matrix .get_keydown_time (key1 ))
397
- log ('pair keys {} {}, dt = {}' .format (pair_index , pair , dt ))
406
+ dt = ms (
407
+ matrix .get_keydown_time (key2 ) - matrix .get_keydown_time (key1 )
408
+ )
409
+ log ("pair keys {} {}, dt = {}" .format (pair_index , pair , dt ))
398
410
if callable (self .pairs_handler ):
399
411
try :
400
412
self .pairs_handler (dev , pair_index )
@@ -412,7 +424,7 @@ def run(self):
412
424
self .press (action_code )
413
425
if self .verbose :
414
426
dt = ms (matrix .time () - matrix .get_keydown_time (key ))
415
- log (' {} \\ {} latency {}' .format (key , hex (action_code ), dt ))
427
+ log (" {} \\ {} latency {}" .format (key , hex (action_code ), dt ))
416
428
else :
417
429
kind = action_code >> 12
418
430
if kind < ACT_MODS_TAP :
@@ -424,7 +436,7 @@ def run(self):
424
436
elif kind < ACT_USAGE :
425
437
# MODS_TAP
426
438
if is_tapped (matrix , key ):
427
- log (' TAP' )
439
+ log (" TAP" )
428
440
keycode = action_code & 0xFF
429
441
keys [key ] = keycode
430
442
self .press (keycode )
@@ -439,31 +451,33 @@ def run(self):
439
451
# todo
440
452
pass
441
453
elif kind == ACT_LAYER_TAP or kind == ACT_LAYER_TAP_EXT :
442
- layer = (( action_code >> 8 ) & 0x1F )
454
+ layer = (action_code >> 8 ) & 0x1F
443
455
mask = 1 << layer
444
456
if is_tapped (matrix , key ):
445
- log (' TAP' )
457
+ log (" TAP" )
446
458
keycode = action_code & 0xFF
447
459
if keycode & 0xE0 == 0xC0 :
448
- log (' LAYER_MODS' )
460
+ log (" LAYER_MODS" )
449
461
mods = keycode & 0x1F
450
462
keycodes = mods_to_keycodes (mods )
451
463
self .press (* keycodes )
452
464
elif keycode != OP_TAP_TOGGLE :
453
465
keys [key ] = keycode
454
466
self .press (keycode )
455
467
else :
456
- log ('toggle {}' .format (self .layer_mask ))
457
- self .layer_mask = (self .layer_mask & ~ mask ) | (mask & ~ self .layer_mask )
468
+ log ("toggle {}" .format (self .layer_mask ))
469
+ self .layer_mask = (self .layer_mask & ~ mask ) | (
470
+ mask & ~ self .layer_mask
471
+ )
458
472
else :
459
473
if action_code & 0xE0 == 0xC0 :
460
- log (' LAYER_MODS' )
474
+ log (" LAYER_MODS" )
461
475
mods = action_code & 0x1F
462
476
keycodes = mods_to_keycodes (mods )
463
477
self .press (* keycodes )
464
478
self .layer_mask |= mask
465
479
466
- log (' layers {}' .format (self .layer_mask ))
480
+ log (" layers {}" .format (self .layer_mask ))
467
481
elif kind == ACT_MACRO :
468
482
if callable (self .macro_handler ):
469
483
i = action_code & 0xFFF
@@ -479,7 +493,9 @@ def run(self):
479
493
elif action_code == SHUTDOWN :
480
494
microcontroller .reset ()
481
495
elif action_code == HEATMAP :
482
- microcontroller .nvm [:272 ] = struct .pack ('68L' , * self .data )
496
+ microcontroller .nvm [:272 ] = struct .pack (
497
+ "68L" , * self .data
498
+ )
483
499
if usb_is_connected ():
484
500
microcontroller .reset ()
485
501
elif action_code == USB_TOGGLE :
@@ -488,11 +504,11 @@ def run(self):
488
504
self .toggle_bt ()
489
505
elif BT (0 ) <= action_code and action_code <= BT (9 ):
490
506
i = action_code - BT (0 )
491
- log (' switch to bt {}' .format (i ))
507
+ log (" switch to bt {}" .format (i ))
492
508
self .change_bt (i )
493
509
494
510
dt = ms (matrix .time () - matrix .get_keydown_time (key ))
495
- log (' {} \\ {} latency {}' .format (key , hex (keys [key ]), dt ))
511
+ log (" {} \\ {} latency {}" .format (key , hex (keys [key ]), dt ))
496
512
else :
497
513
action_code = keys [key ]
498
514
if action_code < 0xFF :
@@ -516,16 +532,16 @@ def run(self):
516
532
elif kind == ACT_MOUSEKEY :
517
533
pass
518
534
elif kind == ACT_LAYER_TAP or kind == ACT_LAYER_TAP_EXT :
519
- layer = (( action_code >> 8 ) & 0x1F )
535
+ layer = (action_code >> 8 ) & 0x1F
520
536
keycode = action_code & 0xFF
521
537
if keycode != OP_TAP_TOGGLE :
522
538
if keycode & 0xE0 == 0xC0 :
523
- log (' LAYER_MODS' )
539
+ log (" LAYER_MODS" )
524
540
mods = keycode & 0x1F
525
541
keycodes = mods_to_keycodes (mods )
526
542
self .release (* keycodes )
527
543
self .layer_mask &= ~ (1 << layer )
528
- log (' layers {}' .format (self .layer_mask ))
544
+ log (" layers {}" .format (self .layer_mask ))
529
545
elif kind == ACT_MACRO :
530
546
if callable (self .macro_handler ):
531
547
i = action_code & 0xFFF
@@ -536,5 +552,4 @@ def run(self):
536
552
537
553
if self .verbose :
538
554
dt = ms (matrix .time () - matrix .get_keyup_time (key ))
539
- log ('{} / {} latency {}' .format (key , hex (action_code ), dt ))
540
-
555
+ log ("{} / {} latency {}" .format (key , hex (action_code ), dt ))
0 commit comments