Aller au contenu

Razer: utilisation de l'API du module Chroma


Invité

Messages recommandés

Possédant des périphériques Razer équipés du module de couleurs "Chroma", je me suis intéressé à l'API, disponible sur le site officielle de la marque, pour faire des tests et tenter d’interagir avec les périphériques. Grâce à leur doc doxygen et quelques "snippets" de code, j'ai réussi à changer la couleur de mon clavier comme ceci:

 

L'appli dans la démo est extrêmement simple, j'ai du faire ça en 10 minutes mais cela montre le potentiel que l'on peut faire (pouvoir régler dynamiquement la couleur avec des sliders, ou inventer des effets customs...)

Le SDK de Chroma est écrit en C++, le mieux serait donc de coder votre appli avec le même langage. J'ai malgré tout réussi à trouver des projets sur le net où des devs indépendants ont transcrit le SDK sur d'autres langages (genre java il me semble).

Pour les devs, on peut le télécharger ici: http://developer.razerzone.com/chroma/download/

Voici le code que je vous propose, pour initialiser l'API et un exemple de fonction pour appliquer une couleur:

.cpp

#include "stdafx.h"

CChroma* g_pChroma;

CChroma::CChroma() 
{ 
	bInitialized = false;
	hModule = NULL;
	initFn = NULL;
	unInitFn = NULL;
	createEffectFn = NULL;
	createKeyboardEffectFn = NULL;
	createMouseEffectFn = NULL;
}

CChroma::~CChroma()
{
	if (hModule)
	{
		unInitFn = (UNINIT)GetProcAddress(hModule, "UnInit");
		if (unInitFn)
		{
			unInitFn();
		}
		FreeLibrary(hModule);
		hModule = NULL;
	}
}

bool CChroma::Init()
{
	do
	{
		hModule = LoadLibrary(CHROMASDKDLL);
		Sleep(200);
	} while (!hModule);

	if (hModule)
	{
		initFn = (INIT)GetProcAddress(hModule, "Init");
		if (initFn)
		{
			RZRESULT result = initFn();

			if (result == RZRESULT_SUCCESS)
			{
				createEffectFn = (CREATEEFFECT)GetProcAddress(hModule, "CreateEffect");
				createKeyboardEffectFn = (CREATEKEYBOARDEFFECT)GetProcAddress(hModule, "CreateKeyboardEffect");
				createMouseEffectFn = (CREATEMOUSEEFFECT)GetProcAddress(hModule, "CreateMouseEffect");
				queryDeviceFn = (QUERYDEVICE)GetProcAddress(hModule, "QueryDevice");

				if (createEffectFn && createKeyboardEffectFn && createMouseEffectFn && queryDeviceFn)
				{
					printf("init: ok \n");
					bInitialized = true;
					return true;
				}
				else
					return false;
			}
		}
	}

	return false;
}

bool CChroma::ApplyEffect(COLORREF dwColor)
{
	if (!bInitialized)
		return false;

	RZEFFECTID Frame0 = GUID_NULL;

	ChromaSDK::Keyboard::CUSTOM_EFFECT_TYPE DeathStalkerEffect;

	for (int i = 0; i < ChromaSDK::Keyboard::MAX_ROW; i++)
	{
		for (int j = 0; j < ChromaSDK::Keyboard::MAX_COLUMN; j++)
		{
			DeathStalkerEffect.Color[i][j] = dwColor; //COLORREF_RGBA(255, 0, 0, 255);
		}
	}

	createEffectFn(ChromaSDK::DEATHSTALKER_CHROMA, ChromaSDK::CHROMA_CUSTOM, &DeathStalkerEffect, NULL);

	createKeyboardEffectFn(ChromaSDK::Keyboard::CHROMA_CUSTOM, &DeathStalkerEffect, &Frame0);

	printf("Created \n");

	return true;
}

.h

#pragma once

// Inclusion du chroma sdk
#include "ChromaSDK/RzChromaSDKDefines.h"
#include "ChromaSDK/RzChromaSDKTypes.h"
#include "ChromaSDK/RzErrors.h"

using namespace ChromaSDK;
using namespace ChromaSDK::Keyboard;

typedef RZRESULT(*INIT)(void);
typedef RZRESULT(*UNINIT)(void);
typedef RZRESULT(*CREATEEFFECT)(RZDEVICEID DeviceId, ChromaSDK::EFFECT_TYPE Effect, PRZPARAM pParam, RZEFFECTID *pEffectId);
typedef RZRESULT(*CREATEKEYBOARDEFFECT)(ChromaSDK::Keyboard::EFFECT_TYPE Effect, PRZPARAM pParam, RZEFFECTID *pEffectId);
typedef RZRESULT(*CREATEMOUSEEFFECT)(ChromaSDK::Mouse::EFFECT_TYPE Effect, PRZPARAM pParam, RZEFFECTID *pEffectId);
typedef RZRESULT(*QUERYDEVICE)(RZDEVICEID DeviceId, ChromaSDK::DEVICE_INFO_TYPE &DeviceInfo);

#ifdef _WIN64
#define CHROMASDKDLL "RzChromaSDK64.dll"
#else
#define CHROMASDKDLL "RzChromaSDK.dll"
#endif

#define COLORREF_ARGB(a,r,g,b) ((COLORREF)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))
#define COLORREF_RGBA(r,g,b,a) ((COLORREF)((((r)&0xff)<<24)|(((g)&0xff)<<16)|(((b)&0xff)<<8)|((a)&0xff)))

#define COLORANGE			COLORREF_RGBA(255, 100, 000, 255)
#define COLYELLOW			COLORREF_RGBA(255, 255, 0, 255)
#define COLPURPLE			COLORREF_RGBA(55, 25, 128, 255)
#define COLRED				COLORREF_RGBA(255, 0, 0, 255)
#define COLGREEN			COLORREF_RGBA(0, 255, 0, 255)
#define COLBLUE				COLORREF_RGBA(0, 0, 255, 255)
#define COLBLACK			COLORREF_RGBA(0, 0, 0, 255)
#define COLWHITE			COLORREF_RGBA(255, 255, 255, 255)
#define COLGREY				COLORREF_RGBA(47, 79, 79, 255)


class CChroma
{
public:
	CChroma();
	~CChroma();

	bool Init();

	bool ApplyEffect(COLORREF dwColor);


private:
	HMODULE hModule;
	INIT initFn;
	UNINIT unInitFn;
	CREATEEFFECT createEffectFn;
	CREATEKEYBOARDEFFECT createKeyboardEffectFn;
	CREATEMOUSEEFFECT createMouseEffectFn;
	QUERYDEVICE queryDeviceFn;
	bool bInitialized;
};
extern CChroma* g_pChroma;

La fonction Init() va chercher dans la .dll de Razer, les fonctions principales et les "stock" dans des variables qui font office de pointeurs. On peut par la suite, les appeler si besoin.

Dans le SDK de Razer, dans le cas d'un clavier, un effet est modélisé par une structure contenant une matrice de couleur, représentant le clavier.

//! Custom effect using a matrix type.
typedef struct CUSTOM_EFFECT_TYPE
{
	COLORREF Color[MAX_ROW][MAX_COLUMN];      //!< Grid layout. 6 rows by 22 columns.
} CUSTOM_EFFECT_TYPE;

Il suffit alors d'instancier un CUSTOM_EFFECT_TYPE, remplir la matrice Color, créer l'effet avec la fonction createEffect() comme ceci:

createEffectFn(ChromaSDK::DEATHSTALKER_CHROMA, ChromaSDK::CHROMA_CUSTOM, &DeathStalkerEffect, NULL);

puis l'appliquer au clavier avec la fonction createKeyboardEffect()

createKeyboardEffectFn(ChromaSDK::Keyboard::CHROMA_CUSTOM, &DeathStalkerEffect, &Frame0);

 

Dans votre main, il faut instancier un objet CChroma comme ceci:

g_pChroma = new CChroma();
	
if (!g_pChroma->Init())
	return 1;

Après, il suffit d'appeler la fonction ApplyEffect(dwColor) pour changer la couleur du clavier DeathStalker par exemple (dans mon code). Pour appliquer la couleur sur votre souris, ou le tapis ou le casque ou tout autre modèle, il faut regarder dans la doc comment init un effet pour tel ou tel modèle.

Comprendra qui pourra :)

Lien vers le commentaire
Partager sur d’autres sites

Il y a 3 heures, Nitrix a dit :

Comprendra qui pourra :)

J'ai bien rigolé ^^

Perso, j'ai juste un casque razer qui n'a aucune led pour changer de couleur donc ça ne va pas trop me servir mais c'est super de partager ça avec ceux qui en ont ^^

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

 

Le 2/2/2016à23:35, Gameuse Minstery a dit :

J'ai bien rigolé ^^

Perso, j'ai juste un casque razer qui n'a aucune led pour changer de couleur donc ça ne va pas trop me servir mais c'est super de partager ça avec ceux qui en ont ^^

Ben suffit de lire un peu la doc est le tour est joué =D

Dommage que j'ai qu'un casque SteelSeries ^^ (même si je suis sûr qu'en cherchant un peu j'aurai une API)

Lien vers le commentaire
Partager sur d’autres sites

Le 17/2/2016à01:39, darkbibni a dit :

 

Ben suffit de lire un peu la doc est le tour est joué =D

Dommage que j'ai qu'un casque SteelSeries ^^ (même si je suis sûr qu'en cherchant un peu j'aurai une API)

Faut quand même s'y connaitre en C++ obviously et au sujet de la WinAPI pour savoir comment aller chercher un module et ou

Lien vers le commentaire
Partager sur d’autres sites

il y a 7 minutes, Nitrix a dit :

Faut quand même s'y connaitre en C++ obviously et au sujet de la WinAPI pour savoir comment aller chercher un module et ou

Je m'y connais un tout petit peu en C++ et j'ai touché à la winApi pour les sockets ça doit être la même chose ^^ ? Mais pour l'instant ça ne m'intéresse pas tant que ça ^^'

Lien vers le commentaire
Partager sur d’autres sites

Le 18/2/2016à13:11, darkbibni a dit :

Je m'y connais un tout petit peu en C++ et j'ai touché à la winApi pour les sockets ça doit être la même chose ^^ ? Mais pour l'instant ça ne m'intéresse pas tant que ça ^^'

Ouais c'est un aspect (réseau) de la winApi

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...

Information importante

En navigant ce site, vous acceptez nos Politique de confidentialité.