#pragma once #include "debugtrace.hpp" #include "lasp_uldaq_common.h" #include #include #include #include #include #include #include #include "lasp_daq.h" using std::atomic; using std::cerr; using std::endl; using rte = std::runtime_error; class InBufHandler; class OutBufHandler; /** \addtogroup device * @{ * \addtogroup uldaq */ /** * @brief Data translation DT9837A Daq device. */ class DT9837A : public Daq { DaqDeviceHandle _handle = 0; std::mutex _daqmutex; /** * @brief The thread that is doing I/O with UlDaq */ std::thread _thread; /** * @brief Flag indicating the thread to stop processing. */ atomic _stopThread{false}; /** * @brief Storage for exchanging information on the stream */ atomic _streamStatus; const us _nFramesPerBlock; /** * @brief The function that is running in a thread * * @param inCallback * @param outcallback */ void threadFcn(InDaqCallback inCallback, OutDaqCallback outcallback); /** * @brief Obtain a handle to the underlying device * * @return Handle */ DaqDeviceHandle getHandle() const { return _handle; } /** * @brief Perform several sanity checks */ void sanityChecks() const; public: /** * @brief Create a DT9837A instance. * * @param devinfo DeviceInfo to connect to * @param config DaqConfiguration settings */ DT9837A(const UlDaqDeviceInfo &devinfo, const DaqConfiguration &config); virtual ~DT9837A(); /** * @brief Returns true when the stream is running * * @return as above stated */ bool isRunning() const; /** * @brief Stop the data-acquisition */ void stop() override final; friend class InBufHandler; friend class OutBufHandler; virtual void start(InDaqCallback inCallback, OutDaqCallback outCallback) override final; /** * @brief Obtain copy of stream status (thread-safe function) * * @return StreamStatus object */ virtual StreamStatus getStreamStatus() const override { return _streamStatus; } }; /** @} */ /** @} */