ข้ามไปยังเนื้อหา

การเขียนและการอ่าน

ฟังก์ชันเหล่านี้คือวิธีทั้งหมดที่มีให้ใช้ในการสื่อสารกับอุปกรณ์ USB ที่เชื่อมต่ออยู่ในปลั๊กอินของคุณ คำสั่งแบ่งออกเป็นการอ่านและการเขียนสองรูปแบบตามโปรโตคอลของอุปกรณ์ และการถ่ายโอนแบบ control ซึ่งรองรับคำสั่งแฮนด์เชกและฟังก์ชันขั้นสูง

สำหรับเมธอดขั้นสูง (bulk_transfer, control_transfer, input_report) และการสื่อสารผ่านเครือข่าย/ซีเรียล โปรดดู การสื่อสารขั้นสูง

ฟังก์ชันนี้ทำคำสั่ง Hid_Write บนเอนด์พอยต์ที่เลือกไว้ในปัจจุบันของอุปกรณ์ นี่คือฟังก์ชันเขียนที่อุปกรณ์ส่วนใหญ่ใช้และจะเป็นคำสั่งที่ใช้บ่อยที่สุด

  • หมายเหตุ: การเขียนอีกรูปแบบหนึ่งคือ device.send_report ซึ่งเป็นคำสั่งเขียนที่ใช้ส่ง HID feature report ไปยังอุปกรณ์ นอกนั้นทำงานเหมือนกับ device.write()
  • หมายเหตุ: การกำหนดความยาวที่ยาวกว่าอาร์เรย์ข้อมูลที่ระบุจะเติม 0x00 ที่ส่วนท้ายของอาร์เรย์
  • หมายเหตุ: อุปกรณ์ HID ส่วนใหญ่จะใช้ zero padding ที่ส่วนหน้าของคำสั่งเขียน ซึ่งทำได้โดยใส่ 0x00 เพิ่มหนึ่งตัวไว้หน้า DataArray และเพิ่มความยาวขึ้นหนึ่ง ค่าเหล่านี้จะถูกอุปกรณ์ลบออกระหว่างการถ่ายโอนข้อมูล กรณีนี้เกิดขึ้นเป็นหลักเมื่ออุปกรณ์ไม่มี Report ID สำหรับเอนด์พอยต์ที่เลือก
พารามิเตอร์ชนิดคำอธิบายตัวอย่าง
DataArrayอาร์เรย์ 1 มิติอาร์เรย์ที่มีไบต์ฐานสิบหกที่จะส่งไปยังอุปกรณ์[0x08,0xAB,0xFF,0x37]
LengthIntค่า Int ที่แทนความยาวแพ็กเก็ตทั้งหมดที่จะส่ง4

ด้านล่างนี้คือตัวอย่างแพ็กเก็ตจากคอนโทรลเลอร์ LED ของ ASUS ที่แสดงการสร้างและการส่งไปยังอุปกรณ์

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 report จากอุปกรณ์ นอกนั้นทำงานเหมือนกับ device.read()
พารามิเตอร์ชนิดคำอธิบายตัวอย่างค่าเริ่มต้น
DataArrayอาร์เรย์ 1 มิติอาร์เรย์ที่มี report Id ที่จำเป็นสำหรับคำสั่งอ่าน[0x08, 0x02]
LengthIntค่า Int ที่แทนจำนวนไบต์ที่จะอ่าน65
TimeoutIntจำนวนมิลลิวินาทีที่จะรอข้อมูลก่อนส่งคืน ส่ง 0 สำหรับการตรวจสอบแบบไม่บล็อก100100
ค่าที่ส่งคืนชนิดคำอธิบายตัวอย่าง
DataArrayอาร์เรย์ 1 มิติอาร์เรย์ที่มีไบต์ HEX ทั้งหมดที่อ่านได้จากอุปกรณ์ หรืออาร์เรย์ว่างหากหมดเวลาโดยไม่มีข้อมูล[0x08, 0x02,0x00,0x64]
  • หมายเหตุ: ฟังก์ชันนี้ส่งคืน Data Array ที่มีความยาวตรงกับความยาว report ของอุปกรณ์ หากคุณต้องการจำนวนไบต์ที่อ่านได้จริง ให้ใช้ 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);

ฟังก์ชันนี้พยายามล้างบัฟเฟอร์การอ่านของอุปกรณ์ทั้งหมดโดยใช้กลไก flush ดั้งเดิมของอุปกรณ์ สำหรับกรณีการใช้งานส่วนใหญ่ แนะนำให้ใช้ device.clearReadBuffer() แทน

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

ดู การสื่อสารขั้นสูง สำหรับเอกสารฉบับเต็มของ control_transfer, bulk_transfer และ input_report