mirror of
https://github.com/C0ntroller/keyboard.git
synced 2024-11-23 06:54:50 +01:00
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.
This commit is contained in:
parent
58bdf0aac7
commit
030f2a39ae
@ -12,6 +12,4 @@
|
|||||||
platform = teensy
|
platform = teensy
|
||||||
board = teensylc
|
board = teensylc
|
||||||
framework = arduino
|
framework = arduino
|
||||||
lib_deps =
|
|
||||||
thomasfredericks/Bounce2@^2.71
|
|
||||||
build_flags = -D USB_MIDI -D TEENSY_OPT_FASTEST
|
build_flags = -D USB_MIDI -D TEENSY_OPT_FASTEST
|
48
src/main.cpp
48
src/main.cpp
@ -1,5 +1,4 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Bounce2.h>
|
|
||||||
|
|
||||||
#define MIDI_NAME {'P', 'i', 'n', 'g', 'b', 'o', 'a', 'r', 'd'}
|
#define MIDI_NAME {'P', 'i', 'n', 'g', 'b', 'o', 'a', 'r', 'd'}
|
||||||
#define MIDI_NAME_LEN 9
|
#define MIDI_NAME_LEN 9
|
||||||
@ -7,27 +6,19 @@
|
|||||||
#define KEY_GROUP_NUM 9
|
#define KEY_GROUP_NUM 9
|
||||||
#define KEY_PINS 6
|
#define KEY_PINS 6
|
||||||
#define NUMBER_OF_KEYS 49
|
#define NUMBER_OF_KEYS 49
|
||||||
#define BOUNCE_TIME 5
|
|
||||||
|
#define DEBOUNCE_TIMES 2
|
||||||
|
|
||||||
#define POWER_SUPPLY_CHECK_PIN 13
|
#define POWER_SUPPLY_CHECK_PIN 13
|
||||||
|
|
||||||
#define SELF_DRIVE_INTERVAL 100
|
#define SELF_DRIVE_INTERVAL 100
|
||||||
|
|
||||||
Bounce group_pins[KEY_GROUP_NUM] {
|
const uint8_t group_pins[KEY_GROUP_NUM] {14, 15, 16, 17, 18, 19, 20, 21, 22};
|
||||||
{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
|
|
||||||
};
|
|
||||||
|
|
||||||
// not KEY0%6..not KEY5%6
|
// not KEY0%6..not KEY5%6
|
||||||
const uint8_t key_pins[KEY_PINS] {2, 3, 4, 5, 6, 7};
|
const uint8_t key_pins[KEY_PINS] {2, 3, 4, 5, 6, 7};
|
||||||
// Array of pressed keys (initially all 0)
|
// 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
|
// 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};
|
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;
|
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
|
// Check if any of the array pins fell since last time
|
||||||
int8_t getActiveKeyGroup() {
|
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++) {
|
for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) {
|
||||||
// Update status
|
// Update status
|
||||||
group_pins[i].update();
|
if (digitalReadFast(group_pins[i])==LOW){
|
||||||
// Check if the pin fell or is low
|
last_active_key_group = (int8_t) i;
|
||||||
// ! inverted
|
active_groups++;
|
||||||
if (group_pins[i].fell()) return i;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If none fell we should have enough time to see which one is low
|
if (active_groups==1){
|
||||||
for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) {
|
return last_active_key_group;
|
||||||
if (group_pins[i].read() == LOW) return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Default return
|
// Default return
|
||||||
@ -105,7 +97,7 @@ FASTRUN void powerStateChanged() {
|
|||||||
void setup() {
|
void setup() {
|
||||||
// Set all in- and outputs
|
// Set all in- and outputs
|
||||||
for (uint8_t i = 0; i < KEY_GROUP_NUM; i++) {
|
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);
|
pinMode(self_drive_pins[i], INPUT);
|
||||||
}
|
}
|
||||||
for (uint8_t i = 0; i < KEY_PINS; i++) {
|
for (uint8_t i = 0; i < KEY_PINS; i++) {
|
||||||
@ -134,20 +126,20 @@ void loop() {
|
|||||||
// ! inverted
|
// ! inverted
|
||||||
if (value == LOW) {
|
if (value == LOW) {
|
||||||
// Check if the key is not already pressed
|
// 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
|
// Send MIDI message
|
||||||
usbMIDI.sendNoteOn(mapToMidi(active_key_group, i), 127, 1);
|
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 {
|
} else {
|
||||||
// Check if the key is not already released
|
// 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
|
// Send MIDI message
|
||||||
usbMIDI.sendNoteOff(mapToMidi(active_key_group, i), 0, 1);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user