Early work on enabling support for the Rival 300.

This commit is contained in:
B Horn 2020-05-17 13:14:31 +01:00 committed by Adam Honse
parent 1a9e1c2430
commit cf4b421abd
5 changed files with 96 additions and 29 deletions

View file

@ -1,4 +1,5 @@
#include "SteelSeriesRivalController.h"
#include "SteelSeriesGeneric.h"
#include "RGBController.h"
#include "RGBController_SteelSeriesRival.h"
#include <vector>
@ -12,6 +13,8 @@
#define STEELSERIES_RIVAL_100_DOTA_PID 0x170c
#define STEELSERIES_RIVAL_105_PID 0x1814
#define STEELSERIES_RIVAL_110_PID 0x1729
#define STEELSERIES_RIVAL_300_PID 0x1384
typedef struct
{
@ -19,6 +22,7 @@ typedef struct
unsigned short usb_pid;
unsigned char usb_interface;
device_type type;
steelseries_type proto_type;
const char * name;
} steelseries_device;
@ -26,13 +30,14 @@ typedef struct
static const steelseries_device device_list[] =
{
/*-------------------------------------------------------------------------------------------------------------------------*\
| Mice |
\*-------------------------------------------------------------------------------------------------------------------------*/
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 100" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 100 DotA 2 Edition" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_105_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 105" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_110_PID, 0, DEVICE_TYPE_MOUSE, "SteelSeries Rival 110" },
/*-------------------------------------------------------------------------------------------------------------------------------------*\
| Mice |
\*-------------------------------------------------------------------------------------------------------------------------------------*/
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 100" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_100_DOTA_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 100 DotA 2 Edition" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_105_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 105" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_110_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_100, "SteelSeries Rival 110" },
{ STEELSERIES_RIVAL_VID, STEELSERIES_RIVAL_300_PID, 0, DEVICE_TYPE_MOUSE, RIVAL_300, "SteelSeries Rival 300" },
};
/******************************************************************************************\
@ -79,15 +84,21 @@ void DetectSteelSeriesControllers(std::vector<RGBController*>& rgb_controllers)
case DEVICE_TYPE_KEYBOARD:
/* Not yet supported */
break;
case DEVICE_TYPE_HEADSET:
/* Not yet supported */
break;
case DEVICE_TYPE_MOUSE:
SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev);
{
SteelSeriesRivalController* controller = new SteelSeriesRivalController(dev, device_list[device_idx].proto_type);
RGBController_SteelSeriesRival* rgb_controller = new RGBController_SteelSeriesRival(controller);
rgb_controller->name = device_list[device_idx].name;
rgb_controllers.push_back(rgb_controller);
}
break;
case DEVICE_TYPE_MOUSEMAT:
/* Not yet supported */
break;

View file

@ -0,0 +1,23 @@
/*-----------------------------------------*\
| SteelSeriesGeneric.h |
| |
| Definitions and types for the SteelSeries|
| Devices. |
| |
| B Horn (bahorn) 17/5/2020 |
\*-----------------------------------------*/
#include <string>
#include <hidapi/hidapi.h>
#pragma once
/* Allows us to handle variation in the protocol.
* Defined in a single enum so we can keep the device_list struct the same
* for every possible device. */
typedef enum
{
RIVAL_100 = 0x00,
RIVAL_300 = 0x01
} steelseries_type;

View file

@ -27,9 +27,14 @@ static void send_usb_msg(hid_device* dev, char * data_pkt, unsigned int size)
delete usb_pkt;
}
SteelSeriesRivalController::SteelSeriesRivalController(hid_device* dev_handle)
SteelSeriesRivalController::SteelSeriesRivalController
(
hid_device* dev_handle,
steelseries_type proto_type
)
{
dev = dev_handle;
proto = proto_type;
}
SteelSeriesRivalController::~SteelSeriesRivalController()
@ -42,6 +47,11 @@ char* SteelSeriesRivalController::GetDeviceName()
return device_name;
}
steelseries_type SteelSeriesRivalController::GetMouseType()
{
return proto;
}
/* Saves to the internal configuration */
void SteelSeriesRivalController::Save()
{
@ -54,30 +64,38 @@ void SteelSeriesRivalController::Save()
void SteelSeriesRivalController::SetLightEffect
(
unsigned char effect
unsigned char zone_id,
unsigned char effect
)
{
char usb_buf[9];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = 0x07;
usb_buf[0x01] = 0x00;
usb_buf[0x01] = zone_id; /* Device ID, needs to be zero for the 100
series */
usb_buf[0x02] = effect;
send_usb_msg(dev, usb_buf, 9);
}
void SteelSeriesRivalController::SetColor
(
unsigned char red,
unsigned char green,
unsigned char blue
unsigned char zone_id,
unsigned char red,
unsigned char green,
unsigned char blue
)
{
char usb_buf[9];
memset(usb_buf, 0x00, sizeof(usb_buf));
usb_buf[0x00] = 0x05;
usb_buf[0x01] = 0x00;
switch (proto) {
case RIVAL_100:
usb_buf[0x00] = 0x05;
usb_buf[0x01] = 0x00;
case RIVAL_300:
usb_buf[0x00] = 0x08;
usb_buf[0x01] = zone_id;
}
usb_buf[0x02] = red;
usb_buf[0x03] = green;
usb_buf[0x04] = blue;

View file

@ -10,8 +10,9 @@
#include <string>
#include <hidapi/hidapi.h>
#pragma once
#include "SteelSeriesGeneric.h"
#pragma once
/* Mode, we then use these to set actual effect based on speed. */
enum
@ -29,26 +30,39 @@ enum
STEELSERIES_RIVAL_EFFECT_PULSATE_MAX = 0x04
};
class SteelSeriesRivalController
{
public:
SteelSeriesRivalController(hid_device* dev_handle);
SteelSeriesRivalController
(
hid_device* dev_handle,
steelseries_type proto_type
);
~SteelSeriesRivalController();
char* GetDeviceName();
steelseries_type GetMouseType();
void Save();
void SetLightEffect(unsigned char effect);
void SetLightEffect
(
unsigned char zone_id,
unsigned char effect
);
void SetColor
(
unsigned char red,
unsigned char green,
unsigned char blue
unsigned char zone_id,
unsigned char red,
unsigned char green,
unsigned char blue
);
private:
char device_name[32];
hid_device* dev;
steelseries_type proto;
};

View file

@ -67,7 +67,7 @@ void RGBController_SteelSeriesRival::DeviceUpdateLEDs()
unsigned char red = RGBGetRValue(colors[0]);
unsigned char grn = RGBGetGValue(colors[0]);
unsigned char blu = RGBGetBValue(colors[0]);
rival->SetColor(red, grn, blu);
rival->SetColor(0, red, grn, blu);
}
void RGBController_SteelSeriesRival::UpdateZoneLEDs(int zone)
@ -76,9 +76,10 @@ void RGBController_SteelSeriesRival::UpdateZoneLEDs(int zone)
unsigned char red = RGBGetRValue(color);
unsigned char grn = RGBGetGValue(color);
unsigned char blu = RGBGetBValue(color);
if(zone == 0)
{
rival->SetColor(red, grn, blu);
rival->SetColor(0, red, grn, blu);
}
}
@ -97,10 +98,10 @@ void RGBController_SteelSeriesRival::UpdateMode()
switch (modes[active_mode].value)
{
case STEELSERIES_RIVAL_STATIC:
rival->SetLightEffect(STEELSERIES_RIVAL_EFFECT_STATIC);
rival->SetLightEffect(0, STEELSERIES_RIVAL_EFFECT_STATIC);
break;
case STEELSERIES_RIVAL_PULSATE:
rival->SetLightEffect(modes[active_mode].speed);
rival->SetLightEffect(0, modes[active_mode].speed);
break;
}