Files
OpenRGB/Controllers/InstantMouseController/RGBController_InstantMouse.cpp
2024-08-30 19:26:19 +00:00

224 lines
9.5 KiB
C++

/*---------------------------------------------------------*\
| RGBController_InstantMouse.cpp |
| |
| RGBController for Instant mouse |
| |
| Morgan Guimard (morg) 19 Jan 2024 |
| |
| This file is part of the OpenRGB project |
| SPDX-License-Identifier: GPL-2.0-only |
\*---------------------------------------------------------*/
#include "RGBController_InstantMouse.h"
#include "InstantMouseDevices.h"
/**------------------------------------------------------------------*\
@name Instant mouse
@category Mouse
@type USB
@save :x:
@direct :white_check_mark:
@effects :white_check_mark:
@detectors DetectInstantMouseControllers
@comment This controller should work with all mouse with this chip.
Identified devices that work with this controller: Advance Gaming
GTA 250 (GX72-A725), Anko KM43243952 (GM8-A825), Anko KM43277483,
Ant Esports GM600
\*-------------------------------------------------------------------*/
RGBController_InstantMouse::RGBController_InstantMouse(InstantMouseController* controller_ptr)
{
controller = controller_ptr;
vendor = "Instant Microelectronics";
type = DEVICE_TYPE_MOUSE;
description = "Instant USB Gaming Mouse";
location = controller->GetDeviceLocation();
serial = controller->GetSerialString();
version = controller->GetFirmwareVersion();
mode direct;
direct.name = "Direct";
direct.value = INSTANT_MOUSE_DIRECT_MODE;
direct.flags = MODE_FLAG_HAS_PER_LED_COLOR | MODE_FLAG_HAS_BRIGHTNESS;
direct.color_mode = MODE_COLORS_PER_LED;
direct.brightness = INSTANT_MOUSE_BRIGHTNESS_MAX;
direct.brightness_min = INSTANT_MOUSE_BRIGHTNESS_MIN;
direct.brightness_max = INSTANT_MOUSE_BRIGHTNESS_MAX;
modes.push_back(direct);
mode rainbow;
rainbow.name = "Rainbow wave";
rainbow.value = INSTANT_MOUSE_RAINBOW_WAVE_MODE;
rainbow.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
rainbow.color_mode = MODE_COLORS_NONE;
rainbow.speed_min = INSTANT_MOUSE_SPEED_MIN;
rainbow.speed_max = INSTANT_MOUSE_SPEED_MAX;
rainbow.speed = INSTANT_MOUSE_SPEED_MAX/2;
modes.push_back(rainbow);
mode spectrum;
spectrum.name = "Spectrum cycle";
spectrum.value = INSTANT_MOUSE_SPECTRUM_CYCLE_MODE;
spectrum.flags = MODE_FLAG_HAS_SPEED;
spectrum.color_mode = MODE_COLORS_NONE;
spectrum.speed_min = INSTANT_MOUSE_SPEED_MIN;
spectrum.speed_max = INSTANT_MOUSE_SPEED_MAX;
spectrum.speed = INSTANT_MOUSE_SPEED_MAX/2;
modes.push_back(spectrum);
mode breathing;
breathing.name = "Breathing";
/*------------------------------------------------------------------*\
| ANT ESPORTS GM600 has different mode id for breathing mode. |
\*------------------------------------------------------------------*/
breathing.value = (controller->GetPID() == ANTESPORTS_GM600_PID ) ? ANT_MOUSE_BREATHING_MODE : INSTANT_MOUSE_BREATHING_MODE;
breathing.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_MODE_SPECIFIC_COLOR;
breathing.color_mode = MODE_COLORS_MODE_SPECIFIC;
breathing.colors.resize(1);
breathing.colors_min = 1;
breathing.colors_max = 1;
breathing.speed_min = INSTANT_MOUSE_SPEED_MIN;
breathing.speed_max = INSTANT_MOUSE_SPEED_MAX;
breathing.speed = INSTANT_MOUSE_SPEED_MAX/2;
modes.push_back(breathing);
mode fill;
fill.name = "Fill";
fill.value = INSTANT_MOUSE_FILL_DRAIN_MODE;
fill.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_DIRECTION_LR;
fill.color_mode = MODE_COLORS_NONE;
fill.speed_min = INSTANT_MOUSE_SPEED_MIN;
fill.speed_max = INSTANT_MOUSE_SPEED_MAX;
fill.speed = INSTANT_MOUSE_SPEED_MAX/2;
fill.brightness = INSTANT_MOUSE_BRIGHTNESS_MAX;
fill.brightness_min = INSTANT_MOUSE_BRIGHTNESS_MIN;
fill.brightness_max = INSTANT_MOUSE_BRIGHTNESS_MAX;
modes.push_back(fill);
mode loop;
loop.name = "Loop";
loop.value = INSTANT_MOUSE_LOOP_MODE;
loop.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_BRIGHTNESS | MODE_FLAG_HAS_DIRECTION_LR;
loop.color_mode = MODE_COLORS_NONE;
loop.speed_min = INSTANT_MOUSE_SPEED_MIN;
loop.speed_max = INSTANT_MOUSE_SPEED_MAX;
loop.speed = INSTANT_MOUSE_SPEED_MAX/2;
loop.brightness = INSTANT_MOUSE_BRIGHTNESS_MAX;
loop.brightness_min = INSTANT_MOUSE_BRIGHTNESS_MIN;
loop.brightness_max = INSTANT_MOUSE_BRIGHTNESS_MAX;
modes.push_back(loop);
/*------------------------------------------------------------------*\
| Extra modes for Ant Esports GM600. |
\*------------------------------------------------------------------*/
if(controller->GetPID() == ANTESPORTS_GM600_PID )
{
mode enraptured;
enraptured.name = "Enrpatured";
enraptured.value = INSTANT_MOUSE_ENRAPTURED_MODE;
enraptured.flags = MODE_FLAG_HAS_SPEED;
enraptured.color_mode = MODE_COLORS_NONE;
enraptured.speed_min = INSTANT_MOUSE_SPEED_MIN;
enraptured.speed_max = INSTANT_MOUSE_SPEED_MAX;
enraptured.speed = INSTANT_MOUSE_SPEED_MAX/2;
modes.push_back(enraptured);
mode flicker;
flicker.name = "Flicker";
flicker.value = INSTANT_MOUSE_FLICKER_MODE;
flicker.flags = MODE_FLAG_HAS_SPEED;
flicker.color_mode = MODE_COLORS_NONE;
flicker.speed_min = INSTANT_MOUSE_SPEED_MIN;
flicker.speed_max = INSTANT_MOUSE_SPEED_MAX;
flicker.speed = INSTANT_MOUSE_SPEED_MAX/2;
modes.push_back(flicker);
mode ripple;
ripple.name = "Ripple";
ripple.value = INSTANT_MOUSE_RIPPLE_MODE;
ripple.flags = MODE_FLAG_HAS_SPEED | MODE_FLAG_HAS_DIRECTION_LR;
ripple.color_mode = MODE_COLORS_NONE;
ripple.speed_min = INSTANT_MOUSE_SPEED_MIN;
ripple.speed_max = INSTANT_MOUSE_SPEED_MAX;
ripple.speed = INSTANT_MOUSE_SPEED_MAX/2;
modes.push_back(ripple);
mode startreck;
startreck.name = "Star treck";
startreck.value = INSTANT_MOUSE_STARTRECK_MODE;
modes.push_back(startreck);
}
mode off;
off.name = "Off";
off.value = INSTANT_MOUSE_OFF_MODE;
modes.push_back(off);
SetupZones();
}
RGBController_InstantMouse::~RGBController_InstantMouse()
{
delete controller;
}
void RGBController_InstantMouse::SetupZones()
{
zone new_zone;
new_zone.name = "Mouse";
new_zone.type = ZONE_TYPE_LINEAR;
new_zone.leds_min = 1;
new_zone.leds_max = 1;
new_zone.leds_count = 1;
new_zone.matrix_map = nullptr;
zones.emplace_back(new_zone);
leds.resize(1);
leds[0].name = "Mouse";
SetupColors();
}
void RGBController_InstantMouse::ResizeZone(int /*zone*/, int /*new_size*/)
{
/*---------------------------------------------------------*\
| This device does not support resizing zones |
\*---------------------------------------------------------*/
}
void RGBController_InstantMouse::DeviceUpdateLEDs()
{
controller->SendColor(colors[0]);
}
void RGBController_InstantMouse::UpdateZoneLEDs(int /*zone*/)
{
DeviceUpdateLEDs();
}
void RGBController_InstantMouse::UpdateSingleLED(int /*led*/)
{
DeviceUpdateLEDs();
}
void RGBController_InstantMouse::DeviceUpdateMode()
{
if(modes[active_mode].value == INSTANT_MOUSE_OFF_MODE)
{
controller->SetMode(INSTANT_MOUSE_DIRECT_MODE, 0, 0, 0);
controller->SendColor(0);
}
else
{
controller->SetMode(modes[active_mode].value, modes[active_mode].speed, modes[active_mode].brightness, modes[active_mode].direction);
if(modes[active_mode].colors.size() == 1)
{
controller->SendColor(modes[active_mode].colors[0]);
}
}
}