| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 1 | #pragma once | 
|  | 2 |  | 
|  | 3 | #include <chrono> | 
|  | 4 |  | 
| Patrick Venture | a076487 | 2020-08-08 07:48:43 -0700 | [diff] [blame] | 5 | namespace pid_control | 
|  | 6 | { | 
|  | 7 |  | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 8 | struct ReadReturn | 
|  | 9 | { | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 10 | double value; | 
|  | 11 | std::chrono::high_resolution_clock::time_point updated; | 
| Josh Lehan | b300575 | 2022-02-22 20:48:07 -0800 | [diff] [blame] | 12 | double unscaled = value; | 
| Patrick Venture | bd6b476 | 2018-06-14 09:24:42 -0700 | [diff] [blame] | 13 |  | 
| Patrick Venture | e2ec0f6 | 2018-09-04 12:30:27 -0700 | [diff] [blame] | 14 | bool operator==(const ReadReturn& rhs) const | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 15 | { | 
| Josh Lehan | b300575 | 2022-02-22 20:48:07 -0800 | [diff] [blame] | 16 | return ((this->value == rhs.value) && (this->updated == rhs.updated) && | 
|  | 17 | (this->unscaled == rhs.unscaled)); | 
| Patrick Venture | bd6b476 | 2018-06-14 09:24:42 -0700 | [diff] [blame] | 18 | } | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 19 | }; | 
|  | 20 |  | 
| Josh Lehan | b300575 | 2022-02-22 20:48:07 -0800 | [diff] [blame] | 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 |  | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 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 | { | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 36 | public: | 
| Patrick Williams | 8c05112 | 2023-05-10 07:50:59 -0500 | [diff] [blame] | 37 | ReadInterface() {} | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 38 |  | 
| Patrick Williams | 8c05112 | 2023-05-10 07:50:59 -0500 | [diff] [blame] | 39 | virtual ~ReadInterface() {} | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 40 |  | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 41 | virtual ReadReturn read(void) = 0; | 
| James Feist | 36b7d8e | 2018-10-05 15:39:01 -0700 | [diff] [blame] | 42 |  | 
|  | 43 | virtual bool getFailed(void) const | 
|  | 44 | { | 
|  | 45 | return false; | 
|  | 46 | } | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 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 | { | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 55 | public: | 
| Patrick Williams | 8c05112 | 2023-05-10 07:50:59 -0500 | [diff] [blame] | 56 | WriteInterface(int64_t min, int64_t max) : _min(min), _max(max) {} | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 57 |  | 
| Patrick Williams | 8c05112 | 2023-05-10 07:50:59 -0500 | [diff] [blame] | 58 | virtual ~WriteInterface() {} | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 59 |  | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 60 | virtual void write(double value) = 0; | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 61 |  | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 62 | /* | 
| Josh Lehan | 2400ce4 | 2020-10-01 01:50:39 -0700 | [diff] [blame] | 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 | /* | 
| Patrick Venture | da4a5dd | 2018-08-31 09:42:48 -0700 | [diff] [blame] | 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; | 
| Patrick Venture | e620656 | 2018-03-08 15:36:53 -0800 | [diff] [blame] | 90 | }; | 
| Patrick Venture | a076487 | 2020-08-08 07:48:43 -0700 | [diff] [blame] | 91 |  | 
|  | 92 | } // namespace pid_control |