Merge d03c7feee0
into 92e7618346
This commit is contained in:
commit
e20f0faec5
4 changed files with 61 additions and 31 deletions
|
@ -8,17 +8,19 @@
|
||||||
|
|
||||||
#include <zephyr.h>
|
#include <zephyr.h>
|
||||||
#include <zmk/event_manager.h>
|
#include <zmk/event_manager.h>
|
||||||
|
#include <zmk/keymap.h>
|
||||||
|
|
||||||
struct zmk_layer_state_changed {
|
struct zmk_layer_state_changed {
|
||||||
uint8_t layer;
|
zmk_keymap_layers_state_t prior_state;
|
||||||
bool state;
|
zmk_keymap_layers_state_t state;
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
};
|
};
|
||||||
|
|
||||||
ZMK_EVENT_DECLARE(zmk_layer_state_changed);
|
ZMK_EVENT_DECLARE(zmk_layer_state_changed);
|
||||||
|
|
||||||
static inline struct zmk_layer_state_changed_event *create_layer_state_changed(uint8_t layer,
|
static inline struct zmk_layer_state_changed_event *
|
||||||
bool state) {
|
create_layer_state_changed(zmk_keymap_layers_state_t prior_state, zmk_keymap_layers_state_t state) {
|
||||||
|
|
||||||
return new_zmk_layer_state_changed((struct zmk_layer_state_changed){
|
return new_zmk_layer_state_changed((struct zmk_layer_state_changed){
|
||||||
.layer = layer, .state = state, .timestamp = k_uptime_get()});
|
.prior_state = prior_state, .state = state, .timestamp = k_uptime_get()});
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,10 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
|
||||||
#include <zmk/events/layer_state_changed.h>
|
#include <zmk/events/layer_state_changed.h>
|
||||||
#include <zmk/events/sensor_event.h>
|
#include <zmk/events/sensor_event.h>
|
||||||
|
|
||||||
static zmk_keymap_layers_state_t _zmk_keymap_layer_state = 0;
|
#define ZMK_KEYMAP_INITIAL_DEFAULT_LAYER 0
|
||||||
static uint8_t _zmk_keymap_layer_default = 0;
|
|
||||||
|
static uint8_t _zmk_keymap_layer_default = ZMK_KEYMAP_INITIAL_DEFAULT_LAYER;
|
||||||
|
static zmk_keymap_layers_state_t _zmk_keymap_layer_state = BIT(ZMK_KEYMAP_INITIAL_DEFAULT_LAYER);
|
||||||
|
|
||||||
#define DT_DRV_COMPAT zmk_keymap
|
#define DT_DRV_COMPAT zmk_keymap
|
||||||
|
|
||||||
|
@ -80,6 +82,12 @@ static struct zmk_behavior_binding zmk_sensor_keymap[ZMK_KEYMAP_LAYERS_LEN]
|
||||||
|
|
||||||
#endif /* ZMK_KEYMAP_HAS_SENSORS */
|
#endif /* ZMK_KEYMAP_HAS_SENSORS */
|
||||||
|
|
||||||
|
static void raise_layer_event(zmk_keymap_layers_state_t prior_state) {
|
||||||
|
LOG_DBG("layer_changed: layer %d, old state %x, state %x", zmk_keymap_highest_layer_active(),
|
||||||
|
prior_state, zmk_keymap_layer_state());
|
||||||
|
ZMK_EVENT_RAISE(create_layer_state_changed(prior_state, zmk_keymap_layer_state()));
|
||||||
|
}
|
||||||
|
|
||||||
static inline int set_layer_state(uint8_t layer, bool state) {
|
static inline int set_layer_state(uint8_t layer, bool state) {
|
||||||
if (layer >= ZMK_KEYMAP_LAYERS_LEN) {
|
if (layer >= ZMK_KEYMAP_LAYERS_LEN) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -89,21 +97,14 @@ static inline int set_layer_state(uint8_t layer, bool state) {
|
||||||
if (layer == _zmk_keymap_layer_default && !state) {
|
if (layer == _zmk_keymap_layer_default && !state) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state;
|
|
||||||
WRITE_BIT(_zmk_keymap_layer_state, layer, state);
|
WRITE_BIT(_zmk_keymap_layer_state, layer, state);
|
||||||
// Don't send state changes unless there was an actual change
|
|
||||||
if (old_state != _zmk_keymap_layer_state) {
|
|
||||||
LOG_DBG("layer_changed: layer %d state %d", layer, state);
|
|
||||||
ZMK_EVENT_RAISE(create_layer_state_changed(layer, state));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t zmk_keymap_layer_default() { return _zmk_keymap_layer_default; }
|
inline uint8_t zmk_keymap_layer_default() { return _zmk_keymap_layer_default; }
|
||||||
|
|
||||||
zmk_keymap_layers_state_t zmk_keymap_layer_state() { return _zmk_keymap_layer_state; }
|
inline zmk_keymap_layers_state_t zmk_keymap_layer_state() { return _zmk_keymap_layer_state; }
|
||||||
|
|
||||||
bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) {
|
bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) {
|
||||||
// The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody
|
// The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody
|
||||||
|
@ -111,6 +112,11 @@ bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t
|
||||||
return (state_to_test & (BIT(layer))) == (BIT(layer)) || layer == _zmk_keymap_layer_default;
|
return (state_to_test & (BIT(layer))) == (BIT(layer)) || layer == _zmk_keymap_layer_default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool zmk_keymap_layer_changed_from_prior_state(uint8_t layer,
|
||||||
|
zmk_keymap_layers_state_t prior_state) {
|
||||||
|
return ((prior_state & (BIT(layer))) != (zmk_keymap_layer_state() & (BIT(layer))));
|
||||||
|
}
|
||||||
|
|
||||||
bool zmk_keymap_layer_active(uint8_t layer) {
|
bool zmk_keymap_layer_active(uint8_t layer) {
|
||||||
return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_state);
|
return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_state);
|
||||||
};
|
};
|
||||||
|
@ -124,24 +130,46 @@ uint8_t zmk_keymap_highest_layer_active() {
|
||||||
return zmk_keymap_layer_default();
|
return zmk_keymap_layer_default();
|
||||||
}
|
}
|
||||||
|
|
||||||
int zmk_keymap_layer_activate(uint8_t layer) { return set_layer_state(layer, true); };
|
int zmk_keymap_layer_activate(uint8_t layer) {
|
||||||
|
zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state;
|
||||||
|
|
||||||
int zmk_keymap_layer_deactivate(uint8_t layer) { return set_layer_state(layer, false); };
|
int ret = set_layer_state(layer, true);
|
||||||
|
raise_layer_event(prior_state);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int zmk_keymap_layer_deactivate(uint8_t layer) {
|
||||||
|
zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state;
|
||||||
|
|
||||||
|
int ret = set_layer_state(layer, false);
|
||||||
|
raise_layer_event(prior_state);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int zmk_keymap_layer_toggle(uint8_t layer) {
|
int zmk_keymap_layer_toggle(uint8_t layer) {
|
||||||
if (zmk_keymap_layer_active(layer)) {
|
int ret;
|
||||||
return zmk_keymap_layer_deactivate(layer);
|
zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state;
|
||||||
}
|
|
||||||
|
|
||||||
return zmk_keymap_layer_activate(layer);
|
if (zmk_keymap_layer_active(layer)) {
|
||||||
};
|
ret = set_layer_state(layer, false);
|
||||||
|
} else {
|
||||||
|
ret = set_layer_state(layer, true);
|
||||||
|
}
|
||||||
|
raise_layer_event(prior_state);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int zmk_keymap_layer_to(uint8_t layer) {
|
int zmk_keymap_layer_to(uint8_t layer) {
|
||||||
|
zmk_keymap_layers_state_t prior_state = _zmk_keymap_layer_state;
|
||||||
for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) {
|
for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) {
|
||||||
zmk_keymap_layer_deactivate(i);
|
set_layer_state(i, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
zmk_keymap_layer_activate(layer);
|
set_layer_state(layer, true);
|
||||||
|
raise_layer_event(prior_state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
||||||
kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
||||||
to_pressed: position 1 layer 1
|
to_pressed: position 1 layer 1
|
||||||
layer_changed: layer 1 state 1
|
layer_changed: layer 1, old state 1, state 3
|
||||||
to_released: position 1 layer 1
|
to_released: position 1 layer 1
|
||||||
kp_pressed: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00
|
kp_pressed: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00
|
||||||
kp_released: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00
|
kp_released: usage_page 0x07 keycode 0x0e implicit_mods 0x00 explicit_mods 0x00
|
||||||
to_pressed: position 0 layer 0
|
to_pressed: position 0 layer 0
|
||||||
layer_changed: layer 1 state 0
|
layer_changed: layer 0, old state 3, state 1
|
||||||
layer_changed: layer 0 state 1
|
|
||||||
to_released: position 0 layer 0
|
to_released: position 0 layer 0
|
||||||
kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
kp_pressed: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
||||||
kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
kp_released: usage_page 0x07 keycode 0x16 implicit_mods 0x00 explicit_mods 0x00
|
||||||
to_pressed: position 0 layer 0
|
to_pressed: position 0 layer 0
|
||||||
|
layer_changed: layer 0, old state 1, state 1
|
||||||
to_released: position 0 layer 0
|
to_released: position 0 layer 0
|
||||||
to_pressed: position 1 layer 1
|
to_pressed: position 1 layer 1
|
||||||
layer_changed: layer 1 state 1
|
layer_changed: layer 1, old state 1, state 3
|
||||||
to_released: position 1 layer 1
|
to_released: position 1 layer 1
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
#include <dt-bindings/zmk/kscan-mock.h>
|
#include <dt-bindings/zmk/kscan-mock.h>
|
||||||
#include "../behavior_keymap.dtsi"
|
#include "../behavior_keymap.dtsi"
|
||||||
|
|
||||||
// Press key A
|
// Press key S
|
||||||
// To layer 1
|
// To layer 1
|
||||||
// Press key J
|
// Press key K
|
||||||
// To layer 0
|
// To layer 0
|
||||||
// Press key S
|
// Press key S
|
||||||
// To layer 0 -- does nothing
|
// To layer 0 -- does nothing
|
||||||
|
|
Loading…
Add table
Reference in a new issue