mirror of
https://gitlab.com/wirelos/sprocket-plugin-gpio.git
synced 2025-12-14 13:26:48 +01:00
add digital input plugin
This commit is contained in:
@@ -7,6 +7,7 @@ struct GpioConfig
|
||||
int threshold;
|
||||
int updateInterval;
|
||||
const char *topic;
|
||||
int pinMode;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
27
src/inputs/digital/DigitalInputPlugin.cpp
Normal file
27
src/inputs/digital/DigitalInputPlugin.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
29
src/inputs/digital/DigitalInputPlugin.h
Normal file
29
src/inputs/digital/DigitalInputPlugin.h
Normal 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
|
||||
Reference in New Issue
Block a user