OpenRGB/Controllers/HYTENexusController/RGBController_HYTENexus.cpp
2024-11-26 21:12:33 +00:00

173 lines
5.5 KiB
C++

/*---------------------------------------------------------*\
| RGBController_HYTENexus.cpp |
| |
| RGBController for HYTE Nexus |
| |
| Adam Honse (calcprogrammer1@gmail.com) 12 Nov 2024 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-only |
\*---------------------------------------------------------*/
#include "RGBController_HYTENexus.h"
using namespace std::chrono_literals;
RGBController_HYTENexus::RGBController_HYTENexus(HYTENexusController* controller_ptr)
{
controller = controller_ptr;
name = "HYTE Nexus Device";
vendor = "HYTE";
description = "HYTE Nexus Device";
type = DEVICE_TYPE_LEDSTRIP;
location = controller->GetLocation();
version = controller->GetFirmwareVersion();
mode Direct;
Direct.name = "Direct";
Direct.value = 0;
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR;
Direct.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Direct);
SetupZones();
}
RGBController_HYTENexus::~RGBController_HYTENexus()
{
}
void RGBController_HYTENexus::SetupZones()
{
for(unsigned int channel = 0; channel < controller->num_channels; channel++)
{
unsigned int channel_leds = 0;
unsigned int logo_leds = 0;
for(unsigned int device = 0; device < controller->channels[channel].num_devices; device++)
{
channel_leds += controller->channels[channel].devices[device].led_count;
}
if(controller->channels[channel].has_4_led_logo == true || controller->channels[channel].has_6_led_logo == true)
{
if(controller->channels[channel].has_4_led_logo == true)
{
logo_leds = 4;
}
else if(controller->channels[channel].has_6_led_logo == true)
{
logo_leds = 6;
}
channel_leds += logo_leds;
}
if(controller->channels[channel].has_lcd_leds == true)
{
channel_leds += 42;
}
zone channel_zone;
channel_zone.name = "Channel " + std::to_string(channel);
channel_zone.type = ZONE_TYPE_LINEAR;
channel_zone.leds_min = channel_leds;
channel_zone.leds_max = channel_leds;
channel_zone.leds_count = channel_leds;
channel_zone.matrix_map = NULL;
zones.push_back(channel_zone);
for(unsigned int led_idx = 0; led_idx < channel_leds; led_idx++)
{
led channel_led;
channel_led.name = "Channel " + std::to_string(channel) + " LED " + std::to_string(led_idx);
channel_led.value = channel;
leds.push_back(channel_led);
}
unsigned int start_idx = 0;
if(controller->channels[channel].has_4_led_logo == true || controller->channels[channel].has_6_led_logo == true)
{
segment logo_segment;
logo_segment.name = "Logo";
logo_segment.leds_count = logo_leds;
logo_segment.start_idx = start_idx;
logo_segment.type = ZONE_TYPE_SINGLE;
zones[channel].segments.push_back(logo_segment);
start_idx += logo_segment.leds_count;
}
if(controller->channels[channel].has_lcd_leds == true)
{
segment lcd_leds_segment;
lcd_leds_segment.name = "LCD LED Matrix";
lcd_leds_segment.leds_count = 42;
lcd_leds_segment.start_idx = start_idx;
lcd_leds_segment.type = ZONE_TYPE_SINGLE;
zones[channel].segments.push_back(lcd_leds_segment);
start_idx += lcd_leds_segment.leds_count;
}
for(unsigned int device = 0; device < controller->channels[channel].num_devices; device++)
{
if(controller->channels[channel].devices[device].led_count > 0)
{
segment device_segment;
device_segment.name = controller->GetDeviceName(controller->channels[channel].devices[device].device_type);
device_segment.leds_count = controller->channels[channel].devices[device].led_count;
device_segment.start_idx = start_idx;
device_segment.type = ZONE_TYPE_LINEAR;
zones[channel].segments.push_back(device_segment);
start_idx += device_segment.leds_count;
}
}
}
SetupColors();
}
void RGBController_HYTENexus::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_HYTENexus::DeviceUpdateLEDs()
{
for(unsigned int zone_idx = 0; zone_idx < zones.size(); zone_idx++)
{
UpdateZoneLEDs(zone_idx);
}
}
void RGBController_HYTENexus::UpdateZoneLEDs(int zone)
{
controller->LEDStreaming(zone, zones[zone].leds_count, zones[zone].colors);
}
void RGBController_HYTENexus::UpdateSingleLED(int led)
{
UpdateZoneLEDs(leds[led].value);
}
void RGBController_HYTENexus::DeviceUpdateMode()
{
DeviceUpdateLEDs();
}