diff --git a/adapter.cpp b/adapter.cpp index b89ca39..05f32dd 100644 --- a/adapter.cpp +++ b/adapter.cpp @@ -16,7 +16,7 @@ VailAdapter::VailAdapter(unsigned int PiezoPin) { // Send a MIDI Key Event void VailAdapter::midiKey(uint8_t key, bool down) { - midiEventPacket_t event = {down?9:8, down?0x90:0x80, key, 0x7f}; + midiEventPacket_t event = {uint8_t(down?9:8), uint8_t(down?0x90:0x80), key, 0x7f}; MidiUSB.sendMIDI(event); MidiUSB.flush(); } @@ -101,6 +101,9 @@ void VailAdapter::HandleMIDI(midiEventPacket_t event) { } break; case 0xC0: // Program Change + if (this->keyer) { + this->keyer->Release(); + } this->keyer = GetKeyerByNumber(event.byte2, this); break; case 0x80: // Note off @@ -111,3 +114,9 @@ void VailAdapter::HandleMIDI(midiEventPacket_t event) { break; } } + +void VailAdapter::Tick(unsigned millis) { + if (this->keyer) { + this->keyer->Tick(millis); + } +} \ No newline at end of file diff --git a/adapter.h b/adapter.h index 935090b..89dfe98 100644 --- a/adapter.h +++ b/adapter.h @@ -22,4 +22,5 @@ public: void HandleMIDI(midiEventPacket_t event); void BeginTx(); void EndTx(); + void Tick(unsigned millis); }; diff --git a/keyers.cpp b/keyers.cpp index b7c4831..13d3162 100644 --- a/keyers.cpp +++ b/keyers.cpp @@ -51,21 +51,28 @@ public: unsigned int ditDuration; bool txRelays[2]; - StraightKeyer(Transmitter *output) { - this->output = output; - this->ditDuration = 100; + StraightKeyer() { this->Reset(); } + void SetOutput(Transmitter *output) { + this->output = output; + } + void Reset() { - this->output->EndTx(); + if (this->output) { + this->output->EndTx(); + } + this->ditDuration = 100; } void SetDitDuration(int duration) { this->ditDuration = duration; } - void Release() {} + void Release() { + this->Reset(); + } bool TxClosed() { for (int i = 0; i < len(this->txRelays); i++) { @@ -103,14 +110,14 @@ public: class BugKeyer: public StraightKeyer { public: - unsigned int pulseTime = 0; + unsigned int nextPulse = 0; bool keyPressed[2]; using StraightKeyer::StraightKeyer; void Reset() { StraightKeyer::Reset(); - this->pulseTime = 0; + this->nextPulse = 0; this->keyPressed[0] = false; this->keyPressed[1] = false; } @@ -124,26 +131,26 @@ public: } } - void beginPulsing() { - this->pulseTime = 1; + void Tick(unsigned int millis) { + if (this->nextPulse && (millis >= this->nextPulse)) { + this->pulse(millis); + } } - void pulse(unsigned int millis) { + void beginPulsing() { + this->nextPulse = 1; + } + + virtual void pulse(unsigned int millis) { if (this->TxClosed(0)) { this->Tx(0, false); } else if (this->keyPressed[0]) { this->Tx(0, true); } else { - this->pulseTime = 0; + this->nextPulse = 0; return; } - this->pulseTime = millis + this->ditDuration; - } - - void Tick(unsigned int millis) { - if (this->pulseTime && (millis >= this->pulseTime)) { - this->pulse(millis); - } + this->nextPulse = millis + this->ditDuration; } }; @@ -172,34 +179,34 @@ public: this->keyPressed[key] = pressed; if (pressed) { this->nextRepeat = key; + this->beginPulsing(); } else { this->nextRepeat = this->whichKeyPressed(); } - this->beginPulsing(); } unsigned int keyDuration(int key) { switch (key) { - case 0: + case PADDLE_DIT: return this->ditDuration; - case 1: - return 3 * this->ditDuration; + case PADDLE_DAH: + return 3 * (this->ditDuration); } - return 0; + return this->ditDuration; // XXX } - int nextTx() { + virtual int nextTx() { if (this->whichKeyPressed() == -1) { return -1; } return this->nextRepeat; } - void pulse(unsigned int millis) { + virtual void pulse(unsigned int millis) { int nextPulse = 0; if (this->TxClosed(0)) { // Pause if we're currently transmitting - nextPulse = this->ditDuration; + nextPulse = this->keyDuration(PADDLE_DIT); this->Tx(0, false); } else { int next = this->nextTx(); @@ -210,9 +217,9 @@ public: } if (nextPulse) { - this->pulseTime = millis + nextPulse; + this->nextPulse = millis + nextPulse; } else { - this->pulseTime = 0; + this->nextPulse = 0; } } }; @@ -235,7 +242,7 @@ public: ElBugKeyer::Key(key, pressed); } - int nextTx() { + virtual int nextTx() { int key = this->queue->shift(); if (key != -1) { return key; @@ -262,7 +269,7 @@ public: ElBugKeyer::Key(key, pressed); } - int nextTx() { + virtual int nextTx() { int key = this->queue->shift(); if (key != -1) { return key; @@ -278,7 +285,7 @@ public: using ElBugKeyer::ElBugKeyer; - int nextTx() { + virtual int nextTx() { int next = ElBugKeyer::nextTx(); if (this->whichKeyPressed() != -1) { this->nextRepeat = 1 - this->nextRepeat; @@ -305,7 +312,7 @@ public: IambicKeyer::Key(key, pressed); } - int nextTx() { + virtual int nextTx() { int next = IambicKeyer::nextTx(); int key = this->queue->shift(); if (key != -1) { @@ -333,7 +340,7 @@ public: IambicKeyer::Key(key, pressed); } - int nextTx() { + virtual int nextTx() { for (int key = 0; key < 2; key++) { if (this->keyPressed[key]) { this->queue->add(key); @@ -365,7 +372,7 @@ public: ElBugKeyer::Key(key, pressed); } - int nextTx() { + virtual int nextTx() { if (this->qlen > 0) { int next = this->queue[0]; this->qlen--; @@ -378,27 +385,34 @@ public: } }; +// StraightKeyer straightKeyer = StraightKeyer(); +// BugKeyer bugKeyer = BugKeyer(); +// ElBugKeyer elBugKeyer = ElBugKeyer(); +// SingleDotKeyer singleDotKeyer = SingleDotKeyer(); +// UltimaticKeyer ultimaticKeyer = UltimaticKeyer(); +// IambicKeyer iambicKeyer = IambicKeyer(); +// IambicAKeyer iambicAKeyer = IambicAKeyer(); +// IambicBKeyer iambicBKeyer = IambicBKeyer(); +// KeyaheadKeyer keyaheadKeyer = KeyaheadKeyer(); + +Keyer *keyers[] = { + // &straightKeyer, + // &bugKeyer, + // &elBugKeyer, + // &singleDotKeyer, + // &ultimaticKeyer, + // &iambicKeyer, + // &iambicAKeyer, + // &iambicBKeyer, + // &keyaheadKeyer, +}; + Keyer *GetKeyerByNumber(int n, Transmitter *output) { - switch (n) { - case 1: - return new StraightKeyer(output); - case 2: - return new BugKeyer(output); - case 3: - return new ElBugKeyer(output); - case 4: - return new SingleDotKeyer(output); - case 5: - return new UltimaticKeyer(output); - case 6: - return new IambicKeyer(output); - case 7: - return new IambicAKeyer(output); - case 8: - return new IambicBKeyer(output); - case 9: - return new KeyaheadKeyer(output); - default: + if (n >= len(keyers)) { return NULL; } + + Keyer *k = keyers[n]; + k->SetOutput(output); + return k; } diff --git a/keyers.h b/keyers.h index b0fcb27..bfcf97b 100644 --- a/keyers.h +++ b/keyers.h @@ -4,7 +4,7 @@ typedef enum { PADDLE_DIT = 0, - PADDLE_DAH, + PADDLE_DAH = 1, PADDLE_STRAIGHT, } Paddle; @@ -16,6 +16,7 @@ public: class Keyer { public: + virtual void SetOutput(Transmitter *output); virtual void Reset(); virtual void SetDitDuration(int d); virtual void Release(); diff --git a/touchbounce.cpp b/touchbounce.cpp index 8051175..a9c19d5 100644 --- a/touchbounce.cpp +++ b/touchbounce.cpp @@ -1,11 +1,11 @@ #include "touchbounce.h" void TouchBounce::attach(int pin) { - this->qt = Adafruit_FreeTouch(pin); + this->qt = Adafruit_FreeTouch(pin, OVERSAMPLE_2, RESISTOR_50K, FREQ_MODE_NONE); this->qt.begin(); } bool TouchBounce::readCurrentState() { int val = this->qt.measure(); - return val < QT_THRESHOLD; + return val > QT_THRESHOLD/2; } diff --git a/vail-adapter.ino b/vail-adapter.ino index f591b54..29a28f7 100644 --- a/vail-adapter.ino +++ b/vail-adapter.ino @@ -87,8 +87,11 @@ void setLED() { } void loop() { + unsigned now = millis(); midiEventPacket_t event = MidiUSB.read(); + setLED(); + adapter.Tick(now); if (event.header) { adapter.HandleMIDI(event); @@ -96,7 +99,7 @@ void loop() { // Monitor straight key pin if (key.update() || qt_key.update()) { - bool pressed = key.read() || qt_key.read(); + bool pressed = !key.read() || qt_key.read(); adapter.HandlePaddle(PADDLE_STRAIGHT, pressed); } @@ -107,12 +110,12 @@ void loop() { } if (dit.update() || qt_dit.update()) { - bool pressed = dit.read() || qt_dit.read(); + bool pressed = !dit.read() || qt_dit.read(); adapter.HandlePaddle(PADDLE_DIT, pressed); } if (dah.update() || qt_dah.update()) { - bool pressed = dah.read() | qt_dah.read(); + bool pressed = !dah.read() || qt_dah.read(); adapter.HandlePaddle(PADDLE_DAH, pressed); } }