Skip to content

Commit 5cfd064

Browse files
richardjharrisCalcProgrammer1
authored andcommitted
Robobloq Monitor Light Strip support
1 parent de3482c commit 5cfd064

7 files changed

Lines changed: 1019 additions & 0 deletions
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
/*---------------------------------------------------------*\
2+
| RGBController_RobobloqLightStrip.cpp |
3+
| |
4+
| Detector for Robobloq Monitor Light Strip |
5+
| |
6+
| This file is part of the OpenRGB project |
7+
| SPDX-License-Identifier: GPL-2.0-or-later |
8+
\*---------------------------------------------------------*/
9+
10+
#include "RGBController_RobobloqLightStrip.h"
11+
#include "RobobloqLightStripController.h"
12+
#include <LogManager.h>
13+
14+
/**--------------------------------------------------------------------*\
15+
@name Robobloq Monitor Light Strip
16+
@category LEDStrip
17+
@type USB
18+
@save :robot:
19+
@direct :white_check_mark:
20+
@effects :white_check_mark:
21+
@detectors DetectRobobloqLightStripController
22+
@comment
23+
\*---------------------------------------------------------------------*/
24+
25+
RGBController_RobobloqLightStrip::RGBController_RobobloqLightStrip(RobobloqLightStripController* controller_ptr)
26+
{
27+
controller = controller_ptr;
28+
29+
name = controller->GetDeviceName();
30+
vendor = "Robobloq";
31+
description = "Robobloq Monitor Light Strip (" + std::to_string(controller->GetPhysicalSizeInInches()) + "\")";
32+
type = DEVICE_TYPE_LEDSTRIP;
33+
location = controller->GetDeviceLocation();
34+
serial = controller->GetSerialString();
35+
version = controller->GetFirmwareVersion();
36+
37+
mode Static;
38+
Static.name = "Static";
39+
Static.value = ROBOBLOQ_MODE_STATIC;
40+
Static.flags = MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
41+
Static.color_mode = MODE_COLORS_MODE_SPECIFIC;
42+
Static.brightness_min = 1;
43+
Static.brightness_max = 255;
44+
Static.brightness = 255;
45+
Static.colors_min = 1;
46+
Static.colors_max = 1;
47+
Static.colors.resize(1);
48+
modes.push_back(Static);
49+
50+
mode Direct;
51+
Direct.name = "Direct";
52+
Direct.value = ROBOBLOQ_MODE_DIRECT;
53+
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
54+
Direct.color_mode = MODE_COLORS_PER_LED;
55+
Direct.brightness_min = 1;
56+
Direct.brightness_max = 255;
57+
Direct.brightness = 255;
58+
modes.push_back(Direct);
59+
60+
/*-----------------------------------------------------*\
61+
| Add dynamic modes |
62+
\*-----------------------------------------------------*/
63+
struct DynamicMode
64+
{
65+
const char* name;
66+
int value;
67+
};
68+
69+
DynamicMode dynamic_modes[] =
70+
{
71+
{ "Rainbow Wave", ROBOBLOQ_MODE_DYNAMIC_RAINBOW },
72+
{ "Breathing", ROBOBLOQ_MODE_DYNAMIC_BREATHING },
73+
{ "Twist", ROBOBLOQ_MODE_DYNAMIC_TWIST },
74+
{ "Beat", ROBOBLOQ_MODE_DYNAMIC_BEAT },
75+
{ "Twirl", ROBOBLOQ_MODE_DYNAMIC_TWIRL },
76+
{ "Lemon", ROBOBLOQ_MODE_DYNAMIC_LEMON },
77+
{ "Electric", ROBOBLOQ_MODE_DYNAMIC_ELECTRIC },
78+
};
79+
80+
for(unsigned int i = 0; i < (sizeof(dynamic_modes) / sizeof(DynamicMode)); i++)
81+
{
82+
mode new_mode;
83+
new_mode.name = dynamic_modes[i].name;
84+
new_mode.value = dynamic_modes[i].value;
85+
new_mode.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS;
86+
new_mode.color_mode = MODE_COLORS_NONE;
87+
new_mode.speed_min = 0;
88+
new_mode.speed_max = 100;
89+
new_mode.speed = 50;
90+
new_mode.brightness_min = 1;
91+
new_mode.brightness_max = 255;
92+
new_mode.brightness = 255;
93+
modes.push_back(new_mode);
94+
}
95+
96+
mode Off;
97+
Off.name = "Off";
98+
Off.value = ROBOBLOQ_MODE_OFF;
99+
Off.flags = 0;
100+
Off.color_mode = MODE_COLORS_NONE;
101+
modes.push_back(Off);
102+
103+
SetupZones();
104+
};
105+
106+
RGBController_RobobloqLightStrip::~RGBController_RobobloqLightStrip()
107+
{
108+
delete controller;
109+
}
110+
111+
void RGBController_RobobloqLightStrip::SetupZones()
112+
{
113+
int led_count = controller->GetLEDCount();
114+
int leds_per_side = controller->GetLEDsPerSide();
115+
116+
struct Side
117+
{
118+
const char* name;
119+
int count;
120+
};
121+
122+
std::vector<Side> sides = { { "Light Strip", led_count } };
123+
if(leds_per_side > 0)
124+
{
125+
sides = {
126+
{ "Right", leds_per_side },
127+
{ "Top", led_count - (leds_per_side * 2) },
128+
{ "Left", leds_per_side },
129+
};
130+
}
131+
132+
zones.clear();
133+
zones.resize(sides.size());
134+
leds.clear();
135+
leds.resize(led_count);
136+
137+
for(unsigned int i = 0; i < sides.size(); i++)
138+
{
139+
zone& zone = zones[i];
140+
zone.name = sides[i].name;
141+
zone.type = ZONE_TYPE_LINEAR;
142+
zone.leds_count = sides[i].count;
143+
zone.leds_min = zone.leds_count;
144+
zone.leds_max = zone.leds_count;
145+
zone.matrix_map = NULL;
146+
}
147+
148+
for(int i = 0; i < led_count; i++)
149+
{
150+
led& new_led = leds[i];
151+
new_led.name = "LED " + std::to_string(i + 1);
152+
new_led.value = i;
153+
}
154+
155+
SetupColors();
156+
}
157+
158+
void RGBController_RobobloqLightStrip::ResizeZone(int /*zone*/, int /*new_size*/)
159+
{
160+
/*-----------------------------------------------------*\
161+
| This device does not support resizing zones |
162+
\*-----------------------------------------------------*/
163+
}
164+
165+
void RGBController_RobobloqLightStrip::DeviceUpdateLEDs()
166+
{
167+
if(modes[active_mode].value == ROBOBLOQ_MODE_DIRECT)
168+
{
169+
controller->SetCustom(colors);
170+
}
171+
}
172+
173+
void RGBController_RobobloqLightStrip::UpdateZoneLEDs(int /*zone*/)
174+
{
175+
DeviceUpdateLEDs();
176+
}
177+
178+
void RGBController_RobobloqLightStrip::UpdateSingleLED(int led)
179+
{
180+
controller->SetLEDColor(led, modes[active_mode].colors[0]);
181+
}
182+
183+
void RGBController_RobobloqLightStrip::DeviceUpdateMode()
184+
{
185+
bool mode_changed = false;
186+
187+
/*-----------------------------------------------------*\
188+
| Cache mode to avoid repeated SetDynamicEffect calls |
189+
| when adjusting speed/brightness |
190+
\*-----------------------------------------------------*/
191+
if(modes[active_mode].value != cur_mode)
192+
{
193+
cur_mode = modes[active_mode].value;
194+
mode_changed = true;
195+
}
196+
197+
if(cur_mode == ROBOBLOQ_MODE_OFF)
198+
{
199+
controller->TurnOff();
200+
}
201+
else if(cur_mode == ROBOBLOQ_MODE_DIRECT)
202+
{
203+
controller->SetBrightness(modes[active_mode].brightness);
204+
}
205+
else if(cur_mode == ROBOBLOQ_MODE_STATIC)
206+
{
207+
controller->SetColor(modes[active_mode].colors[0]);
208+
controller->SetBrightness(modes[active_mode].brightness);
209+
}
210+
else if(ROBOBLOQ_IS_DYNAMIC_EFFECT(cur_mode))
211+
{
212+
if(mode_changed)
213+
{
214+
controller->SetDynamicEffect(cur_mode);
215+
}
216+
217+
controller->SetBrightness(modes[active_mode].brightness);
218+
controller->SetDynamicSpeed(modes[active_mode].speed);
219+
}
220+
else
221+
{
222+
LOG_ERROR("[Robobloq] Requested mode (%02x) is not supported", cur_mode);
223+
}
224+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*---------------------------------------------------------*\
2+
| RGBController_RobobloqLightStrip.h |
3+
| |
4+
| Detector for Robobloq Monitor Light Strip |
5+
| |
6+
| This file is part of the OpenRGB project |
7+
| SPDX-License-Identifier: GPL-2.0-or-later |
8+
\*---------------------------------------------------------*/
9+
10+
#pragma once
11+
12+
#include "RGBController.h"
13+
#include "RobobloqLightStripController.h"
14+
15+
class RGBController_RobobloqLightStrip : public RGBController
16+
{
17+
public:
18+
RGBController_RobobloqLightStrip(RobobloqLightStripController* controller_ptr);
19+
~RGBController_RobobloqLightStrip();
20+
21+
void SetupZones();
22+
23+
void ResizeZone(int zone, int new_size);
24+
25+
void DeviceUpdateLEDs();
26+
void UpdateZoneLEDs(int zone);
27+
void UpdateSingleLED(int led);
28+
29+
void DeviceUpdateMode();
30+
31+
private:
32+
/*-----------------------------------------------------*\
33+
| Last mode set via this controller |
34+
\*-----------------------------------------------------*/
35+
int cur_mode = -1;
36+
RobobloqLightStripController* controller;
37+
};

0 commit comments

Comments
 (0)