diff --git a/app/include/zmk/behavior.h b/app/include/zmk/behavior.h index 31fb43ed..ec42b5ee 100644 --- a/app/include/zmk/behavior.h +++ b/app/include/zmk/behavior.h @@ -19,4 +19,5 @@ struct zmk_behavior_binding_event { int layer; uint32_t position; int64_t timestamp; + uint32_t trace_id; }; \ No newline at end of file diff --git a/app/include/zmk/events/keycode_state_changed.h b/app/include/zmk/events/keycode_state_changed.h index 466bbd76..44661d07 100644 --- a/app/include/zmk/events/keycode_state_changed.h +++ b/app/include/zmk/events/keycode_state_changed.h @@ -17,12 +17,14 @@ struct zmk_keycode_state_changed { uint8_t explicit_modifiers; bool state; int64_t timestamp; + uint32_t trace_id; }; ZMK_EVENT_DECLARE(zmk_keycode_state_changed); static inline struct zmk_keycode_state_changed_event * -zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp) { +zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t timestamp, + uint32_t trace_id) { uint16_t page = HID_USAGE_PAGE(encoded) & 0xFF; uint16_t id = HID_USAGE_ID(encoded); uint8_t implicit_modifiers = 0x00; @@ -38,11 +40,13 @@ zmk_keycode_state_changed_from_encoded(uint32_t encoded, bool pressed, int64_t t implicit_modifiers = SELECT_MODS(encoded); } - return new_zmk_keycode_state_changed( - (struct zmk_keycode_state_changed){.usage_page = page, - .keycode = id, - .implicit_modifiers = implicit_modifiers, - .explicit_modifiers = explicit_modifiers, - .state = pressed, - .timestamp = timestamp}); + return new_zmk_keycode_state_changed((struct zmk_keycode_state_changed){ + .usage_page = page, + .keycode = id, + .implicit_modifiers = implicit_modifiers, + .explicit_modifiers = explicit_modifiers, + .state = pressed, + .timestamp = timestamp, + .trace_id = trace_id, + }); } diff --git a/app/include/zmk/events/position_state_changed.h b/app/include/zmk/events/position_state_changed.h index e2f68720..63559f9b 100644 --- a/app/include/zmk/events/position_state_changed.h +++ b/app/include/zmk/events/position_state_changed.h @@ -8,10 +8,15 @@ #include #include +#include + struct zmk_position_state_changed { uint32_t position; bool state; int64_t timestamp; + int32_t trace_id; }; -ZMK_EVENT_DECLARE(zmk_position_state_changed); \ No newline at end of file +ZMK_EVENT_DECLARE(zmk_position_state_changed); + +uint32_t zmk_get_event_trace_id(uint32_t position, bool pressed); \ No newline at end of file diff --git a/app/include/zmk/events/sensor_event.h b/app/include/zmk/events/sensor_event.h index f579bc39..4586d480 100644 --- a/app/include/zmk/events/sensor_event.h +++ b/app/include/zmk/events/sensor_event.h @@ -9,6 +9,7 @@ #include #include #include + struct zmk_sensor_event { uint8_t sensor_number; const struct device *sensor; diff --git a/app/src/behaviors/behavior_hold_tap.c b/app/src/behaviors/behavior_hold_tap.c index ab25c3cd..47f8c057 100644 --- a/app/src/behaviors/behavior_hold_tap.c +++ b/app/src/behaviors/behavior_hold_tap.c @@ -313,6 +313,7 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_mome struct zmk_behavior_binding_event event = { .position = hold_tap->position, .timestamp = hold_tap->timestamp, + .trace_id = hold_tap->trace_id, }; struct zmk_behavior_binding binding; @@ -388,6 +389,7 @@ static int on_hold_tap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event sub_behavior_data = { .position = hold_tap->position, .timestamp = hold_tap->timestamp, + .trace_id = hold_tap->trace_id, }; struct zmk_behavior_binding sub_behavior_binding; diff --git a/app/src/behaviors/behavior_key_press.c b/app/src/behaviors/behavior_key_press.c index 8282977e..b6315aba 100644 --- a/app/src/behaviors/behavior_key_press.c +++ b/app/src/behaviors/behavior_key_press.c @@ -21,15 +21,15 @@ static int behavior_key_press_init(const struct device *dev) { return 0; }; static int on_keymap_binding_pressed(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - return ZMK_EVENT_RAISE( - zmk_keycode_state_changed_from_encoded(binding->param1, true, event.timestamp)); + return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(binding->param1, true, + event.timestamp, event.trace_id)); } static int on_keymap_binding_released(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event) { LOG_DBG("position %d keycode 0x%02X", event.position, binding->param1); - return ZMK_EVENT_RAISE( - zmk_keycode_state_changed_from_encoded(binding->param1, false, event.timestamp)); + return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(binding->param1, false, + event.timestamp, event.trace_id)); } static const struct behavior_driver_api behavior_key_press_driver_api = { diff --git a/app/src/behaviors/behavior_sensor_rotate_key_press.c b/app/src/behaviors/behavior_sensor_rotate_key_press.c index 589a3a57..ee314547 100644 --- a/app/src/behaviors/behavior_sensor_rotate_key_press.c +++ b/app/src/behaviors/behavior_sensor_rotate_key_press.c @@ -47,12 +47,12 @@ static int on_sensor_binding_triggered(struct zmk_behavior_binding *binding, LOG_DBG("SEND %d", keycode); - ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, true, timestamp)); + ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, true, timestamp, 0)); // TODO: Better way to do this? k_msleep(5); - return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, false, timestamp)); + return ZMK_EVENT_RAISE(zmk_keycode_state_changed_from_encoded(keycode, false, timestamp, 0)); } static const struct behavior_driver_api behavior_sensor_rotate_key_press_driver_api = { diff --git a/app/src/events/position_state_changed.c b/app/src/events/position_state_changed.c index bb40584e..24dcb6bb 100644 --- a/app/src/events/position_state_changed.c +++ b/app/src/events/position_state_changed.c @@ -7,4 +7,15 @@ #include #include -ZMK_EVENT_IMPL(zmk_position_state_changed); \ No newline at end of file +ZMK_EVENT_IMPL(zmk_position_state_changed); + +static uint32_t zmk_last_event_trace_id = 0; +static uint32_t zmk_event_trace_ids[ZMK_KEYMAP_LEN] = {0}; + +uint32_t zmk_get_event_trace_id(uint32_t position, bool pressed) { + if (pressed) { + zmk_last_event_trace_id++; + zmk_event_trace_ids[position] = zmk_last_event_trace_id; + } + return zmk_event_trace_ids[position]; +} diff --git a/app/src/keymap.c b/app/src/keymap.c index 4b04b53c..c0049570 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -161,6 +161,7 @@ int zmk_keymap_apply_position_state(const struct zmk_position_state_changed *pos .layer = layer, .position = pos_ev->position, .timestamp = pos_ev->timestamp, + .trace_id = pos_ev->trace_id, }; LOG_DBG("layer: %d position: %d, binding name: %s", event.layer, event.position, diff --git a/app/src/kscan.c b/app/src/kscan.c index 0c128b2d..434f38bf 100644 --- a/app/src/kscan.c +++ b/app/src/kscan.c @@ -50,7 +50,11 @@ void zmk_kscan_process_msgq(struct k_work *item) { LOG_DBG("Row: %d, col: %d, position: %d, pressed: %s\n", ev.row, ev.column, position, (pressed ? "true" : "false")); ZMK_EVENT_RAISE(new_zmk_position_state_changed((struct zmk_position_state_changed){ - .state = pressed, .position = position, .timestamp = k_uptime_get()})); + .state = pressed, + .position = position, + .timestamp = k_uptime_get(), + .trace_id = zmk_get_event_trace_id(position, pressed), + })); } } diff --git a/app/src/split/bluetooth/central.c b/app/src/split/bluetooth/central.c index a56b0b81..0632ed7c 100644 --- a/app/src/split/bluetooth/central.c +++ b/app/src/split/bluetooth/central.c @@ -72,7 +72,11 @@ static uint8_t split_central_notify_func(struct bt_conn *conn, uint32_t position = (i * 8) + j; bool pressed = position_state[i] & BIT(j); struct zmk_position_state_changed ev = { - .position = position, .state = pressed, .timestamp = k_uptime_get()}; + .position = position, + .state = pressed, + .timestamp = k_uptime_get(), + .trace_id = zmk_get_event_trace_id(position, pressed), + }; k_msgq_put(&peripheral_event_msgq, &ev, K_NO_WAIT); k_work_submit(&peripheral_event_work);