diff --git a/src/keyer.cpp b/src/keyer.cpp index 4a28f0e..f2a4a77 100644 --- a/src/keyer.cpp +++ b/src/keyer.cpp @@ -9,7 +9,6 @@ extern const uint LED_PIN; extern const uint LEFT_PADDLE_PIN; extern const uint RIGHT_PADDLE_PIN; - const uint SIDETONE_FREQ = 622; bool left_paddle_pressed() @@ -36,7 +35,7 @@ uint64_t calcElementDurationUs(uint8_t wpm) return duration; } -Keyer::Keyer(uint8_t wpm) : m_wpm(wpm) +Keyer::Keyer(uint8_t wpm, Mode mode) : m_wpm(wpm), m_mode(mode) { m_elementDuration = calcElementDurationUs(m_wpm); } @@ -50,9 +49,12 @@ void Keyer::run() case State::Wait: if (left_paddle_pressed() && right_paddle_pressed()) { - if (m_lastSymbolWas == Symbol::Dit) { + if (m_lastSymbolWas == Symbol::Dit) + { state = State::Dah; - } else if (m_lastSymbolWas == Symbol::Dah) { + } + else if (m_lastSymbolWas == Symbol::Dah) + { state = State::Dit; } break; @@ -77,6 +79,9 @@ void Keyer::run() } else { + if (right_paddle_pressed() && !m_keyNextIambicB) + m_keyNextIambicB = true; + if (absolute_time_diff_us(timestamp, m_keying_until) <= 0) { m_currentlyKeying = false; @@ -98,6 +103,9 @@ void Keyer::run() } else { + if (left_paddle_pressed() && !m_keyNextIambicB) + m_keyNextIambicB = true; + if (absolute_time_diff_us(timestamp, m_keying_until) <= 0) { m_currentlyKeying = false; @@ -109,14 +117,27 @@ void Keyer::run() } break; case State::InterCharSpace: - if (m_previousState != State::InterCharSpace) + if (!m_currentlyPausing) { m_pausing_until = make_timeout_time_us(m_elementDuration); - m_previousState = State::InterCharSpace; + m_currentlyPausing = true; } if (absolute_time_diff_us(timestamp, m_pausing_until) <= 0) { + m_currentlyPausing = false; + + if (m_mode == Mode::IAMBIC_B && m_keyNextIambicB) + { + if (m_previousState == State::Dit) + state = State::Dah; + else + state = State::Dit; + + m_keyNextIambicB = false; + break; + } + state = State::Wait; } diff --git a/src/keyer.h b/src/keyer.h index bb1e05f..624cfd1 100644 --- a/src/keyer.h +++ b/src/keyer.h @@ -2,6 +2,7 @@ #define KEYER_H #include "sidetone.h" +#include "settings.h" extern const uint BUZZER_PIN; @@ -16,7 +17,7 @@ public: InterCharSpace, // TODO: perhaps new state: Keying }; - Keyer(uint8_t wpm); + Keyer(uint8_t wpm, Mode mode); void run(); @@ -30,12 +31,15 @@ private: State state{State::Wait}; State m_previousState{State::Wait}; uint8_t m_wpm{18}; + Mode m_mode{Mode::IAMBIC_B}; uint64_t m_elementDuration{0}; bool m_currentlyKeying{false}; + bool m_currentlyPausing{false}; absolute_time_t m_keying_until{0}; absolute_time_t m_pausing_until{0}; Symbol m_lastSymbolWas{Symbol::Dit}; Sidetone m_Sidetone{BUZZER_PIN}; + bool m_keyNextIambicB{false}; }; #endif \ No newline at end of file diff --git a/src/raspi_keyer.cpp b/src/raspi_keyer.cpp index fe4b359..33f66a4 100644 --- a/src/raspi_keyer.cpp +++ b/src/raspi_keyer.cpp @@ -47,7 +47,7 @@ int main() // printf("Element duration (u_sec): %" PRIu64 "\n", element_duration_us(settings.wpm)); printf("\n"); - Keyer keyer(25); + Keyer keyer(settings.wpm, settings.mode); while (true) {