fixed ghostkey detection
This commit is contained in:
parent
5d7ab00387
commit
3ceb3a521a
@ -270,7 +270,7 @@ uint8_t scankeys(uint8_t* reportBuffer, uint8_t* oldReportBuffer, uint8_t sizeOf
|
||||
if (data & (1 << col)) {
|
||||
key = pgm_read_byte(&keymatrix[row][col]);
|
||||
modifier = pgm_read_byte(&modmatrix[row][col]);
|
||||
isghostkey = ghostmatrix[row] & (1 << col);
|
||||
isghostkey = (ghostmatrix[row] & (1 << col)) != 0;
|
||||
} else {
|
||||
key = KEY_Reserved;
|
||||
modifier = MOD_NONE;
|
||||
|
@ -37,8 +37,6 @@
|
||||
#define LEDNUM PIND3 ///< address of the num-lock LED
|
||||
#define LEDCAPS PIND6 ///< address of the caps-lock LED
|
||||
#define LEDSCROLL PIND7 ///< address of the scroll-lock LED
|
||||
#define LEDBACK1 PIND4 ///< address of the first backlight LED
|
||||
#define LEDBACK2 PIND5 ///< address of the second backlight LED
|
||||
|
||||
uint8_t curmatrix[16]; ///< contains current state of the keyboard
|
||||
uint8_t oldmatrix[16]; ///< contains old state of the keyboard
|
||||
@ -272,7 +270,7 @@ uint8_t scankeys(uint8_t* reportBuffer, uint8_t* oldReportBuffer, uint8_t sizeOf
|
||||
if (data & (1 << col)) {
|
||||
key = pgm_read_byte(&keymatrix[row][col]);
|
||||
modifier = pgm_read_byte(&modmatrix[row][col]);
|
||||
isghostkey = ghostmatrix[row] & (1 << col);
|
||||
isghostkey = (ghostmatrix[row] & (1 << col)) != 0;
|
||||
} else {
|
||||
key = KEY_Reserved;
|
||||
modifier = MOD_NONE;
|
||||
|
@ -94,7 +94,7 @@ void printMatrix(void) {
|
||||
}
|
||||
|
||||
void setLeds(uint8_t LEDstate) {
|
||||
if (LEDstate & LED_NUM) { // light up caps lock
|
||||
if (LEDstate & LED_NUM) { // light up num lock
|
||||
PORTLEDS &= ~(1 << LEDNUM);
|
||||
} else {
|
||||
PORTLEDS |= (1 << LEDNUM);
|
||||
@ -104,7 +104,7 @@ void setLeds(uint8_t LEDstate) {
|
||||
} else {
|
||||
PORTLEDS |= (1 << LEDCAPS);
|
||||
}
|
||||
if (LEDstate & LED_SCROLL) { // light up caps lock
|
||||
if (LEDstate & LED_SCROLL) { // light up scroll lock
|
||||
PORTLEDS &= ~(1 << LEDSCROLL);
|
||||
} else {
|
||||
PORTLEDS |= (1 << LEDSCROLL);
|
||||
@ -240,9 +240,18 @@ uint8_t scankeys(uint8_t* reportBuffer, uint8_t* oldReportBuffer, uint8_t sizeOf
|
||||
debounce--;
|
||||
}
|
||||
if (debounce == 1) {
|
||||
if (memcmp(oldmatrix, curmatrix, sizeof(curmatrix)) != 0) {
|
||||
//printMatrix();
|
||||
memcpy(oldmatrix, curmatrix, sizeof(curmatrix));
|
||||
memset(ghostmatrix, 0, sizeof(ghostmatrix));
|
||||
for (uint8_t i = 0; i < 21; i++) {
|
||||
uint16_t keys = (~curmatrix[i]) & 0x1fff;
|
||||
if (bitcount2(keys)) { // check if 2 or more keys are pressed
|
||||
for (uint8_t j = i + 1; j < 22; j++) {
|
||||
uint16_t common_columns = keys & (~curmatrix[j]);
|
||||
if (bitcount2(common_columns)) { // 2 or more columns in common => ghostkeys
|
||||
ghostmatrix[i] |= common_columns;
|
||||
ghostmatrix[j] |= common_columns;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// debounce counter expired, create report
|
||||
uint8_t reportIndex = 2; // reportBuffer[0] contains modifiers
|
||||
@ -255,7 +264,7 @@ uint8_t scankeys(uint8_t* reportBuffer, uint8_t* oldReportBuffer, uint8_t sizeOf
|
||||
if (!(data & (1 << col))) {
|
||||
key = pgm_read_byte(&keymatrix[row][col]);
|
||||
modifier = pgm_read_byte(&modmatrix[row][col]);
|
||||
isghostkey = ghostmatrix[row] & (1 << col);
|
||||
isghostkey = (ghostmatrix[row] & (1 << col)) != 0;
|
||||
} else {
|
||||
key = KEY_Reserved;
|
||||
modifier = MOD_NONE;
|
||||
|
Loading…
Reference in New Issue
Block a user