From 30581f720761852d2ad71d1d0f34a641f64184dc Mon Sep 17 00:00:00 2001 From: krikun98 Date: Fri, 27 Aug 2021 01:31:30 +0300 Subject: [PATCH] Added dedicated mouse work queue option --- app/CMakeLists.txt | 1 + app/Kconfig | 7 +++++++ app/include/zmk/mouse.h | 3 +++ app/src/main.c | 4 ++++ app/src/mouse/Kconfig | 34 +++++++++++++++++++++++++++++++++ app/src/mouse/key_listener.c | 6 ++++-- app/src/mouse/main.c | 37 ++++++++++++++++++++++++++++++++++++ 7 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 app/src/mouse/Kconfig create mode 100644 app/src/mouse/main.c diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b08fd637..b70ba2f0 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -28,6 +28,7 @@ target_sources(app PRIVATE src/kscan.c) target_sources(app PRIVATE src/matrix_transform.c) target_sources(app PRIVATE src/hid.c) target_sources(app PRIVATE src/mouse/key_listener.c) +target_sources(app PRIVATE src/mouse/main.c) target_sources(app PRIVATE src/mouse/tick_listener.c) target_sources(app PRIVATE src/sensors.c) target_sources_ifdef(CONFIG_ZMK_WPM app PRIVATE src/wpm.c) diff --git a/app/Kconfig b/app/Kconfig index 44259149..db3d8bfc 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -326,6 +326,13 @@ endif #Display/LED Options endmenu +menu "Mouse Options" + +rsource "src/mouse/Kconfig" + +#Mouse Options +endmenu + menu "Power Management" config ZMK_IDLE_TIMEOUT diff --git a/app/include/zmk/mouse.h b/app/include/zmk/mouse.h index 93d96df9..1e974f4b 100644 --- a/app/include/zmk/mouse.h +++ b/app/include/zmk/mouse.h @@ -25,3 +25,6 @@ struct vector2d { float x; float y; }; + +struct k_work_q *zmk_mouse_work_q(); +int zmk_mouse_init(); \ No newline at end of file diff --git a/app/src/main.c b/app/src/main.c index ae604a7b..62c71437 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -29,4 +29,8 @@ void main(void) { #ifdef CONFIG_ZMK_DISPLAY zmk_display_init(); #endif /* CONFIG_ZMK_DISPLAY */ + +#ifdef CONFIG_ZMK_MOUSE + zmk_mouse_init(); +#endif /* CONFIG_ZMK_MOUSE */ } diff --git a/app/src/mouse/Kconfig b/app/src/mouse/Kconfig new file mode 100644 index 00000000..c440de58 --- /dev/null +++ b/app/src/mouse/Kconfig @@ -0,0 +1,34 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +menuconfig ZMK_MOUSE + bool "Enable ZMK mouse emulation" + default n + +if ZMK_MOUSE + +choice ZMK_MOUSE_WORK_QUEUE + prompt "Work queue selection for mouse events" + default ZMK_MOUSE_WORK_QUEUE_DEDICATED + +config ZMK_MOUSE_WORK_QUEUE_SYSTEM + bool "Use default system work queue for mouse events" + +config ZMK_MOUSE_WORK_QUEUE_DEDICATED + bool "Use dedicated work queue for mouse events" + +endchoice + +if ZMK_MOUSE_WORK_QUEUE_DEDICATED + +config ZMK_MOUSE_DEDICATED_THREAD_STACK_SIZE + int "Stack size for dedicated mouse thread/queue" + default 2048 + +config ZMK_MOUSE_DEDICATED_THREAD_PRIORITY + int "Thread priority for dedicated mouse thread/queue" + default 5 + +endif # ZMK_MOUSE_WORK_QUEUE_DEDICATED + +endif diff --git a/app/src/mouse/key_listener.c b/app/src/mouse/key_listener.c index 6a96fbaa..d522ca9e 100644 --- a/app/src/mouse/key_listener.c +++ b/app/src/mouse/key_listener.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 The ZMK Contributors + * Copyright (c) 2021 The ZMK Contributors * * SPDX-License-Identifier: MIT */ @@ -37,7 +37,9 @@ static void mouse_tick_timer_handler(struct k_work *work) { K_WORK_DEFINE(mouse_tick, &mouse_tick_timer_handler); -void mouse_timer_cb(struct k_timer *dummy) { k_work_submit(&mouse_tick); } +void mouse_timer_cb(struct k_timer *dummy) { + k_work_submit_to_queue(zmk_mouse_work_q(), &mouse_tick); +} K_TIMER_DEFINE(mouse_timer, mouse_timer_cb, mouse_timer_cb); diff --git a/app/src/mouse/main.c b/app/src/mouse/main.c new file mode 100644 index 00000000..7ba27c39 --- /dev/null +++ b/app/src/mouse/main.c @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#if IS_ENABLED(CONFIG_ZMK_MOUSE_WORK_QUEUE_DEDICATED) + +K_THREAD_STACK_DEFINE(mouse_work_stack_area, CONFIG_ZMK_MOUSE_DEDICATED_THREAD_STACK_SIZE); + +static struct k_work_q mouse_work_q; + +struct k_work_q *zmk_mouse_work_q() { + return &mouse_work_q; +} + +#else + +struct k_work_q *zmk_mouse_work_q() { + return &k_sys_work_q; +} + +#endif + +int zmk_mouse_init() { +#if IS_ENABLED(CONFIG_ZMK_MOUSE_WORK_QUEUE_DEDICATED) + k_work_q_start(&mouse_work_q, mouse_work_stack_area, + K_THREAD_STACK_SIZEOF(mouse_work_stack_area), + CONFIG_ZMK_MOUSE_DEDICATED_THREAD_PRIORITY); +#endif + return 0; +} \ No newline at end of file