From e8701195e66f2d27ffe17fb514eae8173795aaf7 Mon Sep 17 00:00:00 2001
From: Georgiy Bondarenko <69736697+nehilo@users.noreply.github.com>
Date: Thu, 4 Mar 2021 22:54:23 +0500
Subject: Initial commit
---
Marlin/src/libs/buzzer.h | 129 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 129 insertions(+)
create mode 100644 Marlin/src/libs/buzzer.h
(limited to 'Marlin/src/libs/buzzer.h')
diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h
new file mode 100644
index 0000000..b86fe99
--- /dev/null
+++ b/Marlin/src/libs/buzzer.h
@@ -0,0 +1,129 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+#include "../inc/MarlinConfig.h"
+
+#if USE_BEEPER
+
+ #include "circularqueue.h"
+
+ #define TONE_QUEUE_LENGTH 4
+
+ /**
+ * @brief Tone structure
+ * @details Simple abstraction of a tone based on a duration and a frequency.
+ */
+ struct tone_t {
+ uint16_t duration;
+ uint16_t frequency;
+ };
+
+ /**
+ * @brief Buzzer class
+ */
+ class Buzzer {
+ public:
+
+ typedef struct {
+ tone_t tone;
+ uint32_t endtime;
+ } state_t;
+
+ private:
+ static state_t state;
+
+ protected:
+ static CircularQueue buffer;
+
+ /**
+ * @brief Inverts the sate of a digital PIN
+ * @details This will invert the current state of an digital IO pin.
+ */
+ FORCE_INLINE static void invert() { TOGGLE(BEEPER_PIN); }
+
+ /**
+ * @brief Turn off a digital PIN
+ * @details Alias of digitalWrite(PIN, LOW) using FastIO
+ */
+ FORCE_INLINE static void off() { WRITE(BEEPER_PIN, LOW); }
+
+ /**
+ * @brief Turn on a digital PIN
+ * @details Alias of digitalWrite(PIN, HIGH) using FastIO
+ */
+ FORCE_INLINE static void on() { WRITE(BEEPER_PIN, HIGH); }
+
+ /**
+ * @brief Resets the state of the class
+ * @details Brings the class state to a known one.
+ */
+ static inline void reset() {
+ off();
+ state.endtime = 0;
+ }
+
+ public:
+ /**
+ * @brief Init Buzzer
+ */
+ static inline void init() {
+ SET_OUTPUT(BEEPER_PIN);
+ reset();
+ }
+
+ /**
+ * @brief Add a tone to the queue
+ * @details Adds a tone_t structure to the ring buffer, will block IO if the
+ * queue is full waiting for one slot to get available.
+ *
+ * @param duration Duration of the tone in milliseconds
+ * @param frequency Frequency of the tone in hertz
+ */
+ static void tone(const uint16_t duration, const uint16_t frequency=0);
+
+ /**
+ * @brief Tick function
+ * @details This function should be called at loop, it will take care of
+ * playing the tones in the queue.
+ */
+ static void tick();
+ };
+
+ // Provide a buzzer instance
+ extern Buzzer buzzer;
+
+ // Buzz directly via the BEEPER pin tone queue
+ #define BUZZ(d,f) buzzer.tone(d, f)
+
+#elif HAS_BUZZER
+
+ // Buzz indirectly via the MarlinUI instance
+ #include "../lcd/marlinui.h"
+ #define BUZZ(d,f) ui.buzz(d,f)
+
+#else
+
+ // No buzz capability
+ #define BUZZ(d,f) NOOP
+
+#endif
--
cgit v1.2.3