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.
device.write()[send_report]
Dział zatytułowany „device.write()[send_report]”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.
| Parametr | Typ | Opis | Przykład |
|---|---|---|---|
| DataArray | Tablica 1D | Tablica bajtów szesnastkowych do wysłania do urządzenia | [0x08,0xAB,0xFF,0x37] |
| Length | Int | Wartość Int reprezentująca całkowitą długość pakietu do wysłania | 4 |
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 Idpacket[1] = 0x40; //Commandpacket[2] = apply ? 0x80 | channel : channel; //Channel Numberpacket[3] = start; //Led to Start onpacket[4] = count; //Led Countpacket = 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 Bytesdevice.read()[get_report]
Dział zatytułowany „device.read()[get_report]”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().
| Parametr | Typ | Opis | Przykład | Domyślnie |
|---|---|---|---|---|
| DataArray | Tablica 1D | Tablica zawierająca ID raportu potrzebne do polecenia odczytu | [0x08, 0x02] | |
| Length | Int | Wartość Int reprezentująca liczbę bajtów do odczytu | 65 | |
| Timeout | Int | Milisekundy oczekiwania na dane przed powrotem. Podaj 0 dla nieblokującego sprawdzenia. | 100 | 100 |
| Zwrot | Typ | Opis | Przykład |
|---|---|---|---|
| DataArray | Tablica 1D | Tablica 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 arrivedvar data = device.read([], 64, 0);if(device.getLastReadSize() > 0) { processResponse(data);}device.getLastReadSize()
Dział zatytułowany „device.getLastReadSize()”Ta funkcja zwraca liczbę bajtów odczytanych przez ostatnią operację odczytu/get_report na urządzeniu.
| Zwrot | Typ | Opis | Przykład |
|---|---|---|---|
| BytesRead | Int | Liczba bajtów odczytanych z urządzenia | 64 |
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
}device.clearReadBuffer()
Dział zatytułowany „device.clearReadBuffer()”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);device.flush()
Dział zatytułowany „device.flush()”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(); }}device.control_transfer()
Dział zatytułowany „device.control_transfer()”Zobacz Zaawansowana komunikacja dla pełnej dokumentacji control_transfer, bulk_transfer i input_report.