#include #include #include #include #include #include #include #include #include volatile sig_atomic_t keep_running {1}; void termination_handler(int signum) { keep_running = false; } using seconds = std::chrono::duration; 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 (samples != 0 && 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; }