From 4d2585f58c225e15b2449f41c70dc6ccc67f4b2a Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 21 Oct 2019 00:52:32 -0500 Subject: [PATCH] Get E1.31 interface working, but only with a hard-coded test configuration for now --- OpenAuraSDK.cpp | 4 +- OpenAuraSDK.pro | 5 ++ RGBController/E131ControllerDetect.cpp | 11 ++- RGBController/RGBController_E131.cpp | 106 ++++++++++++++++++++++++- RGBController/RGBController_E131.h | 10 ++- 5 files changed, 127 insertions(+), 9 deletions(-) diff --git a/OpenAuraSDK.cpp b/OpenAuraSDK.cpp index f70007937..e40b06e2b 100644 --- a/OpenAuraSDK.cpp +++ b/OpenAuraSDK.cpp @@ -439,6 +439,7 @@ void DetectHyperXControllers(std::vector &busses, std::vec void DetectLEDStripControllers(std::vector &rgb_controllers); void DetectOpenRazerControllers(std::vector &rgb_controllers); void DetectRazerChromaSDKControllers(std::vector& rgb_controllers); +void DetectE131Controllers(std::vector &rgb_controllers); /******************************************************************************************\ * * @@ -458,7 +459,8 @@ void DetectRGBControllers(void) DetectHyperXControllers(busses, rgb_controllers); DetectLEDStripControllers(rgb_controllers); - + DetectE131Controllers(rgb_controllers); + #ifdef WIN32 DetectRazerChromaSDKControllers(rgb_controllers); #else diff --git a/OpenAuraSDK.pro b/OpenAuraSDK.pro index 1cc653130..18917c864 100644 --- a/OpenAuraSDK.pro +++ b/OpenAuraSDK.pro @@ -1,5 +1,7 @@ QT += core gui +LIBS += -le131 + greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = OpenAuraSDK.bin @@ -39,9 +41,11 @@ SOURCES += \ Controllers/LEDStripController/LEDStripController.cpp \ Controllers/LEDStripController/LEDStripControllerDetect.cpp \ RGBController/OpenRazerDetect.cpp \ + RGBController/E131ControllerDetect.cpp \ RGBController/RGBController_Aura.cpp \ RGBController/RGBController_Corsair.cpp \ RGBController/RGBController_CorsairPro.cpp \ + RGBController/RGBController_E131.cpp \ RGBController/RGBController_HuePlus.cpp \ RGBController/RGBController_HyperX.cpp \ RGBController/RGBController_LEDStrip.cpp \ @@ -63,6 +67,7 @@ HEADERS += \ RGBController/RGBController_Aura.h \ RGBController/RGBController_Corsair.h \ RGBController/RGBController_CorsairPro.h \ + RGBController/RGBController_E131.h \ RGBController/RGBController_HuePlus.h \ RGBController/RGBController_HyperX.h \ RGBController/RGBController_OpenRazer.h diff --git a/RGBController/E131ControllerDetect.cpp b/RGBController/E131ControllerDetect.cpp index 64cfb7b96..f64d97629 100644 --- a/RGBController/E131ControllerDetect.cpp +++ b/RGBController/E131ControllerDetect.cpp @@ -47,10 +47,15 @@ void DetectE131Controllers(std::vector &rgb_controllers) dev.name = "Test"; dev.type = ZONE_TYPE_SINGLE; - dev.start_universe = 1; - dev.start_channel = 1; + dev.num_leds = 30; + dev.start_universe = 20; + dev.start_channel = 500; + + std::vector devices; + + devices.push_back(dev); - new_controller = new RGBController_E131(); + new_controller = new RGBController_E131(devices); rgb_controllers.push_back(new_controller); #if 0 diff --git a/RGBController/RGBController_E131.cpp b/RGBController/RGBController_E131.cpp index 47f9f7b27..78afcf8b1 100644 --- a/RGBController/RGBController_E131.cpp +++ b/RGBController/RGBController_E131.cpp @@ -8,18 +8,24 @@ \*-----------------------------------------*/ #include "RGBController_E131.h" +#include +#include - -RGBController_E131::RGBController_E131(std::vector devices) +RGBController_E131::RGBController_E131(std::vector device_list) { name = "E1.31 Streaming ACN Device"; + devices = device_list; + mode led_mode; led_mode.name = "Custom"; modes.push_back(led_mode); for (int i = 0; i < devices.size(); i++) { + /*-----------------------------------------*\ + | Add LEDs | + \*-----------------------------------------*/ for (int led_idx = 0; led_idx < devices[i].num_leds; led_idx++) { colors.push_back(0x00000000); @@ -28,6 +34,9 @@ RGBController_E131::RGBController_E131(std::vector devices) leds.push_back(new_led); } + /*-----------------------------------------*\ + | Add Zones | + \*-----------------------------------------*/ zone led_zone; led_zone.name = devices[i].name; led_zone.type = devices[i].type; @@ -38,6 +47,38 @@ RGBController_E131::RGBController_E131(std::vector devices) } led_zone.map.push_back(led_zone_map); zones.push_back(led_zone); + + /*-----------------------------------------*\ + | Add Universes | + \*-----------------------------------------*/ + unsigned int total_universes = ceil( ( ( devices[i].num_leds * 3 ) + devices[i].start_channel ) / 512.0f ); + + for (int univ_idx = 0; univ_idx < total_universes; univ_idx++) + { + unsigned int universe = devices[i].start_universe + univ_idx; + bool universe_exists = false; + + for (int pkt_idx = 0; pkt_idx < packets.size(); pkt_idx++) + { + if(packets[pkt_idx].frame.universe == universe) + { + universe_exists = true; + } + } + + if(!universe_exists) + { + e131_packet_t packet; + e131_addr_t dest_addr; + + e131_pkt_init(&packet, universe, 512); + e131_multicast_dest(&dest_addr, universe, E131_DEFAULT_PORT); + + packets.push_back(packet); + universes.push_back(universe); + dest_addrs.push_back(dest_addr); + } + } } } @@ -62,6 +103,8 @@ void RGBController_E131::SetAllLEDs(RGBColor color) { colors[i] = color; } + + UpdateLEDs(); } void RGBController_E131::SetAllZoneLEDs(int zone, RGBColor color) @@ -70,13 +113,72 @@ void RGBController_E131::SetAllZoneLEDs(int zone, RGBColor color) { colors[i] = color; } + + UpdateLEDs(); } void RGBController_E131::SetLED(int led, RGBColor color) { colors[led] = color; + + UpdateLEDs(); } void RGBController_E131::UpdateLEDs() { + int sockfd = e131_socket(); + + for(int device_idx = 0; device_idx < devices.size(); device_idx++) + { + unsigned int total_universes = ceil( ( ( devices[device_idx].num_leds * 3 ) + devices[device_idx].start_channel ) / 512.0f ); + unsigned int channel_idx = devices[device_idx].start_channel; + unsigned int led_idx = 0; + unsigned int rgb_idx = 0; + bool done = false; + + for (int univ_idx = 0; univ_idx < total_universes; univ_idx++) + { + unsigned int universe = devices[device_idx].start_universe + univ_idx; + + for(int packet_idx = 0; packet_idx < packets.size(); packet_idx++) + { + if(!done && (universes[packet_idx] == universe)) + { + while(!done && (channel_idx <= 512)) + { + switch(rgb_idx) + { + case 0: + packets[packet_idx].dmp.prop_val[channel_idx] = RGBGetRValue( colors[led_idx] ); + rgb_idx = 1; + break; + case 1: + packets[packet_idx].dmp.prop_val[channel_idx] = RGBGetGValue( colors[led_idx] ); + rgb_idx = 2; + break; + case 2: + packets[packet_idx].dmp.prop_val[channel_idx] = RGBGetBValue( colors[led_idx] ); + rgb_idx = 0; + led_idx++; + break; + } + + if(led_idx >= devices[device_idx].num_leds) + { + done = true; + } + + channel_idx++; + } + } + } + + channel_idx = 1; + } + } + + for(int packet_idx = 0; packet_idx < packets.size(); packet_idx++) + { + e131_send(sockfd, &packets[packet_idx], &dest_addrs[packet_idx]); + } } \ No newline at end of file diff --git a/RGBController/RGBController_E131.h b/RGBController/RGBController_E131.h index 6d7226f38..b5193a354 100644 --- a/RGBController/RGBController_E131.h +++ b/RGBController/RGBController_E131.h @@ -9,7 +9,7 @@ #pragma once #include "RGBController.h" -#include "E131Controller.h" +#include typedef unsigned int e131_rgb_order; @@ -31,12 +31,12 @@ struct E131Device unsigned int start_channel; e131_rgb_order rgb_order; zone_type type; -} +}; class RGBController_E131 : public RGBController { public: - RGBController_E131(); + RGBController_E131(std::vector device_list); int GetMode(); void SetMode(int mode); void SetCustomMode(); @@ -46,4 +46,8 @@ public: void UpdateLEDs(); private: + std::vector devices; + std::vector packets; + std::vector dest_addrs; + std::vector universes; }; \ No newline at end of file