Création d'un plugin
Maintenant que nos données RGB sont isolées, nous pouvons commencer à créer notre plugin.
Pour commencer à créer un plugin, nous allons ouvrir un éditeur de texte et y coller le texte ci-dessous.
export function Name() { return ""; }export function VendorId() { return ; }export function ProductId() { return ; }export function Publisher() { return ""; }export function Documentation(){ return "troubleshooting/brand"; }export function Size() { return [1,1]; }export function ControllableParameters() { return [ {"property":"shutdownColor", "group":"lighting", "label":"Shutdown Color", "min":"0", "max":"360", "type":"color", "default":"009bde"}, {"property":"LightingMode", "group":"lighting", "label":"Lighting Mode", "type":"combobox", "values":["Canvas", "Forced"], "default":"Canvas"}, {"property":"forcedColor", "group":"lighting", "label":"Forced Color", "min":"0", "max":"360", "type":"color", "default":"009bde"}, ];}
export function Initialize() {
}
var vLedNames = [ "Led 1" ];var vLedPositions = [ [0,0] ];
export function LedNames() {
}
export function LedPositions() {
}
export function Render() {
}
export function Shutdown() {
}
function hexToRgb(hex) { let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); let colors = []; colors[0] = parseInt(result[1], 16); colors[1] = parseInt(result[2], 16); colors[2] = parseInt(result[3], 16);
return colors;}
export function Validate(endpoint) { return endpoint.interface === 0 && endpoint.usage === 0 && endpoint.usage_page === 0;}
export function ImageUrl() { return "";}Le texte ci-dessus est une structure de base pour un plugin d’appareil.
Nous allons commencer par remplir les champs en haut du plugin avec les informations de notre appareil.
Nous pouvons remplir le champ nom avec le nom de l’appareil.
Trouver les identifiants fournisseur et produit
Section intitulée « Trouver les identifiants fournisseur et produit »Pour trouver l’identifiant fournisseur (Vendor ID) et l’identifiant produit (Product ID), nous devons d’abord ouvrir le menu des paramètres de SignalRGB en utilisant l’icône d’engrenage dans le coin inférieur gauche.

Maintenant, nous devons descendre jusqu’à la page d’informations sur les appareils.

Nous cherchons le VendorID et le ProductID pour l’appareil que nous implémentons. Dans mon cas, il s’agit de la Corsair Scimitar Pro. Le Vendor ID de la Scimitar est 0x1b1c et son Product ID est 0x1b3e.

Maintenant que nous avons le Vendor ID et le Product ID, nous pouvons les renseigner dans le plugin.
Pour remplir le champ Publisher, vous pouvez mettre votre nom !
Nous avons maintenant rempli tous les champs que nous pouvons pour le moment.
Voici notre exemple pour la Scimitar Pro avec les champs remplis.

Création d’un paquet RGB
Section intitulée « Création d’un paquet RGB »Ensuite, nous devons créer une fonction pour envoyer des données de couleur à notre appareil. Nous allons commencer par créer une fonction simple comme celle ci-dessous :
function sendColors(shutdown = false){ let packet = [];}Ensuite, nous devons commencer à remplir notre paquet avec des données, ce que nous ferons en utilisant les données de l’un de nos paquets RGB marqués.
- REMARQUE : Cet appareil est à rembourrage zéro (zero-padded). Cela signifie que nous devons décaler tous nos octets d’une position vers le haut. Apprenez-en plus sur le rembourrage zéro ici.

function sendColors(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
}Nous commençons à remplir les données d’en-tête du paquet comme indiqué ci-dessus. Nous nous arrêtons à la position 4, car la position 5 est notre premier octet de données RGB.
Détermination du type de paquet
Section intitulée « Détermination du type de paquet »Ensuite, nous devons créer notre système de remplissage des couleurs. Il existe plusieurs façons de procéder. La méthode utilisée dépend de la structure des paquets de l’appareil. Voici quelques exemples de paquets de couleurs différents :
function sendZone(zone, shutdown = false){ let packet = []; packet[0] = LongMessage; packet[1] = ConnectionMode; packet[2] = RGBFeatureID; packet[3] = 0x30; packet[4] = zone; packet[5] = 0x01;
var iX = vLedPositions[zone][0]; var iY = vLedPositions[zone][1]; var color; if(shutdown) { color = hexToRgb(shutdownColor); } else if (LightingMode == "Forced") { color = hexToRgb(forcedColor); } else { color = device.color(iX, iY); } packet[6] = color[0]; packet[7] = color[1]; packet[8] = color[2]; packet[9] = 0x02;
device.write(packet, 120);}
function SendPacket(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x00; packet[2] = 0x1F; packet[3] = 0x00; packet[4] = 0x00; packet[5] = 0x00; packet[6] = 0x41; packet[7] = 0x0F; packet[8] = 0x03; packet[13] = 0x13;
for(let iIdx = 0; iIdx < vLedPositions.length; iIdx++) {
let iPxX = vLedPositions[iIdx][0]; let iPxY = vLedPositions[iIdx][1]; var color;
if(shutdown) { color = hexToRgb(shutdownColor); } else if (LightingMode === "Forced") { color = hexToRgb(forcedColor); } else { color = device.color(iPxX, iPxY); }
let iLedIdx = (iIdx*3) + 14; packet[iLedIdx] = color[0]; packet[iLedIdx+1] = color[1]; packet[iLedIdx+2] = color[2]; } device.write(packet, 120);}
function sendColors(shutdown = false){
let packet = []; packet[0x00] = 0x00; packet[0x01] = 0x08; packet[0x02] = 0x12; packet[0x03] = 0x05; packet[0x04] = 0x01;
let zoneId = [1, 2, 3, 4, 5];
for(let zone_idx = 0; zone_idx < vLedPositions.length; zone_idx++) { let iX = vLedPositions[zone_idx][0]; let iY = vLedPositions[zone_idx][1]; var col;
if(shutdown){ col = hexToRgb(shutdownColor); }else if (LightingMode === "Forced") { col = hexToRgb(forcedColor); }else{ col = device.color(iX, iY); }
packet[(zone_idx * 4) + 2] = zoneId[zone_idx]; packet[(zone_idx * 4) + 3] = col[0]; packet[(zone_idx * 4) + 4] = col[1]; packet[(zone_idx * 4) + 5] = col[2]; }
device.write(packet, 120);}Les trois exemples ci-dessus conviennent chacun à une structure de paquet différente. La fonction sendZone est adaptée aux appareils qui utilisent un paquet séparé pour chaque LED. La fonction sendPacket est plus adaptée aux appareils qui envoient plusieurs LEDs consécutivement dans un seul paquet. La fonction sendColors est adaptée aux appareils qui ont plusieurs LEDs dans un paquet, mais qui ne sont pas l’une directement après l’autre. Dans notre cas, nous allons utiliser la fonction sendColors.
function sendColors(shutdown = false){ let packet = [];
packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
let zoneId = [2, 4, 5, 1, 3];
for(let zone_idx = 0; zone_idx < vLedPositions.length; zone_idx++) { let iX = vLedPositions[zone_idx][0]; let iY = vLedPositions[zone_idx][1]; var col;
if(shutdown){ col = hexToRgb(shutdownColor); }else if (LightingMode === "Forced") { col = hexToRgb(forcedColor); }else{ col = device.color(iX, iY); }
packet[(zone_idx * 1) + 2] = zoneId[zone_idx]; packet[(zone_idx * 1) + 3] = col[0]; packet[(zone_idx * 1) + 4] = col[1]; packet[(zone_idx * 1) + 5] = col[2]; }
packet[21] = 0xff; packet[22] = 0xff; packet[23] = 0xff;
device.write(packet, 120);}Pour configurer correctement la fonction sendColors, nous devons déterminer les identifiants de zone de notre appareil. En regardant à nouveau la capture de paquets, nous voyons que l’ordre des zones semble être 2,4,5,1,3 comme indiqué ci-dessous. Notez que nous avons ajouté une 5ème zone car il semble que nous puissions également adresser la LED DPI.

Maintenant que nous avons déterminé nos identifiants de zone, nous devons déterminer nos décalages pour notre zone_idx. Notre première zone est à packet[4] et notre deuxième est à packet[8]. Cela signifie que notre zone_idx doit être multiplié par 4 à chaque fois pour atteindre une nouvelle LED. Nous devons également déterminer combien de positions nous décalons les données RGB. Puisque notre première zone est à packet[5], nous devons juste décaler notre paquet de 5 octets, comme indiqué ci-dessous.
function sendColors(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
let zoneId = [2, 4, 5, 1, 3];
for(let zone_idx = 0; zone_idx < vLedPositions.length; zone_idx++) { let iX = vLedPositions[zone_idx][0]; let iY = vLedPositions[zone_idx][1]; var col;
if(shutdown){ col = hexToRgb(shutdownColor); }else if (LightingMode === "Forced") { col = hexToRgb(forcedColor); }else{ col = device.color(iX, iY); }
packet[(zone_idx * 4) + 5] = zoneId[zone_idx]; packet[(zone_idx * 4) + 6] = col[0]; packet[(zone_idx * 4) + 7] = col[1]; packet[(zone_idx * 4) + 8] = col[2]; }
device.write(packet, 120);}Maintenant que nous avons tout ajouté dans notre paquet, nous devons trouver la longueur de notre paquet. Pour trouver la longueur du paquet, nous devons simplement voir quelle est la longueur de nos données dans Wireshark. En regardant notre exemple, nous pouvons voir que les données font 64 octets dans ce cas.
- REMARQUE : Cet appareil est à rembourrage zéro, ce qui signifie que nous devons augmenter la longueur d’écriture d’un octet de plus que dans la capture Wireshark.

Maintenant que nous connaissons la longueur de nos données, nous devons simplement définir la longueur de device.write à 65 octets, comme indiqué ci-dessous.
function sendColors(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
let zoneId = [2, 4, 5, 1, 3];
for(let zone_idx = 0; zone_idx < vLedPositions.length; zone_idx++) { let iX = vLedPositions[zone_idx][0]; let iY = vLedPositions[zone_idx][1]; var col;
if(shutdown){ col = hexToRgb(shutdownColor); }else if (LightingMode === "Forced") { col = hexToRgb(forcedColor); }else{ col = device.color(iX, iY); }
packet[(zone_idx * 4) + 5] = zoneId[zone_idx]; packet[(zone_idx * 4) + 6] = col[0]; packet[(zone_idx * 4) + 7] = col[1]; packet[(zone_idx * 4) + 8] = col[2]; }
device.write(packet, 65);}Maintenant que notre paquet RGB est configuré, nous devons configurer nos LEDs et choisir les points de terminaison de notre appareil.
Configuration de base des LEDs
Section intitulée « Configuration de base des LEDs »Pour configurer nos LEDs, nous devons ajouter le bon nombre de LEDs à nos tableaux vLedNames et vLedPositions. Dans notre cas, nous devons ajouter quatre LEDs supplémentaires à chacun, comme indiqué ci-dessous.
var vLedNames = [ "Led 1", "Led 2", "Led 3", "Led 4", "Led 5" ];var vLedPositions = [ [0,0], [1,0], [2,0], [3,0], [4,0] ];Nous donnons à ces quatre LEDs des mappages de base pour l’instant, car nous ne savons pas encore où se trouvent physiquement ces LEDs sur notre appareil par rapport à leurs mappages dans SignalRGB.
Maintenant que nous avons mappé nos LEDs, nous devons définir la taille de notre appareil. La taille de l’appareil doit être supérieure d’une unité à notre LED la plus éloignée dans les deux directions. Dans mon cas, la taille doit être [5,1], car notre LED la plus éloignée est à [4,0].
export function Name() { return "Corsair Scimitar Pro"; }export function VendorId() { return 0x1b1c; }export function ProductId() { return 0x1B3E; }export function Publisher() { return "WhirlwindFX"; }export function Documentation(){ return "troubleshooting/corsair"; }export function Size() { return [5,1]; }La prochaine chose à déterminer est le point de terminaison de notre appareil.