分割キーボードで独自データを同期させる
Techniques to sync your own data with DIY Split keyboard
有機LED搭載の左右分離型キーボードキットでは、USBが繋がっていない方のキーボードの画面には、常にロゴが表示されています。これは、ブランドアピールをしたいからと言うよりは、ロゴ以外に表示するものがないからというのが本音です。
QMKファームウェアでは、現時点では、USBにつながっているメインボードから、TRRSケーブルを介してつないでいるサブボードには、「押しているキーを教えろ(正確にはキーボードマトリクスの状態)」と「バックライトを同期するぞ」という命令しか伝えることができません。
逆に言えば、メインボードからサブボードに追加情報を伝達することができれば、サブボード側のOLEDでも性格な情報を同期させることができるようになります。
これを実装するにはQMKのコアファイルを直接いじる必要があります。将来のアップデートに伴い、コードが同期されることで、改良したコードが失われる可能性もあるため、該当箇所のバックアップなどはしっかりと行ってください。また、以下のコード例はシリアル通信によるもので、I2C通信ではこれとは異なる修正が必要です。
QMKソースの「quantum/split_common/transport.c」を開いて、「enum serial_transaction_id」に独自の定義を追加します。
trans_id.c
enum serial_transaction_id {
GET_SLAVE_MATRIX = 0,
# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
PUT_RGBLIGHT,
# endif
SEND_MASTER_DATA
};
「SSTD_t transactions」にコードを追記します。シリアル通信はそもそもが低速なので、送信するデータは数バイト程度に収まるようにしましょう。
trans.c
uint8_t volatile status_extra_val = 0;
static uint8_t extra_val = 0;
SSTD_t transactions[] = {
[GET_SLAVE_MATRIX] =
{
(uint8_t *)&status0,
sizeof(serial_m2s_buffer),
(uint8_t *)&serial_m2s_buffer,
sizeof(serial_s2m_buffer),
(uint8_t *)&serial_s2m_buffer,
},
# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
[PUT_RGBLIGHT] =
{
(uint8_t *)&status_rgblight, sizeof(serial_rgblight), (uint8_t *)&serial_rgblight, 0, NULL // no slave to master transfer
},
# endif
[SEND_MASTER_DATA] =
{
// status_extra_val - シリアル通信の結果などを保有する変数へのポインタ
// sizeof(uint8_t) - 送信する変数のサイズ
// (uint8_t*)&extra_val - 送信するデータへのポインタ
// 返信に必要なデータのサイズ(ここでは使わないので0)
// 返信データを格納する変数へのポインタ(ここでは使わないのでNULL)
(uint8_t *)&status_extra_val, sizeof(uint8_t), (uint8_t*)&extra_val, 0, NULL,
}
};
これで準備は完了です。サブボード側では受信したデータを自動でこの変数に格納してくれるので、受け取ったデータを参照したければ、「extra_val」を適切な方法で調べるだけです。
このビデオでは、Helixベースのキーボードにおいて、メインボードの「bool led_update_user(led_t led_state)」にて取得したNUMロックのLED状態をサブボードに転送し、サブボード側のOLEDでその状態を表示させています。
2020/08/29