blob: 73ef643ac90521be42d00f8dcdb053e850c2ac21 [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{
Patrick Venturee6206562018-03-08 15:36:53 -080010 double value;
11 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:
37 ReadInterface()
Patrick Venturea83a3ec2020-08-04 09:52:05 -070038 {}
Patrick Venturee6206562018-03-08 15:36:53 -080039
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070040 virtual ~ReadInterface()
Patrick Venturea83a3ec2020-08-04 09:52:05 -070041 {}
Patrick Venturee6206562018-03-08 15:36:53 -080042
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070043 virtual ReadReturn read(void) = 0;
James Feist36b7d8e2018-10-05 15:39:01 -070044
45 virtual bool getFailed(void) const
46 {
47 return false;
48 }
Patrick Venturee6206562018-03-08 15:36:53 -080049};
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 */
55class WriteInterface
56{
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070057 public:
58 WriteInterface(int64_t min, int64_t max) : _min(min), _max(max)
Patrick Venturea83a3ec2020-08-04 09:52:05 -070059 {}
Patrick Venturee6206562018-03-08 15:36:53 -080060
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070061 virtual ~WriteInterface()
Patrick Venturea83a3ec2020-08-04 09:52:05 -070062 {}
Patrick Venturee6206562018-03-08 15:36:53 -080063
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070064 virtual void write(double value) = 0;
Patrick Venturee6206562018-03-08 15:36:53 -080065
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070066 /*
Josh Lehan2400ce42020-10-01 01:50:39 -070067 * 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 /*
Patrick Ventureda4a5dd2018-08-31 09:42:48 -070079 * 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;
Patrick Venturee6206562018-03-08 15:36:53 -080094};
Patrick Venturea0764872020-08-08 07:48:43 -070095
96} // namespace pid_control