diff --git a/firmware/modelibmmodelm.c b/firmware/modelibmmodelm.c index 08a1c1a..6d7fa5f 100644 --- a/firmware/modelibmmodelm.c +++ b/firmware/modelibmmodelm.c @@ -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; diff --git a/firmware/modelmayhem.c b/firmware/modelmayhem.c index 6c177eb..fe6d16c 100644 --- a/firmware/modelmayhem.c +++ b/firmware/modelmayhem.c @@ -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; diff --git a/firmware/modelsuntype5.c b/firmware/modelsuntype5.c index f82a772..bfb9b2a 100644 --- a/firmware/modelsuntype5.c +++ b/firmware/modelsuntype5.c @@ -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;