From 030f2a39ae7bd8acdf3d22d9b40a6a894e395105 Mon Sep 17 00:00:00 2001 From: Oliver Parczyk Date: Sat, 16 Dec 2023 11:47:33 +0100 Subject: [PATCH] Remove debounce library dependency Debouncing, the way it was done may have been appropriate for human input, but is wholly inadequate for the sequential scanning of the host keyboard IC. It is however neccessary to provide something like debounce, because the teensy and host IC aren't syncronized. --- platformio.ini | 2 -- src/main.cpp | 52 +++++++++++++++++++++----------------------------- 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/platformio.ini b/platformio.ini index 111ac9f..98678c2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,6 +12,4 @@ platform = teensy board = teensylc framework = arduino -lib_deps = - thomasfredericks/Bounce2@^2.71 build_flags = -D USB_MIDI -D TEENSY_OPT_FASTEST \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 6537301..20976f8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,4 @@ #include -#include #define MIDI_NAME {'P', 'i', 'n', 'g', 'b', 'o', 'a', 'r', 'd'} #define MIDI_NAME_LEN 9 @@ -7,27 +6,19 @@ #define KEY_GROUP_NUM 9 #define KEY_PINS 6 #define NUMBER_OF_KEYS 49 -#define BOUNCE_TIME 5 + +#define DEBOUNCE_TIMES 2 + #define POWER_SUPPLY_CHECK_PIN 13 #define SELF_DRIVE_INTERVAL 100 -Bounce group_pins[KEY_GROUP_NUM] { - {14, BOUNCE_TIME}, // not KEYS1..6 - {15, BOUNCE_TIME}, // not KEYS7..12 - {16, BOUNCE_TIME}, // not KEYS13..18 - {17, BOUNCE_TIME}, // not KEYS19..24 - {18, BOUNCE_TIME}, // not KEYS25..30 - {19, BOUNCE_TIME}, // not KEYS31..36 - {20, BOUNCE_TIME}, // not KEYS37..42 - {21, BOUNCE_TIME}, // not KEYS43..48 - {22, BOUNCE_TIME} // not KEYS49 -}; +const uint8_t group_pins[KEY_GROUP_NUM] {14, 15, 16, 17, 18, 19, 20, 21, 22}; // not KEY0%6..not KEY5%6 const uint8_t key_pins[KEY_PINS] {2, 3, 4, 5, 6, 7}; // Array of pressed keys (initially all 0) -bool keys_pressed[NUMBER_OF_KEYS]; +uint8_t keys_pressed[NUMBER_OF_KEYS]; // K1, K2, K3, K4, K5, K12, K13, K14, K15 const uint8_t self_drive_pins[KEY_GROUP_NUM] {8, 9, 10, 11, 12, 26, 23, 24, 25}; volatile uint8_t current_self_drive_pin = 0; @@ -64,17 +55,18 @@ uint8_t mapToMidi(uint8_t active_key_group, uint8_t key) { // Check if any of the array pins fell since last time int8_t getActiveKeyGroup() { + uint8_t active_groups = 0; + int8_t last_active_key_group = -1; for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) { // Update status - group_pins[i].update(); - // Check if the pin fell or is low - // ! inverted - if (group_pins[i].fell()) return i; + if (digitalReadFast(group_pins[i])==LOW){ + last_active_key_group = (int8_t) i; + active_groups++; + } } - - // If none fell we should have enough time to see which one is low - for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) { - if (group_pins[i].read() == LOW) return i; + + if (active_groups==1){ + return last_active_key_group; } // Default return @@ -105,7 +97,7 @@ FASTRUN void powerStateChanged() { void setup() { // Set all in- and outputs for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) { - pinMode(group_pins[i].getPin(), INPUT); + pinMode(group_pins[i], INPUT); pinMode(self_drive_pins[i], INPUT); } for (uint8_t i = 0; i < KEY_PINS; i++) { @@ -134,23 +126,23 @@ void loop() { // ! inverted if (value == LOW) { // Check if the key is not already pressed - if (keys_pressed[active_key_group * 6 + i] == 0) { + if (keys_pressed[active_key_group * 6 + i] >= DEBOUNCE_TIMES) { // Send MIDI message usbMIDI.sendNoteOn(mapToMidi(active_key_group, i), 127, 1); - // Set the entry in the array - keys_pressed[active_key_group * 6 + i] = 1; } + // Set the entry in the array + keys_pressed[active_key_group * 6 + i] += keys_pressed[active_key_group * 6 + i] < 0xFF? 1:0; } else { // Check if the key is not already released - if (keys_pressed[active_key_group * 6 + i] == 1) { + if (keys_pressed[active_key_group * 6 + i] < DEBOUNCE_TIMES) { // Send MIDI message usbMIDI.sendNoteOff(mapToMidi(active_key_group, i), 0, 1); - // Set the entry in the array - keys_pressed[active_key_group * 6 + i] = 0; } + // Set the entry in the array + keys_pressed[active_key_group * 6 + i] = 0; } } - } + } // MIDI Controllers should discard incoming MIDI messages. while (usbMIDI.read()) {