diff options
Diffstat (limited to 'res/controllers/common-hid-packet-parser.js')
-rw-r--r-- | res/controllers/common-hid-packet-parser.js | 2145 |
1 files changed, 1063 insertions, 1082 deletions
diff --git a/res/controllers/common-hid-packet-parser.js b/res/controllers/common-hid-packet-parser.js index 4a2c0c36f9..e887575473 100644 --- a/res/controllers/common-hid-packet-parser.js +++ b/res/controllers/common-hid-packet-parser.js @@ -1,1552 +1,1533 @@ +/** Common HID script debugging function. Just to get logging with 'HID' prefix. */ +HIDDebug = function(message) { + print("HID " + message) +} -// Common HID script debugging function. Just to get logging with 'HID' prefix. -HIDDebug = function (message) { print("HID " + message); } - -// HID Bit Vector Class -// -// Collection of bits in one parsed packet field. These objects are -// created by HIDPacket addControl and addOutput and should not be -// created manually. -function HIDBitVector () { - this.size = 0; - this.bits = new Object(); +/** HID Bit Vector Class + * + * Collection of bits in one parsed packet field. These objects are + * created by HIDPacket addControl and addOutput and should not be + * created manually. */ +HIDBitVector = function() { + this.size = 0 + this.bits = {} } -// Return bit offset based on bitmask +/** Return bit offset based on bitmask */ HIDBitVector.prototype.getOffset = function(bitmask) { - for (var i=0;i<32;i++) - if ( (1&bitmask>>i)!=0 ) - return i; - return 0; + for (var i = 0; i < 32; i++) + if ((1 & bitmask >> i) != 0) + return i + return 0 } -// Add a control bitmask to the HIDBitVector -HIDBitVector.prototype.addBitMask = function(group,name,bitmask) { - var bit = new Object(); - bit.type = "button"; - bit.packet = undefined; - bit.id = group+"."+name; - bit.group = group; - bit.name = name; - bit.mapped_group = undefined; - bit.mapped_name = undefined; - bit.bitmask = bitmask; - bit.bitmask = bitmask; - bit.bit_offset = this.getOffset(bitmask); - bit.callback = undefined; - bit.value = undefined; - bit.auto_repeat = undefined; - bit.auto_repeat_interval = undefined; - this.bits[bit.id] = bit; +/** Add a control bitmask to the HIDBitVector */ +HIDBitVector.prototype.addBitMask = function(group, name, bitmask) { + var bit = {} + bit.type = "button" + bit.packet = undefined + bit.id = group + "." + name + bit.group = group + bit.name = name + bit.mapped_group = undefined + bit.mapped_name = undefined + bit.bitmask = bitmask + bit.bitmask = bitmask + bit.bit_offset = this.getOffset(bitmask) + bit.callback = undefined + bit.value = undefined + bit.auto_repeat = undefined + bit.auto_repeat_interval = undefined + this.bits[bit.id] = bit } -// Add a Output control bitmask to the HIDBitVector -HIDBitVector.prototype.addOutputMask = function(group,name,bitmask) { - var bit = new Object(); - bit.type = "output"; - bit.packet = undefined; - bit.id = group+"."+name; - bit.group = group; - bit.name = name; - bit.mapped_group = undefined; - bit.mapped_name = undefined; - bit.bitmask = bitmask; - bit.bit_offset = this.getOffset(bitmask); - bit.callback = undefined; - bit.value = undefined; - bit.toggle = undefined; - this.bits[bit.id] = bit; +/** Add a Output control bitmask to the HIDBitVector */ +HIDBitVector.prototype.addOutputMask = function(group, name, bitmask) { + var bit = {} + bit.type = "output" + bit.packet = undefined + bit.id = group + "." + name + bit.group = group + bit.name = name + bit.mapped_group = undefined + bit.mapped_name = undefined + bit.bitmask = bitmask + bit.bit_offset = this.getOffset(bitmask) + bit.callback = undefined + bit.value = undefined + bit.toggle = undefined + this.bits[bit.id] = bit } -// HID Modifiers object -// -// Wraps all defined modifiers to one object with uniform API. -// Don't call directly, this is available as HIDController.modifiers -function HIDModifierList() { - this.modifiers = Object(); - this.callbacks = Object(); +/** HID Modifiers object + * + * Wraps all defined modifiers to one object with uniform API. + * Don't call directly, this is available as HIDController.modifiers */ +HIDModifierList = function() { + this.modifiers = Object() + this.callbacks = Object() } -// Add a new modifier to controller. +/** Add a new modifier to controller. */ HIDModifierList.prototype.add = function(name) { if (name in this.modifiers) { - HIDDebug("Modifier already defined: " + name); - return; + HIDDebug("Modifier already defined: " + name) + return } - this.modifiers[name] = undefined; + this.modifiers[name] = undefined } -// Set modifier value -HIDModifierList.prototype.set = function(name,value) { +/** Set modifier value */ +HIDModifierList.prototype.set = function(name, value) { if ((!name in this.modifiers)) { - HIDDebug("Unknown modifier: " + name); - return; + HIDDebug("Unknown modifier: " + name) + return } - this.modifiers[name] = value; + this.modifiers[name] = value if (name in this.callbacks) { - var callback = this.callbacks[name]; - callback(value); + var callback = this.callbacks[name] + callback(value) } } -// Get modifier value +/** Get modifier value */ HIDModifierList.prototype.get = function(name) { if (!(name in this.modifiers)) { - HIDDebug("Unknown modifier: " + name); - return false; + HIDDebug("Unknown modifier: " + name) + return false } - return this.modifiers[name]; + return this.modifiers[name] } -// Set modifier callback (update function after modifier state changes) -HIDModifierList.prototype.setCallback = function(name,callback) { +/** Set modifier callback (update function after modifier state changes) */ +HIDModifierList.prototype.setCallback = function(name, callback) { if ((!name in this.modifiers)) { HIDDebug("Unknown modifier: " + name); - return; + return } - this.callbacks[name] = callback; + this.callbacks[name] = callback } -// -// HID Packet object -// -// One HID input/output packet to register to HIDController -// name name of packet -// header list of bytes to match from beginning of packet -// length packet length -// callback function to call when this packet type is input -// and is received. If packet callback is set, the -// packet is not parsed by delta functions. -// callback is not meaningful for output packets -function HIDPacket(name,header,length,callback) { - this.name = name; - this.header = header; - this.length = length; - this.callback = callback; - - this.groups = new Object(); +/** + * HID Packet object + * + * One HID input/output packet to register to HIDController + * @param name name of packet + * @param reportId report ID of the packet. If the device only uses + * one report type, this must be 0. + * @param callback function to call when this packet type is input + * and is received. If packet callback is set, the + * packet is not parsed by delta functions. + * callback is not meaningful for output packets + * @param header (optional) list of bytes to match from beginning + * of packet. Do NOT put the report ID in this; use + * the reportId parameter instead. */ +HIDPacket = function(name, reportId, callback, header) { + this.name = name + this.header = header + this.callback = callback + + this.reportId = 0 + if (reportId !== undefined) { + this.reportId = reportId + } + + this.groups = {} // Size of various 'pack' values in bytes - this.packSizes = { b: 1, B: 1, h: 2, H: 2, i: 4, I: 4 }; - this.signedPackFormats = [ "b", "h", "i"]; + this.packSizes = {b: 1, B: 1, h: 2, H: 2, i: 4, I: 4} + this.signedPackFormats = ["b", "h", "i"] } -// Pack a field value to the packet. -// Can only pack bits and byte values, patches welcome. -HIDPacket.prototype.pack = function(packet,field) { - var value = 0; +/** Pack a field value to the packet. + * Can only pack bits and byte values, patches welcome. */ +HIDPacket.prototype.pack = function(data, field) { + var value if (!(field.pack in this.packSizes)) { - HIDDebug("ERROR parsing packed value: invalid pack format " + field.pack); - return; + HIDDebug("ERROR parsing packed value: invalid pack format " + field.pack) + return } - var bytes = this.packSizes[field.pack]; - var signed = false; - if (this.signedPackFormats.indexOf(field.pack)!=-1) - signed = true; + var bytes = this.packSizes[field.pack] + var signed = false + if (this.signedPackFormats.indexOf(field.pack) != -1) + signed = true - if (field.type=="bitvector") { + if (field.type == "bitvector") { // TODO - fix multi byte bit vector outputs - if (bytes>1) { - HIDDebug("ERROR: packing multibyte bit vectors not yet supported"); - return; + if (bytes > 1) { + HIDDebug("ERROR: packing multibyte bit vectors not yet supported") + return } for (bit_id in field.value.bits) { - var bit = field.value.bits[bit_id]; - packet.data[field.offset] = packet.data[field.offset] | bit.value; + var bit = field.value.bits[bit_id] + data[field.offset] = data[field.offset] | bit.value } - return; + return } - value = (field.value!=undefined) ? field.value : 0; + value = (field.value != undefined) ? field.value : 0 - if (value<field.min || value>field.max) { - HIDDebug("ERROR " + field.id + " packed value out of range: " + value); - return; + if (value < field.min || value > field.max) { + HIDDebug("ERROR " + field.id + " packed value out of range: " + value) + return } - for (var byte_index=0;byte_index<bytes;byte_index++) { - var index = field.offset+byte_index; + for (var byte_index = 0; byte_index < bytes; byte_index++) { + var index = field.offset + byte_index if (signed) { - if (value>=0) { - packet.data[index] = (value>>(byte_index*8)) & 255; + if (value >= 0) { + data[index] = (value >> (byte_index * 8)) & 255 } else { - packet.data[index] = 255 - ((-(value+1)>>(byte_index*8)) & 255); + data[index] = 255 - ((-(value + 1) >> (byte_index * 8)) & 255) } } else { - packet.data[index] = (value>>(byte_index*8)) & 255; + data[index] = (value >> (byte_index * 8)) & 255 } } } -// Parse and return field value matching the 'pack' field from field attributes. -// Valid values are: -// b signed byte -// B unsigned byte -// h signed short -// H unsigned short -// i signed integer -// I unsigned integer -HIDPacket.prototype.unpack = function(data,field) { - var value = 0; +/** Parse and return field value matching the 'pack' field from field attributes. + * Valid values are: + * b signed byte + * B unsigned byte + * h signed short + * H unsigned short + * i signed integer + * I unsigned integer */ +HIDPacket.prototype.unpack = function(data, field) { + var value = 0 if (!(field.pack in this.packSizes)) { - HIDDebug("ERROR parsing packed value: invalid pack format " + field.pack); - return; + HIDDebug("ERROR parsing packed value: invalid pack format " + field.pack) + return } - var bytes = this.packSizes[field.pack]; - var signed = false; - if (this.signedPackFormats.indexOf(field.pack)!=-1) - signed = true; + var bytes = this.packSizes[field.pack] + var signed = false + if (this.signedPackFormats.indexOf(field.pack) != -1) + signed = true - for (field_byte=0;field_byte<bytes;field_byte++) { - if (data[field.offset+field_byte]==255 && field_byte==4) - value += 0; + for (field_byte = 0; field_byte < bytes; field_byte++) { + if (data[field.offset + field_byte] == 255 && field_byte == 4) + value += 0 else - value += data[field.offset+field_byte] * Math.pow(2,(field_byte*8)); + value += data[field.offset + field_byte] * Math.pow(2, (field_byte * 8)) } if (signed) { - var max_value = Math.pow(2,bytes*8); - var split = max_value/2-1; - if (value>split) - value = value-max_value; + var max_value = Math.pow(2, bytes * 8) + var split = max_value / 2 - 1 + if (value > split) + value = value - max_value } - return value; + return value } -// Find HID packet group matching name. -// Create group if create is true -HIDPacket.prototype.getGroup = function(name,create) { - if (this.groups==undefined) - this.groups = new Object(); +/** Find HID packet group matching name. + * Create group if create is true */ +HIDPacket.prototype.getGroup = function(name, create) { + if (this.groups == undefined) + this.groups = {} if (name in this.groups) - return this.groups[name]; + return this.groups[name] if (!create) - return undefined; - this.groups[name] = new Object(); - return this.groups[name]; + return undefined + this.groups[name] = {} + return this.groups[name] } -// Lookup HID packet field matching given offset and pack type -// Returns undefined if no patching field can be found. -HIDPacket.prototype.getFieldByOffset = function(offset,pack) { +/** Lookup HID packet field matching given offset and pack type + * Returns undefined if no patching field can be found. */ +HIDPacket.prototype.getFieldByOffset = function(offset, pack) { if (!(pack in this.packSizes)) { - HIDDebug("Unknown pack string " + pack); - return undefined; - } - var end_offset = offset + this.packSizes[pack]; - if (end_offset>this.length) { - HIDDebug("Invalid offset+pack range " + - offset + "-" + end_offset + - " for " + this.length + " byte packet" - ); - return undefined; - } - var group = undefined; - var field = undefined; + HIDDebug("Unknown pack string " + pack) + return undefined + } + var end_offset = offset + this.packSizes[pack] + var group + var field for (var group_name in this.groups) { - group = this.groups[group_name]; + group = this.groups[group_name] for (var field_id in group) { - field = group[field_id]; + field = group[field_id] // Same field offset - if (field.offset==offset) - return field; + if (field.offset == offset) + return field // 7-8 8-9 // Offset for smaller packet inside multibyte field - if (field.offset<offset && field.end_offset>=end_offset) - return field; + if (field.offset < offset && field.end_offset >= end_offset) + return field // Packet offset starts inside field, may overflow - if (field.offset<offset && field.end_offset>offset) - return field; + if (field.offset < offset && field.end_offset > offset) + return field // Packet start before field, ends or overflows field - if (field.offset>offset && field.offset<end_offset) - return field; + if (field.offset > offset && field.offset < end_offset) + return field } } - return undefined; + return undefined } -// Return a field by group and name from the packet, -// Returns undefined if field could not be found -HIDPacket.prototype.getField = function(group,name) { - var field_id = group+"."+name; +/** Return a field by group and name from the packet, + * Returns undefined if field could not be found */ +HIDPacket.prototype.getField = function(group, name) { + var field_id = group + "." + name if (!(group in this.groups)) { - HIDDebug("PACKET " + this.name + " group not found " + group); - return undefined; + HIDDebug("PACKET " + this.name + " group not found " + group) + return undefined } - var control_group = this.groups[group]; + var control_group = this.groups[group] if (field_id in control_group) - return control_group[field_id]; + return control_group[field_id] // Lookup for bit fields in bitvector matching field name for (var group_name in this.groups) { - var control_group = this.groups[group_name]; + var control_group = this.groups[group_name] for (field_name in control_group) { - var field = control_group[field_name]; - if (field==undefined || field.type!="bitvector") + var field = control_group[field_name] + if (field == undefined || field.type != "bitvector") continue for (bit_name in field.value.bits) { - var bit = field.value.bits[bit_name]; - if (bit.id==field_id) { - return field; + var bit = field.value.bits[bit_name] + if (bit.id == field_id) { + return field } } } } // Field not found - return undefined; + return undefined } -// Return reference to a bit in a bitvector field -HIDPacket.prototype.lookupBit = function(group,name) { - var field = this.getField(group,name); - if (field==undefined) { - HIDDebug("Bitvector match not found: "+group+"."+name); - return undefined; +/** Return reference to a bit in a bitvector field */ +HIDPacket.prototype.lookupBit = function(group, name) { + var field = this.getField(group, name) + if (field == undefined) { + HIDDebug("Bitvector match not found: " + group + "." + name) + return undefined } - var bit_id = group+"."+name; + var bit_id = group + "." + name for (bit_name in field.value.bits) { - var bit = field.value.bits[bit_name]; - if (bit.id==bit_id) - return bit; + var bit = field.value.bits[bit_name] + if (bit.id == bit_id) + return bit } - HIDDebug("BUG: bit not found after successful field lookup"); - return undefined; + HIDDebug("BUG: bit not found after successful field lookup") + return undefined } -// Remove a control registered. Normally not needed -HIDPacket.prototype.removeControl = function(group,name) { - var control_group = this.getGroup(group); +/** Remove a control registered. Normally not needed */ +HIDPacket.prototype.removeControl = function(group, name) { + var control_group = this.getGroup(group) if (!(name in control_group)) { - HIDDebug("Field not in control group " + group + ": " + name); - return; + HIDDebug("Field not in control group " + group + ": " + name) + return } - delete control_group[name]; + delete control_group[name] } -// Register a numeric value to parse from input packet -// Parameters: -// group control group name -// name name of the field -// offset field offset inside packet (bytes) -// pack control packing format for unpack() -// bitmask bitmask size, undefined for byte(s) controls -// NOTE: Parsing bitmask with multiple bits is not supported yet. -// isEncoder indicates if this is an encoder which should be wrapped and delta reported -// callback callback function to apply to the field value, or undefined for no callback -// -HIDPacket.prototype.addControl = function(group,name,offset,pack,bitmask,isEncoder) { - var control_group = this.getGroup(group,true); - var bitvector = undefined; - if (control_group==undefined) { - HIDDebug("ERROR creating HID packet group " + group); - return; +/** Register a numeric value to parse from input packet + * + * @param group control group name + * @param name name of the field + * @param offset field offset inside packet (bytes) + * @param pack control packing format for unpack(), one of b/B, h/H, i/I + * @param bitmask bitmask size, undefined for byte(s) controls + * NOTE: Parsing bitmask with multiple bits is not supported yet. + * @param isEncoder indicates if this is an encoder which should be wrapped and delta reported */ +HIDPacket.prototype.addControl = function(group, name, offset, pack, bitmask, isEncoder) { + var control_group = this.getGroup(group, true) + var bitvector = undefined + if (control_group == undefined) { + HIDDebug("ERROR creating HID packet group " + group) + return } if (!(pack in this.packSizes)) { - HIDDebug("Unknown pack value " + pack); - return; + HIDDebug("Unknown pack value " + pack) + return } - var field = this.getFieldByOffset(offset,pack); - if (field!=undefined) { - if (bitmask==undefined) { - HIDDebug("ERROR registering offset " +offset+ " pack " + pack); + var field = this.getFieldByOffset(offset, pack) + if (field != undefined) { + if (bitmask == undefined) { + HIDDebug("ERROR registering offset " + offset + " pack " + pack) HIDDebug( "ERROR trying to overwrite non-bitmask control " + group + " " + name - ); - return; + ) + return } - bitvector = field.value; - bitvector.addBitMask(group,name,bitmask); - return; - } - - field = new Object(); - field.packet = undefined; - field.id = group+"."+name; - field.group = group; - field.name = name; - field.mapped_group = undefined; - field.mapped_name = undefined; - field.pack = pack; - field.offset = offset; - field.end_offset = offset + this.packSizes[field.pack]; - field.bitmask = bitmask; - field.isEncoder = isEncoder; - field.callback = undefined; - field.soft_takeover = false; - field.ignored = false; - field.auto_repeat = undefined; - field.auto_repeat_interval = undefined; - - var packet_max_value = Math.pow(2,this.packSizes[field.pack]*8); - if (this.signedPackFormats.indexOf(pack)!=-1) { - field.min = 0 - (packet_max_value/2)+1; - field.max = (packet_max_value/2)-1; + bitvector = field.value + bitvector.addBitMask(group, name, bitmask) + return + } + + field = {} + field.packet = undefined + field.id = group + "." + name + field.group = group + field.name = name + field.mapped_group = undefined + field.mapped_name = undefined + field.pack = pack + field.offset = offset + field.end_offset = offset + this.packSizes[field.pack] + field.bitmask = bitmask + field.isEncoder = isEncoder + field.callback = undefined + field.soft_takeover = false + field.ignored = false + field.auto_repeat = undefined + field.auto_repeat_interval = undefined + + var packet_max_value = Math.pow(2, this.packSizes[field.pack] * 8) + if (this.signedPackFormats.indexOf(pack) != -1) { + field.min = 0 - (packet_max_value / 2) + 1 + field.max = (packet_max_value / 2) - 1 } else { - field.min = 0; - field.max = packet_max_value-1; + field.min = 0 + field.max = packet_max_value - 1 } - if (bitmask==undefined || bitmask==packet_max_value) { - field.type = "control"; - field.value = undefined; - field.delta = 0; - field.mindelta = 0; + if (bitmask == undefined || bitmask == packet_max_value) { + field.type = "control" + field.value = undefined + field.delta = 0 + field.mindelta = 0 } else { - if (this.signedPackFormats.indexOf(pack)!=-1) { - HIDDebug("ERROR registering bitvector: signed fields not supported"); - return; + if (this.signedPackFormats.indexOf(pack) != -1) { + HIDDebug("ERROR registering bitvector: signed fields not supported") + return } // Create a new bitvector field and add the bit to that // TODO - accept controls with bitmask < packet_max_value - field_name = "bitvector_" + offset; - field.type = "bitvector"; - field.name = field_name; - field.id = group+"."+field_name; - bitvector = new HIDBitVector(field.max); - bitvector.size = field.max; - bitvector.addBitMask(group,name,bitmask); - field.value = bitvector; - field.delta = undefined; - field.soft_takeover = undefined; - field.mindelta = undefined; + field_name = "bitvector_" + offset + field.type = "bitvector" + field.name = field_name + field.id = group + "." + field_name + bitvector = new HIDBitVector(field.max) + bitvector.size = field.max + bitvector.addBitMask(group, name, bitmask) + field.value = bitvector + field.delta = undefined + field.soft_takeover = undefined + field.mindelta = undefined } // Add the new field to the packet - control_group[field.id] = field; + control_group[field.id] = field } -// Register a Output control field or Output control bit to output packet -// Output control field: -// Output field with no bitmask, controls Output with multiple values -// Output control bit: -// Output with with bitmask, controls Output with a single bit -// -// It is recommended to define callbacks after packet creation with -// setCallback instead of adding it directly here. But you can do it. -HIDPacket.prototype.addOutput = function(group,name,offset,pack,bitmask,callback) { - var control_group = this.getGroup(group,true); - var field = undefined; - var bitvector = undefined; - var field_id = group+"."+name; - - if (control_group==undefined) { - return; +/** Register a Output control field or Output control bit to output packet + * Output control field: + * Output field with no bitmask, controls Output with multiple values + * Output control bit: + * Output with with bitmask, controls Output with a single bit + * + * It is recommended to define callbacks after packet creation with + * setCallback instead of adding it directly here. But you can do it. + * + * @param offset the offset of the byte(s) to use, starting at 1 + * (0 is automatically populated with the reportId) + * @param pack control packing format for pack(), one of b/B, h/H, i/I */ +HIDPacket.prototype.addOutput = function(group, name, offset, pack, bitmask, callback) { + var control_group = this.getGroup(group, true) + var field + var bitvector = undefined + var field_id = group + "." + name + + if (control_group == undefined) { + return } if (!(pack in this.packSizes)) { - HIDDebug("ERROR: unknown Output control pack value " + pack); - return; + HIDDebug("ERROR: unknown Output control pack value " + pack) + return } + // Adjust offset by 1 because the reportId was previously considered part of the payload + // but isn't anymore and we can't be bothered to adjust every single script manually + offset -= 1 + // Check if we are adding a Output bit to existing bitvector - field = this.getFieldByOffset(offset,pack); - if (field!=undefined) { - if (bitmask==undefined) { + field = this.getFieldByOffset(offset, pack) + if (field != undefined) { + if (bitmask == undefined) { HIDDebug( - "ERROR: overwrite non-bitmask control " + group+"."+name - ); - return; + "ERROR: overwrite non-bitmask control " + group + "." + name + ) + return } - bitvector = field.value; - bitvector.addOutputMask(group,name,bitmask); - return; - } - - field = new Object(); - field.id = field_id; - field.group = group; - field.name = name; - field.mapped_group = undefined; - field.mapped_name = undefined; - field.pack = pack; - field.offset = offset; - field.end_offset = offset + this.packSizes[field.pack]; - field.bitmask = bitmask; - field.callback = callback; - field.toggle = undefined; - - var packet_max_value = Math.pow(2,this.packSizes[field.pack]*8); - if (this.signedPackFormats.indexOf(pack)!=-1) { - field.min = 0 - (packet_max_value/2)+1; - field.max = (packet_max_value/2)-1; + bitvector = field.value + bitvector.addOutputMask(group, name, bitmask) + return + } + + field = {} + field.id = field_id + field.group = group + field.name = name + field.mapped_group = undefined + field.mapped_name = undefined + field.pack = pack + field.offset = offset + field.end_offset = offset + this.packSizes[field.pack] + field.bitmask = bitmask + field.callback = callback + field.toggle = undefined + + var packet_max_value = Math.pow(2, this.packSizes[field.pack] * 8) + if (this.signedPackFormats.indexOf(pack) != -1) { + field.min = 0 - (packet_max_value / 2) + 1 + field.max = (packet_max_value / 2) - 1 } else { - field.min = 0; - field.max = packet_max_value-1; - } - if (bitmask==undefined || bitmask==packet_max_value) { - field.type = "output"; - field.value = undefined; - field.delta = undefined; - field.mindelta = undefined; + field.min = 0 + field.max = packet_max_value - 1 + } + if (bitmask == undefined || bitmask == packet_max_value) { + field.type = "output" + field.value = undefined + field.delta = undefined + field.mindelta = undefined } else { // Create new Output bitvector control field, add bit to it // rewrite name to use bitvector instead - field_name = "bitvector_" + offset; - field.type = "bitvector"; - field.id = group+"."+field_name; - field.name = field_name; - bitvector = new HIDBitVector(); - bitvector.size = field.max; - bitvector.addOutputMask(group,name,bitmask); - field.value = bitvector; - field.delta = undefined; - field.mindelta = undefined; + field_name = "bitvector_" + offset + field.type = "bitvector" + field.id = group + "." + field_name + field.name = field_name + bitvector = new HIDBitVector() + bitvector.size = field.max + bitvector.addOutputMask(group, name, bitmask) + field.value = bitvector + field.delta = undefined + field.mindelta = undefined } // Add Output to HID packet - control_group[field.id] = field; + control_group[field.id] = field } -// Register a callback to field or a bit vector bit. -// Does not make sense for Output fields but you can do that. -HIDPacket.prototype.setCallback = function(group,name,callback) { - var field = this.getField(group,name); - var field_id = group+"."+name; - if (callback==undefined) { - HIDDebug("Callback to add was undefined for " + field_id); - return; - } - if (field==undefined) { - HIDDebug("setCallback: field for " +field_id+ " not found" - ); - return; - } - if (field.type=="bitvector") { +/** Register a callback to field or a bit vector bit. + * Does not make sense for Output fields but you can do that. */ +HIDPacket.prototype.setCallback = function(group, name, callback) { + var field = this.getField(group, name) + var field_id = group + "." + name + if (callback == undefined) { + HIDDebug("Callback to add was undefined for " + field_id) + return + } + if (field == undefined) { + HIDDebug("setCallback: field for " + field_id + " not found" + ) + return + } + if (field.type == "bitvector") { for (var bit_id in field.value.bits) { - var bit = field.value.bits[bit_id]; - if (bit_id!=field_id) - continue; - bit.callback = callback; - return; + var bit = field.value.bits[bit_id] + if (bit_id != field_id) + continue + bit.callback = callback + return } - HIDDebug("ERROR: BIT NOT FOUND " + field_id); + HIDDebug("ERROR: BIT NOT FOUND " + field_id) } else { - field.callback = callback; + field.callback = callback } } -// Set 'ignored' flag for field to given value (true or false) -// If field is ignored, it is not reported in 'delta' objects. -HIDPacket.prototype.setIgnored = function(group,name,ignored) { - var field = this.getField(group,name); - if (field==undefined) { - HIDDebug("ERROR setting ignored flag for " + group +" " + name); - return; +/** Set 'ignored' flag for field to given value (true or false) + * If field is ignored, it is not reported in 'delta' objects. */ +HIDPacket.prototype.setIgnored = function(group, name, ignored) { + var field = this.getField(group, name) + if (field == undefined) { + HIDDebug("ERROR setting ignored flag for " + group + " " + name) + return } - field.ignored = ignored; + field.ignored = ignored } -// Adjust field's minimum delta value. -// Input value changes smaller than this are not reported in delta -HIDPacket.prototype.setMinDelta = function(group,name,mindelta) { - field = this.getField(group,name); - if (field==undefined) { - HIDDebug("ERROR adjusting mindelta for " + group +" " + name); - return; +/** Adjust field's minimum delta value. + * Input value changes smaller than this are not reported in delta */ +HIDPacket.prototype.setMinDelta = function(group, name, mindelta) { + field = this.getField(group, name) + if (field == undefined) { + HIDDebug("ERROR adjusting mindelta for " + group + " " + name) + return } - if (field.type=="bitvector") { - HIDDebug("ERROR setting mindelta for bitvector packet does not make sense"); - return; + if (field.type == "bitvector") { + HIDDebug("ERROR setting mindelta for bitvector packet does not make sense") + return } - field.mindelta = mindelta; + field.mindelta = mindelta } -// Parse bitvector field values, returning object with the named bits set. -// Value must be a valid unsigned byte to parse, with enough bits. -// Returns list of modified bits (delta) -HIDPacket.prototype.parseBitVector = function(field,value) { - var bits = new Object(); - var bit; - var new_value; +/** Parse bitvector field values, returning object with the named bits set. + * Value must be a valid unsigned byte to parse, with enough bits. + * Returns list of modified bits (delta) */ +HIDPacket.prototype.parseBitVector = function(field, value) { + var bits = {} + var bit + var new_value for (var bit_id in field.value.bits) { - bit = field.value.bits[bit_id]; - new_value = (bit.bitmask&value)>>bit.bit_offset; - if (bit.value!=undefined && bit.value!=new_value) - bits[bit_id] = bit; - bit.value = new_value; + bit = field.value.bits[bit_id] + new_value = (bit.bitmask & value) >> bit.bit_offset + if (bit.value != undefined && bit.value != new_value) + bits[bit_id] = bit + bit.value = new_value } - return bits; + return bits } -// Parse input packet fields from data. -// Data is expected to be a Packet() received from HID device. -// Returns list of changed fields with new value. -// BitVectors are returned as bits you can iterate separately. +/** Parse input packet fields from data. + * Data is expected to be a Packet() received from HID device. + * Returns list of changed fields with new value. + * BitVectors are returned as bits you can iterate separately. */ HIDPacket.prototype.parse = function(data) { - var field_changes = new Object(); - var group; - var group_name; - var field; - var field_name; - var field_id; - var bit; - var bit_value; + var field_changes = {} + var group + var group_name + var field + var field_ |