blob: 7f4b4cd1948a9a09a7e56d3c3afc71c1fcdf99e2 [file] [log] [blame]
Patrick Venturee6206562018-03-08 15:36:53 -08001#pragma once
2
3#include <chrono>
4
Patrick Venturea0764872020-08-08 07:48:43 -07005namespace pid_control
6{
7
Patrick Ventureda4a5dd2018-08-31 09:42:48 -07008struct ReadReturn
9{
ykchiu7c6d35d2023-05-10 17:01:46 +080010 double value = std::numeric_limits<double>::quiet_NaN();
Patrick Venturee6206562018-03-08 15:36:53 -080011 std::chrono::high_resolution_clock::time_point updated;
Josh Lehanb3005752022-02-22 20:48:07 -080012 double unscaled = value;
Patrick Venturebd6b4762018-06-14 09:24:42 -070013
Patrick Venturee2ec0f62018-09-04 12:30:27 -070014 bool operator==(const ReadReturn& rhs) const
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070015 {
Josh Lehanb3005752022-02-22 20:48:07 -080016 return ((this->value == rhs.value) && (this->updated == rhs.updated) &&
17 (this->unscaled == rhs.unscaled));
Patrick Venturebd6b4762018-06-14 09:24:42 -070018 }
Patrick Venturee6206562018-03-08 15:36:53 -080019};
20
Josh Lehanb3005752022-02-22 20:48:07 -080021struct 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 Venturee6206562018-03-08 15:36:53 -080030/*
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 */
34class ReadInterface
35{
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070036 public:
Patrick Williams8c051122023-05-10 07:50:59 -050037 ReadInterface() {}
Patrick Venturee6206562018-03-08 15:36:53 -080038
Patrick Williams8c051122023-05-10 07:50:59 -050039 virtual ~ReadInterface() {}
Patrick Venturee6206562018-03-08 15:36:53 -080040
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070041 virtual ReadReturn read(void) = 0;
James Feist36b7d8e2018-10-05 15:39:01 -070042
43 virtual bool getFailed(void) const
44 {
45 return false;
46 }
Patrick Venturee6206562018-03-08 15:36:53 -080047};
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 */
53class WriteInterface
54{
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070055 public:
Patrick Williams8c051122023-05-10 07:50:59 -050056 WriteInterface(int64_t min, int64_t max) : _min(min), _max(max) {}
Patrick Venturee6206562018-03-08 15:36:53 -080057
Patrick Williams8c051122023-05-10 07:50:59 -050058 virtual ~WriteInterface() {}
Patrick Venturee6206562018-03-08 15:36:53 -080059
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070060 virtual void write(double value) = 0;
Patrick Venturee6206562018-03-08 15:36:53 -080061
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070062 /*
Josh Lehan2400ce42020-10-01 01:50:39 -070063 * 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 Ventureda4a5dd2018-08-31 09:42:48 -070075 * 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 Venturee6206562018-03-08 15:36:53 -080090};
Patrick Venturea0764872020-08-08 07:48:43 -070091
92} // namespace pid_control