1 #pragma once
2 
3 #include <chrono>
4 
5 namespace pid_control
6 {
7 
8 struct ReadReturn
9 {
10     double value = std::numeric_limits<double>::quiet_NaN();
11     std::chrono::high_resolution_clock::time_point updated;
12     double unscaled = value;
13 
14     bool operator==(const ReadReturn& rhs) const
15     {
16         return ((this->value == rhs.value) && (this->updated == rhs.updated) &&
17                 (this->unscaled == rhs.unscaled));
18     }
19 };
20 
21 struct ValueCacheEntry
22 {
23     // This is normalized to (0.0, 1.0) range, using configured min and max
24     double scaled;
25 
26     // This is the raw value, as recieved from the input/output sensors
27     double unscaled;
28 };
29 
30 /*
31  * A ReadInterface is a plug-in for the PluggableSensor and anyone implementing
32  * this basically is providing a way to read a sensor.
33  */
34 class ReadInterface
35 {
36   public:
37     ReadInterface() {}
38 
39     virtual ~ReadInterface() {}
40 
41     virtual ReadReturn read(void) = 0;
42 
43     virtual bool getFailed(void) const
44     {
45         return false;
46     }
47 };
48 
49 /*
50  * A WriteInterface is a plug-in for the PluggableSensor and anyone implementing
51  * this basically is providing a way to write a sensor.
52  */
53 class WriteInterface
54 {
55   public:
56     WriteInterface(int64_t min, int64_t max) : _min(min), _max(max) {}
57 
58     virtual ~WriteInterface() {}
59 
60     virtual void write(double value) = 0;
61 
62     /*
63      * A wrapper around write(), with additional parameters.
64      * force = true to perform redundant write, even if raw value unchanged.
65      * written = non-null to be filled in with the actual raw value written.
66      */
67     virtual void write(double value, bool force, int64_t* written)
68     {
69         (void)force;
70         (void)written;
71         return write(value);
72     }
73 
74     /*
75      * All WriteInterfaces have min/max available in case they want to error
76      * check.
77      */
78     int64_t getMin(void)
79     {
80         return _min;
81     }
82     int64_t getMax(void)
83     {
84         return _max;
85     }
86 
87   private:
88     int64_t _min;
89     int64_t _max;
90 };
91 
92 } // namespace pid_control
93