Zum Inhalt springen

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.

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.
ParameterTypBeschreibungBeispiel
DataArray1D-ArrayEin Array mit Hex-Bytes, die an das Gerät gesendet werden sollen[0x08,0xAB,0xFF,0x37]
LengthIntEin Int-Wert, der die gesamte zu sendende Packet-Länge darstellt4

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 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

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().
ParameterTypBeschreibungBeispiel
DataArray1D-ArrayEin Array mit der für den Lesebefehl benötigten Report-ID[0x08, 0x02]
LengthIntEin Int-Wert, der die Anzahl der zu lesenden Bytes darstellt65
RückgabeTypBeschreibungBeispiel
DataArray1D-ArrayEin 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);

Diese Funktion gibt die Anzahl der Bytes zurück, die beim letzten read/get_report-Aufruf auf dem Gerät gelesen wurden.

RückgabeTypBeschreibungBeispiel
BytesReadIntAnzahl der vom Gerät gelesenen Bytes64

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
}

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