Skip to content

Mencipta Plugin

Kini setelah data RGB kami diasingkan, kita boleh mula mencipta plugin kami.

Untuk mula mencipta plugin, kita akan membuka editor teks dan menampal teks di bawah.

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 "";
}

Teks di atas adalah susun atur asas untuk plugin peranti.

Kita akan mulakan dengan mengisi medan di bahagian atas plugin dengan maklumat untuk peranti kita.

Kita boleh mengisi medan nama dengan nama peranti.

Untuk Mencari ID Vendor dan ID Produk, kita perlu membuka menu tetapan SignalRGB terlebih dahulu dengan menggunakan ikon gear di sudut kiri bawah.

Sekarang, kita perlu turun ke halaman Maklumat Peranti.

Kita mencari VendorID dan ProductID untuk peranti yang kita laksanakan. Dalam kes saya, ini adalah Corsair Scimitar Pro. VendorID Scimitar adalah 0x1b1c dan ProductID-nya adalah 0x1b3e.

Kini setelah kita mempunyai ID Vendor dan Produk, kita boleh mengisi medan tersebut pada plugin.

Untuk mengisi medan Publisher, Anda boleh meletakkan nama Anda!

Kini kita telah mengisi semua medan yang boleh kita isi buat masa ini.

Berikut adalah contoh kami untuk Scimitar Pro dengan medan yang diisi.

Seterusnya, kita perlu mencipta fungsi untuk menghantar data warna ke peranti kita. Kita akan mulakan dengan mencipta fungsi mudah seperti yang di bawah:

function sendColors(shutdown = false)
{
let packet = [];
}

Seterusnya, kita perlu mula mengisi paket kita dengan beberapa data, yang akan kita lakukan dengan menggunakan data dari salah satu paket RGB bertanda kami.

  • NOTA: Peranti ini adalah sifar-padded. Ini bermakna kita perlu menganjak semua bait kita naik 1 kedudukan. Ketahui tentang sifar padding di sini.

function sendColors(shutdown = false)
{
let packet = [];
packet[0] = 0x00;
packet[1] = 0x07;
packet[2] = 0x22;
packet[3] = 0x05;
packet[4] = 0x01;
}

Kita mula mengisi data pengepala untuk paket seperti yang ditunjukkan di atas. Kita berhenti pada kedudukan 4, kerana kedudukan 5 adalah bait pertama data RGB kami.

Seterusnya, kita perlu mencipta sistem pengisian warna kita. Terdapat beberapa cara berbeza yang boleh dilakukan. Kaedah yang digunakan bergantung pada struktur paket peranti. Berikut adalah beberapa contoh paket warna berbeza:

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);
}

Tiga contoh di atas masing-masing sesuai untuk struktur paket yang berbeza. Fungsi sendZone sesuai untuk peranti yang menggunakan paket berasingan untuk setiap LED. Fungsi sendPacket lebih sesuai untuk peranti yang menghantar berbilang LED berturut-turut dalam satu paket. Fungsi sendColors sesuai untuk peranti yang mempunyai berbilang LED dalam paket, tetapi mereka tidak berada satu selepas yang lain secara langsung. Dalam kes kami, kita akan menggunakan fungsi 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 * 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);
}

Kini setelah kita menambah semua yang perlu masuk ke dalam paket kita, kita perlu mencari panjang paket kita. Untuk mencari panjang paket, kita hanya perlu melihat berapa panjang data dari Wireshark kita. Melihat contoh kami, kita dapat melihat bahawa data adalah 64 bait panjang dalam kes ini.

  • NOTA: Peranti ini adalah sifar-padded, yang bermakna kita perlu menjadikan panjang penulisan satu lebih panjang daripada yang ada dalam tangkapan Wireshark.

Kini setelah kita mengetahui panjang data kita, kita hanya perlu menetapkan panjang device.write kita kepada 65 bait, seperti yang ditunjukkan di bawah.

Kini setelah kita menyediakan paket RGB kita, kita perlu menyediakan LED kita dan memilih endpoint peranti kita.

Untuk menyediakan LED kita, kita perlu menambah bilangan LED yang betul kepada vLedNames dan vLedPositions kita. Dalam kes kami, kita perlu menambah empat LED lagi kepada masing-masing, seperti yang ditunjukkan di bawah.

var vLedNames = [ "Led 1", "Led 2", "Led 3", "Led 4", "Led 5" ];
var vLedPositions = [ [0,0], [1,0], [2,0], [3,0], [4,0] ];

Kita memberikan empat LED ini pemetaan asas buat masa ini kerana kita tidak tahu di mana LED ini terletak secara fizikal pada peranti berkenaan dengan pemetaannya dalam SignalRGB.

Kini setelah kita memetakan LED kita, kita perlu menetapkan saiz peranti kita. Saiz peranti kita perlu satu lebih besar daripada LED paling jauh kita dalam kedua-dua arah. Dalam kes saya, saiznya perlu [5,1], kerana LED paling jauh kami adalah di [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]; }

Perkara seterusnya yang perlu kita ketahui adalah endpoint peranti kita.