leader.c
2547 bytes
1// Copyright 2023 QMK
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "leader.h"
5#include "timer.h"
6#include "util.h"
7
8#include <string.h>
9
10#ifndef LEADER_TIMEOUT
11# define LEADER_TIMEOUT 300
12#endif
13
14// Leader key stuff
15bool leading = false;
16uint16_t leader_time = 0;
17uint16_t leader_sequence[5] = {0, 0, 0, 0, 0};
18uint8_t leader_sequence_size = 0;
19
20__attribute__((weak)) void leader_start_user(void) {}
21
22__attribute__((weak)) void leader_end_user(void) {}
23
24void leader_start(void) {
25 if (leading) {
26 return;
27 }
28 leader_start_user();
29 leading = true;
30 leader_time = timer_read();
31 leader_sequence_size = 0;
32 memset(leader_sequence, 0, sizeof(leader_sequence));
33}
34
35void leader_end(void) {
36 leading = false;
37 leader_end_user();
38}
39
40void leader_task(void) {
41 if (leader_sequence_active() && leader_sequence_timed_out()) {
42 leader_end();
43 }
44}
45
46bool leader_sequence_active(void) {
47 return leading;
48}
49
50bool leader_sequence_add(uint16_t keycode) {
51 if (leader_sequence_size >= ARRAY_SIZE(leader_sequence)) {
52 return false;
53 }
54
55#if defined(LEADER_NO_TIMEOUT)
56 if (leader_sequence_size == 0) {
57 leader_reset_timer();
58 }
59#endif
60
61 leader_sequence[leader_sequence_size] = keycode;
62 leader_sequence_size++;
63
64 return true;
65}
66
67bool leader_sequence_timed_out(void) {
68#if defined(LEADER_NO_TIMEOUT)
69 return leader_sequence_size > 0 && timer_elapsed(leader_time) > LEADER_TIMEOUT;
70#else
71 return timer_elapsed(leader_time) > LEADER_TIMEOUT;
72#endif
73}
74
75void leader_reset_timer(void) {
76 leader_time = timer_read();
77}
78
79bool leader_sequence_is(uint16_t kc1, uint16_t kc2, uint16_t kc3, uint16_t kc4, uint16_t kc5) {
80 return leader_sequence[0] == kc1 && leader_sequence[1] == kc2 && leader_sequence[2] == kc3 && leader_sequence[3] == kc4 && leader_sequence[4] == kc5;
81}
82
83bool leader_sequence_one_key(uint16_t kc) {
84 return leader_sequence_is(kc, 0, 0, 0, 0);
85}
86
87bool leader_sequence_two_keys(uint16_t kc1, uint16_t kc2) {
88 return leader_sequence_is(kc1, kc2, 0, 0, 0);
89}
90
91bool leader_sequence_three_keys(uint16_t kc1, uint16_t kc2, uint16_t kc3) {
92 return leader_sequence_is(kc1, kc2, kc3, 0, 0);
93}
94
95bool leader_sequence_four_keys(uint16_t kc1, uint16_t kc2, uint16_t kc3, uint16_t kc4) {
96 return leader_sequence_is(kc1, kc2, kc3, kc4, 0);
97}
98
99bool leader_sequence_five_keys(uint16_t kc1, uint16_t kc2, uint16_t kc3, uint16_t kc4, uint16_t kc5) {
100 return leader_sequence_is(kc1, kc2, kc3, kc4, kc5);
101}