Browse Source

fixes for feedback round 2

xmkb
Okke Formsma 4 years ago
parent
commit
c9a82d71d0
  1. 1
      app/dts/behaviors.dtsi
  2. 12
      app/dts/behaviors/homerow_tap.dtsi
  3. 39
      app/src/behaviors/behavior_hold_tap.c
  4. 4
      docs/docs/behavior/hold-tap.md

1
app/dts/behaviors.dtsi

@ -3,7 +3,6 @@ @@ -3,7 +3,6 @@
#include <behaviors/none.dtsi>
#include <behaviors/mod_tap.dtsi>
#include <behaviors/layer_tap.dtsi>
#include <behaviors/homerow_tap.dtsi>
#include <behaviors/momentary_layer.dtsi>
#include <behaviors/toggle_layer.dtsi>
#include <behaviors/reset.dtsi>

12
app/dts/behaviors/homerow_tap.dtsi

@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
/ {
behaviors {
ht: behavior_homerow_mod {
compatible = "zmk,behavior-hold-tap";
label = "HOMEROW_MOD";
#binding-cells = <2>;
flavor = "balanced";
tapping_term_ms = <200>;
bindings = <&kp>, <&kp>;
};
};
};

39
app/src/behaviors/behavior_hold_tap.c

@ -29,6 +29,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); @@ -29,6 +29,13 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
// increase if you have keyboard with more keys.
#define ZMK_BHV_HOLD_TAP_POSITION_NOT_USED 9999
enum flavor {
ZMK_BHV_HOLD_TAP_FLAVOR_HOLD_PREFERRED = 0,
ZMK_BHV_HOLD_TAP_FLAVOR_BALANCED = 1,
ZMK_BHV_HOLD_TAP_FLAVOR_TAP_PREFERRED = 2,
};
struct behavior_hold_tap_behaviors {
struct zmk_behavior_binding tap;
struct zmk_behavior_binding hold;
@ -39,7 +46,7 @@ typedef k_timeout_t (*timer_func)(); @@ -39,7 +46,7 @@ typedef k_timeout_t (*timer_func)();
struct behavior_hold_tap_config {
timer_func tapping_term_ms;
struct behavior_hold_tap_behaviors *behaviors;
int flavor;
enum flavor flavor;
};
// this data is specific for each hold-tap
@ -197,9 +204,6 @@ static void decide_balanced(struct active_hold_tap *hold_tap, enum decision_mome @@ -197,9 +204,6 @@ static void decide_balanced(struct active_hold_tap *hold_tap, enum decision_mome
hold_tap->is_decided = true;
break;
case HT_OTHER_KEY_UP:
hold_tap->is_hold = 1;
hold_tap->is_decided = true;
break;
case HT_TIMER_EVENT:
hold_tap->is_hold = 1;
hold_tap->is_decided = true;
@ -231,9 +235,6 @@ static void decide_hold_preferred(struct active_hold_tap *hold_tap, enum decisio @@ -231,9 +235,6 @@ static void decide_hold_preferred(struct active_hold_tap *hold_tap, enum decisio
hold_tap->is_decided = true;
break;
case HT_OTHER_KEY_DOWN:
hold_tap->is_hold = 1;
hold_tap->is_decided = true;
break;
case HT_TIMER_EVENT:
hold_tap->is_hold = 1;
hold_tap->is_decided = true;
@ -242,6 +243,18 @@ static void decide_hold_preferred(struct active_hold_tap *hold_tap, enum decisio @@ -242,6 +243,18 @@ static void decide_hold_preferred(struct active_hold_tap *hold_tap, enum decisio
}
}
static inline char* flavor_str(enum flavor flavor) {
switch(flavor) {
case ZMK_BHV_HOLD_TAP_FLAVOR_HOLD_PREFERRED:
return "hold-preferred";
case ZMK_BHV_HOLD_TAP_FLAVOR_BALANCED:
return "balanced";
case ZMK_BHV_HOLD_TAP_FLAVOR_TAP_PREFERRED:
return "tap-preferred";
}
return "UNKNOWN FLAVOR";
}
static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_moment event)
{
if (hold_tap->is_decided) {
@ -253,13 +266,13 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_mome @@ -253,13 +266,13 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_mome
return;
}
int flavor = hold_tap->config->flavor;
if (flavor == 1) {
switch(hold_tap->config->flavor) {
case ZMK_BHV_HOLD_TAP_FLAVOR_HOLD_PREFERRED:
decide_hold_preferred(hold_tap, event);
case ZMK_BHV_HOLD_TAP_FLAVOR_BALANCED:
decide_balanced(hold_tap, event);
} else if (flavor == 2) {
case ZMK_BHV_HOLD_TAP_FLAVOR_TAP_PREFERRED:
decide_tap_preferred(hold_tap, event);
} else if (flavor == 0) {
decide_hold_preferred(hold_tap, event);
}
if (!hold_tap->is_decided) {
@ -269,7 +282,7 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_mome @@ -269,7 +282,7 @@ static void decide_hold_tap(struct active_hold_tap *hold_tap, enum decision_mome
LOG_DBG("%d decided %s (%s event %d)",
hold_tap->position,
hold_tap->is_hold ? "hold" : "tap",
flavor == 0 ? "hold-preferred" : flavor == 1 ? "balanced": "tap-preferred",
flavor_str(hold_tap->config->flavor),
event);
undecided_hold_tap = NULL;

4
docs/docs/behavior/hold-tap.md

@ -31,9 +31,9 @@ A code example which configures a mod-tap setting that works with homerow mods: @@ -31,9 +31,9 @@ A code example which configures a mod-tap setting that works with homerow mods:
/ {
behaviors {
&hm: homerow_mods {
hm: homerow_mods {
compatible = "zmk,behavior-hold-tap";
label = "homerow_mods";
label = "HOMEROW_MODS";
#binding-cells = <2>;
tapping_term_ms = <175>;
flavor = "balanced";

Loading…
Cancel
Save