#include #include #include #include #include #include #include #include using namespace std::chrono_literals; using Clock = std::chrono::high_resolution_clock; int main(int argc, char* argv[]) { std::chrono::milliseconds interval{ 10ms }; int samples, opt, i = 0; bool end = false; const std::function infinite = []() {}; const std::function limited = [&end, &i, &samples]() { if (i > samples) end = true; i++; }; auto generatorGuard = infinite; try { while ((opt = getopt(argc, argv, "n:i:")) != -1) { switch (opt) { case 'i': interval = std::chrono::milliseconds(std::stoi(optarg)); break; case 'n': samples = std::stoi(optarg); generatorGuard = limited; break; default: std::cerr << "Usage: " << argv[0] << " [-i interval][-n samples] \n", exit(EXIT_FAILURE); } } } catch (const std::invalid_argument& ia) { std::cerr << "Invalid argument: " << ia.what() << '\n'; return 0; } hwd::sinewave::set_amplitude(11); hwd::sinewave::set_frequency(10); hwd::sinewave::set_phase(30); while (!end) { const auto endTime = Clock::now() + interval; std::cout << hwd::sinewave::get_point() << std::endl; std::this_thread::sleep_until(endTime); generatorGuard(); } return 0; }