ifw-daq  1.0.0
IFW Data Acquisition modules
status.hpp
Go to the documentation of this file.
1 /**
2  * @file
3  * @ingroup daq_ocm_libdaq
4  * @copyright 2021 ESO - European Southern Observatory
5  *
6  * @brief Contains declaration for Status and ObservableStatus
7  */
8 #ifndef OCM_DAQ_DAQ_STATUS_HPP_
9 #define OCM_DAQ_DAQ_STATUS_HPP_
10 
11 #include <chrono>
12 #include <string>
13 #include <vector>
14 #include <iosfwd>
15 
16 #include <boost/signals2/signal.hpp>
17 
18 #include <daq/fits/keyword.hpp>
19 #include "state.hpp"
20 #include "dpPart.hpp"
21 
22 
23 namespace daq {
24 
25 /**
26  * Non observable status object that keeps stores status of data acquisition.
27  *
28  * It is also planned to be serializable to allow crash recovery from persistent storage.
29  *
30  * @ingroup daq_ocm_libdaq
31  */
32 struct Status {
33  using TimePoint = std::chrono::time_point<std::chrono::steady_clock>;
34 
35  explicit Status(std::string id) noexcept;
36  Status(std::string id,
37  State state,
38  bool error,
39  DpParts files,
41  TimePoint timestamp) noexcept;
42 
43  Status(Status&&) = default;
44  Status(Status const&) = default;
45  Status& operator=(Status&&) = default;
46  Status& operator=(Status const&) = default;
47 
48  bool operator==(Status const& rhs) const noexcept;
49  bool operator!=(Status const& rhs) const noexcept;
50 
51  std::string id;
53  bool error;
57 };
58 
59 std::ostream& operator<<(std::ostream& os, Status const& s);
60 
61 /**
62  * Stores data acquisition status and allows subscription to status changes.
63  *
64  * DaqController instances will update ObservableStatus as changes occur.
65  *
66  * @ingroup daq_ocm_libdaq
67  */
69  public:
70  /**
71  * Construct a new object
72  *
73  * @param id Data acquisition identifier.
74  */
75  explicit ObservableStatus(std::string id) noexcept;
78 
79  bool operator==(ObservableStatus const& rhs) const noexcept;
80  bool operator!=(ObservableStatus const& rhs) const noexcept;
81 
82  bool operator==(Status const& rhs) const noexcept;
83  bool operator!=(Status const& rhs) const noexcept;
84 
85  ///@name Accessors
86  ///@{
87  /**
88  * @return Data acquisition identifier
89  */
90  std::string const& GetId() const noexcept;
91 
92  /**
93  * @return Data acquisition state
94  */
95  State GetState() const noexcept;
96 
97  /**
98  * @return Data acquisition error flag.
99  */
100  bool GetError() const noexcept;
101 
102  /**
103  * @return Files created for this data acquisition
104  */
105  std::vector<DpPart> const& GetFiles() const noexcept;
106 
107  /**
108  * @return Primary HDU keywords provided by OCM for this data acquisition
109  */
110  fits::KeywordVector const& GetKeywords() const noexcept;
111 
112  ///@}
113 
114  ///@name Modifiers
115  ///@{
116  /**
117  * Records that a file has been produced for this data acquisition.
118  *
119  * @param files Files to add/record.
120  *
121  * @post Connected observers have been signalled.
122  */
123  void AddFiles(std::vector<DpPart> const& files);
124 
125  /**
126  * Updates (adds or replaces) Primary HDU keywords.
127  */
128  void UpdateKeywords(fits::KeywordVector const&) noexcept;
129 
130  /**
131  * Set state of data acquisition.
132  *
133  * @param s New state
134  *
135  * @post Connected observers have been signalled.
136  */
137  void SetState(State s) noexcept;
138 
139  /**
140  * Set error flag for data acquisition.
141  *
142  * @param error New error flag status.
143  *
144  * @post Connected observers have been signalled.
145  */
146  void SetError(bool error) noexcept;
147 
148  /**
149  * Connect observer that is invoked when state is modified.
150  *
151  * @param o Observer callable invoked on status changes (state or file changes)
152  * Observer must be invocable with signature `void(ObservableStatus const&)`.
153  *
154  * @return signal connection object that can be used to disconnect observer:
155  *
156  * @code
157  * auto c = status.ConnectObserver([](ObservableStatus const& s){});
158  * // later the connection object can be used to disconnect
159  * c.disconnect();
160  * @endcode
161  */
162  using Signal = boost::signals2::signal<void(ObservableStatus const&)>;
163  template <class Observer>
164  boost::signals2::connection ConnectObserver(Observer o) {
165  return m_signal.connect(std::move(o));
166  }
167 
168  /**
169  * Allow implicit conversion to non-observable status.
170  */
171  operator Status() const;
172  Status const& GetStatus() const noexcept;
173 
174  ///@}
175  private:
176  /// Signal changes to observers
177  void SignalChanges() noexcept;
178 
179  Status m_status;
180  // const Status should also be observable.
181  mutable Signal m_signal;
182 };
183 
184 std::ostream& operator<<(std::ostream& os, ObservableStatus const& s);
185 
186 
187 } // namespace daq
188 #endif // #ifndef OCM_DAQ_DAQ_STATUS_HPP_
daq::Status::files
DpParts files
Definition: status.hpp:54
daq::State
State
Observable states of the data acquisition process.
Definition: state.hpp:41
daq::ObservableStatus::ObservableStatus
ObservableStatus(std::string id) noexcept
Construct a new object.
Definition: status.cpp:44
daq::Status::timestamp
TimePoint timestamp
Definition: status.hpp:56
daq::Status::operator=
Status & operator=(Status &&)=default
daq::Status::state
State state
Definition: status.hpp:52
daq::ObservableStatus::GetState
State GetState() const noexcept
Definition: status.cpp:67
daq::ObservableStatus::ConnectObserver
boost::signals2::connection ConnectObserver(Observer o)
Connect observer that is invoked when state is modified.
Definition: status.hpp:164
keyword.hpp
Contains data structure for FITS keywords.
daq::ObservableStatus::operator==
bool operator==(ObservableStatus const &rhs) const noexcept
Definition: status.cpp:47
daq::ObservableStatus
Stores data acquisition status and allows subscription to status changes.
Definition: status.hpp:68
daq::Status::operator!=
bool operator!=(Status const &rhs) const noexcept
Definition: status.cpp:34
daq
Definition: daqController.cpp:18
daq::Status::Status
Status(Status &&)=default
daq::ObservableStatus::GetKeywords
fits::KeywordVector const & GetKeywords() const noexcept
Definition: status.cpp:79
daq::ObservableStatus::operator!=
bool operator!=(ObservableStatus const &rhs) const noexcept
Definition: status.cpp:51
daq::ObservableStatus::GetStatus
Status const & GetStatus() const noexcept
Connect observer that is invoked when state is modified.
Definition: status.cpp:125
daq::Status::TimePoint
std::chrono::time_point< std::chrono::steady_clock > TimePoint
Definition: status.hpp:33
daq::Status::Status
Status(std::string id) noexcept
Definition: status.cpp:21
daq::Status::operator=
Status & operator=(Status const &)=default
daq::ObservableStatus::GetId
std::string const & GetId() const noexcept
Definition: status.cpp:63
daq::Status::error
bool error
Definition: status.hpp:53
daq::Status::operator==
bool operator==(Status const &rhs) const noexcept
Definition: status.cpp:30
daq::Status::id
std::string id
Definition: status.hpp:51
daq::DpPart
Provides information of the location and origin of a FITS file or keywords produced by a data acquisi...
Definition: dpPart.hpp:26
daq::Status::keywords
fits::KeywordVector keywords
Definition: status.hpp:55
daq::ObservableStatus::SetError
void SetError(bool error) noexcept
Set error flag for data acquisition.
Definition: status.cpp:105
daq::ObservableStatus::AddFiles
void AddFiles(std::vector< DpPart > const &files)
Records that a file has been produced for this data acquisition.
Definition: status.cpp:83
daq::ObservableStatus::UpdateKeywords
void UpdateKeywords(fits::KeywordVector const &) noexcept
Updates (adds or replaces) Primary HDU keywords.
Definition: status.cpp:89
daq::Status::Status
Status(Status const &)=default
daq::Status
Non observable status object that keeps stores status of data acquisition.
Definition: status.hpp:32
daq::ObservableStatus::SetState
void SetState(State s) noexcept
Set state of data acquisition.
Definition: status.cpp:97
daq::operator<<
std::ostream & operator<<(std::ostream &os, DaqController const &daq)
Definition: daqController.cpp:49
daq::fits::KeywordVector
std::vector< KeywordVariant > KeywordVector
Vector of keywords.
Definition: keyword.hpp:138
daq::ObservableStatus::ObservableStatus
ObservableStatus(ObservableStatus const &)=delete
state.hpp
Declares daq::State and related functions.
dpPart.hpp
Contains declaration for DpPart.
daq::ObservableStatus::GetFiles
std::vector< DpPart > const & GetFiles() const noexcept
Definition: status.cpp:75
daq::DpParts
std::vector< DpPart > DpParts
Definition: dpPart.hpp:49
daq::ObservableStatus::GetError
bool GetError() const noexcept
Definition: status.cpp:71
daq::ObservableStatus::operator=
ObservableStatus & operator=(ObservableStatus const &)=delete
daq::ObservableStatus::Signal
boost::signals2::signal< void(ObservableStatus const &)> Signal
Connect observer that is invoked when state is modified.
Definition: status.hpp:162