Schreib- und Lesevorgänge
Diese Funktionen sind alle verfügbaren Möglichkeiten zur Kommunikation mit den angeschlossenen USB-Geräten in Ihren Plugins. Die Befehle sind in zwei Varianten von Lese- und Schreibvorgängen aufgeteilt, abhängig von den Protokollen des Geräts, sowie Control-Transfers, die Handshake-Befehle und erweiterte Funktionalität ermöglichen.
device.write()[send_report]
Abschnitt betitelt „device.write()[send_report]“Diese Funktion führt einen Hid_Write-Befehl auf dem aktuell ausgewählten Endpoint des Geräts aus. Dies ist die Schreibfunktion, die die meisten Geräte verwenden, und wird der am häufigsten verwendete Befehl sein.
- Hinweis: Eine weitere Variante des Schreibens ist device.send_report. Dies ist der Schreibbefehl zum Senden von HID-Feature-Reports an das Gerät. Die Funktionalität ist ansonsten identisch mit device.write().
- Hinweis: Wenn eine Länge angegeben wird, die größer als das bereitgestellte Daten-Array ist, wird das Ende des Arrays mit 0x00 aufgefüllt.
- Hinweis: Die meisten HID-Geräte füllen die Vorderseite ihrer Schreibbefehle mit Null auf. Dies geschieht durch das Einfügen eines zusätzlichen 0x00 vor dem DataArray und die Erhöhung der Länge um eins. Diese Werte werden vom Gerät während der Datenübertragung entfernt. Dies geschieht hauptsächlich, wenn das Gerät keine Report-ID für den ausgewählten Endpoint hat.
| Parameter | Typ | Beschreibung | Beispiel |
|---|---|---|---|
| DataArray | 1D-Array | Ein Array mit Hex-Bytes, die an das Gerät gesendet werden sollen | [0x08,0xAB,0xFF,0x37] |
| Length | Int | Ein Int-Wert, der die gesamte zu sendende Packet-Länge darstellt | 4 |
Nachfolgend ein Beispiel eines Packets von den ASUS-LED-Controllern, das die Erstellung und Übertragung an das Gerät zeigt.
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]
Abschnitt betitelt „device.read()[get_report]“Dieser Funktionsaufruf nimmt ein Array mit einer Endpoint-Report-ID und der Anzahl der zu lesenden Bytes entgegen und führt einen Hid_Read auf dem Gerät aus. Die Funktion gibt ein Array der vom Gerät gelesenen Bytes zurück. Manche Geräte erfordern einen Lesevorgang, um Buffer-Overflows zu verhindern, und müssen gelegentlich Konfigurations- oder Einstellungsdaten vom Gerät lesen.
- Hinweis: Eine weitere Variante des Lesens ist:
- device.read_report*. Dies ist der Lesebefehl zum Abrufen von HID-Feature-Reports vom Gerät. Die Funktionalität ist ansonsten identisch mit device.read().
| Parameter | Typ | Beschreibung | Beispiel |
|---|---|---|---|
| DataArray | 1D-Array | Ein Array mit der für den Lesebefehl benötigten Report-ID | [0x08, 0x02] |
| Length | Int | Ein Int-Wert, der die Anzahl der zu lesenden Bytes darstellt | 65 |
| Rückgabe | Typ | Beschreibung | Beispiel |
|---|---|---|---|
| DataArray | 1D-Array | Ein Array mit allen gelesenen HEX-Bytes vom Gerät | [0x08, 0x02,0x00,0x64] |
- Hinweis: Diese Funktion gibt ein Daten-Array zurück, das der Report-Länge des Geräts entspricht. Wenn Sie die tatsächliche Anzahl gelesener Bytes benötigen, verwenden Sie device.getLastReadSize().
var config = device.read(packet, 65);device.getLastReadSize()
Abschnitt betitelt „device.getLastReadSize()“Diese Funktion gibt die Anzahl der Bytes zurück, die beim letzten read/get_report-Aufruf auf dem Gerät gelesen wurden.
| Rückgabe | Typ | Beschreibung | Beispiel |
|---|---|---|---|
| BytesRead | Int | Anzahl der vom Gerät gelesenen Bytes | 64 |
Nachfolgend ein Beispiel von der Glorious Model 0 Mouse.
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.control_transfer()
Abschnitt betitelt „device.control_transfer()“device.flush()
Abschnitt betitelt „device.flush()“Diese Funktion versucht, den Lesepuffer des Geräts vollständig zu leeren. Dies kann nützlich sein, um vor kritischen Lesevorgängen auf dem Gerät einen Reset durchzuführen.
- Hinweis: Die Nützlichkeit dieser Funktion hängt vom Gerät und dem Endpoint ab. Wenn das Gerät das Leeren nicht unterstützt, müssen Sie es möglicherweise manuell mit Schleifen-Lesevorgängen leeren, bis device.getLastReadSize() 0 Bytes zurückgibt.
export function Initialize(){ device.flush() if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){ EnableSoftwareControl(); }}