Skip to content

Add support for Tecware keyboards. #235

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 10 commits 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
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

.vs/

Debug/

KeyboardVisualizerVC/Release/
180 changes: 116 additions & 64 deletions KeyboardVisualizerCommon/CorsairCUE.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@
| Adam Honse (calcprogrammer1@gmail.com), 12/11/2016 |
\*---------------------------------------------------------*/

/* TODO
* Add mice support [DONE]
* Fix incorrect rainbow/gradient positioning [NEEDS VALIDATION]
* Update deprecated lines [DONE]
* Fix iCUE 3.19 issue [DONE]
*/

#include "CorsairCUE.h"
#include "VisualizerDefines.h"

Expand All @@ -13,15 +20,25 @@ static boolean failed;

#ifdef CORSAIR_CUE_ENABLED
#include <algorithm>
#include <vector>

#pragma comment(lib, "CUESDK_2013.lib")
#pragma comment(lib, "CUESDK.x64_2013.lib")

CorsairLedColor * colors;
CorsairLedPositions * positions;
int * x_idx;
int * y_idx;
CorsairLedId * led_idx;
struct CueDevice
{
const char* model;
CorsairDeviceType type;
CorsairLedColor* colors;
CorsairLedPositions* positions;
int* x_idx;
int* y_idx;
int devID = 0;
CorsairLedId* led_idx;
};

std::vector<CueDevice> _CueDeviceList;
CueDevice _CueDevice;
#endif

CorsairCUE::CorsairCUE()
Expand All @@ -34,81 +51,116 @@ CorsairCUE::~CorsairCUE()
}

#ifdef CORSAIR_CUE_ENABLED
double getKeyboardHeight(CorsairLedPositions *ledPositions)
double getKeyboardHeight(CorsairLedPositions* ledPositions)
{
const auto minmaxLeds = std::minmax_element(ledPositions->pLedPosition, ledPositions->pLedPosition + ledPositions->numberOfLed,
[](const CorsairLedPosition &clp1, const CorsairLedPosition &clp2) {
return clp1.top < clp2.top;
});
return minmaxLeds.second->top + minmaxLeds.second->height - minmaxLeds.first->top;
const auto minmaxLeds = std::minmax_element(ledPositions->pLedPosition, ledPositions->pLedPosition + ledPositions->numberOfLed,
[](const CorsairLedPosition& clp1, const CorsairLedPosition& clp2) {
return clp1.top < clp2.top;
});
return minmaxLeds.second->top + minmaxLeds.second->height - minmaxLeds.first->top;
}

double getKeyboardWidth(CorsairLedPositions *ledPositions)
double getKeyboardWidth(CorsairLedPositions* ledPositions)
{
const auto minmaxLeds = std::minmax_element(ledPositions->pLedPosition, ledPositions->pLedPosition + ledPositions->numberOfLed,
[](const CorsairLedPosition &clp1, const CorsairLedPosition &clp2) {
return clp1.left < clp2.left;
});
return minmaxLeds.second->left + minmaxLeds.second->width - minmaxLeds.first->left;
const auto minmaxLeds = std::minmax_element(ledPositions->pLedPosition, ledPositions->pLedPosition + ledPositions->numberOfLed,
[](const CorsairLedPosition& clp1, const CorsairLedPosition& clp2) {
return clp1.left < clp2.left;
});
return minmaxLeds.second->left + minmaxLeds.second->width - minmaxLeds.first->left;
}
#endif

void CorsairCUE::Setup()
{
_CueDevice.model = CorsairGetDeviceInfo(_CueDevice.devID)->model;
_CueDevice.type = CorsairGetDeviceInfo(_CueDevice.devID)->type;
_CueDevice.positions = CorsairGetLedPositionsByDeviceIndex(_CueDevice.devID);

_CueDevice.colors = new CorsairLedColor[_CueDevice.positions->numberOfLed];
_CueDevice.x_idx = new int[_CueDevice.positions->numberOfLed];
_CueDevice.y_idx = new int[_CueDevice.positions->numberOfLed];
_CueDevice.led_idx = new CorsairLedId[_CueDevice.positions->numberOfLed];

_CueDeviceList.push_back(_CueDevice);
}

void CorsairCUE::Initialize()
{
#ifdef CORSAIR_CUE_ENABLED
CorsairPerformProtocolHandshake();
if (const auto error = CorsairGetLastError())
{
failed = TRUE;
}
else
{
failed = FALSE;

positions = CorsairGetLedPositions();

colors = new CorsairLedColor[positions->numberOfLed];
x_idx = new int[positions->numberOfLed];
y_idx = new int[positions->numberOfLed];
led_idx = new CorsairLedId[positions->numberOfLed];

double width = getKeyboardWidth(positions);
double height = getKeyboardHeight(positions);

for (int i = 0; i < positions->numberOfLed; i++)
{
led_idx[i] = positions->pLedPosition[i].ledId;
x_idx[i] = (int)(SPECTROGRAPH_END * (positions->pLedPosition[i].left / width));
y_idx[i] = (int)(ROW_IDX_SPECTROGRAPH_TOP + (SPECTROGRAPH_ROWS * (positions->pLedPosition[i].top / height)) + (0.5f * (SPECTROGRAPH_ROWS / height)));
}

failed = FALSE;
}
CorsairPerformProtocolHandshake();
if (const auto error = CorsairGetLastError())
{
failed = TRUE;
}
else
{
failed = FALSE;

for (auto i = 0; i < CorsairGetDeviceCount(); i++) {
if (CorsairGetDeviceInfo(i)->type == CDT_Keyboard)
{
_CueDevice.devID = i;
Setup();
}
else if (CorsairGetDeviceInfo(i)->type == CDT_Mouse)
{
_CueDevice.devID = i;
Setup();
}
}

failed = FALSE;
}
#else
failed = TRUE;
failed = TRUE;
#endif
}

bool CorsairCUE::SetLEDs(COLORREF pixels[64][256])
{
if (failed)
{
return FALSE;
}
else
{
if (failed)
{
return FALSE;
}
else
{
#ifdef CORSAIR_CUE_ENABLED
for (int i = 0; i < positions->numberOfLed; i++)
{
COLORREF color = pixels[y_idx[i]][x_idx[i]];
colors[i].r = GetRValue(color);
colors[i].g = GetGValue(color);
colors[i].b = GetBValue(color);
colors[i].ledId = led_idx[i];
}

CorsairSetLedsColors(positions->numberOfLed, colors);
return TRUE;

for (int a = 0; a < _CueDeviceList.size(); a++) if (&_CueDeviceList[a]) {
double _width = getKeyboardWidth(_CueDeviceList[a].positions);
double _height = getKeyboardHeight(_CueDeviceList[a].positions);

for (int i = 0; i < _CueDeviceList[a].positions->numberOfLed; i++)
{
_CueDeviceList[a].led_idx[i] = _CueDeviceList[a].positions->pLedPosition[i].ledId;

if (strcmp(_CueDeviceList[a].model, "STRAFE RGB MK.2") == 0)
{
// I don't know if the incorrect positioning only applies to the STRAFE RGB MK.2 so I added that workaround
_CueDeviceList[a].x_idx[i] = (int)(SPECTROGRAPH_END * (_CueDeviceList[a].positions->pLedPosition[i].left / _width)) - 10;
}
else
{
_CueDeviceList[a].x_idx[i] = (int)(SPECTROGRAPH_END * (_CueDeviceList[a].positions->pLedPosition[i].left / _width));
}

_CueDeviceList[a].y_idx[i] = (int)(ROW_IDX_SPECTROGRAPH_TOP + (SPECTROGRAPH_ROWS * (_CueDeviceList[a].positions->pLedPosition[i].top / _height)) + (1.0f * (SPECTROGRAPH_ROWS / _height)));
}

for (int i = 0; i < _CueDeviceList[a].positions->numberOfLed; i++)
{
COLORREF _color = pixels[_CueDeviceList[a].y_idx[i]][_CueDeviceList[a].x_idx[i]];
_CueDeviceList[a].colors[i].r = GetRValue(_color);
_CueDeviceList[a].colors[i].g = GetGValue(_color);
_CueDeviceList[a].colors[i].b = GetBValue(_color);
_CueDeviceList[a].colors[i].ledId = _CueDeviceList[a].led_idx[i];
}

CorsairSetLedsColorsBufferByDeviceIndex(_CueDeviceList[a].devID, _CueDeviceList[a].positions->numberOfLed, _CueDeviceList[a].colors);
CorsairSetLedsColorsFlushBuffer();
}

return TRUE;
#endif
}
}
}
5 changes: 3 additions & 2 deletions KeyboardVisualizerCommon/CorsairCUE.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ class CorsairCUE
CorsairCUE();
~CorsairCUE();

void Initialize();
bool SetLEDs(COLORREF pixels[64][256]);
static void Initialize();
static void Setup();
static bool SetLEDs(COLORREF pixels[64][256]);
};

#endif
10 changes: 10 additions & 0 deletions KeyboardVisualizerCommon/RazerChromaLinux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ enum
{
RAZER_NO_DEVICE,
RAZER_BLACKWIDOW_CHROMA,
RAZER_BLACKWIDOW_X_CHROMA,
RAZER_DEATHSTALKER_CHROMA,
RAZER_ORNATA_CHROMA,
RAZER_BLADE_STEALTH,
Expand Down Expand Up @@ -168,6 +169,13 @@ void RazerChroma::Initialize()

device_type = RAZER_BLACKWIDOW_CHROMA;
}
if(!strncmp(device_string, "Razer BlackWidow X Chroma", strlen("Razer BlackWidow X Chroma")))
{
//Device is Razer BlackWidow X Chroma
printf("BlackWidow X Chroma Detected\r\n");

device_type = RAZER_BLACKWIDOW_X_CHROMA;
}
if(!strncmp(device_string, "Razer DeathStalker Chroma", strlen("Razer DeathStalker Chroma")))
{
//Device is Razer DeathStalker Chroma
Expand Down Expand Up @@ -324,6 +332,7 @@ void RazerChroma::Initialize()
{
//Devices with custom effect type and matrix
case RAZER_BLACKWIDOW_CHROMA:
case RAZER_BLACKWIDOW_X_CHROMA:
case RAZER_DEATHSTALKER_CHROMA:
case RAZER_ORNATA_CHROMA:
case RAZER_BLADE_STEALTH:
Expand Down Expand Up @@ -505,6 +514,7 @@ bool RazerChroma::SetLEDs(COLORREF pixels[64][256])
{
case RAZER_ORNATA_CHROMA:
case RAZER_BLACKWIDOW_CHROMA:
case RAZER_BLACKWIDOW_X_CHROMA:
{
char BlackWidowEffect[((3 * 22)) + 3];

Expand Down
21 changes: 21 additions & 0 deletions KeyboardVisualizerCommon/Visualizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -462,6 +462,27 @@ void Visualizer::ChangeAudioDevice()
#endif
}


void Visualizer::RestartDevices()
{
//Initialize devices supported only under Windows
#ifdef WIN32
cmkb.Initialize();
lkb.Initialize();
asa.Initialize();

//Initialize devices supported only under Linux
#else

#endif
//Initialize devices supported by both Windows and Linux
rkb.Initialize();
ckb.Initialize();
skb.Initialize();
mkb.Initialize();
pkb.Initialize();
}

void Visualizer::Initialize()
{
InitAudioDeviceList();
Expand Down
2 changes: 2 additions & 0 deletions KeyboardVisualizerCommon/Visualizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class Visualizer
void NetConnectThread();
void NetUpdateThread();

void RestartDevices();

#ifdef WIN32
//Update threads for devices supported only under Windows
void CmKeyboardUpdateThread();
Expand Down
18 changes: 18 additions & 0 deletions KeyboardVisualizerVC/KeyboardVisDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ IMPLEMENT_DYNAMIC(KeyboardVisDlg, CDialogEx)
Visualizer* vis;
boolean startminimized;
boolean firstrun;
boolean hide;
NOTIFYICONDATA Tray;

KeyboardVisDlg::KeyboardVisDlg(CWnd* pParent)
Expand Down Expand Up @@ -131,6 +132,7 @@ BOOL KeyboardVisDlg::OnInitDialog()
void KeyboardVisDlg::StartMinimized(boolean startmin)
{
startminimized = startmin;
hide = true;
}

void KeyboardVisDlg::OnDestroy()
Expand All @@ -147,6 +149,11 @@ void KeyboardVisDlg::OnTimer(UINT nIDEvent)
ShowWindow(SW_HIDE);
}

if(hide)
{
ShowWindow(SW_HIDE);
}

COLORREF pixels_bgr[64][256];

//CreateBitmap uses BGR color layout, convert from RGB
Expand Down Expand Up @@ -221,11 +228,13 @@ LRESULT KeyboardVisDlg::OnTrayIconEvent(WPARAM wParam, LPARAM lParam)
{
if (IsWindowVisible())
{
hide = true;
KillTimer(timer);
ShowWindow(SW_HIDE);
}
else
{
hide = false;
ShowWindow(SW_SHOW);
timer = SetTimer(1, 25, NULL);
}
Expand Down Expand Up @@ -253,6 +262,7 @@ BEGIN_MESSAGE_MAP(KeyboardVisDlg, CDialogEx)
ON_EN_CHANGE(IDC_EDIT_NRML_OFST, &KeyboardVisDlg::OnEnChangedEditNrmlOfst)
ON_EN_CHANGE(IDC_EDIT_NRML_SCL, &KeyboardVisDlg::OnEnChangedEditNrmlScl)
ON_BN_CLICKED(IDC_BUTTON_SAVE, &KeyboardVisDlg::OnClickedSave)
ON_BN_CLICKED(IDC_BUTTON_RESTART, &KeyboardVisDlg::OnClickedRestart)
ON_EN_CHANGE(IDC_EDIT_ANIM_SPEED, &KeyboardVisDlg::OnEnChangeEditAnimSpeed)
ON_BN_CLICKED(IDC_CHECK_REACTIVE_BACKGROUND, &KeyboardVisDlg::OnBnClickedCheckReactiveBackground)
ON_CBN_SELCHANGE(IDC_COMBO_AUDIO_DEVICE, &KeyboardVisDlg::OnCbnSelchangeComboAudioDevice)
Expand Down Expand Up @@ -362,6 +372,14 @@ void KeyboardVisDlg::OnClickedSave()
vis->SaveSettings();
}

void KeyboardVisDlg::OnClickedRestart()
{
// stub
//Initialize Visualizer
//vis->Initialize();
vis->RestartDevices();
}

void KeyboardVisDlg::OnEnChangeEditAnimSpeed()
{
char val[64];
Expand Down
1 change: 1 addition & 0 deletions KeyboardVisualizerVC/KeyboardVisDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class KeyboardVisDlg : public CDialogEx
afx_msg void OnEnChangedEditNrmlOfst();
afx_msg void OnEnChangedEditNrmlScl();
afx_msg void OnClickedSave();
afx_msg void OnClickedRestart();
afx_msg void OnEnChangeEditAnimSpeed();
afx_msg void OnBnClickedCheckReactiveBackground();
afx_msg void OnCbnSelchangeComboAudioDevice();
Expand Down
Loading