تخطَّ إلى المحتوى

إنشاء إضافة

الآن بعد أن عزلنا بيانات RGB، يمكننا البدء في إنشاء الإضافة.

لبدء إنشاء إضافة، سنفتح محرر نصوص ونلصق النص أدناه.

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

النص أعلاه هو تخطيط أساسي لإضافة جهاز.

سنبدأ بملء الحقول في أعلى الإضافة بمعلومات جهازنا.

يمكننا ملء حقل الاسم باسم الجهاز.

العثور على معرّفي الشركة المصنّعة والمنتج

Section titled “العثور على معرّفي الشركة المصنّعة والمنتج”

للعثور على معرّف الشركة المصنّعة (Vendor ID) ومعرّف المنتج (Product ID)، نحتاج أولًا إلى فتح قائمة الإعدادات في SignalRGB باستخدام أيقونة الترس في الزاوية السفلية اليسرى.

الآن، نحتاج إلى النزول إلى صفحة معلومات الجهاز.

نبحث عن VendorID وProductID للجهاز الذي ننفّذ دعمه. في حالتي، هذا الجهاز هو Corsair Scimitar Pro. معرّف الشركة المصنّعة لـ Scimitar هو 0x1b1c ومعرّف المنتج هو 0x1b3e.

الآن بعد أن حصلنا على معرّفي الشركة المصنّعة والمنتج، يمكننا ملء هذين الحقلين في الإضافة.

لملء حقل Publisher، يمكنك وضع اسمك!

الآن، ملأنا جميع الحقول التي يمكننا ملؤها في الوقت الحالي.

إليك مثالنا لـ Scimitar Pro مع ملء الحقول.

بعد ذلك، نحتاج إلى إنشاء دالة لإرسال بيانات الألوان إلى جهازنا. سنبدأ بإنشاء دالة بسيطة مثل الدالة أدناه:

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

بعد ذلك، نحتاج إلى البدء في ملء الحزمة ببعض البيانات، وسنفعل ذلك باستخدام البيانات من إحدى حزم RGB التي وضعنا عليها علامات.

  • ملاحظة: يستخدم هذا الجهاز الحشو الصفري. وهذا يعني أننا نحتاج إلى إزاحة جميع البايتات بمقدار موضع واحد. تعرّف على الحشو الصفري هنا.

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

نبدأ بملء بيانات ترويسة الحزمة كما هو موضح أعلاه. نتوقف عند الموضع 4، لأن الموضع 5 هو أول بايت من البيانات المتعلقة بـ RGB.

بعد ذلك، نحتاج إلى إنشاء نظام ملء الألوان. هناك عدة طرق مختلفة يمكن القيام بذلك من خلالها. تعتمد الطريقة المستخدمة على بنية حزمة الجهاز. إليك بعض الأمثلة المختلفة لحزم الألوان:

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

كل مثال من الأمثلة الثلاثة أعلاه مناسب لبنية حزمة مختلفة. الدالة sendZone مناسبة للأجهزة التي تستخدم حزمة منفصلة لكل مصباح LED. والدالة sendPacket أكثر ملاءمة للأجهزة التي ترسل عدة مصابيح LED متتالية داخل حزمة واحدة. أما الدالة sendColors فمناسبة للأجهزة التي تحتوي على عدة مصابيح LED في حزمة واحدة، لكنها ليست متتالية مباشرة. في حالتنا، سنستخدم الدالة 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);
}

لإعداد الدالة sendColors بشكل صحيح، نحتاج إلى معرفة معرّفات المناطق (Zone ID) لجهازنا. بالنظر إلى التقاط الحزم مرة أخرى، نرى أن ترتيب المناطق يبدو 2,4,5,1,3 كما هو موضح أدناه. لاحظ أننا أضفنا منطقة خامسة، إذ يبدو أنه يمكننا مخاطبة مصباح DPI أيضًا.

الآن بعد أن عرفنا معرّفات المناطق، نحتاج إلى معرفة الإزاحات الخاصة بـ zone_idx. أول منطقة لدينا في packet[4]، والثانية في packet[8]. وهذا يعني أن zone_idx يجب ضربه في 4 في كل مرة للوصول إلى مصباح LED جديد. نحتاج أيضًا إلى معرفة عدد المواضع التي نزيح بها بيانات RGB. بما أن أول منطقة لدينا في packet[5]، فنحتاج فقط إلى إزاحة الحزمة بمقدار 5 بايتات، كما هو موضح أدناه.

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

الآن بعد أن أضفنا كل ما يجب أن يدخل في الحزمة، نحتاج إلى معرفة طول الحزمة. لمعرفة طول الحزمة، نحتاج فقط إلى رؤية طول بياناتنا في Wireshark. بالنظر إلى مثالنا، يمكننا أن نرى أن طول البيانات في هذه الحالة هو 64 بايت.

  • ملاحظة: يستخدم هذا الجهاز الحشو الصفري، مما يعني أننا نحتاج إلى جعل طول الكتابة أطول بمقدار بايت واحد مما هو عليه في التقاط Wireshark.

الآن بعد أن عرفنا طول بياناتنا، نحتاج فقط إلى ضبط طول device.write على 65 بايت، كما هو موضح أدناه.

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

الآن بعد أن أعددنا حزمة RGB، نحتاج إلى إعداد مصابيح LED واختيار نقاط النهاية لجهازنا.

الإعداد الأساسي لمصابيح LED

Section titled “الإعداد الأساسي لمصابيح LED”

لإعداد مصابيح LED، نحتاج إلى إضافة العدد الصحيح من مصابيح LED إلى vLedNames وvLedPositions. في حالتنا، نحتاج إلى إضافة أربعة مصابيح LED أخرى إلى كل منهما، كما هو موضح أدناه.

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

نمنح هذه المصابيح الأربعة مواضع أساسية في الوقت الحالي، لأننا لا نعرف أين تقع فعليًا على جهازنا بالنسبة لمواضعها داخل SignalRGB.

الآن بعد أن ربطنا مصابيح LED، نحتاج إلى ضبط حجم الجهاز. يجب أن يكون حجم الجهاز أكبر بمقدار واحد من أبعد مصباح LED في كلا الاتجاهين. في حالتي، يجب أن يكون الحجم [5,1]، لأن أبعد مصباح LED لدينا في [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]; }

الأمر التالي الذي نحتاج إلى معرفته هو نقطة النهاية لجهازنا.