Skapa ett plugin
Nu när vi har isolerat våra RGB-data kan vi börja skapa vårt plugin.
För att börja skapa pluginet öppnar vi en textredigerare och klistrar in följande text.
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 "";}Texten ovan är en grundläggande layout för ett enhetsplugin.
Vi börjar fylla i fälten längst upp i pluginet med information om vår enhet.
Vi kan fylla i namnfältet med enhetens namn.
Hitta Vendor ID och Product ID
Section titled “Hitta Vendor ID och Product ID”För att hitta Vendor ID och Product ID behöver vi först öppna inställningsmenyn i SignalRGB med kugghjulsikonen längst ned till vänster.

Nu behöver vi gå till sidan Enhetsinformation.

Vi letar efter VendorID och ProductID för den enhet vi implementerar. I mitt fall är det Corsair Scimitar Pro. Scimitars Vendor ID är 0x1b1c och Product ID är 0x1b3e.

Nu när vi har Vendor ID och Product ID kan vi fylla i dessa fält i pluginet.
Du kan fylla i Publisher-fältet med ditt namn!
Nu har vi fyllt i alla fält vi kan fylla i för tillfället.
Här är vårt exempel för Scimitar Pro med ifyllda fält.

Skapa RGB-paketet
Section titled “Skapa RGB-paketet”Härnäst behöver vi skapa en funktion för att skicka färgdata till vår enhet. Vi börjar med att skapa en enkel funktion som följande:
function sendColors(shutdown = false){ let packet = [];}Sedan behöver vi börja fylla paketet med lite data med hjälp av data från ett av de RGB-paket vi markerade.
- OBS: Den här enheten har nollutfyllning. Det innebär att vi behöver flytta alla våra bytes 1 position uppåt. Läs om nollutfyllning här.

function sendColors(shutdown = false){ let packet = []; packet[0] = 0x00; packet[1] = 0x07; packet[2] = 0x22; packet[3] = 0x05; packet[4] = 0x01;
}Som visas ovan börjar vi fylla i huvuddata för paketet. Vi stannar vid position 4 eftersom position 5 är vår första byte som är relaterad till RGB.
Bestämma pakettypen
Section titled “Bestämma pakettypen”Härnäst behöver vi bygga vårt färgfyllningssystem. Det finns ett par olika sätt att göra det. Metoden som används beror på enhetens paketstruktur. Här är ett par olika exempel på färgpaket:
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);}De tre exemplen ovan passar var och en för en annan paketstruktur. Funktionen sendZone passar för enheter som använder ett separat paket per lysdiod. Funktionen sendPacket passar bättre för enheter som skickar flera lysdioder i rad i ett enda paket. Funktionen sendColors passar för enheter som har flera lysdioder i paketet men där de inte är direkt efter varandra. I vårt fall använder vi funktionen 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);}För att ställa in funktionen sendColors korrekt behöver vi hitta Zon-ID:n för vår enhet. Om vi tittar på paketinspelningen igen ser vi att zonordningen är 2,4,5,1,3 som visas nedan. Notera att vi lade till zon 5 eftersom vi också kunde adressera DPI-lysdioden.

Nu när vi löst ut våra Zon-ID:n behöver vi hitta offsetarna för zone_idx. Vår första zon är i packet[4] och vår andra zon är i packet[8]. Det innebär att zone_idx behöver multipliceras med 4 för varje ny lysdiod vi ska nå. Vi behöver också ta reda på hur många positioner vi förskjuter RGB-data. Eftersom vår första zon är i packet[5] behöver vi bara förskjuta paketet med 5 bytes som visas nedan.
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);}Nu när vi ställt in vårt RGB-paket behöver vi ställa in våra lysdioder och välja enhetens slutpunkter.
Grundläggande LED-inställning
Section titled “Grundläggande LED-inställning”För att ställa in våra lysdioder behöver vi lägga till rätt antal lysdioder i vLedNames och vLedPositions. I vårt fall behöver vi lägga till fyra lysdioder till varje, som visas nedan.
var vLedNames = [ "Led 1", "Led 2", "Led 3", "Led 4", "Led 5" ];var vLedPositions = [ [0,0], [1,0], [2,0], [3,0], [4,0] ];Vi ger dessa fyra lysdioder grundläggande mappningar för tillfället eftersom vi inte vet var de fysiskt sitter på enheten i förhållande till mappningarna i SignalRGB.
När vi har mappat våra lysdioder behöver vi ställa in vår enhetsstorlek. Vår enhetsstorlek behöver vara en större än vår längst bort befintliga lysdiod i båda riktningarna. I mitt fall, eftersom den längst bort befintliga lysdioden är vid [4,0], behöver storleken vara [5,1].
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]; }Därefter behöver vi hitta slutpunkten för vår enhet.