Записи и чтения
Эти функции представляют все доступные способы взаимодействия с подключёнными USB-устройствами в плагинах. Команды разделены на два вида чтений и записей в зависимости от протоколов устройства, а также управляющие передачи для команд рукопожатия и расширенных функций.
Для продвинутых методов (bulk_transfer, control_transfer, input_report) и сетевой/последовательной связи см. Расширенная связь.
device.write()[send_report]
Заголовок раздела «device.write()[send_report]»Эта функция выполняет команду Hid_Write на текущей выбранной конечной точке устройства. Это команда записи, используемая большинством устройств, и она будет наиболее часто используемой командой.
- Примечание: Другой вариант записи — device.send_report. Это команда записи, используемая для отправки HID feature reports устройству. В остальном функциональность аналогична device.write().
- Примечание: Установка длины больше предоставленного массива данных заполнит конец массива значениями 0x00.
- Примечание: Большинство HID-устройств дополняют начало своих команд записи нулём. Это делается путём размещения дополнительного 0x00 перед DataArray и увеличения длины на единицу. Эти значения удаляются устройством при передаче данных. Это преимущественно происходит, когда у устройства нет Report ID для выбранной конечной точки.
| Параметр | Тип | Описание | Пример |
|---|---|---|---|
| DataArray | Одномерный массив | Массив, содержащий шестнадцатеричные байты для отправки устройству | [0x08,0xAB,0xFF,0x37] |
| Length | Int | Целочисленное значение, представляющее общую длину пакета для отправки | 4 |
Ниже пример пакета от контроллеров ASUS LED, показывающий создание и доставку на устройство.
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]
Заголовок раздела «device.read()[get_report]»Этот вызов принимает массив с идентификатором Report ID конечной точки и длиной байт для чтения и выполняет Hid_Read на устройстве. Функция возвращает массив байт, считанных с устройства. Некоторым устройствам требуется чтение для предотвращения переполнения буфера, и иногда нужно считывать данные конфигурации или настроек с устройств.
- Примечание: Другой вариант чтения — device.get_report. Это команда чтения для получения HID feature reports с устройства. В остальном функциональность аналогична device.read().
| Параметр | Тип | Описание | Пример | По умолчанию |
|---|---|---|---|---|
| DataArray | Одномерный массив | Массив с идентификатором Report ID для команды чтения | [0x08, 0x02] | |
| Length | Int | Количество байт для чтения | 65 | |
| Timeout | Int | Миллисекунды ожидания данных до возврата. Передайте 0 для неблокирующей проверки. | 100 | 100 |
| Возврат | Тип | Описание | Пример |
|---|---|---|---|
| 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 arrivedvar data = device.read([], 64, 0);if(device.getLastReadSize() > 0) { processResponse(data);}device.getLastReadSize()
Заголовок раздела «device.getLastReadSize()»Эта функция возвращает количество байт, считанных последней операцией read/get_report с устройства.
| Возврат | Тип | Описание | Пример |
|---|---|---|---|
| BytesRead | Int | Количество байт, считанных с устройства | 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.clearReadBuffer()
Заголовок раздела «device.clearReadBuffer()»Очищает все ожидающие данные в буфере чтения устройства. Вызовите перед критическим чтением, чтобы получить актуальные данные, а не устаревший буферизованный ответ.
- Примечание: Полезность этой функции зависит от устройства и конечной точки. Если устройство не поддерживает очистку, вручную опустошите его циклом чтений до тех пор, пока
device.getLastReadSize()не вернёт 0.
device.clearReadBuffer();device.write(requestPacket, 64);var response = device.read([], 64);device.flush()
Заголовок раздела «device.flush()»Эта функция пытается полностью очистить буфер чтения устройства с помощью его собственного механизма очистки. Для большинства случаев предпочтительнее device.clearReadBuffer().
export function Initialize(){ device.flush() if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){ EnableSoftwareControl(); }}device.control_transfer()
Заголовок раздела «device.control_transfer()»Полную документацию по control_transfer, bulk_transfer и input_report см. в Расширенная связь.