kbscan: Implement key repeat

This commit is contained in:
Tim Crawford 2020-02-25 13:14:41 -07:00
parent 316895bdea
commit a8f921fcab
3 changed files with 117 additions and 0 deletions

View File

@ -121,6 +121,10 @@ void kbscan_event(void) {
static bool debounce = false;
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) {
uint32_t time = time_get();
@ -166,6 +170,7 @@ void kbscan_event(void) {
uint8_t new = ~KSI;
uint8_t last = kbscan_last[i];
if (new != last) {
// A key was pressed or released
int j;
for (j = 0; j < KM_IN; 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
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 {
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
}
@ -207,6 +223,29 @@ void kbscan_event(void) {
}
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;
}
}
}
}

View File

@ -129,6 +129,10 @@ void kbscan_event(void) {
static bool debounce = false;
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) {
uint32_t time = time_get();
@ -165,6 +169,7 @@ void kbscan_event(void) {
uint8_t new = ~KSI;
uint8_t last = kbscan_last[i];
if (new != last) {
// A key was pressed or released
int j;
for (j = 0; j < KM_IN; 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
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 {
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
}
@ -206,6 +222,29 @@ void kbscan_event(void) {
}
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;
}
}
}
}

View File

@ -129,6 +129,10 @@ void kbscan_event(void) {
static bool debounce = false;
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) {
uint32_t time = time_get();
@ -165,6 +169,7 @@ void kbscan_event(void) {
uint8_t new = ~KSI;
uint8_t last = kbscan_last[i];
if (new != last) {
// A key was pressed or released
int j;
for (j = 0; j < KM_IN; 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
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 {
WARN("KB %d, %d, %d missing\n", i, j, kbscan_layer);
}
@ -206,6 +222,29 @@ void kbscan_event(void) {
}
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;
}
}
}
}