Kreiranje plugina
Sada kada smo izolovali naše RGB podatke, možemo početi sa kreiranjem našeg plugina.
Da bismo kreirali plugin, otvaramo tekstualni editor i nalepimo sledeći tekst.
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 "";}Gornji tekst je osnovna struktura za plugin uređaja.
Počećemo popunjavanjem polja na početku plugina informacijama o našem uređaju.
U polje naziva možemo uneti naziv uređaja.
Pronalaženje Vendor i Product ID-ova
Section titled “Pronalaženje Vendor i Product ID-ova”Da bismo pronašli Vendor ID i Product ID, moramo najpre otvoriti meni podešavanja SignalRGBa putem ikone zupčanika u donjem levom uglu.

Sada moramo navigovati do stranice “Informacije o uređaju”.

Tražimo VendorID i ProductID za uređaj koji implementiramo. U mom slučaju to je Corsair Scimitar Pro. Vendor ID Scimitara je 0x1b1c, a Product ID je 0x1b3e.

Sada kada imamo Vendor i Product ID, možemo popuniti ta polja u pluginu.
Polje Publisher možete popuniti svojim imenom!
Ovim smo za sada popunili sva polja koja možemo.
Evo našeg primera za Scimitar Pro sa popunjenim poljima.

Kreiranje RGB paketa
Section titled “Kreiranje RGB paketa”Zatim moramo kreirati funkciju za slanje podataka o bojama našem uređaju. Počećemo kreiranjem jednostavne funkcije poput sledeće:
function sendColors(shutdown = false){ let packet = [];}Zatim moramo napuniti naš paket podacima. Da bismo to uradili, koristimo podatke iz jednog od naših označenih RGB paketa.
- NAPOMENA: Ovaj uređaj koristi zero-padding. To znači da moramo pomeriti sve bajtove za 1 poziciju gore. Saznajte više o zero-paddingu ovde.

function sendColors(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
}Počinjemo umetanjem zaglavnih podataka paketa kao što je prikazano gore. Stajemo na poziciji 4, jer je pozicija 5 naš prvi bajt podataka o RGB-u.
Određivanje tipa paketa
Section titled “Određivanje tipa paketa”Zatim moramo kreirati naš sistem punjenja bojama. Postoji nekoliko različitih načina za to. Metoda koja se koristi zavisi od strukture paketa uređaja. Evo nekoliko primera različitih paketa boja:
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);}Tri primera iznad su pogodna za različite strukture paketa. Funkcija sendZone je pogodna za uređaje koji koriste poseban paket za svaku LED diodu. Funkcija sendPacket je pogodnija za uređaje koji šalju više LED dioda uzastopno u jednom paketu. Funkcija sendColors je pogodna za uređaje koji imaju više LED dioda u paketu, ali ne direktno uzastopno. U našem slučaju koristićemo funkciju 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);}Da bismo ispravno podesili funkciju sendColors, moramo pronaći ID-ove zona našeg uređaja. Kada ponovo pogledamo snimak paketa, vidimo da redosled zona izgleda da je 2, 4, 5, 1, 3, kao što je prikazano ispod. Imajte na umu da smo dodali 5. zonu jer izgleda da možemo kontrolisati i DPI LED.

Sada kada smo pronašli ID-ove zona, moramo odrediti naše pomake za zone_idx. Naša prva zona je na packet[4], a druga na packet[8]. To znači da zone_idx mora biti množen sa 4 svaki put da bi se prešlo na sledeću LED. Moramo takođe saznati za koliko pozicija treba pomeriti RGB podatke. Pošto je naša prva zona na packet[5], treba samo da pomerimo naš paket za 5 bajtova, kao što se vidi ispod.
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);}Sada kada smo dodali sve što pripada u naš paket, moramo odrediti dužinu paketa. Da bismo pronašli dužinu paketa, treba samo da proverimo koliko je dugačak naš paket u Wiresharku. U našem primeru vidimo da su podaci u ovom slučaju dugački 64 bajta.
- NAPOMENA: Ovaj uređaj koristi zero-padding, što znači da moramo postaviti dužinu pisanja za jedan veću nego u Wireshark snimku.

Pošto sada znamo dužinu naših podataka, treba samo da postavimo dužinu device.write na 65 bajtova, kao što je prikazano ispod.
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);}Sada kada smo podesili naš RGB paket, moramo podesiti naše LED diode i izabrati endpoint uređaja.
Osnovno podešavanje LED dioda
Section titled “Osnovno podešavanje LED dioda”Da bismo podesili naše LED diode, moramo dodati odgovarajući broj LED dioda u naše vLedNames i vLedPositions. U našem slučaju moramo dodati još četiri LED diode u oba, kao što je prikazano ispod.
var vLedNames = [ "Led 1", "Led 2", "Led 3", "Led 4", "Led 5" ];var vLedPositions = [ [0,0], [1,0], [2,0], [3,0], [4,0] ];Ovim četirima LED diodama dajemo za sada osnovna mapiranja, pošto još ne znamo gde su ove LED diode fizički postavljene na uređaju u odnosu na njihova mapiranja unutar SignalRGBa.
Sada kada smo mapirali naše LED diode, moramo postaviti veličinu uređaja. Naša veličina uređaja mora biti za jedan veća od naše najudaljenije LED diode u oba pravca. U mom slučaju veličina mora biti [5,1], jer je naša najudaljenija LED na [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]; }Zatim moramo odrediti endpoint našeg uređaja.