From 146ff79ea514de21b9d921d133f42a6dbf22575f Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Sat, 17 Nov 2018 11:56:01 +0100 Subject: [PATCH] add digital input plugin --- src/GpioConfig.h | 1 + src/examples/combined/main.cpp | 10 ++++++++ src/inputs/digital/DigitalInputPlugin.cpp | 27 +++++++++++++++++++++ src/inputs/digital/DigitalInputPlugin.h | 29 +++++++++++++++++++++++ 4 files changed, 67 insertions(+) create mode 100644 src/inputs/digital/DigitalInputPlugin.cpp create mode 100644 src/inputs/digital/DigitalInputPlugin.h diff --git a/src/GpioConfig.h b/src/GpioConfig.h index 7a223e2..f465d31 100644 --- a/src/GpioConfig.h +++ b/src/GpioConfig.h @@ -7,6 +7,7 @@ struct GpioConfig int threshold; int updateInterval; const char *topic; + int pinMode; }; #endif \ No newline at end of file diff --git a/src/examples/combined/main.cpp b/src/examples/combined/main.cpp index 337dff7..c3174ba 100644 --- a/src/examples/combined/main.cpp +++ b/src/examples/combined/main.cpp @@ -2,6 +2,7 @@ #include "Sprocket.h" #include "inputs/rotary/RotaryPlugin.h" #include "inputs/analog/AnalogInputPlugin.h" +#include "inputs/digital/DigitalInputPlugin.h" Sprocket *sprocket; RotaryPlugin *r1; @@ -22,6 +23,14 @@ void addAnalogInput(Sprocket* s, int pin, const char* topic) }, topic, _1)); s->addPlugin(new AnalogInputPlugin({pin, POT_THRESHOLD, POT_POLL_INTERVAL, topic})); } +void addDigitalInput(Sprocket* s, int pin, const char* topic) +{ + s->subscribe(topic, bind([](String label, String val){ + PRINT_MSG(Serial, label.c_str(), val.c_str()); + }, topic, _1)); + s->addPlugin(new DigitalInputPlugin({pin, POT_THRESHOLD, POT_POLL_INTERVAL, topic, INPUT})); +} + void setup() { @@ -33,6 +42,7 @@ void setup() addAnalogInput(sprocket, 37, "pot2"); addAnalogInput(sprocket, 38, "pot3"); addAnalogInput(sprocket, 39, "pot4"); + addDigitalInput(sprocket, 21, "btn"); sprocket->activate(); } diff --git a/src/inputs/digital/DigitalInputPlugin.cpp b/src/inputs/digital/DigitalInputPlugin.cpp new file mode 100644 index 0000000..78b353c --- /dev/null +++ b/src/inputs/digital/DigitalInputPlugin.cpp @@ -0,0 +1,27 @@ +#include "DigitalInputPlugin.h" + +DigitalInputPlugin::DigitalInputPlugin(GpioConfig cfg) +{ + config = cfg; + if (config.pinMode) + { + pinMode(config.pin, config.pinMode); + } +} +void DigitalInputPlugin::activate(Scheduler *userScheduler) +{ + inputTask.set(TASK_MILLISECOND * config.updateInterval, TASK_FOREVER, std::bind(&DigitalInputPlugin::checkInput, this)); + userScheduler->addTask(inputTask); + inputTask.enable(); + PRINT_MSG(Serial, "PLUGIN", "DigitalInputPlugin activated"); +} + +void DigitalInputPlugin::checkInput() +{ + int newVal = digitalRead(config.pin); + if (newVal != currentVal) + { + publish(config.topic, String(newVal)); + currentVal = newVal; + } +} diff --git a/src/inputs/digital/DigitalInputPlugin.h b/src/inputs/digital/DigitalInputPlugin.h new file mode 100644 index 0000000..3cf20ad --- /dev/null +++ b/src/inputs/digital/DigitalInputPlugin.h @@ -0,0 +1,29 @@ +#ifndef __DIGITAL_INPUT__PLUGIN_H__ +#define __DIGITAL_INPUT__PLUGIN_H__ + +#define _TASK_SLEEP_ON_IDLE_RUN +#define _TASK_STD_FUNCTION + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace std::placeholders; + +class DigitalInputPlugin : public Plugin { + public: + Task inputTask; + int currentVal = 0; + GpioConfig config; + DigitalInputPlugin(GpioConfig cfg); + void activate(Scheduler* userScheduler); + void checkInput(); +}; + +#endif