#pragma once #include namespace pid_control { struct ReadReturn { double value; std::chrono::high_resolution_clock::time_point updated; double unscaled = value; bool operator==(const ReadReturn& rhs) const { return ((this->value == rhs.value) && (this->updated == rhs.updated) && (this->unscaled == rhs.unscaled)); } }; struct ValueCacheEntry { // This is normalized to (0.0, 1.0) range, using configured min and max double scaled; // This is the raw value, as recieved from the input/output sensors double unscaled; }; /* * A ReadInterface is a plug-in for the PluggableSensor and anyone implementing * this basically is providing a way to read a sensor. */ class ReadInterface { public: ReadInterface() {} virtual ~ReadInterface() {} virtual ReadReturn read(void) = 0; virtual bool getFailed(void) const { return false; } }; /* * A WriteInterface is a plug-in for the PluggableSensor and anyone implementing * this basically is providing a way to write a sensor. */ class WriteInterface { public: WriteInterface(int64_t min, int64_t max) : _min(min), _max(max) {} virtual ~WriteInterface() {} virtual void write(double value) = 0; /* * A wrapper around write(), with additional parameters. * force = true to perform redundant write, even if raw value unchanged. * written = non-null to be filled in with the actual raw value written. */ virtual void write(double value, bool force, int64_t* written) { (void)force; (void)written; return write(value); } /* * All WriteInterfaces have min/max available in case they want to error * check. */ int64_t getMin(void) { return _min; } int64_t getMax(void) { return _max; } private: int64_t _min; int64_t _max; }; } // namespace pid_control