summaryrefslogtreecommitdiff
path: root/examples/sinewave/sinewave.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/sinewave/sinewave.cpp')
-rw-r--r--examples/sinewave/sinewave.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/examples/sinewave/sinewave.cpp b/examples/sinewave/sinewave.cpp
new file mode 100644
index 0000000..afffc82
--- /dev/null
+++ b/examples/sinewave/sinewave.cpp
@@ -0,0 +1,70 @@
+#include <signal.h>
+#include <unistd.h>
+
+#include <chrono>
+#include <functional>
+#include <iostream>
+#include <stdexcept>
+#include <string>
+#include <thread>
+
+#include <hwd.h>
+
+
+volatile sig_atomic_t keep_running {1};
+
+
+void termination_handler(int signum)
+{
+ keep_running = false;
+}
+
+
+using seconds = std::chrono::duration<double>;
+using Clock = std::chrono::high_resolution_clock;
+
+
+int main(int argc, char* argv[])
+{
+ struct sigaction int_action;
+
+ int_action.sa_handler = termination_handler;
+ sigemptyset(&int_action.sa_mask);
+ int_action.sa_flags = 0;
+ sigaction(SIGINT, &int_action, NULL);
+
+ seconds interval{ 0.01 };
+ int i = 0;
+ int samples = 0;
+ int opt = 0;
+
+ try {
+ while ((opt = getopt(argc, argv, "n:i:")) != -1) {
+ switch (opt) {
+ case 'i':
+ interval = seconds{ std::stod(optarg) };
+ break;
+ case 'n':
+ samples = std::stoi(optarg);
+ break;
+ default:
+ std::cerr << "Usage: " << argv[0] << " [-i interval][-n samples]" << std::endl;
+ return 1;
+ }
+ }
+ }
+ catch (const std::invalid_argument& ia) {
+ std::cerr << "Invalid argument: " << ia.what() << std::endl;
+ return 1;
+ }
+
+ while (keep_running) {
+ if (i >= samples) break;
+ i++;
+ const auto endTime = Clock::now() + interval;
+ std::cout << hwd::sinewave::get_point() << std::endl;
+ std::this_thread::sleep_until(endTime);
+ }
+
+ return 0;
+}