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