Criando um Plugin
Agora que isolámos os nossos dados RGB, podemos começar a criar o 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 por preencher 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 definições do SignalRGB usando o ícone de engrenagem no canto inferior esquerdo.

Agora precisamos ir à página de Informações do Dispositivo.

Estamos à procura do VendorID e do ProductID do dispositivo que estamos a implementar. 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, pode colocar o seu nome!
Agora preenchemos todos os campos que podemos por agora.
Aqui está o 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 o nosso pacote com alguns dados, o que faremos usando os dados de um dos nossos pacotes RGB marcados.
- NOTA: Este dispositivo usa zero padding. Isto significa que precisamos deslocar todos os nossos bytes 1 posição acima. 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 por preencher os dados de cabeçalho do pacote conforme mostrado acima. Paramos na posição 4, pois a posição 5 é o nosso primeiro byte de dados relacionados com o RGB.
Determinando o Tipo de Pacote
Seção intitulada “Determinando o Tipo de Pacote”Em seguida, precisamos criar o nosso sistema de preenchimento de cores. Existem algumas formas diferentes de o fazer. 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 num 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 adicionámos uma 5ª zona, pois parece que também podemos endereçar o LED de DPI.

Agora que descobrimos os nossos Zone IDs, precisamos descobrir os offsets para o nosso zone_idx. A nossa primeira zona está em packet[4] e a segunda em packet[8]. Isto significa que o nosso zone_idx precisa de 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 a nossa primeira zona está em packet[5], só precisamos de deslocar o 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 adicionámos tudo o que precisa de 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 o 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 configurámos o nosso pacote RGB, precisamos configurar os 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 os 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 a dar a esses quatro LEDs mapeamentos básicos por agora, pois não sabemos onde esses LEDs estão fisicamente no dispositivo em relação aos seus mapeamentos dentro do SignalRGB.
Agora que mapeámos os nossos LEDs, precisamos definir o tamanho do dispositivo. O tamanho do dispositivo precisa de 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 o 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.