From 05895c86bddf50aacb3bb5e6a6bcc073965341ef Mon Sep 17 00:00:00 2001
From: Roland Reichwein <mail@reichwein.it>
Date: Fri, 3 Jan 2025 12:27:14 +0100
Subject: Add first UI

---
 Timer.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 Timer.h

(limited to 'Timer.h')

diff --git a/Timer.h b/Timer.h
new file mode 100644
index 0000000..81192d6
--- /dev/null
+++ b/Timer.h
@@ -0,0 +1,54 @@
+#pragma once
+
+#include <boost/signals2.hpp>
+
+#include <chrono>
+
+using namespace std::chrono_literals;
+
+using clock_type = std::chrono::high_resolution_clock;
+
+class Timer
+{
+public:
+  Timer(std::chrono::milliseconds interval, bool cyclic) : m_start_time(clock_type::now()), m_interval(interval), m_running(false), m_cyclic(cyclic)
+  {}
+
+  // connect to this signal
+  boost::signals2::signal<void()> elapsed;
+
+  void start()
+  {
+    m_running = true;
+    m_start_time = clock_type::now();
+  }
+
+  void stop()
+  {
+    m_running = false;
+  }
+
+  bool is_elapsed()
+  {
+    return m_start_time + m_interval < clock_type::now();
+  }
+
+  void update()
+  {
+    if (m_running && is_elapsed()) {
+      elapsed();
+      if (m_cyclic) {
+        start();
+      } else {
+        stop();
+      }
+    }
+  }
+
+private:
+  std::chrono::time_point<clock_type> m_start_time;
+  std::chrono::milliseconds m_interval;
+  bool m_running;
+  bool m_cyclic;
+};
+
-- 
cgit v1.2.3