Lewati ke konten

Creating a Plugin

Sekarang setelah kami memiliki data RGB yang terisolasi, kami dapat mulai membuat plugin kami.

Untuk mulai membuat plugin, kami akan membuka editor teks dan menempel teks di bawah ini.

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 tata letak dasar untuk plugin perangkat.

Kami akan mulai dengan mengisi field di bagian atas plugin dengan informasi untuk perangkat kami.

Kami dapat mengisi field name dengan nama perangkat.

Untuk menemukan Vendor ID dan Product ID, kita perlu membuka menu pengaturan SignalRGB menggunakan ikon roda gigi di sudut kiri bawah.

Sekarang, kita perlu pergi ke halaman Device Information.

Kami mencari VendorID dan ProductID untuk perangkat yang kami implementasikan. Dalam kasus ini, ini adalah Corsair Scimitar Pro. Vendor ID Scimitar adalah 0x1b1c dan Product ID-nya adalah 0x1b3e.

Sekarang setelah kami memiliki Vendor dan Product ID, kami dapat mengisi field tersebut di plugin.

Untuk mengisi field Publisher, Anda dapat memasukkan nama Anda!

Sekarang, kami telah mengisi semua field yang saat ini kami bisa.

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

Selanjutnya, kita perlu membuat fungsi untuk mengirim data warna ke perangkat kita. Kita akan mulai dengan membuat fungsi sederhana seperti yang di bawah ini:

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

Selanjutnya, kita perlu mulai mengisi paket kita dengan beberapa data, yang akan kita lakukan dengan menggunakan data dari salah satu paket RGB yang telah kita tandai.

  • CATATAN: Perangkat ini zero-padded. Ini berarti kita perlu menggeser semua byte kita 1 posisi ke atas. Pelajari tentang zero padding di sini.

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

Kami mulai mengisi data header untuk paket seperti yang ditunjukkan di atas. Kami berhenti di posisi 4, karena posisi 5 adalah byte pertama data terkait RGB kami.

Selanjutnya, kita perlu membuat sistem pengisian warna kita. Ada beberapa cara berbeda yang dapat dilakukan. Metode yang digunakan bergantung pada struktur paket perangkat. Berikut adalah beberapa contoh paket warna yang berbeda:

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

Tiga contoh di atas masing-masing cocok untuk struktur paket yang berbeda. Fungsi sendZone cocok untuk perangkat yang menggunakan paket terpisah untuk setiap LED. Fungsi sendPacket lebih cocok untuk perangkat yang mengirim beberapa LED berturut-turut dalam satu paket. Fungsi sendColors cocok untuk perangkat yang memiliki beberapa LED dalam paket, tetapi tidak langsung berurutan. Dalam kasus kami, kami 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 * 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);
}

Untuk mengatur fungsi sendColors dengan benar, kita perlu menentukan Zone ID untuk perangkat kita. Melihat tangkapan paket lagi, kita melihat bahwa urutan zona tampaknya adalah 2,4,5,1,3 seperti yang ditunjukkan di bawah. Perhatikan bahwa kami menambahkan zona ke-5 karena tampaknya kami juga dapat menangani LED DPI.

Sekarang setelah kami mengetahui Zone ID kami, kita perlu menentukan offset kami untuk zone_idx. Zona pertama kami ada di packet[4], dan yang kedua ada di packet[8]. Ini berarti zone_idx kita perlu dikalikan 4 setiap kali untuk mencapai LED baru. Kami juga perlu mengetahui berapa banyak posisi kami menggeser data RGB. Karena zona pertama kami ada di packet[5], kami hanya perlu mengimbangi paket kami sebesar 5 byte, seperti yang terlihat di bawah.

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

Sekarang setelah kami menambahkan semua yang perlu masuk ke paket kami, kita perlu menentukan panjang paket kita. Untuk menemukan panjang paket, kita hanya perlu melihat panjang data dari Wireshark. Melihat contoh kami, kita dapat melihat bahwa datanya adalah 64 byte dalam kasus ini.

  • CATATAN: Perangkat ini zero-padded, yang berarti kita perlu membuat panjang write satu lebih panjang dari yang ada dalam tangkapan Wireshark.

Sekarang setelah kami mengetahui panjang data kami, kita hanya perlu mengatur panjang device.write kami ke 65 byte, seperti yang ditunjukkan di bawah.

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

Sekarang setelah kami menyiapkan paket RGB kami, kita perlu menyiapkan LED kami dan memilih endpoint perangkat kami.

Untuk menyiapkan LED kami, kita perlu menambahkan jumlah LED yang benar ke vLedNames dan vLedPositions kami. Dalam kasus kami, kita perlu menambahkan empat LED lagi ke 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] ];

Kami memberikan empat LED ini pemetaan dasar untuk saat ini karena kami tidak tahu di mana LED ini berada secara fisik pada perangkat kami sehubungan dengan pemetaan mereka di dalam SignalRGB.

Sekarang setelah kami memetakan LED kami, kita perlu mengatur ukuran perangkat kami. Ukuran perangkat kami harus satu lebih besar dari LED kami yang paling jauh di kedua arah. Dalam kasus saya, ukurannya harus [5,1], karena LED kami yang paling jauh ada 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]; }

Hal berikutnya yang perlu kami cari tahu adalah endpoint perangkat kami.