Line data Source code
1 : /**
2 : * @file CRTGrenobleFrameBuilderModule.hpp
3 : *
4 : * Reads data from the HW then puts it in a queue
5 : *
6 : * This is part of the DUNE DAQ Software Suite, copyright 2020.
7 : * Licensing/copyright details are in the COPYING file that you should have
8 : * received with this code.
9 : */
10 :
11 : #ifndef CRTMODULES_PLUGINS_CRTGRENOBLEFRAMEBUILDERMODULE_HPP_
12 : #define CRTMODULES_PLUGINS_CRTGRENOBLEFRAMEBUILDERMODULE_HPP_
13 :
14 : #include "appfwk/DAQModule.hpp"
15 : #include "utilities/ReusableThread.hpp"
16 : #include "fddetdataformats/CRTGrenobleFrame.hpp"
17 :
18 : #include <memory>
19 : #include <map>
20 : #include <string>
21 : #include <vector>
22 :
23 : namespace dunedaq::crtmodules {
24 :
25 : class CRTGrenobleFrameBuilderModule : public dunedaq::appfwk::DAQModule
26 : {
27 : public:
28 : /**
29 : * @brief CRTGrenobleFrameBuilderModule constructor
30 : * @param name DAQ module instance name
31 : */
32 : explicit CRTGrenobleFrameBuilderModule(const std::string& name);
33 :
34 : CRTGrenobleFrameBuilderModule(const CRTGrenobleFrameBuilderModule&) = delete; ///< CRTGrenobleFrameBuilderModule is not copy-constructible
35 : CRTGrenobleFrameBuilderModule& operator=(const CRTGrenobleFrameBuilderModule&) = delete; ///< CRTGrenobleFrameBuilderModule is not copy-assignable
36 : CRTGrenobleFrameBuilderModule(CRTGrenobleFrameBuilderModule&&) = delete; ///< CRTGrenobleFrameBuilderModule is not move-constructible
37 : CRTGrenobleFrameBuilderModule& operator=(CRTGrenobleFrameBuilderModule&&) = delete; ///< CRTGrenobleFrameBuilderModule is not move-assignable
38 :
39 : /**
40 : * @brief Handles initialization on boot
41 : * @param mcfg DAQ configuration data
42 : */
43 : void init(const std::shared_ptr<appfwk::ConfigurationManager> mcfg) override;
44 :
45 : private:
46 : // Commands
47 : void do_conf(const CommandData_t& obj);
48 : void do_start(const CommandData_t& obj);
49 : void do_stop(const CommandData_t& obj);
50 : void do_scrap(const CommandData_t& obj);
51 :
52 : void generate_opmon_data() override;
53 :
54 : /**
55 : * @brief Data produce thread function
56 : * @param fake_stream_id Fake packet stream ID
57 : */
58 : void run_produce(uint32_t fake_stream_id); // NOLINT(build/unsigned)
59 :
60 : /**
61 : * @brief Sets run marker
62 : * @param should_run Whether producer thread should continue
63 : */
64 : void set_running(bool /*should_run*/);
65 :
66 : /**
67 : * @brief Enables data taking
68 : */
69 0 : void enable_flow() { m_enable_flow.store(true); }
70 :
71 : /**
72 : * @brief Disables data taking
73 : */
74 0 : void disable_flow() { m_enable_flow.store(false); }
75 :
76 : /**
77 : * @brief Whether producer thread should continue
78 : */
79 : std::atomic<bool> m_run_marker{ false };
80 :
81 : /**
82 : * @brief Whether data taking should continue
83 : */
84 : std::atomic<bool> m_enable_flow{ false }; // this is for queue ops
85 :
86 : // PRODUCER
87 : /**
88 : * @brief Data producer threads
89 : */
90 : std::vector<std::unique_ptr<utilities::ReusableThread>> m_producer_threads;
91 :
92 : /**
93 : * @brief Data sender
94 : */
95 : std::shared_ptr<iomanager::SenderConcept<fddetdataformats::CRTGrenobleFrame>> m_sender;
96 :
97 : /**
98 : * @brief Fake packet stream IDs
99 : */
100 : std::vector<uint32_t> m_fake_stream_ids; // NOLINT(build/unsigned)
101 :
102 : /**
103 : * @brief Configured packet transmission rate in kHz
104 : */
105 : double m_configured_packet_rate_khz{ 10 };
106 :
107 : /**
108 : * @brief Counts packets since last opmon data generation
109 : */
110 : std::atomic<int> m_packet_count{ 0 };
111 :
112 : // RUN START T0
113 : /**
114 : * @brief Timestamp used to measure time between opmon reports
115 : */
116 : std::chrono::time_point<std::chrono::steady_clock> m_t0;
117 : };
118 : } // namespace dunedaq::crtmodules
119 :
120 : #endif // CRTMODULES_PLUGINS_CRTGRENOBLEFRAMEBUILDERMODULE_HPP_
|