Перейти к содержимому

Записи и чтения

Эти функции представляют все доступные способы взаимодействия с подключёнными USB-устройствами в плагинах. Команды разделены на два вида чтений и записей в зависимости от протоколов устройства, а также управляющие передачи для команд рукопожатия и расширенных функций.

Для продвинутых методов (bulk_transfer, control_transfer, input_report) и сетевой/последовательной связи см. Расширенная связь.

Эта функция выполняет команду Hid_Write на текущей выбранной конечной точке устройства. Это команда записи, используемая большинством устройств, и она будет наиболее часто используемой командой.

  • Примечание: Другой вариант записи — device.send_report. Это команда записи, используемая для отправки HID feature reports устройству. В остальном функциональность аналогична device.write().
  • Примечание: Установка длины больше предоставленного массива данных заполнит конец массива значениями 0x00.
  • Примечание: Большинство HID-устройств дополняют начало своих команд записи нулём. Это делается путём размещения дополнительного 0x00 перед DataArray и увеличения длины на единицу. Эти значения удаляются устройством при передаче данных. Это преимущественно происходит, когда у устройства нет Report ID для выбранной конечной точки.
ПараметрТипОписаниеПример
DataArrayОдномерный массивМассив, содержащий шестнадцатеричные байты для отправки устройству[0x08,0xAB,0xFF,0x37]
LengthIntЦелочисленное значение, представляющее общую длину пакета для отправки4

Ниже пример пакета от контроллеров ASUS LED, показывающий создание и доставку на устройство.

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

Этот вызов принимает массив с идентификатором Report ID конечной точки и длиной байт для чтения и выполняет Hid_Read на устройстве. Функция возвращает массив байт, считанных с устройства. Некоторым устройствам требуется чтение для предотвращения переполнения буфера, и иногда нужно считывать данные конфигурации или настроек с устройств.

  • Примечание: Другой вариант чтения — device.get_report. Это команда чтения для получения HID feature reports с устройства. В остальном функциональность аналогична device.read().
ПараметрТипОписаниеПримерПо умолчанию
DataArrayОдномерный массивМассив с идентификатором Report ID для команды чтения[0x08, 0x02]
LengthIntКоличество байт для чтения65
TimeoutIntМиллисекунды ожидания данных до возврата. Передайте 0 для неблокирующей проверки.100100
ВозвратТипОписаниеПример
DataArrayОдномерный массивМассив всех считанных HEX байт с устройства или пустой массив при истечении времени ожидания[0x08, 0x02,0x00,0x64]
  • Примечание: Эта функция возвращает массив данных, соответствующий длине отчёта устройства. Если нужно фактическое количество считанных байт, используйте device.getLastReadSize().
  • Примечание: При истечении времени ожидания без данных возвращается пустой массив, а device.getLastReadSize() возвращает 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);
}

Эта функция возвращает количество байт, считанных последней операцией read/get_report с устройства.

ВозвратТипОписаниеПример
BytesReadIntКоличество байт, считанных с устройства64

Пример из мыши 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.getLastReadSize() не вернёт 0.
device.clearReadBuffer();
device.write(requestPacket, 64);
var response = device.read([], 64);

Эта функция пытается полностью очистить буфер чтения устройства с помощью его собственного механизма очистки. Для большинства случаев предпочтительнее device.clearReadBuffer().

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

Полную документацию по control_transfer, bulk_transfer и input_report см. в Расширенная связь.