Przejdź do głównej zawartości

Zapisy i odczyty

Te funkcje to wszystkie dostępne sposoby komunikacji z podłączonymi urządzeniami USB w twoich wtyczkach. Polecenia są podzielone na dwie odmiany odczytu i zapisu, w zależności od protokołów urządzenia, oraz przesyły sterujące umożliwiające polecenia uzgadniania i zaawansowaną funkcjonalność.

Dla zaawansowanych metod (bulk_transfer, control_transfer, input_report) oraz komunikacji sieciowej/szeregowej, patrz Zaawansowana komunikacja.

Ta funkcja wykonuje polecenie Hid_Write na aktualnie wybranym punkcie końcowym urządzenia. To jest funkcja zapisu używana przez większość urządzeń i najczęściej używane polecenie.

  • Uwaga: Inną odmianą zapisu jest device.send_report. To jest polecenie zapisu używane do wysyłania raportów cech HID do urządzenia. Funkcjonalność jest poza tym identyczna z device.write().
  • Uwaga: Jeśli podasz długość dłuższą niż podana tablica danych, koniec tablicy zostanie uzupełniony wartościami 0x00.
  • Uwaga: Większość urządzeń HID wypełnia początek swoich poleceń zapisu zerami. Robi się to przez umieszczenie dodatkowego 0x00 na początku DataArray i zwiększenie długości o jeden. Te wartości są usuwane przez urządzenie podczas transferu danych. Dzieje się tak głównie wtedy, gdy urządzenie nie ma ID raportu dla wybranego punktu końcowego.
ParametrTypOpisPrzykład
DataArrayTablica 1DTablica bajtów szesnastkowych do wysłania do urządzenia[0x08,0xAB,0xFF,0x37]
LengthIntWartość Int reprezentująca całkowitą długość pakietu do wysłania4

Poniżej przykład pakietu z kontrolerów LED ASUS pokazujący tworzenie i dostarczanie do urządzenia.

var packet = [];
packet[0] = 0xEC; //This is the Report Id
packet[1] = 0x40; //Command
packet[2] = apply ? 0x80 | channel : channel; //Channel Number
packet[3] = start; //Led to Start on
packet[4] = count; //Led Count
packet = packet.concat(RGBData); //Array of RGB values in a [R,G,B ...] format
device.write(packet, 65); //Writing the packet to the device in 65 Bytes

To wywołanie funkcji przyjmuje tablicę z ID raportu punktu końcowego i długość bajtów do odczytu, i wykonuje Hid_Read na urządzeniu. Funkcja zwraca tablicę bajtów odczytanych z urządzenia. Niektóre urządzenia wymagają operacji odczytu, aby zapobiec przepełnieniu bufora, i czasami muszą odczytywać dane konfiguracyjne lub ustawień z urządzeń.

  • Uwaga: Inną odmianą odczytu jest device.get_report. To jest polecenie odczytu używane do pobierania raportów cech HID z urządzenia. Funkcjonalność jest poza tym identyczna z device.read().
ParametrTypOpisPrzykładDomyślnie
DataArrayTablica 1DTablica zawierająca ID raportu potrzebne do polecenia odczytu[0x08, 0x02]
LengthIntWartość Int reprezentująca liczbę bajtów do odczytu65
TimeoutIntMilisekundy oczekiwania na dane przed powrotem. Podaj 0 dla nieblokującego sprawdzenia.100100
ZwrotTypOpisPrzykład
DataArrayTablica 1DTablica zawierająca wszystkie odczytane bajty HEX z urządzenia, lub pusta tablica jeśli timeout minął bez danych[0x08, 0x02,0x00,0x64]
  • Uwaga: Ta funkcja zwraca tablicę danych odpowiadającą długości raportu urządzenia. Jeśli potrzebujesz rzeczywistej liczby odczytanych bajtów, użyj device.getLastReadSize().
  • Uwaga: Gdy timeout mija bez danych, wartość zwracana to pusta tablica, a device.getLastReadSize() zwraca wartość 0.
// Standard blocking read (100ms default timeout)
var config = device.read(packet, 65);
// Non-blocking peek — returns immediately, use getLastReadSize() to check if data arrived
var data = device.read([], 64, 0);
if(device.getLastReadSize() > 0) {
processResponse(data);
}

Ta funkcja zwraca liczbę bajtów odczytanych przez ostatnią operację odczytu/get_report na urządzeniu.

ZwrotTypOpisPrzykład
BytesReadIntLiczba bajtów odczytanych z urządzenia64

Poniżej przykład z myszy Glorious Model 0.

function CheckPacketLength(){
var packet = [0x52]
packet = device.get_report(packet,200) //attempts to read up to 200 bytes
return device.getLastReadSize(); //Returns 186 on a successful read of the config packet
}

Czyści wszystkie oczekujące dane w buforze odczytu urządzenia. Wywołaj to przed krytyczną operacją odczytu, aby upewnić się, że otrzymujesz świeże dane zamiast przestarzałej buforowanej odpowiedzi.

  • Uwaga: Użyteczność tej funkcji zależy od urządzenia i punktu końcowego. Jeśli urządzenie nie obsługuje czyszczenia, możesz ręcznie opróżnić je wykonując operacje odczytu w pętli, dopóki device.getLastReadSize() nie zwróci 0.
device.clearReadBuffer();
device.write(requestPacket, 64);
var response = device.read([], 64);

Ta funkcja próbuje całkowicie wyczyścić bufor odczytu urządzenia za pomocą natywnego mechanizmu flush urządzenia. Preferuj device.clearReadBuffer() dla większości przypadków użycia.

export function Initialize(){
device.flush()
if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){
EnableSoftwareControl();
}
}

Zobacz Zaawansowana komunikacja dla pełnej dokumentacji control_transfer, bulk_transfer i input_report.