Fix observed ghosts: https://github.com/tompi/cheapino/issues/33
This commit is contained in:
parent
f66d8439a7
commit
4cfdc10412
@ -35,3 +35,5 @@
|
|||||||
|
|
||||||
|
|
||||||
#define MAX_DEFERRED_EXECUTORS 32
|
#define MAX_DEFERRED_EXECUTORS 32
|
||||||
|
|
||||||
|
// #define DEBUG_MATRIX_SCAN_RATE
|
||||||
|
96
keyboards/cheapino/ghosting.c
Normal file
96
keyboards/cheapino/ghosting.c
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
//
|
||||||
|
// Created by Thomas Haukland on 2024-05-05.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "matrix.h"
|
||||||
|
#include "quantum.h"
|
||||||
|
#include "print.h"
|
||||||
|
|
||||||
|
// This is just to be able to declare constants as they appear in the qmk console
|
||||||
|
#define rev(b) \
|
||||||
|
((b & 1) << 15) | \
|
||||||
|
((b & (1 << 1)) << 13) | \
|
||||||
|
((b & (1 << 2)) << 11) | \
|
||||||
|
((b & (1 << 3)) << 9) | \
|
||||||
|
((b & (1 << 4)) << 7) | \
|
||||||
|
((b & (1 << 5)) << 5) | \
|
||||||
|
((b & (1 << 6)) << 3) | \
|
||||||
|
((b & (1 << 7)) << 1) | \
|
||||||
|
((b & (1 << 8)) >> 1) | \
|
||||||
|
((b & (1 << 9)) >> 3) | \
|
||||||
|
((b & (1 << 10)) >> 5) | \
|
||||||
|
((b & (1 << 11)) >> 7) | \
|
||||||
|
((b & (1 << 12)) >> 9) | \
|
||||||
|
((b & (1 << 13)) >> 11) | \
|
||||||
|
((b & (1 << 14)) >> 13) | \
|
||||||
|
b >> 15
|
||||||
|
|
||||||
|
/* This is for debugging the matrix rows
|
||||||
|
void printBits(uint16_t n)
|
||||||
|
{
|
||||||
|
long i;
|
||||||
|
for (i = 15; i >= 0; i--) {
|
||||||
|
if ((n & (1 << i)) != 0) {
|
||||||
|
printf("1");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool bit_pattern_set(uint16_t number, uint16_t bitPattern) {
|
||||||
|
return !(~number & bitPattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fix_ghosting_instance(
|
||||||
|
matrix_row_t current_matrix[],
|
||||||
|
ushort row_num_with_possible_error_cause,
|
||||||
|
uint16_t possible_error_cause,
|
||||||
|
ushort row_num_with_possible_error,
|
||||||
|
uint16_t possible_error,
|
||||||
|
uint16_t error_fix) {
|
||||||
|
if (bit_pattern_set(current_matrix[row_num_with_possible_error_cause], possible_error_cause)) {
|
||||||
|
if (bit_pattern_set(current_matrix[row_num_with_possible_error], possible_error)) {
|
||||||
|
current_matrix[row_num_with_possible_error] = current_matrix[row_num_with_possible_error] ^ error_fix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fix_ghosting_column(
|
||||||
|
matrix_row_t matrix[],
|
||||||
|
uint16_t possible_error_cause,
|
||||||
|
uint16_t possible_error,
|
||||||
|
uint16_t error_fix) {
|
||||||
|
// First the right side
|
||||||
|
for (short i = 0; i<3; i++) {
|
||||||
|
fix_ghosting_instance(matrix, i, possible_error_cause, (i+1)%3, possible_error, error_fix);
|
||||||
|
fix_ghosting_instance(matrix, i, possible_error_cause, (i+2)%3, possible_error, error_fix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Then exactly same procedure on the left side
|
||||||
|
for (short i = 0; i<3; i++) {
|
||||||
|
fix_ghosting_instance(matrix, i+4, possible_error_cause<<6, 4+((i+1)%3), possible_error<<6, error_fix<<6);
|
||||||
|
fix_ghosting_instance(matrix, i+4, possible_error_cause<<6, 4+((i+2)%3), possible_error<<6, error_fix<<6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// For QWERTY layout, key combo a+s+e also outputs q. This suppresses the q, and other similar ghosts
|
||||||
|
// These are observed ghosts(following a pattern). TODO: need to fix this for v3
|
||||||
|
// Might need to add 2 diodes(one in each direction) for every row, to increase voltage drop.
|
||||||
|
void fix_ghosting(matrix_row_t matrix[]) {
|
||||||
|
fix_ghosting_column(matrix, rev(0B0110000000000000), rev(0B1010000000000000), rev(0B1000000000000000));
|
||||||
|
fix_ghosting_column(matrix, rev(0B0110000000000000), rev(0B0101000000000000), rev(0B0001000000000000));
|
||||||
|
|
||||||
|
fix_ghosting_column(matrix, rev(0B0001100000000000), rev(0B0010100000000000), rev(0B0010000000000000));
|
||||||
|
fix_ghosting_column(matrix, rev(0B0001100000000000), rev(0B0001010000000000), rev(0B0000010000000000));
|
||||||
|
|
||||||
|
fix_ghosting_column(matrix, rev(0B1000010000000000), rev(0B1000100000000000), rev(0B1000000000000000));
|
||||||
|
fix_ghosting_column(matrix, rev(0B1000010000000000), rev(0B0100010000000000), rev(0B0000010000000000));
|
||||||
|
|
||||||
|
fix_ghosting_column(matrix, rev(0B1001000000000000), rev(0B0101000000000000), rev(0B0001000000000000));
|
||||||
|
|
||||||
|
fix_ghosting_column(matrix, rev(0B0100100000000000), rev(0B0100010000000000), rev(0B0100000000000000));
|
||||||
|
}
|
5
keyboards/cheapino/ghosting.h
Normal file
5
keyboards/cheapino/ghosting.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
//
|
||||||
|
// Created by Thomas Haukland on 2024-05-05.
|
||||||
|
//
|
||||||
|
|
||||||
|
void fix_ghosting(matrix_row_t current_matrix[]);
|
@ -26,10 +26,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
#include "debounce.h"
|
#include "debounce.h"
|
||||||
#include "encoder.h"
|
#include "encoder.h"
|
||||||
|
#include "ghosting.h"
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
|
|
||||||
// How long the scanning code waits for changed io to settle.
|
// How long the scanning code waits for changed io to settle.
|
||||||
#define MATRIX_IO_DELAY 30
|
// Adjust from default 30 to weigh up for increased time spent ghost-hunting.
|
||||||
|
// (the rp2040 does not seem to have any problems with this value...)
|
||||||
|
#define MATRIX_IO_DELAY 25
|
||||||
|
|
||||||
#define COL_SHIFTER ((uint16_t)1)
|
#define COL_SHIFTER ((uint16_t)1)
|
||||||
|
|
||||||
@ -142,6 +145,8 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
|||||||
|
|
||||||
fix_encoder_action(current_matrix);
|
fix_encoder_action(current_matrix);
|
||||||
|
|
||||||
|
fix_ghosting(current_matrix);
|
||||||
|
|
||||||
return has_matrix_changed(current_matrix);
|
return has_matrix_changed(current_matrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,4 +4,5 @@ WS2812_DRIVER = vendor
|
|||||||
RGBLIGHT_ENABLE = yes
|
RGBLIGHT_ENABLE = yes
|
||||||
DEFERRED_EXEC_ENABLE = yes
|
DEFERRED_EXEC_ENABLE = yes
|
||||||
SRC += encoder.c
|
SRC += encoder.c
|
||||||
|
SRC += ghosting.c
|
||||||
SRC += matrix.c
|
SRC += matrix.c
|
Loading…
x
Reference in New Issue
Block a user