diff --git a/os/src/userspace/puzzlecmd.cpp b/os/src/userspace/puzzlecmd.cpp index 45eb3cc..474c9fd 100644 --- a/os/src/userspace/puzzlecmd.cpp +++ b/os/src/userspace/puzzlecmd.cpp @@ -14,6 +14,7 @@ #include #include "puzzlefw.hpp" +#include "logging.hpp" #include "interrupt_manager.hpp" #include "data_server.hpp" @@ -115,6 +116,14 @@ void run_data_server(puzzlefw::PuzzleFwDevice& device) asio::io_context io; + // Catch Ctrl-C for controlled shut down. + asio::signal_set signals(io, SIGINT); + signals.async_wait( + [&io](auto& ec, int sig) { + log(LOG_INFO, "Got SIGINT, stopping server"); + io.stop(); + }); + // Reserve 3/4 of the DMA buffer for analog acquisition data. // Reserve 1/4 of the DMA buffer for timetagger data. size_t acq_buf_size = 3 * 4096 * (device.dma_buffer_size() / 4096 / 4); @@ -145,14 +154,23 @@ void run_data_server(puzzlefw::PuzzleFwDevice& device) device, std::chrono::milliseconds(100)); + // Disable DMA engine on exit from this function. + struct ScopeGuard { + PuzzleFwDevice& m_device; + ScopeGuard(PuzzleFwDevice& device) : m_device(device) { } + ~ScopeGuard() { m_device.set_dma_enabled(false); } + } scope_guard(device); + // Clear DMA errors, then enable DMA engine. device.clear_dma_errors(); device.set_dma_enabled(true); acq_server.start_server(); + timetagger_server.start_server(); acq_stream.set_enabled(true); -// TODO -- timetagger + timetagger_stream.set_enabled(true); + log(LOG_INFO, "Running, press Ctrl-C to stop"); io.run(); }