Przejdź do głównej zawartości

Używanie komponentów

Włączanie systemu komponentów w wtyczce składa się z 2 etapów.

  1. Włączenie interfejsu komponentów
  2. Pobieranie wartości kolorów z komponentów wybranych przez użytkownika

Pierwszym krokiem do włączenia interfejsu komponentów jest zdefiniowanie kanałów urządzenia dla SignalRGB. Jako przykładu użyjemy Corsair Node Pro. Zacznij od stworzenia tablicy opisującej wygląd naszych kanałów, a następnie wyślij ją do backendu SignalRGB w funkcji initialize, aby zostały utworzone przed próbą renderowania czegokolwiek.

const DeviceMaxLedLimit = 204;
//Channel Name, Led Limit
var ChannelArray = [
["Channel 1", 204],
["Channel 2", 204],
]
function SetupChannels(){
device.SetLedLimit(DeviceMaxLedLimit);
for(let i = 0; i < ChannelArray.length; i++){
device.addChannel(ChannelArray[i][0],ChannelArray[i][1]);
}
}

W powyższym kodzie widać dwuwymiarową tablicę dla naszych kanałów, gdzie każdy element składa się z nazwy kanału, a następnie limitu LED. W SetupChannels() ustawiamy całkowity limit LED, a następnie iteracyjnie wywołujemy device.addChannel dla każdego elementu w naszej tablicy.

Tę pętlę można również wykonać bezpośrednio bez tablicy, jeśli chcesz zakodować ją na stałe.

function SetupChannels(){
device.SetLedLimit(204);
device.addChannel("Channel 1",204);
device.addChannel("Channel 2",204);
}

Wywołaj funkcję SetupChannels w ramach Initialize, aby zakończyć inicjalizację urządzenia.

export function Initialize()
{
SetupChannels()
}

Zapisz zmiany w pliku, a twoje kanały pojawią się na stronie urządzenia. Następnie zajmiemy się pobieraniem wartości kolorów z wybranych komponentów.

Po skonfigurowaniu kanałów musimy pobierać z nich kolory — tutaj przydaje się przechowywanie nazw kanałów w tablicy.

Ogólna idea jest następująca:

Dla każdego kanału → Dla każdego komponentu na kanale → getColors()

Wszystko to jest zawarte w funkcji device.channel().getColors(). Corsair Node Pro wysyła dane kolorów po jednym kanale na raz, więc chcemy zachować dane “oddzielnie”, aby to ułatwić.

Zobaczysz tu jeszcze jeden dodatkowy element: sprawdzamy LedCount() kanału i jeśli zwraca 0, pulsujemy kanały dla użytkownika. To przydatna wskazówka, że musi jeszcze skonfigurować kanały.

Poniżej znajdziesz przykłady kodu dla normalnego scenariusza użycia, zakodowanego na stałe i bez sprawdzania pulsu kanału.

function SendChannel(Channel)
{
let ChannelLedCount = device.channel(ChannelArray[Channel][0]).LedCount();
let ColorData = []
if(device.getLedCount() == 0){
ChannelLedCount = 80;
let pulseColor = device.getChannelPulseColor(ChannelArray[Channel][0], ChannelLedCount);
ColorData = device.createColorArray(pulseColor, ChannelLedCount, "Seperate");
}else{
ColorData = device.channel(ChannelArray[Channel][0]).getColors("Seperate");
}
let RedChannelData = ColorData[0]
let GreenChannelData = ColorData[1]
let BlueChannelData = ColorData[2]
//...
}
function SendChannel1()
{
let ChannelLedCount = device.channel("Channel 1").LedCount();
let ColorData = []
if(device.getLedCount() == 0){
ChannelLedCount = 80;
let pulseColor = device.getChannelPulseColor("Channel 1", ChannelLedCount);
ColorData = device.createColorArray(pulseColor, ChannelLedCount, "Seperate");
}else{
ColorData = device.channel("Channel 1").getColors("Seperate");
}
let RedChannelData = ColorData[0]
let GreenChannelData = ColorData[1]
let BlueChannelData = ColorData[2]
//...
}
SendChannel(Channel)
{
let ColorData = []
ColorData = device.channel(ChannelArray[Channel][0]).getColors("Seperate");
let RedChannelData = ColorData[0]
let GreenChannelData = ColorData[1]
let BlueChannelData = ColorData[2]
//...
}

Na koniec po prostu wywołujemy tę funkcję w pętli renderowania. Dolna część funkcji SendChannel zawiera kod do konwersji tablic kolorów na pakiety i wysyłania ich do urządzenia. To jest specyficzne dla urządzenia i coś, co musisz sam odtworzyć metodą inżynierii wstecznej!

export function Render()
{
SendChannel(0);
device.pause(1);
SendChannel(1);
device.pause(1);
SubmitLightingColors();
}

Niektóre urządzenia odbiegają od standardowego wzorca, lub może próbujesz czegoś nowego w swojej wtyczce i musisz pracować z poszczególnymi komponentami. W takich przypadkach nie możemy używać device.channel().getColors() i musimy zamiast tego sami iterować przez poszczególne komponenty.

W tym celu używamy device.channel().getComponentNames() do uzyskania wszystkich ID komponentów, a następnie iterujemy przez nie z device.channel().getComponentColors(), aby uzyskać indywidualne tablice kolorów.

Poniższy przykład po prostu łączy poszczególne tablice, ale możesz robić cokolwiek potrzebujesz pomiędzy nimi.

let components = device.channel("Channel 1").getComponentNames();
for(let i = 0; i < components.length;i++){
let ComponentColors = device.channel("Channel 1").getComponentColors(components[i]);
RGBData = RGBData.concat(ComponentColors)
}

Jeśli chcesz naprawdę zagłębić się w swoją wtyczkę, możesz używać device.channel.getComponent().