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 b478bed
Show file tree
Hide file tree
Showing 2 changed files with 153 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
126 changes: 126 additions & 0 deletions src/sensesp/transforms/threshold.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
#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 (input >= min_value_ && input <= 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 (!config.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_;
};



/**
* @brief Translates a float value into a boolean value, which depends on
* whether the float value is "in range" or "out of range".
*
* @param min_value The minimum of the range for the input value to be "in
* range".
*
* @param max_value The maximum of the range for the input value to be "in
* range".
*
* @param in_range The output value if the input value is "in range". Default is
* true. (If the input value is not "in range", the value of output is the
* opposite of in_range.)
*
* @param config_path Path to configure this transform in the Config UI.
*/
class FloatThreshold : public ThresholdTransform<float> {
public:
FloatThreshold(float min_value, float max_value, bool in_range = true,
String config_path = "")
: ThresholdTransform<float>(min_value, max_value, in_range, config_path) {
}
};

/**
* @brief Translates an integer value into a boolean value, which depends on
* whether the integer value is "in range" or "out of range".
*
* @param min_value The minimum of the range for the input value to be "in
* range".
*
* @param max_value The maximum of the range for the input value to be "in
* range".
*
* @param in_range The output value if the input value is "in range". Default is
* true. (If the input value is not "in range", the value of output is the
* opposite of in_range.)
*
* @param config_path Path to configure this transform in the Config UI.
*/
class IntThreshold : public ThresholdTransform<int> {
public:
IntThreshold(int min_value, int max_value, bool in_range = true,
String config_path = "")
: ThresholdTransform<int>(min_value, max_value, in_range, config_path) {}
};

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 b478bed

Please sign in to comment.