a2cabinLights/src/light_main.cpp

188 lines
4.3 KiB
C++

#include <Arduino.h>
#include <ESPmDNS.h>
#include <WebSocketsClient.h>
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
#define ETH_PHY_POWER 12
#include <ETH.h>
#define blinkDuration 500
#define connectDuration 1000
#ifndef LIGHT_NUMBER
#define LIGHT_NUMBER -1
#endif
#define lampOutputPin 5
bool isBlinking = false;
bool lampState = false;
long blinkTimer = 0;
long connectTimer = 0;
bool foundIp = false;
IPAddress ip;
WebSocketsClient webSocket;
static bool eth_connected = false;
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case SYSTEM_EVENT_ETH_START:
Serial.println("ETH Started");
// set eth hostname here
ETH.setHostname("a2clight" + LIGHT_NUMBER);
break;
case SYSTEM_EVENT_ETH_CONNECTED:
Serial.println("ETH Connected");
break;
case SYSTEM_EVENT_ETH_GOT_IP:
Serial.print("ETH MAC: ");
Serial.print(ETH.macAddress());
Serial.print(", IPv4: ");
Serial.print(ETH.localIP());
if (ETH.fullDuplex()) {
Serial.print(", FULL_DUPLEX");
}
Serial.print(", ");
Serial.print(ETH.linkSpeed());
Serial.println("Mbps");
eth_connected = true;
break;
case SYSTEM_EVENT_ETH_DISCONNECTED:
Serial.println("ETH Disconnected");
eth_connected = false;
break;
case SYSTEM_EVENT_ETH_STOP:
Serial.println("ETH Stopped");
eth_connected = false;
break;
default:
break;
}
}
void blinkLamp() { isBlinking = true; }
void noBlinkLamp() {
isBlinking = false;
lampState = false;
digitalWrite(lampOutputPin, LOW);
}
void lampon() {
isBlinking = false;
digitalWrite(lampOutputPin, HIGH);
}
void lampoff() {
isBlinking = false;
digitalWrite(lampOutputPin, LOW);
}
void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.println("[WSc] Disconnected!");
foundIp = false;
break;
case WStype_CONNECTED: {
Serial.print("[WSc] Connected to controller");
webSocket.sendTXT("conlamp:" + String(LIGHT_NUMBER));
foundIp = true;
} break;
case WStype_TEXT:
Serial.print("[WSc] get text:");
Serial.println((char *)payload);
if (strcmp((char *)payload, "blinkLamp") == 0) {
blinkLamp();
Serial.println("Enable Blinking!");
} else if (strcmp((char *)payload, "noBlinkLamp") == 0) {
noBlinkLamp();
Serial.println("Disable Blinking!");
} else if (strcmp((char *)payload, "lampon") == 0) {
lampon();
Serial.println("Lamp on!");
} else if (strcmp((char *)payload, "lampoff") == 0) {
lampoff();
Serial.println("Lamp off!");
}
break;
}
}
void setup() {
Serial.begin(115200);
pinMode(lampOutputPin, OUTPUT);
WiFi.onEvent(WiFiEvent);
ETH.begin();
while (!eth_connected) {
delay(1000);
}
if (!MDNS.begin("a2clight" + LIGHT_NUMBER)) {
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
}
void browseService(const char *service, const char *proto) {
Serial.printf("Browsing for service _%s._%s.local. ... ", service, proto);
int n = MDNS.queryService(service, proto);
if (n == 0) {
Serial.println("no services found");
} else {
Serial.print(n);
Serial.println(" service(s) found");
for (int i = 0; i < n; ++i) {
// Print details for each service found
Serial.print(" ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(MDNS.hostname(i));
Serial.print(" (");
Serial.print(MDNS.IP(i));
Serial.print(":");
Serial.print(MDNS.port(i));
Serial.println(")");
if (MDNS.hostname(i).startsWith("a2clcontroller")) {
Serial.println("Trying to connect");
Serial.println(MDNS.IP(i));
foundIp = true;
ip = MDNS.IP(i);
webSocket.begin(ip.toString(), 80, "/ws");
webSocket.onEvent(webSocketEvent);
// webSocket.setAuthorization("user", "Password");
webSocket.setReconnectInterval(500);
webSocket.enableHeartbeat(1500, 2000, 2);
}
}
}
Serial.println();
}
void loop() {
if (!foundIp && eth_connected && ((millis() - connectTimer) > connectDuration)) {
browseService("http", "tcp");
connectTimer = millis();
}
if (foundIp)
webSocket.loop();
if (isBlinking && millis() - blinkTimer > blinkDuration) {
lampState = !lampState;
digitalWrite(lampOutputPin, lampState);
blinkTimer = millis();
}
}