分割キーボードで独自データを同期させる

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