kbscan: Implement key repeat
This commit is contained in:
parent
316895bdea
commit
a8f921fcab
@ -121,6 +121,10 @@ void kbscan_event(void) {
|
|||||||
static bool debounce = false;
|
static bool debounce = false;
|
||||||
static uint32_t debounce_time = 0;
|
static uint32_t debounce_time = 0;
|
||||||
|
|
||||||
|
static bool repeat = false;
|
||||||
|
static uint16_t repeat_key = 0;
|
||||||
|
static uint32_t repeat_key_time = 0;
|
||||||
|
|
||||||
// If debounce complete
|
// If debounce complete
|
||||||
if (debounce) {
|
if (debounce) {
|
||||||
uint32_t time = time_get();
|
uint32_t time = time_get();
|
||||||
@ -166,6 +170,7 @@ void kbscan_event(void) {
|
|||||||
uint8_t new = ~KSI;
|
uint8_t new = ~KSI;
|
||||||
uint8_t last = kbscan_last[i];
|
uint8_t last = kbscan_last[i];
|
||||||
if (new != last) {
|
if (new != last) {
|
||||||
|
// A key was pressed or released
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < KM_IN; j++) {
|
for (j = 0; j < KM_IN; j++) {
|
||||||
bool new_b = new & (1 << j);
|
bool new_b = new & (1 << j);
|
||||||
@ -190,6 +195,17 @@ void kbscan_event(void) {
|
|||||||
// In the case of ignored key press/release, reset bit
|
// In the case of ignored key press/release, reset bit
|
||||||
reset = true;
|
reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (new_b) {
|
||||||
|
// New key pressed, update last key
|
||||||
|
repeat_key = key;
|
||||||
|
repeat_key_time = time_get();
|
||||||
|
repeat = false;
|
||||||
|
} else if (key == repeat_key) {
|
||||||
|
// Repeat key was released
|
||||||
|
repeat_key = 0;
|
||||||
|
repeat = false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
|
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
|
||||||
}
|
}
|
||||||
@ -207,6 +223,29 @@ void kbscan_event(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kbscan_last[i] = new;
|
kbscan_last[i] = new;
|
||||||
|
} else if (new && repeat_key != 0) {
|
||||||
|
// A key is being pressed
|
||||||
|
uint32_t time = time_get();
|
||||||
|
static uint32_t repeat_start = 0;
|
||||||
|
|
||||||
|
if (!repeat) {
|
||||||
|
if (time < repeat_key_time) {
|
||||||
|
// Overflow, reset repeat_key_time
|
||||||
|
repeat_key_time = time;
|
||||||
|
} else if ((time - repeat_key_time) >= 500) {
|
||||||
|
// Typematic repeat
|
||||||
|
repeat = true;
|
||||||
|
repeat_start = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (repeat) {
|
||||||
|
// FIXME: resend key at typematic rate
|
||||||
|
if ((time - repeat_start) > 60) {
|
||||||
|
kbscan_press(repeat_key, true, &layer);
|
||||||
|
repeat_start = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +129,10 @@ void kbscan_event(void) {
|
|||||||
static bool debounce = false;
|
static bool debounce = false;
|
||||||
static uint32_t debounce_time = 0;
|
static uint32_t debounce_time = 0;
|
||||||
|
|
||||||
|
static bool repeat = false;
|
||||||
|
static uint16_t repeat_key = 0;
|
||||||
|
static uint32_t repeat_key_time = 0;
|
||||||
|
|
||||||
// If debounce complete
|
// If debounce complete
|
||||||
if (debounce) {
|
if (debounce) {
|
||||||
uint32_t time = time_get();
|
uint32_t time = time_get();
|
||||||
@ -165,6 +169,7 @@ void kbscan_event(void) {
|
|||||||
uint8_t new = ~KSI;
|
uint8_t new = ~KSI;
|
||||||
uint8_t last = kbscan_last[i];
|
uint8_t last = kbscan_last[i];
|
||||||
if (new != last) {
|
if (new != last) {
|
||||||
|
// A key was pressed or released
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < KM_IN; j++) {
|
for (j = 0; j < KM_IN; j++) {
|
||||||
bool new_b = new & (1 << j);
|
bool new_b = new & (1 << j);
|
||||||
@ -189,6 +194,17 @@ void kbscan_event(void) {
|
|||||||
// In the case of ignored key press/release, reset bit
|
// In the case of ignored key press/release, reset bit
|
||||||
reset = true;
|
reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (new_b) {
|
||||||
|
// New key pressed, update last key
|
||||||
|
repeat_key = key;
|
||||||
|
repeat_key_time = time_get();
|
||||||
|
repeat = false;
|
||||||
|
} else if (key == repeat_key) {
|
||||||
|
// Repeat key was released
|
||||||
|
repeat_key = 0;
|
||||||
|
repeat = false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
|
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
|
||||||
}
|
}
|
||||||
@ -206,6 +222,29 @@ void kbscan_event(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kbscan_last[i] = new;
|
kbscan_last[i] = new;
|
||||||
|
} else if (new && repeat_key != 0) {
|
||||||
|
// A key is being pressed
|
||||||
|
uint32_t time = time_get();
|
||||||
|
static uint32_t repeat_start = 0;
|
||||||
|
|
||||||
|
if (!repeat) {
|
||||||
|
if (time < repeat_key_time) {
|
||||||
|
// Overflow, reset repeat_key_time
|
||||||
|
repeat_key_time = time;
|
||||||
|
} else if ((time - repeat_key_time) >= 500) {
|
||||||
|
// Typematic repeat
|
||||||
|
repeat = true;
|
||||||
|
repeat_start = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (repeat) {
|
||||||
|
// FIXME: resend key at typematic rate
|
||||||
|
if ((time - repeat_start) > 60) {
|
||||||
|
kbscan_press(repeat_key, true, &layer);
|
||||||
|
repeat_start = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +129,10 @@ void kbscan_event(void) {
|
|||||||
static bool debounce = false;
|
static bool debounce = false;
|
||||||
static uint32_t debounce_time = 0;
|
static uint32_t debounce_time = 0;
|
||||||
|
|
||||||
|
static bool repeat = false;
|
||||||
|
static uint16_t repeat_key = 0;
|
||||||
|
static uint32_t repeat_key_time = 0;
|
||||||
|
|
||||||
// If debounce complete
|
// If debounce complete
|
||||||
if (debounce) {
|
if (debounce) {
|
||||||
uint32_t time = time_get();
|
uint32_t time = time_get();
|
||||||
@ -165,6 +169,7 @@ void kbscan_event(void) {
|
|||||||
uint8_t new = ~KSI;
|
uint8_t new = ~KSI;
|
||||||
uint8_t last = kbscan_last[i];
|
uint8_t last = kbscan_last[i];
|
||||||
if (new != last) {
|
if (new != last) {
|
||||||
|
// A key was pressed or released
|
||||||
int j;
|
int j;
|
||||||
for (j = 0; j < KM_IN; j++) {
|
for (j = 0; j < KM_IN; j++) {
|
||||||
bool new_b = new & (1 << j);
|
bool new_b = new & (1 << j);
|
||||||
@ -189,6 +194,17 @@ void kbscan_event(void) {
|
|||||||
// In the case of ignored key press/release, reset bit
|
// In the case of ignored key press/release, reset bit
|
||||||
reset = true;
|
reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (new_b) {
|
||||||
|
// New key pressed, update last key
|
||||||
|
repeat_key = key;
|
||||||
|
repeat_key_time = time_get();
|
||||||
|
repeat = false;
|
||||||
|
} else if (key == repeat_key) {
|
||||||
|
// Repeat key was released
|
||||||
|
repeat_key = 0;
|
||||||
|
repeat = false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
|
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
|
||||||
}
|
}
|
||||||
@ -206,6 +222,29 @@ void kbscan_event(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kbscan_last[i] = new;
|
kbscan_last[i] = new;
|
||||||
|
} else if (new && repeat_key != 0) {
|
||||||
|
// A key is being pressed
|
||||||
|
uint32_t time = time_get();
|
||||||
|
static uint32_t repeat_start = 0;
|
||||||
|
|
||||||
|
if (!repeat) {
|
||||||
|
if (time < repeat_key_time) {
|
||||||
|
// Overflow, reset repeat_key_time
|
||||||
|
repeat_key_time = time;
|
||||||
|
} else if ((time - repeat_key_time) >= 500) {
|
||||||
|
// Typematic repeat
|
||||||
|
repeat = true;
|
||||||
|
repeat_start = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (repeat) {
|
||||||
|
// FIXME: resend key at typematic rate
|
||||||
|
if ((time - repeat_start) > 60) {
|
||||||
|
kbscan_press(repeat_key, true, &layer);
|
||||||
|
repeat_start = time;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user