From b32f71fccf6c9e636d8dcca0afa4eef8d16a715b Mon Sep 17 00:00:00 2001 From: Petr Mikhalicin Date: Mon, 8 Jul 2024 17:48:11 +0500 Subject: [PATCH] Play melody after printing base in split grade --- README.md | 2 +- README_RU.md | 2 +- src/Beeper.cpp | 53 +++++++++++++++++++++++++++++------- src/Beeper.h | 7 ++++- src/Modes/FStopTestMode.cpp | 4 ++- src/Modes/LinearTestMode.cpp | 4 ++- 6 files changed, 57 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index a842c60..d37983b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ 2. Linear test mode: simple mode for linear testing 3. Print mode: ability to stop printing at any time. Usefull for getting fast masking values 4. Mask mode: for printing with accurate masks -4. Split grade test modes: the same as fstop and linear test modes, but allows to set base time +5. Split grade test modes: the same as fstop and linear test modes, but allows to set base time. After printing base, the melody is playing to not forget change filter ## Killer features: diff --git a/README_RU.md b/README_RU.md index 4072429..78419ed 100644 --- a/README_RU.md +++ b/README_RU.md @@ -28,7 +28,7 @@ 2. Линейный тест: Задается начальное значение и шаг 3. Режим печати: можете задать время и печатать с ним. Дополнительно есть возможность остановки печати и печати по удержанию кнопки (удобно для маскирования и коротких выдержках). 4. Режим маскирования: задайте количество масок и время, которое нужено для засветки определенной маски -4. Сплит грейд тесты: аналогичны тестам F стопами и линейным тестам, но с возможностью выставить начальное время экспонирования (время засветки первым фильтром) +5. Сплит грейд тесты: аналогичны тестам F стопами и линейным тестам, но с возможностью выставить начальное время экспонирования (время засветки первым фильтром). После печати базового времени играет мелодия, чтобы вы не забыли сменить фильтр ## Killer фичи: diff --git a/src/Beeper.cpp b/src/Beeper.cpp index 4cb3a9b..0d6673f 100644 --- a/src/Beeper.cpp +++ b/src/Beeper.cpp @@ -2,6 +2,8 @@ #include "Tools.h" +constexpr uint16_t kMelodySwitchTimes[] = { 250, 250, 125, 125, 60, 60, 400 }; + void Beeper::tick() { uint32_t currentTime = millis(); switch (m_state) { @@ -22,12 +24,12 @@ void Beeper::tick() { m_pinState = false; } break; + case State::melody: + processMelody(); + break; } - if (m_pinState) - analogWrite(m_pin, gSettings.beepVolume); - else - analogWrite(m_pin, 0); + processPin(); } void Beeper::setup() { @@ -40,7 +42,7 @@ void Beeper::beep() { m_pinState = true; m_timer = millis() + 100; - analogWrite(m_pinState, gSettings.beepVolume); + processPin(); } void Beeper::start(bool silentStart) { @@ -54,13 +56,44 @@ void Beeper::start(bool silentStart) { m_timer = millis() + 100; } - if (m_pinState) - analogWrite(m_pin, gSettings.beepVolume); - else - analogWrite(m_pin, 0); + processPin(); } void Beeper::stop() { m_state = State::off; - analogWrite(m_pinState, 0); + processPin(); +} + +void Beeper::melody() { + m_state = State::melody; + + m_timer = millis() + kMelodySwitchTimes[0]; + m_melodyPhase = 0; + m_pinState = true; + + processMelody(); + processPin(); +} + +void Beeper::processMelody() { + if (m_timer > millis()) + return; + + ++m_melodyPhase; + + if (m_melodyPhase == sizeof(kMelodySwitchTimes) / sizeof(kMelodySwitchTimes[0])) { + m_pinState = false; + m_state = State::off; + return; + } + + m_pinState = !m_pinState; + m_timer = millis() + kMelodySwitchTimes[m_melodyPhase]; +} + +void Beeper::processPin() const { + if (m_pinState) + analogWrite(m_pin, gSettings.beepVolume); + else + analogWrite(m_pin, 0); } diff --git a/src/Beeper.h b/src/Beeper.h index 53d9198..b9e59bd 100644 --- a/src/Beeper.h +++ b/src/Beeper.h @@ -6,9 +6,10 @@ class Beeper { public: Beeper(uint8_t pin) : m_pin(pin) {} - enum class State { off, on, single }; + enum class State { off, on, single, melody }; void beep(); + void melody(); // start beep every second void start(bool silentStart = false); @@ -18,7 +19,11 @@ class Beeper { void tick(); private: + void processMelody(); + void processPin() const; + bool m_pinState = false; + uint8_t m_melodyPhase; State m_state = State::off; uint8_t m_pin; uint32_t m_timer; diff --git a/src/Modes/FStopTestMode.cpp b/src/Modes/FStopTestMode.cpp index d126f09..6144343 100644 --- a/src/Modes/FStopTestMode.cpp +++ b/src/Modes/FStopTestMode.cpp @@ -78,8 +78,10 @@ void FStopTestMode::process() { gTimer.start(getPrintTime()); if (gTimer.stopped()) { - if (m_currentRun == 0) // don't take into account base time + if (m_currentRun == 0) { // don't take into account base time gTimer.reset(); + gBeeper.melody(); + } ++m_currentRun; } } diff --git a/src/Modes/LinearTestMode.cpp b/src/Modes/LinearTestMode.cpp index 0a46fd4..7509f0e 100644 --- a/src/Modes/LinearTestMode.cpp +++ b/src/Modes/LinearTestMode.cpp @@ -66,8 +66,10 @@ void LinearTestMode::process() { gTimer.start(getPrintTime()); if (gTimer.stopped()) { - if (m_currentRun == 0) + if (m_currentRun == 0) { gTimer.reset(); + gBeeper.melody(); + } ++m_currentRun; } }