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