79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "wled.h"
 | |
| 
 | |
| /*
 | |
|  * Support for DMX Output via MAX485.
 | |
|  * Change the output pin in src/dependencies/ESPDMX.cpp, if needed (ESP8266)
 | |
|  * Change the output pin in src/dependencies/SparkFunDMX.cpp, if needed (ESP32)
 | |
|  * ESP8266 Library from:
 | |
|  * https://github.com/Rickgg/ESP-Dmx
 | |
|  * ESP32 Library from:
 | |
|  * https://github.com/sparkfun/SparkFunDMX
 | |
|  */
 | |
| 
 | |
| #ifdef WLED_ENABLE_DMX
 | |
| 
 | |
| void handleDMX()
 | |
| {
 | |
|   // don't act, when in DMX Proxy mode
 | |
|   if (e131ProxyUniverse != 0) return;
 | |
| 
 | |
|   uint8_t brightness = strip.getBrightness();
 | |
| 
 | |
|   bool calc_brightness = true;
 | |
| 
 | |
|    // check if no shutter channel is set
 | |
|    for (unsigned i = 0; i < DMXChannels; i++)
 | |
|    {
 | |
|      if (DMXFixtureMap[i] == 5) calc_brightness = false;
 | |
|    }
 | |
| 
 | |
|   uint16_t len = strip.getLengthTotal();
 | |
|   for (int i = DMXStartLED; i < len; i++) {        // uses the amount of LEDs as fixture count
 | |
| 
 | |
|     uint32_t in = strip.getPixelColor(i);     // get the colors for the individual fixtures as suggested by Aircoookie in issue #462
 | |
|     byte w = W(in);
 | |
|     byte r = R(in);
 | |
|     byte g = G(in);
 | |
|     byte b = B(in);
 | |
| 
 | |
|     int DMXFixtureStart = DMXStart + (DMXGap * (i - DMXStartLED));
 | |
|     for (int j = 0; j < DMXChannels; j++) {
 | |
|       int DMXAddr = DMXFixtureStart + j;
 | |
|       switch (DMXFixtureMap[j]) {
 | |
|         case 0:        // Set this channel to 0. Good way to tell strobe- and fade-functions to fuck right off.
 | |
|           dmx.write(DMXAddr, 0);
 | |
|           break;
 | |
|         case 1:        // Red
 | |
|           dmx.write(DMXAddr, calc_brightness ? (r * brightness) / 255 : r);
 | |
|           break;
 | |
|         case 2:        // Green
 | |
|           dmx.write(DMXAddr, calc_brightness ? (g * brightness) / 255 : g);
 | |
|           break;
 | |
|         case 3:        // Blue
 | |
|           dmx.write(DMXAddr, calc_brightness ? (b * brightness) / 255 : b);
 | |
|           break;
 | |
|         case 4:        // White
 | |
|           dmx.write(DMXAddr, calc_brightness ? (w * brightness) / 255 : w);
 | |
|           break;
 | |
|         case 5:        // Shutter channel. Controls the brightness.
 | |
|           dmx.write(DMXAddr, brightness);
 | |
|           break;
 | |
|         case 6:        // Sets this channel to 255. Like 0, but more wholesome.
 | |
|           dmx.write(DMXAddr, 255);
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   dmx.update();        // update the DMX bus
 | |
| }
 | |
| 
 | |
| void initDMX() {
 | |
|  #if defined(ESP8266) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2)
 | |
|   dmx.init(512);        // initialize with bus length
 | |
|  #else
 | |
|   dmx.initWrite(512);  // initialize with bus length
 | |
|  #endif
 | |
| }
 | |
| #endif
 | 
