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