Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <deque> 8 : #include <optional> 9 : #include <pup.h> 10 : #include <utility> 11 : 12 : /// \cond 13 : namespace domain::FunctionsOfTime { 14 : class FunctionOfTime; 15 : } // namespace domain::FunctionsOfTime 16 : /// \endcond 17 : 18 : namespace control_system { 19 : /// Class for computing the upcoming measurement times for a control 20 : /// system measurement. 21 : /// 22 : /// At any time, the \ref control_system::Tags::MeasurementTimescales 23 : /// "measurement timescales" can be queried to find the spacing 24 : /// between control system measurements. Most uses, however, require 25 : /// the actual measurement times, and sometimes need to know times of 26 : /// control-system update triggers. This class calculates these 27 : /// quantities from the timescales. 28 1 : class FutureMeasurements { 29 : public: 30 0 : FutureMeasurements() = default; 31 : 32 0 : FutureMeasurements(size_t measurements_per_update, 33 : double first_measurement_time); 34 : 35 : /// Next measurement time, if known. 36 1 : std::optional<double> next_measurement() const; 37 : /// Next measurement that triggers an update, if known. 38 1 : std::optional<double> next_update() const; 39 : 40 : /// Remove the earliest measurement form the list, generally because 41 : /// it has been performed. 42 1 : void pop_front(); 43 : 44 : /// Calculate and store measurement times up through the expiration 45 : /// time of the argument. 46 : /// 47 : /// Given a measurement time \f$t_i\f$, the next measurement will 48 : /// occur at \f$t_{i+1} = t_i + \tau_m(t_i)\f$, where 49 : /// \f$\tau_m(t)\f$ is the measurement timescale at time \f$t\f$. 50 1 : void update( 51 : const domain::FunctionsOfTime::FunctionOfTime& measurement_timescale); 52 : 53 0 : void pup(PUP::er& p); 54 : 55 0 : friend bool operator==(const FutureMeasurements& lhs, 56 : const FutureMeasurements& rhs); 57 : 58 : private: 59 : // This stores the most recent (or current) measurement time, 60 : // followed by some future measurement times. We need to keep one 61 : // old entry that isn't returned so that we can use it to calculate 62 : // a new first entry if we need to update an "empty" list. The 63 : // bookkeeping is simpler if we keep it around even when we don't 64 : // need it. 65 0 : std::deque<double> measurements_{}; 66 0 : size_t measurements_until_update_{}; 67 0 : size_t measurements_per_update_{}; 68 : }; 69 : 70 0 : bool operator!=(const FutureMeasurements& lhs, const FutureMeasurements& rhs); 71 : } // namespace control_system