Skip to content

Commit

Permalink
Restore Threshold transform
Browse files Browse the repository at this point in the history
  • Loading branch information
mairas committed Oct 27, 2024
1 parent 6257849 commit 2fbf2b1
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 0 deletions.
27 changes: 27 additions & 0 deletions src/sensesp/transforms/threshold.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include "threshold.h"

namespace sensesp {

static const char kSchemaTemplate[] PROGMEM = R"({
"type": "object",
"properties": {
"min": { "title": "Minimum value", "type": "!!TYPE!!", "description" : "Minimum value to be 'in range'" },
"max": { "title": "Maximum value", "type": "!!TYPE!!", "description" : "Maximum value to be 'in range'" },
"in_range": { "title": "In range value", "type": "boolean", "description" : "Output value when input value is 'in range'" }
"out_range": { "title": "Out of range value", "type": "boolean", "description" : "Output value when input value is out of range" }
}
})";

const String ConfigSchema(const ThresholdTransform<float>& obj) {
String schema = kSchemaTemplate;
schema.replace("!!TYPE!!", "number");
return schema;
}

const String ConfigSchema(const ThresholdTransform<int>& obj) {
String schema = kSchemaTemplate;
schema.replace("!!TYPE!!", "integer");
return schema;
}

} // namespace sensesp
77 changes: 77 additions & 0 deletions src/sensesp/transforms/threshold.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#include "transform.h"
#ifndef _threshold_h
#define _threshold_h

namespace sensesp {

/**
* @brief A Transform base class that translates the value of type C into
* boolean. Base class for classes FloatThreshold and IntThreshold.
*
* @param min_value Minimum value of input for output to be the value of
* in_range.
*
* @param max_value Maximum value of input for output to be the value of
* in_range.
*
* @param in_range Output value if input value is in range.
*
* @param out_range Output value if input value is out of the range.
*/
template <typename C>
class ThresholdTransform : public Transform<C, bool> {
public:

ThresholdTransform(C min_value, C max_value, bool in_range,
String config_path = "")
: Transform<C, bool>(config_path),
min_value_{min_value},
max_value_{max_value},
in_range_{in_range} {
this->load();
};

virtual void set(const C& new_value) override {
if (new_value >= min_value_ && new_value <= max_value_) {
this->output_ = in_range_;
} else {
this->output_ = !in_range_;
}

this->notify();
}

bool from_json(const JsonObject& root) override {
String expected[] = {"min", "max", "in_range", "out_range"};
for (auto str : expected) {
if (!root.containsKey(str)) {
return false;
}
}
min_value_ = root["min"];
max_value_ = root["max"];
in_range_ = root["in_range"];
return true;
}

bool to_json(JsonObject& root) override {
root["min"] = min_value_;
root["max"] = max_value_;
root["in_range"] = in_range_;
return true;
}

protected:
C min_value_;
C max_value_;
bool in_range_;
};

const String ConfigSchema(const ThresholdTransform<float>& obj);
const String ConfigSchema(const ThresholdTransform<int>& obj);

typedef ThresholdTransform<float> FloatThreshold;
typedef ThresholdTransform<int> IntThreshold;

} // namespace sensesp
#endif

0 comments on commit 2fbf2b1

Please sign in to comment.