Files
OpenRGB/Controllers/SinowealthController/RGBController_SinowealthKeyboard90.cpp
2022-12-21 17:41:19 +00:00

258 lines
8.8 KiB
C++

/*------------------------------------------*\
| RGBController_SinowealthKeyboard90.cpp |
| |
| Definitions and types for Sinowealth |
| Keyboard with PID:0090, |
| made spefically for Genesis Thor 300 |
| |
| Jan Baier 30/06/2022 |
\*-----------------------------------------=*/
#include "RGBController_SinowealthKeyboard90.h"
#include "LogManager.h"
using namespace thor300;
/**------------------------------------------------------------------*\
@name Genesis Thor 300
@category Keyboard
@type USB
@save :robot:
@direct :rotating_light:
@effects :white_check_mark:
@detectors DetectSinowealthGenesisKeyboard
@comment Direct mode is not supported by the keyboard
\*-------------------------------------------------------------------*/
RGBController_SinowealthKeyboard90::RGBController_SinowealthKeyboard90(SinowealthKeyboard90Controller* controller_ptr)
{
controller = controller_ptr;
name = "Genesis Thor 300";
vendor = "Sinowealth";
type = DEVICE_TYPE_KEYBOARD;
description = "Generic Sinowealth Keyboard";
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
AddMode("Breathing", MODE_BREATHING, true );
AddMode("CCW Rotation", MODE_CCW_ROTATION, false );
AddMode("CW Rotation", MODE_CW_ROTATION, false );
AddMode("Flowers Blossom", MODE_FLOWERS_BLOSSOM, false );
AddMode("Neon", MODE_NEON, true );
AddMode("Prismo", MODE_PRISMO, false );
AddMode("Rainbow Wave", MODE_RAINBOW, false );
AddMode("Raindrops", MODE_RAINDROPS, true );
AddMode("Reactive", MODE_RESPONSE, false );
AddMode("Single Key Reactive", MODE_RESPONSE_SINGLE, true );
AddMode("Snake", MODE_SNAKE, true );
AddMode("Stars Twinkling", MODE_TWINKLING, true );
AddMode("Static", MODE_STATIC, true );
AddMode("Tornado", MODE_TORNADO, true );
AddMode("Wave 1", MODE_WAVE_1, true );
AddMode("Wave 2", MODE_WAVE_2, false );
AddMode("Wave 3", MODE_WAVE_3, true );
AddMode("Wave 4", MODE_WAVE_4, true );
AddMode("Wave 5", MODE_WAVE_5, false );
mode Custom;
Custom.name = "Custom";
Custom.value = MODE_CUSTOM;
Custom.flags = MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_AUTOMATIC_SAVE;
Custom.brightness_min = BRIGHTNESS_OFF;
Custom.brightness_max = BRIGHTNESS_FULL;
Custom.brightness = BRIGHTNESS_FULL;
Custom.color_mode = MODE_COLORS_PER_LED;
modes.push_back(Custom);
mode Off;
Off.name = "Off";
Off.value = MODE_STATIC;
Off.flags = MODE_FLAG_AUTOMATIC_SAVE;
Off.color_mode = MODE_COLORS_NONE;
modes.push_back(Off);
active_mode = modes.size() - 1;
SetupZones();
}
RGBController_SinowealthKeyboard90::~RGBController_SinowealthKeyboard90()
{
/*---------------------------------------------------------*\
| Delete the matrix map |
\*---------------------------------------------------------*/
for(unsigned int zone_index = 0; zone_index < zones.size(); zone_index++)
{
if(zones[zone_index].matrix_map != NULL)
{
delete zones[zone_index].matrix_map;
}
}
delete controller;
}
void RGBController_SinowealthKeyboard90::SetupZones()
{
/*---------------------------------------------------------*\
| Set up zone |
\*---------------------------------------------------------*/
zone new_zone;
new_zone.name = "Keyboard";
new_zone.type = ZONE_TYPE_MATRIX;
new_zone.leds_count = 104;
new_zone.leds_min = new_zone.leds_count;
new_zone.leds_max = new_zone.leds_count;
new_zone.matrix_map = new matrix_map_type;
new_zone.matrix_map->height = 6;
new_zone.matrix_map->width = 23;
new_zone.matrix_map->map = (unsigned int *)&matrix_map;
zones.push_back(new_zone);
for(unsigned int led_idx = 0; led_idx < new_zone.leds_count; led_idx++)
{
led new_led;
new_led.name = led_names[led_idx].name;
new_led.value = led_names[led_idx].idx;
leds.push_back(new_led);
}
SetupColors();
}
void RGBController_SinowealthKeyboard90::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_SinowealthKeyboard90::DeviceUpdateLEDs()
{
controller->SendMode(modes[active_mode].value, modes[active_mode].brightness);
for(std::size_t led_idx = 0; led_idx < leds.size(); led_idx++)
{
unsigned char key = leds[led_idx].value;
unsigned char red = RGBGetRValue(colors[led_idx]);
unsigned char green = RGBGetGValue(colors[led_idx]);
unsigned char blue = RGBGetBValue(colors[led_idx]);
controller->SendSingleLED(key, red, green, blue);
}
controller->SendCommit();
}
void RGBController_SinowealthKeyboard90::UpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_SinowealthKeyboard90::UpdateSingleLED(int /*key*/)
{
DeviceUpdateLEDs();
}
void RGBController_SinowealthKeyboard90::SetCustomMode()
{
/*---------------------------------------------------------*\
| In our case, custom mode is on index MODE_CUSTOM |
\*---------------------------------------------------------*/
active_mode = MODE_CUSTOM;
}
void RGBController_SinowealthKeyboard90::DeviceUpdateMode()
{
if (modes[active_mode].value == MODE_CUSTOM)
{
return;
}
unsigned char mode_color = COLOR_RAINBOW;
if (modes[active_mode].color_mode == MODE_COLORS_MODE_SPECIFIC)
{
mode_color = MapRGBToColorEnum(modes[active_mode].colors.at(0));
}
controller->SendMode
(
modes[active_mode].value,
modes[active_mode].brightness,
modes[active_mode].speed,
mode_color
);
}
unsigned char RGBController_SinowealthKeyboard90::MapRGBToColorEnum(RGBColor color)
{
unsigned char red = RGBGetRValue(color);
unsigned char green = RGBGetGValue(color);
unsigned char blue = RGBGetBValue(color);
if (red & green & blue)
{
return COLOR_WHITE;
}
if (red & green)
{
return COLOR_YELLOW;
}
if (red & blue)
{
return COLOR_VIOLET;
}
if (green & blue)
{
return COLOR_CYAN;
}
if (red)
{
return COLOR_RED;
}
if (green)
{
return COLOR_GREEN;
}
if (blue)
{
return COLOR_BLUE;
}
return COLOR_RAINBOW;
}
void RGBController_SinowealthKeyboard90::AddMode
(
std::string name,
unsigned char value,
bool color_support
)
{
mode Mode;
Mode.name = name;
Mode.value = value;
if (color_support)
{
Mode.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS |
MODE_FLAG_HAS_MODE_SPECIFIC_COLOR | MODE_FLAG_HAS_RANDOM_COLOR |
MODE_FLAG_AUTOMATIC_SAVE;
Mode.colors_min = 1;
Mode.colors_max = 1;
Mode.color_mode = MODE_COLORS_RANDOM;
Mode.colors.resize(1);
}
else
{
Mode.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_AUTOMATIC_SAVE;
Mode.color_mode = MODE_COLORS_NONE;
}
Mode.brightness_min = BRIGHTNESS_OFF;
Mode.brightness_max = BRIGHTNESS_FULL;
Mode.brightness = BRIGHTNESS_FULL;
Mode.speed_min = SPEED_SLOWEST;
Mode.speed_max = SPEED_FASTEST;
Mode.speed = SPEED_NORMAL;
modes.push_back(Mode);
}