@4FNcake

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

KeyballのSlave側へデータ送信後、トラックボールが動作しない

解決したいこと

 Keyball44のファームウェアをわからないなりに試行錯誤していじっています。そんな中でRuncatを実装するという記事(https://qiita.com/empelt/items/268389709a52cf533d13)
をみて実装してみたい!と思いマスター側では同じものを実装できました。
 しかしこれをSlave側で実装しようとし、transaction_rpcを用いて変数をスレーブ側に送った後トラックボールが動作しなくなりました。

 当方プログラミングの知識自体も浅いのですが、ご教授いただければ幸いです。

Keyball.cでは以下のようにしています。

//added for datasync
master_to_slave_t sync_data = { .key_count = 0 };


bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
    // store last keycode, row, and col for OLED
    //押されたときのみ動作
    if (record->event.pressed) {
        sync_data.key_count = (sync_data.key_count + 1) % 3; //追加分
    }


    keyball.last_kc  = keycode;
    keyball.last_pos = record->event.key;

    pressing_keys_update(keycode, record);

    if (!process_record_user(keycode, record)) {
        return false;
    }

    // strip QK_MODS part.
    if (keycode >= QK_MODS && keycode <= QK_MODS_MAX) {
        keycode &= 0xff;
    }
ーーーーーーー以下略
//マスター側でデータを送信(50msごと)
void housekeeping_task_user(void) {
    static uint32_t last_sync = 0;
    
    if (is_keyboard_master()) {
        if (timer_elapsed32(last_sync) > 50) {  // 50msごとに送信
            if (transaction_rpc_send(USER_SYNC_A, sizeof(sync_data), &sync_data)) {
                last_sync = timer_read32();
            } else {
                dprint("Slave sync failed!\n");
            }
        }
    }
}

//スレーブ側でデータを受信
void user_sync_a_slave_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer,
                               uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
    if (initiator2target_buffer_size == sizeof(sync_data)) {
        memcpy(&sync_data, initiator2target_buffer, sizeof(sync_data));
    }
}


//初期化時にハンドラを登録
void keyboard_post_init_user(void) {
    transaction_register_rpc(USER_SYNC_A, user_sync_a_slave_handler);
}

Keymap.cにて表示

extern master_to_slave_t sync_data;

void oledkit_render_logo_user(void) {
    uint8_t state = sync_data.key_count; // Slave 側で共有データを参照

    switch (state) {
        case 0:
            oled_write_P(PSTR("Cat State: 0\n"), false);
            break;
        case 1:
            oled_write_P(PSTR("Cat State: 1\n"), false);
            break;
        case 2:
            oled_write_P(PSTR("Cat State: 2\n"), false);
            break;
    }

トラックボールが動作しない点への対処

config.hにてトラックボールが右にあることを定義

#define SPLIT_TRANSACTION_IDS_USER USER_SYNC_A //TRRS通信用

#define SPLIT_POINTING_ENABLE   //動かないポインタ修正
#define POINTING_DEVICE_RIGHT

#define SPLIT_LED_STATE_ENABLE  //capslock表示用

ご教授いただければ幸いです。

0 likes

No Answers yet.

Your answer might help someone💌