Skip to content

Add libusb impl #87

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions KeyboardVisualizerCommon/RazerChroma.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@

#include <iostream>

#include <lusb0_usb.h>
#pragma comment(lib, "libusb32.lib")

//Index lists for BlackWidow
int BlackWidowXIndex[22];
int BlackWidowYIndex[6];
Expand All @@ -20,6 +23,10 @@ int BlackWidowTEYIndex[6];
int BladeStealthXIndex[16];
int BladeStealthYIndex[6];

//Index lists for Blade Pro
int BladeProXIndex[25];
int BladeProYIndex[6];

//Index list for Firefly
int FireflyIndex[15];

Expand All @@ -38,8 +45,41 @@ int DeathStalkerXIndex[6];
int OrbweaverXIndex[5];
int OrbweaverYIndex[4];

struct usb_dev_handle* udev;

struct usb_dev_handle* open(unsigned int uiVID, unsigned int uiPID, unsigned int uiMI) {
for (struct usb_bus* bus = usb_get_busses(); bus; bus = bus->next) {
for (struct usb_device* dev = bus->devices; dev; dev = dev->next) {
if (dev->descriptor.idVendor == uiVID && dev->descriptor.idProduct == uiPID) {
struct usb_dev_handle* udev;
if (udev = usb_open(dev)) {
struct usb_config_descriptor* config_descriptor;
if (dev->descriptor.bNumConfigurations && (config_descriptor = &dev->config[0])) {
for (int intfIndex = 0; intfIndex < config_descriptor->bNumInterfaces; intfIndex++) {
if (config_descriptor->interface[intfIndex].num_altsetting) {
struct usb_interface_descriptor* intf = &config_descriptor->interface[intfIndex].altsetting[0];
if (intf->bInterfaceNumber == 0 && intf->bAlternateSetting == 0) {
//printf("Device %04X:%04X opened!\n", uiVID, uiPID);
return udev;
} else
usb_close(udev);
} else
usb_close(udev);
}
} else
usb_close(udev);
}
}
}
}
}

RazerChroma::RazerChroma()
{
usb_init();
usb_find_busses();
usb_find_devices();
udev = open(0x1532, 0x0210, 0);
}


Expand All @@ -53,6 +93,7 @@ RazerChroma::~RazerChroma()
UnInit();
}
}
usb_close(udev);
}


Expand Down Expand Up @@ -110,6 +151,7 @@ void RazerChroma::Initialize()
// Initialize variables
use_keyboard_generic_effect = false;
use_headset_custom_effect = false;
use_alternate_effect = false;

// Dynamically loads the Chroma SDK library.
hModule = LoadLibrary(CHROMASDKDLL);
Expand All @@ -130,6 +172,9 @@ void RazerChroma::Initialize()
//Build index list for Blade Stealth
SetupKeyboardGrid(16, 6, BladeStealthXIndex, BladeStealthYIndex);

//Build index list for Blade Pro 2016
SetupKeyboardGrid(25, 6, BladeProXIndex, BladeProYIndex);

//Build index list for OrbWeaver
SetupKeyboardGrid(5, 4, OrbweaverXIndex, OrbweaverYIndex);

Expand Down Expand Up @@ -216,9 +261,71 @@ void RazerChroma::Initialize()
}
}

#define DELAY 0
#define REPORT_SIZE 0x5A

void command(struct usb_dev_handle* udev, char* request) {
request[88] = 0; // crc
for(unsigned char i = 2; i < 88; i++)
request[88] ^= request[i]; // crc
int len = usb_control_msg(udev
, USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_ENDPOINT_OUT
,0x09 // request - HID_REQ_SET_REPORT
,0x300 // value
,0x00 // index
,request // data
,REPORT_SIZE
,5000); // USB timeout
Sleep(DELAY);
if(len == REPORT_SIZE) {
char* response = (char*)malloc(REPORT_SIZE);
len = usb_control_msg(udev
, USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_ENDPOINT_IN
,0x01 // request HID_REQ_GET_REPORT
,0x300 // value
,0x00 // response_index
,response // data
,REPORT_SIZE
,5000); // USB timeout
Sleep(DELAY);
free(response);
}
}

void command_frame_kbd(struct usb_dev_handle* udev, COLORREF colour[6][25]) {
char* request = (char*)malloc(REPORT_SIZE);
for (unsigned char row = 0; row < 6; row++) {
memset(request, 0, REPORT_SIZE);
memcpy(&request[0],"\x00\xFF\x00\x00\x00\x46\x03\x0B\xFF\x00\x01\x18",12);
request[9] = row;
for (unsigned char col = 0; col < 25; col++)
memcpy(&request[12+col*3], &colour[row][col], 3);
command(udev, request);
}
free(request);
}

void command_custom(struct usb_dev_handle* udev) {
char * request = (char*)malloc(REPORT_SIZE);
memset(request, 0, REPORT_SIZE);
memcpy(&request[0],"\x00\xFF\x00\x00\x00\x02\x03\x0A\x05\x01",9);
command(udev, request);
free(request);
}


bool RazerChroma::SetLEDs(COLORREF pixels[64][256])
{
if (use_alternate_effect) {
COLORREF colour[6][25];
for (int x = 0; x < 25; x++)
for (int y = 0; y < 6; y++)
colour[y][x] = (pixels[BladeProYIndex[y]][BladeProXIndex[x]] & 0x00FFFFFF);
command_frame_kbd(udev,colour);
command_custom(udev);
//TODO add other devices besides RBP2016
return TRUE;
} else {
CreateEffect = (CREATEEFFECT)GetProcAddress(hModule, "CreateEffect");
CreateKeyboardEffect = (CREATEKEYBOARDEFFECT)GetProcAddress(hModule, "CreateKeyboardEffect");
CreateMouseEffect = (CREATEMOUSEEFFECT)GetProcAddress(hModule, "CreateMouseEffect");
Expand Down Expand Up @@ -371,4 +478,5 @@ bool RazerChroma::SetLEDs(COLORREF pixels[64][256])

return TRUE;
}
}
};
1 change: 1 addition & 0 deletions KeyboardVisualizerCommon/RazerChroma.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class RazerChroma

bool use_keyboard_generic_effect;
bool use_headset_custom_effect;
bool use_alternate_effect;

private:
HMODULE hModule = NULL;
Expand Down
4 changes: 4 additions & 0 deletions KeyboardVisualizerCommon/Visualizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,10 @@ void Visualizer::SetDeviceProperty(char * devprop)
{
rkb.use_headset_custom_effect = true;
}
else if (strcmp(devprop, "razer_use_alternate_effect") == 0)
{
rkb.use_alternate_effect = true;
}
#endif
}

Expand Down
10 changes: 6 additions & 4 deletions KeyboardVisualizerVC/KeyboardVisualizerVC.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>false</SDLCheck>
<AdditionalIncludeDirectories>..\dependencies\razer-chroma-1.8.3\inc;..\dependencies\corsair-cue-1.15.28\include;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\dependencies\lib-usb;..\dependencies\razer-chroma-1.8.3\inc;..\dependencies\corsair-cue-1.15.28\include;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Include</AdditionalIncludeDirectories>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<WholeProgramOptimization>false</WholeProgramOptimization>
Expand All @@ -106,7 +106,7 @@
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>..\dependencies\corsair-cue-1.15.28\lib\i386;..\dependencies\corsair-cue-1.15.28\lib\x64;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Lib\x86;..\dependencies\logitech-gaming-led-sdk\Lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>..\dependencies\lib-usb;..\dependencies\corsair-cue-1.15.28\lib\i386;..\dependencies\corsair-cue-1.15.28\lib\x64;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Lib\x86;..\dependencies\logitech-gaming-led-sdk\Lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
</Link>
Expand Down Expand Up @@ -138,7 +138,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>false</SDLCheck>
<AdditionalIncludeDirectories>..\dependencies\razer-chroma-1.8.3\inc;..\dependencies\corsair-cue-1.15.28\include;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Include</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\dependencies\lib-usb;..\dependencies\razer-chroma-1.8.3\inc;..\dependencies\corsair-cue-1.15.28\include;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Include</AdditionalIncludeDirectories>
<BufferSecurityCheck>false</BufferSecurityCheck>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
Expand All @@ -148,7 +148,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>..\dependencies\corsair-cue-1.15.28\lib\i386;..\dependencies\corsair-cue-1.15.28\lib\x64;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Lib\x86;..\dependencies\logitech-gaming-led-sdk\Lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories>..\dependencies\lib-usb;..\dependencies\corsair-cue-1.15.28\lib\i386;..\dependencies\corsair-cue-1.15.28\lib\x64;..\dependencies\coolermaster-sdk-160630;..\dependencies\logitech-gaming-led-sdk\Lib\x86;..\dependencies\logitech-gaming-led-sdk\Lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
Expand Down Expand Up @@ -182,6 +182,7 @@
<ClCompile Include="..\KeyboardVisualizerCommon\LogitechSDK.cpp" />
<ClCompile Include="..\KeyboardVisualizerCommon\MSIKeyboard.cpp" />
<ClCompile Include="..\KeyboardVisualizerCommon\net_port.cpp" />
<ClCompile Include="..\KeyboardVisualizerCommon\PoseidonZRGBKeyboard.cpp" />
<ClCompile Include="..\KeyboardVisualizerCommon\RazerChroma.cpp" />
<ClCompile Include="..\KeyboardVisualizerCommon\serial_port.cpp" />
<ClCompile Include="..\KeyboardVisualizerCommon\SteelSeriesGameSense.cpp" />
Expand All @@ -199,6 +200,7 @@
<ClInclude Include="..\KeyboardVisualizerCommon\LogitechSDK.h" />
<ClInclude Include="..\KeyboardVisualizerCommon\MSIKeyboard.h" />
<ClInclude Include="..\KeyboardVisualizerCommon\net_port.h" />
<ClInclude Include="..\KeyboardVisualizerCommon\PoseidonZRGBKeyboard.h" />
<ClInclude Include="..\KeyboardVisualizerCommon\RazerChroma.h" />
<ClInclude Include="..\KeyboardVisualizerCommon\serial_port.h" />
<ClInclude Include="..\KeyboardVisualizerCommon\SteelSeriesGameSense.h" />
Expand Down
5 changes: 5 additions & 0 deletions KeyboardVisualizerVC/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,11 @@ void parse_argument_string(char * argument, char * value)
{
vis.SetDeviceProperty(argument);
}

if (strcmp(argument, "razer_use_alternate_effect") == 0)
{
vis.SetDeviceProperty(argument);
}
}

boolean parse_command_line(char * command_line)
Expand Down
Binary file added dependencies/lib-usb/libusb32.lib
Binary file not shown.
Loading