#key #keyboard #usb #firmware #unicode #send #callback

nightly keytokey

将按键事件流转换为USB报告的键盘固件库

3个版本 (破坏性)

0.3.0 2020年7月8日
0.2.0 2019年8月14日
0.1.0 2019年8月5日

#1737 in 硬件支持

MIT 许可证

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