// Compile with `gcc -Wall -o read_typewriter_signals read_typewriter_signals.c -lwiringPi` #include #include int main(void) { wiringPiSetup(); setbuf(stdout, NULL); int scanPins[] = {5, 22, 10, 11, 26, 27, 28, 29}; int signalPins[] = {13, 12, 3, 2, 0, 7, 24, 23}; int i = 0; int j = 0; for (i=0; i<8; i++) { pinMode(scanPins[i], INPUT); pinMode(signalPins[i], INPUT); pullUpDnControl(scanPins[i], PUD_UP); pullUpDnControl(signalPins[i], PUD_UP); } int keyDown[8][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} }; int lastI; int lastJ; int sameKeyCount = 0; for (;;) { for (i=0; i<8; i++) { for (j=0; j<8; j++) { if (digitalRead(scanPins[i]) == LOW && digitalRead(signalPins[j]) == LOW) { (i == lastI && j == lastJ) ? sameKeyCount++ : sameKeyCount = 0; if (sameKeyCount > 50 && keyDown[i][j] <= 0) { printf("%d,%d\n", i, j); keyDown[i][j] = 50; } lastI = i; lastJ = j; } if (digitalRead(scanPins[i]) == LOW && digitalRead(signalPins[j]) == HIGH) { keyDown[i][j] = (keyDown[i][j] - 1); } } } } }