Get E1.31 interface working, but only with a hard-coded test configuration for now

This commit is contained in:
Adam Honse
2019-10-21 00:52:32 -05:00
parent 74bdfff195
commit 4d2585f58c
5 changed files with 127 additions and 9 deletions

View File

@@ -439,6 +439,7 @@ void DetectHyperXControllers(std::vector<i2c_smbus_interface*> &busses, std::vec
void DetectLEDStripControllers(std::vector<RGBController*> &rgb_controllers);
void DetectOpenRazerControllers(std::vector<RGBController*> &rgb_controllers);
void DetectRazerChromaSDKControllers(std::vector<RGBController*>& rgb_controllers);
void DetectE131Controllers(std::vector<RGBController*> &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

View File

@@ -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

View File

@@ -47,10 +47,15 @@ void DetectE131Controllers(std::vector<RGBController*> &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<E131Device> devices;
devices.push_back(dev);
new_controller = new RGBController_E131();
new_controller = new RGBController_E131(devices);
rgb_controllers.push_back(new_controller);
#if 0

View File

@@ -8,18 +8,24 @@
\*-----------------------------------------*/
#include "RGBController_E131.h"
#include <e131.h>
#include <math.h>
RGBController_E131::RGBController_E131(std::vector<E131Device> devices)
RGBController_E131::RGBController_E131(std::vector<E131Device> 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<E131Device> 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<E131Device> 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]);
}
}

View File

@@ -9,7 +9,7 @@
#pragma once
#include "RGBController.h"
#include "E131Controller.h"
#include <e131.h>
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<E131Device> device_list);
int GetMode();
void SetMode(int mode);
void SetCustomMode();
@@ -46,4 +46,8 @@ public:
void UpdateLEDs();
private:
std::vector<E131Device> devices;
std::vector<e131_packet_t> packets;
std::vector<e131_addr_t> dest_addrs;
std::vector<unsigned int> universes;
};