Skip to content

Commit

Permalink
Merge pull request #780 from SignalK/restore_threshold_transform
Browse files Browse the repository at this point in the history
Restore Threshold transform
  • Loading branch information
mairas authored Nov 3, 2024
2 parents 6257849 + 541170e commit 1383d63
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
- examples/lambda_transform.cpp
- examples/manual_networking.cpp
- examples/minimal_app.cpp
#- examples/relay_control.cpp
- examples/relay_control.cpp
- examples/rpm_counter.cpp
- examples/async_repeat_sensor.cpp
- examples/repeat_sensor_analog_input.cpp
Expand Down
20 changes: 20 additions & 0 deletions src/sensesp/transforms/threshold.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include "threshold.h"

namespace sensesp {

static const char kSchemaTemplate[] =
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":"When checked, output true when input value is 'in 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
78 changes: 78 additions & 0 deletions src/sensesp/transforms/threshold.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#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[str].is<JsonVariant>()) {
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 1383d63

Please sign in to comment.