Skip to content

Commit dbb3bea

Browse files
committed
Add support for vial macros
1 parent a1702f5 commit dbb3bea

File tree

3 files changed

+121
-7
lines changed

3 files changed

+121
-7
lines changed

keyboard.go

Lines changed: 86 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package keyboard
44

55
import (
6+
"bytes"
67
"context"
78
"machine"
89
k "machine/usb/hid/keyboard"
@@ -18,6 +19,7 @@ type Device struct {
1819
Keyboard UpDowner
1920
Mouse Mouser
2021
Override [][]Keycode
22+
Macros [2048]byte
2123
Debug bool
2224
flashCh chan bool
2325
flashCnt int
@@ -43,6 +45,7 @@ type KBer interface {
4345
type UpDowner interface {
4446
Up(c k.Keycode) error
4547
Down(c k.Keycode) error
48+
Write(b []byte) (n int, err error)
4649
}
4750

4851
type State uint8
@@ -97,7 +100,7 @@ func (d *Device) Init() error {
97100
keys := d.GetMaxKeyCount()
98101

99102
// TODO: refactor
100-
rbuf := make([]byte, 4+layers*keyboards*keys*2)
103+
rbuf := make([]byte, 4+layers*keyboards*keys*2+len(device.Macros))
101104
_, err := machine.Flash.ReadAt(rbuf, 0)
102105
if err != nil {
103106
return err
@@ -120,6 +123,14 @@ func (d *Device) Init() error {
120123
}
121124
}
122125

126+
for i, b := range rbuf[offset:] {
127+
if b == 0xFF {
128+
b = 0
129+
}
130+
device.Macros[i] = b
131+
}
132+
//copy(device.Macros[:], rbuf[offset:])
133+
123134
return nil
124135
}
125136

@@ -200,6 +211,9 @@ func (d *Device) Tick() error {
200211
} else if x == keycodes.KeyRestoreDefaultKeymap {
201212
// restore default keymap for QMK
202213
machine.Flash.EraseBlocks(0, 1)
214+
} else if x&0xFF00 == keycodes.TypeMacroKey {
215+
no := uint8(x & 0x00FF)
216+
d.RunMacro(no)
203217
} else if x&0xF000 == 0xD000 {
204218
switch x & 0x00FF {
205219
case 0x01, 0x02, 0x04, 0x08, 0x10:
@@ -269,6 +283,54 @@ func (d *Device) Tick() error {
269283
return nil
270284
}
271285

286+
func (d *Device) RunMacro(no uint8) error {
287+
macros := bytes.SplitN(d.Macros[:], []byte{0x00}, 16)
288+
289+
macro := macros[no]
290+
291+
for i := 0; i < len(macro); {
292+
if macro[i] == 0x01 {
293+
p := macro[i:]
294+
if p[1] == 0x04 {
295+
// delayMs
296+
delayMs := int(p[2]) + int(p[3]-1)*255
297+
time.Sleep(time.Duration(delayMs) * time.Millisecond)
298+
i += 4
299+
} else {
300+
kc := keycodeViaToTGK(Keycode(p[2]))
301+
sz := 3
302+
if p[1] > 0x04 {
303+
kc = Keycode(p[2]) + Keycode(p[3])<<8
304+
sz += 1
305+
}
306+
i += sz
307+
kc = keycodeViaToTGK(kc)
308+
309+
switch p[1] {
310+
case 0x01, 0x05:
311+
k.Keyboard.Down(k.Keycode(kc))
312+
k.Keyboard.Up(k.Keycode(kc))
313+
case 0x02, 0x06:
314+
k.Keyboard.Down(k.Keycode(kc))
315+
case 0x03, 0x07:
316+
k.Keyboard.Up(k.Keycode(kc))
317+
}
318+
}
319+
} else {
320+
idx := bytes.Index(macro[i:], []byte{0x01})
321+
if idx == -1 {
322+
idx = len(macro)
323+
} else {
324+
idx = i + idx
325+
}
326+
k.Keyboard.Write(macro[i:idx])
327+
i = idx
328+
}
329+
}
330+
331+
return nil
332+
}
333+
272334
func encKey(kb, layer, index int) uint32 {
273335
return (uint32(kb) << 24) | (uint32(layer) << 16) | uint32(index)
274336
}
@@ -348,7 +410,11 @@ func (d *Device) KeyVia(layer, kbIndex, index int) Keycode {
348410
// restore default keymap for QMK
349411
kc = keycodes.KeyRestoreDefaultKeymap
350412
default:
351-
kc = kc & 0x0FFF
413+
if kc&0xFF00 == keycodes.TypeMacroKey {
414+
// skip
415+
} else {
416+
kc = kc & 0x0FFF
417+
}
352418
}
353419
return kc
354420
}
@@ -365,6 +431,12 @@ func (d *Device) SetKeycodeVia(layer, kbIndex, index int, key Keycode) {
365431
return
366432
}
367433
//fmt.Printf("SetKeycodeVia(%d, %d, %d, %04X)\n", layer, kbIndex, index, key)
434+
kc := keycodeViaToTGK(key)
435+
436+
d.kb[kbIndex].SetKeycode(layer, index, kc)
437+
}
438+
439+
func keycodeViaToTGK(key Keycode) Keycode {
368440
kc := key | 0xF000
369441

370442
switch key {
@@ -395,9 +467,11 @@ func (d *Device) SetKeycodeVia(layer, kbIndex, index int, key Keycode) {
395467
case keycodes.KeyRestoreDefaultKeymap:
396468
kc = keycodes.KeyRestoreDefaultKeymap
397469
default:
470+
if key&0xFF00 == keycodes.TypeMacroKey {
471+
kc = key
472+
}
398473
}
399-
400-
d.kb[kbIndex].SetKeycode(layer, index, kc)
474+
return kc
401475
}
402476

403477
func (d *Device) Layer() int {
@@ -468,6 +542,10 @@ func (k *Keyboard) Down(c k.Keycode) error {
468542
return nil
469543
}
470544

545+
func (k *Keyboard) Write(b []byte) (n int, err error) {
546+
return k.Port.Write(b)
547+
}
548+
471549
// UartTxKeyboard is a keyboard that simply sends row/col corresponding to key
472550
// placement via UART. For instructions on how to set it up, see bellow.
473551
//
@@ -506,3 +584,7 @@ func (k *UartTxKeyboard) Down(c k.Keycode) error {
506584
}
507585
return nil
508586
}
587+
588+
func (k *UartTxKeyboard) Write(b []byte) (n int, err error) {
589+
return len(b), nil
590+
}

keycodes/keycodes.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const (
1111
TypeMouse = 0xD000
1212
TypeModKey = 0xFF00
1313
TypeToKey = 0xFF10
14+
TypeMacroKey = 0x7700
1415
)
1516

1617
const (
@@ -41,6 +42,25 @@ const (
4142
KeyTo5 = TypeToKey | 0x05
4243
)
4344

45+
const (
46+
KeyMacro0 = TypeMacroKey | 0x00
47+
KeyMacro1 = TypeMacroKey | 0x01
48+
KeyMacro2 = TypeMacroKey | 0x02
49+
KeyMacro3 = TypeMacroKey | 0x03
50+
KeyMacro4 = TypeMacroKey | 0x04
51+
KeyMacro5 = TypeMacroKey | 0x05
52+
KeyMacro6 = TypeMacroKey | 0x06
53+
KeyMacro7 = TypeMacroKey | 0x07
54+
KeyMacro8 = TypeMacroKey | 0x08
55+
KeyMacro9 = TypeMacroKey | 0x09
56+
KeyMacro10 = TypeMacroKey | 0x0a
57+
KeyMacro11 = TypeMacroKey | 0x0b
58+
KeyMacro12 = TypeMacroKey | 0x0c
59+
KeyMacro13 = TypeMacroKey | 0x0d
60+
KeyMacro14 = TypeMacroKey | 0x0e
61+
KeyMacro15 = TypeMacroKey | 0x0f
62+
)
63+
4464
const (
4565
// restore default keymap for QMK
4666
KeyRestoreDefaultKeymap = 0x7C03

via.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,23 @@ func rxHandler2(b []byte) bool {
158158

159159
case 0x0D:
160160
// DynamicKeymapMacroGetBufferSizeCommand
161-
txb[1] = 0x07
162-
txb[2] = 0x9B
161+
sz := len(device.Macros)
162+
txb[1] = byte(sz >> 8)
163+
txb[2] = byte(sz)
163164
case 0x0C:
164165
// DynamicKeymapMacroGetCountCommand
165166
txb[1] = 0x10
166167
case 0x0E:
167168
// DynamicKeymapMacroGetBufferCommand
169+
offset := (uint16(b[1]) << 8) + uint16(b[2])
170+
sz := b[3]
171+
copy(txb[4:4+sz], device.Macros[offset:])
172+
case 0x0F:
173+
// CMD_VIA_MACRO_SET_BUFFER
174+
offset := (uint16(b[1]) << 8) + uint16(b[2])
175+
sz := b[3]
176+
copy(device.Macros[offset:], txb[4:4+sz])
177+
device.flashCh <- true
168178
case 0x02:
169179
// id_get_keyboard_value
170180
Changed = false
@@ -258,7 +268,7 @@ func Save() error {
258268
keyboards := len(device.kb)
259269

260270
cnt := device.GetMaxKeyCount()
261-
wbuf := make([]byte, 4+layers*keyboards*cnt*2)
271+
wbuf := make([]byte, 4+layers*keyboards*cnt*2+len(device.Macros))
262272
needed := int64(len(wbuf)) / machine.Flash.EraseBlockSize()
263273
if needed == 0 {
264274
needed = 1
@@ -287,6 +297,8 @@ func Save() error {
287297
}
288298
}
289299

300+
copy(wbuf[offset:], device.Macros[:])
301+
290302
_, err = machine.Flash.WriteAt(wbuf[:], 0)
291303
if err != nil {
292304
return err

0 commit comments

Comments
 (0)