@ac-kit/format-hid 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/LICENSE +28 -0
- package/README.md +96 -2
- package/dist/descriptor/hid-field-usage.d.ts +35 -0
- package/dist/descriptor/hid-field-usage.d.ts.map +1 -0
- package/dist/descriptor/hid-field-usage.js +63 -0
- package/dist/descriptor/hid-field-usage.js.map +1 -0
- package/dist/descriptor/hid-report-descriptor.d.ts +148 -0
- package/dist/descriptor/hid-report-descriptor.d.ts.map +1 -0
- package/dist/descriptor/hid-report-descriptor.js +15 -0
- package/dist/descriptor/hid-report-descriptor.js.map +1 -0
- package/dist/descriptor/parse-hid-report-descriptor.d.ts +30 -0
- package/dist/descriptor/parse-hid-report-descriptor.d.ts.map +1 -0
- package/dist/descriptor/parse-hid-report-descriptor.js +440 -0
- package/dist/descriptor/parse-hid-report-descriptor.js.map +1 -0
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +20 -0
- package/dist/errors.js.map +1 -0
- package/dist/field/_field-value-bit-position.d.ts +7 -0
- package/dist/field/_field-value-bit-position.d.ts.map +1 -0
- package/dist/field/_field-value-bit-position.js +24 -0
- package/dist/field/_field-value-bit-position.js.map +1 -0
- package/dist/field/create-hid-report.d.ts +9 -0
- package/dist/field/create-hid-report.d.ts.map +1 -0
- package/dist/field/create-hid-report.js +14 -0
- package/dist/field/create-hid-report.js.map +1 -0
- package/dist/field/hid-field-layout.d.ts +7 -0
- package/dist/field/hid-field-layout.d.ts.map +1 -0
- package/dist/field/hid-field-layout.js +2 -0
- package/dist/field/hid-field-layout.js.map +1 -0
- package/dist/field/hid-logical-to-physical.d.ts +14 -0
- package/dist/field/hid-logical-to-physical.d.ts.map +1 -0
- package/dist/field/hid-logical-to-physical.js +27 -0
- package/dist/field/hid-logical-to-physical.js.map +1 -0
- package/dist/field/read-hid-field-value.d.ts +18 -0
- package/dist/field/read-hid-field-value.d.ts.map +1 -0
- package/dist/field/read-hid-field-value.js +35 -0
- package/dist/field/read-hid-field-value.js.map +1 -0
- package/dist/field/write-hid-field-value-in-place.d.ts +18 -0
- package/dist/field/write-hid-field-value-in-place.d.ts.map +1 -0
- package/dist/field/write-hid-field-value-in-place.js +41 -0
- package/dist/field/write-hid-field-value-in-place.js.map +1 -0
- package/dist/field/write-hid-field-value.d.ts +18 -0
- package/dist/field/write-hid-field-value.d.ts.map +1 -0
- package/dist/field/write-hid-field-value.js +41 -0
- package/dist/field/write-hid-field-value.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/item/_read-hid-item.d.ts +18 -0
- package/dist/item/_read-hid-item.d.ts.map +1 -0
- package/dist/item/_read-hid-item.js +48 -0
- package/dist/item/_read-hid-item.js.map +1 -0
- package/dist/item/decode-hid-items.d.ts +16 -0
- package/dist/item/decode-hid-items.d.ts.map +1 -0
- package/dist/item/decode-hid-items.js +24 -0
- package/dist/item/decode-hid-items.js.map +1 -0
- package/dist/item/encode-hid-items.d.ts +17 -0
- package/dist/item/encode-hid-items.d.ts.map +1 -0
- package/dist/item/encode-hid-items.js +74 -0
- package/dist/item/encode-hid-items.js.map +1 -0
- package/dist/item/hid-item-tag.d.ts +37 -0
- package/dist/item/hid-item-tag.d.ts.map +1 -0
- package/dist/item/hid-item-tag.js +40 -0
- package/dist/item/hid-item-tag.js.map +1 -0
- package/dist/item/hid-item-value.d.ts +20 -0
- package/dist/item/hid-item-value.d.ts.map +1 -0
- package/dist/item/hid-item-value.js +36 -0
- package/dist/item/hid-item-value.js.map +1 -0
- package/dist/item/hid-item.d.ts +32 -0
- package/dist/item/hid-item.d.ts.map +1 -0
- package/dist/item/hid-item.js +2 -0
- package/dist/item/hid-item.js.map +1 -0
- package/dist/unit/decode-hid-unit.d.ts +9 -0
- package/dist/unit/decode-hid-unit.d.ts.map +1 -0
- package/dist/unit/decode-hid-unit.js +26 -0
- package/dist/unit/decode-hid-unit.js.map +1 -0
- package/dist/unit/encode-hid-unit.d.ts +10 -0
- package/dist/unit/encode-hid-unit.d.ts.map +1 -0
- package/dist/unit/encode-hid-unit.js +32 -0
- package/dist/unit/encode-hid-unit.js.map +1 -0
- package/dist/unit/hid-unit.d.ts +29 -0
- package/dist/unit/hid-unit.d.ts.map +1 -0
- package/dist/unit/hid-unit.js +11 -0
- package/dist/unit/hid-unit.js.map +1 -0
- package/package.json +60 -3
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a logical value to the physical quantity it measures, in the field's
|
|
3
|
+
* unit: the linear map from the logical range onto the physical range, scaled
|
|
4
|
+
* by `10 ** unitExponent` (HID 1.11 §6.2.2.7).
|
|
5
|
+
*
|
|
6
|
+
* The result is a real number; {@link decodeHidUnit} names its unit. A value
|
|
7
|
+
* outside the logical range — a null value — is extrapolated, not rejected.
|
|
8
|
+
*
|
|
9
|
+
* @returns `NaN` when the logical range is a single value, which leaves the
|
|
10
|
+
* scale undefined.
|
|
11
|
+
*/
|
|
12
|
+
export function hidLogicalToPhysical(field, value) {
|
|
13
|
+
const logicalSpan = field.logicalMaximum - field.logicalMinimum;
|
|
14
|
+
if (logicalSpan === 0) {
|
|
15
|
+
return Number.NaN;
|
|
16
|
+
}
|
|
17
|
+
const physical = field.physicalMinimum +
|
|
18
|
+
((value - field.logicalMinimum) *
|
|
19
|
+
(field.physicalMaximum - field.physicalMinimum)) /
|
|
20
|
+
logicalSpan;
|
|
21
|
+
// Dividing by 10^k keeps 3 × 10^-1 at 0.3, where multiplying by 0.1 does not.
|
|
22
|
+
if (field.unitExponent < 0) {
|
|
23
|
+
return physical / 10 ** -field.unitExponent;
|
|
24
|
+
}
|
|
25
|
+
return physical * 10 ** field.unitExponent;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=hid-logical-to-physical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid-logical-to-physical.js","sourceRoot":"","sources":["../../src/field/hid-logical-to-physical.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAOC,EACD,KAAa;IAEb,MAAM,WAAW,GAAG,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;IAChE,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,GAAG,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GACb,KAAK,CAAC,eAAe;QACrB,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC;YAC9B,CAAC,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;YAChD,WAAW,CAAC;IAEd,8EAA8E;IAC9E,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IAC7C,CAAC;IAED,OAAO,QAAQ,GAAG,EAAE,IAAI,KAAK,CAAC,YAAY,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HidFieldLayout } from "./hid-field-layout.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reads value `index` of a field out of a report as transferred — Report ID
|
|
4
|
+
* byte included when the descriptor uses them.
|
|
5
|
+
*
|
|
6
|
+
* Values are packed little-endian, least significant bit first (HID 1.11 §5.8).
|
|
7
|
+
* A field whose `logicalMinimum` is negative is signed and its values are
|
|
8
|
+
* sign-extended; any other field reads unsigned.
|
|
9
|
+
*
|
|
10
|
+
* The result is the logical value; {@link hidLogicalToPhysical} converts it.
|
|
11
|
+
*
|
|
12
|
+
* O(1) time and memory.
|
|
13
|
+
*
|
|
14
|
+
* @throws {RangeError} When `bitSize` is not 1–32, `index` is not in `0 ≤ index
|
|
15
|
+
* < count`, or the value lies past the end of `report`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readHidFieldValue(report: Uint8Array, field: HidFieldLayout, index: number): number;
|
|
18
|
+
//# sourceMappingURL=read-hid-field-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-hid-field-value.d.ts","sourceRoot":"","sources":["../../src/field/read-hid-field-value.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,MAAM,GACX,MAAM,CAyBR"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { fieldValueBitPosition_ } from "./_field-value-bit-position.js";
|
|
2
|
+
/**
|
|
3
|
+
* Reads value `index` of a field out of a report as transferred — Report ID
|
|
4
|
+
* byte included when the descriptor uses them.
|
|
5
|
+
*
|
|
6
|
+
* Values are packed little-endian, least significant bit first (HID 1.11 §5.8).
|
|
7
|
+
* A field whose `logicalMinimum` is negative is signed and its values are
|
|
8
|
+
* sign-extended; any other field reads unsigned.
|
|
9
|
+
*
|
|
10
|
+
* The result is the logical value; {@link hidLogicalToPhysical} converts it.
|
|
11
|
+
*
|
|
12
|
+
* O(1) time and memory.
|
|
13
|
+
*
|
|
14
|
+
* @throws {RangeError} When `bitSize` is not 1–32, `index` is not in `0 ≤ index
|
|
15
|
+
* < count`, or the value lies past the end of `report`.
|
|
16
|
+
*/
|
|
17
|
+
export function readHidFieldValue(report, field, index) {
|
|
18
|
+
const { bitSize } = field;
|
|
19
|
+
let position = fieldValueBitPosition_(report, field, index, "readHidFieldValue");
|
|
20
|
+
let value = 0;
|
|
21
|
+
let bitsRead = 0;
|
|
22
|
+
while (bitsRead < bitSize) {
|
|
23
|
+
const shift = position & 7;
|
|
24
|
+
const take = Math.min(8 - shift, bitSize - bitsRead);
|
|
25
|
+
const bits = (report[position >>> 3] >>> shift) & ((1 << take) - 1);
|
|
26
|
+
value += bits * 2 ** bitsRead;
|
|
27
|
+
bitsRead += take;
|
|
28
|
+
position += take;
|
|
29
|
+
}
|
|
30
|
+
if (field.logicalMinimum < 0 && value >= 2 ** (bitSize - 1)) {
|
|
31
|
+
return value - 2 ** bitSize;
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=read-hid-field-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-hid-field-value.js","sourceRoot":"","sources":["../../src/field/read-hid-field-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAChC,MAAkB,EAClB,KAAqB,EACrB,KAAa;IAEb,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,sBAAsB,CACpC,MAAM,EACN,KAAK,EACL,KAAK,EACL,mBAAmB,CACnB,CAAC;IAEF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAE,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,QAAQ,CAAC;QAC9B,QAAQ,IAAI,IAAI,CAAC;QACjB,QAAQ,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HidFieldLayout } from "./hid-field-layout.js";
|
|
2
|
+
/**
|
|
3
|
+
* Writes value `index` of a field into a report as transferred, leaving every
|
|
4
|
+
* other bit of `report` untouched. The counterpart of {@link readHidFieldValue},
|
|
5
|
+
* with the same signedness rule: a field whose `logicalMinimum` is negative
|
|
6
|
+
* takes two's-complement values.
|
|
7
|
+
*
|
|
8
|
+
* `value` is checked against the bit width, not the logical range, so a null
|
|
9
|
+
* value outside `logicalMinimum`–`logicalMaximum` can still be written.
|
|
10
|
+
*
|
|
11
|
+
* O(1) time and memory.
|
|
12
|
+
*
|
|
13
|
+
* @throws {RangeError} When `bitSize` is not 1–32, `index` is not in `0 ≤ index
|
|
14
|
+
* < count`, the value lies past the end of `report`, or `value` is not an
|
|
15
|
+
* integer that fits `bitSize` bits of the field's signedness.
|
|
16
|
+
*/
|
|
17
|
+
export declare function writeHidFieldValueInPlace(report: Uint8Array, field: HidFieldLayout, index: number, value: number): void;
|
|
18
|
+
//# sourceMappingURL=write-hid-field-value-in-place.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-hid-field-value-in-place.d.ts","sourceRoot":"","sources":["../../src/field/write-hid-field-value-in-place.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACX,IAAI,CAgCN"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fieldValueBitPosition_ } from "./_field-value-bit-position.js";
|
|
2
|
+
/**
|
|
3
|
+
* Writes value `index` of a field into a report as transferred, leaving every
|
|
4
|
+
* other bit of `report` untouched. The counterpart of {@link readHidFieldValue},
|
|
5
|
+
* with the same signedness rule: a field whose `logicalMinimum` is negative
|
|
6
|
+
* takes two's-complement values.
|
|
7
|
+
*
|
|
8
|
+
* `value` is checked against the bit width, not the logical range, so a null
|
|
9
|
+
* value outside `logicalMinimum`–`logicalMaximum` can still be written.
|
|
10
|
+
*
|
|
11
|
+
* O(1) time and memory.
|
|
12
|
+
*
|
|
13
|
+
* @throws {RangeError} When `bitSize` is not 1–32, `index` is not in `0 ≤ index
|
|
14
|
+
* < count`, the value lies past the end of `report`, or `value` is not an
|
|
15
|
+
* integer that fits `bitSize` bits of the field's signedness.
|
|
16
|
+
*/
|
|
17
|
+
export function writeHidFieldValueInPlace(report, field, index, value) {
|
|
18
|
+
const { bitSize } = field;
|
|
19
|
+
let position = fieldValueBitPosition_(report, field, index, "writeHidFieldValueInPlace");
|
|
20
|
+
const signed = field.logicalMinimum < 0;
|
|
21
|
+
const minimum = signed ? -(2 ** (bitSize - 1)) : 0;
|
|
22
|
+
const maximum = signed ? 2 ** (bitSize - 1) - 1 : 2 ** bitSize - 1;
|
|
23
|
+
if (!Number.isInteger(value) || value < minimum || value > maximum) {
|
|
24
|
+
throw new RangeError(`writeHidFieldValueInPlace: ${value} does not fit ${bitSize} ${signed ? "signed" : "unsigned"} bits`);
|
|
25
|
+
}
|
|
26
|
+
let remaining = value < 0 ? value + 2 ** bitSize : value;
|
|
27
|
+
let bitsLeft = bitSize;
|
|
28
|
+
while (bitsLeft > 0) {
|
|
29
|
+
const shift = position & 7;
|
|
30
|
+
const take = Math.min(8 - shift, bitsLeft);
|
|
31
|
+
const span = 1 << take;
|
|
32
|
+
const mask = (span - 1) << shift;
|
|
33
|
+
const byteIndex = position >>> 3;
|
|
34
|
+
report[byteIndex] =
|
|
35
|
+
(report[byteIndex] & ~mask) | ((remaining % span) << shift);
|
|
36
|
+
remaining = Math.floor(remaining / span);
|
|
37
|
+
bitsLeft -= take;
|
|
38
|
+
position += take;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=write-hid-field-value-in-place.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-hid-field-value-in-place.js","sourceRoot":"","sources":["../../src/field/write-hid-field-value-in-place.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,yBAAyB,CACxC,MAAkB,EAClB,KAAqB,EACrB,KAAa,EACb,KAAa;IAEb,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,sBAAsB,CACpC,MAAM,EACN,KAAK,EACL,KAAK,EACL,2BAA2B,CAC3B,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QACpE,MAAM,IAAI,UAAU,CACnB,8BAA8B,KAAK,iBAAiB,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,OAAO,CACpG,CAAC;IACH,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,OAAO,QAAQ,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;QACjC,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC;YAChB,CAAC,MAAM,CAAC,SAAS,CAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAC9D,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzC,QAAQ,IAAI,IAAI,CAAC;QACjB,QAAQ,IAAI,IAAI,CAAC;IAClB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HidFieldLayout } from "./hid-field-layout.js";
|
|
2
|
+
/**
|
|
3
|
+
* Writes value `index` of a field into a report as transferred, leaving every
|
|
4
|
+
* other bit of `report` untouched. The counterpart of {@link readHidFieldValue},
|
|
5
|
+
* with the same signedness rule: a field whose `logicalMinimum` is negative
|
|
6
|
+
* takes two's-complement values.
|
|
7
|
+
*
|
|
8
|
+
* `value` is checked against the bit width, not the logical range, so a null
|
|
9
|
+
* value outside `logicalMinimum`–`logicalMaximum` can still be written.
|
|
10
|
+
*
|
|
11
|
+
* O(1) time and memory.
|
|
12
|
+
*
|
|
13
|
+
* @throws {RangeError} When `bitSize` is not 1–32, `index` is not in `0 ≤ index
|
|
14
|
+
* < count`, the value lies past the end of `report`, or `value` is not an
|
|
15
|
+
* integer that fits `bitSize` bits of the field's signedness.
|
|
16
|
+
*/
|
|
17
|
+
export declare function writeHidFieldValue(report: Uint8Array, field: HidFieldLayout, index: number, value: number): void;
|
|
18
|
+
//# sourceMappingURL=write-hid-field-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-hid-field-value.d.ts","sourceRoot":"","sources":["../../src/field/write-hid-field-value.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACX,IAAI,CAgCN"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { fieldValueBitPosition_ } from "./_field-value-bit-position.js";
|
|
2
|
+
/**
|
|
3
|
+
* Writes value `index` of a field into a report as transferred, leaving every
|
|
4
|
+
* other bit of `report` untouched. The counterpart of {@link readHidFieldValue},
|
|
5
|
+
* with the same signedness rule: a field whose `logicalMinimum` is negative
|
|
6
|
+
* takes two's-complement values.
|
|
7
|
+
*
|
|
8
|
+
* `value` is checked against the bit width, not the logical range, so a null
|
|
9
|
+
* value outside `logicalMinimum`–`logicalMaximum` can still be written.
|
|
10
|
+
*
|
|
11
|
+
* O(1) time and memory.
|
|
12
|
+
*
|
|
13
|
+
* @throws {RangeError} When `bitSize` is not 1–32, `index` is not in `0 ≤ index
|
|
14
|
+
* < count`, the value lies past the end of `report`, or `value` is not an
|
|
15
|
+
* integer that fits `bitSize` bits of the field's signedness.
|
|
16
|
+
*/
|
|
17
|
+
export function writeHidFieldValue(report, field, index, value) {
|
|
18
|
+
const { bitSize } = field;
|
|
19
|
+
let position = fieldValueBitPosition_(report, field, index, "writeHidFieldValue");
|
|
20
|
+
const signed = field.logicalMinimum < 0;
|
|
21
|
+
const minimum = signed ? -(2 ** (bitSize - 1)) : 0;
|
|
22
|
+
const maximum = signed ? 2 ** (bitSize - 1) - 1 : 2 ** bitSize - 1;
|
|
23
|
+
if (!Number.isInteger(value) || value < minimum || value > maximum) {
|
|
24
|
+
throw new RangeError(`writeHidFieldValue: ${value} does not fit ${bitSize} ${signed ? "signed" : "unsigned"} bits`);
|
|
25
|
+
}
|
|
26
|
+
let remaining = value < 0 ? value + 2 ** bitSize : value;
|
|
27
|
+
let bitsLeft = bitSize;
|
|
28
|
+
while (bitsLeft > 0) {
|
|
29
|
+
const shift = position & 7;
|
|
30
|
+
const take = Math.min(8 - shift, bitsLeft);
|
|
31
|
+
const span = 1 << take;
|
|
32
|
+
const mask = (span - 1) << shift;
|
|
33
|
+
const byteIndex = position >>> 3;
|
|
34
|
+
report[byteIndex] =
|
|
35
|
+
(report[byteIndex] & ~mask) | ((remaining % span) << shift);
|
|
36
|
+
remaining = Math.floor(remaining / span);
|
|
37
|
+
bitsLeft -= take;
|
|
38
|
+
position += take;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=write-hid-field-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-hid-field-value.js","sourceRoot":"","sources":["../../src/field/write-hid-field-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CACjC,MAAkB,EAClB,KAAqB,EACrB,KAAa,EACb,KAAa;IAEb,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC1B,IAAI,QAAQ,GAAG,sBAAsB,CACpC,MAAM,EACN,KAAK,EACL,KAAK,EACL,oBAAoB,CACpB,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QACpE,MAAM,IAAI,UAAU,CACnB,uBAAuB,KAAK,iBAAiB,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,OAAO,CAC7F,CAAC;IACH,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,OAAO,QAAQ,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;QACjC,MAAM,SAAS,GAAG,QAAQ,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,SAAS,CAAC;YAChB,CAAC,MAAM,CAAC,SAAS,CAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAC9D,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzC,QAAQ,IAAI,IAAI,CAAC;QACjB,QAAQ,IAAI,IAAI,CAAC;IAClB,CAAC;AACF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from "./descriptor/hid-field-usage.js";
|
|
2
|
+
export * from "./descriptor/hid-report-descriptor.js";
|
|
3
|
+
export * from "./descriptor/parse-hid-report-descriptor.js";
|
|
4
|
+
export * from "./errors.js";
|
|
5
|
+
export * from "./field/create-hid-report.js";
|
|
6
|
+
export * from "./field/hid-field-layout.js";
|
|
7
|
+
export * from "./field/hid-logical-to-physical.js";
|
|
8
|
+
export * from "./field/read-hid-field-value.js";
|
|
9
|
+
export * from "./field/write-hid-field-value-in-place.js";
|
|
10
|
+
export * from "./item/decode-hid-items.js";
|
|
11
|
+
export * from "./item/encode-hid-items.js";
|
|
12
|
+
export * from "./item/hid-item-tag.js";
|
|
13
|
+
export * from "./item/hid-item-value.js";
|
|
14
|
+
export * from "./item/hid-item.js";
|
|
15
|
+
export * from "./unit/decode-hid-unit.js";
|
|
16
|
+
export * from "./unit/encode-hid-unit.js";
|
|
17
|
+
export * from "./unit/hid-unit.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export * from "./descriptor/hid-field-usage.js";
|
|
2
|
+
export * from "./descriptor/hid-report-descriptor.js";
|
|
3
|
+
export * from "./descriptor/parse-hid-report-descriptor.js";
|
|
4
|
+
export * from "./errors.js";
|
|
5
|
+
export * from "./field/create-hid-report.js";
|
|
6
|
+
export * from "./field/hid-field-layout.js";
|
|
7
|
+
export * from "./field/hid-logical-to-physical.js";
|
|
8
|
+
export * from "./field/read-hid-field-value.js";
|
|
9
|
+
export * from "./field/write-hid-field-value-in-place.js";
|
|
10
|
+
export * from "./item/decode-hid-items.js";
|
|
11
|
+
export * from "./item/encode-hid-items.js";
|
|
12
|
+
export * from "./item/hid-item-tag.js";
|
|
13
|
+
export * from "./item/hid-item-value.js";
|
|
14
|
+
export * from "./item/hid-item.js";
|
|
15
|
+
export * from "./unit/decode-hid-unit.js";
|
|
16
|
+
export * from "./unit/encode-hid-unit.js";
|
|
17
|
+
export * from "./unit/hid-unit.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,aAAa,CAAC;AAC5B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ByteReader } from "@ac-kit/core";
|
|
2
|
+
import type { HidItem, HidItemType } from "./hid-item.js";
|
|
3
|
+
/** Prefix byte of a long item (HID 1.11 §6.2.2.3). */
|
|
4
|
+
export declare const LONG_ITEM_PREFIX_ = 254;
|
|
5
|
+
/** `bType` codes in prefix order (HID 1.11 §6.2.2.2). */
|
|
6
|
+
export declare const ITEM_TYPES_: readonly HidItemType[];
|
|
7
|
+
/**
|
|
8
|
+
* Reads one item at the cursor and advances past it. The cursor kernel behind
|
|
9
|
+
* both {@link decodeHidItems} and the descriptor parser, which needs the item's
|
|
10
|
+
* start offset for its own errors.
|
|
11
|
+
*
|
|
12
|
+
* `data` is a view over the reader's bytes, not a copy.
|
|
13
|
+
*
|
|
14
|
+
* @throws {HidDescriptorError} When the item runs past the end of the bytes;
|
|
15
|
+
* `offset` is the item's prefix byte.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readHidItem_(reader: ByteReader): HidItem;
|
|
18
|
+
//# sourceMappingURL=_read-hid-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_read-hid-item.d.ts","sourceRoot":"","sources":["../../src/item/_read-hid-item.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,MAAO,CAAC;AAEtC,yDAAyD;AACzD,eAAO,MAAM,WAAW,EAAE,SAAS,WAAW,EAK7C,CAAC;AAKF;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAkCxD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { HidDescriptorError } from "../errors.js";
|
|
2
|
+
/** Prefix byte of a long item (HID 1.11 §6.2.2.3). */
|
|
3
|
+
export const LONG_ITEM_PREFIX_ = 0xfe;
|
|
4
|
+
/** `bType` codes in prefix order (HID 1.11 §6.2.2.2). */
|
|
5
|
+
export const ITEM_TYPES_ = [
|
|
6
|
+
"main",
|
|
7
|
+
"global",
|
|
8
|
+
"local",
|
|
9
|
+
"reserved",
|
|
10
|
+
];
|
|
11
|
+
/** `bSize` code 3 means four bytes, not three (HID 1.11 §6.2.2.2). */
|
|
12
|
+
const SHORT_DATA_LENGTHS_ = [0, 1, 2, 4];
|
|
13
|
+
/**
|
|
14
|
+
* Reads one item at the cursor and advances past it. The cursor kernel behind
|
|
15
|
+
* both {@link decodeHidItems} and the descriptor parser, which needs the item's
|
|
16
|
+
* start offset for its own errors.
|
|
17
|
+
*
|
|
18
|
+
* `data` is a view over the reader's bytes, not a copy.
|
|
19
|
+
*
|
|
20
|
+
* @throws {HidDescriptorError} When the item runs past the end of the bytes;
|
|
21
|
+
* `offset` is the item's prefix byte.
|
|
22
|
+
*/
|
|
23
|
+
export function readHidItem_(reader) {
|
|
24
|
+
const offset = reader.position;
|
|
25
|
+
const prefix = reader.readByte();
|
|
26
|
+
if (prefix === LONG_ITEM_PREFIX_) {
|
|
27
|
+
if (reader.remaining < 2) {
|
|
28
|
+
throw new HidDescriptorError("Truncated long item header", offset);
|
|
29
|
+
}
|
|
30
|
+
const length = reader.readByte();
|
|
31
|
+
const tag = reader.readByte();
|
|
32
|
+
if (reader.remaining < length) {
|
|
33
|
+
throw new HidDescriptorError(`Long item declares ${length} data bytes, only ${reader.remaining} remain`, offset);
|
|
34
|
+
}
|
|
35
|
+
return { kind: "long", tag, data: reader.read(length) };
|
|
36
|
+
}
|
|
37
|
+
const length = SHORT_DATA_LENGTHS_[prefix & 0b11];
|
|
38
|
+
if (reader.remaining < length) {
|
|
39
|
+
throw new HidDescriptorError(`Short item declares ${length} data bytes, only ${reader.remaining} remain`, offset);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
kind: "short",
|
|
43
|
+
type: ITEM_TYPES_[(prefix >>> 2) & 0b11],
|
|
44
|
+
tag: prefix >>> 4,
|
|
45
|
+
data: reader.read(length),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=_read-hid-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_read-hid-item.js","sourceRoot":"","sources":["../../src/item/_read-hid-item.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGlD,sDAAsD;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC,yDAAyD;AACzD,MAAM,CAAC,MAAM,WAAW,GAA2B;IAClD,MAAM;IACN,QAAQ;IACR,OAAO;IACP,UAAU;CACV,CAAC;AAEF,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAEjC,IAAI,MAAM,KAAK,iBAAiB,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,kBAAkB,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAI,kBAAkB,CAC3B,sBAAsB,MAAM,qBAAqB,MAAM,CAAC,SAAS,SAAS,EAC1E,MAAM,CACN,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,GAAG,IAAI,CAAE,CAAC;IACnD,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,kBAAkB,CAC3B,uBAAuB,MAAM,qBAAqB,MAAM,CAAC,SAAS,SAAS,EAC3E,MAAM,CACN,CAAC;IACH,CAAC;IAED,OAAO;QACN,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,GAAG,IAAI,CAAE;QACzC,GAAG,EAAE,MAAM,KAAK,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;KACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { HidItem } from "./hid-item.js";
|
|
2
|
+
/**
|
|
3
|
+
* Splits a report descriptor into its raw items, with no interpretation — the
|
|
4
|
+
* wire face, exact enough that {@link encodeHidItems} gives the same bytes back.
|
|
5
|
+
*
|
|
6
|
+
* Use {@link parseHidReportDescriptor} for the reports and fields the items
|
|
7
|
+
* describe. Every item's `data` is a view over `bytes`, not a copy, so mutating
|
|
8
|
+
* `bytes` afterwards changes the items too.
|
|
9
|
+
*
|
|
10
|
+
* O(n) time in `bytes.length`; one item object per item.
|
|
11
|
+
*
|
|
12
|
+
* @throws {HidDescriptorError} When the last item runs past the end of `bytes`;
|
|
13
|
+
* `offset` is that item's prefix byte.
|
|
14
|
+
*/
|
|
15
|
+
export declare function decodeHidItems(bytes: Uint8Array): HidItem[];
|
|
16
|
+
//# sourceMappingURL=decode-hid-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode-hid-items.d.ts","sourceRoot":"","sources":["../../src/item/decode-hid-items.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CAQ3D"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ByteReader } from "@ac-kit/core";
|
|
2
|
+
import { readHidItem_ } from "./_read-hid-item.js";
|
|
3
|
+
/**
|
|
4
|
+
* Splits a report descriptor into its raw items, with no interpretation — the
|
|
5
|
+
* wire face, exact enough that {@link encodeHidItems} gives the same bytes back.
|
|
6
|
+
*
|
|
7
|
+
* Use {@link parseHidReportDescriptor} for the reports and fields the items
|
|
8
|
+
* describe. Every item's `data` is a view over `bytes`, not a copy, so mutating
|
|
9
|
+
* `bytes` afterwards changes the items too.
|
|
10
|
+
*
|
|
11
|
+
* O(n) time in `bytes.length`; one item object per item.
|
|
12
|
+
*
|
|
13
|
+
* @throws {HidDescriptorError} When the last item runs past the end of `bytes`;
|
|
14
|
+
* `offset` is that item's prefix byte.
|
|
15
|
+
*/
|
|
16
|
+
export function decodeHidItems(bytes) {
|
|
17
|
+
const reader = new ByteReader(bytes);
|
|
18
|
+
const items = [];
|
|
19
|
+
while (!reader.atEnd) {
|
|
20
|
+
items.push(readHidItem_(reader));
|
|
21
|
+
}
|
|
22
|
+
return items;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=decode-hid-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode-hid-items.js","sourceRoot":"","sources":["../../src/item/decode-hid-items.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC/C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HidItem } from "./hid-item.js";
|
|
2
|
+
/**
|
|
3
|
+
* Spells items back into report descriptor bytes — the inverse of
|
|
4
|
+
* {@link decodeHidItems}, byte for byte.
|
|
5
|
+
*
|
|
6
|
+
* Every item is written with exactly the data it carries: a value is never
|
|
7
|
+
* shortened to fewer bytes, so a descriptor that spells `Logical Maximum (255)`
|
|
8
|
+
* with two bytes keeps both.
|
|
9
|
+
*
|
|
10
|
+
* O(n) time and memory in the total encoded length.
|
|
11
|
+
*
|
|
12
|
+
* @throws {RangeError} When an item cannot be spelled: a short item's data is
|
|
13
|
+
* not 0, 1, 2 or 4 bytes, a long item's is over 255, a tag is out of range,
|
|
14
|
+
* or a reserved short item would produce the long-item prefix `0xFE`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function encodeHidItems(items: readonly HidItem[]): Uint8Array<ArrayBuffer>;
|
|
17
|
+
//# sourceMappingURL=encode-hid-items.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode-hid-items.d.ts","sourceRoot":"","sources":["../../src/item/encode-hid-items.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,eAAe,CAAC;AA+D1D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,SAAS,OAAO,EAAE,GACvB,UAAU,CAAC,WAAW,CAAC,CAuBzB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { ITEM_TYPES_, LONG_ITEM_PREFIX_ } from "./_read-hid-item.js";
|
|
2
|
+
const SHORT_SIZE_CODES_ = {
|
|
3
|
+
0: 0,
|
|
4
|
+
1: 1,
|
|
5
|
+
2: 2,
|
|
6
|
+
4: 3,
|
|
7
|
+
};
|
|
8
|
+
function itemByteLength_(item, index) {
|
|
9
|
+
if (item.kind === "long") {
|
|
10
|
+
if (!Number.isInteger(item.tag) || item.tag < 0 || item.tag > 0xff) {
|
|
11
|
+
throw new RangeError(`encodeHidItems: item ${index} long tag ${item.tag} is not 0–255`);
|
|
12
|
+
}
|
|
13
|
+
if (item.data.length > 0xff) {
|
|
14
|
+
throw new RangeError(`encodeHidItems: item ${index} long data of ${item.data.length} bytes exceeds 255`);
|
|
15
|
+
}
|
|
16
|
+
return 3 + item.data.length;
|
|
17
|
+
}
|
|
18
|
+
if (!Number.isInteger(item.tag) || item.tag < 0 || item.tag > 0xf) {
|
|
19
|
+
throw new RangeError(`encodeHidItems: item ${index} tag ${item.tag} is not 0–15`);
|
|
20
|
+
}
|
|
21
|
+
if (!ITEM_TYPES_.includes(item.type)) {
|
|
22
|
+
throw new RangeError(`encodeHidItems: item ${index} type "${String(item.type)}" is unknown`);
|
|
23
|
+
}
|
|
24
|
+
if (SHORT_SIZE_CODES_[item.data.length] === undefined) {
|
|
25
|
+
throw new RangeError(`encodeHidItems: item ${index} short data of ${item.data.length} bytes is not 0, 1, 2 or 4`);
|
|
26
|
+
}
|
|
27
|
+
if (shortPrefix_(item.type, item.tag, item.data.length) === LONG_ITEM_PREFIX_) {
|
|
28
|
+
throw new RangeError(`encodeHidItems: item ${index} would spell 0xFE, which always reads back as a long item`);
|
|
29
|
+
}
|
|
30
|
+
return 1 + item.data.length;
|
|
31
|
+
}
|
|
32
|
+
function shortPrefix_(type, tag, dataLength) {
|
|
33
|
+
return ((tag << 4) |
|
|
34
|
+
(ITEM_TYPES_.indexOf(type) << 2) |
|
|
35
|
+
SHORT_SIZE_CODES_[dataLength]);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Spells items back into report descriptor bytes — the inverse of
|
|
39
|
+
* {@link decodeHidItems}, byte for byte.
|
|
40
|
+
*
|
|
41
|
+
* Every item is written with exactly the data it carries: a value is never
|
|
42
|
+
* shortened to fewer bytes, so a descriptor that spells `Logical Maximum (255)`
|
|
43
|
+
* with two bytes keeps both.
|
|
44
|
+
*
|
|
45
|
+
* O(n) time and memory in the total encoded length.
|
|
46
|
+
*
|
|
47
|
+
* @throws {RangeError} When an item cannot be spelled: a short item's data is
|
|
48
|
+
* not 0, 1, 2 or 4 bytes, a long item's is over 255, a tag is out of range,
|
|
49
|
+
* or a reserved short item would produce the long-item prefix `0xFE`.
|
|
50
|
+
*/
|
|
51
|
+
export function encodeHidItems(items) {
|
|
52
|
+
let byteLength = 0;
|
|
53
|
+
for (const [index, item] of items.entries()) {
|
|
54
|
+
byteLength += itemByteLength_(item, index);
|
|
55
|
+
}
|
|
56
|
+
const bytes = new Uint8Array(byteLength);
|
|
57
|
+
let offset = 0;
|
|
58
|
+
for (const item of items) {
|
|
59
|
+
if (item.kind === "long") {
|
|
60
|
+
bytes[offset] = LONG_ITEM_PREFIX_;
|
|
61
|
+
bytes[offset + 1] = item.data.length;
|
|
62
|
+
bytes[offset + 2] = item.tag;
|
|
63
|
+
offset += 3;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
bytes[offset] = shortPrefix_(item.type, item.tag, item.data.length);
|
|
67
|
+
offset += 1;
|
|
68
|
+
}
|
|
69
|
+
bytes.set(item.data, offset);
|
|
70
|
+
offset += item.data.length;
|
|
71
|
+
}
|
|
72
|
+
return bytes;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=encode-hid-items.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode-hid-items.js","sourceRoot":"","sources":["../../src/item/encode-hid-items.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Tags of main items (HID 1.11 §6.2.2.4). */
|
|
2
|
+
export declare enum HidMainTag {
|
|
3
|
+
INPUT = 8,
|
|
4
|
+
OUTPUT = 9,
|
|
5
|
+
COLLECTION = 10,
|
|
6
|
+
FEATURE = 11,
|
|
7
|
+
END_COLLECTION = 12
|
|
8
|
+
}
|
|
9
|
+
/** Tags of global items (HID 1.11 §6.2.2.7). */
|
|
10
|
+
export declare enum HidGlobalTag {
|
|
11
|
+
USAGE_PAGE = 0,
|
|
12
|
+
LOGICAL_MINIMUM = 1,
|
|
13
|
+
LOGICAL_MAXIMUM = 2,
|
|
14
|
+
PHYSICAL_MINIMUM = 3,
|
|
15
|
+
PHYSICAL_MAXIMUM = 4,
|
|
16
|
+
UNIT_EXPONENT = 5,
|
|
17
|
+
UNIT = 6,
|
|
18
|
+
REPORT_SIZE = 7,
|
|
19
|
+
REPORT_ID = 8,
|
|
20
|
+
REPORT_COUNT = 9,
|
|
21
|
+
PUSH = 10,
|
|
22
|
+
POP = 11
|
|
23
|
+
}
|
|
24
|
+
/** Tags of local items (HID 1.11 §6.2.2.8). Tag 6 is reserved. */
|
|
25
|
+
export declare enum HidLocalTag {
|
|
26
|
+
USAGE = 0,
|
|
27
|
+
USAGE_MINIMUM = 1,
|
|
28
|
+
USAGE_MAXIMUM = 2,
|
|
29
|
+
DESIGNATOR_INDEX = 3,
|
|
30
|
+
DESIGNATOR_MINIMUM = 4,
|
|
31
|
+
DESIGNATOR_MAXIMUM = 5,
|
|
32
|
+
STRING_INDEX = 7,
|
|
33
|
+
STRING_MINIMUM = 8,
|
|
34
|
+
STRING_MAXIMUM = 9,
|
|
35
|
+
DELIMITER = 10
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=hid-item-tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid-item-tag.d.ts","sourceRoot":"","sources":["../../src/item/hid-item-tag.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,oBAAY,UAAU;IACrB,KAAK,IAAM;IACX,MAAM,IAAM;IACZ,UAAU,KAAM;IAChB,OAAO,KAAM;IACb,cAAc,KAAM;CACpB;AAED,gDAAgD;AAChD,oBAAY,YAAY;IACvB,UAAU,IAAM;IAChB,eAAe,IAAM;IACrB,eAAe,IAAM;IACrB,gBAAgB,IAAM;IACtB,gBAAgB,IAAM;IACtB,aAAa,IAAM;IACnB,IAAI,IAAM;IACV,WAAW,IAAM;IACjB,SAAS,IAAM;IACf,YAAY,IAAM;IAClB,IAAI,KAAM;IACV,GAAG,KAAM;CACT;AAED,kEAAkE;AAClE,oBAAY,WAAW;IACtB,KAAK,IAAM;IACX,aAAa,IAAM;IACnB,aAAa,IAAM;IACnB,gBAAgB,IAAM;IACtB,kBAAkB,IAAM;IACxB,kBAAkB,IAAM;IACxB,YAAY,IAAM;IAClB,cAAc,IAAM;IACpB,cAAc,IAAM;IACpB,SAAS,KAAM;CACf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Tags of main items (HID 1.11 §6.2.2.4). */
|
|
2
|
+
export var HidMainTag;
|
|
3
|
+
(function (HidMainTag) {
|
|
4
|
+
HidMainTag[HidMainTag["INPUT"] = 8] = "INPUT";
|
|
5
|
+
HidMainTag[HidMainTag["OUTPUT"] = 9] = "OUTPUT";
|
|
6
|
+
HidMainTag[HidMainTag["COLLECTION"] = 10] = "COLLECTION";
|
|
7
|
+
HidMainTag[HidMainTag["FEATURE"] = 11] = "FEATURE";
|
|
8
|
+
HidMainTag[HidMainTag["END_COLLECTION"] = 12] = "END_COLLECTION";
|
|
9
|
+
})(HidMainTag || (HidMainTag = {}));
|
|
10
|
+
/** Tags of global items (HID 1.11 §6.2.2.7). */
|
|
11
|
+
export var HidGlobalTag;
|
|
12
|
+
(function (HidGlobalTag) {
|
|
13
|
+
HidGlobalTag[HidGlobalTag["USAGE_PAGE"] = 0] = "USAGE_PAGE";
|
|
14
|
+
HidGlobalTag[HidGlobalTag["LOGICAL_MINIMUM"] = 1] = "LOGICAL_MINIMUM";
|
|
15
|
+
HidGlobalTag[HidGlobalTag["LOGICAL_MAXIMUM"] = 2] = "LOGICAL_MAXIMUM";
|
|
16
|
+
HidGlobalTag[HidGlobalTag["PHYSICAL_MINIMUM"] = 3] = "PHYSICAL_MINIMUM";
|
|
17
|
+
HidGlobalTag[HidGlobalTag["PHYSICAL_MAXIMUM"] = 4] = "PHYSICAL_MAXIMUM";
|
|
18
|
+
HidGlobalTag[HidGlobalTag["UNIT_EXPONENT"] = 5] = "UNIT_EXPONENT";
|
|
19
|
+
HidGlobalTag[HidGlobalTag["UNIT"] = 6] = "UNIT";
|
|
20
|
+
HidGlobalTag[HidGlobalTag["REPORT_SIZE"] = 7] = "REPORT_SIZE";
|
|
21
|
+
HidGlobalTag[HidGlobalTag["REPORT_ID"] = 8] = "REPORT_ID";
|
|
22
|
+
HidGlobalTag[HidGlobalTag["REPORT_COUNT"] = 9] = "REPORT_COUNT";
|
|
23
|
+
HidGlobalTag[HidGlobalTag["PUSH"] = 10] = "PUSH";
|
|
24
|
+
HidGlobalTag[HidGlobalTag["POP"] = 11] = "POP";
|
|
25
|
+
})(HidGlobalTag || (HidGlobalTag = {}));
|
|
26
|
+
/** Tags of local items (HID 1.11 §6.2.2.8). Tag 6 is reserved. */
|
|
27
|
+
export var HidLocalTag;
|
|
28
|
+
(function (HidLocalTag) {
|
|
29
|
+
HidLocalTag[HidLocalTag["USAGE"] = 0] = "USAGE";
|
|
30
|
+
HidLocalTag[HidLocalTag["USAGE_MINIMUM"] = 1] = "USAGE_MINIMUM";
|
|
31
|
+
HidLocalTag[HidLocalTag["USAGE_MAXIMUM"] = 2] = "USAGE_MAXIMUM";
|
|
32
|
+
HidLocalTag[HidLocalTag["DESIGNATOR_INDEX"] = 3] = "DESIGNATOR_INDEX";
|
|
33
|
+
HidLocalTag[HidLocalTag["DESIGNATOR_MINIMUM"] = 4] = "DESIGNATOR_MINIMUM";
|
|
34
|
+
HidLocalTag[HidLocalTag["DESIGNATOR_MAXIMUM"] = 5] = "DESIGNATOR_MAXIMUM";
|
|
35
|
+
HidLocalTag[HidLocalTag["STRING_INDEX"] = 7] = "STRING_INDEX";
|
|
36
|
+
HidLocalTag[HidLocalTag["STRING_MINIMUM"] = 8] = "STRING_MINIMUM";
|
|
37
|
+
HidLocalTag[HidLocalTag["STRING_MAXIMUM"] = 9] = "STRING_MAXIMUM";
|
|
38
|
+
HidLocalTag[HidLocalTag["DELIMITER"] = 10] = "DELIMITER";
|
|
39
|
+
})(HidLocalTag || (HidLocalTag = {}));
|
|
40
|
+
//# sourceMappingURL=hid-item-tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid-item-tag.js","sourceRoot":"","sources":["../../src/item/hid-item-tag.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,CAAN,IAAY,UAMX;AAND,WAAY,UAAU;IACrB,6CAAW,CAAA;IACX,+CAAY,CAAA;IACZ,wDAAgB,CAAA;IAChB,kDAAa,CAAA;IACb,gEAAoB,CAAA;AACrB,CAAC,EANW,UAAU,KAAV,UAAU,QAMrB;AAED,gDAAgD;AAChD,MAAM,CAAN,IAAY,YAaX;AAbD,WAAY,YAAY;IACvB,2DAAgB,CAAA;IAChB,qEAAqB,CAAA;IACrB,qEAAqB,CAAA;IACrB,uEAAsB,CAAA;IACtB,uEAAsB,CAAA;IACtB,iEAAmB,CAAA;IACnB,+CAAU,CAAA;IACV,6DAAiB,CAAA;IACjB,yDAAe,CAAA;IACf,+DAAkB,CAAA;IAClB,gDAAU,CAAA;IACV,8CAAS,CAAA;AACV,CAAC,EAbW,YAAY,KAAZ,YAAY,QAavB;AAED,kEAAkE;AAClE,MAAM,CAAN,IAAY,WAWX;AAXD,WAAY,WAAW;IACtB,+CAAW,CAAA;IACX,+DAAmB,CAAA;IACnB,+DAAmB,CAAA;IACnB,qEAAsB,CAAA;IACtB,yEAAwB,CAAA;IACxB,yEAAwB,CAAA;IACxB,6DAAkB,CAAA;IAClB,iEAAoB,CAAA;IACpB,iEAAoB,CAAA;IACpB,wDAAe,CAAA;AAChB,CAAC,EAXW,WAAW,KAAX,WAAW,QAWtB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HidItem } from "./hid-item.js";
|
|
2
|
+
/**
|
|
3
|
+
* The item's data read as a little-endian unsigned integer — how HID 1.11
|
|
4
|
+
* §6.2.2.7 reads Usage Page, Report Size, Report Count, Report ID and Unit.
|
|
5
|
+
*
|
|
6
|
+
* Use {@link hidItemSigned} for Logical/Physical Minimum and other signed
|
|
7
|
+
* values. An empty data field reads as 0.
|
|
8
|
+
*
|
|
9
|
+
* @throws {RangeError} When the data is longer than 4 bytes (a long item).
|
|
10
|
+
*/
|
|
11
|
+
export declare function hidItemUnsigned(item: HidItem): number;
|
|
12
|
+
/**
|
|
13
|
+
* The item's data read as a little-endian two's-complement integer of its own
|
|
14
|
+
* width — 1, 2 or 4 bytes — as HID 1.11 §6.2.2.7 reads Logical and Physical
|
|
15
|
+
* Minimum. An empty data field reads as 0.
|
|
16
|
+
*
|
|
17
|
+
* @throws {RangeError} When the data is longer than 4 bytes (a long item).
|
|
18
|
+
*/
|
|
19
|
+
export declare function hidItemSigned(item: HidItem): number;
|
|
20
|
+
//# sourceMappingURL=hid-item-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hid-item-value.d.ts","sourceRoot":"","sources":["../../src/item/hid-item-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAcrD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAQnD"}
|