3个版本 (破坏性)
0.3.0 | 2020年7月8日 |
---|---|
0.2.0 | 2019年8月14日 |
0.1.0 | 2019年8月5日 |
#1737 in 硬件支持
205KB
4.5K SLoC
KeyToKey
KeyToKey (K2K) 是一个用于构建键盘固件的Rust库。
基本来说,键盘固件a)读取按键,b)将它们转换,c)并将结果输出到计算机。
KeyToKey的作用在于b - 它接收一系列事件,例如按键、释放和超时,并使用一系列处理程序trait对象将它们转换为USB可轻松转换的报告。
这灵感来源于QMK 机械键盘固件,它可能是迄今为止功能最完整的键盘固件。不幸的是,它是C语言编写的,是一个包含许多ifdef的奇妙球体,通常需要比它所针对的微控制器更多的闪存。
这里选择的对象导向方法允许任意复杂键盘布局的组合 - 并且可以在没有硬件的情况下进行单元测试。
要开始,也许可以查看参考固件。
KeyToKey在u32的按键码上操作,代表Unicode键点。(USB按键码嵌套在Unicode代码集的第一个'私有区域'中,其余的私有区域可以由键盘实现者自由使用。)
基本键盘使用两个处理程序 - 一个是 handlers::UnicodeKeyboard,它发送OS特定的'任意Unicode键点'魔法,用于私有区域之外的任何键码,另一个是 handlers::USBKeyboard,它处理所有常见的'告诉计算机哪些按钮被按下'功能,包括修饰符。
USBKeyboard不限制同时按键的数量,但下游转换为USB可能会限制到通常的6键翻滚。
基本功能
- 作为普通USB键盘工作
- 在Linux和Windows中输入任意Unicode
高级功能正在工作
- 层(可以重写键码,根据Shift状态有条件地重写它们,或者发送任意字符串,再次依赖于Shift)
- RewriteLayers(只能重写键码,但内存效率更高)
- PressReleaseMacros(按键/释放的回调)
- StickyMacros(轻触一次激活,再次取消激活){
- OneShots(按下 -> 激活,在下一个非One-shot键按下后取消激活 - 适用于修饰符或临时激活的层)
- SpaceCadet(按住时执行一项操作,轻触时执行另一项操作。例如,也是一个输出括号的shift键)
- 序列(例如
t e h
->the
,这些不会拦截按键代码,但随后发送一系列退格键按下,然后执行你的操作)
计划中的高级功能
- 领导者序列(例如,击打
leader h e a r t
以输入心形表情符号或任意字符串) - TapDance(计算键的点击次数,将最终计数传递给回调)
- AutoShift - 短按:小写,长按:大写。但会移除按键重复。
K2K力求将触发器(何时发生某些事情)与实际操作分离。目前操作可能是任意的(USB)键码注册、发送 &str 或回调(通过特性实现)
其他Rust固件/键盘库
依赖项
~3MB
~66K SLoC