Escritas e Leituras
Essas funções são todas as formas disponíveis de comunicação com os dispositivos USB conectados nos seus plugins. Os comandos são divididos em dois tipos de leituras e escritas dependendo dos protocolos do dispositivo, e transferências de controle que permitem comandos de handshake e funcionalidades avançadas.
device.write()[send_report]
Seção intitulada “device.write()[send_report]”Esta função executa um comando Hid_Write no endpoint atualmente selecionado do dispositivo. Esta é a função de escrita que a maioria dos dispositivos usa e será o comando mais utilizado.
- Nota: Outro tipo de escrita é o device.send_report. Este é o comando de escrita usado para enviar relatórios de feature HID ao dispositivo. A funcionalidade é idêntica à do device.write().
- Nota: Definir um comprimento maior do que o array de dados fornecido irá preencher o final do array com 0x00.
- Nota: A maioria dos dispositivos HID faz o zero padding no início dos seus comandos de escrita. Isso é feito colocando um 0x00 extra na frente do seu DataArray e aumentando o comprimento em um. Esses valores são removidos pelo dispositivo durante a transferência de dados. Isso ocorre principalmente quando o dispositivo não tem Report ID para o Endpoint selecionado.
| Parâmetro | Tipo | Descrição | Exemplo |
|---|---|---|---|
| DataArray | Array 1D | Um Array contendo bytes Hex para enviar ao dispositivo | [0x08,0xAB,0xFF,0x37] |
| Length | Int | Um valor Int representando o comprimento total do pacote a enviar | 4 |
Abaixo está um exemplo de um pacote dos controladores de LED ASUS mostrando a criação e envio ao dispositivo.
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]
Seção intitulada “device.read()[get_report]”Esta chamada de função recebe um array contendo um Report Id de endpoint e o número de bytes a ler, e executa um Hid_Read no dispositivo. A função retorna um array de bytes lidos do dispositivo. Alguns dispositivos requerem uma leitura para evitar estouro de buffer e ocasionalmente precisam ler dados de configuração ou definições dos dispositivos.
- Nota: Outro tipo de leitura é:
- device.read_report*. Este é o comando de leitura usado para obter relatórios de feature HID do dispositivo. A funcionalidade é idêntica à do device.read().
| Parâmetro | Tipo | Descrição | Exemplo |
|---|---|---|---|
| DataArray | Array 1D | Um array contendo o Report Id necessário para o comando de leitura | [0x08, 0x02] |
| Length | Int | Um valor Int representando o número de bytes a ler | 65 |
| Retorno | Tipo | Descrição | Exemplo |
|---|---|---|---|
| DataArray | Array 1D | Um array contendo todos os bytes HEX lidos do dispositivo | [0x08, 0x02,0x00,0x64] |
- Nota: Esta função retorna um Data Array com o comprimento do Report do dispositivo. Se você precisar da contagem real de bytes lidos, use device.getLastReadSize()
var config = device.read(packet, 65);device.getLastReadSize()
Seção intitulada “device.getLastReadSize()”Esta função retorna o número de bytes lidos pela última leitura/get_report feita no dispositivo.
| Retorno | Tipo | Descrição | Exemplo |
|---|---|---|---|
| BytesRead | Int | Número de bytes lidos do dispositivo | 64 |
Abaixo está um exemplo do mouse 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.control_transfer()
Seção intitulada “device.control_transfer()”device.flush()
Seção intitulada “device.flush()”Esta função tenta limpar completamente o buffer de leitura do dispositivo. Isso pode ser útil para resetar antes de qualquer leitura crítica ser feita no dispositivo.
- Nota: A utilidade desta função depende do dispositivo e do endpoint. Se o dispositivo não suportar flush, pode ser necessário limpá-lo manualmente com leituras em loop até que device.getLastReadSize() retorne 0 bytes.
export function Initialize(){ device.flush() if(Corsair_Get(CORSAIR_MODE) == CORSAIR_HARDWARE_MODE){ EnableSoftwareControl(); }}