spejsiot/display/app/application.cpp

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