From 25c8a269982ae7414ef0e407900c0f793971e625 Mon Sep 17 00:00:00 2001 From: Kellen Carey Date: Sun, 16 Aug 2020 12:49:08 -0700 Subject: wait before sending HID report --- app/src/usb_hid.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'app/src') diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 4c6dd4b..07c3d5f 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -1,4 +1,5 @@ +#include #include #include @@ -15,6 +16,18 @@ static enum usb_dc_status_code usb_status; static struct device *hid_dev; +static K_SEM_DEFINE(hid_sem, 1, 1); + +static void in_ready_cb(void) +{ + k_sem_give(&hid_sem); +} + +static const struct hid_ops ops = +{ + .int_in_ready = in_ready_cb, +}; + int zmk_usb_hid_send_report(const u8_t *report, size_t len) { if (usb_status == USB_DC_SUSPEND) @@ -22,6 +35,7 @@ int zmk_usb_hid_send_report(const u8_t *report, size_t len) return usb_wakeup_request(); } + k_sem_take(&hid_sem, K_FOREVER); return hid_int_ep_write(hid_dev, report, len, NULL); } @@ -43,7 +57,7 @@ static int zmk_usb_hid_init(struct device *_arg) usb_hid_register_device(hid_dev, zmk_hid_report_desc, sizeof(zmk_hid_report_desc), - NULL); + &ops); usb_hid_init(hid_dev); -- cgit v1.2.3 From 5b4e5a30c41ea6edfa592735fcf607c44b0b3243 Mon Sep 17 00:00:00 2001 From: Kellen Carey Date: Sun, 16 Aug 2020 12:51:06 -0700 Subject: remove unnecessary include --- app/src/usb_hid.c | 1 - 1 file changed, 1 deletion(-) (limited to 'app/src') diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 07c3d5f..40511b0 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -1,5 +1,4 @@ -#include #include #include -- cgit v1.2.3 From 087574f607b4a500738b8155281cf24388ba4400 Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 16 Aug 2020 15:36:43 -0500 Subject: Create proper fix for split default conn bug --- app/src/ble.c | 19 ------------------- 1 file changed, 19 deletions(-) (limited to 'app/src') diff --git a/app/src/ble.c b/app/src/ble.c index 488491c..6d2903f 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -76,29 +76,10 @@ static void security_changed(struct bt_conn *conn, bt_security_t level, } } -#if !IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL) -static bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param) { - static struct bt_conn_info info; - - bt_conn_get_info(conn, &info); - - /* This captures a param change from central half of a split board connection - to stop default params from getting set over the top of our preferred ones */ - if (info.role == BT_CONN_ROLE_MASTER && (param->interval_min != 6 || param->latency != 30)) { - return false; - } - - return true; -} -#endif - static struct bt_conn_cb conn_callbacks = { .connected = connected, .disconnected = disconnected, .security_changed = security_changed, -#if !IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL) - .le_param_req = le_param_req, -#endif }; static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey) -- cgit v1.2.3 From e5ba03f0881658514c24b1227c514ed57c0c7937 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Mon, 17 Aug 2020 23:23:30 -0400 Subject: Revert "Merge pull request #93 from careyk007/main" This reverts commit 8cd8933c87aadd2ce7b31c1367bfaad81fc2a36b, reversing changes made to 3f1dfbaad1a867f59c13814a517e03dfce4d4223. --- app/src/usb_hid.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) (limited to 'app/src') diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 40511b0..4c6dd4b 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -15,18 +15,6 @@ static enum usb_dc_status_code usb_status; static struct device *hid_dev; -static K_SEM_DEFINE(hid_sem, 1, 1); - -static void in_ready_cb(void) -{ - k_sem_give(&hid_sem); -} - -static const struct hid_ops ops = -{ - .int_in_ready = in_ready_cb, -}; - int zmk_usb_hid_send_report(const u8_t *report, size_t len) { if (usb_status == USB_DC_SUSPEND) @@ -34,7 +22,6 @@ int zmk_usb_hid_send_report(const u8_t *report, size_t len) return usb_wakeup_request(); } - k_sem_take(&hid_sem, K_FOREVER); return hid_int_ep_write(hid_dev, report, len, NULL); } @@ -56,7 +43,7 @@ static int zmk_usb_hid_init(struct device *_arg) usb_hid_register_device(hid_dev, zmk_hid_report_desc, sizeof(zmk_hid_report_desc), - &ops); + NULL); usb_hid_init(hid_dev); -- cgit v1.2.3 From d7dee20e8d9b0b566859304063df2176aef8c057 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 18 Aug 2020 09:56:25 -0400 Subject: Add missing license header. --- app/src/ble.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'app/src') diff --git a/app/src/ble.c b/app/src/ble.c index 6d2903f..71bbccd 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -1,3 +1,8 @@ +/* + * Copyright (c) 2020 Peter Johanson + * + * SPDX-License-Identifier: MIT + */ #include #include -- cgit v1.2.3 From 4402e4fbc7bc79206589d3006fde802c4ba70ec7 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 18 Aug 2020 11:20:15 -0400 Subject: feeature(bt): Add "unpair combo" on startup. * Especially for splits, we need the ability to unpair all paired devices as sledgehammer if we need to "reset things", and doing so via keymaps isn't suitable. * Allows shields to define a collection of key positions that if all held 2 seconds after startup, will unpair all existing pairs for the device. --- app/src/ble.c | 6 ++++ app/src/ble_unpair_combo.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 app/src/ble_unpair_combo.c (limited to 'app/src') diff --git a/app/src/ble.c b/app/src/ble.c index 71bbccd..686a536 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -190,6 +190,12 @@ static int zmk_ble_init(struct device *_arg) return 0; } +int zmk_ble_unpair_all() +{ + LOG_DBG(""); + return bt_unpair(BT_ID_DEFAULT, NULL); +}; + bool zmk_ble_handle_key_user(struct zmk_key_event *key_event) { zmk_key key = key_event->key; diff --git a/app/src/ble_unpair_combo.c b/app/src/ble_unpair_combo.c new file mode 100644 index 0000000..a33a8e2 --- /dev/null +++ b/app/src/ble_unpair_combo.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2020 Peter Johanson + * + * SPDX-License-Identifier: MIT + */ + +#include +#include + +#include + +#define DT_DRV_COMPAT zmk_bt_unpair_combo + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include +#include +#include + + +static u8_t combo_state; + +const u32_t key_positions[] = DT_INST_PROP(0, key_positions); +#define KP_LEN DT_INST_PROP_LEN(0, key_positions) + +int index_for_key_position(u32_t kp) +{ + for (int i = 0; i < KP_LEN; i++) { + if (key_positions[i] == kp) { + return i; + } + } + + return -1; +} + +int unpair_combo_listener(const struct zmk_event_header *eh) +{ + if (is_position_state_changed(eh)) { + const struct position_state_changed *psc = cast_position_state_changed(eh); + + int kp_index = index_for_key_position(psc->position); + if (kp_index < 0) { + return 0; + } + + WRITE_BIT(combo_state, kp_index, psc->state); + } + + return 0; +}; + +void unpair_combo_work_handler(struct k_work *work) +{ + for (int i = 0; i < KP_LEN; i++) { + if (!(combo_state & BIT(i))) { + LOG_DBG("Key position %d not held, skipping unpair combo", key_positions[i]); + return; + } + } + + zmk_ble_unpair_all(); +}; + +struct k_delayed_work unpair_combo_work; + +int zmk_ble_unpair_combo_init(struct device *_unused) +{ + k_delayed_work_init(&unpair_combo_work, unpair_combo_work_handler); + k_delayed_work_submit(&unpair_combo_work, K_SECONDS(2)); + + return 0; +}; + +ZMK_LISTENER(zmk_ble_unpair_combo, unpair_combo_listener); +ZMK_SUBSCRIPTION(zmk_ble_unpair_combo, position_state_changed); + +SYS_INIT(zmk_ble_unpair_combo_init, + APPLICATION, + CONFIG_APPLICATION_INIT_PRIORITY); -- cgit v1.2.3 From a82f990d4c518165fc745ce2b5fb5cf2dd6b2727 Mon Sep 17 00:00:00 2001 From: Cody McGinnis Date: Tue, 18 Aug 2020 14:02:24 -0400 Subject: feat(keymap): allow users to toggle layers --- app/src/behaviors/behavior_toggle_layer.c | 54 +++++++++++++++++++++++++++++++ app/src/keymap.c | 5 +++ 2 files changed, 59 insertions(+) create mode 100644 app/src/behaviors/behavior_toggle_layer.c (limited to 'app/src') diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c new file mode 100644 index 0000000..ff0fe6a --- /dev/null +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Cody McGinnis + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_toggle_layer + +#include +#include +#include + +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +struct behavior_tog_config { }; +struct behavior_tog_data { }; + +static int behavior_tog_init(struct device *dev) +{ + return 0; +}; + + +static int tog_keymap_binding_pressed(struct device *dev, u32_t position, u32_t layer, u32_t _) +{ + LOG_DBG("position %d layer %d current %d", position, layer, zmk_keymap_layer_active(layer)); + + if (zmk_keymap_layer_active(layer)) + return zmk_keymap_layer_deactivate(layer); + + return zmk_keymap_layer_activate(layer); +} + +static int tog_keymap_binding_released(struct device *dev, u32_t position, u32_t layer, u32_t _) +{ + return 0; +} + +static const struct behavior_driver_api behavior_tog_driver_api = { + .binding_pressed = tog_keymap_binding_pressed, + .binding_released = tog_keymap_binding_released, +}; + +static const struct behavior_tog_config behavior_tog_config = {}; + +static struct behavior_tog_data behavior_tog_data; + +DEVICE_AND_API_INIT(behavior_tog, DT_INST_LABEL(0), behavior_tog_init, + &behavior_tog_data, + &behavior_tog_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, + &behavior_tog_driver_api); diff --git a/app/src/keymap.c b/app/src/keymap.c index ff494f7..ebb42ef 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -76,6 +76,11 @@ static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN][ZMK_ WRITE_BIT(zmk_keymap_layer_state, layer, state); \ return 0; +bool zmk_keymap_layer_active(u8_t layer) +{ + return (zmk_keymap_layer_state & (BIT(layer))) == (BIT(layer)); +}; + int zmk_keymap_layer_activate(u8_t layer) { SET_LAYER_STATE(layer, true); -- cgit v1.2.3 From 7facb6eee8c5864c86b0a69213db4aabf6f24585 Mon Sep 17 00:00:00 2001 From: Cody McGinnis Date: Tue, 18 Aug 2020 14:02:25 -0400 Subject: fix(keymap): move the toggle layer logic to keymap.c --- app/src/behaviors/behavior_toggle_layer.c | 7 +------ app/src/keymap.c | 8 ++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) (limited to 'app/src') diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c index ff0fe6a..13f4a29 100644 --- a/app/src/behaviors/behavior_toggle_layer.c +++ b/app/src/behaviors/behavior_toggle_layer.c @@ -25,12 +25,7 @@ static int behavior_tog_init(struct device *dev) static int tog_keymap_binding_pressed(struct device *dev, u32_t position, u32_t layer, u32_t _) { - LOG_DBG("position %d layer %d current %d", position, layer, zmk_keymap_layer_active(layer)); - - if (zmk_keymap_layer_active(layer)) - return zmk_keymap_layer_deactivate(layer); - - return zmk_keymap_layer_activate(layer); + return zmk_keymap_layer_toggle(layer); } static int tog_keymap_binding_released(struct device *dev, u32_t position, u32_t layer, u32_t _) diff --git a/app/src/keymap.c b/app/src/keymap.c index ebb42ef..754305d 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -91,6 +91,14 @@ int zmk_keymap_layer_deactivate(u8_t layer) SET_LAYER_STATE(layer, false); }; +int zmk_keymap_layer_toggle(u8_t layer) +{ + if (zmk_keymap_layer_active(layer)) + return zmk_keymap_layer_deactivate(layer); + + return zmk_keymap_layer_activate(layer); +}; + bool is_active_position(u32_t position, u8_t layer) { return (zmk_keymap_layer_state & BIT(layer)) == BIT(layer) -- cgit v1.2.3 From 50643b2c561ef58d4c96e7dba6c55c0ef291146a Mon Sep 17 00:00:00 2001 From: Cody McGinnis Date: Tue, 18 Aug 2020 14:21:39 -0400 Subject: fix(keymap): add brackets around if statement body --- app/src/keymap.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app/src') diff --git a/app/src/keymap.c b/app/src/keymap.c index 754305d..ee6e370 100644 --- a/app/src/keymap.c +++ b/app/src/keymap.c @@ -94,7 +94,9 @@ int zmk_keymap_layer_deactivate(u8_t layer) int zmk_keymap_layer_toggle(u8_t layer) { if (zmk_keymap_layer_active(layer)) - return zmk_keymap_layer_deactivate(layer); + { + return zmk_keymap_layer_deactivate(layer); + } return zmk_keymap_layer_activate(layer); }; -- cgit v1.2.3 From 63e02d60dcfbf4e4d7f9954075d1e087f816944b Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 18 Aug 2020 14:14:28 -0400 Subject: feat(behaviors): Add &none behavior --- app/src/behaviors/behavior_none.c | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/src/behaviors/behavior_none.c (limited to 'app/src') diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c new file mode 100644 index 0000000..7e77e54 --- /dev/null +++ b/app/src/behaviors/behavior_none.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020 Peter Johanson + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT zmk_behavior_none + +#include +#include +#include +#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +struct behavior_none_config { }; +struct behavior_none_data { }; + +static int behavior_none_init(struct device *dev) +{ + return 0; +}; + +static int on_keymap_binding_pressed(struct device *dev, u32_t position, u32_t _param1, u32_t _param2) +{ + return 1; +} + +static int on_keymap_binding_released(struct device *dev, u32_t position, u32_t _param1, u32_t _param2) +{ + return 1; +} + +static const struct behavior_driver_api behavior_none_driver_api = { + .binding_pressed = on_keymap_binding_pressed, + .binding_released = on_keymap_binding_released, +}; + + +static const struct behavior_none_config behavior_none_config = {}; + +static struct behavior_none_data behavior_none_data; + +DEVICE_AND_API_INIT(behavior_none, DT_INST_LABEL(0), behavior_none_init, + &behavior_none_data, + &behavior_none_config, + APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, + &behavior_none_driver_api); \ No newline at end of file -- cgit v1.2.3 From 05235ca96d021c1ec0fce60570d9786ee41aa437 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 18 Aug 2020 16:18:16 -0400 Subject: fix(bluetooth): Stop peripheral half advertising once connected. --- app/src/ble.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'app/src') diff --git a/app/src/ble.c b/app/src/ble.c index 71bbccd..bf1dee7 100644 --- a/app/src/ble.c +++ b/app/src/ble.c @@ -28,6 +28,16 @@ static struct bt_conn *auth_passkey_entry_conn; static u8_t passkey_entries[6] = {0, 0, 0, 0, 0, 0}; static u8_t passkey_digit = 0; +#if IS_ENABLED(CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL) +#define ZMK_ADV_PARAMS BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | \ + BT_LE_ADV_OPT_USE_NAME | \ + BT_LE_ADV_OPT_ONE_TIME, \ + BT_GAP_ADV_FAST_INT_MIN_2, \ + BT_GAP_ADV_FAST_INT_MAX_2, NULL) +#else +#define ZMK_ADV_PARAMS BT_LE_ADV_CONN_NAME +#endif + static void connected(struct bt_conn *conn, u8_t err) { char addr[BT_ADDR_LE_STR_LEN]; @@ -159,7 +169,7 @@ static void zmk_ble_ready(int err) return; } - err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); + err = bt_le_adv_start(ZMK_ADV_PARAMS, zmk_ble_ad, ARRAY_SIZE(zmk_ble_ad), NULL, 0); if (err) { LOG_ERR("Advertising failed to start (err %d)", err); -- cgit v1.2.3 From 66c4b7ebb0ec914089a8f08905d832b16493dd73 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Mon, 17 Aug 2020 22:17:59 -0400 Subject: fix(usb): Restore write semaphore, release it on write failures. --- app/src/usb_hid.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) (limited to 'app/src') diff --git a/app/src/usb_hid.c b/app/src/usb_hid.c index 4c6dd4b..784fc25 100644 --- a/app/src/usb_hid.c +++ b/app/src/usb_hid.c @@ -11,18 +11,42 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); -static enum usb_dc_status_code usb_status; +static enum usb_dc_status_code usb_status = USB_DC_UNKNOWN; static struct device *hid_dev; +static K_SEM_DEFINE(hid_sem, 1, 1); + +static void in_ready_cb(void) +{ + k_sem_give(&hid_sem); +} + +static const struct hid_ops ops = +{ + .int_in_ready = in_ready_cb, +}; + int zmk_usb_hid_send_report(const u8_t *report, size_t len) { - if (usb_status == USB_DC_SUSPEND) - { + switch(usb_status) { + case USB_DC_SUSPEND: return usb_wakeup_request(); + case USB_DC_ERROR: + case USB_DC_RESET: + case USB_DC_DISCONNECTED: + case USB_DC_UNKNOWN: + return -ENODEV; + default: + k_sem_take(&hid_sem, K_MSEC(30)); + int err = hid_int_ep_write(hid_dev, report, len, NULL); + + if (err) { + k_sem_give(&hid_sem); + } + + return err; } - - return hid_int_ep_write(hid_dev, report, len, NULL); } void usb_hid_status_cb(enum usb_dc_status_code status, const u8_t *params) @@ -43,7 +67,7 @@ static int zmk_usb_hid_init(struct device *_arg) usb_hid_register_device(hid_dev, zmk_hid_report_desc, sizeof(zmk_hid_report_desc), - NULL); + &ops); usb_hid_init(hid_dev); -- cgit v1.2.3