Merge branch 'main' into advantage360
This commit is contained in:
commit
40d9cf1c10
225 changed files with 5834 additions and 973 deletions
|
@ -4,10 +4,10 @@
|
|||
[](https://github.com/zmkfirmware/zmk/actions)
|
||||
[](CODE_OF_CONDUCT.md)
|
||||
|
||||
[ZMK Firmware](https://zmk.dev/) is an open source (MIT) keyboard firmware built on the [Zephyr™ Project](https://www.zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues.
|
||||
[ZMK Firmware](https://zmk.dev/) is an open source ([MIT](LICENSE)) keyboard firmware built on the [Zephyr™ Project](https://www.zephyrproject.org/) Real Time Operating System (RTOS). ZMK's goal is to provide a modern, wireless, and powerful firmware free of licensing issues.
|
||||
|
||||
Check out the website to learn more: https://zmk.dev/
|
||||
Check out the website to learn more: https://zmk.dev/.
|
||||
|
||||
You can also come join our [ZMK Discord Server](https://zmk.dev/community/discord/invite)
|
||||
You can also come join our [ZMK Discord Server](https://zmk.dev/community/discord/invite).
|
||||
|
||||
To review features, check out the [feature overview](https://zmk.dev/docs/). ZMK is under active development, and new features are listed with the [enhancement label](https://github.com/zmkfirmware/zmk/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement) in GitHub. Please feel free to add 👍 to the issue description of any requests to upvote the feature.
|
||||
|
|
|
@ -8,7 +8,7 @@ list(APPEND DTS_ROOT ${CMAKE_SOURCE_DIR}/drivers/zephyr)
|
|||
set(ZephyrBuildConfiguration_ROOT ${CMAKE_SOURCE_DIR}/cmake)
|
||||
|
||||
list(APPEND ZEPHYR_EXTRA_MODULES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/drivers
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/module
|
||||
)
|
||||
|
||||
# Find Zephyr. This also loads Zephyr's build system.
|
||||
|
@ -43,7 +43,7 @@ if ((NOT CONFIG_ZMK_SPLIT) OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
|
|||
target_sources(app PRIVATE src/behaviors/behavior_sticky_key.c)
|
||||
target_sources(app PRIVATE src/behaviors/behavior_caps_word.c)
|
||||
target_sources(app PRIVATE src/behaviors/behavior_key_repeat.c)
|
||||
target_sources(app PRIVATE src/behaviors/behavior_macro.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_BEHAVIOR_MACRO app PRIVATE src/behaviors/behavior_macro.c)
|
||||
target_sources(app PRIVATE src/behaviors/behavior_momentary_layer.c)
|
||||
target_sources(app PRIVATE src/behaviors/behavior_mod_morph.c)
|
||||
target_sources(app PRIVATE src/behaviors/behavior_outputs.c)
|
||||
|
@ -77,8 +77,8 @@ endif()
|
|||
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/behaviors/behavior_rgb_underglow.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/behaviors/behavior_backlight.c)
|
||||
|
||||
target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/events/battery_state_changed.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_BLE app PRIVATE src/battery.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/events/battery_state_changed.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_BATTERY_REPORTING app PRIVATE src/battery.c)
|
||||
|
||||
target_sources_ifdef(CONFIG_ZMK_SPLIT app PRIVATE src/events/split_peripheral_status_changed.c)
|
||||
add_subdirectory(src/split)
|
||||
|
@ -87,6 +87,7 @@ target_sources_ifdef(CONFIG_USB_DEVICE_STACK app PRIVATE src/usb.c)
|
|||
target_sources_ifdef(CONFIG_ZMK_USB app PRIVATE src/usb_hid.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_RGB_UNDERGLOW app PRIVATE src/rgb_underglow.c)
|
||||
target_sources_ifdef(CONFIG_ZMK_BACKLIGHT app PRIVATE src/backlight.c)
|
||||
target_sources(app PRIVATE src/workqueue.c)
|
||||
target_sources(app PRIVATE src/main.c)
|
||||
|
||||
add_subdirectory(src/display/)
|
||||
|
|
55
app/Kconfig
55
app/Kconfig
|
@ -114,12 +114,16 @@ menuconfig ZMK_BLE
|
|||
select BT_SMP_APP_PAIRING_ACCEPT
|
||||
select BT_PERIPHERAL
|
||||
select BT_DIS
|
||||
select BT_BAS
|
||||
select BT_SETTINGS
|
||||
select SETTINGS
|
||||
imply ZMK_BATTERY_REPORTING
|
||||
|
||||
if ZMK_BLE
|
||||
|
||||
# BT_TINYCRYPT_ECC is required for BT_SMP_SC_PAIR_ONLY when using HCI
|
||||
config BT_TINYCRYPT_ECC
|
||||
default y if BT_HCI && !BT_CTLR
|
||||
|
||||
choice BT_LL_SW_LLCP_IMPL
|
||||
default BT_LL_SW_LLCP_LEGACY
|
||||
|
||||
|
@ -131,7 +135,7 @@ config SYSTEM_WORKQUEUE_STACK_SIZE
|
|||
|
||||
config ZMK_BLE_THREAD_STACK_SIZE
|
||||
int "BLE notify thread stack size"
|
||||
default 512
|
||||
default 768
|
||||
|
||||
config ZMK_BLE_THREAD_PRIORITY
|
||||
int "BLE notify thread priority"
|
||||
|
@ -160,8 +164,9 @@ config BT_DEVICE_APPEARANCE
|
|||
default 961
|
||||
|
||||
config ZMK_BLE_PASSKEY_ENTRY
|
||||
bool "Experimental: Requiring typing passkey from host to pair BLE connection"
|
||||
bool "Require passkey entry on the keyboard to complete pairing"
|
||||
default n
|
||||
select RING_BUFFER
|
||||
|
||||
config BT_PERIPHERAL_PREF_MIN_INT
|
||||
default 6
|
||||
|
@ -305,6 +310,12 @@ endmenu
|
|||
|
||||
menu "Power Management"
|
||||
|
||||
config ZMK_BATTERY_REPORTING
|
||||
bool "Battery level detection/reporting"
|
||||
default n
|
||||
select SENSOR
|
||||
select BT_BAS if ZMK_BLE
|
||||
|
||||
config ZMK_IDLE_TIMEOUT
|
||||
int "Milliseconds of inactivity before entering idle state (OLED shutoff, etc)"
|
||||
default 30000
|
||||
|
@ -392,14 +403,18 @@ endif
|
|||
#Initialization Priorities
|
||||
endmenu
|
||||
|
||||
menu "KSCAN Settings"
|
||||
menuconfig ZMK_KSCAN
|
||||
bool "ZMK KScan Integration"
|
||||
default y
|
||||
select KSCAN
|
||||
|
||||
if ZMK_KSCAN
|
||||
|
||||
config ZMK_KSCAN_EVENT_QUEUE_SIZE
|
||||
int "Size of the event queue for KSCAN events to buffer events"
|
||||
default 4
|
||||
|
||||
#KSCAN Settings
|
||||
endmenu
|
||||
endif # ZMK_KSCAN
|
||||
|
||||
menu "Logging"
|
||||
|
||||
|
@ -489,10 +504,18 @@ config ZMK_SETTINGS_SAVE_DEBOUNCE
|
|||
endif
|
||||
|
||||
config ZMK_BATTERY_REPORT_INTERVAL
|
||||
depends on ZMK_BLE
|
||||
depends on ZMK_BATTERY_REPORTING
|
||||
int "Battery level report interval in seconds"
|
||||
default 60
|
||||
|
||||
config ZMK_LOW_PRIORITY_THREAD_STACK_SIZE
|
||||
int "Low priority thread stack size"
|
||||
default 768
|
||||
|
||||
config ZMK_LOW_PRIORITY_THREAD_PRIORITY
|
||||
int "Low priority thread priority"
|
||||
default 10
|
||||
|
||||
#Advanced
|
||||
endmenu
|
||||
|
||||
|
@ -515,8 +538,24 @@ config ZMK_WPM
|
|||
bool "Calculate WPM"
|
||||
default n
|
||||
|
||||
config SENSOR
|
||||
config ZMK_KEYMAP_SENSORS
|
||||
bool "Enable Keymap Sensors support"
|
||||
default y
|
||||
depends on DT_HAS_ZMK_KEYMAP_SENSORS_ENABLED
|
||||
select SENSOR
|
||||
|
||||
if ZMK_KEYMAP_SENSORS
|
||||
|
||||
config ZMK_KEYMAP_SENSORS_DEFAULT_TRIGGERS_PER_ROTATION
|
||||
int "Default triggers per rotation"
|
||||
help
|
||||
Unless overridden for a sensor in the board/shield/devicetree, this value
|
||||
determines how many times to trigger the bound behavior per full rotation.
|
||||
For tactile encoders with detents, this usually should match the number of
|
||||
detents per rotation of the encoder.
|
||||
default 20
|
||||
|
||||
endif # ZMK_KEYMAP_SENSORS
|
||||
|
||||
choice CBPRINTF_IMPLEMENTATION
|
||||
default CBPRINTF_NANO
|
||||
|
|
|
@ -22,3 +22,8 @@ config ZMK_BEHAVIOR_SENSOR_ROTATE_VAR
|
|||
default y
|
||||
depends on DT_HAS_ZMK_BEHAVIOR_SENSOR_ROTATE_VAR_ENABLED
|
||||
select ZMK_BEHAVIOR_SENSOR_ROTATE_COMMON
|
||||
|
||||
config ZMK_BEHAVIOR_MACRO
|
||||
bool
|
||||
default y
|
||||
depends on DT_HAS_ZMK_BEHAVIOR_MACRO_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_ONE_PARAM_ENABLED || DT_HAS_ZMK_BEHAVIOR_MACRO_TWO_PARAM_ENABLED
|
|
@ -24,15 +24,15 @@
|
|||
|
||||
i2c0_default: i2c0_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 17)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 20)>;
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 15)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 17)>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c0_sleep: i2c0_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 17)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 20)>;
|
||||
psels = <NRF_PSEL(TWIM_SDA, 0, 15)>,
|
||||
<NRF_PSEL(TWIM_SCL, 0, 17)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -8,6 +8,9 @@ CONFIG_BOARD_PILLBUG=y
|
|||
# Enable MPU
|
||||
CONFIG_ARM_MPU=y
|
||||
|
||||
# Use pinctrl
|
||||
CONFIG_PINCTRL=y
|
||||
|
||||
# enable GPIO
|
||||
CONFIG_GPIO=y
|
||||
|
||||
|
|
|
@ -6,5 +6,5 @@
|
|||
|
||||
&arduino_i2c {
|
||||
// Default buffer size is too small for use with displays.
|
||||
zephyr,concat-buf-size = <512>;
|
||||
zephyr,concat-buf-size = <1024>;
|
||||
};
|
||||
|
|
|
@ -32,3 +32,6 @@
|
|||
};
|
||||
};
|
||||
|
||||
&qspi {
|
||||
status = "disabled";
|
||||
};
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
|
||||
/ {
|
||||
|
@ -15,15 +16,30 @@
|
|||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL |
|
||||
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | LAYER 1 | L SHIFT | N | M | , | . | / | CTRL |
|
||||
// | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT |
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &mo 1 &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL
|
||||
&kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
function_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | |
|
||||
// | | | |BTSEL3|BTSEL4| | | | | | | | |
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
// | | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
|
||||
/ {
|
||||
|
@ -15,15 +16,30 @@
|
|||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL |
|
||||
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | LAYER 1 | L SHIFT | N | M | , | . | / | CTRL |
|
||||
// | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT |
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &mo 1 &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL
|
||||
&kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
function_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | |
|
||||
// | | | |BTSEL3|BTSEL4| | | | | | | | |
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
// | | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
|
||||
/* Uncomment this block if using RGB
|
||||
|
@ -23,15 +24,30 @@
|
|||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ |
|
||||
// | TAB | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | L SHIFT | L SHIFT | N | M | , | . | / | CTRL |
|
||||
// | SHIFT | Z | X | C | V | B | L SHIFT | L SHIFT | | LAYER 1 | L SHIFT | N | M | , | . | / | CTRL |
|
||||
// | GUI | DEL | RET | SPACE | ESC | | RET | SPACE | TAB | BSPC | R-ALT |
|
||||
bindings = <
|
||||
&kp ESC &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH
|
||||
&kp TAB &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &kp LSHFT &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LSHFT &mo 1 &kp LSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RCTRL
|
||||
&kp LGUI &kp DEL &kp RET &kp SPACE &kp ESC &kp RET &kp SPACE &kp TAB &kp BSPC &kp RALT
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
function_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | |BT_CLR|BTSEL0|BTSEL1|BTSEL2| | | | | | | |
|
||||
// | | | |BTSEL3|BTSEL4| | | | | | | | |
|
||||
// | | | | | | | | | | | | | | | | | | |
|
||||
// | | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&trans &trans &bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,6 +1,16 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
if SHIELD_LEELOO_REV2_LEFT
|
||||
|
||||
config ZMK_KEYBOARD_NAME
|
||||
default "Leeloo v2"
|
||||
|
||||
config ZMK_SPLIT_ROLE_CENTRAL
|
||||
default y
|
||||
|
||||
endif
|
||||
|
||||
if SHIELD_LEELOO_LEFT
|
||||
|
||||
config ZMK_KEYBOARD_NAME
|
||||
|
@ -11,7 +21,7 @@ config ZMK_SPLIT_ROLE_CENTRAL
|
|||
|
||||
endif
|
||||
|
||||
if SHIELD_LEELOO_LEFT || SHIELD_LEELOO_RIGHT
|
||||
if SHIELD_LEELOO
|
||||
|
||||
config ZMK_SPLIT
|
||||
default y
|
||||
|
@ -31,7 +41,6 @@ endif # ZMK_DISPLAY
|
|||
|
||||
if LVGL
|
||||
|
||||
|
||||
config LV_Z_VDB_SIZE
|
||||
default 64
|
||||
|
||||
|
|
|
@ -1,8 +1,21 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
config SHIELD_LEELOO
|
||||
bool
|
||||
|
||||
config SHIELD_LEELOO_LEFT
|
||||
def_bool $(shields_list_contains,leeloo_left)
|
||||
select SHIELD_LEELOO
|
||||
|
||||
config SHIELD_LEELOO_RIGHT
|
||||
def_bool $(shields_list_contains,leeloo_right)
|
||||
select SHIELD_LEELOO
|
||||
|
||||
config SHIELD_LEELOO_REV2_LEFT
|
||||
def_bool $(shields_list_contains,leeloo_rev2_left)
|
||||
select SHIELD_LEELOO
|
||||
|
||||
config SHIELD_LEELOO_REV2_RIGHT
|
||||
def_bool $(shields_list_contains,leeloo_rev2_right)
|
||||
select SHIELD_LEELOO
|
|
@ -1,41 +1,123 @@
|
|||
# Clickety Split | Leeloo
|
||||
# Clickety Split | Leeloo v2
|
||||
|
||||

|
||||

|
||||
|
||||
Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca)
|
||||
GitHub: [ClicketySplit](https://github.com/ClicketySplit)
|
||||
Hardware Supported: Pro Micro, Elite-C, nice!nano v2
|
||||
Hardware Supported: Pro Micro, Elite-C, and nice!nano v2
|
||||
|
||||
Albeit, there is no doubt where Leeloo's heritage is derived from—Lily58, and Corne. It is not a copy-paste-modify implementation.
|
||||
Leeloo v2 has been designed from scratch—again. Everything from the wiring schematic to its case. Leeloo v2 still keeps the column stagger that it's known for, along with its low profile design.
|
||||
|
||||
Leeloo has been designed from scratch; everything from the schematic to its PCB footprints, and column stagger. There are some subtle differences that may not be apparent; however, its subtle changes enable an interesting future.
|
||||
## Features/Differences from Leeloo v1
|
||||
|
||||
Features:
|
||||
- Support for Kailh Low Profile Choc switches with 18mm x 18mm spacing.
|
||||
- A version for Kailh Box/MX switches with 19.05mm x 19.05mm spacing will be available in the future.
|
||||
- All switch locations are socketed.
|
||||
- Rotary encoder locations are socketed.
|
||||
- One of two locations on each side can be used for a rotary encoder.
|
||||
- OLED Displays and nice!view Displays are natively supported, socketed, and no extra wiring is required.
|
||||
- Support for per-switch RGB underglow.
|
||||
- Better location for 110mAh or 700mAh batteries.
|
||||
- Different location for soldering battery leads.
|
||||
- Support for Alps Alpine Micro On/off switches.
|
||||
|
||||
# Leeloo v1
|
||||
|
||||

|
||||
|
||||
## Features
|
||||
|
||||
- 4x6x5m Split Keyboard
|
||||
- Support for MX/Box or Low Profile Choc switches.
|
||||
- 90% of the switches are socketed; with the exception to the rotary encoder positions—6 positions require soldering.
|
||||
- Support for 128x32 OLED Displays.
|
||||
- The option to select one of three positions for an EC11 rotary encoder on each half.
|
||||
- Support for Alps Alpine Micro Switch
|
||||
- Support for 3.7v 301230 LiPo Battery
|
||||
- Support for both Low Profile Choc switches, and Box/MX switches; 19.05mm x 19.05mm spacing.
|
||||
- 90% of the switches are socketed; with the exception to the rotary encoder positions.
|
||||
- Support for Alps Alpine EC11 Rotary Encoders—one on each side, in one of three locations.
|
||||
- Support for OLED Displays or nice!view Displays.
|
||||
- nice!view displays require a wire to be soldered from the CS Pin on nice!view display to P0.22 or D4 on the nice!nano.
|
||||
- Support for both 110mAh or 700mAh batteries.
|
||||
- Solder pads for battery leads.
|
||||
- Support for Alps Alpine Micro On/off switches.
|
||||
|
||||
# Building Your Firmware
|
||||
# Building Leeloo's ZMK Firmware
|
||||
|
||||
ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/)
|
||||
Installation: [Installing ZMK](https://zmk.dev/docs/user-setup)
|
||||
Customization: [Customizing ZMK](https://zmk.dev/docs/customization)
|
||||
Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup)
|
||||
|
||||
Build command for the default keymap of Leeloo:
|
||||
Build commands for the default keymap of Leeloo v1:
|
||||
|
||||
```
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right
|
||||
```
|
||||
|
||||
Build command for your custom keymap of Leeloo:
|
||||
Build commands for the default keymap of Leeloo v2:
|
||||
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourNmae]/leeloo/config"
|
||||
```
|
||||
west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left
|
||||
west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right
|
||||
```
|
||||
|
||||
Build commands for your custom keymap of Leeloo v1:
|
||||
|
||||
```
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config"
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo/config"
|
||||
```
|
||||
|
||||
Build commands for your custom keymap of Leeloo v2:
|
||||
|
||||
```
|
||||
west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config"
|
||||
west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD=leeloo_rev2_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_v2/config"
|
||||
```
|
||||
|
||||
## Building Leeloo's ZMK Firmware with nice!view Displays
|
||||
|
||||
There are a couple of files that need to be adjusted before the build commands can be run.
|
||||
|
||||
### Edit the leeloo[_rev2].keymap File
|
||||
|
||||
Near the top 3rd of the leeloo[_rev2].keymap file, locate the following code block:
|
||||
|
||||
```
|
||||
//nice_view_spi: &spi0 {
|
||||
// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
//};
|
||||
```
|
||||
|
||||
Remove the forward slashes to resemble the following:
|
||||
|
||||
```
|
||||
nice_view_spi: &spi0 {
|
||||
cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
```
|
||||
|
||||
Save your changes and close the file.
|
||||
|
||||
### Sample Build Commands for nice!view Displays
|
||||
|
||||
Build commands for the default keymap of Leeloo v1:
|
||||
|
||||
```
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_left nice_view_adapter nice_view"
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_right nice_view_adapter nice_view"
|
||||
```
|
||||
|
||||
Build commands for the default keymap of Leeloo v2:
|
||||
|
||||
```
|
||||
west build -d build/left_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view"
|
||||
west build -d build/right_v2 -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view"
|
||||
```
|
||||
|
||||
Build commands for your custom keymap of Leeloo v2:
|
||||
|
||||
```
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config"
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_rev2_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_v2/config"
|
||||
```
|
||||
|
||||
# Support
|
||||
|
||||
|
|
47
app/boards/shields/leeloo/boards/nice_nano_v2.overlay
Normal file
47
app/boards/shields/leeloo/boards/nice_nano_v2.overlay
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include <dt-bindings/led/led.h>
|
||||
|
||||
&pinctrl {
|
||||
spi3_default: spi3_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi3_sleep: spi3_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
compatible = "nordic,nrf-spim";
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&spi3_default>;
|
||||
pinctrl-1 = <&spi3_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
led_strip: ws2812@0 {
|
||||
compatible = "worldsemi,ws2812-spi";
|
||||
label = "WS2812";
|
||||
|
||||
/* SPI */
|
||||
reg = <0>; /* ignored, but necessary for SPI bindings */
|
||||
spi-max-frequency = <4000000>;
|
||||
|
||||
/* WS2812 */
|
||||
chain-length = <37>; /* arbitrary; change at will */
|
||||
spi-one-frame = <0x70>;
|
||||
spi-zero-frame = <0x40>;
|
||||
|
||||
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,underglow = &led_strip;
|
||||
};
|
||||
};
|
|
@ -1,9 +1,16 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Uncomment the following line to enable the OLED Display
|
||||
# CONFIG_ZMK_DISPLAY=y
|
||||
|
||||
# Uncomment to turn off WPM Status.
|
||||
# CONFIG_ZMK_WIDGET_WPM_STATUS=n
|
||||
|
||||
# Uncomment to invert colour when using nice!view Displays
|
||||
# CONFIG_ZMK_DISPLAY_INVERT=y
|
||||
|
||||
|
||||
# Uncomment these two lines to add support for encoders
|
||||
# CONFIG_EC11=y
|
||||
# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
|
|
@ -1,87 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2022 The ZMK Contributors
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zephyr,display = &oled;
|
||||
zmk,kscan = &kscan0;
|
||||
zmk,matrix_transform = &default_transform;
|
||||
};
|
||||
|
||||
default_transform: keymap_transform_0 {
|
||||
compatible = "zmk,matrix-transform";
|
||||
columns = <12>;
|
||||
rows = <5>;
|
||||
// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 |
|
||||
// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 |
|
||||
// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 |
|
||||
// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW29 | | SW29 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 |
|
||||
// | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 |
|
||||
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,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)
|
||||
>;
|
||||
};
|
||||
|
||||
kscan0: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
label = "KSCAN";
|
||||
|
||||
diode-direction = "col2row";
|
||||
row-gpios
|
||||
= <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
;
|
||||
};
|
||||
|
||||
left_encoder: encoder_left {
|
||||
compatible = "alps,ec11";
|
||||
label = "LEFT_ENCODER";
|
||||
a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
resolution = <4>;
|
||||
};
|
||||
|
||||
right_encoder: encoder_right {
|
||||
compatible = "alps,ec11";
|
||||
label = "RIGHT_ENCODER";
|
||||
a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
resolution = <4>;
|
||||
};
|
||||
|
||||
sensors {
|
||||
compatible = "zmk,keymap-sensors";
|
||||
sensors = <&left_encoder &right_encoder>;
|
||||
};
|
||||
};
|
||||
|
||||
&pro_micro_i2c {
|
||||
status = "okay";
|
||||
|
||||
oled: ssd1306@3c {
|
||||
compatible = "solomon,ssd1306fb";
|
||||
reg = <0x3c>;
|
||||
label = "DISPLAY";
|
||||
width = <128>;
|
||||
height = <32>;
|
||||
segment-offset = <0>;
|
||||
page-offset = <0>;
|
||||
display-offset = <0>;
|
||||
multiplex-ratio = <31>;
|
||||
segment-remap;
|
||||
com-invdir;
|
||||
com-sequential;
|
||||
prechargep = <0x22>;
|
||||
};
|
||||
};
|
||||
#include "leeloo_common.dtsi"
|
|
@ -1,17 +1,23 @@
|
|||
/*
|
||||
* Copyright (c) 2022 The ZMK Contributors
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/outputs.h>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
|
||||
// Layers
|
||||
#define DEFAULT 0 // default_layer
|
||||
#define LOWER 1 // lower_layer
|
||||
#define RAISE 2 // raise_layer
|
||||
/*
|
||||
* Assign the cs-gpios pin to 4.
|
||||
* Uncomment these next few lines if implementing nice!view Displays
|
||||
* A wire from the nice!view CS display needs to be connected to the
|
||||
* High Frequency P0.22, also known as D4 if you choose to refer to
|
||||
* the pins with Arduino Labels.
|
||||
*/
|
||||
//nice_view_spi: &spi0 {
|
||||
// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
//};
|
||||
|
||||
/ {
|
||||
|
||||
|
@ -19,36 +25,39 @@
|
|||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
label = " QWERTY";
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV
|
||||
&kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
|
||||
&kp LALT &kp LCTRL < 1 RET < 2 MINUS &kp LGUI &kp LGUI < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp LGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
|
||||
&kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
label = " Lower";
|
||||
bindings = <
|
||||
&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11
|
||||
&trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12
|
||||
&trans &trans &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
label = " Raise";
|
||||
bindings = <
|
||||
&trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &bt BT_CLR &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &bt BT_CLR &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
|
|
92
app/boards/shields/leeloo/leeloo_common.dtsi
Normal file
92
app/boards/shields/leeloo/leeloo_common.dtsi
Normal file
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zephyr,display = &oled;
|
||||
zmk,kscan = &kscan0;
|
||||
zmk,matrix_transform = &default_transform;
|
||||
};
|
||||
|
||||
default_transform: keymap_transform_0 {
|
||||
compatible = "zmk,matrix-transform";
|
||||
columns = <12>;
|
||||
rows = <5>;
|
||||
// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 |
|
||||
// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 |
|
||||
// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 |
|
||||
// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW29 | | SW29 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 |
|
||||
// | SW25 | SW26 | SW27 | SW28 | | SW28 | SW27 | SW26 | SW25 |
|
||||
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(4,5) RC(4,6) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11)
|
||||
RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,7) RC(4,8) RC(4,9) RC(4,10)
|
||||
>;
|
||||
};
|
||||
|
||||
kscan0: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
label = "KSCAN";
|
||||
|
||||
diode-direction = "col2row";
|
||||
|
||||
row-gpios
|
||||
= <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
;
|
||||
};
|
||||
|
||||
left_encoder: left_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "LEFT_ENCODER";
|
||||
a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
steps = <120>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
right_encoder: right_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "RIGHT_ENCODER";
|
||||
a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
steps = <120>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sensors {
|
||||
compatible = "zmk,keymap-sensors";
|
||||
sensors = <&left_encoder &right_encoder>;
|
||||
triggers-per-rotation = <30>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&pro_micro_i2c {
|
||||
status = "okay";
|
||||
|
||||
oled: ssd1306@3c {
|
||||
compatible = "solomon,ssd1306fb";
|
||||
reg = <0x3c>;
|
||||
label = "DISPLAY";
|
||||
width = <128>;
|
||||
height = <32>;
|
||||
segment-offset = <0>;
|
||||
page-offset = <0>;
|
||||
display-offset = <0>;
|
||||
multiplex-ratio = <31>;
|
||||
segment-remap;
|
||||
com-invdir;
|
||||
com-sequential;
|
||||
prechargep = <0x22>;
|
||||
};
|
||||
};
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Copyright (c) 2022 The ZMK Contributors
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo.dtsi"
|
||||
|
||||
&kscan0 {
|
||||
|
|
43
app/boards/shields/leeloo/leeloo_rev2.conf
Normal file
43
app/boards/shields/leeloo/leeloo_rev2.conf
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Uncomment the following line to enable the OLED Display
|
||||
# CONFIG_ZMK_DISPLAY=y
|
||||
|
||||
# Uncomment to turn off WPM Status.
|
||||
# CONFIG_ZMK_WIDGET_WPM_STATUS=n
|
||||
|
||||
# Uncomment to invert colour when using nice!view Displays
|
||||
# CONFIG_ZMK_DISPLAY_INVERT=y
|
||||
|
||||
|
||||
# Uncomment the following line to enable per-key lighting
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW=y
|
||||
|
||||
# Use the STRIP config specific to the LEDs you're using
|
||||
# CONFIG_WS2812_STRIP=y
|
||||
|
||||
# Keep OLED or nice!view Displays on even when toggling off LEDs
|
||||
# Change to y if you wish to toggle Displays on and off with LEDs
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n
|
||||
|
||||
# Turn off LEDs when idle.
|
||||
# Change to n if you wish to keep LEDs on even when idle.
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y
|
||||
|
||||
# When USB is disconnected, turn off LEDs
|
||||
# Change to n if you wish to keep LEDs on even when USB is unpluged.
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB=y
|
||||
|
||||
# Start LEDs off at 75%
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=75
|
||||
|
||||
|
||||
# Uncomment these two lines to add support for encoders
|
||||
# CONFIG_EC11=y
|
||||
# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
|
||||
|
||||
|
||||
# Uncomment if you are experiencing connectivity issues; this
|
||||
# configuration item boosts the BLE transmit power.
|
||||
# CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
|
6
app/boards/shields/leeloo/leeloo_rev2.dtsi
Normal file
6
app/boards/shields/leeloo/leeloo_rev2.dtsi
Normal file
|
@ -0,0 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo_common.dtsi"
|
79
app/boards/shields/leeloo/leeloo_rev2.keymap
Normal file
79
app/boards/shields/leeloo/leeloo_rev2.keymap
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/outputs.h>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/rgb.h>
|
||||
|
||||
// Short versions
|
||||
#define RGBON &rgb_ug RGB_ON
|
||||
#define RGBOFF &rgb_ug RGB_OFF
|
||||
#define RGBTOG &rgb_ug RGB_TOG
|
||||
#define RGBHUI &rgb_ug RGB_HUI
|
||||
#define RGBHUD &rgb_ug RGB_HUD
|
||||
#define RGBSAI &rgb_ug RGB_SAI
|
||||
#define RGBSAD &rgb_ug RGB_SAD
|
||||
#define RGBBRI &rgb_ug RGB_BRI
|
||||
#define RGBBRD &rgb_ug RGB_BRD
|
||||
#define RGBEFF &rgb_ug RGB_EFF
|
||||
|
||||
|
||||
/*
|
||||
* Assign the cs-gpios pin to 4.
|
||||
* Uncomment these next few lines if implementing nice!view Displays
|
||||
*/
|
||||
//nice_view_spi: &spi0 {
|
||||
// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
//};
|
||||
|
||||
|
||||
/ {
|
||||
|
||||
keymap {
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
label = " QWERTY";
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV
|
||||
&kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp RGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
|
||||
&kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &kp DEL
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
label = " Lower";
|
||||
bindings = <
|
||||
&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11
|
||||
&trans &trans &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &trans &kp F12
|
||||
&trans &trans &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
label = " Raise";
|
||||
bindings = <
|
||||
&trans &trans &trans &trans &trans &trans &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &sys_reset &bootloader
|
||||
RGBON RGBTOG RGBHUI RGBSAI RGBBRI &trans &trans &trans &trans &trans &trans &trans
|
||||
RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &bt BT_CLR &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
15
app/boards/shields/leeloo/leeloo_rev2.zmk.yml
Normal file
15
app/boards/shields/leeloo/leeloo_rev2.zmk.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
file_format: "1"
|
||||
id: leeloo_rev2
|
||||
name: Leeloo v2
|
||||
type: shield
|
||||
url: https://clicketysplit.ca/pages/leeloo
|
||||
requires: [pro_micro]
|
||||
exposes: [i2c_oled]
|
||||
features:
|
||||
- keys
|
||||
- display
|
||||
- encoder
|
||||
- underglow
|
||||
siblings:
|
||||
- leeloo_rev2_left
|
||||
- leeloo_rev2_right
|
21
app/boards/shields/leeloo/leeloo_rev2_left.overlay
Normal file
21
app/boards/shields/leeloo/leeloo_rev2_left.overlay
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo_rev2.dtsi"
|
||||
|
||||
&kscan0 {
|
||||
col-gpios
|
||||
= <&pro_micro 19 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 18 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 15 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 14 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 16 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 10 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
|
||||
&left_encoder {
|
||||
status = "okay";
|
||||
};
|
25
app/boards/shields/leeloo/leeloo_rev2_right.overlay
Normal file
25
app/boards/shields/leeloo/leeloo_rev2_right.overlay
Normal file
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo_rev2.dtsi"
|
||||
|
||||
&default_transform {
|
||||
col-offset = <6>;
|
||||
};
|
||||
|
||||
&kscan0 {
|
||||
col-gpios
|
||||
= <&pro_micro 10 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 16 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 14 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 15 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 18 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 19 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
|
||||
&right_encoder {
|
||||
status = "okay";
|
||||
};
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Copyright (c) 2022 The ZMK Contributors
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo.dtsi"
|
||||
|
||||
&default_transform {
|
||||
|
|
49
app/boards/shields/leeloo_micro/Kconfig.defconfig
Normal file
49
app/boards/shields/leeloo_micro/Kconfig.defconfig
Normal file
|
@ -0,0 +1,49 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
if SHIELD_LEELOO_MICRO_LEFT
|
||||
|
||||
config ZMK_KEYBOARD_NAME
|
||||
default "Leeloo-Micro"
|
||||
|
||||
config ZMK_SPLIT_ROLE_CENTRAL
|
||||
default y
|
||||
|
||||
endif
|
||||
|
||||
if SHIELD_LEELOO_MICRO
|
||||
|
||||
config ZMK_SPLIT
|
||||
default y
|
||||
|
||||
if ZMK_DISPLAY
|
||||
|
||||
config I2C
|
||||
default y
|
||||
|
||||
config SSD1306
|
||||
default y
|
||||
|
||||
config SSD1306_REVERSE_MODE
|
||||
default y
|
||||
|
||||
endif # ZMK_DISPLAY
|
||||
|
||||
if LVGL
|
||||
|
||||
config LV_Z_VDB_SIZE
|
||||
default 64
|
||||
|
||||
config LV_Z_DPI
|
||||
default 148
|
||||
|
||||
config LV_Z_BITS_PER_PIXEL
|
||||
default 1
|
||||
|
||||
choice LV_COLOR_DEPTH
|
||||
default LV_COLOR_DEPTH_1
|
||||
endchoice
|
||||
|
||||
endif # LVGL
|
||||
|
||||
endif
|
13
app/boards/shields/leeloo_micro/Kconfig.shield
Normal file
13
app/boards/shields/leeloo_micro/Kconfig.shield
Normal file
|
@ -0,0 +1,13 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
config SHIELD_LEELOO_MICRO
|
||||
bool
|
||||
|
||||
config SHIELD_LEELOO_MICRO_LEFT
|
||||
def_bool $(shields_list_contains,leeloo_micro_left)
|
||||
select SHIELD_LEELOO_MICRO
|
||||
|
||||
config SHIELD_LEELOO_MICRO_RIGHT
|
||||
def_bool $(shields_list_contains,leeloo_micro_right)
|
||||
select SHIELD_LEELOO_MICRO
|
89
app/boards/shields/leeloo_micro/README.md
Normal file
89
app/boards/shields/leeloo_micro/README.md
Normal file
|
@ -0,0 +1,89 @@
|
|||
# Clickety Split | Leeloo-Micro
|
||||
|
||||

|
||||
|
||||
Keyboard Designer: [clicketysplit.ca](https://clicketysplit.ca)
|
||||
GitHub: [ClicketySplit](https://github.com/ClicketySplit)
|
||||
Hardware Supported: nice!nano v2, nice!view v1
|
||||
|
||||
Leeloo-Micro is a 3x5x5m derivative of Leeloo v2; inheriting the column stagger and modifiers row, yet, reducing the number of switches by removing the top row and outside columns. With Leeloo-Micro's inaugural release being wireless, it leverages nice!nanos and nice!views for its microcontrollers and displays.
|
||||
|
||||
## Features
|
||||
|
||||
- 3x5x5m Split Keyboard
|
||||
- Support for Kailh Low Profile Choc switches with 18mm x 18mm spacing.
|
||||
- All switch locations are socketed.
|
||||
- Support for Alps Alpine EC11 Rotary Encoders—one on each side, in one of two locations.
|
||||
- Rotary encoder locations are socketed.
|
||||
- nice!view Displays are inherently supported, socketed, and no extra wiring is required.
|
||||
- Support for per-switch RGB underglow.
|
||||
- Support for both 110mAh or 700mAh batteries.
|
||||
- Support for Alps Alpine Micro On/off switches.
|
||||
|
||||
# Building Leeloo-Micro ZMK Firmware
|
||||
|
||||
ZMK Firmware: [Introduction to ZMK](https://zmk.dev/docs/)
|
||||
Installation: [Installing ZMK](https://zmk.dev/docs/user-setup)
|
||||
Customization: [Customizing ZMK](https://zmk.dev/docs/customization)
|
||||
Development Environment: [Basic Setup](https://zmk.dev/docs/development/setup)
|
||||
|
||||
Build commands for the default keymap of Leeloo-Micro:
|
||||
|
||||
```
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right
|
||||
```
|
||||
|
||||
Build commands for your custom keymap of Leeloo-Micro:
|
||||
|
||||
```
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_right -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config"
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD=leeloo_micro_left -DZMK_CONFIG="C:/dev/zmk/[yourName]/leeloo_micro/config"
|
||||
```
|
||||
|
||||
## Building Leeloo-Micro's ZMK Firmware with nice!view Displays
|
||||
|
||||
There are a couple of files that need to be adjusted before the build commands can be run.
|
||||
|
||||
### Edit the leeloo_micro.keymap File
|
||||
|
||||
Near the top 3rd of the leeloo_micro.keymap file, locate the following code block:
|
||||
|
||||
```
|
||||
//nice_view_spi: &spi0 {
|
||||
// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
//};
|
||||
```
|
||||
|
||||
Remove the forward slashes to resemble the following:
|
||||
|
||||
```
|
||||
nice_view_spi: &spi0 {
|
||||
cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
```
|
||||
|
||||
Save your changes and close the file.
|
||||
|
||||
### Sample Build Commands for nice!view Displays
|
||||
|
||||
Build commands for the default keymap of Leeloo-Micro:
|
||||
|
||||
```
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view"
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view"
|
||||
```
|
||||
|
||||
Build commands for your custom keymap of Leeloo-Micro:
|
||||
|
||||
```
|
||||
west build -d build/left -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_left nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config"
|
||||
west build -d build/right -p -b nice_nano_v2 -- -DSHIELD="leeloo_micro_right nice_view_adapter nice_view" -DZMK_CONFIG="/workspaces/zmk-config/[yourName]/leeloo_micro/config"
|
||||
```
|
||||
|
||||
# Support
|
||||
|
||||
If you have any questions with regards to Leeloo-Micro, please [Contact Us](https://clicketysplit.ca/pages/contact-us).
|
||||
|
||||
Clickety Split
|
||||
For the love of split keyboards.
|
47
app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay
Normal file
47
app/boards/shields/leeloo_micro/boards/nice_nano_v2.overlay
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include <dt-bindings/led/led.h>
|
||||
|
||||
&pinctrl {
|
||||
spi3_default: spi3_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi3_sleep: spi3_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
compatible = "nordic,nrf-spim";
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&spi3_default>;
|
||||
pinctrl-1 = <&spi3_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
led_strip: ws2812@0 {
|
||||
compatible = "worldsemi,ws2812-spi";
|
||||
label = "WS2812";
|
||||
|
||||
/* SPI */
|
||||
reg = <0>; /* ignored, but necessary for SPI bindings */
|
||||
spi-max-frequency = <4000000>;
|
||||
|
||||
/* WS2812 */
|
||||
chain-length = <20>; /* arbitrary; change at will */
|
||||
spi-one-frame = <0x70>;
|
||||
spi-zero-frame = <0x40>;
|
||||
|
||||
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,underglow = &led_strip;
|
||||
};
|
||||
};
|
38
app/boards/shields/leeloo_micro/leeloo_micro.conf
Normal file
38
app/boards/shields/leeloo_micro/leeloo_micro.conf
Normal file
|
@ -0,0 +1,38 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
# Uncomment the following line to enable the OLED Display
|
||||
# CONFIG_ZMK_DISPLAY=y
|
||||
|
||||
# Uncomment to turn off WPM Status.
|
||||
# CONFIG_ZMK_WIDGET_WPM_STATUS=n
|
||||
|
||||
# Uncomment to invert colour, if using nice!view Displays
|
||||
# CONFIG_ZMK_DISPLAY_INVERT=y
|
||||
|
||||
|
||||
# Uncomment the following line to enable per-key lighting
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW=y
|
||||
|
||||
# Use the STRIP config specific to the LEDs you're using
|
||||
# CONFIG_WS2812_STRIP=y
|
||||
|
||||
# Keep OLED or nice!view Displays on even when toggling off LEDs
|
||||
# Change to y if you wish to toggle Displays on and off with LEDs
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n
|
||||
|
||||
# Turn off LEDs when idle.
|
||||
# Change to n if you wish to keep LEDs on even when idle.
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_IDLE=y
|
||||
|
||||
# When USB is disconnected, turn off LEDs
|
||||
# Change to n if you wish to keep LEDs on even when USB is unpluged.
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_AUTO_OFF_USB=y
|
||||
|
||||
# Start LEDs off at 75%
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=75
|
||||
|
||||
|
||||
# Uncomment these two lines to add support for encoders
|
||||
# CONFIG_EC11=y
|
||||
# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
|
88
app/boards/shields/leeloo_micro/leeloo_micro.dtsi
Normal file
88
app/boards/shields/leeloo_micro/leeloo_micro.dtsi
Normal file
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zephyr,display = &oled;
|
||||
zmk,kscan = &kscan0;
|
||||
zmk,matrix_transform = &default_transform;
|
||||
};
|
||||
|
||||
default_transform: keymap_transform_0 {
|
||||
compatible = "zmk,matrix-transform";
|
||||
columns = <10>;
|
||||
rows = <4>;
|
||||
//
|
||||
// | SW1 | SW2 | SW3 | SW4 | SW5 | | SW15 | SW4 | SW3 | SW2 | SW1 |
|
||||
// | SW6 | SW7 | SW8 | SW9 | SW10 | | SW10 | SW9 | SW8 | SW7 | SW6 |
|
||||
// | SW11 | SW12 | SW13 | SW14 | SW15 | SW20 | | SW20 | SW15 | SW14 | SW13 | SW12 | SW11 |
|
||||
// | SW16 | SW17 | SW18 | SW19 | | SW19 | SW18 | SW17 | SW16 |
|
||||
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(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(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(3,4) RC(3,5) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9)
|
||||
RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,6) RC(3,7) RC(3,8) RC(3,9)
|
||||
>;
|
||||
};
|
||||
|
||||
kscan0: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
label = "KSCAN";
|
||||
|
||||
diode-direction = "col2row";
|
||||
|
||||
row-gpios
|
||||
= <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
, <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
|
||||
;
|
||||
};
|
||||
|
||||
left_encoder: left_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "LEFT_ENCODER";
|
||||
a-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
b-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
steps = <120>;
|
||||
};
|
||||
|
||||
right_encoder: right_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "RIGHT_ENCODER";
|
||||
a-gpios = <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
b-gpios = <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
|
||||
steps = <120>;
|
||||
};
|
||||
|
||||
sensors {
|
||||
compatible = "zmk,keymap-sensors";
|
||||
sensors = <&left_encoder &right_encoder>;
|
||||
triggers-per-rotation = <30>;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
&pro_micro_i2c {
|
||||
status = "okay";
|
||||
|
||||
oled: ssd1306@3c {
|
||||
compatible = "solomon,ssd1306fb";
|
||||
reg = <0x3c>;
|
||||
label = "DISPLAY";
|
||||
width = <128>;
|
||||
height = <32>;
|
||||
segment-offset = <0>;
|
||||
page-offset = <0>;
|
||||
display-offset = <0>;
|
||||
multiplex-ratio = <31>;
|
||||
segment-remap;
|
||||
com-invdir;
|
||||
com-sequential;
|
||||
prechargep = <0x22>;
|
||||
};
|
||||
};
|
151
app/boards/shields/leeloo_micro/leeloo_micro.keymap
Normal file
151
app/boards/shields/leeloo_micro/leeloo_micro.keymap
Normal file
|
@ -0,0 +1,151 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/outputs.h>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/rgb.h>
|
||||
|
||||
// Layers
|
||||
#define QW_M 0 // Main
|
||||
#define QW_L 1 // Lower
|
||||
#define QW_R 2 // Raise
|
||||
#define QW_A 3 // Adjust
|
||||
|
||||
#define QC_N 4 // Number Pad
|
||||
#define QC_B 5 // Firmware
|
||||
|
||||
|
||||
// Short versions
|
||||
#define BT0 BT_SEL 0
|
||||
#define BT1 BT_SEL 1
|
||||
#define BT2 BT_SEL 2
|
||||
#define BT3 BT_SEL 3
|
||||
#define BT4 BT_SEL 4
|
||||
|
||||
#define BOOTLDR &bootloader
|
||||
|
||||
#define RGBON &rgb_ug RGB_ON
|
||||
#define RGBOFF &rgb_ug RGB_OFF
|
||||
#define RGBTOG &rgb_ug RGB_TOG
|
||||
#define RGBHUI &rgb_ug RGB_HUI
|
||||
#define RGBHUD &rgb_ug RGB_HUD
|
||||
#define RGBSAI &rgb_ug RGB_SAI
|
||||
#define RGBSAD &rgb_ug RGB_SAD
|
||||
#define RGBBRI &rgb_ug RGB_BRI
|
||||
#define RGBBRD &rgb_ug RGB_BRD
|
||||
#define RGBEFF &rgb_ug RGB_EFF
|
||||
|
||||
|
||||
/*
|
||||
* Assign the cs-gpios pin to 4.
|
||||
* Uncomment these next few lines if implementing nice!view Displays.
|
||||
*/
|
||||
//nice_view_spi: &spi0 {
|
||||
// cs-gpios = <&pro_micro 4 GPIO_ACTIVE_HIGH>;
|
||||
//};
|
||||
|
||||
|
||||
/ {
|
||||
conditional_layers {
|
||||
compatible = "zmk,conditional-layers";
|
||||
adjust_layer {
|
||||
if-layers = <QW_L QW_R>;
|
||||
then-layer = <QW_A>;
|
||||
};
|
||||
};
|
||||
|
||||
combos {
|
||||
compatible = "zmk,combos";
|
||||
|
||||
combo_esc {
|
||||
timeout-ms = <50>;
|
||||
key-positions = <0 1>;
|
||||
layers = <QW_M>;
|
||||
bindings = <&kp ESC>;
|
||||
};
|
||||
};
|
||||
|
||||
keymap {
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
label = " QWERTY";
|
||||
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 SEMI
|
||||
&mt LSFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSFT FSLH
|
||||
&kp LALT &kp LCTRL < 1 RET < 2 MINUS < 2 EQUAL < 1 SPACE &kp BSPC &mo QC_B
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
label = " Lower";
|
||||
bindings = <
|
||||
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp QUOT
|
||||
&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp RSHFT
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
label = " Raise";
|
||||
bindings = <
|
||||
&kp TAB &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &kp BSLH
|
||||
&kp CAPS &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp GRAVE
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSFT TILDE
|
||||
&trans &trans &trans &trans &trans &trans &kp DEL &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
|
||||
};
|
||||
|
||||
adjust_layer {
|
||||
label = " Adjust";
|
||||
bindings = <
|
||||
|
||||
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &trans &trans &trans &trans
|
||||
&kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &trans &trans &trans &trans &trans
|
||||
&kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
|
||||
};
|
||||
|
||||
numpad_layer {
|
||||
label = " NumPad";
|
||||
bindings = <
|
||||
|
||||
&trans &none &none &none &none &kp SLASH &kp N7 &kp N8 &kp N9 &kp MINUS
|
||||
RGBON RGBTOG RGBHUI RGBSAI RGBBRI &kp ASTRK &kp N4 &kp N5 &kp N6 &kp PLUS
|
||||
RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &none &kp N1 &kp N2 &kp N3 &kp EQUAL
|
||||
&trans &trans &trans &trans &trans &kp N0 &kp DOT &none
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
|
||||
};
|
||||
|
||||
ble_layer {
|
||||
label = " BLE";
|
||||
bindings = <
|
||||
|
||||
&bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4 &bt BT0 &bt BT1 &bt BT2 &bt BT3 &bt BT4
|
||||
BOOTLDR &sys_reset &trans &trans &trans &trans &trans &trans &sys_reset BOOTLDR
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&trans &bt BT_CLR &trans &trans &trans &trans &bt BT_CLR &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_DN C_VOL_UP>;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
15
app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml
Normal file
15
app/boards/shields/leeloo_micro/leeloo_micro.zmk.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
file_format: "1"
|
||||
id: leeloo_micro
|
||||
name: Leeloo-Micro
|
||||
type: shield
|
||||
url: https://clicketysplit.ca/pages/leeloo-micro
|
||||
requires: [pro_micro]
|
||||
exposes: [i2c_oled]
|
||||
features:
|
||||
- keys
|
||||
- display
|
||||
- encoder
|
||||
- underglow
|
||||
siblings:
|
||||
- leeloo_micro_left
|
||||
- leeloo_micro_right
|
20
app/boards/shields/leeloo_micro/leeloo_micro_left.overlay
Normal file
20
app/boards/shields/leeloo_micro/leeloo_micro_left.overlay
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo_micro.dtsi"
|
||||
|
||||
&kscan0 {
|
||||
col-gpios
|
||||
= <&pro_micro 19 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 18 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 15 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 14 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 16 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
|
||||
&left_encoder {
|
||||
status = "okay";
|
||||
};
|
24
app/boards/shields/leeloo_micro/leeloo_micro_right.overlay
Normal file
24
app/boards/shields/leeloo_micro/leeloo_micro_right.overlay
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "leeloo_micro.dtsi"
|
||||
|
||||
&default_transform {
|
||||
col-offset = <5>;
|
||||
};
|
||||
|
||||
&kscan0 {
|
||||
col-gpios
|
||||
= <&pro_micro 16 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 14 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 15 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 18 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 19 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
|
||||
&right_encoder {
|
||||
status = "okay";
|
||||
};
|
13
app/boards/shields/nice_view/CMakeLists.txt
Normal file
13
app/boards/shields/nice_view/CMakeLists.txt
Normal file
|
@ -0,0 +1,13 @@
|
|||
if(CONFIG_ZMK_DISPLAY AND CONFIG_NICE_VIEW_WIDGET_STATUS)
|
||||
zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include)
|
||||
zephyr_library_sources(custom_status_screen.c)
|
||||
zephyr_library_sources(widgets/bolt.c)
|
||||
zephyr_library_sources(widgets/util.c)
|
||||
|
||||
if(NOT CONFIG_ZMK_SPLIT OR CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
|
||||
zephyr_library_sources(widgets/status.c)
|
||||
else()
|
||||
zephyr_library_sources(widgets/art.c)
|
||||
zephyr_library_sources(widgets/peripheral_status.c)
|
||||
endif()
|
||||
endif()
|
|
@ -1,21 +1,13 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
if SHIELD_NICE_VIEW
|
||||
|
||||
config ZMK_DISPLAY
|
||||
select LV_FONT_MONTSERRAT_26
|
||||
config LV_Z_VDB_SIZE
|
||||
default 100
|
||||
|
||||
if ZMK_DISPLAY
|
||||
|
||||
config SPI
|
||||
default y
|
||||
|
||||
config LS0XX
|
||||
default y
|
||||
|
||||
config ZMK_WIDGET_WPM_STATUS
|
||||
default y if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL
|
||||
config LV_Z_DPI
|
||||
default 161
|
||||
|
||||
config LV_Z_BITS_PER_PIXEL
|
||||
default 1
|
||||
|
@ -24,6 +16,37 @@ choice LV_COLOR_DEPTH
|
|||
default LV_COLOR_DEPTH_1
|
||||
endchoice
|
||||
|
||||
endif # ZMK_DISPLAY
|
||||
choice ZMK_DISPLAY_WORK_QUEUE
|
||||
default ZMK_DISPLAY_WORK_QUEUE_DEDICATED
|
||||
endchoice
|
||||
|
||||
endif
|
||||
choice ZMK_DISPLAY_STATUS_SCREEN
|
||||
default ZMK_DISPLAY_STATUS_SCREEN_CUSTOM
|
||||
endchoice
|
||||
|
||||
config ZMK_DISPLAY_STATUS_SCREEN_CUSTOM
|
||||
imply NICE_VIEW_WIDGET_STATUS
|
||||
|
||||
config NICE_VIEW_WIDGET_STATUS
|
||||
bool "Custom nice!view status widget"
|
||||
select LV_FONT_MONTSERRAT_16
|
||||
select LV_USE_IMG
|
||||
select LV_USE_CANVAS
|
||||
|
||||
config NICE_VIEW_WIDGET_INVERTED
|
||||
bool "Invert custom status widget colors"
|
||||
|
||||
if !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL
|
||||
|
||||
config NICE_VIEW_WIDGET_STATUS
|
||||
select LV_FONT_MONTSERRAT_18
|
||||
select LV_FONT_MONTSERRAT_14
|
||||
select LV_FONT_UNSCII_8
|
||||
select ZMK_WPM
|
||||
|
||||
endif # !ZMK_SPLIT || ZMK_SPLIT_ROLE_CENTRAL
|
||||
|
||||
config ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN
|
||||
select LV_FONT_MONTSERRAT_26
|
||||
|
||||
endif # SHIELD_NICE_VIEW
|
||||
|
|
|
@ -1,5 +1,15 @@
|
|||
# nice!view
|
||||
|
||||
The nice!view is a low power, high refresh rate display meant to replace I2C OLEDs traditionally used.
|
||||
The nice!view is a low-power, high refresh rate display meant to replace I2C OLEDs traditionally used.
|
||||
|
||||
This shield requires that an `&nice_view_spi` labelled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined.
|
||||
This shield requires that an `&nice_view_spi` labeled SPI bus is provided with _at least_ MOSI, SCK, and CS pins defined.
|
||||
|
||||
## Disable custom widget
|
||||
|
||||
The nice!view shield includes a custom vertical widget. To use the built-in ZMK one, add the following item to your `.conf` file:
|
||||
|
||||
```
|
||||
CONFIG_ZMK_DISPLAY_STATUS_SCREEN_BUILT_IN=y
|
||||
CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y
|
||||
CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y
|
||||
```
|
||||
|
|
28
app/boards/shields/nice_view/custom_status_screen.c
Normal file
28
app/boards/shields/nice_view/custom_status_screen.c
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include "widgets/status.h"
|
||||
|
||||
#include <zephyr/logging/log.h>
|
||||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||
|
||||
#if IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_STATUS)
|
||||
static struct zmk_widget_status status_widget;
|
||||
#endif
|
||||
|
||||
lv_obj_t *zmk_display_status_screen() {
|
||||
|
||||
lv_obj_t *screen;
|
||||
screen = lv_obj_create(NULL);
|
||||
|
||||
#if IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_STATUS)
|
||||
zmk_widget_status_init(&status_widget, screen);
|
||||
lv_obj_align(zmk_widget_status_obj(&status_widget), LV_ALIGN_TOP_LEFT, 0, 0);
|
||||
#endif
|
||||
|
||||
return screen;
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
# Enable nice!view
|
||||
CONFIG_ZMK_DISPLAY=y
|
||||
CONFIG_ZMK_LV_FONT_DEFAULT_SMALL_MONTSERRAT_26=y
|
||||
CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26=y
|
||||
# Disable idle blanking
|
||||
CONFIG_ZMK_DISPLAY_BLANK_ON_IDLE=n
|
||||
|
|
229
app/boards/shields/nice_view/widgets/art.c
Normal file
229
app/boards/shields/nice_view/widgets/art.c
Normal file
|
@ -0,0 +1,229 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 Collin Hodge
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <lvgl.h>
|
||||
|
||||
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||
#endif
|
||||
|
||||
#ifndef LV_ATTRIBUTE_IMG_BALLOON
|
||||
#define LV_ATTRIBUTE_IMG_BALLOON
|
||||
#endif
|
||||
|
||||
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BALLOON uint8_t
|
||||
balloon_map[] = {
|
||||
#if CONFIG_NICE_VIEW_WIDGET_INVERTED
|
||||
0xff, 0xff, 0xff, 0xff, /*Color of index 0*/
|
||||
0x00, 0x00, 0x00, 0xff, /*Color of index 1*/
|
||||
#else
|
||||
0x00, 0x00, 0x00, 0xff, /*Color of index 0*/
|
||||
0xff, 0xff, 0xff, 0xff, /*Color of index 1*/
|
||||
#endif
|
||||
|
||||
0xfe, 0xaa, 0x0a, 0x2a, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0xea, 0xaa, 0xae, 0xba, 0xff, 0xff,
|
||||
0xfb, 0xff, 0xf0, 0xf1, 0x55, 0x05, 0x15, 0x47, 0xff, 0xff, 0xff, 0xf5, 0xd5, 0x55, 0x5f,
|
||||
0x7f, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xa4, 0xaa, 0x8a, 0x8a, 0xa1, 0xff, 0xff, 0xfb, 0xea,
|
||||
0xaa, 0xaa, 0xbe, 0xbf, 0xef, 0xfb, 0xfb, 0xff, 0xf0, 0x54, 0x55, 0x05, 0x45, 0x54, 0xff,
|
||||
0xff, 0x7d, 0x55, 0xd5, 0x75, 0x7f, 0x7f, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0xae, 0x2a, 0x82,
|
||||
0xa0, 0xaa, 0x3f, 0xff, 0xfe, 0xaa, 0xea, 0xbb, 0xfe, 0xbf, 0xff, 0xfb, 0xfb, 0xfe, 0xf0,
|
||||
0x5f, 0x55, 0x01, 0x50, 0x54, 0x1f, 0xff, 0x7f, 0x55, 0xd5, 0x7f, 0xff, 0x7f, 0xd7, 0xff,
|
||||
0xfd, 0xfd, 0xf0, 0x2f, 0xff, 0x20, 0x28, 0x00, 0x0f, 0xff, 0xae, 0xaa, 0xaa, 0xbf, 0xff,
|
||||
0xff, 0xeb, 0xfb, 0xff, 0xff, 0xf0, 0x0e, 0x01, 0x50, 0x14, 0x00, 0x3f, 0xff, 0x57, 0x55,
|
||||
0xd5, 0x7f, 0xff, 0x7f, 0xd7, 0xfd, 0xff, 0xfd, 0xf0, 0x1e, 0x01, 0xa8, 0x0a, 0x00, 0xff,
|
||||
0xff, 0xaf, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xaf, 0xfb, 0xff, 0xff, 0xf0, 0x1f, 0xf9, 0x50,
|
||||
0x01, 0x03, 0xff, 0xff, 0x57, 0x55, 0xd5, 0x7d, 0xff, 0x7f, 0xdf, 0xfd, 0xff, 0xfd, 0xf0,
|
||||
0x9f, 0xf9, 0xa8, 0x00, 0x8f, 0xff, 0xfe, 0xaf, 0xaa, 0xaa, 0xff, 0xff, 0xfd, 0xbf, 0xfb,
|
||||
0xff, 0xfb, 0xf0, 0x5a, 0x01, 0x54, 0x00, 0x3f, 0xff, 0xff, 0x7f, 0x5d, 0xd5, 0xfd, 0xff,
|
||||
0xfd, 0xdf, 0xfd, 0xff, 0xfd, 0xf0, 0x8e, 0x01, 0xaa, 0x00, 0x7f, 0xff, 0xfe, 0xbf, 0xae,
|
||||
0xef, 0xff, 0xff, 0xfb, 0xef, 0xfb, 0xff, 0xfa, 0xf0, 0xcf, 0xff, 0xf4, 0x00, 0xf7, 0xff,
|
||||
0xff, 0x7f, 0x5d, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0xae, 0x01, 0x2a,
|
||||
0x00, 0xfb, 0xff, 0xff, 0xbf, 0xae, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfa, 0xf0,
|
||||
0xde, 0x01, 0x35, 0x01, 0xfb, 0xff, 0xff, 0x7f, 0x5d, 0xfd, 0xbf, 0xff, 0xff, 0xdf, 0xfd,
|
||||
0xff, 0xdd, 0xf0, 0xa7, 0xff, 0xea, 0x81, 0xfc, 0xff, 0x7f, 0xbe, 0xbe, 0xff, 0xe3, 0xff,
|
||||
0xff, 0xef, 0xff, 0xf9, 0x3e, 0xf0, 0x56, 0x01, 0x55, 0x41, 0xff, 0x7f, 0xff, 0xff, 0xfd,
|
||||
0xfd, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7d, 0xf0, 0xa6, 0x01, 0x2a, 0x88, 0xfe, 0xff,
|
||||
0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xfc, 0xfe, 0xf0, 0x52, 0x79, 0x15,
|
||||
0x44, 0x7d, 0xff, 0xff, 0xfd, 0x7f, 0xbd, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xf8, 0xfd, 0xf0,
|
||||
0x22, 0x69, 0x2a, 0xa0, 0x3d, 0xff, 0xff, 0xfa, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xe2, 0x48,
|
||||
0xfa, 0xff, 0xf0, 0x42, 0x59, 0x15, 0x54, 0x1b, 0xff, 0xff, 0xf7, 0xff, 0xbd, 0xf7, 0xff,
|
||||
0xff, 0x95, 0x55, 0x37, 0x7d, 0xf0, 0x02, 0x69, 0x0a, 0xa2, 0x1f, 0xfe, 0xff, 0xee, 0xff,
|
||||
0xff, 0xfc, 0xff, 0xff, 0x2a, 0x4a, 0x9f, 0xff, 0xf0, 0x03, 0xff, 0x55, 0x11, 0x4f, 0xff,
|
||||
0xff, 0x55, 0x7f, 0xfd, 0xff, 0x00, 0xfc, 0x55, 0x55, 0x4f, 0xff, 0xf0, 0x02, 0x01, 0xaa,
|
||||
0x88, 0x8f, 0xde, 0xff, 0xaa, 0xbf, 0xfe, 0xff, 0xff, 0x00, 0xa8, 0x02, 0xa7, 0xff, 0xf0,
|
||||
0x02, 0x01, 0x55, 0x55, 0x47, 0xff, 0x7f, 0xd5, 0x5f, 0xff, 0xff, 0xff, 0xc8, 0x47, 0x5c,
|
||||
0x53, 0xff, 0xf0, 0x82, 0x49, 0xaa, 0x8a, 0xa7, 0xfe, 0xff, 0xea, 0xbf, 0xff, 0xff, 0xff,
|
||||
0xb0, 0x3f, 0x5f, 0x89, 0xff, 0xf0, 0xc2, 0x49, 0x55, 0x45, 0x53, 0xff, 0xff, 0xf5, 0x5f,
|
||||
0xff, 0xff, 0xfe, 0x70, 0x7f, 0x5f, 0xe5, 0xff, 0xf0, 0xe2, 0x41, 0xa2, 0xa2, 0xab, 0xfe,
|
||||
0xfb, 0xfa, 0xaf, 0xef, 0xff, 0xf9, 0xe2, 0xbf, 0x5f, 0xfa, 0xff, 0xf0, 0xe2, 0x41, 0x51,
|
||||
0x51, 0x51, 0xff, 0x77, 0xfd, 0x57, 0xf9, 0xff, 0xe7, 0x85, 0x7f, 0x5f, 0xfc, 0xff, 0xf0,
|
||||
0xe3, 0xff, 0xf2, 0xa0, 0xa8, 0xff, 0xfb, 0xbe, 0xaf, 0xfe, 0x1e, 0x80, 0x6a, 0x80, 0x00,
|
||||
0x7e, 0xff, 0xb0, 0xe2, 0x60, 0x11, 0x50, 0x54, 0x7f, 0xff, 0xfd, 0x57, 0xff, 0xe0, 0x1f,
|
||||
0xc4, 0x15, 0x55, 0x06, 0x7f, 0x70, 0xee, 0x60, 0x18, 0xa8, 0x2a, 0x1f, 0xff, 0xfe, 0xaf,
|
||||
0xff, 0xe8, 0xf0, 0x00, 0x0a, 0x4a, 0xa8, 0x7f, 0xf0, 0xdf, 0xff, 0xf1, 0x54, 0x15, 0x43,
|
||||
0xff, 0xff, 0x5f, 0xff, 0xe8, 0x7b, 0xc0, 0x05, 0x55, 0x55, 0x7f, 0x70, 0xff, 0x81, 0x28,
|
||||
0xaa, 0x0a, 0xa1, 0xff, 0xfe, 0xbf, 0xf7, 0xea, 0x09, 0xe0, 0x0a, 0x4a, 0xaa, 0x7f, 0xf0,
|
||||
0xff, 0x81, 0x50, 0x54, 0x05, 0x54, 0x7f, 0xff, 0x7f, 0xfc, 0xe8, 0x4b, 0xc0, 0x05, 0x55,
|
||||
0x55, 0x7f, 0x70, 0xfe, 0x7f, 0x28, 0xaa, 0x00, 0xa8, 0xff, 0xfe, 0xbf, 0xff, 0x0a, 0xf0,
|
||||
0x00, 0x02, 0x4a, 0xa8, 0x7e, 0xb0, 0xfe, 0x7f, 0x14, 0x55, 0x00, 0x03, 0xff, 0xf7, 0x5f,
|
||||
0x7f, 0xe0, 0x1f, 0xc4, 0x01, 0x55, 0x06, 0x7f, 0x70, 0xff, 0x81, 0x08, 0x2a, 0x80, 0x07,
|
||||
0xff, 0xf6, 0xaf, 0xff, 0xfe, 0x80, 0x6a, 0x80, 0x00, 0x7e, 0xff, 0xb0, 0x7f, 0x81, 0x14,
|
||||
0x55, 0x40, 0x0f, 0xff, 0xed, 0x57, 0x7f, 0xff, 0xe7, 0x85, 0x55, 0x5f, 0xfc, 0xff, 0x70,
|
||||
0xbf, 0xff, 0xe8, 0x2a, 0xa8, 0x1f, 0xff, 0xf6, 0xae, 0xff, 0xff, 0xf9, 0xea, 0xaa, 0x5f,
|
||||
0xfa, 0xff, 0xf0, 0x5e, 0x01, 0x24, 0x15, 0x54, 0x3f, 0xff, 0xf5, 0x57, 0x7f, 0xfb, 0xfe,
|
||||
0xf0, 0x55, 0x5f, 0xe5, 0xff, 0x70, 0xbe, 0x01, 0x22, 0x2a, 0xa0, 0xff, 0xff, 0xba, 0xae,
|
||||
0xff, 0xfe, 0x1f, 0x30, 0x2a, 0x0f, 0x89, 0xbf, 0xf0, 0x5f, 0xff, 0xe5, 0x15, 0x41, 0xff,
|
||||
0xff, 0xd5, 0x57, 0x7f, 0xff, 0xe0, 0x48, 0x05, 0x54, 0x53, 0xff, 0xf0, 0xbe, 0x01, 0xa2,
|
||||
0x02, 0x03, 0xff, 0xff, 0xea, 0xaa, 0xbf, 0xff, 0xff, 0x80, 0x00, 0x02, 0xa7, 0xbf, 0xf0,
|
||||
0x5e, 0x01, 0x41, 0x00, 0x06, 0xfd, 0xff, 0xd5, 0x55, 0x5f, 0xff, 0xff, 0xfc, 0x00, 0x40,
|
||||
0x4f, 0xff, 0xf0, 0xbe, 0x49, 0x20, 0x80, 0x0f, 0x7f, 0xfe, 0xea, 0xaa, 0xbe, 0xff, 0xff,
|
||||
0xff, 0x00, 0x00, 0x1f, 0xbf, 0xf0, 0x7e, 0x49, 0x50, 0x00, 0x0f, 0x7f, 0xff, 0xd5, 0x55,
|
||||
0x5f, 0x83, 0xff, 0xff, 0x80, 0x40, 0x3f, 0xff, 0xf0, 0xfe, 0x41, 0x28, 0x00, 0x0f, 0xbf,
|
||||
0xff, 0xeb, 0xaa, 0xbf, 0xfc, 0x00, 0x03, 0xe0, 0x00, 0xff, 0xbf, 0xf0, 0xfe, 0x41, 0x14,
|
||||
0x00, 0x1f, 0xdf, 0xff, 0xd5, 0xd5, 0x57, 0xff, 0xff, 0xfc, 0x00, 0x07, 0xff, 0xdf, 0xf0,
|
||||
0xff, 0xff, 0x08, 0x00, 0x1f, 0x3f, 0xdf, 0xeb, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xbf, 0xf0, 0xfe, 0x01, 0x14, 0x40, 0x3e, 0xff, 0xbf, 0xf5, 0x55, 0x57, 0xdf, 0xff,
|
||||
0xf9, 0xff, 0xff, 0xff, 0xdf, 0xf0, 0xfe, 0x01, 0x0a, 0x20, 0x3f, 0xff, 0xdf, 0xfa, 0xaa,
|
||||
0xab, 0xbf, 0xff, 0xf3, 0xff, 0xff, 0xdf, 0xbf, 0xf0, 0xde, 0x7f, 0x05, 0x10, 0x7f, 0xff,
|
||||
0xff, 0xfd, 0x55, 0x55, 0xdf, 0xff, 0xe4, 0xff, 0xff, 0xbf, 0x7f, 0xf0, 0xee, 0x7e, 0x02,
|
||||
0x88, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xab, 0xbf, 0xff, 0xe3, 0xff, 0xbf, 0xbf, 0xbf, 0xf0,
|
||||
0xde, 0x05, 0x41, 0x54, 0x3f, 0xff, 0xff, 0xdd, 0x55, 0x55, 0xff, 0xff, 0xd7, 0xff, 0xdf,
|
||||
0x7f, 0x7f, 0xf0, 0xee, 0x06, 0xa2, 0xaa, 0x3f, 0xff, 0xff, 0xbe, 0xaa, 0xab, 0xbf, 0xff,
|
||||
0xf7, 0xff, 0xbf, 0x3f, 0xbf, 0xf0, 0xde, 0x7d, 0x55, 0x55, 0x1f, 0xfb, 0xff, 0xff, 0x55,
|
||||
0x55, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xf0, 0xfe, 0x7f, 0xaa, 0xaa, 0x8f, 0xff,
|
||||
0xff, 0xba, 0xaa, 0xab, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xdf, 0xbf, 0xf0, 0xfe, 0x01, 0x55,
|
||||
0x55, 0x47, 0xff, 0xff, 0xf7, 0xd5, 0x57, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
|
||||
0xfe, 0x01, 0xaa, 0xaa, 0xa1, 0xff, 0xff, 0xbf, 0xea, 0xab, 0xff, 0xff, 0xff, 0xff, 0xbf,
|
||||
0xff, 0xff, 0xf0, 0xff, 0xff, 0x55, 0x55, 0x54, 0xff, 0xff, 0x5f, 0xf5, 0x57, 0xff, 0xfd,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xda, 0xaa, 0xaa, 0xaa, 0x7f, 0xff, 0xbf, 0xfa,
|
||||
0xab, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0x9d, 0x55, 0x55, 0x00, 0xff,
|
||||
0xff, 0x7f, 0xfd, 0x57, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xbf, 0xa2,
|
||||
0xa8, 0x03, 0xff, 0xfb, 0xbf, 0xfa, 0xaa, 0xbf, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf0,
|
||||
0xff, 0x3f, 0xc0, 0x00, 0x07, 0xff, 0xff, 0x5f, 0xfd, 0x57, 0x57, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xf0, 0xff, 0x3f, 0x80, 0x00, 0x0f, 0xff, 0xfb, 0xaf, 0xfe, 0xae, 0xaa, 0xfb,
|
||||
0xff, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0xf6, 0x7f, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0x57, 0xfd,
|
||||
0x55, 0x55, 0x77, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf0,
|
||||
};
|
||||
|
||||
const lv_img_dsc_t balloon = {
|
||||
.header.cf = LV_IMG_CF_INDEXED_1BIT,
|
||||
.header.always_zero = 0,
|
||||
.header.reserved = 0,
|
||||
.header.w = 140,
|
||||
.header.h = 68,
|
||||
.data_size = 1232,
|
||||
.data = balloon_map,
|
||||
};
|
||||
|
||||
#ifndef LV_ATTRIBUTE_IMG_MOUNTAIN
|
||||
#define LV_ATTRIBUTE_IMG_MOUNTAIN
|
||||
#endif
|
||||
|
||||
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MOUNTAIN uint8_t
|
||||
mountain_map[] = {
|
||||
#if CONFIG_NICE_VIEW_WIDGET_INVERTED
|
||||
0xff, 0xff, 0xff, 0xff, /*Color of index 0*/
|
||||
0x00, 0x00, 0x00, 0xff, /*Color of index 1*/
|
||||
#else
|
||||
0x00, 0x00, 0x00, 0xff, /*Color of index 0*/
|
||||
0xff, 0xff, 0xff, 0xff, /*Color of index 1*/
|
||||
#endif
|
||||
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00,
|
||||
0x00, 0x00, 0x00, 0x90, 0x00, 0x30, 0x80, 0x00, 0x00, 0x00, 0x00, 0x5f, 0xa0, 0x00, 0x00,
|
||||
0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x10, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xf4, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x10, 0x80, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x01, 0xfe, 0x03, 0xe0, 0x0f, 0x9e, 0x01, 0x90,
|
||||
0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0xff, 0x07, 0xe0, 0x1f,
|
||||
0x9e, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x7f,
|
||||
0x8f, 0xe0, 0x1f, 0xbe, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0,
|
||||
0x00, 0x00, 0x3f, 0xcf, 0xf0, 0x1f, 0xbc, 0x00, 0x90, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xfe, 0x00, 0x00, 0x3f, 0xcf, 0xf0, 0x3f, 0xbc, 0x00, 0x90, 0x80, 0x7f, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x1f, 0xe7, 0xf0, 0x7f, 0x3c, 0x00, 0x90,
|
||||
0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x80, 0x00, 0x00, 0x0f, 0xe7, 0xf8, 0x7f,
|
||||
0x78, 0x01, 0xb0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00, 0x07,
|
||||
0xf3, 0xf8, 0x3f, 0x78, 0x03, 0xd0, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xc0, 0x00,
|
||||
0x00, 0x00, 0x07, 0xfb, 0xf8, 0x3f, 0xf8, 0x0f, 0x90, 0xc0, 0x1f, 0xff, 0xff, 0xff, 0xff,
|
||||
0xec, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfd, 0xfc, 0x3f, 0xf8, 0x0f, 0x10, 0xc0, 0x1e, 0xff,
|
||||
0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x3f, 0xf0, 0x0e, 0x10,
|
||||
0xc0, 0x0c, 0x27, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x7f,
|
||||
0xf0, 0x1e, 0x30, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x7f, 0xfe, 0x7f, 0xf3, 0xfc, 0x50, 0xe0, 0x00, 0x3f, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x7f, 0xfe, 0x7f, 0xf7, 0xf8, 0x90, 0xe0, 0x00, 0x7f, 0xfe, 0xb0, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0x7f, 0xe7, 0xf1, 0x90, 0xe0, 0x00, 0x7f,
|
||||
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x7f, 0xef, 0xe3, 0x90,
|
||||
0xf0, 0x00, 0x7f, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0x7f,
|
||||
0xff, 0xe7, 0x90, 0xb0, 0x10, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x03, 0xff, 0xbf, 0xff, 0xcf, 0x90, 0xf0, 0x30, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01, 0xff, 0xf9, 0xff, 0x9f, 0x90, 0xb0, 0x30, 0xff, 0xff, 0xff, 0xf2,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xf6, 0xff, 0x3e, 0x90, 0xf8, 0x70, 0xff,
|
||||
0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xf6, 0xfe, 0x7c, 0x90,
|
||||
0xf8, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf9,
|
||||
0xfe, 0xf8, 0x90, 0xa8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x03, 0xff, 0xfd, 0xf3, 0x90, 0xdc, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xef, 0x90, 0xf5, 0xac, 0xff, 0xff, 0xff, 0xfe,
|
||||
0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x90, 0xff, 0xd6, 0x7f,
|
||||
0xff, 0xff, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x90,
|
||||
0xff, 0xfa, 0x7f, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
|
||||
0xff, 0xff, 0x90, 0xdd, 0xff, 0x7f, 0xff, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x0f, 0xff, 0xff, 0xf0, 0xea, 0xbf, 0x3f, 0xff, 0xa0, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf0, 0x10, 0xff, 0x4f, 0xbf, 0xf5, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x00, 0x10, 0xff, 0xff, 0x9f,
|
||||
0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf0,
|
||||
0xff, 0xb0, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
|
||||
0xff, 0xff, 0x90, 0xcd, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x02, 0x1f, 0xff, 0xff, 0x90, 0xb2, 0xe0, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x0c, 0x7f, 0xff, 0xff, 0x90, 0xff, 0xc0, 0x3f, 0x40, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xff, 0xff, 0xff, 0x90, 0xfe, 0xc0, 0x7f,
|
||||
0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf1, 0xff, 0xff, 0x7c, 0x90,
|
||||
0xfd, 0x80, 0xff, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc3, 0xff,
|
||||
0xff, 0xb8, 0x90, 0xff, 0x80, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3f, 0x87, 0xff, 0xff, 0xc8, 0x90, 0x9f, 0x01, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x7f, 0x1f, 0xff, 0xff, 0xe0, 0x90, 0x86, 0x01, 0xff, 0xff, 0xd0, 0x00,
|
||||
0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x3f, 0xff, 0xff, 0xe0, 0x90, 0x80, 0x01, 0xff,
|
||||
0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x06, 0x19, 0x83, 0xfe, 0x7f, 0xff, 0xff, 0xf0, 0x90,
|
||||
0x80, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x7f, 0xc7, 0xee, 0x7f, 0xff,
|
||||
0xff, 0xf8, 0x90, 0x80, 0x1a, 0xbf, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x98, 0xff, 0xff,
|
||||
0xc6, 0x7f, 0xff, 0xff, 0xfc, 0x90, 0x80, 0x3f, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
|
||||
0xf1, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xfe, 0x90, 0x80, 0x3f, 0xf8, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x07, 0xe3, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0x90, 0x80, 0x7f, 0xfe,
|
||||
0x80, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xc7, 0xff, 0xfe, 0x18, 0xff, 0xef, 0xff, 0xff, 0x90,
|
||||
0x80, 0x7f, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x8f, 0xff, 0xfc, 0x7f, 0xff, 0xef,
|
||||
0xfd, 0xff, 0x90, 0x80, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x9f, 0xff, 0xf8,
|
||||
0xff, 0xff, 0xef, 0xfc, 0xf7, 0x90, 0x80, 0xff, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x3f,
|
||||
0x1f, 0xff, 0xf1, 0xff, 0xff, 0xcf, 0xfc, 0xe1, 0x90, 0x80, 0xff, 0xff, 0xff, 0xf4, 0x00,
|
||||
0x00, 0x00, 0x7f, 0x3f, 0xff, 0xe3, 0xff, 0xff, 0xcf, 0xfe, 0x60, 0x90, 0x81, 0xff, 0xff,
|
||||
0xff, 0xfe, 0x80, 0x00, 0x00, 0x7f, 0x3f, 0xff, 0xc7, 0xff, 0xff, 0xdf, 0xfe, 0x40, 0x90,
|
||||
0x81, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x01, 0xfe, 0x3f, 0xff, 0xcf, 0xbf, 0xff, 0xdf,
|
||||
0xfe, 0x00, 0x90, 0x81, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x07, 0xfe, 0x7f, 0xff, 0x8f,
|
||||
0x7f, 0xff, 0x9f, 0xfe, 0x00, 0x90, 0x80, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x1f, 0xfe,
|
||||
0x7f, 0xff, 0x1e, 0xff, 0xff, 0x91, 0xfe, 0x00, 0x90, 0x80, 0xff, 0xff, 0xfe, 0xc0, 0x00,
|
||||
0x00, 0x3f, 0xfc, 0x7f, 0xfe, 0x3c, 0xff, 0xff, 0x81, 0xff, 0x00, 0x90, 0x80, 0x7f, 0xff,
|
||||
0xec, 0x00, 0x00, 0x3c, 0xff, 0xf8, 0xff, 0xfc, 0x79, 0xfd, 0xff, 0x80, 0xff, 0x00, 0x90,
|
||||
0x80, 0x27, 0xff, 0x80, 0x00, 0x00, 0x7f, 0xff, 0xf9, 0xff, 0xfc, 0xf3, 0xfb, 0xff, 0x00,
|
||||
0xff, 0x00, 0x90, 0x80, 0x5f, 0xff, 0xd8, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xff, 0xc8, 0xe7,
|
||||
0xf3, 0xff, 0x00, 0x7f, 0x00, 0x90, 0x80, 0xff, 0xff, 0xfd, 0x80, 0x01, 0xff, 0xff, 0xe3,
|
||||
0xff, 0x81, 0xcf, 0xf7, 0xff, 0x00, 0x7f, 0x00, 0x90, 0x80, 0xff, 0xff, 0xff, 0xd8, 0x03,
|
||||
0xff, 0xff, 0x87, 0xff, 0x03, 0x8f, 0xe7, 0xff, 0x00, 0x3f, 0x81, 0x90, 0x81, 0xff, 0xff,
|
||||
0xff, 0xfe, 0x83, 0xff, 0xfe, 0x0f, 0xfe, 0x3f, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0x10,
|
||||
0x80, 0x00, 0x00, 0x00, 0x2f, 0xc6, 0x00, 0x00, 0x38, 0x00, 0x60, 0x00, 0x48, 0x00, 0x00,
|
||||
0x00, 0x00, 0x10, 0xc0, 0x00, 0x00, 0x00, 0x17, 0xf4, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x00,
|
||||
0x88, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0,
|
||||
};
|
||||
|
||||
const lv_img_dsc_t mountain = {
|
||||
.header.cf = LV_IMG_CF_INDEXED_1BIT,
|
||||
.header.always_zero = 0,
|
||||
.header.reserved = 0,
|
||||
.header.w = 140,
|
||||
.header.h = 68,
|
||||
.data_size = 1232,
|
||||
.data = mountain_map,
|
||||
};
|
45
app/boards/shields/nice_view/widgets/bolt.c
Normal file
45
app/boards/shields/nice_view/widgets/bolt.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <lvgl.h>
|
||||
|
||||
#ifndef LV_ATTRIBUTE_MEM_ALIGN
|
||||
#define LV_ATTRIBUTE_MEM_ALIGN
|
||||
#endif
|
||||
|
||||
#ifndef LV_ATTRIBUTE_IMG_BOLT
|
||||
#define LV_ATTRIBUTE_IMG_BOLT
|
||||
#endif
|
||||
|
||||
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_BOLT uint8_t bolt_map[] = {
|
||||
#if CONFIG_NICE_VIEW_WIDGET_INVERTED
|
||||
0x00, 0x00, 0x00, 0x00, /*Color of index 0*/
|
||||
0x00, 0x00, 0x00, 0xff, /*Color of index 1*/
|
||||
0xff, 0xff, 0xff, 0xff, /*Color of index 2*/
|
||||
0x00, 0x00, 0x00, 0x00, /*Color of index 3*/
|
||||
#else
|
||||
0x00, 0x00, 0x00, 0x00, /*Color of index 0*/
|
||||
0xff, 0xff, 0xff, 0xff, /*Color of index 1*/
|
||||
0x00, 0x00, 0x00, 0xff, /*Color of index 2*/
|
||||
0x00, 0x00, 0x00, 0x00, /*Color of index 3*/
|
||||
#endif
|
||||
|
||||
0x00, 0x14, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00, 0x01, 0xa4, 0x00, 0x01, 0xa4,
|
||||
0x00, 0x06, 0xa4, 0x00, 0x06, 0xa4, 0x00, 0x1a, 0xa5, 0x54, 0x1a, 0xaa, 0xa4, 0x6a,
|
||||
0xaa, 0x90, 0x55, 0x6a, 0x90, 0x00, 0x6a, 0x40, 0x00, 0x6a, 0x40, 0x00, 0x69, 0x00,
|
||||
0x00, 0x69, 0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x00, 0x00, 0x50, 0x00,
|
||||
};
|
||||
|
||||
const lv_img_dsc_t bolt = {
|
||||
.header.cf = LV_IMG_CF_INDEXED_2BIT,
|
||||
.header.always_zero = 0,
|
||||
.header.reserved = 0,
|
||||
.header.w = 11,
|
||||
.header.h = 18,
|
||||
.data_size = 70,
|
||||
.data = bolt_map,
|
||||
};
|
128
app/boards/shields/nice_view/widgets/peripheral_status.c
Normal file
128
app/boards/shields/nice_view/widgets/peripheral_status.c
Normal file
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/bluetooth/services/bas.h>
|
||||
#include <zephyr/random/rand32.h>
|
||||
|
||||
#include <zephyr/logging/log.h>
|
||||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||
|
||||
#include <zmk/display.h>
|
||||
#include "peripheral_status.h"
|
||||
#include <zmk/events/usb_conn_state_changed.h>
|
||||
#include <zmk/event_manager.h>
|
||||
#include <zmk/events/battery_state_changed.h>
|
||||
#include <zmk/split/bluetooth/peripheral.h>
|
||||
#include <zmk/events/split_peripheral_status_changed.h>
|
||||
#include <zmk/usb.h>
|
||||
#include <zmk/ble.h>
|
||||
|
||||
LV_IMG_DECLARE(balloon);
|
||||
LV_IMG_DECLARE(mountain);
|
||||
|
||||
static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets);
|
||||
|
||||
struct peripheral_status_state {
|
||||
bool connected;
|
||||
};
|
||||
|
||||
static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) {
|
||||
lv_obj_t *canvas = lv_obj_get_child(widget, 0);
|
||||
|
||||
lv_draw_label_dsc_t label_dsc;
|
||||
init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_16, LV_TEXT_ALIGN_RIGHT);
|
||||
lv_draw_rect_dsc_t rect_black_dsc;
|
||||
init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND);
|
||||
|
||||
// Fill background
|
||||
lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc);
|
||||
|
||||
// Draw battery
|
||||
draw_battery(canvas, state);
|
||||
|
||||
// Draw output status
|
||||
lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc,
|
||||
state.connected ? LV_SYMBOL_WIFI : LV_SYMBOL_CLOSE);
|
||||
|
||||
// Rotate canvas
|
||||
rotate_canvas(canvas, cbuf);
|
||||
}
|
||||
|
||||
static void set_battery_status(struct zmk_widget_status *widget,
|
||||
struct battery_status_state state) {
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
widget->state.charging = state.usb_present;
|
||||
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */
|
||||
|
||||
widget->state.battery = state.level;
|
||||
|
||||
draw_top(widget->obj, widget->cbuf, widget->state);
|
||||
}
|
||||
|
||||
static void battery_status_update_cb(struct battery_status_state state) {
|
||||
struct zmk_widget_status *widget;
|
||||
SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_status(widget, state); }
|
||||
}
|
||||
|
||||
static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) {
|
||||
return (struct battery_status_state) {
|
||||
.level = bt_bas_get_battery_level(),
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
.usb_present = zmk_usb_is_powered(),
|
||||
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */
|
||||
};
|
||||
}
|
||||
|
||||
ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state,
|
||||
battery_status_update_cb, battery_status_get_state)
|
||||
|
||||
ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed);
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed);
|
||||
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */
|
||||
|
||||
static struct peripheral_status_state get_state(const zmk_event_t *_eh) {
|
||||
return (struct peripheral_status_state){.connected = zmk_split_bt_peripheral_is_connected()};
|
||||
}
|
||||
|
||||
static void set_connection_status(struct zmk_widget_status *widget,
|
||||
struct peripheral_status_state state) {
|
||||
widget->state.connected = state.connected;
|
||||
|
||||
draw_top(widget->obj, widget->cbuf, widget->state);
|
||||
}
|
||||
|
||||
static void output_status_update_cb(struct peripheral_status_state state) {
|
||||
struct zmk_widget_status *widget;
|
||||
SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_connection_status(widget, state); }
|
||||
}
|
||||
|
||||
ZMK_DISPLAY_WIDGET_LISTENER(widget_peripheral_status, struct peripheral_status_state,
|
||||
output_status_update_cb, get_state)
|
||||
ZMK_SUBSCRIPTION(widget_peripheral_status, zmk_split_peripheral_status_changed);
|
||||
|
||||
int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) {
|
||||
widget->obj = lv_obj_create(parent);
|
||||
lv_obj_set_size(widget->obj, 160, 68);
|
||||
lv_obj_t *top = lv_canvas_create(widget->obj);
|
||||
lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0);
|
||||
lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR);
|
||||
|
||||
lv_obj_t *art = lv_img_create(widget->obj);
|
||||
bool random = sys_rand32_get() & 1;
|
||||
lv_img_set_src(art, random ? &balloon : &mountain);
|
||||
lv_obj_align(art, LV_ALIGN_TOP_LEFT, 0, 0);
|
||||
|
||||
sys_slist_append(&widgets, &widget->node);
|
||||
widget_battery_status_init();
|
||||
widget_peripheral_status_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget) { return widget->obj; }
|
22
app/boards/shields/nice_view/widgets/peripheral_status.h
Normal file
22
app/boards/shields/nice_view/widgets/peripheral_status.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <lvgl.h>
|
||||
#include <zephyr/kernel.h>
|
||||
#include "util.h"
|
||||
|
||||
struct zmk_widget_status {
|
||||
sys_snode_t node;
|
||||
lv_obj_t *obj;
|
||||
lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE];
|
||||
struct status_state state;
|
||||
};
|
||||
|
||||
int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent);
|
||||
lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget);
|
330
app/boards/shields/nice_view/widgets/status.c
Normal file
330
app/boards/shields/nice_view/widgets/status.c
Normal file
|
@ -0,0 +1,330 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/bluetooth/services/bas.h>
|
||||
|
||||
#include <zephyr/logging/log.h>
|
||||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||
|
||||
#include <zmk/display.h>
|
||||
#include "status.h"
|
||||
#include <zmk/events/usb_conn_state_changed.h>
|
||||
#include <zmk/event_manager.h>
|
||||
#include <zmk/events/battery_state_changed.h>
|
||||
#include <zmk/events/ble_active_profile_changed.h>
|
||||
#include <zmk/events/endpoint_selection_changed.h>
|
||||
#include <zmk/events/wpm_state_changed.h>
|
||||
#include <zmk/events/layer_state_changed.h>
|
||||
#include <zmk/usb.h>
|
||||
#include <zmk/ble.h>
|
||||
#include <zmk/endpoints.h>
|
||||
#include <zmk/keymap.h>
|
||||
#include <zmk/wpm.h>
|
||||
|
||||
static sys_slist_t widgets = SYS_SLIST_STATIC_INIT(&widgets);
|
||||
|
||||
struct output_status_state {
|
||||
enum zmk_endpoint selected_endpoint;
|
||||
bool active_profile_connected;
|
||||
bool active_profile_bonded;
|
||||
uint8_t active_profile_index;
|
||||
};
|
||||
|
||||
struct layer_status_state {
|
||||
uint8_t index;
|
||||
const char *label;
|
||||
};
|
||||
|
||||
struct wpm_status_state {
|
||||
uint8_t wpm;
|
||||
};
|
||||
|
||||
static void draw_top(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) {
|
||||
lv_obj_t *canvas = lv_obj_get_child(widget, 0);
|
||||
|
||||
lv_draw_label_dsc_t label_dsc;
|
||||
init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_16, LV_TEXT_ALIGN_RIGHT);
|
||||
lv_draw_label_dsc_t label_dsc_wpm;
|
||||
init_label_dsc(&label_dsc_wpm, LVGL_FOREGROUND, &lv_font_unscii_8, LV_TEXT_ALIGN_RIGHT);
|
||||
lv_draw_rect_dsc_t rect_black_dsc;
|
||||
init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND);
|
||||
lv_draw_rect_dsc_t rect_white_dsc;
|
||||
init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND);
|
||||
lv_draw_line_dsc_t line_dsc;
|
||||
init_line_dsc(&line_dsc, LVGL_FOREGROUND, 1);
|
||||
|
||||
// Fill background
|
||||
lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc);
|
||||
|
||||
// Draw battery
|
||||
draw_battery(canvas, state);
|
||||
|
||||
// Draw output status
|
||||
char output_text[10] = {};
|
||||
|
||||
switch (state.selected_endpoint) {
|
||||
case ZMK_ENDPOINT_USB:
|
||||
strcat(output_text, LV_SYMBOL_USB);
|
||||
break;
|
||||
case ZMK_ENDPOINT_BLE:
|
||||
if (state.active_profile_bonded) {
|
||||
if (state.active_profile_connected) {
|
||||
strcat(output_text, LV_SYMBOL_WIFI);
|
||||
} else {
|
||||
strcat(output_text, LV_SYMBOL_CLOSE);
|
||||
}
|
||||
} else {
|
||||
strcat(output_text, LV_SYMBOL_SETTINGS);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
lv_canvas_draw_text(canvas, 0, 0, CANVAS_SIZE, &label_dsc, output_text);
|
||||
|
||||
// Draw WPM
|
||||
lv_canvas_draw_rect(canvas, 0, 21, 68, 42, &rect_white_dsc);
|
||||
lv_canvas_draw_rect(canvas, 1, 22, 66, 40, &rect_black_dsc);
|
||||
|
||||
char wpm_text[6] = {};
|
||||
snprintf(wpm_text, sizeof(wpm_text), "%d", state.wpm[9]);
|
||||
lv_canvas_draw_text(canvas, 42, 52, 24, &label_dsc_wpm, wpm_text);
|
||||
|
||||
int max = 0;
|
||||
int min = 256;
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (state.wpm[i] > max) {
|
||||
max = state.wpm[i];
|
||||
}
|
||||
if (state.wpm[i] < min) {
|
||||
min = state.wpm[i];
|
||||
}
|
||||
}
|
||||
|
||||
int range = max - min;
|
||||
if (range == 0) {
|
||||
range = 1;
|
||||
}
|
||||
|
||||
lv_point_t points[10];
|
||||
for (int i = 0; i < 10; i++) {
|
||||
points[i].x = 2 + i * 7;
|
||||
points[i].y = 60 - (state.wpm[i] - min) * 36 / range;
|
||||
}
|
||||
lv_canvas_draw_line(canvas, points, 10, &line_dsc);
|
||||
|
||||
// Rotate canvas
|
||||
rotate_canvas(canvas, cbuf);
|
||||
}
|
||||
|
||||
static void draw_middle(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) {
|
||||
lv_obj_t *canvas = lv_obj_get_child(widget, 1);
|
||||
|
||||
lv_draw_rect_dsc_t rect_black_dsc;
|
||||
init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND);
|
||||
lv_draw_rect_dsc_t rect_white_dsc;
|
||||
init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND);
|
||||
lv_draw_arc_dsc_t arc_dsc;
|
||||
init_arc_dsc(&arc_dsc, LVGL_FOREGROUND, 2);
|
||||
lv_draw_arc_dsc_t arc_dsc_filled;
|
||||
init_arc_dsc(&arc_dsc_filled, LVGL_FOREGROUND, 9);
|
||||
lv_draw_label_dsc_t label_dsc;
|
||||
init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER);
|
||||
lv_draw_label_dsc_t label_dsc_black;
|
||||
init_label_dsc(&label_dsc_black, LVGL_BACKGROUND, &lv_font_montserrat_18, LV_TEXT_ALIGN_CENTER);
|
||||
|
||||
// Fill background
|
||||
lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc);
|
||||
|
||||
// Draw circles
|
||||
int circle_offsets[5][2] = {
|
||||
{13, 13}, {55, 13}, {34, 34}, {13, 55}, {55, 55},
|
||||
};
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
bool selected = state.active_profile_index == i;
|
||||
|
||||
lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 13, 0, 359,
|
||||
&arc_dsc);
|
||||
|
||||
if (selected) {
|
||||
lv_canvas_draw_arc(canvas, circle_offsets[i][0], circle_offsets[i][1], 9, 0, 359,
|
||||
&arc_dsc_filled);
|
||||
}
|
||||
|
||||
char label[2];
|
||||
snprintf(label, sizeof(label), "%d", i + 1);
|
||||
lv_canvas_draw_text(canvas, circle_offsets[i][0] - 8, circle_offsets[i][1] - 10, 16,
|
||||
(selected ? &label_dsc_black : &label_dsc), label);
|
||||
}
|
||||
|
||||
// Rotate canvas
|
||||
rotate_canvas(canvas, cbuf);
|
||||
}
|
||||
|
||||
static void draw_bottom(lv_obj_t *widget, lv_color_t cbuf[], struct status_state state) {
|
||||
lv_obj_t *canvas = lv_obj_get_child(widget, 2);
|
||||
|
||||
lv_draw_rect_dsc_t rect_black_dsc;
|
||||
init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND);
|
||||
lv_draw_label_dsc_t label_dsc;
|
||||
init_label_dsc(&label_dsc, LVGL_FOREGROUND, &lv_font_montserrat_14, LV_TEXT_ALIGN_CENTER);
|
||||
|
||||
// Fill background
|
||||
lv_canvas_draw_rect(canvas, 0, 0, CANVAS_SIZE, CANVAS_SIZE, &rect_black_dsc);
|
||||
|
||||
// Draw layer
|
||||
if (state.layer_label == NULL) {
|
||||
char text[9] = {};
|
||||
|
||||
sprintf(text, "LAYER %i", state.layer_index);
|
||||
|
||||
lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, text);
|
||||
} else {
|
||||
lv_canvas_draw_text(canvas, 0, 5, 68, &label_dsc, state.layer_label);
|
||||
}
|
||||
|
||||
// Rotate canvas
|
||||
rotate_canvas(canvas, cbuf);
|
||||
}
|
||||
|
||||
static void set_battery_status(struct zmk_widget_status *widget,
|
||||
struct battery_status_state state) {
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
widget->state.charging = state.usb_present;
|
||||
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */
|
||||
|
||||
widget->state.battery = state.level;
|
||||
|
||||
draw_top(widget->obj, widget->cbuf, widget->state);
|
||||
}
|
||||
|
||||
static void battery_status_update_cb(struct battery_status_state state) {
|
||||
struct zmk_widget_status *widget;
|
||||
SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_battery_status(widget, state); }
|
||||
}
|
||||
|
||||
static struct battery_status_state battery_status_get_state(const zmk_event_t *eh) {
|
||||
return (struct battery_status_state) {
|
||||
.level = bt_bas_get_battery_level(),
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
.usb_present = zmk_usb_is_powered(),
|
||||
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */
|
||||
};
|
||||
}
|
||||
|
||||
ZMK_DISPLAY_WIDGET_LISTENER(widget_battery_status, struct battery_status_state,
|
||||
battery_status_update_cb, battery_status_get_state)
|
||||
|
||||
ZMK_SUBSCRIPTION(widget_battery_status, zmk_battery_state_changed);
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
ZMK_SUBSCRIPTION(widget_battery_status, zmk_usb_conn_state_changed);
|
||||
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK) */
|
||||
|
||||
static void set_output_status(struct zmk_widget_status *widget, struct output_status_state state) {
|
||||
widget->state.selected_endpoint = state.selected_endpoint;
|
||||
widget->state.active_profile_connected = state.active_profile_connected;
|
||||
widget->state.active_profile_bonded = state.active_profile_bonded;
|
||||
widget->state.active_profile_index = state.active_profile_index;
|
||||
|
||||
draw_top(widget->obj, widget->cbuf, widget->state);
|
||||
draw_middle(widget->obj, widget->cbuf2, widget->state);
|
||||
}
|
||||
|
||||
static void output_status_update_cb(struct output_status_state state) {
|
||||
struct zmk_widget_status *widget;
|
||||
SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_output_status(widget, state); }
|
||||
}
|
||||
|
||||
static struct output_status_state output_status_get_state(const zmk_event_t *_eh) {
|
||||
return (struct output_status_state){.selected_endpoint = zmk_endpoints_selected(),
|
||||
.active_profile_connected =
|
||||
zmk_ble_active_profile_is_connected(),
|
||||
.active_profile_bonded = !zmk_ble_active_profile_is_open(),
|
||||
.active_profile_index = zmk_ble_active_profile_index()};
|
||||
;
|
||||
}
|
||||
|
||||
ZMK_DISPLAY_WIDGET_LISTENER(widget_output_status, struct output_status_state,
|
||||
output_status_update_cb, output_status_get_state)
|
||||
ZMK_SUBSCRIPTION(widget_output_status, zmk_endpoint_selection_changed);
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
ZMK_SUBSCRIPTION(widget_output_status, zmk_usb_conn_state_changed);
|
||||
#endif
|
||||
#if defined(CONFIG_ZMK_BLE)
|
||||
ZMK_SUBSCRIPTION(widget_output_status, zmk_ble_active_profile_changed);
|
||||
#endif
|
||||
|
||||
static void set_layer_status(struct zmk_widget_status *widget, struct layer_status_state state) {
|
||||
widget->state.layer_index = state.index;
|
||||
widget->state.layer_label = state.label;
|
||||
|
||||
draw_bottom(widget->obj, widget->cbuf3, widget->state);
|
||||
}
|
||||
|
||||
static void layer_status_update_cb(struct layer_status_state state) {
|
||||
struct zmk_widget_status *widget;
|
||||
SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_layer_status(widget, state); }
|
||||
}
|
||||
|
||||
static struct layer_status_state layer_status_get_state(const zmk_event_t *eh) {
|
||||
uint8_t index = zmk_keymap_highest_layer_active();
|
||||
return (struct layer_status_state){.index = index, .label = zmk_keymap_layer_label(index)};
|
||||
}
|
||||
|
||||
ZMK_DISPLAY_WIDGET_LISTENER(widget_layer_status, struct layer_status_state, layer_status_update_cb,
|
||||
layer_status_get_state)
|
||||
|
||||
ZMK_SUBSCRIPTION(widget_layer_status, zmk_layer_state_changed);
|
||||
|
||||
static void set_wpm_status(struct zmk_widget_status *widget, struct wpm_status_state state) {
|
||||
for (int i = 0; i < 9; i++) {
|
||||
widget->state.wpm[i] = widget->state.wpm[i + 1];
|
||||
}
|
||||
widget->state.wpm[9] = state.wpm;
|
||||
|
||||
draw_top(widget->obj, widget->cbuf, widget->state);
|
||||
}
|
||||
|
||||
static void wpm_status_update_cb(struct wpm_status_state state) {
|
||||
struct zmk_widget_status *widget;
|
||||
SYS_SLIST_FOR_EACH_CONTAINER(&widgets, widget, node) { set_wpm_status(widget, state); }
|
||||
}
|
||||
|
||||
struct wpm_status_state wpm_status_get_state(const zmk_event_t *eh) {
|
||||
return (struct wpm_status_state){.wpm = zmk_wpm_get_state()};
|
||||
};
|
||||
|
||||
ZMK_DISPLAY_WIDGET_LISTENER(widget_wpm_status, struct wpm_status_state, wpm_status_update_cb,
|
||||
wpm_status_get_state)
|
||||
ZMK_SUBSCRIPTION(widget_wpm_status, zmk_wpm_state_changed);
|
||||
|
||||
int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent) {
|
||||
widget->obj = lv_obj_create(parent);
|
||||
lv_obj_set_size(widget->obj, 160, 68);
|
||||
lv_obj_t *top = lv_canvas_create(widget->obj);
|
||||
lv_obj_align(top, LV_ALIGN_TOP_RIGHT, 0, 0);
|
||||
lv_canvas_set_buffer(top, widget->cbuf, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR);
|
||||
lv_obj_t *middle = lv_canvas_create(widget->obj);
|
||||
lv_obj_align(middle, LV_ALIGN_TOP_LEFT, 24, 0);
|
||||
lv_canvas_set_buffer(middle, widget->cbuf2, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR);
|
||||
lv_obj_t *bottom = lv_canvas_create(widget->obj);
|
||||
lv_obj_align(bottom, LV_ALIGN_TOP_LEFT, -44, 0);
|
||||
lv_canvas_set_buffer(bottom, widget->cbuf3, CANVAS_SIZE, CANVAS_SIZE, LV_IMG_CF_TRUE_COLOR);
|
||||
|
||||
sys_slist_append(&widgets, &widget->node);
|
||||
widget_battery_status_init();
|
||||
widget_output_status_init();
|
||||
widget_layer_status_init();
|
||||
widget_wpm_status_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget) { return widget->obj; }
|
24
app/boards/shields/nice_view/widgets/status.h
Normal file
24
app/boards/shields/nice_view/widgets/status.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <lvgl.h>
|
||||
#include <zephyr/kernel.h>
|
||||
#include "util.h"
|
||||
|
||||
struct zmk_widget_status {
|
||||
sys_snode_t node;
|
||||
lv_obj_t *obj;
|
||||
lv_color_t cbuf[CANVAS_SIZE * CANVAS_SIZE];
|
||||
lv_color_t cbuf2[CANVAS_SIZE * CANVAS_SIZE];
|
||||
lv_color_t cbuf3[CANVAS_SIZE * CANVAS_SIZE];
|
||||
struct status_state state;
|
||||
};
|
||||
|
||||
int zmk_widget_status_init(struct zmk_widget_status *widget, lv_obj_t *parent);
|
||||
lv_obj_t *zmk_widget_status_obj(struct zmk_widget_status *widget);
|
69
app/boards/shields/nice_view/widgets/util.c
Normal file
69
app/boards/shields/nice_view/widgets/util.c
Normal file
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include "util.h"
|
||||
|
||||
LV_IMG_DECLARE(bolt);
|
||||
|
||||
void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]) {
|
||||
static lv_color_t cbuf_tmp[CANVAS_SIZE * CANVAS_SIZE];
|
||||
memcpy(cbuf_tmp, cbuf, sizeof(cbuf_tmp));
|
||||
lv_img_dsc_t img;
|
||||
img.data = (void *)cbuf_tmp;
|
||||
img.header.cf = LV_IMG_CF_TRUE_COLOR;
|
||||
img.header.w = CANVAS_SIZE;
|
||||
img.header.h = CANVAS_SIZE;
|
||||
|
||||
lv_canvas_fill_bg(canvas, LVGL_BACKGROUND, LV_OPA_COVER);
|
||||
lv_canvas_transform(canvas, &img, 900, LV_IMG_ZOOM_NONE, -1, 0, CANVAS_SIZE / 2,
|
||||
CANVAS_SIZE / 2, true);
|
||||
}
|
||||
|
||||
void draw_battery(lv_obj_t *canvas, struct status_state state) {
|
||||
lv_draw_rect_dsc_t rect_black_dsc;
|
||||
init_rect_dsc(&rect_black_dsc, LVGL_BACKGROUND);
|
||||
lv_draw_rect_dsc_t rect_white_dsc;
|
||||
init_rect_dsc(&rect_white_dsc, LVGL_FOREGROUND);
|
||||
|
||||
lv_canvas_draw_rect(canvas, 0, 2, 29, 12, &rect_white_dsc);
|
||||
lv_canvas_draw_rect(canvas, 1, 3, 27, 10, &rect_black_dsc);
|
||||
lv_canvas_draw_rect(canvas, 2, 4, (state.battery + 2) / 4, 8, &rect_white_dsc);
|
||||
lv_canvas_draw_rect(canvas, 30, 5, 3, 6, &rect_white_dsc);
|
||||
lv_canvas_draw_rect(canvas, 31, 6, 1, 4, &rect_black_dsc);
|
||||
|
||||
if (state.charging) {
|
||||
lv_draw_img_dsc_t img_dsc;
|
||||
lv_draw_img_dsc_init(&img_dsc);
|
||||
lv_canvas_draw_img(canvas, 9, -1, &bolt, &img_dsc);
|
||||
}
|
||||
}
|
||||
|
||||
void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font,
|
||||
lv_text_align_t align) {
|
||||
lv_draw_label_dsc_init(label_dsc);
|
||||
label_dsc->color = color;
|
||||
label_dsc->font = font;
|
||||
label_dsc->align = align;
|
||||
}
|
||||
|
||||
void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color) {
|
||||
lv_draw_rect_dsc_init(rect_dsc);
|
||||
rect_dsc->bg_color = bg_color;
|
||||
}
|
||||
|
||||
void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width) {
|
||||
lv_draw_line_dsc_init(line_dsc);
|
||||
line_dsc->color = color;
|
||||
line_dsc->width = width;
|
||||
}
|
||||
|
||||
void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width) {
|
||||
lv_draw_arc_dsc_init(arc_dsc);
|
||||
arc_dsc->color = color;
|
||||
arc_dsc->width = width;
|
||||
}
|
47
app/boards/shields/nice_view/widgets/util.h
Normal file
47
app/boards/shields/nice_view/widgets/util.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <lvgl.h>
|
||||
#include <zmk/endpoints.h>
|
||||
|
||||
#define CANVAS_SIZE 68
|
||||
|
||||
#define LVGL_BACKGROUND \
|
||||
IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_black() : lv_color_white()
|
||||
#define LVGL_FOREGROUND \
|
||||
IS_ENABLED(CONFIG_NICE_VIEW_WIDGET_INVERTED) ? lv_color_white() : lv_color_black()
|
||||
|
||||
struct status_state {
|
||||
uint8_t battery;
|
||||
bool charging;
|
||||
#if !IS_ENABLED(CONFIG_ZMK_SPLIT) || IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
|
||||
enum zmk_endpoint selected_endpoint;
|
||||
bool active_profile_connected;
|
||||
bool active_profile_bonded;
|
||||
uint8_t active_profile_index;
|
||||
uint8_t layer_index;
|
||||
const char *layer_label;
|
||||
uint8_t wpm[10];
|
||||
#else
|
||||
bool connected;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct battery_status_state {
|
||||
uint8_t level;
|
||||
#if IS_ENABLED(CONFIG_USB_DEVICE_STACK)
|
||||
bool usb_present;
|
||||
#endif
|
||||
};
|
||||
|
||||
void rotate_canvas(lv_obj_t *canvas, lv_color_t cbuf[]);
|
||||
void draw_battery(lv_obj_t *canvas, struct status_state state);
|
||||
void init_label_dsc(lv_draw_label_dsc_t *label_dsc, lv_color_t color, const lv_font_t *font,
|
||||
lv_text_align_t align);
|
||||
void init_rect_dsc(lv_draw_rect_dsc_t *rect_dsc, lv_color_t bg_color);
|
||||
void init_line_dsc(lv_draw_line_dsc_t *line_dsc, lv_color_t color, uint8_t width);
|
||||
void init_arc_dsc(lv_draw_arc_dsc_t *arc_dsc, lv_color_t color, uint8_t width);
|
|
@ -12,9 +12,7 @@
|
|||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
bindings = <
|
||||
&sys_reset
|
||||
>;
|
||||
bindings = <&sys_reset>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -12,12 +12,12 @@
|
|||
};
|
||||
|
||||
kscan0: kscan {
|
||||
compatible = "zmk,kscan-gpio-direct";
|
||||
compatible = "zmk,kscan-mock";
|
||||
label = "KSCAN";
|
||||
columns = <1>;
|
||||
rows = <0>;
|
||||
|
||||
input-gpios
|
||||
= <&pro_micro 4 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
|
||||
;
|
||||
events = <>;
|
||||
};
|
||||
|
||||
};
|
||||
|
|
53
app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig
Normal file
53
app/boards/shields/splitkb_aurora_helix/Kconfig.defconfig
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
if SHIELD_SPLITKB_AURORA_HELIX_LEFT
|
||||
|
||||
config ZMK_KEYBOARD_NAME
|
||||
default "Aurora Helix"
|
||||
|
||||
config ZMK_SPLIT_ROLE_CENTRAL
|
||||
default y
|
||||
|
||||
endif # SHIELD_SPLITKB_AURORA_HELIX_LEFT
|
||||
|
||||
if SHIELD_SPLITKB_AURORA_HELIX_LEFT || SHIELD_SPLITKB_AURORA_HELIX_RIGHT
|
||||
|
||||
config ZMK_SPLIT
|
||||
default y
|
||||
|
||||
config ZMK_RGB_UNDERGLOW
|
||||
select WS2812_STRIP
|
||||
select SPI
|
||||
|
||||
if ZMK_DISPLAY
|
||||
|
||||
config SSD1306
|
||||
default y
|
||||
|
||||
config I2C
|
||||
default y
|
||||
|
||||
config SSD1306_REVERSE_MODE
|
||||
default y
|
||||
|
||||
endif # ZMK_DISPLAY
|
||||
|
||||
if LVGL
|
||||
|
||||
config LV_Z_VDB_SIZE
|
||||
default 64
|
||||
|
||||
config LV_DPI_DEF
|
||||
default 148
|
||||
|
||||
config LV_Z_BITS_PER_PIXEL
|
||||
default 1
|
||||
|
||||
choice LV_COLOR_DEPTH
|
||||
default LV_COLOR_DEPTH_1
|
||||
endchoice
|
||||
|
||||
endif # LVGL
|
||||
|
||||
endif # SHIELD_SPLITKB_AURORA_HELIX_LEFT || SHIELD_SPLITKB_AURORA_HELIX_RIGHT
|
8
app/boards/shields/splitkb_aurora_helix/Kconfig.shield
Normal file
8
app/boards/shields/splitkb_aurora_helix/Kconfig.shield
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
config SHIELD_SPLITKB_AURORA_HELIX_LEFT
|
||||
def_bool $(shields_list_contains,splitkb_aurora_helix_left)
|
||||
|
||||
config SHIELD_SPLITKB_AURORA_HELIX_RIGHT
|
||||
def_bool $(shields_list_contains,splitkb_aurora_helix_right)
|
|
@ -0,0 +1,46 @@
|
|||
#include <dt-bindings/led/led.h>
|
||||
|
||||
&pinctrl {
|
||||
spi3_default: spi3_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi3_sleep: spi3_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
compatible = "nordic,nrf-spim";
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&spi3_default>;
|
||||
pinctrl-1 = <&spi3_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
led_strip: ws2812@0 {
|
||||
compatible = "worldsemi,ws2812-spi";
|
||||
label = "WS2812";
|
||||
|
||||
/* SPI */
|
||||
reg = <0>; /* ignored, but necessary for SPI bindings */
|
||||
spi-max-frequency = <4000000>;
|
||||
|
||||
/* WS2812 */
|
||||
chain-length = <6>; /* arbitrary; change at will */
|
||||
spi-one-frame = <0x70>;
|
||||
spi-zero-frame = <0x40>;
|
||||
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,underglow = &led_strip;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,46 @@
|
|||
#include <dt-bindings/led/led.h>
|
||||
|
||||
&pinctrl {
|
||||
spi3_default: spi3_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi3_sleep: spi3_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
compatible = "nordic,nrf-spim";
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&spi3_default>;
|
||||
pinctrl-1 = <&spi3_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
led_strip: ws2812@0 {
|
||||
compatible = "worldsemi,ws2812-spi";
|
||||
label = "WS2812";
|
||||
|
||||
/* SPI */
|
||||
reg = <0>; /* ignored, but necessary for SPI bindings */
|
||||
spi-max-frequency = <4000000>;
|
||||
|
||||
/* WS2812 */
|
||||
chain-length = <6>; /* arbitrary; change at will */
|
||||
spi-one-frame = <0x70>;
|
||||
spi-zero-frame = <0x40>;
|
||||
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,underglow = &led_strip;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,9 @@
|
|||
# Uncomment these two line to add support for encoders to your firmware
|
||||
# CONFIG_EC11=y
|
||||
# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
|
||||
|
||||
# Uncomment the following line to enable the OLED Display
|
||||
# CONFIG_ZMK_DISPLAY=y
|
||||
|
||||
# Uncomment the following line to enable RGB underglow
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW=y
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
|
||||
/ {
|
||||
|
||||
chosen {
|
||||
zephyr,display = &oled;
|
||||
zmk,matrix_transform = &default_transform;
|
||||
};
|
||||
|
||||
default_transform: keymap_transform_0 {
|
||||
compatible = "zmk,matrix-transform";
|
||||
columns = <14>;
|
||||
rows = <5>;
|
||||
// | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 |
|
||||
// | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 |
|
||||
// | SW13 | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | SW13 |
|
||||
// | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 | SW25 | | SW25 | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 |
|
||||
// | SW26 | SW27 | SW28 | SW29 | SW30 | SW31 | SW32 | | SW32 | SW31 | SW30 | SW29 | SW28 | SW27 | SW26 |
|
||||
map = <
|
||||
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13)
|
||||
RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13)
|
||||
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13)
|
||||
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(3,12) RC(3,13)
|
||||
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(4,12) RC(4,13)
|
||||
>;
|
||||
};
|
||||
|
||||
left_encoder: left_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "L_ENCODER";
|
||||
steps = <144>;
|
||||
status = "disabled";
|
||||
|
||||
a-gpios = <&pro_micro 7 GPIO_PULL_UP>;
|
||||
b-gpios = <&pro_micro 8 GPIO_PULL_UP>;
|
||||
};
|
||||
|
||||
right_encoder: right_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "R_ENCODER";
|
||||
steps = <144>;
|
||||
status = "disabled";
|
||||
|
||||
a-gpios = <&pro_micro 16 GPIO_PULL_UP>;
|
||||
b-gpios = <&pro_micro 14 GPIO_PULL_UP>;
|
||||
};
|
||||
|
||||
sensors {
|
||||
compatible = "zmk,keymap-sensors";
|
||||
sensors = <&left_encoder &right_encoder>;
|
||||
triggers-per-rotation = <36>;
|
||||
};
|
||||
};
|
||||
|
||||
&pro_micro_i2c {
|
||||
status = "okay";
|
||||
|
||||
oled: ssd1306@3c {
|
||||
compatible = "solomon,ssd1306fb";
|
||||
reg = <0x3c>;
|
||||
label = "DISPLAY";
|
||||
width = <128>;
|
||||
height = <32>;
|
||||
segment-offset = <0>;
|
||||
page-offset = <0>;
|
||||
display-offset = <0>;
|
||||
multiplex-ratio = <31>;
|
||||
segment-remap;
|
||||
com-invdir;
|
||||
com-sequential;
|
||||
prechargep = <0x22>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,96 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/rgb.h>
|
||||
#include <dt-bindings/zmk/ext_power.h>
|
||||
#include <dt-bindings/zmk/outputs.h>
|
||||
|
||||
#define DEFAULT 0
|
||||
#define LOWER 1
|
||||
#define RAISE 2
|
||||
#define ADJUST 3
|
||||
|
||||
/* Uncomment this block if using RGB
|
||||
&led_strip {
|
||||
chain-length = <6>;
|
||||
// chain-length = <38>; // Uncomment if using both per-key and underglow LEDs
|
||||
// chain-length = <32>; // Uncomment if using only per-key LEDs.
|
||||
};
|
||||
*/
|
||||
|
||||
/* NOTE: At the time of the creation of this keymap, there are no specified codes for 'eisuu' and 'kana' input in ZMK.
|
||||
However, 'LANG1' and 'LANG2' are fully-functioning candidates for 'kana' and 'eisuu' input respectively.
|
||||
As such, those are in use within the default layer at this time.*/
|
||||
|
||||
/ {
|
||||
keymap {
|
||||
compatible = "zmk,keymap";
|
||||
|
||||
default_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | GRAVE | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
|
||||
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
|
||||
// | SHIFT | Z | X | C | V | B | LBKT | | RBKT | N | M | , | . | / | RET |
|
||||
// | ADJUST | ESC | ALT | LGUI | EISUU | LOWER | SPACE | | SPACE | RAISE | KANA | LEFT | DOWN | UP | RIGHT |
|
||||
bindings = <
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC
|
||||
&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp PERIOD &kp SLASH &kp RET
|
||||
&mo ADJUST &kp ESC &kp LALT &kp LGUI &kp LANG2 &mo LOWER &kp SPACE &kp SPACE &mo RAISE &kp LANG1 &kp LEFT &kp DOWN &kp UP &kp RIGHT
|
||||
>;
|
||||
};
|
||||
lower_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
|
||||
// | | | | | | | | | _ | + | { | } | PIPE |
|
||||
// | | | | | | | ( | | ) | | | | HOME | END | |
|
||||
// | | | | | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE
|
||||
&trans &trans &trans &trans &trans &trans &kp LPAR &kp RPAR &trans &trans &trans &kp HOME &kp END &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
};
|
||||
raise_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
|
||||
// | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
|
||||
// | | F7 | F8 | F9 | F10 | F11 | | | | F12 | | PSCRN | PG_DN | PG_UP | |
|
||||
// | | | | | | | | | | | | NEXT | VOL- | VOL+ | PLAY |
|
||||
bindings = <
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL
|
||||
&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH
|
||||
&trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans &trans &kp F12 &trans &kp PSCRN &kp PG_DN &kp PG_UP &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PP
|
||||
>;
|
||||
};
|
||||
adjust_layer {
|
||||
// ---------------------------------------------------------------------------------------------------------------------------------
|
||||
// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | EP TOG |
|
||||
// | BT CLR | BT SEL0 | BT SEL1 | BT SEL2 | BGT SEL3 | BT SEL4 | | RGB EFF+ | RGB HUE+ | RGB SAT+ | RGB SPD+ | RGB BRI+ | RGB TOG |
|
||||
// | BT NXT | OUT TOG | OUT USB | OUT BLE | | | | RGB EFF- | RGB HUE- | RGB SAT- | RGB SPD- | RGB BRI- | |
|
||||
// | BT PRV | | | | | | { | | } | | | | | | |
|
||||
// | | | | | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &ext_power EP_TOG
|
||||
&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &rgb_ug RGB_EFF &rgb_ug RGB_HUI &rgb_ug RGB_SAI &rgb_ug RGB_SPI &rgb_ug RGB_BRI &rgb_ug RGB_TOG
|
||||
&bt BT_NXT &out OUT_TOG &out OUT_USB &out OUT_BLE &trans &trans &rgb_ug RGB_EFR &rgb_ug RGB_HUD &rgb_ug RGB_SAD &rgb_ug RGB_SPD &rgb_ug RGB_BRD &trans
|
||||
&bt BT_PRV &trans &trans &trans &trans &trans &kp LBRC &kp RBRC &trans &trans &trans &trans &trans &trans
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
file_format: "1"
|
||||
id: splitkb_aurora_helix
|
||||
name: splitkb.com Aurora Helix
|
||||
type: shield
|
||||
url: https://splitkb.com/products/aurora-helix-pcb-kit
|
||||
requires: [pro_micro]
|
||||
exposes: [i2c_oled]
|
||||
features:
|
||||
- keys
|
||||
- display
|
||||
- encoder
|
||||
- underglow
|
||||
siblings:
|
||||
- splitkb_aurora_helix_left
|
||||
- splitkb_aurora_helix_right
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "splitkb_aurora_helix.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,kscan = &kscan;
|
||||
};
|
||||
|
||||
kscan: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
|
||||
label = "KSCAN";
|
||||
diode-direction = "col2row";
|
||||
|
||||
row-gpios
|
||||
= <&pro_micro 21 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 4 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 5 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 6 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
;
|
||||
|
||||
col-gpios
|
||||
= <&pro_micro 19 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 18 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 15 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 14 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 16 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 10 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 9 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
};
|
||||
|
||||
&left_encoder {
|
||||
status = "okay";
|
||||
};
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "splitkb_aurora_helix.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,kscan = &kscan;
|
||||
};
|
||||
|
||||
kscan: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
|
||||
label = "KSCAN";
|
||||
diode-direction = "col2row";
|
||||
|
||||
row-gpios
|
||||
= <&pro_micro 21 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
;
|
||||
|
||||
col-gpios
|
||||
= <&pro_micro 10 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 9 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 8 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 7 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 6 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 5 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 4 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
};
|
||||
|
||||
&right_encoder {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&default_transform {
|
||||
col-offset = <7>;
|
||||
};
|
53
app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig
Normal file
53
app/boards/shields/splitkb_aurora_sofle/Kconfig.defconfig
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
if SHIELD_SPLITKB_AURORA_SOFLE_LEFT
|
||||
|
||||
config ZMK_KEYBOARD_NAME
|
||||
default "Aurora Sofle"
|
||||
|
||||
config ZMK_SPLIT_ROLE_CENTRAL
|
||||
default y
|
||||
|
||||
endif # SHIELD_SPLITKB_AURORA_SOFLE_LEFT
|
||||
|
||||
if SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT
|
||||
|
||||
config ZMK_SPLIT
|
||||
default y
|
||||
|
||||
config ZMK_RGB_UNDERGLOW
|
||||
select WS2812_STRIP
|
||||
select SPI
|
||||
|
||||
if ZMK_DISPLAY
|
||||
|
||||
config SSD1306
|
||||
default y
|
||||
|
||||
config I2C
|
||||
default y
|
||||
|
||||
config SSD1306_REVERSE_MODE
|
||||
default y
|
||||
|
||||
endif # ZMK_DISPLAY
|
||||
|
||||
if LVGL
|
||||
|
||||
config LV_Z_VDB_SIZE
|
||||
default 64
|
||||
|
||||
config LV_DPI_DEF
|
||||
default 148
|
||||
|
||||
config LV_Z_BITS_PER_PIXEL
|
||||
default 1
|
||||
|
||||
choice LV_COLOR_DEPTH
|
||||
default LV_COLOR_DEPTH_1
|
||||
endchoice
|
||||
|
||||
endif # LVGL
|
||||
|
||||
endif # SHIELD_SPLITKB_AURORA_SOFLE_LEFT || SHIELD_SPLITKB_AURORA_SOFLE_RIGHT
|
8
app/boards/shields/splitkb_aurora_sofle/Kconfig.shield
Normal file
8
app/boards/shields/splitkb_aurora_sofle/Kconfig.shield
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
config SHIELD_SPLITKB_AURORA_SOFLE_LEFT
|
||||
def_bool $(shields_list_contains,splitkb_aurora_sofle_left)
|
||||
|
||||
config SHIELD_SPLITKB_AURORA_SOFLE_RIGHT
|
||||
def_bool $(shields_list_contains,splitkb_aurora_sofle_right)
|
|
@ -0,0 +1,46 @@
|
|||
#include <dt-bindings/led/led.h>
|
||||
|
||||
&pinctrl {
|
||||
spi3_default: spi3_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi3_sleep: spi3_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
compatible = "nordic,nrf-spim";
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&spi3_default>;
|
||||
pinctrl-1 = <&spi3_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
led_strip: ws2812@0 {
|
||||
compatible = "worldsemi,ws2812-spi";
|
||||
label = "WS2812";
|
||||
|
||||
/* SPI */
|
||||
reg = <0>; /* ignored, but necessary for SPI bindings */
|
||||
spi-max-frequency = <4000000>;
|
||||
|
||||
/* WS2812 */
|
||||
chain-length = <6>; /* arbitrary; change at will */
|
||||
spi-one-frame = <0x70>;
|
||||
spi-zero-frame = <0x40>;
|
||||
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,underglow = &led_strip;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,46 @@
|
|||
#include <dt-bindings/led/led.h>
|
||||
|
||||
&pinctrl {
|
||||
spi3_default: spi3_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi3_sleep: spi3_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIM_MOSI, 0, 6)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&spi3 {
|
||||
compatible = "nordic,nrf-spim";
|
||||
status = "okay";
|
||||
|
||||
pinctrl-0 = <&spi3_default>;
|
||||
pinctrl-1 = <&spi3_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
|
||||
led_strip: ws2812@0 {
|
||||
compatible = "worldsemi,ws2812-spi";
|
||||
label = "WS2812";
|
||||
|
||||
/* SPI */
|
||||
reg = <0>; /* ignored, but necessary for SPI bindings */
|
||||
spi-max-frequency = <4000000>;
|
||||
|
||||
/* WS2812 */
|
||||
chain-length = <6>; /* arbitrary; change at will */
|
||||
spi-one-frame = <0x70>;
|
||||
spi-zero-frame = <0x40>;
|
||||
color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
};
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,underglow = &led_strip;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,9 @@
|
|||
# Uncomment these two line to add support for encoders to your firmware
|
||||
# CONFIG_EC11=y
|
||||
# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
|
||||
|
||||
# Uncomment the following line to enable the OLED Display
|
||||
# CONFIG_ZMK_DISPLAY=y
|
||||
|
||||
# Uncomment the following lines to enable RGB underglow
|
||||
# CONFIG_ZMK_RGB_UNDERGLOW=y
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <dt-bindings/zmk/matrix_transform.h>
|
||||
|
||||
/ {
|
||||
|
||||
chosen {
|
||||
zephyr,display = &oled;
|
||||
zmk,matrix_transform = &default_transform;
|
||||
};
|
||||
|
||||
default_transform: keymap_transform_0 {
|
||||
compatible = "zmk,matrix-transform";
|
||||
columns = <14>;
|
||||
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 |
|
||||
// | SW24 | SW23 | SW22 | SW21 | SW20 | SW19 | SW25 | | SW25 | SW19 | SW20 | SW21 | SW22 | SW23 | SW24 |
|
||||
// | SW30 | SW29 | SW28 | SW27 | SW26 | | SW26 | SW27 | SW28 | SW29 | 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(4,5) RC(4,6) 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,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11)
|
||||
>;
|
||||
};
|
||||
|
||||
left_encoder: left_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "L_ENCODER";
|
||||
steps = <144>;
|
||||
status = "disabled";
|
||||
|
||||
a-gpios = <&pro_micro 16 GPIO_PULL_UP>;
|
||||
b-gpios = <&pro_micro 10 GPIO_PULL_UP>;
|
||||
};
|
||||
|
||||
right_encoder: right_encoder {
|
||||
compatible = "alps,ec11";
|
||||
label = "R_ENCODER";
|
||||
steps = <144>;
|
||||
status = "disabled";
|
||||
|
||||
a-gpios = <&pro_micro 16 GPIO_PULL_UP>;
|
||||
b-gpios = <&pro_micro 10 GPIO_PULL_UP>;
|
||||
};
|
||||
|
||||
sensors {
|
||||
compatible = "zmk,keymap-sensors";
|
||||
sensors = <&left_encoder &right_encoder>;
|
||||
triggers-per-rotation = <36>;
|
||||
};
|
||||
};
|
||||
|
||||
&pro_micro_i2c {
|
||||
status = "okay";
|
||||
|
||||
oled: ssd1306@3c {
|
||||
compatible = "solomon,ssd1306fb";
|
||||
reg = <0x3c>;
|
||||
label = "DISPLAY";
|
||||
width = <128>;
|
||||
height = <32>;
|
||||
segment-offset = <0>;
|
||||
page-offset = <0>;
|
||||
display-offset = <0>;
|
||||
multiplex-ratio = <31>;
|
||||
segment-remap;
|
||||
com-invdir;
|
||||
com-sequential;
|
||||
prechargep = <0x22>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include <behaviors.dtsi>
|
||||
#include <dt-bindings/zmk/keys.h>
|
||||
#include <dt-bindings/zmk/bt.h>
|
||||
#include <dt-bindings/zmk/ext_power.h>
|
||||
|
||||
/* Uncomment this block if using RGB
|
||||
&led_strip {
|
||||
chain-length = <6>;
|
||||
// chain-length = <35>; // Uncomment if using both per-key and underglow LEDs
|
||||
// chain-length = <29>; // Uncomment if using only per-key LEDs.
|
||||
};
|
||||
*/
|
||||
|
||||
/ {
|
||||
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 |
|
||||
// |CTRL | ALT | GUI | LOWER| SPACE | | ENTER | RAISE| BSPC | GUI | RALT |
|
||||
bindings = <
|
||||
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp GRAVE
|
||||
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS
|
||||
&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
|
||||
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LBKT &kp RBKT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
|
||||
&kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp RET &mo 2 &kp BSPC &kp RGUI &kp RALT
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
lower_layer {
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | |
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
|
||||
// | ` | ! | @ | # | $ | % | | ^ | & | * | ( | ) | ~ |
|
||||
// | | | | | | | | | | | _ | + | { | } | "|" |
|
||||
// | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &trans
|
||||
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12
|
||||
&kp GRAVE &kp EXCL &kp AT &kp HASH &kp DOLLAR &kp PRCNT &kp CARET &kp AMPS &kp STAR &kp LPAR &kp RPAR &kp TILDE
|
||||
&trans &ext_power EP_ON &ext_power EP_OFF &ext_power EP_TOG &trans &trans &trans &trans &trans &kp MINUS &kp PLUS &kp LBRC &kp RBRC &kp PIPE
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
|
||||
raise_layer {
|
||||
// ------------------------------------------------------------------------------------------------------------
|
||||
// | | | | | | | | | | | | | |
|
||||
// | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
|
||||
// | F1 | F2 | F3 | F4 | F5 | F6 | | | <- | v | ^ | -> | |
|
||||
// | F7 | F8 | F9 | F10 | F11 | F12 | | | | + | - | = | [ | ] | \ |
|
||||
// | | | | | | | | | | | |
|
||||
bindings = <
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &trans
|
||||
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans
|
||||
&kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans &kp KP_PLUS &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH
|
||||
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
|
||||
>;
|
||||
|
||||
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
|
||||
};
|
||||
};
|
||||
};
|
|
@ -0,0 +1,15 @@
|
|||
file_format: "1"
|
||||
id: splitkb_aurora_sofle
|
||||
name: splitkb.com Aurora Sofle
|
||||
type: shield
|
||||
url: https://splitkb.com/products/aurora-sofle-pcb-kit
|
||||
requires: [pro_micro]
|
||||
exposes: [i2c_oled]
|
||||
features:
|
||||
- keys
|
||||
- display
|
||||
- encoder
|
||||
- underglow
|
||||
siblings:
|
||||
- splitkb_aurora_sofle_left
|
||||
- splitkb_aurora_sofle_right
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "splitkb_aurora_sofle.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,kscan = &kscan;
|
||||
};
|
||||
|
||||
kscan: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
|
||||
label = "KSCAN";
|
||||
diode-direction = "col2row";
|
||||
|
||||
row-gpios
|
||||
= <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
;
|
||||
|
||||
col-gpios
|
||||
= <&pro_micro 9 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 8 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 7 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 6 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 5 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 4 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
};
|
||||
|
||||
&left_encoder {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Copyright (c) 2023 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#include "splitkb_aurora_sofle.dtsi"
|
||||
|
||||
/ {
|
||||
chosen {
|
||||
zmk,kscan = &kscan;
|
||||
};
|
||||
|
||||
kscan: kscan {
|
||||
compatible = "zmk,kscan-gpio-matrix";
|
||||
|
||||
label = "KSCAN";
|
||||
diode-direction = "col2row";
|
||||
|
||||
row-gpios
|
||||
= <&pro_micro 14 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 15 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 18 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 19 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
, <&pro_micro 20 (GPIO_PULL_DOWN | GPIO_ACTIVE_HIGH)>
|
||||
;
|
||||
|
||||
col-gpios
|
||||
= <&pro_micro 6 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 7 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 8 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 9 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 4 GPIO_ACTIVE_HIGH>
|
||||
, <&pro_micro 5 GPIO_ACTIVE_HIGH>
|
||||
;
|
||||
};
|
||||
};
|
||||
|
||||
&right_encoder {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&default_transform {
|
||||
col-offset = <6>;
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
/ {
|
||||
// First, delete the existing basic GPIO based instance.
|
||||
/delete-node/ encoder;
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
qdec_default: qdec_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(QDEC_A, 1, 11)>,
|
||||
<NRF_PSEL(QDEC_B, 1, 10)>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// Set up the QDEC hardware based driver and give it the same label as the deleted node.
|
||||
encoder: &qdec0 {
|
||||
status = "okay";
|
||||
led-pre = <0>;
|
||||
steps = <80>;
|
||||
pinctrl-0 = <&qdec_default>;
|
||||
pinctrl-names = "default";
|
||||
};
|
|
@ -165,15 +165,18 @@
|
|||
|
||||
encoder: encoder {
|
||||
label = "ENCODER";
|
||||
resolution = <4>;
|
||||
steps = <80>;
|
||||
compatible = "alps,ec11";
|
||||
a-gpios = <&arduino_header 14 GPIO_PULL_UP>;
|
||||
b-gpios = <&arduino_header 15 GPIO_PULL_UP>;
|
||||
a-gpios = <&arduino_header 15 GPIO_PULL_UP>;
|
||||
b-gpios = <&arduino_header 14 GPIO_PULL_UP>;
|
||||
};
|
||||
|
||||
sensors {
|
||||
compatible = "zmk,keymap-sensors";
|
||||
sensors = <&encoder>;
|
||||
triggers-per-rotation = <20>;
|
||||
left {
|
||||
triggers-per-rotation = <20>;
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
# Copyright (c) 2020 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
add_subdirectory_ifdef(CONFIG_ZMK_DRIVERS_GPIO gpio)
|
||||
add_subdirectory(kscan)
|
||||
add_subdirectory(sensor)
|
||||
add_subdirectory(display)
|
|
@ -1,4 +0,0 @@
|
|||
# Copyright (c) 2021 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
zephyr_sources_ifdef(CONFIG_IL0323 il0323.c)
|
|
@ -4,6 +4,7 @@
|
|||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#define MACRO_PLACEHOLDER 0
|
||||
#define ZMK_MACRO_STRINGIFY(x) #x
|
||||
#define ZMK_MACRO(name,...) \
|
||||
name: name { \
|
||||
|
@ -13,6 +14,22 @@
|
|||
__VA_ARGS__ \
|
||||
};
|
||||
|
||||
#define ZMK_MACRO1(name,...) \
|
||||
name: name { \
|
||||
label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \
|
||||
compatible = "zmk,behavior-macro-one-param"; \
|
||||
#binding-cells = <1>; \
|
||||
__VA_ARGS__ \
|
||||
};
|
||||
|
||||
#define ZMK_MACRO2(name,...) \
|
||||
name: name { \
|
||||
label = ZMK_MACRO_STRINGIFY(ZM_ ## name); \
|
||||
compatible = "zmk,behavior-macro-two-param"; \
|
||||
#binding-cells = <2>; \
|
||||
__VA_ARGS__ \
|
||||
};
|
||||
|
||||
/ {
|
||||
behaviors {
|
||||
macro_tap: macro_control_mode_tap {
|
||||
|
@ -50,5 +67,29 @@
|
|||
label = "MAC_WAIT_REL";
|
||||
#binding-cells = <0>;
|
||||
};
|
||||
|
||||
macro_param_1to1: macro_param_1to1 {
|
||||
compatible = "zmk,macro-param-1to1";
|
||||
label = "MAC_PARAM_1TO1";
|
||||
#binding-cells = <0>;
|
||||
};
|
||||
|
||||
macro_param_1to2: macro_param_1to2 {
|
||||
compatible = "zmk,macro-param-1to2";
|
||||
label = "MAC_PARAM_1TO2";
|
||||
#binding-cells = <0>;
|
||||
};
|
||||
|
||||
macro_param_2to1: macro_param_2to1 {
|
||||
compatible = "zmk,macro-param-2to1";
|
||||
label = "MAC_PARAM_2TO1";
|
||||
#binding-cells = <0>;
|
||||
};
|
||||
|
||||
macro_param_2to2: macro_param_2to2 {
|
||||
compatible = "zmk,macro-param-2to2";
|
||||
label = "MAC_PARAM_2TO2";
|
||||
#binding-cells = <0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
13
app/dts/bindings/behaviors/macro_base.yaml
Normal file
13
app/dts/bindings/behaviors/macro_base.yaml
Normal file
|
@ -0,0 +1,13 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
properties:
|
||||
bindings:
|
||||
type: phandle-array
|
||||
required: true
|
||||
wait-ms:
|
||||
type: int
|
||||
description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list.
|
||||
tap-ms:
|
||||
type: int
|
||||
description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding
|
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Macro Behavior
|
||||
|
||||
compatible: "zmk,behavior-macro-one-param"
|
||||
|
||||
include: [one_param.yaml, macro_base.yaml]
|
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2022 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Macro Behavior
|
||||
|
||||
compatible: "zmk,behavior-macro-two-param"
|
||||
|
||||
include: [two_param.yaml, macro_base.yaml]
|
|
@ -5,15 +5,4 @@ description: Macro Behavior
|
|||
|
||||
compatible: "zmk,behavior-macro"
|
||||
|
||||
include: zero_param.yaml
|
||||
|
||||
properties:
|
||||
bindings:
|
||||
type: phandle-array
|
||||
required: true
|
||||
wait-ms:
|
||||
type: int
|
||||
description: The default time to wait (in milliseconds) before triggering the next behavior in the macro bindings list.
|
||||
tap-ms:
|
||||
type: int
|
||||
description: The default time to wait (in milliseconds) between the press and release events on a tapped macro behavior binding
|
||||
include: [zero_param.yaml, macro_base.yaml]
|
||||
|
|
8
app/dts/bindings/macros/zmk,macro-param-1to1.yaml
Normal file
8
app/dts/bindings/macros/zmk,macro-param-1to1.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Macro Parameter One Substituted Into Next Binding's First Parameter
|
||||
|
||||
compatible: "zmk,macro-param-1to1"
|
||||
|
||||
include: zero_param.yaml
|
8
app/dts/bindings/macros/zmk,macro-param-1to2.yaml
Normal file
8
app/dts/bindings/macros/zmk,macro-param-1to2.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Macro Parameter One Substituted Into Next Binding's Second Parameter
|
||||
|
||||
compatible: "zmk,macro-param-1to2"
|
||||
|
||||
include: zero_param.yaml
|
8
app/dts/bindings/macros/zmk,macro-param-2to1.yaml
Normal file
8
app/dts/bindings/macros/zmk,macro-param-2to1.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Macro Parameter Two Substituted Into Next Binding's First Parameter
|
||||
|
||||
compatible: "zmk,macro-param-2to1"
|
||||
|
||||
include: zero_param.yaml
|
8
app/dts/bindings/macros/zmk,macro-param-2to2.yaml
Normal file
8
app/dts/bindings/macros/zmk,macro-param-2to2.yaml
Normal file
|
@ -0,0 +1,8 @@
|
|||
# Copyright (c) 2023 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
description: Macro Parameter Two Substituted Into Next Binding's Second Parameter
|
||||
|
||||
compatible: "zmk,macro-param-2to2"
|
||||
|
||||
include: zero_param.yaml
|
|
@ -9,4 +9,14 @@ compatible: "zmk,keymap-sensors"
|
|||
properties:
|
||||
sensors:
|
||||
type: phandles
|
||||
required: true
|
||||
required: false
|
||||
triggers-per-rotation:
|
||||
type: int
|
||||
required: false
|
||||
|
||||
child-binding:
|
||||
description: Per-sensor configuration settings
|
||||
properties:
|
||||
triggers-per-rotation:
|
||||
type: int
|
||||
required: false
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <string.h>
|
||||
#include <zephyr/device.h>
|
||||
#include <zmk/keys.h>
|
||||
#include <zmk/sensors.h>
|
||||
#include <zmk/behavior.h>
|
||||
|
||||
/**
|
||||
|
@ -22,11 +23,20 @@
|
|||
* (Internal use only.)
|
||||
*/
|
||||
|
||||
enum behavior_sensor_binding_process_mode {
|
||||
BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER,
|
||||
BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD,
|
||||
};
|
||||
|
||||
typedef int (*behavior_keymap_binding_callback_t)(struct zmk_behavior_binding *binding,
|
||||
struct zmk_behavior_binding_event event);
|
||||
typedef int (*behavior_sensor_keymap_binding_callback_t)(struct zmk_behavior_binding *binding,
|
||||
const struct device *sensor,
|
||||
struct zmk_behavior_binding_event event);
|
||||
typedef int (*behavior_sensor_keymap_binding_process_callback_t)(
|
||||
struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event,
|
||||
enum behavior_sensor_binding_process_mode mode);
|
||||
typedef int (*behavior_sensor_keymap_binding_accept_data_callback_t)(
|
||||
struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event,
|
||||
const struct zmk_sensor_config *sensor_config, size_t channel_data_size,
|
||||
const struct zmk_sensor_channel_data channel_data[channel_data_size]);
|
||||
|
||||
enum behavior_locality {
|
||||
BEHAVIOR_LOCALITY_CENTRAL,
|
||||
|
@ -39,7 +49,8 @@ __subsystem struct behavior_driver_api {
|
|||
behavior_keymap_binding_callback_t binding_convert_central_state_dependent_params;
|
||||
behavior_keymap_binding_callback_t binding_pressed;
|
||||
behavior_keymap_binding_callback_t binding_released;
|
||||
behavior_sensor_keymap_binding_callback_t sensor_binding_triggered;
|
||||
behavior_sensor_keymap_binding_accept_data_callback_t sensor_binding_accept_data;
|
||||
behavior_sensor_keymap_binding_process_callback_t sensor_binding_process;
|
||||
};
|
||||
/**
|
||||
* @endcond
|
||||
|
@ -149,7 +160,7 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Handle the a sensor keymap binding being triggered
|
||||
* @brief Handle the a sensor keymap binding processing any incoming data from the sensor
|
||||
* @param binding Sensor keymap binding which was triggered.
|
||||
* @param sensor Pointer to the sensor device structure for the sensor driver instance.
|
||||
* @param virtual_key_position ZMK_KEYMAP_LEN + sensor number
|
||||
|
@ -158,14 +169,15 @@ static inline int z_impl_behavior_keymap_binding_released(struct zmk_behavior_bi
|
|||
* @retval 0 If successful.
|
||||
* @retval Negative errno code if failure.
|
||||
*/
|
||||
__syscall int behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding,
|
||||
const struct device *sensor,
|
||||
struct zmk_behavior_binding_event event);
|
||||
__syscall int behavior_sensor_keymap_binding_accept_data(
|
||||
struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event,
|
||||
const struct zmk_sensor_config *sensor_config, size_t channel_data_size,
|
||||
const struct zmk_sensor_channel_data *channel_data);
|
||||
|
||||
static inline int
|
||||
z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *binding,
|
||||
const struct device *sensor,
|
||||
struct zmk_behavior_binding_event event) {
|
||||
static inline int z_impl_behavior_sensor_keymap_binding_accept_data(
|
||||
struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event,
|
||||
const struct zmk_sensor_config *sensor_config, size_t channel_data_size,
|
||||
const struct zmk_sensor_channel_data *channel_data) {
|
||||
const struct device *dev = device_get_binding(binding->behavior_dev);
|
||||
|
||||
if (dev == NULL) {
|
||||
|
@ -174,11 +186,47 @@ z_impl_behavior_sensor_keymap_binding_triggered(struct zmk_behavior_binding *bin
|
|||
|
||||
const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api;
|
||||
|
||||
if (api->sensor_binding_triggered == NULL) {
|
||||
if (api->sensor_binding_accept_data == NULL) {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return api->sensor_binding_triggered(binding, sensor, event);
|
||||
return api->sensor_binding_accept_data(binding, event, sensor_config, channel_data_size,
|
||||
channel_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Handle the keymap sensor binding being triggered after updating any local data
|
||||
* @param dev Pointer to the device structure for the driver instance.
|
||||
* @param param1 User parameter specified at time of behavior binding.
|
||||
* @param param2 User parameter specified at time of behavior binding.
|
||||
*
|
||||
* @retval 0 If successful.
|
||||
* @retval Negative errno code if failure.
|
||||
*/
|
||||
// clang-format off
|
||||
__syscall int behavior_sensor_keymap_binding_process(
|
||||
struct zmk_behavior_binding *binding,
|
||||
struct zmk_behavior_binding_event event,
|
||||
enum behavior_sensor_binding_process_mode mode);
|
||||
// clang-format on
|
||||
|
||||
static inline int
|
||||
z_impl_behavior_sensor_keymap_binding_process(struct zmk_behavior_binding *binding,
|
||||
struct zmk_behavior_binding_event event,
|
||||
enum behavior_sensor_binding_process_mode mode) {
|
||||
const struct device *dev = device_get_binding(binding->behavior_dev);
|
||||
|
||||
if (dev == NULL) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
const struct behavior_driver_api *api = (const struct behavior_driver_api *)dev->api;
|
||||
|
||||
if (api->sensor_binding_process == NULL) {
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return api->sensor_binding_process(binding, event, mode);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2020 The ZMK Contributors
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
#warning "kscan-mock.h has been deprecated and superseded by kscan_mock.h"
|
||||
|
||||
#include "kscan_mock.h"
|
|
@ -14,8 +14,8 @@
|
|||
IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL))
|
||||
|
||||
#if ZMK_BLE_IS_CENTRAL
|
||||
#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - 1)
|
||||
#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT 1
|
||||
#define ZMK_BLE_PROFILE_COUNT (CONFIG_BT_MAX_PAIRED - CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS)
|
||||
#define ZMK_SPLIT_BLE_PERIPHERAL_COUNT CONFIG_ZMK_SPLIT_BLE_CENTRAL_PERIPHERALS
|
||||
#else
|
||||
#define ZMK_BLE_PROFILE_COUNT CONFIG_BT_MAX_PAIRED
|
||||
#endif
|
||||
|
@ -34,5 +34,5 @@ char *zmk_ble_active_profile_name();
|
|||
int zmk_ble_unpair_all();
|
||||
|
||||
#if IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL)
|
||||
void zmk_ble_set_peripheral_addr(bt_addr_le_t *addr);
|
||||
int zmk_ble_put_peripheral_addr(const bt_addr_le_t *addr);
|
||||
#endif /* IS_ENABLED(CONFIG_ZMK_SPLIT_ROLE_CENTRAL) */
|
||||
|
|
|
@ -6,13 +6,22 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <zephyr/kernel.h>
|
||||
#include <zmk/event_manager.h>
|
||||
#include <zephyr/device.h>
|
||||
#include <zephyr/drivers/sensor.h>
|
||||
|
||||
#include <zmk/event_manager.h>
|
||||
#include <zmk/sensors.h>
|
||||
|
||||
// TODO: Move to Kconfig when we need more than one channel
|
||||
#define ZMK_SENSOR_EVENT_MAX_CHANNELS 1
|
||||
|
||||
struct zmk_sensor_event {
|
||||
uint8_t sensor_number;
|
||||
const struct device *sensor;
|
||||
size_t channel_data_size;
|
||||
struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS];
|
||||
|
||||
int64_t timestamp;
|
||||
|
||||
uint8_t sensor_index;
|
||||
};
|
||||
|
||||
ZMK_EVENT_DECLARE(zmk_sensor_event);
|
|
@ -8,6 +8,10 @@
|
|||
|
||||
#include <zmk/events/position_state_changed.h>
|
||||
|
||||
#define ZMK_LAYER_CHILD_LEN_PLUS_ONE(node) 1 +
|
||||
#define ZMK_KEYMAP_LAYERS_LEN \
|
||||
(DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0)
|
||||
|
||||
typedef uint32_t zmk_keymap_layers_state_t;
|
||||
|
||||
uint8_t zmk_keymap_layer_default();
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <zephyr/drivers/sensor.h>
|
||||
|
||||
#define ZMK_KEYMAP_SENSORS_NODE DT_INST(0, zmk_keymap_sensors)
|
||||
#define ZMK_KEYMAP_HAS_SENSORS DT_NODE_HAS_STATUS(ZMK_KEYMAP_SENSORS_NODE, okay)
|
||||
#define ZMK_KEYMAP_SENSORS_BY_IDX(idx) DT_PHANDLE_BY_IDX(ZMK_KEYMAP_SENSORS_NODE, sensors, idx)
|
||||
|
@ -15,3 +17,16 @@
|
|||
#else
|
||||
#define ZMK_KEYMAP_SENSORS_LEN 0
|
||||
#endif
|
||||
|
||||
const struct zmk_sensor_config *zmk_sensors_get_config_at_index(uint8_t sensor_index);
|
||||
|
||||
struct zmk_sensor_config {
|
||||
uint16_t triggers_per_rotation;
|
||||
};
|
||||
|
||||
// This struct is also used for data transfer for splits, so any changes to the size, layout, etc
|
||||
// is a breaking change for the split GATT service protocol.
|
||||
struct zmk_sensor_channel_data {
|
||||
struct sensor_value value;
|
||||
enum sensor_channel channel;
|
||||
} __packed;
|
||||
|
|
|
@ -6,8 +6,18 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <zmk/events/sensor_event.h>
|
||||
#include <zmk/sensors.h>
|
||||
|
||||
#define ZMK_SPLIT_RUN_BEHAVIOR_DEV_LEN 9
|
||||
|
||||
struct sensor_event {
|
||||
uint8_t sensor_index;
|
||||
|
||||
uint8_t channel_data_size;
|
||||
struct zmk_sensor_channel_data channel_data[ZMK_SENSOR_EVENT_MAX_CHANNELS];
|
||||
} __packed;
|
||||
|
||||
struct zmk_split_run_behavior_data {
|
||||
uint8_t position;
|
||||
uint8_t state;
|
||||
|
@ -22,3 +32,6 @@ struct zmk_split_run_behavior_payload {
|
|||
|
||||
int zmk_split_bt_position_pressed(uint8_t position);
|
||||
int zmk_split_bt_position_released(uint8_t position);
|
||||
int zmk_split_bt_sensor_triggered(uint8_t sensor_index,
|
||||
const struct zmk_sensor_channel_data channel_data[],
|
||||
size_t channel_data_size);
|
||||
|
|
|
@ -16,3 +16,4 @@
|
|||
#define ZMK_SPLIT_BT_SERVICE_UUID ZMK_BT_SPLIT_UUID(0x00000000)
|
||||
#define ZMK_SPLIT_BT_CHAR_POSITION_STATE_UUID ZMK_BT_SPLIT_UUID(0x00000001)
|
||||
#define ZMK_SPLIT_BT_CHAR_RUN_BEHAVIOR_UUID ZMK_BT_SPLIT_UUID(0x00000002)
|
||||
#define ZMK_SPLIT_BT_CHAR_SENSOR_STATE_UUID ZMK_BT_SPLIT_UUID(0x00000003)
|
||||
|
|
|
@ -14,6 +14,11 @@
|
|||
*/
|
||||
#define ZMK_VIRTUAL_KEY_POSITION_SENSOR(index) (ZMK_KEYMAP_LEN + (index))
|
||||
|
||||
/**
|
||||
* Gets the sensor number from the virtual key position.
|
||||
*/
|
||||
#define ZMK_SENSOR_POSITION_FROM_VIRTUAL_KEY_POSITION(vkp) ((vkp)-ZMK_KEYMAP_LEN)
|
||||
|
||||
/**
|
||||
* Gets the virtual key position to use for the combo with the given index.
|
||||
*/
|
||||
|
|
1
app/include/zmk/workqueue.h
Normal file
1
app/include/zmk/workqueue.h
Normal file
|
@ -0,0 +1 @@
|
|||
struct k_work_q *zmk_workqueue_lowprio_work_q();
|
4
app/module/CMakeLists.txt
Normal file
4
app/module/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
zephyr_include_directories(include)
|
||||
|
||||
add_subdirectory(drivers)
|
||||
add_subdirectory(lib)
|
3
app/module/Kconfig
Normal file
3
app/module/Kconfig
Normal file
|
@ -0,0 +1,3 @@
|
|||
|
||||
rsource "drivers/Kconfig"
|
||||
rsource "lib/Kconfig"
|
7
app/module/drivers/CMakeLists.txt
Normal file
7
app/module/drivers/CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
# Copyright (c) 2020 The ZMK Contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
add_subdirectory_ifdef(CONFIG_GPIO gpio)
|
||||
add_subdirectory_ifdef(CONFIG_KSCAN kscan)
|
||||
add_subdirectory_ifdef(CONFIG_SENSOR sensor)
|
||||
add_subdirectory_ifdef(CONFIG_DISPLAY display)
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue