diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/endpoints.c | 34 | ||||
-rw-r--r-- | src/handlers.c | 59 | ||||
-rw-r--r-- | src/hid.c | 12 | ||||
-rw-r--r-- | src/kscan.c | 4 | ||||
-rw-r--r-- | src/kscan_mock.c | 6 |
5 files changed, 92 insertions, 23 deletions
diff --git a/src/endpoints.c b/src/endpoints.c index 5e9fcdf..668380a 100644 --- a/src/endpoints.c +++ b/src/endpoints.c @@ -33,24 +33,10 @@ int zmk_endpoints_init() return 0; } -int zmk_endpoints_send_key_event(struct zmk_key_event key_event) +int zmk_endpoints_send_report() { - struct zmk_hid_report *report; int err; - - LOG_DBG("key %lld, state %d\n", key_event.key, key_event.pressed); - - - if (key_event.pressed) - { - zmk_hid_press_key(key_event.key); - } - else - { - zmk_hid_release_key(key_event.key); - } - - report = zmk_hid_get_report(); + struct zmk_hid_report *report = zmk_hid_get_report(); // if (zmk_usb_hid_send_report(report) != 0) // { @@ -67,3 +53,19 @@ int zmk_endpoints_send_key_event(struct zmk_key_event key_event) return 0; } + +int zmk_endpoints_send_key_event(struct zmk_key_event key_event) +{ + LOG_DBG("key %d, state %d\n", key_event.key, key_event.pressed); + + if (key_event.pressed) + { + zmk_hid_press_key(key_event.key); + } + else + { + zmk_hid_release_key(key_event.key); + } + + return zmk_endpoints_send_report(); +} diff --git a/src/handlers.c b/src/handlers.c index b73c92c..ff969b1 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -2,20 +2,79 @@ #include <zmk/ble.h> #include <zmk/handlers.h> #include <zmk/endpoints.h> +#include <zmk/hid.h> +#include <zmk/matrix.h> + +#ifdef CONFIG_ZMK_ACTION_MOD_TAP +u16_t action_effect_pending = 0; +#endif __attribute__((weak)) bool zmk_handle_key_user(struct zmk_key_event *key_event) { return true; }; +bool zmk_handle_action(zmk_action action, struct zmk_key_event *key_event) +{ + zmk_mod mods = ZK_MODS(key_event->key); + u8_t flattened_index = (key_event->row * ZMK_MATRIX_COLS) + key_event->column; + switch (action) + { +#ifdef CONFIG_ZMK_ACTION_MOD_TAP + case ZMK_ACTION_MOD_TAP: + if (key_event->pressed) + { + WRITE_BIT(action_effect_pending, flattened_index, true); + zmk_hid_register_mods(mods); + } + else + { + zmk_hid_unregister_mods(mods); + if (action_effect_pending & BIT(flattened_index)) + { + struct zmk_key_event non_mod_event = + { + .row = key_event->row, + .column = key_event->column, + .key = ZK_KEY(key_event->key), + .pressed = true}; + + zmk_handle_key(non_mod_event); + non_mod_event.pressed = false; + zmk_handle_key(non_mod_event); + } + else + { + // Since not sending a keycode, at least send the report w/ the mod removed + zmk_endpoints_send_report(); + } + } + break; +#endif + } + return false; +}; + void zmk_handle_key(struct zmk_key_event key_event) { + zmk_action action = ZK_ACTION(key_event.key); + if (!zmk_handle_key_user(&key_event)) { return; } + if (action && !zmk_handle_action(action, &key_event)) + { + return; + } + +#ifdef CONFIG_ZMK_ACTION_MOD_TAP + action_effect_pending = 0; +#endif + #ifdef CONFIG_ZMK_BLE + /* Used for intercepting key presses when doing passkey verification */ if (!zmk_ble_handle_key_user(&key_event)) { return; @@ -21,6 +21,18 @@ int zmk_hid_unregister_mod(zmk_mod modifier) _TOGGLE_MOD(modifier, false); } +int zmk_hid_register_mods(zmk_mod_flags modifiers) +{ + report.modifiers |= modifiers; + printk("After register mods %d have %d\n", modifiers, report.modifiers); +} + +int zmk_hid_unregister_mods(zmk_mod_flags modifiers) +{ + report.modifiers &= ~modifiers; + printk("After unregister mods %d have %d\n", modifiers, report.modifiers); +} + #define KEY_OFFSET 0x02 #define MAX_KEYS 6 diff --git a/src/kscan.c b/src/kscan.c index 83e8ca6..1f54a14 100644 --- a/src/kscan.c +++ b/src/kscan.c @@ -50,9 +50,9 @@ void zmk_kscan_process_msgq(struct k_work *item) { bool pressed = (ev.state == ZMK_KSCAN_EVENT_STATE_PRESSED); zmk_key key = zmk_keymap_keycode_from_position(ev.row, ev.column); - struct zmk_key_event kev = (struct zmk_key_event){.key = key, .pressed = pressed}; + struct zmk_key_event kev = (struct zmk_key_event){.row = ev.row, .column = ev.column, .key = key, .pressed = pressed}; - LOG_DBG("Row: %d, col: %d, key: %lld, pressed: %s\n", ev.row, ev.column, key, (pressed ? "true" : "false")); + LOG_DBG("Row: %d, col: %d, key: %d, pressed: %s\n", ev.row, ev.column, key, (pressed ? "true" : "false")); zmk_handle_key(kev); } } diff --git a/src/kscan_mock.c b/src/kscan_mock.c index 09a0161..a214335 100644 --- a/src/kscan_mock.c +++ b/src/kscan_mock.c @@ -68,7 +68,7 @@ static void kscan_mock_work_handler(struct k_work *work) struct kscan_mock_config *cfg = data->dev->config_info; u32_t ev = cfg->events[data->event_index++]; - LOG_DBG("Triggering ev %d\n", ev); + LOG_DBG("ev %u row %d column %d state %d\n", ev, ZMK_MOCK_ROW(ev), ZMK_MOCK_COL(ev), ZMK_MOCK_IS_PRESS(ev)); data->callback(data->dev, ZMK_MOCK_ROW(ev), ZMK_MOCK_COL(ev), ZMK_MOCK_IS_PRESS(ev)); kscan_mock_schedule_next_event(data->dev); } @@ -93,10 +93,6 @@ static int kscan_mock_init(struct device *dev) struct kscan_mock_data *data = dev->driver_data; const struct kscan_mock_config *cfg = dev->config_info; - printk("Init first event: %d\n", cfg->events[0]); - - int err; - data->dev = dev; k_delayed_work_init(&data->work, kscan_mock_work_handler); |