Criando um Plugin
Agora que isolamos nossos dados RGB, podemos começar a criar nosso plugin.
Para começar a criar um plugin, vamos abrir um editor de texto e colar o texto abaixo.
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 "";}O texto acima é o layout básico de um plugin de dispositivo.
Vamos começar preenchendo os campos no topo do plugin com informações do nosso dispositivo.
Podemos preencher o campo de nome com o nome do dispositivo.
Encontrando o Vendor ID e o Product ID
Seção intitulada “Encontrando o Vendor ID e o Product ID”Para encontrar o Vendor ID e o Product ID, primeiro precisamos abrir o menu de configurações do SignalRGB usando o ícone de engrenagem no canto inferior esquerdo.

Agora precisamos ir até a página de Informações do Dispositivo.

Estamos procurando o VendorID e o ProductID do dispositivo que estamos implementando. No meu caso, é o Corsair Scimitar Pro. O Vendor ID do Scimitar é 0x1b1c e o Product ID é 0x1b3e.

Agora que temos o Vendor ID e o Product ID, podemos preencher esses campos no plugin.
Para preencher o campo Publisher, você pode colocar seu nome!
Agora preenchemos todos os campos que podemos por enquanto.
Aqui está nosso exemplo para o Scimitar Pro com os campos preenchidos.

Criando um Pacote RGB
Seção intitulada “Criando um Pacote RGB”Em seguida, precisamos criar uma função para enviar dados de cor ao nosso dispositivo. Vamos começar criando uma função simples como a abaixo:
function sendColors(shutdown = false){ let packet = [];}Em seguida, precisamos começar a preencher nosso pacote com alguns dados, o que faremos usando os dados de um dos nossos pacotes RGB marcados.
- NOTA: Este dispositivo usa zero padding. Isso significa que precisamos deslocar todos os nossos bytes 1 posição para cima. Saiba mais sobre zero padding aqui.

function sendColors(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
}Começamos preenchendo os dados de cabeçalho do pacote conforme mostrado acima. Paramos na posição 4, pois a posição 5 é nosso primeiro byte de dados relacionados ao RGB.
Determinando o Tipo de Pacote
Seção intitulada “Determinando o Tipo de Pacote”Em seguida, precisamos criar nosso sistema de preenchimento de cores. Existem algumas maneiras diferentes de fazer isso. O método usado depende da estrutura de pacotes do dispositivo. Aqui estão alguns exemplos diferentes de pacotes de cor:
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);}Os três exemplos acima são adequados para estruturas de pacotes diferentes. A função sendZone é boa para dispositivos que usam um pacote separado para cada LED. A função sendPacket é mais adequada para dispositivos que enviam múltiplos LEDs em sequência dentro de um único pacote. A função sendColors é adequada para dispositivos que têm múltiplos LEDs em um pacote, mas não estão diretamente um após o outro. No nosso caso, vamos usar a função 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);}Para configurar corretamente a função sendColors, precisamos descobrir os Zone IDs do nosso dispositivo. Olhando novamente para a captura de pacotes, vemos que a ordem das zonas parece ser 2,4,5,1,3 conforme mostrado abaixo. Observe que adicionamos uma 5ª zona, pois parece que também podemos endereçar o LED de DPI.

Agora que descobrimos nossos Zone IDs, precisamos descobrir os offsets para nosso zone_idx. Nossa primeira zona está em packet[4] e a segunda em packet[8]. Isso significa que nosso zone_idx precisa ser multiplicado por 4 a cada vez para chegar a um novo LED. Também precisamos descobrir quantas posições deslocamos os dados RGB. Como nossa primeira zona está em packet[5], só precisamos deslocar nosso pacote em 5 bytes, conforme mostrado abaixo.
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);}Agora que adicionamos tudo o que precisa ir no nosso pacote, precisamos encontrar o comprimento do pacote. Para encontrar o comprimento do pacote, só precisamos ver o tamanho dos nossos dados no Wireshark. Olhando nosso exemplo, podemos ver que os dados têm 64 bytes de comprimento neste caso.
- NOTA: Este dispositivo usa zero padding, o que significa que precisamos deixar o comprimento de escrita um byte a mais do que aparece na captura do Wireshark.

Agora que sabemos o comprimento dos nossos dados, só precisamos definir o comprimento do device.write para 65 bytes, conforme mostrado abaixo.
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);}Agora que configuramos nosso pacote RGB, precisamos configurar nossos LEDs e escolher os endpoints do dispositivo.
Configuração Básica de LEDs
Seção intitulada “Configuração Básica de LEDs”Para configurar nossos LEDs, precisamos adicionar o número correto de LEDs aos nossos vLedNames e vLedPositions. No nosso caso, precisamos adicionar mais quatro LEDs a cada um, conforme mostrado abaixo.
var vLedNames = [ "Led 1", "Led 2", "Led 3", "Led 4", "Led 5" ];var vLedPositions = [ [0,0], [1,0], [2,0], [3,0], [4,0] ];Estamos dando a esses quatro LEDs mapeamentos básicos por enquanto, pois não sabemos onde esses LEDs estão fisicamente no dispositivo em relação aos seus mapeamentos dentro do SignalRGB.
Agora que mapeamos nossos LEDs, precisamos definir o tamanho do dispositivo. O tamanho do dispositivo precisa ser um a mais do que o LED mais distante em ambas as direções. No meu caso, o tamanho precisa ser [5,1], pois nosso LED mais distante está em [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]; }A próxima coisa que precisamos descobrir é o endpoint do nosso dispositivo.