Early work on enabling support for the Rival 300.
This commit is contained in:
parent
1a9e1c2430
commit
cf4b421abd
5 changed files with 96 additions and 29 deletions
|
|
@ -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;
|
||||
|
|
|
|||
23
Controllers/SteelSeriesController/SteelSeriesGeneric.h
Normal file
23
Controllers/SteelSeriesController/SteelSeriesGeneric.h
Normal 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;
|
||||
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue