1 #pragma once
2 
3 #include <chrono>
4 
5 namespace pid_control
6 {
7 
8 struct ReadReturn
9 {
10     double value;
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 
40     virtual ~ReadInterface()
41     {}
42 
43     virtual ReadReturn read(void) = 0;
44 
45     virtual bool getFailed(void) const
46     {
47         return false;
48     }
49 };
50 
51 /*
52  * A WriteInterface is a plug-in for the PluggableSensor and anyone implementing
53  * this basically is providing a way to write a sensor.
54  */
55 class WriteInterface
56 {
57   public:
58     WriteInterface(int64_t min, int64_t max) : _min(min), _max(max)
59     {}
60 
61     virtual ~WriteInterface()
62     {}
63 
64     virtual void write(double value) = 0;
65 
66     /*
67      * A wrapper around write(), with additional parameters.
68      * force = true to perform redundant write, even if raw value unchanged.
69      * written = non-null to be filled in with the actual raw value written.
70      */
71     virtual void write(double value, bool force, int64_t* written)
72     {
73         (void)force;
74         (void)written;
75         return write(value);
76     }
77 
78     /*
79      * All WriteInterfaces have min/max available in case they want to error
80      * check.
81      */
82     int64_t getMin(void)
83     {
84         return _min;
85     }
86     int64_t getMax(void)
87     {
88         return _max;
89     }
90 
91   private:
92     int64_t _min;
93     int64_t _max;
94 };
95 
96 } // namespace pid_control
97