diff --git a/WebGUI.html b/WebGUI.html deleted file mode 100644 index 1dbc592..0000000 --- a/WebGUI.html +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - LED Board - - - - - - - - -
-
-
- - - - - diff --git a/src/LED-Board.cpp b/src/LED-Board.cpp index cc2a22c..81835da 100644 --- a/src/LED-Board.cpp +++ b/src/LED-Board.cpp @@ -1,117 +1,121 @@ #include #include +#include -#include "src/WebSocketsServer.h" -#include "src/image.hpp" -#include "src/panel.hpp" -#include "src/ProtocolDL.hpp" +#include "image.hpp" +#include "panel.hpp" -#define USE_SERIAL Serial +// An EthernetUDP instance to let us send and receive packets over UDP +EthernetUDP Udp; 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, 0 * PANEL_WIDTH, 0 * PANEL_HEIGHT); //data, clock, load -Panel panel2(28, 29, 31, 1 * PANEL_WIDTH, 0 * PANEL_HEIGHT); -ProtocolDL protocol = ProtocolDL(image); +Panel panel1(23, 27, 25, 0 * PANEL_WIDTH, 0 * PANEL_HEIGHT); //data, clock, load +Panel panel2(29, 33, 31, 1 * PANEL_WIDTH, 0 * PANEL_HEIGHT); +Panel panel3(35, 39, 37, 2 * PANEL_WIDTH, 0 * PANEL_HEIGHT); +Panel panel4(41, 45, 43, 3 * PANEL_WIDTH, 0 * PANEL_HEIGHT); +Panel panel5(47, 53, 49, 4 * PANEL_WIDTH, 0 * PANEL_HEIGHT); +#define BITS_OF_BYTE 8 -unsigned long last_activity = 0; +#define UDP_IMAGE_PORT 4242 + +/** + * 800 Byte describing all 5 panels in bits + */ +/* uint8_t packetBuffer[(PANEL_WIDTH * PANEL_HEIGHT * MAXIMUM_PANELSIZE) / sizeof(uint8_t)]; // buffer to hold incoming packet,*/ +uint8_t packetBuffer[(PANEL_WIDTH * PANEL_HEIGHT * MAXIMUM_PANELSIZE) / BITS_OF_BYTE]; +/* Reply with error messages*/ +char ReplyBuffer[UDP_TX_PACKET_MAX_SIZE]; // a string to send back 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]); - } - +/*FIXME hande image if(protocol.isComplete()) { Serial.println("complete"); panel1.send_image(&image); panel2.send_image(&image); + panel3.send_image(&image); + panel4.send_image(&image); + panel5.send_image(&image); } break; } + */ +void receiveUDP() { + int packetSize = Udp.parsePacket(); + if (packetSize) { + Serial.print("Received packet of size "); + Serial.println(packetSize); + Serial.print("From "); + IPAddress remote = Udp.remoteIP(); + for (int i=0; i < 4; i++) { + Serial.print(remote[i], DEC); + if (i < 3) { + Serial.print("."); + } + } + Serial.print(", port "); + Serial.println(Udp.remotePort()); + if (packetSize < ((int) sizeof(packetBuffer)) ) { + // read the packet into packetBufffer + Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); + } + + if (packetSize == sizeof(packetBuffer)) { + + } else { + sprintf(ReplyBuffer, "Wrong packet size %d", packetSize); + // send a reply to the IP address and port that sent us the packet we received + Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); + Udp.write(ReplyBuffer); + Udp.endPacket(); + } + } } 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); + Serial.begin(115200); panel1.init(); panel2.init(); + panel3.init(); + panel4.init(); + panel5.init(); + Serial.print(F("Activate all LEDs\r\n")); + for (int x = 0; x < IMAGE_WIDTH; x++) { + for (int y = 0; y < IMAGE_HEIGHT; y++) { + image.set_pixel(x, y, 1); + } + } + panel1.send_image(&image); + panel2.send_image(&image); + panel3.send_image(&image); + panel4.send_image(&image); + panel5.send_image(&image); + - Serial.println("setup done"); + Ethernet.init(); + Ethernet.begin(mac); + if (Ethernet.begin(mac) == 0) { + Serial.println(F("Failed to configure Ethernet using DHCP")); + if (Ethernet.hardwareStatus() == EthernetNoHardware) { + Serial.println(F("Ethernet shield was not found. Sorry, can't run without hardware. :(")); + } else if (Ethernet.linkStatus() == LinkOFF) { + Serial.println(F("Ethernet cable is not connected.")); + } + // no point in carrying on, so do nothing forevermore: + while (true) { + delay(1); + } + } + Serial.print(F("My IP address: ")); + Serial.println(Ethernet.localIP()); + + // start UDP + Udp.begin(UDP_IMAGE_PORT); } @@ -119,30 +123,33 @@ void setup() { // 0x00 0x00 0x00 0x00 0x00 0x00 0x00... // Width Height Delay Pixel -void default_image(Image* p) { +void default_image(Image* i) { static int offset = 0; - // reset image to maximum size - p->set_size(32767, 32767); + // maximum size of image defined in constructor // toggle all pixels in tilted bars - int dim = max(p->getWidth(), p->getHeight()); + int dim = max(IMAGE_WIDTH, IMAGE_HEIGHT); for (int n = 0; n < dim; n++) { - int x = (n + offset) % p->getWidth(); - int y = n % p->getHeight(); + int x = (n + offset) % IMAGE_WIDTH; + int y = n % IMAGE_HEIGHT; - byte pixel = p->get_pixel(x, y); - p->set_pixel(x, y, !pixel); + byte pixel = i->get_pixel(x, y); + i->set_pixel(x, y, !pixel); } offset++; } void loop() { - webSocket.loop(); - + receiveUDP(); + delay(10); if (someOneIsConnected == false) { default_image(&image); panel1.send_image(&image); panel2.send_image(&image); + panel3.send_image(&image); + panel4.send_image(&image); + panel5.send_image(&image); + Serial.println(F(".\n")); } } diff --git a/src/image.cpp b/src/image.cpp index 7bcbbec..806941f 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -6,7 +6,7 @@ bool Image::check_bounds(int x, int y) { return false; } - if ((x >= width) || (y >= height)) { + if ((x >= IMAGE_WIDTH) || (y >= IMAGE_HEIGHT)) { return false; } @@ -15,33 +15,20 @@ bool Image::check_bounds(int x, int y) { byte Image::get_pixel(int x, int y) { if (check_bounds(x, y) == false) { - return 0; + Serial.print(F("get_pixel outOfBound\n")); + return 1; } - return data[y * width + x]; + return data[y * IMAGE_WIDTH + x]; } void Image::set_pixel(int x, int y, byte value) { if (check_bounds(x, y) == false) { + Serial.print(F("set_pixel outOfBound\n")); return; } - data[y * width + x] = value; + data[y * IMAGE_WIDTH + x] = value; } void Image::clear_pixels() { memset(data, 0, sizeof(data)); } - -void Image::set_size(int w, int h) { - width = min(w, MAX_WIDTH); - height = min(h, MAX_HEIGHT); -} - -uint16_t Image::getWidth() -{ - return width; -} - -uint16_t Image::getHeight() -{ - return height; -} \ No newline at end of file diff --git a/src/image.hpp b/src/image.hpp index fa84a92..916c77a 100644 --- a/src/image.hpp +++ b/src/image.hpp @@ -3,26 +3,25 @@ #include -#define MAX_WIDTH 64 -#define MAX_HEIGHT 40 +#define MAXIMUM_PANELSIZE 5 +#define PANEL_WIDTH 32 +#define PANEL_HEIGHT 40 + +#define IMAGE_WIDTH (PANEL_WIDTH * MAXIMUM_PANELSIZE) +#define IMAGE_HEIGHT PANEL_HEIGHT class Image { public: - byte get_pixel(int x, int y); - void set_pixel(int x, int y, byte value); + uint8_t get_pixel(int x, int y); + void set_pixel(int x, int y, uint8_t value); void clear_pixels(); - void set_size(int w, int h); - uint16_t getWidth(); - uint16_t getHeight(); private: bool check_bounds(int x, int y); - int width; - int height; - byte data[MAX_WIDTH * MAX_HEIGHT]; + uint8_t data[IMAGE_WIDTH * IMAGE_HEIGHT]; }; -#endif \ No newline at end of file +#endif diff --git a/src/panel.cpp b/src/panel.cpp index abda670..d6bc252 100644 --- a/src/panel.cpp +++ b/src/panel.cpp @@ -15,6 +15,7 @@ void Panel::init() pinMode(pinData, OUTPUT); pinMode(pinClock, OUTPUT); pinMode(pinLoad, OUTPUT); + Serial.println(F("Panel init")); } void Panel::send_image(Image* img) { @@ -23,7 +24,7 @@ void Panel::send_image(Image* img) { for (int y = posY; y < endY; y += 8) { for (int x = posX; x < endX; x += 4) { - send_block(img, x, y); + send_block(img, x, y); } } diff --git a/src/panel.hpp b/src/panel.hpp index 199b4fd..e935566 100644 --- a/src/panel.hpp +++ b/src/panel.hpp @@ -3,8 +3,6 @@ #include "image.hpp" -#define PANEL_WIDTH 32 -#define PANEL_HEIGHT 40 class Panel {