add digital input plugin

This commit is contained in:
2018-11-17 11:56:01 +01:00
parent baafaa441a
commit 146ff79ea5
4 changed files with 67 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ struct GpioConfig
int threshold;
int updateInterval;
const char *topic;
int pinMode;
};
#endif

View File

@@ -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();
}

View File

@@ -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;
}
}

View File

@@ -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 <functional>
#include <vector>
#include <FS.h>
#include <TaskSchedulerDeclarations.h>
#include <Plugin.h>
#include <utils/print.h>
#include <utils/misc.h>
#include <GpioConfig.h>
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