LED-BOARD/LED-Board.ino
2019-12-13 23:10:20 +01:00

149 lines
3.6 KiB
C++

#include <Arduino.h>
#include <Ethernet.h>
#include "src/WebSocketsServer.h"
#include "src/image.hpp"
#include "src/panel.hpp"
#include "src/ProtocolDL.hpp"
#define USE_SERIAL Serial
byte mac[] = { 0xBE, 0xB7, 0x5C, 0x30, 0xC3, 0x04 };
IPAddress ip(10, 23, 42, 24);
IPAddress router(10, 23, 42, 1);
IPAddress subnet(255, 255, 254, 0);
WebSocketsServer webSocket = WebSocketsServer(81);
Image image;
Panel panel1(22, 24, 23); //data, clock, load
Panel panel2(28, 29, 31);
ProtocolDL protocol = ProtocolDL(image);
unsigned long last_activity = 0;
bool someOneIsConnected = false;
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
static bool in_header = true;
switch(type) {
case WStype_DISCONNECTED:
USE_SERIAL.print("[");
USE_SERIAL.print(num);
USE_SERIAL.println("] Disconnected!");
someOneIsConnected = false;
break;
case WStype_CONNECTED:
{
//IPAddress ip = webSocket.remoteIP(num);
USE_SERIAL.print("[");
USE_SERIAL.print(num);
USE_SERIAL.print("] Connected ");
USE_SERIAL.print(" url: ");
//USE_SERIAL.println(payload);
// send message to client
webSocket.sendTXT(num, "Connected");
someOneIsConnected = true;
}
break;
case WStype_TEXT:
USE_SERIAL.print("[");
USE_SERIAL.print(num);
USE_SERIAL.print("] get Text: ");
//USE_SERIAL.println(payload);
// send message to client
// webSocket.sendTXT(num, "message here");
// send data to all connected clients
// webSocket.broadcastTXT("message here");
break;
case WStype_BIN:
USE_SERIAL.print("[");
USE_SERIAL.print(num);
USE_SERIAL.print("] get binary length: ");
USE_SERIAL.println(length);
for(uint16_t i = 0; i < length; i++)
{
protocol.newByte(payload[i]);
}
if(protocol.isComplete())
{
Serial.println("complete");
panel1.send_image(&image);
panel2.send_image(&image);
}
break;
}
}
void setup() {
// USE_SERIAL.begin(921600);
USE_SERIAL.begin(115200);
//Serial.setDebugOutput(true);
//USE_SERIAL.setDebugOutput(true);
Ethernet.init(10);
Ethernet.begin(mac, ip, router, router, subnet);
USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();
for(uint8_t t = 4; t > 0; t--) {
USE_SERIAL.print("[SETUP] BOOT WAIT ");
USE_SERIAL.print(t);
USE_SERIAL.println("...");
USE_SERIAL.flush();
delay(1000);
}
webSocket.begin();
webSocket.onEvent(webSocketEvent);
panel1.init();
panel2.init();
Serial.println("setup done");
}
// 0x00 0x00 0x00 0x00 0x00 0x00 0x00...
// Width Height Delay Pixel
void default_image(Image* p) {
static int offset = 0;
// reset image to maximum size
p->set_size(32767, 32767);
// toggle all pixels in tilted bars
int dim = max(p->getWidth(), p->getHeight());
for (int n = 0; n < dim; n++) {
int x = (n + offset) % p->getWidth();
int y = n % p->getHeight();
byte pixel = p->get_pixel(x, y);
p->set_pixel(x, y, !pixel);
}
offset++;
}
void loop() {
webSocket.loop();
if (someOneIsConnected == false) {
default_image(&image);
panel1.send_image(&image);
panel2.send_image(&image);
}
}