From 36cdb91f68e0f8ca393edb11e69ee83b91fd818d Mon Sep 17 00:00:00 2001 From: Cole Deck Date: Tue, 30 Jan 2024 21:27:20 -0600 Subject: [PATCH] it crashes --- platformio.ini | 4 +- src/e131.h | 3 + src/main.cpp | 661 ++++++------------------------------------------- 3 files changed, 77 insertions(+), 591 deletions(-) diff --git a/platformio.ini b/platformio.ini index 537df9a..da35a0a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -19,9 +19,9 @@ upload_port = /run/media/amelia/RPI-RP2/ debug_tool = cmsis-dap upload_protocol = cmsis-dap monitor_speed = 115200 -board_build.filesystem_size = 1m +board_build.filesystem_size = 1m board_build.f_cpu = 133000000L -build_flags = -O3 +; build_flags = -Os ; board_flags = -DWIFICC=CYW43_COUNTRY_USA lib_deps = https://github.com/FastLED/FastLED#master diff --git a/src/e131.h b/src/e131.h index f45f414..1660740 100644 --- a/src/e131.h +++ b/src/e131.h @@ -230,6 +230,9 @@ class E131 { stats.packet_errors++; } } + else { + Serial.println("Packet size " + String(size)); + } return retval; } diff --git a/src/main.cpp b/src/main.cpp index eaff408..9b02e02 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,676 +1,159 @@ -// Includes -//#include -//#include +#include #include #include -#include #include -#include "e131.h" -#include -#include "config.h" -#include +#include #include #include -int strips[LED_STRIPS] = {170, 170, 170, 170, 170, 170, 170, 170}; +# include +# include +# define _UDP WiFiUDP + // Begin code bool core1_separate_stack = true; -#ifdef DEBUG - #define PRINTFUNC print - #define PRINTLNFUNC println -#else - #define PRINTFUNC - #define PRINTLNFUNC -#endif - -int calculate[LED_STRIPS * 4]; -int universes[LED_STRIPS * 4]; -CRGB ledstrip[MAX_LEDS]; -int pins[8]; - -uint8_t * livedata; -// Networking +uint8_t raw[4096]; +_UDP udp; +int nopackets = 0; +Wiznet5500lwIP eth(17, SPI, 21); // 17 : CS, 21 : INTn +// don't think the interrupt pin is actually used WebServer httpServer(80); HTTPUpdateServer httpUpdater; -bool status = 0; -bool status2 = 0; -byte ready = 0; -bool newconfig = false; -struct tm timeinfo; -String clientbuffer = ""; -String initinfo = ""; -bool debug = 1; -bool printer = 1; -int channels = 0; -// Colors (RGB) -int bootsel_count = 0; -int nopackets = 0; - -const uint8_t RED[PIXEL_SIZE]= {0x20, 0x00, 0x00}; -const uint8_t ORANGE[PIXEL_SIZE]= {0x20, 0x10, 0x00}; -const uint8_t YELLOW[PIXEL_SIZE]= {0x20, 0x20, 0x00}; -const uint8_t GREEN[PIXEL_SIZE]= {0x00, 0x20, 0x00}; -const uint8_t CYAN[PIXEL_SIZE]= {0x00, 0x20, 0x20}; -const uint8_t BLUE[PIXEL_SIZE]= {0x00, 0x00, 0x20}; -const uint8_t PURPLE[PIXEL_SIZE]= {0x20, 0x00, 0x20}; -const uint8_t BLACK[PIXEL_SIZE]= {0x00, 0x00, 0x00}; -const uint8_t WHITE[PIXEL_SIZE]= {0x20, 0x20, 0x20}; -#define MAX_PIXELS_PER_UNIVERSE 512 / PIXEL_SIZE /* Number of pixels */ -#define CHANNEL_START 1 /* Channel to start listening at */ - -Wiznet5500lwIP eth(17, SPI, 21); //, 21); // 17 : cs, 21 : INTn -E131 e131; - - -template T print(T in) { - Serial.print(String(in)); - if(printer) clientbuffer += String(in); - return (T)true; -} - -template T println(T in) { - Serial.println(String(in)); - if(printer) { - clientbuffer += String(in); - clientbuffer += "\n"; - } - return (T)true; -} - -void wipe_eeprom() { - - for(int i = 0; i < 64+16; i++) { - EEPROM.write(i, (byte)0); - } - EEPROM.commit(); -} - -IPAddress IP_ADDR; - -unsigned short START_UNIVERSE; -char HOSTNAME[64]; - -String ETH_MODE; -String postForms; -void handleRoot() { - httpServer.send(200, "text/html", postForms); -} - -void handlePlain() { - if (httpServer.method() != HTTP_POST) { - httpServer.send(405, "text/plain", "Method Not Allowed"); - } else { - httpServer.send(200, "text/plain", "POST body was:\r\n" + httpServer.arg("plain")); - println("POST body was:\r\n" + httpServer.arg("plain")); - } -} - -void handleForm() { - if (httpServer.method() != HTTP_POST) { - httpServer.send(405, "text/plain", "Method Not Allowed"); - } else { - String message = "POST form was:\r\n"; - bool ipset = false; - bool reboot = false; - for (uint8_t i = 0; i < httpServer.args(); i++) { - Serial.println(httpServer.argName(i)); - if (httpServer.argName(i) == "ipa") { - ipset = true; - } - if (httpServer.argName(i) == "hostname") { - println("Updating hostname"); - for (int j = 0; j < sizeof(HOSTNAME); j++) { - if (j < sizeof(httpServer.arg(i))) - HOSTNAME[j] = httpServer.arg(i)[j]; - else - HOSTNAME[j] = '\0'; - } - //HOSTNAME = httpServer.arg(i); - EEPROM.put(8, HOSTNAME); - newconfig = true; - //EEPROM.commit(); - } - if (httpServer.argName(i) == "universe") { - println("Updating start universe"); - START_UNIVERSE = (unsigned short)(httpServer.arg(i).toInt()); - EEPROM.put(4, START_UNIVERSE); - newconfig = true; - //EEPROM.commit(); - } - if (httpServer.argName(i) == "reboot") { - println("Rebooting..."); - reboot = true; - } - - message += " " + httpServer.argName(i) + ": " + httpServer.arg(i) + "\r\n"; - } - if (ipset) { - println("Updating IP address..."); - byte a, b, c, d; - for (uint8_t i = 0; i < httpServer.args(); i++) { - if (httpServer.argName(i) == "ipa") - a = byte(httpServer.arg(i).toInt()); - if (httpServer.argName(i) == "ipb") - b = byte(httpServer.arg(i).toInt()); - if (httpServer.argName(i) == "ipc") - c = byte(httpServer.arg(i).toInt()); - if (httpServer.argName(i) == "ipd") - d = byte(httpServer.arg(i).toInt()); - } - - IP_ADDR = IPAddress(a,b,c,d); - EEPROM.write(0, a); - EEPROM.write(1, b); - EEPROM.write(2, c); - EEPROM.write(3, d); - newconfig = true; +void initUnicast() { + delay(100); + udp.begin(5568); + if (Serial) { + Serial.print(F("- Unicast port: ")); + Serial.println(5568); } - httpServer.sendHeader("Location", "/",true); - httpServer.send(302, "text/plain", ""); - //httpServer.send(200, "text/plain", message); - println(message); - if(reboot) { - EEPROM.commit(); - for (int i = 0; i < MAX_LEDS; i++) { - ledstrip[i] = CRGB(0, 0, 0); - } - FastLED.show(); - ready = 3; // trigger core 1 to stop - delay(250); - rp2040.reboot(); - } - } -} - -void handleNotFound() { - String message = "File Not Found\n\n"; - message += "URI: "; - message += httpServer.uri(); - message += "\nMethod: "; - message += (httpServer.method() == HTTP_GET) ? "GET" : "POST"; - message += "\nArguments: "; - message += httpServer.args(); - message += "\n"; - for (uint8_t i = 0; i < httpServer.args(); i++) { - message += " " + httpServer.argName(i) + ": " + httpServer.arg(i) + "\n"; - } - httpServer.send(404, "text/plain", message); - println(message); } - - - - -void write_universe(long universe, uint8_t data[], long size) { - // universe starts at 0 - /*PRINTFUNC("Universe: "); - PRINTLNFUNC(universe); - PRINTFUNC("Calculate size: "); - PRINTLNFUNC(sizeof(calculate));*/ - int offset = calculate[universe]; - /*PRINTFUNC("Offset: "); - PRINTLNFUNC(offset); - PRINTFUNC("Universes size: "); - PRINTLNFUNC(sizeof(universes));*/ - int write_size = universes[universe]; - /*PRINTFUNC("Length: "); - PRINTLNFUNC(write_size * PIXEL_SIZE + (CHANNEL_START - 1) + 2); - PRINTFUNC("Data: "); - PRINTLNFUNC(size);*/ - if (write_size * PIXEL_SIZE + (CHANNEL_START - 1) + 2 > size) { - println("Write size too big!!"); - return; +int readPacket() { + int size = udp.parsePacket(); + if (size) { + udp.readBytes(raw, size); } - if(offset + write_size > sizeof(ledstrip)) { - println("Write size too big!!"); - return; - } - //status = 0; - for (int i = 0; i < write_size; i++) { - int j = i * PIXEL_SIZE + (CHANNEL_START - 1); - /*if(debug) { - PRINTFUNC(data[j]); - PRINTFUNC(" "); - PRINTFUNC(data[j+1]); - PRINTFUNC(" "); - PRINTFUNC(data[j+2]); - PRINTFUNC(" "); - }*/ - ledstrip[offset + i] = CRGB(data[j], data[j+1], data[j+2]); - //ledstrip[strip].setPixelColor(i + offset, data[j], data[j+1], data[j+2]); - } - //FastLED.show(); - //status = 1; - - //PRINTLNFUNC("Done writing."); - - + /*else { + Serial.println("Error: packet size " + String(size)); + }*/ + return size; } void setup() { - vreg_voltage v = VREG_VOLTAGE_1_20; - vreg_set_voltage(v); - set_sys_clock_khz(252000, false); + //vreg_voltage v = VREG_VOLTAGE_1_20; + //vreg_set_voltage(v); + //set_sys_clock_khz(252000, false); // play with this value + Serial.begin(115200); - rp2040.wdt_begin(8000); + //rp2040.wdt_begin(8000); + pinMode(24, INPUT); // VBUS detect - check for USB connection if (digitalRead(24)) { - delay(3000); // Wait for serial + delay(3000); // Wait for USB serial if connected } - pinMode(21, INPUT); - println("\r\nStarting RGB Controller..."); - pinMode(20, OUTPUT); - println("Resetting W5500 Ethernet Driver..."); - digitalWrite(20, LOW); // reset W5500 ethernet + Serial.println("\r\nStarting RGB Controller..."); + + pinMode(21, INPUT); // interrupt pin - probably unused + + pinMode(20, OUTPUT); // W5500 RSTn wired to 20 + Serial.println("Resetting W5500 Ethernet Driver..."); + digitalWrite(20, LOW); // reset W5500 ethernet delay(1); // for 1 ms digitalWrite(20, HIGH); + SPI.setRX(16); SPI.setCS(17); SPI.setSCK(18); SPI.setTX(19); - pinMode(ENABLEPIN, OUTPUT); - println("Enabling outputs..."); - digitalWrite(ENABLEPIN, LOW); // Enable buffer output! - //pinMode(0, OUTPUT); - //digitalWrite(0, HIGH); - - //delay(3000); - println("Checking for EEPROM configuration..."); - EEPROM.begin(256); - //wipe_eeprom(); - EEPROM.get(4, START_UNIVERSE); - if (START_UNIVERSE == 0 || START_UNIVERSE == 65535) { - println("No valid config detected. Setting defaults..."); - START_UNIVERSE = 1; - EEPROM.put(4, START_UNIVERSE); - EEPROM.commit(); - } + eth.setSPISpeed(10000000); // play with this value + lwipPollingPeriod(3); // play with this value + eth.setHostname("RGBController"); - if(EEPROM.read(8) == byte(0)) { // check if EEPROM is empty - char newhostname[] = "RGBController"; - for (int j = 0; j < sizeof(HOSTNAME); j++) { - if (j < sizeof(newhostname)) - HOSTNAME[j] = newhostname[j]; - else - HOSTNAME[j] = '\0'; - } - EEPROM.put(8, HOSTNAME); - EEPROM.commit(); - } - EEPROM.get(8, HOSTNAME); - if (HOSTNAME == "") { - char newhostname[] = "RGBController"; - for (int j = 0; j < sizeof(HOSTNAME); j++) { - if (j < sizeof(newhostname)) - HOSTNAME[j] = newhostname[j]; - else - HOSTNAME[j] = '\0'; - } - EEPROM.put(8, HOSTNAME); - EEPROM.commit(); - } - IP_ADDR = IPAddress(EEPROM.read(0),EEPROM.read(1),EEPROM.read(2),EEPROM.read(3)); - if (!IP_ADDR.isSet()) - ETH_MODE = "dhcp"; - else - ETH_MODE = "staticip"; - rp2040.wdt_reset(); + Serial.println(F("Setting IP")); - println("Configuration loaded."); - - if(ETH_MODE == "staticip") { - Serial.println("Setting static IP"); - eth.config(IP_ADDR, INADDR_NONE); - } - else { - Serial.println(F("Requesting Address via DHCP")); - } - SPI.setRX(16); - SPI.setCS(17); - SPI.setSCK(18); - SPI.setTX(19); - eth.setSPISpeed(ETH_SPI_SPD); - lwipPollingPeriod(1); - - //char * hostname_char; - //HOSTNAME.toCharArray(hostname_char, 32); - eth.setHostname(HOSTNAME); + //eth.config(IPAddress(192,168,68,130), INADDR_NONE); // static IP; comment out for DHCP + if (!eth.begin()) { Serial.println("No wired Ethernet hardware detected. Check pinouts, wiring."); - println("Connection failed. Retrying."); + Serial.println("Connection failed. Retrying."); rp2040.reboot(); } int count = 0; - while (!eth.connected() && count < 32) { + while (!eth.connected() && count < 32) { // wait 8 seconds for connection rp2040.wdt_reset(); count++; Serial.print("."); delay(250); } if (!eth.connected()) { - println("Connection failed. Retrying."); + Serial.println("Connection failed. Retrying."); rp2040.reboot(); } Serial.print(F("\r\n- IP Address: ")); Serial.println(eth.localIP()); + initUnicast(); + MDNS.begin("RGBController"); - e131.begin(E131_UNICAST); - #ifdef INT_WIFI - WiFi.noLowPowerMode(); - #endif - - // If we get here, then network is good to go - println("Starting mDNS client..."); - MDNS.begin(HOSTNAME); - println("Starting web configurator & firmware update service..."); - - httpUpdater.setup(&httpServer, update_path, update_username, update_password); - - httpServer.on("/", handleRoot); + httpUpdater.setup(&httpServer, "/update", "admin", "admin"); + httpServer.begin(); + MDNS.addService("http", "tcp", 80); - httpServer.on("/postplain/", handlePlain); - postForms = "\ - \ - RGB Controller Configuration\ - \ - \ - \ -

RGB Controller Configuration


\ -

Set IP address

\ - Needs reboot to apply
\ - Set to 0.0.0.0 for DHCP\ -
\ - .\ - .\ - .\ - \ - \ -

\ -

Set Hostname

\ - Needs reboot to apply
\ - Max 64 characters\ -
\ - \ - \ -

\ -

DMX512 Start Universe

\ - Applies immediately
\ - Between (inclusive) 1-65000\ -
\ - \ - \ -

\ -
\ - \ -

\ - \ -"; - httpServer.on("/postform/", handleForm); - httpServer.onNotFound(handleNotFound); + - httpServer.begin(); - MDNS.addService("http", "tcp", 80); - print("OTA Updates enabled. Open http://"); - print(HOSTNAME); - print(update_path); - print(" in your browser and login with username "); - print(update_username); - print(" and password "); - println(update_password); + + #ifdef INT_WIFI + WiFi.noLowPowerMode(); + #endif - if(ENABLE_NTP) { - println("Starting NTP client."); - NTP.begin(ntpserver); - NTP.waitSet([]() { print("."); }, 15000); - time_t now = time(nullptr); - println(""); - gmtime_r(&now, &timeinfo); - print("Current time: "); - println(asctime(&timeinfo)); - } - ready += 1; - while (ready == 1) { - delay(50); - } - println("Startup Complete. Listening for HTTP and e1.31 (sACN) connections..."); - initinfo += clientbuffer; - //e131.beginMulticast(ssid, passphrase, UNIVERSE); - printer = 0; + Serial.println("Startup Complete. Listening for e1.31 (sACN) connections..."); } void setup1() { - while(ready == 0) - delay(50); pinMode(LED_BUILTIN, OUTPUT); - pinMode(32+1, OUTPUT); + //pinMode(32+1, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); - println("Initializing LED outputs and universe mappings..."); - - #ifdef STRIP1 - pins[0] = STRIP1; - #endif - #ifdef STRIP2 - pins[1] = STRIP2; - #endif - #ifdef STRIP3 - pins[2] = STRIP3; - #endif - #ifdef STRIP4 - pins[3] = STRIP4; - #endif - #ifdef STRIP5 - pins[4] = STRIP5; - #endif - #ifdef STRIP6 - pins[5] = STRIP6; - #endif - #ifdef STRIP7 - pins[6] = STRIP7; - #endif - #ifdef STRIP8 - pins[7] = STRIP8; - #endif - // Populate universes and offsets - int offsetcount = 0; - int currentsize = 0; - for (int i = 0; i < LED_STRIPS; i++) { - int tmp = strips[i]; - - PRINTFUNC("Strip "); - PRINTFUNC(i); - PRINTFUNC(", Pin "); - PRINTFUNC(pins[i]); - PRINTFUNC(", Light count "); - PRINTLNFUNC(tmp); - - while(tmp > MAX_PIXELS_PER_UNIVERSE) { - universes[currentsize] = MAX_PIXELS_PER_UNIVERSE; - calculate[currentsize] = offsetcount; - - PRINTFUNC(" Universe "); - PRINTFUNC(currentsize + START_UNIVERSE); - PRINTFUNC(", Light count "); - PRINTFUNC(MAX_PIXELS_PER_UNIVERSE); - PRINTFUNC(", Size "); - PRINTLNFUNC(MAX_PIXELS_PER_UNIVERSE * PIXEL_SIZE); - offsetcount += MAX_PIXELS_PER_UNIVERSE; - currentsize += 1; - tmp -= MAX_PIXELS_PER_UNIVERSE; - } - universes[currentsize] = tmp; - calculate[currentsize] = offsetcount; - PRINTFUNC(" Universe "); - PRINTFUNC(currentsize + START_UNIVERSE); - PRINTFUNC(", Light count "); - PRINTFUNC(tmp); - PRINTFUNC(", Size "); - PRINTLNFUNC(tmp * PIXEL_SIZE); - offsetcount += tmp; - currentsize += 1; - } - - #ifdef STRIP1 - FastLED.addLeds(ledstrip, calculate[0], strips[0]); - #endif - #ifdef STRIP2 - FastLED.addLeds(ledstrip, calculate[1], strips[1]); - #endif - #ifdef STRIP3 - FastLED.addLeds(ledstrip, calculate[2], strips[2]); - #endif - #ifdef STRIP4 - FastLED.addLeds(ledstrip, calculate[3], strips[3]); - #endif - #ifdef STRIP5 - FastLED.addLeds(ledstrip, calculate[4], strips[4]); - #endif - #ifdef STRIP6 - FastLED.addLeds(ledstrip, calculate[5], strips[5]); - #endif - #ifdef STRIP7 - FastLED.addLeds(ledstrip, calculate[6], strips[6]); - #endif - #ifdef STRIP8 - FastLED.addLeds(ledstrip, calculate[7], strips[7]); - #endif - - - for (int i = 0; i < MAX_LEDS; i++) { - ledstrip[i] = CRGB(0, 0, 0); - } - FastLED.show(); - // Test all lights - /*for (int i = 0; i < MAX_LEDS; i++) { - ledstrip[i] = CRGB(0, 0, 50); - FastLED.show(); - //delay(1); - ledstrip[i] = CRGB(0, 0, 0); - } - FastLED.show();*/ - //delay(3000); - - ready += 1; - while (ready == 1) { - delay(50); - } - - //rp2040.wdt_begin(8000); - } void loop() { /* Parse a packet */ //println("Start loop"); - - if(channels = e131.parsePacket()) { + int size; + if(size = readPacket()) { // Offset by start universe // as all local functions count from 0 //delay(0); - livedata = e131.data; - status = 1; + Serial.println("Got valid packet of size " + String(size) + " at " + String(millis()/1000.0)); delayMicroseconds(5000); - //Serial.print(eth.isLinked()); nopackets = 0; } else { + //delayMicroseconds(500); nopackets++; } if(nopackets > 50000) { nopackets = 0; - println("Resetting network"); - eth.end(); delay(5); - eth.begin(); - println("Reset network"); + Serial.println("No packets recieved in a while.... at " + String(millis()/1000.0)); } - //println("mid loop"); - httpServer.handleClient(); + MDNS.update(); - //println("end loop"); - if(newconfig == true) { - println("Waiting for core 1 to idle..."); - ready = 3; - while(ready == 3) - delay(50); - println("Configuration changed - saving to flash..."); - EEPROM.commit(); - newconfig = false; - ready = 2; - } + httpServer.handleClient(); } void loop1() { - rp2040.wdt_reset(); - if(BOOTSEL) { - bootsel_count++; - delay(50); - } - else { - bootsel_count = 0; - } - if(bootsel_count > 60) { // 3 seconds - Serial.print("Wiping configuration..."); - digitalWrite(LED_BUILTIN, LOW); - delay(50); - for(int i = 0; i < 5; i++) { // blink 5 times to indicate wipe - digitalWrite(LED_BUILTIN, HIGH); - delay(125); - digitalWrite(LED_BUILTIN, LOW); - delay(125); - } - wipe_eeprom(); - rp2040.reboot(); - - } - if(ready == 3) { - ready = 4; - while(ready == 4) - delay(50); - } - status2 = 1; - if(status == 1 && e131.universe > START_UNIVERSE - 1 && channels > 0) { - write_universe(e131.universe - START_UNIVERSE, livedata, channels); - FastLED.show(); - //println("Done Writing"); - status = 0; - } - - status2 = 0; - - if (millis() % 100 > 50) { // reset LED - digitalWrite(LED_BUILTIN, HIGH); - } - else if (millis() % 100 < 50 && status == 1) { - //status = 0; - digitalWrite(LED_BUILTIN, LOW); - } - //status = 0; - //delay(50); - float cputemp = analogReadTemp(); - if (cputemp > 50.0) { - println("ERROR: Overtemperature triggered!"); - rp2040.reboot(); - } - - float envtemp = analogRead(28); - envtemp = envtemp / 1024.0 * 3300; // voltage in mV - envtemp /= 10.0; // 10.0 mv/C - envtemp -= 50; // offset 500mV = 0C - - // TODO: report temps somehow to dashboard - + digitalWrite(LED_BUILTIN, HIGH); + delay(50); + digitalWrite(LED_BUILTIN, LOW); + delay(50); }