118 lines
3.0 KiB
C++
118 lines
3.0 KiB
C++
#include <SpejsNode.h>
|
|
|
|
SpejsNode node("string-controller");
|
|
//DriverPWM pwm;
|
|
|
|
#define SLAVES_COUNT 1
|
|
|
|
class SlaveEndpoint {
|
|
public:
|
|
String topic;
|
|
int ledPin;
|
|
int btnPin;
|
|
|
|
bool state = false;
|
|
uint32_t lastTrigger = 0;
|
|
bool lastButton = false;
|
|
bool toggle = false;
|
|
|
|
Timer breatheTimer;
|
|
|
|
void init() {
|
|
if (ledPin != -1)
|
|
pinMode(ledPin, OUTPUT);
|
|
|
|
if (btnPin != -1)
|
|
pinMode(btnPin, INPUT_PULLUP);
|
|
|
|
//breatheTimer.initializeMs(20, TimerDelegate(&SlaveEndpoint::breatheHandler, this)).start();
|
|
}
|
|
|
|
void stateUpdate(bool newState) {
|
|
state = newState;
|
|
digitalWrite(ledPin, !state);
|
|
}
|
|
|
|
void breatheHandler() {
|
|
//pwm.analogWrite(ledPin, (millis()/10) % 50 + 20);
|
|
}
|
|
|
|
SlaveEndpoint(String _topic, int _ledPin = -1, int _btnPin = -1, bool _toggle = false) :
|
|
topic(_topic), ledPin(_ledPin), btnPin(_btnPin), toggle(_toggle) {}
|
|
};
|
|
|
|
SlaveEndpoint slaves[] = {
|
|
{"iot/077521/relay/on", 2, 4, true}, // Exhaust
|
|
};
|
|
|
|
class StatusEndpoint : public Endpoint {
|
|
public:
|
|
Timer sampleTimer;
|
|
Timer idleTimer;
|
|
|
|
StatusEndpoint() : Endpoint("status") { }
|
|
|
|
void bind(String _name, SpejsNode* _parent) {
|
|
Endpoint::bind(_name, _parent);
|
|
idleTimer.initializeMs(100, TimerDelegate(&StatusEndpoint::idleHandler, this)).start();
|
|
|
|
//pwm.initialize();
|
|
|
|
for(int i = 0; i < SLAVES_COUNT; i++) {
|
|
slaves[i].init();
|
|
}
|
|
}
|
|
|
|
void idleHandler() {
|
|
for(int i = 0; i < SLAVES_COUNT; i++) {
|
|
slaves[i].stateUpdate(!slaves[i].state);
|
|
}
|
|
}
|
|
|
|
void onConnected() {
|
|
idleTimer.stop();
|
|
|
|
Serial.println("status: connected");
|
|
|
|
for(int i = 0; i < SLAVES_COUNT; i++) {
|
|
Serial.println(i);
|
|
|
|
parent->mqtt.subscribe(slaves[i].topic);
|
|
slaves[i].init();
|
|
}
|
|
|
|
sampleTimer.initializeMs(50, TimerDelegate(&StatusEndpoint::sampleButtons, this)).start();
|
|
}
|
|
|
|
void onMessage(String topic, String payload) {
|
|
Serial.println("status: got message");
|
|
Serial.printf("%s: %s\r\n", topic.c_str(), payload.c_str());
|
|
for(int i = 0; i < SLAVES_COUNT; i++) {
|
|
if (topic.equals(slaves[i].topic)) {
|
|
slaves[i].stateUpdate(payload.equals("true"));
|
|
}
|
|
}
|
|
}
|
|
|
|
void sampleButtons() {
|
|
for(int i = 0; i < SLAVES_COUNT; i++) {
|
|
bool s = digitalRead(slaves[i].btnPin);
|
|
if(s != slaves[i].lastButton) {
|
|
slaves[i].lastButton = s;
|
|
|
|
if (!s || slaves[i].toggle) {
|
|
Serial.println("INTERRUPT");
|
|
parent->mqtt.publish(slaves[i].topic + "/set", slaves[i].state ? "false" : "true", true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
void init() {
|
|
node.init();
|
|
node.registerEndpoint("status", new StatusEndpoint());
|
|
//node.registerEndpoint("relay", new OutputEndpoint(5));
|
|
//node.registerEndpoint("dht", new DHTEndpoint(D4, 5000));
|
|
}
|