Skip to content

Commit 4855628

Browse files
solarkennedyCalcProgrammer1
authored andcommitted
Added Effects for Clevo Lightbar
1 parent e489085 commit 4855628

6 files changed

Lines changed: 150 additions & 17 deletions

File tree

Controllers/ClevoKeyboardController/ClevoKeyboardController.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ ClevoKeyboardController::ClevoKeyboardController(hid_device* dev_handle, const h
1717
{
1818
dev = dev_handle;
1919
location = info.path;
20+
version = info.release_number;
2021
}
2122

2223
ClevoKeyboardController::~ClevoKeyboardController()
@@ -45,6 +46,13 @@ std::string ClevoKeyboardController::GetSerialString()
4546
return(return_string);
4647
}
4748

49+
std::string ClevoKeyboardController::GetFirmwareVersion()
50+
{
51+
char version_string[16];
52+
snprintf(version_string, sizeof(version_string), "%d.%02d", version >> 8, version & 0xFF);
53+
return(version_string);
54+
}
55+
4856
void ClevoKeyboardController::WriteControl(unsigned char* data)
4957
{
5058
hid_send_feature_report(dev, data, CLEVO_KEYBOARD_REPORT_SIZE);

Controllers/ClevoKeyboardController/ClevoKeyboardController.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class ClevoKeyboardController
7272

7373
std::string GetDeviceLocation();
7474
std::string GetSerialString();
75+
std::string GetFirmwareVersion();
7576

7677
void TurnOff();
7778
void SetMode(unsigned char mode, unsigned char brightness, unsigned char speed, unsigned char behaviour);
@@ -81,6 +82,7 @@ class ClevoKeyboardController
8182
private:
8283
hid_device* dev;
8384
std::string location;
85+
unsigned short version;
8486

8587
void WriteControl(unsigned char* data);
8688
void WriteRowData(unsigned char* data);

Controllers/ClevoKeyboardController/RGBController_ClevoKeyboard.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ RGBController_ClevoKeyboard::RGBController_ClevoKeyboard(ClevoKeyboardController
201201
description = "CLEVO Laptop Keyboard";
202202
location = controller->GetDeviceLocation();
203203
serial = controller->GetSerialString();
204+
version = controller->GetFirmwareVersion();
204205

205206
mode Direct;
206207
Direct.name = "Direct";

Controllers/ClevoLightbarController/ClevoLightbarController.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ ClevoLightbarController::ClevoLightbarController(hid_device* dev_handle, const h
1717
{
1818
dev = dev_handle;
1919
location = info.path;
20+
version = info.release_number;
2021
}
2122

2223
ClevoLightbarController::~ClevoLightbarController()
@@ -45,6 +46,13 @@ std::string ClevoLightbarController::GetSerialString()
4546
return(return_string);
4647
}
4748

49+
std::string ClevoLightbarController::GetFirmwareVersion()
50+
{
51+
char version_string[16];
52+
snprintf(version_string, sizeof(version_string), "%d.%02d", version >> 8, version & 0xFF);
53+
return(version_string);
54+
}
55+
4856
void ClevoLightbarController::WriteControl(unsigned char* data)
4957
{
5058
hid_send_feature_report(dev, data, CLEVO_LIGHTBAR_REPORT_SIZE);
@@ -126,11 +134,26 @@ void ClevoLightbarController::SetBrightness(unsigned char brightness)
126134
void ClevoLightbarController::SetMode(unsigned char mode, unsigned char brightness, unsigned char speed)
127135
{
128136
/*---------------------------------------------------------*\
129-
| Currently only direct (mono) mode is implemented |
130-
| Breathing mode would be: 0x08 0x22 0x02 speed brightness |
137+
| Set mode for device 0x7001: |
138+
| 0x08 0x22 MODE SPEED BRIGHTNESS 0x01 0x00 0x00 |
139+
| |
140+
| SPEED: 0x01 (fastest) to 0x0a (slowest) - we invert |
141+
\*---------------------------------------------------------*/
142+
unsigned char buf[CLEVO_LIGHTBAR_REPORT_SIZE];
143+
144+
/*---------------------------------------------------------*\
145+
| Invert speed: UI uses 1=slow, 10=fast |
146+
| Protocol uses 1=fast, 10=slow |
131147
\*---------------------------------------------------------*/
132-
(void)mode;
133-
(void)speed;
148+
unsigned char inverted_speed = (CLEVO_LIGHTBAR_SPEED_MAX + CLEVO_LIGHTBAR_SPEED_MIN) - speed;
134149

135-
SetBrightness(brightness);
150+
memset(buf, 0x00, CLEVO_LIGHTBAR_REPORT_SIZE);
151+
buf[0] = 0x08;
152+
buf[1] = 0x22;
153+
buf[2] = mode;
154+
buf[3] = inverted_speed;
155+
buf[4] = brightness;
156+
buf[5] = 0x01;
157+
158+
WriteControl(buf);
136159
}

Controllers/ClevoLightbarController/ClevoLightbarController.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@
2424

2525
enum
2626
{
27-
CLEVO_LIGHTBAR_MODE_DIRECT = 0,
28-
CLEVO_LIGHTBAR_MODE_BREATHING = 1,
29-
CLEVO_LIGHTBAR_MODE_OFF = 2
27+
CLEVO_LIGHTBAR_MODE_DIRECT = 0x01,
28+
CLEVO_LIGHTBAR_MODE_BREATHING = 0x02,
29+
CLEVO_LIGHTBAR_MODE_WAVE = 0x03,
30+
CLEVO_LIGHTBAR_MODE_BOUNCE = 0x04,
31+
CLEVO_LIGHTBAR_MODE_MARQUEE = 0x05,
32+
CLEVO_LIGHTBAR_MODE_SCAN = 0x06,
33+
CLEVO_LIGHTBAR_MODE_OFF = 0x00
3034
};
3135

3236
class ClevoLightbarController
@@ -37,6 +41,7 @@ class ClevoLightbarController
3741

3842
std::string GetDeviceLocation();
3943
std::string GetSerialString();
44+
std::string GetFirmwareVersion();
4045

4146
void SetColor(unsigned char red, unsigned char green, unsigned char blue);
4247
void SetBrightness(unsigned char brightness);
@@ -45,8 +50,9 @@ class ClevoLightbarController
4550
void TurnOff();
4651

4752
private:
48-
hid_device* dev;
49-
std::string location;
53+
hid_device* dev;
54+
std::string location;
55+
unsigned short version;
5056

5157
void WriteControl(unsigned char* data);
5258
};

Controllers/ClevoLightbarController/RGBController_ClevoLightbar.cpp

Lines changed: 100 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
@type USB
1818
@save :x:
1919
@direct :white_check_mark:
20-
@effects :x:
20+
@effects :white_check_mark:
2121
@detectors DetectClevoLightbarControllers
22-
@comment
22+
@comment Experimental effects based on ITE 8291 protocol
2323
\*-------------------------------------------------------------------*/
2424

2525
RGBController_ClevoLightbar::RGBController_ClevoLightbar(ClevoLightbarController* controller_ptr)
@@ -32,17 +32,83 @@ RGBController_ClevoLightbar::RGBController_ClevoLightbar(ClevoLightbarController
3232
description = "CLEVO Laptop Lightbar";
3333
location = controller->GetDeviceLocation();
3434
serial = controller->GetSerialString();
35+
version = controller->GetFirmwareVersion();
3536

3637
mode Direct;
37-
Direct.name = "Direct";
38-
Direct.value = CLEVO_LIGHTBAR_MODE_DIRECT;
39-
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
40-
Direct.color_mode = MODE_COLORS_PER_LED;
38+
Direct.name = "Direct";
39+
Direct.value = CLEVO_LIGHTBAR_MODE_DIRECT;
40+
Direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
41+
Direct.color_mode = MODE_COLORS_PER_LED;
4142
Direct.brightness_min = CLEVO_LIGHTBAR_BRIGHTNESS_MIN;
4243
Direct.brightness_max = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
4344
Direct.brightness = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
4445
modes.push_back(Direct);
4546

47+
mode Breathing;
48+
Breathing.name = "Breathing";
49+
Breathing.value = CLEVO_LIGHTBAR_MODE_BREATHING;
50+
Breathing.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
51+
Breathing.color_mode = MODE_COLORS_PER_LED;
52+
Breathing.brightness_min = CLEVO_LIGHTBAR_BRIGHTNESS_MIN;
53+
Breathing.brightness_max = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
54+
Breathing.brightness = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
55+
Breathing.speed_min = CLEVO_LIGHTBAR_SPEED_MIN;
56+
Breathing.speed_max = CLEVO_LIGHTBAR_SPEED_MAX;
57+
Breathing.speed = CLEVO_LIGHTBAR_SPEED_DEFAULT;
58+
modes.push_back(Breathing);
59+
60+
mode Wave;
61+
Wave.name = "Wave";
62+
Wave.value = CLEVO_LIGHTBAR_MODE_WAVE;
63+
Wave.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
64+
Wave.color_mode = MODE_COLORS_NONE;
65+
Wave.brightness_min = CLEVO_LIGHTBAR_BRIGHTNESS_MIN;
66+
Wave.brightness_max = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
67+
Wave.brightness = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
68+
Wave.speed_min = CLEVO_LIGHTBAR_SPEED_MIN;
69+
Wave.speed_max = CLEVO_LIGHTBAR_SPEED_MAX;
70+
Wave.speed = CLEVO_LIGHTBAR_SPEED_DEFAULT;
71+
modes.push_back(Wave);
72+
73+
mode Bounce;
74+
Bounce.name = "Bounce";
75+
Bounce.value = CLEVO_LIGHTBAR_MODE_BOUNCE;
76+
Bounce.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
77+
Bounce.color_mode = MODE_COLORS_PER_LED;
78+
Bounce.brightness_min = CLEVO_LIGHTBAR_BRIGHTNESS_MIN;
79+
Bounce.brightness_max = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
80+
Bounce.brightness = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
81+
Bounce.speed_min = CLEVO_LIGHTBAR_SPEED_MIN;
82+
Bounce.speed_max = CLEVO_LIGHTBAR_SPEED_MAX;
83+
Bounce.speed = CLEVO_LIGHTBAR_SPEED_DEFAULT;
84+
modes.push_back(Bounce);
85+
86+
mode Marquee;
87+
Marquee.name = "Marquee";
88+
Marquee.value = CLEVO_LIGHTBAR_MODE_MARQUEE;
89+
Marquee.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
90+
Marquee.color_mode = MODE_COLORS_NONE;
91+
Marquee.brightness_min = CLEVO_LIGHTBAR_BRIGHTNESS_MIN;
92+
Marquee.brightness_max = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
93+
Marquee.brightness = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
94+
Marquee.speed_min = CLEVO_LIGHTBAR_SPEED_MIN;
95+
Marquee.speed_max = CLEVO_LIGHTBAR_SPEED_MAX;
96+
Marquee.speed = CLEVO_LIGHTBAR_SPEED_DEFAULT;
97+
modes.push_back(Marquee);
98+
99+
mode Scan;
100+
Scan.name = "Scan";
101+
Scan.value = CLEVO_LIGHTBAR_MODE_SCAN;
102+
Scan.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_SPEED;
103+
Scan.color_mode = MODE_COLORS_PER_LED;
104+
Scan.brightness_min = CLEVO_LIGHTBAR_BRIGHTNESS_MIN;
105+
Scan.brightness_max = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
106+
Scan.brightness = CLEVO_LIGHTBAR_BRIGHTNESS_MAX;
107+
Scan.speed_min = CLEVO_LIGHTBAR_SPEED_MIN;
108+
Scan.speed_max = CLEVO_LIGHTBAR_SPEED_MAX;
109+
Scan.speed = CLEVO_LIGHTBAR_SPEED_DEFAULT;
110+
modes.push_back(Scan);
111+
46112
mode Off;
47113
Off.name = "Off";
48114
Off.value = CLEVO_LIGHTBAR_MODE_OFF;
@@ -90,7 +156,15 @@ void RGBController_ClevoLightbar::DeviceUpdateLEDs()
90156
unsigned char blue = RGBGetBValue(colors[0]);
91157

92158
controller->SetColor(red, green, blue);
93-
controller->SetBrightness(modes[active_mode].brightness);
159+
160+
/*---------------------------------------------------------*\
161+
| Re-apply current mode to maintain effect state |
162+
\*---------------------------------------------------------*/
163+
unsigned char brightness = modes[active_mode].brightness;
164+
unsigned char speed = modes[active_mode].speed;
165+
unsigned char mode_value = modes[active_mode].value;
166+
167+
controller->SetMode(mode_value, brightness, speed);
94168
}
95169

96170
void RGBController_ClevoLightbar::UpdateZoneLEDs(int /*zone*/)
@@ -109,4 +183,23 @@ void RGBController_ClevoLightbar::DeviceUpdateMode()
109183
{
110184
controller->TurnOff();
111185
}
186+
else
187+
{
188+
unsigned char brightness = modes[active_mode].brightness;
189+
unsigned char speed = modes[active_mode].speed;
190+
unsigned char mode_value = modes[active_mode].value;
191+
192+
/*---------------------------------------------------------*\
193+
| Set color first for modes that use it |
194+
\*---------------------------------------------------------*/
195+
if(modes[active_mode].color_mode == MODE_COLORS_PER_LED)
196+
{
197+
unsigned char red = RGBGetRValue(colors[0]);
198+
unsigned char green = RGBGetGValue(colors[0]);
199+
unsigned char blue = RGBGetBValue(colors[0]);
200+
controller->SetColor(red, green, blue);
201+
}
202+
203+
controller->SetMode(mode_value, brightness, speed);
204+
}
112205
}

0 commit comments

Comments
 (0)