aboutsummaryrefslogtreecommitdiffstats
path: root/quantum/process_keycode/process_chording.c
blob: d7814629f34577c438fc37ed9286fe4788e767dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "process_chording.h"

bool keys_chord(uint8_t keys[]) {
  uint8_t keys_size = sizeof(keys)/sizeof(keys[0]);
  bool pass = true;
  uint8_t in = 0;
  for (uint8_t i = 0; i < chord_key_count; i++) {
    bool found = false;
    for (uint8_t j = 0; j < keys_size; j++) {
      if (chord_keys[i] == (keys[j] & 0xFF)) {
        in++; // detects key in chord
        found = true;
        break;
      }
    }
    if (found)
      continue;
    if (chord_keys[i] != 0)  {
      pass = false; // makes sure rest are blank
    }
  }
  return (pass && (in == keys_size));
}

bool process_chording(uint16_t keycode, keyrecord_t *record) {
  if (keycode >= QK_CHORDING && keycode <= QK_CHORDING_MAX) {
    if (record->event.pressed) {
      if (!chording) {
        chording = true;
        for (uint8_t i = 0; i < CHORDING_MAX; i++)
          chord_keys[i] = 0;
        chord_key_count = 0;
        chord_key_down = 0;
      }
      chord_keys[chord_key_count] = (keycode & 0xFF);
      chord_key_count++;
      chord_key_down++;
      return false;
    } else {
      if (chording) {
        chord_key_down--;
        if (chord_key_down == 0) {
          chording = false;
          // Chord Dictionary
          if (keys_chord((uint8_t[]){KC_ENTER, KC_SPACE})) {
            register_code(KC_A);
            unregister_code(KC_A);
            return false;
          }
          for (uint8_t i = 0; i < chord_key_count; i++) {
            register_code(chord_keys[i]);
            unregister_code(chord_keys[i]);
            return false;
          }
        }
      }
    }
  }
  return true;
}
= "uboot_env"; reg = <0x10000 0x10000>; /* 64 KB */ read-only; }; partition@20000 { label = "linux"; reg = <0x20000 0x3d0000>; }; partition@400000 { label = "boardconfig"; reg = <0x3f0000 0x10000>; read-only; }; }; gpiomm: gpiomm@4000000 { compatible = "lantiq,gpio-mm"; reg = <1 0x0 0x10 >; #address-cells = <1>; #size-cells = <1>; #gpio-cells = <2>; gpio-controller; lantiq,shadow = <0x0>; }; mac_addr { compatible = "lantiq,eth-mac"; reg = <0 0x3f0016 0x6>; mac-increment = <2>; }; ath5k_eep { compatible = "ath5k,eeprom"; reg = <0 0x3f0400 0x800 0 0x3f0016 0x6>; ath,mac-increment = <1>; ath,eep-swap; }; }; gpio: pinmux@E100B10 { pinctrl-names = "default"; pinctrl-0 = <&state_default>; state_default: pinmux { ebu { lantiq,groups = "ebu cs1"; lantiq,function = "ebu"; }; pci_in { lantiq,groups = "req1", "req2"; lantiq,function = "pci"; lantiq,open-drain = <1>; lantiq,pull = <2>; lantiq,output = <0>; }; pci_out { lantiq,groups = "gnt1", "gnt2"; lantiq,function = "pci"; lantiq,pull = <0>; lantiq,output = <1>; }; }; }; etop@E180000 { phy-mode = "rmii"; }; ifxhcd@E101000 { status = "okay"; gpios = <&gpio 14 0>; }; pci@E105400 { status = "okay"; lantiq,external-clock; gpio-reset = <&gpio 21 0>; req-mask = <0xf>; }; }; /* #define ARV4518PW_SWITCH_RESET 13 */ gpio-keys-polled { compatible = "gpio-keys-polled"; #address-cells = <1>; #size-cells = <0>; poll-interval = <100>; rfkill { label = "rfkill"; gpios = <&gpio 28 1>; linux,code = <0xf7>; }; reset { label = "reset"; gpios = <&gpio 30 1>; linux,code = <0x198>; }; }; gpio-leds { compatible = "gpio-leds"; power { label = "power"; gpios = <&gpio 3 0>; }; dsl { label = "dsl"; gpios = <&gpio 4 1>; }; online { label = "online"; gpios = <&gpio 5 1>; }; wifi { label = "wifi"; gpios = <&gpio 6 1>; }; wps { label = "wps"; gpios = <&gpio 7 1>; }; dsl2 { label = "dsl2"; gpios = <&gpio 8 1>; }; usb { label = "usb"; gpios = <&gpio 19 1>; }; voice { label = "voice"; gpios = <&gpiomm 0 1>; }; fxs1 { label = "fxs1"; gpios = <&gpiomm 1 1>; }; fxs2 { label = "fxs2"; gpios = <&gpiomm 2 1>; }; fxo { label = "fxo"; gpios = <&gpiomm 3 1>; }; }; };