summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml1
-rw-r--r--app/boards/arm/nrfmicro/Kconfig5
-rw-r--r--app/boards/arm/nrfmicro/Kconfig.defconfig9
-rw-r--r--app/boards/arm/nrfmicro/pinmux.c6
-rw-r--r--app/boards/native_posix.conf3
-rw-r--r--app/boards/native_posix.overlay73
-rw-r--r--app/boards/shields/lily58/lily58.dtsi2
-rw-r--r--app/boards/shields/qaz/Kconfig.defconfig9
-rw-r--r--app/boards/shields/qaz/Kconfig.shield5
-rw-r--r--app/boards/shields/qaz/qaz.keymap44
-rw-r--r--app/boards/shields/qaz/qaz.overlay53
-rw-r--r--app/boards/shields/romac/Kconfig.defconfig10
-rw-r--r--app/boards/shields/romac/Kconfig.shield5
-rw-r--r--app/boards/shields/romac/romac.conf0
-rw-r--r--app/boards/shields/romac/romac.keymap46
-rw-r--r--app/boards/shields/romac/romac.overlay40
-rw-r--r--app/boards/shields/splitreus62/Kconfig.defconfig22
-rw-r--r--app/boards/shields/splitreus62/Kconfig.shield8
-rw-r--r--app/boards/shields/splitreus62/splitreus62.conf0
-rw-r--r--app/boards/shields/splitreus62/splitreus62.dtsi50
-rw-r--r--app/boards/shields/splitreus62/splitreus62.keymap31
-rw-r--r--app/boards/shields/splitreus62/splitreus62_left.conf2
-rw-r--r--app/boards/shields/splitreus62/splitreus62_left.overlay18
-rw-r--r--app/boards/shields/splitreus62/splitreus62_right.conf2
-rw-r--r--app/boards/shields/splitreus62/splitreus62_right.overlay22
-rw-r--r--app/dts/bindings/zmk,kscan-mock.yaml2
-rw-r--r--app/include/dt-bindings/zmk/kscan-mock.h (renamed from app/include/zmk/kscan-mock.h)0
-rw-r--r--app/prj.conf0
-rwxr-xr-xapp/run-test.sh40
-rw-r--r--app/src/behaviors/behavior_mod_tap.c4
-rw-r--r--app/src/behaviors/behavior_none.c4
-rw-r--r--app/src/behaviors/behavior_toggle_layer.c19
-rw-r--r--app/src/kscan_mock.c15
-rw-r--r--app/tests/keypress/behavior_keymap.dtsi28
-rw-r--r--app/tests/keypress/cp-press-release/events.patterns1
-rw-r--r--app/tests/keypress/cp-press-release/keycode_events.snapshot2
-rw-r--r--app/tests/keypress/cp-press-release/native_posix.keymap5
-rw-r--r--app/tests/keypress/kp-press-release/events.patterns1
-rw-r--r--app/tests/keypress/kp-press-release/keycode_events.snapshot2
-rw-r--r--app/tests/keypress/kp-press-release/native_posix.keymap8
-rw-r--r--app/tests/momentary-layer/behavior_keymap.dtsi28
-rw-r--r--app/tests/momentary-layer/early-key-release/events.patterns2
-rw-r--r--app/tests/momentary-layer/early-key-release/keycode_events.snapshot4
-rw-r--r--app/tests/momentary-layer/early-key-release/native_posix.keymap8
-rw-r--r--app/tests/momentary-layer/early-key-release/pending0
-rw-r--r--app/tests/momentary-layer/normal/events.patterns2
-rw-r--r--app/tests/momentary-layer/normal/keycode_events.snapshot4
-rw-r--r--app/tests/momentary-layer/normal/native_posix.keymap8
-rw-r--r--app/tests/none/behavior_keymap.dtsi22
-rw-r--r--app/tests/none/layered/events.patterns1
-rw-r--r--app/tests/none/layered/keycode_events.snapshot0
-rw-r--r--app/tests/none/layered/native_posix.keymap8
-rw-r--r--app/tests/none/normal/events.patterns1
-rw-r--r--app/tests/none/normal/keycode_events.snapshot0
-rw-r--r--app/tests/none/normal/native_posix.keymap8
-rw-r--r--app/tests/toggle-layer/behavior_keymap.dtsi28
-rw-r--r--app/tests/toggle-layer/early-key-release/events.patterns2
-rw-r--r--app/tests/toggle-layer/early-key-release/keycode_events.snapshot6
-rw-r--r--app/tests/toggle-layer/early-key-release/native_posix.keymap9
-rw-r--r--app/tests/toggle-layer/early-key-release/pending0
-rw-r--r--app/tests/toggle-layer/normal/events.patterns2
-rw-r--r--app/tests/toggle-layer/normal/keycode_events.snapshot4
-rw-r--r--app/tests/toggle-layer/normal/native_posix.keymap8
-rw-r--r--app/tests/transparent/behavior_keymap.dtsi22
-rw-r--r--app/tests/transparent/layered/events.patterns1
-rw-r--r--app/tests/transparent/layered/keycode_events.snapshot2
-rw-r--r--app/tests/transparent/layered/native_posix.keymap8
-rw-r--r--app/tests/transparent/normal/events.patterns1
-rw-r--r--app/tests/transparent/normal/keycode_events.snapshot0
-rw-r--r--app/tests/transparent/normal/native_posix.keymap8
-rw-r--r--docs/docs/dev-setup.md3
-rw-r--r--docs/docs/dev-tests.md20
-rw-r--r--docs/sidebars.js1
-rw-r--r--docs/static/setup.sh3
74 files changed, 734 insertions, 87 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5086bf8..c8a711c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -16,6 +16,7 @@ jobs:
- kyria_right
- lily58_left
- lily58_right
+ - romac
include:
- board: proton_c
shield: clueboard_california
diff --git a/app/boards/arm/nrfmicro/Kconfig b/app/boards/arm/nrfmicro/Kconfig
index 17a3347..3501972 100644
--- a/app/boards/arm/nrfmicro/Kconfig
+++ b/app/boards/arm/nrfmicro/Kconfig
@@ -3,3 +3,8 @@ config BOARD_ENABLE_DCDC
select SOC_DCDC_NRF52X
default y
depends on (BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13)
+
+config BOARD_NRFMICRO_CHARGER
+ bool "Enable battery charger"
+ default y
+ depends on (BOARD_NRFMICRO_13)
diff --git a/app/boards/arm/nrfmicro/Kconfig.defconfig b/app/boards/arm/nrfmicro/Kconfig.defconfig
index 2212277..9cce5a9 100644
--- a/app/boards/arm/nrfmicro/Kconfig.defconfig
+++ b/app/boards/arm/nrfmicro/Kconfig.defconfig
@@ -29,5 +29,12 @@ config ZMK_USB
config PINMUX
default y
-
+
+if BOARD_NRFMICRO_13
+
+config BOARD_NRFMICRO_CHARGER
+ default y
+
+endif # BOARD_NRFMICRO_13
+
endif # BOARD_NRFMICRO_11 || BOARD_NRFMICRO_11_FLIPPED || BOARD_NRFMICRO_13
diff --git a/app/boards/arm/nrfmicro/pinmux.c b/app/boards/arm/nrfmicro/pinmux.c
index c02ca92..3792b59 100644
--- a/app/boards/arm/nrfmicro/pinmux.c
+++ b/app/boards/arm/nrfmicro/pinmux.c
@@ -23,10 +23,14 @@ static int pinmux_nrfmicro_init(struct device *port)
gpio_pin_configure(p1, 9, GPIO_OUTPUT);
gpio_pin_set(p1, 9, 0);
- // enable charger (nRFMicro 1.3 only)
+#if CONFIG_BOARD_NRFMICRO_CHARGER
gpio_pin_configure(p0, 5, GPIO_OUTPUT);
gpio_pin_set(p0, 5, 0);
#else
+ gpio_pin_configure(p0, 5, GPIO_INPUT);
+#endif
+
+#else
// enable EXT_VCC (use 0 for nRFMicro 1.3, use 1 for nRFMicro 1.1)
gpio_pin_configure(p1, 9, GPIO_OUTPUT);
gpio_pin_set(p1, 9, 1);
diff --git a/app/boards/native_posix.conf b/app/boards/native_posix.conf
index 5bfb366..357b1b8 100644
--- a/app/boards/native_posix.conf
+++ b/app/boards/native_posix.conf
@@ -1,9 +1,8 @@
CONFIG_KSCAN=n
CONFIG_ZMK_KSCAN_MOCK_DRIVER=y
-CONFIG_ZMK_KSCAN_COMPOSITE_DRIVER=y
CONFIG_ZMK_KSCAN_GPIO_DRIVER=n
CONFIG_GPIO=n
CONFIG_ZMK_BLE=n
CONFIG_LOG=y
-CONFIG_KSCAN_LOG_LEVEL_DBG=y
+CONFIG_LOG_BACKEND_SHOW_COLOR=n
CONFIG_ZMK_LOG_LEVEL_DBG=y
diff --git a/app/boards/native_posix.overlay b/app/boards/native_posix.overlay
index e9c4c95..bbb23b6 100644
--- a/app/boards/native_posix.overlay
+++ b/app/boards/native_posix.overlay
@@ -1,79 +1,18 @@
-#include <dt-bindings/zmk/keys.h>
#include <behaviors.dtsi>
-#include <zmk/kscan-mock.h>
+#include <dt-bindings/zmk/keys.h>
+#include <dt-bindings/zmk/kscan-mock.h>
/ {
chosen {
- zmk,kscan = &kscan0;
- zmk,keymap = &keymap0;
- };
-
- kscan0: kscan_0 {
- compatible = "zmk,kscan-composite";
- label = "KSCAN_COMP";
- rows = <2>;
- columns = <4>;
-
- left: left {
- kscan = <&left_hand>;
- };
-
- right: right {
- kscan = <&right_hand>;
- column-offset = <2>;
- };
+ zmk,kscan = &kscan;
};
- left_hand: kscan_1 {
+ kscan: kscan {
compatible = "zmk,kscan-mock";
- label = "KSCAN_LEFT";
+ label = "KSCAN_MOCK";
rows = <2>;
columns = <2>;
- events = <ZMK_MOCK_PRESS(0,1,300) ZMK_MOCK_PRESS(0,0,300) ZMK_MOCK_RELEASE(0,0,300) ZMK_MOCK_RELEASE(0,1,300)>;
- // events = <ZMK_MOCK_PRESS(0,0,800) ZMK_MOCK_RELEASE(0,0,800) ZMK_MOCK_PRESS(0,1,800) ZMK_MOCK_RELEASE(0,1,800)>;
- };
-
- right_hand: kscan_2 {
- compatible = "zmk,kscan-mock";
- label = "KSCAN_RIGHT";
-
- rows = <2>;
- columns = <2>;
- events = <ZMK_MOCK_PRESS(1,1,800) ZMK_MOCK_RELEASE(1,1,100) ZMK_MOCK_PRESS(0,1,800) ZMK_MOCK_RELEASE(0,1,100)>;
- };
-
- keymap0: keymap {
- compatible = "zmk,keymap";
- label ="Default keymap";
- layers = <&default &lower &raise>;
- };
-
- layers {
- compatible = "zmk,layers";
-
- default: layer_0 {
- label = "DEFAULT";
-
- bindings = <
- &kp B &mo 1 &kp C &kp E
- &kp D &kp G &kp F &kp Q>;
- };
-
- lower: layer_1 {
- label = "LOWER";
-
- bindings = <
- &cp M_NEXT &trans &kp O &kp Q
- &kp L &kp J &kp P &kp K>;
- };
-
- raise: layer_2 {
- label = "RAISE";
-
- bindings = <
- &kp W &kp U &kp I &kp N
- &kp X &kp M &kp C &kp B>;
- };
+ exit-after;
};
};
diff --git a/app/boards/shields/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi
index 24f6805..23f5644 100644
--- a/app/boards/shields/lily58/lily58.dtsi
+++ b/app/boards/shields/lily58/lily58.dtsi
@@ -15,7 +15,7 @@
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <16>;
- rows = <4>;
+ rows = <5>;
// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 |
// | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 |
// | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 | | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 |
diff --git a/app/boards/shields/qaz/Kconfig.defconfig b/app/boards/shields/qaz/Kconfig.defconfig
new file mode 100644
index 0000000..f82f458
--- /dev/null
+++ b/app/boards/shields/qaz/Kconfig.defconfig
@@ -0,0 +1,9 @@
+ # Copyright (c) 2020 TJ Campie
+ # SPDX-License-Identifier: MIT
+
+if SHIELD_QAZ
+
+config ZMK_KEYBOARD_NAME
+ default "QAZ"
+
+endif \ No newline at end of file
diff --git a/app/boards/shields/qaz/Kconfig.shield b/app/boards/shields/qaz/Kconfig.shield
new file mode 100644
index 0000000..9da6077
--- /dev/null
+++ b/app/boards/shields/qaz/Kconfig.shield
@@ -0,0 +1,5 @@
+# Copyright (c) 2020 TJ Campie
+# SPDX-License-Identifier: MIT
+
+ config SHIELD_MY_BOARD
+ def_bool $(shields_list_contains,qaz)
diff --git a/app/boards/shields/qaz/qaz.keymap b/app/boards/shields/qaz/qaz.keymap
new file mode 100644
index 0000000..ffa2f6c
--- /dev/null
+++ b/app/boards/shields/qaz/qaz.keymap
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2020 TJ Campie
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/keys.h>
+
+#define DEFAULT 0
+#define NUM_SYM 1
+#define NAV 2
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+
+ default_layer {
+ bindings = <
+ &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
+ &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp RET
+ &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT
+ &kp LSFT &kp LGUI &kp LALT &mo NAV &kp SPC &mo NUM_SYM &kp QUOT &kp FSLH
+ >;
+ };
+ num_sym {
+ bindings = <
+ &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0
+ &trans &trans &trans &trans &trans &trans &trans &trans &kp EQL &kp MINUS
+ &kp DEL &none &none &none &none &none &none &none &kp DOT
+ &bootloader &reset &none &trans &trans &kp RET &trans &kp FSLH
+ >;
+ };
+
+ nav {
+ bindings = <
+ &none &none &none &none &none &none &none &kp UARW &none &kp BKSP
+ &trans &trans &trans &trans &none &none &kp LARW &kp DARW &kp RARW &none
+ &none &none &none &none &none &none &none &none &none
+ &none &none &none &none &none &trans &trans &kp RET &trans &kp FSLH
+ >;
+ };
+ };
+}; \ No newline at end of file
diff --git a/app/boards/shields/qaz/qaz.overlay b/app/boards/shields/qaz/qaz.overlay
new file mode 100644
index 0000000..472005b
--- /dev/null
+++ b/app/boards/shields/qaz/qaz.overlay
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2020 TJ Campie
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <dt-bindings/zmk/matrix-transform.h>
+
+/ {
+ chosen {
+ zmk,kscan = &kscan0;
+ zmk,matrix_transform = &default_transform;
+ };
+
+ default_transform: keymap_transform_0 {
+ compatible = "zmk,matrix-transform";
+ columns = <7>;
+ rows = <6>;
+ map = <
+ RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(4,0) RC(4,1) RC(4,2)
+ RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(5,0) RC(5,1) RC(5,2)
+ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(4,3) RC(5,3)
+ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(4,4)
+ >;
+ };
+
+
+ kscan0: kscan_0 {
+ compatible = "zmk,kscan-gpio-matrix";
+ label = "KSCAN";
+ diode-direction = "col2row";
+
+ col-gpios
+ = <&pro_micro_d 8 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 1 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 0 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_a 2 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 9 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_a 1 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 6 GPIO_ACTIVE_HIGH>
+ ;
+
+ row-gpios
+ = <&pro_micro_a 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ ;
+ };
+
+}; \ No newline at end of file
diff --git a/app/boards/shields/romac/Kconfig.defconfig b/app/boards/shields/romac/Kconfig.defconfig
new file mode 100644
index 0000000..5352797
--- /dev/null
+++ b/app/boards/shields/romac/Kconfig.defconfig
@@ -0,0 +1,10 @@
+# Copyright (c) 2020 Pete Johanson, Richard Jones
+# SPDX-License-Identifier: MIT
+
+if SHIELD_ROMAC
+
+config ZMK_KEYBOARD_NAME
+ default "RoMac"
+
+endif
+
diff --git a/app/boards/shields/romac/Kconfig.shield b/app/boards/shields/romac/Kconfig.shield
new file mode 100644
index 0000000..59669d3
--- /dev/null
+++ b/app/boards/shields/romac/Kconfig.shield
@@ -0,0 +1,5 @@
+# Copyright (c) 2020 Pete Johanson, Richard Jones
+# SPDX-License-Identifier: MIT
+
+config SHIELD_ROMAC
+ def_bool $(shields_list_contains,romac)
diff --git a/app/boards/shields/romac/romac.conf b/app/boards/shields/romac/romac.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/boards/shields/romac/romac.conf
diff --git a/app/boards/shields/romac/romac.keymap b/app/boards/shields/romac/romac.keymap
new file mode 100644
index 0000000..f94a829
--- /dev/null
+++ b/app/boards/shields/romac/romac.keymap
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2020 Pete Johanson, Richard Jones
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/keys.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+
+ default_layer {
+// -------------------
+// | 7 | 8 | 9 |
+// | 4 | 5 | 6 |
+// | 1 | 2 | 3 |
+// | MO(1) | 0 | . |
+// ----------------------
+ bindings = <
+ &kp NUM_7 &kp NUM_8 &kp NUM_9
+ &kp NUM_4 &kp NUM_5 &kp NUM_6
+ &kp NUM_1 &kp NUM_2 &kp NUM_3
+ &mo 1 &kp NUM_0 &kp DOT
+ >;
+ };
+
+ nav_layer {
+// -----------------------
+// | _ | HOME | PGUP |
+// | _ | END | PGDN |
+// | _ | _ | _ |
+// | _ | _ | RET |
+// -----------------------
+ bindings = <
+ &trans &kp HOME &kp PGUP
+ &trans &kp END &kp PGDN
+ &trans &trans &trans
+ &trans &trans &kp RET
+ >;
+ };
+ };
+};
+
+
diff --git a/app/boards/shields/romac/romac.overlay b/app/boards/shields/romac/romac.overlay
new file mode 100644
index 0000000..67d5868
--- /dev/null
+++ b/app/boards/shields/romac/romac.overlay
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2020 Pete Johanson, Richard Jones
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <dt-bindings/zmk/matrix-transform.h>
+
+/ {
+ chosen {
+ zmk,kscan = &kscan0;
+ };
+
+ kscan0: kscan {
+ compatible = "zmk,kscan-gpio-matrix";
+ label = "KSCAN";
+
+ diode-direction = "col2row";
+ row-gpios
+ = <&pro_micro_d 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ ;
+
+ col-gpios
+ = <&pro_micro_a 0 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 15 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 14 GPIO_ACTIVE_HIGH>
+ ;
+
+ };
+
+ bt_unpair_combo: bt_unpair_combo {
+ compatible = "zmk,bt-unpair-combo";
+ key-positions = <0 11>;
+ };
+
+};
+
diff --git a/app/boards/shields/splitreus62/Kconfig.defconfig b/app/boards/shields/splitreus62/Kconfig.defconfig
new file mode 100644
index 0000000..a2464a7
--- /dev/null
+++ b/app/boards/shields/splitreus62/Kconfig.defconfig
@@ -0,0 +1,22 @@
+
+#Copyright (c) 2020 Derek Schmell
+#SPDX-License-Identifier: MIT
+
+
+if SHIELD_SPLITREUS62_LEFT
+
+config ZMK_KEYBOARD_NAME
+ default "Splitreus62 Left"
+
+endif
+
+if SHIELD_SPLITREUS62_RIGHT
+
+config ZMK_KEYBOARD_NAME
+ default "Splitreus62 Right"
+
+endif
+
+if SHIELD_SPLITREUS62_LEFT || SHIELD_SPLITREUS62_RIGHT
+
+endif
diff --git a/app/boards/shields/splitreus62/Kconfig.shield b/app/boards/shields/splitreus62/Kconfig.shield
new file mode 100644
index 0000000..762d991
--- /dev/null
+++ b/app/boards/shields/splitreus62/Kconfig.shield
@@ -0,0 +1,8 @@
+# Copyright (c) 2020 Derek Schmell
+# SPDX-License-Identifier: MIT
+
+config SHIELD_SPLITREUS62_LEFT
+ def_bool $(shields_list_contains,splitreus62_left)
+
+config SHIELD_SPLITREUS62_RIGHT
+ def_bool $(shields_list_contains,splitreus62_right)
diff --git a/app/boards/shields/splitreus62/splitreus62.conf b/app/boards/shields/splitreus62/splitreus62.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62.conf
diff --git a/app/boards/shields/splitreus62/splitreus62.dtsi b/app/boards/shields/splitreus62/splitreus62.dtsi
new file mode 100644
index 0000000..c2bfbc4
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62.dtsi
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020 Derek Schmell
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <dt-bindings/zmk/matrix-transform.h>
+
+/ {
+ chosen {
+ zmk,kscan = &kscan0;
+ zmk,matrix_transform = &default_transform;
+ };
+
+ default_transform: keymap_transform_0 {
+ compatible = "zmk,matrix-transform";
+ columns = <12>;
+ rows = <6>;
+// | SW0 | SW5 | SW10 | SW15 | SW20 | SW25 | SW25 | SW20 | SW15 | SW10 | SW5 | SW1 |
+// | SW1 | SW6 | SW11 | SW16 | SW21 | SW26 | SW26 | SW21 | SW16 | SW11 | SW6 | SW2 |
+// | SW2 | SW7 | SW12 | SW17 | SW22 | SW27 | SW27 | SW22 | SW17 | SW12 | SW7 | SW3 |
+// | SW3 | SW8 | SW13 | SW18 | SW23 | SW28 | SW28 | SW23 | SW18 | SW13 | SW8 | SW4 |
+// | SW4 | SW9 | SW14 | SW19 | SW24 | SW29 | SW29 | SW24 | SW19 | SW14 | SW9 | SW5 |
+// SW30 | SW30
+ map = <
+RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11)
+RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11)
+RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11)
+RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11)
+RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11)
+ RC(5,5) RC(5,6)
+ >;
+ };
+
+ kscan0: kscan {
+ compatible = "zmk,kscan-gpio-matrix";
+ label = "KSCAN";
+
+ diode-direction = "row2col";
+ row-gpios
+ = <&pro_micro_d 1 GPIO_ACTIVE_HIGH >
+ , <&pro_micro_d 0 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 2 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 4 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 5 GPIO_ACTIVE_HIGH>
+ , <&pro_micro_d 6 GPIO_ACTIVE_HIGH>
+ ;
+
+ };
+};
diff --git a/app/boards/shields/splitreus62/splitreus62.keymap b/app/boards/shields/splitreus62/splitreus62.keymap
new file mode 100644
index 0000000..920e61a
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62.keymap
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2020 Derek Schmell
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/keys.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+
+ default_layer {
+// ------------------------------------------------------------------------------------------------------------
+// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
+// | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ |
+// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
+// | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT |
+// | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BKSP| | RET | SPC | LBKT | RBKT | LBKT | HOME | END |
+ bindings = <
+&kp ESC &kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 &kp MINUS
+&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH
+&kp LCTL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SCLN &kp QUOT
+&kp LSFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &kp FSLH &kp RSFT
+&kp LCTL &kp LGUI &kp LALT &kp GRAV &kp EQL &kp DEL &kp SPC &kp LBKT &kp RBKT &kp MINUS &kp HOME &kp END
+ &kp BKSP &kp RET
+ >;
+ };
+ };
+};
diff --git a/app/boards/shields/splitreus62/splitreus62_left.conf b/app/boards/shields/splitreus62/splitreus62_left.conf
new file mode 100644
index 0000000..e51dee4
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62_left.conf
@@ -0,0 +1,2 @@
+CONFIG_ZMK_SPLIT=y
+CONFIG_ZMK_SPLIT_BLE_ROLE_CENTRAL=y \ No newline at end of file
diff --git a/app/boards/shields/splitreus62/splitreus62_left.overlay b/app/boards/shields/splitreus62/splitreus62_left.overlay
new file mode 100644
index 0000000..b156d60
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62_left.overlay
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2020 Derek Schmell
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "splitreus62.dtsi"
+
+&kscan0 {
+ col-gpios
+ = <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ ;
+};
diff --git a/app/boards/shields/splitreus62/splitreus62_right.conf b/app/boards/shields/splitreus62/splitreus62_right.conf
new file mode 100644
index 0000000..a835adc
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62_right.conf
@@ -0,0 +1,2 @@
+CONFIG_ZMK_SPLIT=y
+CONFIG_ZMK_SPLIT_BLE_ROLE_PERIPHERAL=y \ No newline at end of file
diff --git a/app/boards/shields/splitreus62/splitreus62_right.overlay b/app/boards/shields/splitreus62/splitreus62_right.overlay
new file mode 100644
index 0000000..5db87cc
--- /dev/null
+++ b/app/boards/shields/splitreus62/splitreus62_right.overlay
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2020 Derek Schmell
+ *
+ * SPDX-License-Identifier: MIT
+ */
+
+#include "splitreus62.dtsi"
+
+&default_transform {
+ col-offset = <6>;
+};
+
+&kscan0 {
+ col-gpios
+ = <&pro_micro_d 14 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 16 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ , <&pro_micro_d 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+ ;
+};
diff --git a/app/dts/bindings/zmk,kscan-mock.yaml b/app/dts/bindings/zmk,kscan-mock.yaml
index 41dd5b8..f9d83fa 100644
--- a/app/dts/bindings/zmk,kscan-mock.yaml
+++ b/app/dts/bindings/zmk,kscan-mock.yaml
@@ -15,3 +15,5 @@ properties:
type: int
columns:
type: int
+ exit-after:
+ type: boolean
diff --git a/app/include/zmk/kscan-mock.h b/app/include/dt-bindings/zmk/kscan-mock.h
index d481899..d481899 100644
--- a/app/include/zmk/kscan-mock.h
+++ b/app/include/dt-bindings/zmk/kscan-mock.h
diff --git a/app/prj.conf b/app/prj.conf
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/prj.conf
diff --git a/app/run-test.sh b/app/run-test.sh
new file mode 100755
index 0000000..be335c6
--- /dev/null
+++ b/app/run-test.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# Copyright (c) 2020 Peter Johanson; Cody McGinnis
+#
+# SPDX-License-Identifier: MIT
+#
+
+if [ -z "$1" ]; then
+ echo "Usage: ./run-test.sh <path to testcase>"
+ exit 1
+elif [ "$1" = "all" ]; then
+ echo "" > ./build/tests/pass-fail.log
+ find tests -name native_posix.keymap -exec dirname \{\} \; | xargs -l -P 4 ./run-test.sh
+ err=$?
+ sort -k2 ./build/tests/pass-fail.log
+ exit $err
+fi
+
+testcase="$1"
+echo "Running $testcase:"
+
+west build -d build/$testcase -b native_posix -- -DZMK_CONFIG=$testcase > /dev/null 2>&1
+if [ $? -gt 0 ]; then
+ echo "FAIL: $testcase did not build" >> ./build/tests/pass-fail.log
+else
+ ./build/$testcase/zephyr/zmk.exe | sed -e "s/.*> //" | tee build/$testcase/keycode_events_full.log | sed -n -f $testcase/events.patterns > build/$testcase/keycode_events.log
+ diff -au $testcase/keycode_events.snapshot build/$testcase/keycode_events.log
+ if [ $? -gt 0 ]; then
+ if [ -f $testcase/pending ]; then
+ echo "PEND: $testcase" >> ./build/tests/pass-fail.log
+ exit 0
+ else
+ echo "FAIL: $testcase" >> ./build/tests/pass-fail.log
+ exit 1
+ fi
+ else
+ echo "PASS: $testcase" >> ./build/tests/pass-fail.log
+ exit 0
+ fi
+fi \ No newline at end of file
diff --git a/app/src/behaviors/behavior_mod_tap.c b/app/src/behaviors/behavior_mod_tap.c
index 6151f7e..5a2f60e 100644
--- a/app/src/behaviors/behavior_mod_tap.c
+++ b/app/src/behaviors/behavior_mod_tap.c
@@ -193,8 +193,8 @@ static int on_keymap_binding_released(struct device *dev, u32_t position, u32_t
}
struct keycode_state_changed *ev = data->captured_keycode_events[j].event;
- data->captured_keycode_events[i].event = NULL;
- data->captured_keycode_events[i].active_mods = 0;
+ data->captured_keycode_events[j].event = NULL;
+ data->captured_keycode_events[j].active_mods = 0;
LOG_DBG("Re-sending latched key press for usage page 0x%02X keycode 0x%02X state %s", ev->usage_page, ev->keycode, (ev->state ? "pressed" : "released"));
ZMK_EVENT_RELEASE(ev);
k_msleep(10);
diff --git a/app/src/behaviors/behavior_none.c b/app/src/behaviors/behavior_none.c
index 7e77e54..e822d5e 100644
--- a/app/src/behaviors/behavior_none.c
+++ b/app/src/behaviors/behavior_none.c
@@ -23,12 +23,12 @@ static int behavior_none_init(struct device *dev)
static int on_keymap_binding_pressed(struct device *dev, u32_t position, u32_t _param1, u32_t _param2)
{
- return 1;
+ return 0;
}
static int on_keymap_binding_released(struct device *dev, u32_t position, u32_t _param1, u32_t _param2)
{
- return 1;
+ return 0;
}
static const struct behavior_driver_api behavior_none_driver_api = {
diff --git a/app/src/behaviors/behavior_toggle_layer.c b/app/src/behaviors/behavior_toggle_layer.c
index 13f4a29..02a76d2 100644
--- a/app/src/behaviors/behavior_toggle_layer.c
+++ b/app/src/behaviors/behavior_toggle_layer.c
@@ -14,28 +14,35 @@
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
-struct behavior_tog_config { };
-struct behavior_tog_data { };
+struct behavior_tog_config
+{
+};
+struct behavior_tog_data
+{
+};
static int behavior_tog_init(struct device *dev)
{
- return 0;
+ 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", position, layer);
+
return zmk_keymap_layer_toggle(layer);
}
static int tog_keymap_binding_released(struct device *dev, u32_t position, u32_t layer, u32_t _)
{
+ LOG_DBG("position %d layer %d", position, layer);
+
return 0;
}
static const struct behavior_driver_api behavior_tog_driver_api = {
- .binding_pressed = tog_keymap_binding_pressed,
- .binding_released = tog_keymap_binding_released,
+ .binding_pressed = tog_keymap_binding_pressed,
+ .binding_released = tog_keymap_binding_released,
};
static const struct behavior_tog_config behavior_tog_config = {};
diff --git a/app/src/kscan_mock.c b/app/src/kscan_mock.c
index b0ba90b..d626c71 100644
--- a/app/src/kscan_mock.c
+++ b/app/src/kscan_mock.c
@@ -6,13 +6,14 @@
#define DT_DRV_COMPAT zmk_kscan_mock
+#include <stdlib.h>
#include <device.h>
#include <drivers/kscan.h>
#include <logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
-#include <zmk/kscan-mock.h>
+#include <dt-bindings/zmk/kscan-mock.h>
struct kscan_mock_data
{
@@ -50,6 +51,7 @@ static int kscan_mock_configure(struct device *dev, kscan_callback_t callback)
struct kscan_mock_config_##n \
{ \
u32_t events[DT_INST_PROP_LEN(n, events)]; \
+ bool exit_after; \
}; \
static void kscan_mock_schedule_next_event_##n(struct device *dev) \
{ \
@@ -60,6 +62,9 @@ static int kscan_mock_configure(struct device *dev, kscan_callback_t callback)
u32_t ev = cfg->events[data->event_index]; \
LOG_DBG("delaying next keypress: %d", ZMK_MOCK_MSEC(ev)); \
k_delayed_work_submit(&data->work, K_MSEC(ZMK_MOCK_MSEC(ev))); \
+ } else if (cfg->exit_after) { \
+ LOG_DBG("Exiting"); \
+ exit(0); \
} \
} \
static void kscan_mock_work_handler_##n(struct k_work *work) \
@@ -67,12 +72,13 @@ static int kscan_mock_configure(struct device *dev, kscan_callback_t callback)
struct kscan_mock_data *data = \
CONTAINER_OF(work, struct kscan_mock_data, work); \
const struct kscan_mock_config_##n *cfg = data->dev->config_info; \
- u32_t ev = cfg->events[data->event_index++]; \
+ u32_t ev = cfg->events[data->event_index]; \
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_##n(data->dev); \
+ data->event_index++; \
} \
static int kscan_mock_init_##n(struct device *dev) \
{ \
@@ -93,11 +99,12 @@ static int kscan_mock_configure(struct device *dev, kscan_callback_t callback)
}; \
static struct kscan_mock_data kscan_mock_data_##n; \
static const struct kscan_mock_config_##n kscan_mock_config_##n = { \
- .events = DT_INST_PROP(n, events)}; \
+ .events = DT_INST_PROP(n, events), \
+ .exit_after = DT_INST_PROP(n, exit_after) }; \
DEVICE_AND_API_INIT(kscan_mock_##n, DT_INST_LABEL(n), kscan_mock_init_##n, \
&kscan_mock_data_##n, \
&kscan_mock_config_##n, \
APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \
&mock_driver_api_##n);
-DT_INST_FOREACH_STATUS_OKAY(MOCK_INST_INIT) \ No newline at end of file
+DT_INST_FOREACH_STATUS_OKAY(MOCK_INST_INIT)
diff --git a/app/tests/keypress/behavior_keymap.dtsi b/app/tests/keypress/behavior_keymap.dtsi
new file mode 100644
index 0000000..34c445c
--- /dev/null
+++ b/app/tests/keypress/behavior_keymap.dtsi
@@ -0,0 +1,28 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp B &mo 1
+ &kp D &kp G>;
+ };
+
+ lower_layer {
+ bindings = <
+ &cp M_NEXT &trans
+ &kp L &kp J>;
+ };
+
+ raise_layer {
+ bindings = <
+ &kp W &kp U
+ &kp X &kp M>;
+ };
+ };
+};
diff --git a/app/tests/keypress/cp-press-release/events.patterns b/app/tests/keypress/cp-press-release/events.patterns
new file mode 100644
index 0000000..833100f
--- /dev/null
+++ b/app/tests/keypress/cp-press-release/events.patterns
@@ -0,0 +1 @@
+s/.*hid_listener_keycode_//p \ No newline at end of file
diff --git a/app/tests/keypress/cp-press-release/keycode_events.snapshot b/app/tests/keypress/cp-press-release/keycode_events.snapshot
new file mode 100644
index 0000000..f1ef0ed
--- /dev/null
+++ b/app/tests/keypress/cp-press-release/keycode_events.snapshot
@@ -0,0 +1,2 @@
+pressed: usage_page 0x0c keycode 0xb5
+released: usage_page 0x0c keycode 0xb5
diff --git a/app/tests/keypress/cp-press-release/native_posix.keymap b/app/tests/keypress/cp-press-release/native_posix.keymap
new file mode 100644
index 0000000..0e86f93
--- /dev/null
+++ b/app/tests/keypress/cp-press-release/native_posix.keymap
@@ -0,0 +1,5 @@
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/keypress/kp-press-release/events.patterns b/app/tests/keypress/kp-press-release/events.patterns
new file mode 100644
index 0000000..833100f
--- /dev/null
+++ b/app/tests/keypress/kp-press-release/events.patterns
@@ -0,0 +1 @@
+s/.*hid_listener_keycode_//p \ No newline at end of file
diff --git a/app/tests/keypress/kp-press-release/keycode_events.snapshot b/app/tests/keypress/kp-press-release/keycode_events.snapshot
new file mode 100644
index 0000000..f1ef0ed
--- /dev/null
+++ b/app/tests/keypress/kp-press-release/keycode_events.snapshot
@@ -0,0 +1,2 @@
+pressed: usage_page 0x0c keycode 0xb5
+released: usage_page 0x0c keycode 0xb5
diff --git a/app/tests/keypress/kp-press-release/native_posix.keymap b/app/tests/keypress/kp-press-release/native_posix.keymap
new file mode 100644
index 0000000..7f73690
--- /dev/null
+++ b/app/tests/keypress/kp-press-release/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/momentary-layer/behavior_keymap.dtsi b/app/tests/momentary-layer/behavior_keymap.dtsi
new file mode 100644
index 0000000..34c445c
--- /dev/null
+++ b/app/tests/momentary-layer/behavior_keymap.dtsi
@@ -0,0 +1,28 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp B &mo 1
+ &kp D &kp G>;
+ };
+
+ lower_layer {
+ bindings = <
+ &cp M_NEXT &trans
+ &kp L &kp J>;
+ };
+
+ raise_layer {
+ bindings = <
+ &kp W &kp U
+ &kp X &kp M>;
+ };
+ };
+};
diff --git a/app/tests/momentary-layer/early-key-release/events.patterns b/app/tests/momentary-layer/early-key-release/events.patterns
new file mode 100644
index 0000000..bd7b488
--- /dev/null
+++ b/app/tests/momentary-layer/early-key-release/events.patterns
@@ -0,0 +1,2 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p \ No newline at end of file
diff --git a/app/tests/momentary-layer/early-key-release/keycode_events.snapshot b/app/tests/momentary-layer/early-key-release/keycode_events.snapshot
new file mode 100644
index 0000000..474eef7
--- /dev/null
+++ b/app/tests/momentary-layer/early-key-release/keycode_events.snapshot
@@ -0,0 +1,4 @@
+kp_pressed: usage_page 0x07 keycode 0x05
+mo_pressed: position 1 layer 1
+kp_released: usage_page 0x07 keycode 0x05
+mo_released: position 1 layer 1
diff --git a/app/tests/momentary-layer/early-key-release/native_posix.keymap b/app/tests/momentary-layer/early-key-release/native_posix.keymap
new file mode 100644
index 0000000..e7628c0
--- /dev/null
+++ b/app/tests/momentary-layer/early-key-release/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/momentary-layer/early-key-release/pending b/app/tests/momentary-layer/early-key-release/pending
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/tests/momentary-layer/early-key-release/pending
diff --git a/app/tests/momentary-layer/normal/events.patterns b/app/tests/momentary-layer/normal/events.patterns
new file mode 100644
index 0000000..bd7b488
--- /dev/null
+++ b/app/tests/momentary-layer/normal/events.patterns
@@ -0,0 +1,2 @@
+s/.*hid_listener_keycode/kp/p
+s/.*mo_keymap_binding/mo/p \ No newline at end of file
diff --git a/app/tests/momentary-layer/normal/keycode_events.snapshot b/app/tests/momentary-layer/normal/keycode_events.snapshot
new file mode 100644
index 0000000..9dc6101
--- /dev/null
+++ b/app/tests/momentary-layer/normal/keycode_events.snapshot
@@ -0,0 +1,4 @@
+mo_pressed: position 1 layer 1
+kp_pressed: usage_page 0x0c keycode 0xb5
+kp_released: usage_page 0x0c keycode 0xb5
+mo_released: position 1 layer 1
diff --git a/app/tests/momentary-layer/normal/native_posix.keymap b/app/tests/momentary-layer/normal/native_posix.keymap
new file mode 100644
index 0000000..7f73690
--- /dev/null
+++ b/app/tests/momentary-layer/normal/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/none/behavior_keymap.dtsi b/app/tests/none/behavior_keymap.dtsi
new file mode 100644
index 0000000..0a4f7cb
--- /dev/null
+++ b/app/tests/none/behavior_keymap.dtsi
@@ -0,0 +1,22 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &none &mo 1
+ &kp A &none>;
+ };
+
+ lower_layer {
+ bindings = <
+ &none &trans
+ &none &kp A>;
+ };
+ };
+};
diff --git a/app/tests/none/layered/events.patterns b/app/tests/none/layered/events.patterns
new file mode 100644
index 0000000..3c9d3f8
--- /dev/null
+++ b/app/tests/none/layered/events.patterns
@@ -0,0 +1 @@
+s/.*hid_listener_keycode/kp/p \ No newline at end of file
diff --git a/app/tests/none/layered/keycode_events.snapshot b/app/tests/none/layered/keycode_events.snapshot
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/tests/none/layered/keycode_events.snapshot
diff --git a/app/tests/none/layered/native_posix.keymap b/app/tests/none/layered/native_posix.keymap
new file mode 100644
index 0000000..59ea481
--- /dev/null
+++ b/app/tests/none/layered/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/none/normal/events.patterns b/app/tests/none/normal/events.patterns
new file mode 100644
index 0000000..3c9d3f8
--- /dev/null
+++ b/app/tests/none/normal/events.patterns
@@ -0,0 +1 @@
+s/.*hid_listener_keycode/kp/p \ No newline at end of file
diff --git a/app/tests/none/normal/keycode_events.snapshot b/app/tests/none/normal/keycode_events.snapshot
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/tests/none/normal/keycode_events.snapshot
diff --git a/app/tests/none/normal/native_posix.keymap b/app/tests/none/normal/native_posix.keymap
new file mode 100644
index 0000000..94d7539
--- /dev/null
+++ b/app/tests/none/normal/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/toggle-layer/behavior_keymap.dtsi b/app/tests/toggle-layer/behavior_keymap.dtsi
new file mode 100644
index 0000000..d2b41a9
--- /dev/null
+++ b/app/tests/toggle-layer/behavior_keymap.dtsi
@@ -0,0 +1,28 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &kp B &tog 1
+ &kp D &kp G>;
+ };
+
+ lower_layer {
+ bindings = <
+ &cp M_NEXT &trans
+ &kp L &kp J>;
+ };
+
+ raise_layer {
+ bindings = <
+ &kp W &kp U
+ &kp X &kp M>;
+ };
+ };
+};
diff --git a/app/tests/toggle-layer/early-key-release/events.patterns b/app/tests/toggle-layer/early-key-release/events.patterns
new file mode 100644
index 0000000..397fef4
--- /dev/null
+++ b/app/tests/toggle-layer/early-key-release/events.patterns
@@ -0,0 +1,2 @@
+s/.*hid_listener_keycode/kp/p
+s/.*tog_keymap_binding/tog/p \ No newline at end of file
diff --git a/app/tests/toggle-layer/early-key-release/keycode_events.snapshot b/app/tests/toggle-layer/early-key-release/keycode_events.snapshot
new file mode 100644
index 0000000..3ac017c
--- /dev/null
+++ b/app/tests/toggle-layer/early-key-release/keycode_events.snapshot
@@ -0,0 +1,6 @@
+kp_pressed: usage_page 0x07 keycode 0x05
+tog_pressed: position 1 layer 1
+kp_released: usage_page 0x07 keycode 0x05
+tog_released: position 1 layer 1
+kp_pressed: usage_page 0x0c keycode 0xb5
+kp_released: usage_page 0x0c keycode 0xb5
diff --git a/app/tests/toggle-layer/early-key-release/native_posix.keymap b/app/tests/toggle-layer/early-key-release/native_posix.keymap
new file mode 100644
index 0000000..6b2b8f2
--- /dev/null
+++ b/app/tests/toggle-layer/early-key-release/native_posix.keymap
@@ -0,0 +1,9 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,0,10) ZMK_MOCK_RELEASE(0,1,10)
+ ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/toggle-layer/early-key-release/pending b/app/tests/toggle-layer/early-key-release/pending
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/tests/toggle-layer/early-key-release/pending
diff --git a/app/tests/toggle-layer/normal/events.patterns b/app/tests/toggle-layer/normal/events.patterns
new file mode 100644
index 0000000..397fef4
--- /dev/null
+++ b/app/tests/toggle-layer/normal/events.patterns
@@ -0,0 +1,2 @@
+s/.*hid_listener_keycode/kp/p
+s/.*tog_keymap_binding/tog/p \ No newline at end of file
diff --git a/app/tests/toggle-layer/normal/keycode_events.snapshot b/app/tests/toggle-layer/normal/keycode_events.snapshot
new file mode 100644
index 0000000..42174cc
--- /dev/null
+++ b/app/tests/toggle-layer/normal/keycode_events.snapshot
@@ -0,0 +1,4 @@
+tog_pressed: position 1 layer 1
+tog_released: position 1 layer 1
+kp_pressed: usage_page 0x0c keycode 0xb5
+kp_released: usage_page 0x0c keycode 0xb5
diff --git a/app/tests/toggle-layer/normal/native_posix.keymap b/app/tests/toggle-layer/normal/native_posix.keymap
new file mode 100644
index 0000000..202c105
--- /dev/null
+++ b/app/tests/toggle-layer/normal/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_RELEASE(0,1,10) ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/transparent/behavior_keymap.dtsi b/app/tests/transparent/behavior_keymap.dtsi
new file mode 100644
index 0000000..d6c5e27
--- /dev/null
+++ b/app/tests/transparent/behavior_keymap.dtsi
@@ -0,0 +1,22 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+
+/ {
+ keymap {
+ compatible = "zmk,keymap";
+ label ="Default keymap";
+
+ default_layer {
+ bindings = <
+ &trans &mo 1
+ &kp A &none>;
+ };
+
+ lower_layer {
+ bindings = <
+ &trans &trans
+ &trans &kp A>;
+ };
+ };
+};
diff --git a/app/tests/transparent/layered/events.patterns b/app/tests/transparent/layered/events.patterns
new file mode 100644
index 0000000..3c9d3f8
--- /dev/null
+++ b/app/tests/transparent/layered/events.patterns
@@ -0,0 +1 @@
+s/.*hid_listener_keycode/kp/p \ No newline at end of file
diff --git a/app/tests/transparent/layered/keycode_events.snapshot b/app/tests/transparent/layered/keycode_events.snapshot
new file mode 100644
index 0000000..d0bd245
--- /dev/null
+++ b/app/tests/transparent/layered/keycode_events.snapshot
@@ -0,0 +1,2 @@
+kp_pressed: usage_page 0x07 keycode 0x04
+kp_released: usage_page 0x07 keycode 0x04
diff --git a/app/tests/transparent/layered/native_posix.keymap b/app/tests/transparent/layered/native_posix.keymap
new file mode 100644
index 0000000..59ea481
--- /dev/null
+++ b/app/tests/transparent/layered/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,1,10) ZMK_MOCK_PRESS(1,0,10) ZMK_MOCK_RELEASE(1,0,10) ZMK_MOCK_RELEASE(0,1,10)>;
+}; \ No newline at end of file
diff --git a/app/tests/transparent/normal/events.patterns b/app/tests/transparent/normal/events.patterns
new file mode 100644
index 0000000..3c9d3f8
--- /dev/null
+++ b/app/tests/transparent/normal/events.patterns
@@ -0,0 +1 @@
+s/.*hid_listener_keycode/kp/p \ No newline at end of file
diff --git a/app/tests/transparent/normal/keycode_events.snapshot b/app/tests/transparent/normal/keycode_events.snapshot
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/app/tests/transparent/normal/keycode_events.snapshot
diff --git a/app/tests/transparent/normal/native_posix.keymap b/app/tests/transparent/normal/native_posix.keymap
new file mode 100644
index 0000000..94d7539
--- /dev/null
+++ b/app/tests/transparent/normal/native_posix.keymap
@@ -0,0 +1,8 @@
+#include <dt-bindings/zmk/keys.h>
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/kscan-mock.h>
+#include "../behavior_keymap.dtsi"
+
+&kscan {
+ events = <ZMK_MOCK_PRESS(0,0,10) ZMK_MOCK_RELEASE(0,0,10)>;
+}; \ No newline at end of file
diff --git a/docs/docs/dev-setup.md b/docs/docs/dev-setup.md
index 6e893b3..fae0aa0 100644
--- a/docs/docs/dev-setup.md
+++ b/docs/docs/dev-setup.md
@@ -52,6 +52,7 @@ sudo apt install -y \
autoconf \
automake \
build-essential \
+ bzip2 \
ccache \
device-tree-compiler \
dfu-util \
@@ -91,6 +92,7 @@ sudo apt install -y \
autoconf \
automake \
build-essential \
+ bzip2 \
ccache \
device-tree-compiler \
dfu-util \
@@ -130,6 +132,7 @@ sudo dnf install -y \
wget \
autoconf \
automake \
+ bzip2 \
ccache \
dtc \
dfu-util \
diff --git a/docs/docs/dev-tests.md b/docs/docs/dev-tests.md
new file mode 100644
index 0000000..68d4725
--- /dev/null
+++ b/docs/docs/dev-tests.md
@@ -0,0 +1,20 @@
+---
+id: dev-tests
+title: Tests
+sidebar_label: Tests
+---
+
+Running tests requires [native posix support](./dev-posix-board). Any folder under `/app/tests`
+containing `native_posix.keymap` will be selected when running `./run-test.sh all`.
+
+## Creating a New Test Set
+1. Copy the test set that most closely resembles the tests you will be creating.
+2. Rename the newly created test set to the behavior you're testing e.g, toggle-layer
+3. Modify `behavior_keymap.dtsi` to create a keymap using the behavior and related behaviors
+4. Modify `test_case/native_posix.keymap` for a simulated use case
+5. Modify `test_case/events.patterns` to collect relevant logs to the test
+ - See: [sed manual](https://www.gnu.org/software/sed/manual/sed.html) and
+ [tutorial](https://www.digitalocean.com/community/tutorials/the-basics-of-using-the-sed-stream-editor-to-manipulate-text-in-linux)
+6. Modify `test_case/keycode_events.snapshot` for to include the expected output
+7. Rename the `test_case` folder to describe the test.
+8. Repeat steps 4 to 7 for every test case \ No newline at end of file
diff --git a/docs/sidebars.js b/docs/sidebars.js
index 51313fc..d426667 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -20,6 +20,7 @@ module.exports = {
"dev-setup",
"dev-boards-shields-keymaps",
"dev-posix-board",
+ "dev-tests",
],
"Dev Guides": ["dev-guide-new-shield", "dev-guide-usb-logging"],
},
diff --git a/docs/static/setup.sh b/docs/static/setup.sh
index bb61df6..4dc740a 100644
--- a/docs/static/setup.sh
+++ b/docs/static/setup.sh
@@ -38,7 +38,7 @@ echo ""
echo "Keyboard Shield Selection:"
prompt="Pick an keyboard:"
-options=("Kyria" "Lily58" "Corne")
+options=("Kyria" "Lily58" "Corne" "Splitreus62")
PS3="$prompt "
# TODO: Add support for "Other" and linking to docs on adding custom shields in user config repos.
@@ -50,6 +50,7 @@ select opt in "${options[@]}" "Quit"; do
1 ) shield_title="Kyria" shield="kyria"; split="y"; break;;
2 ) shield_title="Lily58" shield="lily58"; split="y"; break;;
3 ) shield_title="Corne" shield="corne"; split="y"; break;;
+ 4 ) shield_title="Splitreus62" shield="splitreus62"; split="y"; break;;
# Add link to docs on adding your own custom shield in your ZMK config!
# $(( ${#options[@]}+1 )) ) echo "Other!"; break;;