#include #include #include #include #include #include #include using seconds = std::chrono::duration; volatile sig_atomic_t keep_running {true}; void termination_handler(int) { keep_running = false; } 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, nullptr); seconds interval {0.01}; 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; } int i = 1; while (keep_running) { if (samples != 0 && i++ > samples) break; const auto end_time = std::chrono::high_resolution_clock::now() + interval; std::cout << hwd::sinewave::get_point() << std::endl; std::this_thread::sleep_until(end_time); } return 0; }