diff options
Diffstat (limited to 'examples/sinewave/sinewave.cpp')
-rw-r--r-- | examples/sinewave/sinewave.cpp | 70 |
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; +} |