@kb1rma/libcomm14cux-ts 0.0.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.
Files changed (134) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +154 -0
  3. package/dist/bytes.d.ts +9 -0
  4. package/dist/bytes.d.ts.map +1 -0
  5. package/dist/bytes.js +13 -0
  6. package/dist/bytes.js.map +1 -0
  7. package/dist/constants.d.ts +174 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +122 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/decoders/airflow.d.ts +19 -0
  12. package/dist/decoders/airflow.d.ts.map +1 -0
  13. package/dist/decoders/airflow.js +36 -0
  14. package/dist/decoders/airflow.js.map +1 -0
  15. package/dist/decoders/engineSpeed.d.ts +20 -0
  16. package/dist/decoders/engineSpeed.d.ts.map +1 -0
  17. package/dist/decoders/engineSpeed.js +33 -0
  18. package/dist/decoders/engineSpeed.js.map +1 -0
  19. package/dist/decoders/faultCodes.d.ts +19 -0
  20. package/dist/decoders/faultCodes.d.ts.map +1 -0
  21. package/dist/decoders/faultCodes.js +48 -0
  22. package/dist/decoders/faultCodes.js.map +1 -0
  23. package/dist/decoders/flags.d.ts +45 -0
  24. package/dist/decoders/flags.d.ts.map +1 -0
  25. package/dist/decoders/flags.js +54 -0
  26. package/dist/decoders/flags.js.map +1 -0
  27. package/dist/decoders/fuelMap.d.ts +89 -0
  28. package/dist/decoders/fuelMap.d.ts.map +1 -0
  29. package/dist/decoders/fuelMap.js +109 -0
  30. package/dist/decoders/fuelMap.js.map +1 -0
  31. package/dist/decoders/gear.d.ts +10 -0
  32. package/dist/decoders/gear.d.ts.map +1 -0
  33. package/dist/decoders/gear.js +23 -0
  34. package/dist/decoders/gear.js.map +1 -0
  35. package/dist/decoders/idleBypass.d.ts +8 -0
  36. package/dist/decoders/idleBypass.d.ts.map +1 -0
  37. package/dist/decoders/idleBypass.js +15 -0
  38. package/dist/decoders/idleBypass.js.map +1 -0
  39. package/dist/decoders/lambdaTrim.d.ts +15 -0
  40. package/dist/decoders/lambdaTrim.d.ts.map +1 -0
  41. package/dist/decoders/lambdaTrim.js +23 -0
  42. package/dist/decoders/lambdaTrim.js.map +1 -0
  43. package/dist/decoders/mainVoltage.d.ts +14 -0
  44. package/dist/decoders/mainVoltage.d.ts.map +1 -0
  45. package/dist/decoders/mainVoltage.js +26 -0
  46. package/dist/decoders/mainVoltage.js.map +1 -0
  47. package/dist/decoders/roadSpeed.d.ts +8 -0
  48. package/dist/decoders/roadSpeed.d.ts.map +1 -0
  49. package/dist/decoders/roadSpeed.js +14 -0
  50. package/dist/decoders/roadSpeed.js.map +1 -0
  51. package/dist/decoders/romRevision.d.ts +18 -0
  52. package/dist/decoders/romRevision.d.ts.map +1 -0
  53. package/dist/decoders/romRevision.js +26 -0
  54. package/dist/decoders/romRevision.js.map +1 -0
  55. package/dist/decoders/temperature.d.ts +12 -0
  56. package/dist/decoders/temperature.d.ts.map +1 -0
  57. package/dist/decoders/temperature.js +39 -0
  58. package/dist/decoders/temperature.js.map +1 -0
  59. package/dist/decoders/throttle.d.ts +18 -0
  60. package/dist/decoders/throttle.d.ts.map +1 -0
  61. package/dist/decoders/throttle.js +33 -0
  62. package/dist/decoders/throttle.js.map +1 -0
  63. package/dist/decoders/tuneRevision.d.ts +25 -0
  64. package/dist/decoders/tuneRevision.d.ts.map +1 -0
  65. package/dist/decoders/tuneRevision.js +22 -0
  66. package/dist/decoders/tuneRevision.js.map +1 -0
  67. package/dist/ecu.d.ts +473 -0
  68. package/dist/ecu.d.ts.map +1 -0
  69. package/dist/ecu.js +700 -0
  70. package/dist/ecu.js.map +1 -0
  71. package/dist/errors.d.ts +31 -0
  72. package/dist/errors.d.ts.map +1 -0
  73. package/dist/errors.js +33 -0
  74. package/dist/errors.js.map +1 -0
  75. package/dist/index.d.ts +11 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +8 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/protocol/protocol.d.ts +57 -0
  80. package/dist/protocol/protocol.d.ts.map +1 -0
  81. package/dist/protocol/protocol.js +137 -0
  82. package/dist/protocol/protocol.js.map +1 -0
  83. package/dist/protocol/readCount.d.ts +21 -0
  84. package/dist/protocol/readCount.d.ts.map +1 -0
  85. package/dist/protocol/readCount.js +30 -0
  86. package/dist/protocol/readCount.js.map +1 -0
  87. package/dist/queue.d.ts +15 -0
  88. package/dist/queue.d.ts.map +1 -0
  89. package/dist/queue.js +21 -0
  90. package/dist/queue.js.map +1 -0
  91. package/dist/transport/simulated.d.ts +65 -0
  92. package/dist/transport/simulated.d.ts.map +1 -0
  93. package/dist/transport/simulated.js +190 -0
  94. package/dist/transport/simulated.js.map +1 -0
  95. package/dist/transport/types.d.ts +9 -0
  96. package/dist/transport/types.d.ts.map +1 -0
  97. package/dist/transport/types.js +4 -0
  98. package/dist/transport/types.js.map +1 -0
  99. package/dist/transport/webSerial.d.ts +49 -0
  100. package/dist/transport/webSerial.d.ts.map +1 -0
  101. package/dist/transport/webSerial.js +129 -0
  102. package/dist/transport/webSerial.js.map +1 -0
  103. package/dist/version.d.ts +18 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +5 -0
  106. package/dist/version.js.map +1 -0
  107. package/package.json +58 -0
  108. package/src/bytes.ts +13 -0
  109. package/src/constants.ts +175 -0
  110. package/src/decoders/airflow.ts +41 -0
  111. package/src/decoders/engineSpeed.ts +36 -0
  112. package/src/decoders/faultCodes.ts +61 -0
  113. package/src/decoders/flags.ts +64 -0
  114. package/src/decoders/fuelMap.ts +167 -0
  115. package/src/decoders/gear.ts +26 -0
  116. package/src/decoders/idleBypass.ts +16 -0
  117. package/src/decoders/lambdaTrim.ts +24 -0
  118. package/src/decoders/mainVoltage.ts +37 -0
  119. package/src/decoders/roadSpeed.ts +14 -0
  120. package/src/decoders/romRevision.ts +30 -0
  121. package/src/decoders/temperature.ts +42 -0
  122. package/src/decoders/throttle.ts +37 -0
  123. package/src/decoders/tuneRevision.ts +42 -0
  124. package/src/ecu.ts +948 -0
  125. package/src/errors.ts +38 -0
  126. package/src/index.ts +16 -0
  127. package/src/protocol/protocol.ts +167 -0
  128. package/src/protocol/readCount.ts +45 -0
  129. package/src/queue.ts +24 -0
  130. package/src/test-support/ecu.ts +126 -0
  131. package/src/transport/simulated.ts +220 -0
  132. package/src/transport/types.ts +11 -0
  133. package/src/transport/webSerial.ts +163 -0
  134. package/src/version.ts +21 -0
@@ -0,0 +1,30 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ // Derived from libcomm14cux (https://github.com/colinbourassa/libcomm14cux)
3
+ // Copyright (C) Colin Bourassa. Licensed under the GNU GPL v3.
4
+ // Ported to TypeScript and modified for comm14cux-ts, 2026.
5
+
6
+ import { DataOffsetRev } from '../constants.js';
7
+
8
+ /**
9
+ * Tells whether the ROM uses the Rev C data layout. The first row of a fuel
10
+ * map never reaches 0x30, so a larger value at the old Map 1 location means it
11
+ * is not map data.
12
+ *
13
+ * @param oldMap1FirstRow - The 16 bytes read from 0xC23F.
14
+ * @returns `true` for the Rev C layout.
15
+ */
16
+ export function isRevC(oldMap1FirstRow: Uint8Array): boolean {
17
+ return oldMap1FirstRow.some((value) => value > 0x30);
18
+ }
19
+
20
+ /**
21
+ * Distinguishes Rev A from Rev B by the first main voltage factor byte.
22
+ *
23
+ * @param voltageFactorA - The byte read from 0xC79B.
24
+ * @returns Rev A if it is 0xFF, otherwise Rev B.
25
+ */
26
+ export function classifyOldRevision(
27
+ voltageFactorA: number,
28
+ ): typeof DataOffsetRev.RevA | typeof DataOffsetRev.RevB {
29
+ return voltageFactorA === 0xff ? DataOffsetRev.RevA : DataOffsetRev.RevB;
30
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ // Derived from libcomm14cux (https://github.com/colinbourassa/libcomm14cux)
3
+ // Copyright (C) Colin Bourassa. Licensed under the GNU GPL v3.
4
+ // Ported to TypeScript and modified for comm14cux-ts, 2026.
5
+ import { InvalidReadingError } from '../errors.js';
6
+
7
+ /** ADC count to degrees Fahrenheit (`temperature_adc_to_degrees_f`). */
8
+ export const TEMPERATURE_ADC_TO_DEGREES_F: readonly number[] = [
9
+ 266, 264, 260, 258, 255, 253, 249, 248, 244, 242, 239, 237, 233, 231, 228,
10
+ 226, 222, 221, 219, 217, 215, 213, 212, 210, 208, 206, 204, 203, 201, 199,
11
+ 197, 195, 194, 192, 190, 188, 186, 185, 183, 181, 179, 177, 176, 174, 172,
12
+ 170, 168, 167, 165, 163, 161, 159, 158, 158, 156, 154, 152, 150, 149, 147,
13
+ 145, 145, 143, 141, 140, 138, 138, 136, 136, 134, 132, 132, 131, 131, 129,
14
+ 129, 127, 125, 125, 123, 123, 122, 122, 120, 120, 118, 118, 116, 116, 114,
15
+ 114, 113, 113, 111, 111, 109, 109, 107, 107, 105, 105, 104, 104, 102, 102,
16
+ 100, 100, 98, 98, 96, 96, 95, 95, 95, 93, 93, 91, 91, 89, 89, 87, 87, 86, 86,
17
+ 84, 84, 82, 82, 82, 82, 80, 80, 78, 78, 78, 77, 77, 75, 75, 73, 73, 73, 71,
18
+ 71, 71, 69, 69, 68, 68, 66, 66, 64, 64, 62, 62, 60, 60, 59, 59, 57, 57, 57,
19
+ 55, 55, 53, 53, 51, 51, 50, 50, 48, 48, 46, 46, 44, 44, 44, 44, 42, 42, 42,
20
+ 41, 41, 41, 39, 39, 37, 37, 37, 35, 35, 35, 35, 33, 33, 32, 32, 31, 31, 29,
21
+ 29, 27, 27, 25, 25, 23, 23, 22, 22, 22, 20, 20, 18, 18, 18, 16, 16, 14, 14,
22
+ 13, 13, 13, 11, 11, 11, 9, 9, 7, 7, 5, 5, 4, 4, 2, 2, 0, 0, -2, -2, -4, -4,
23
+ -4, -5, -5, -7, -7, -7, -9, -9, -9, -11, -11, -11, -13, -13, -13,
24
+ ];
25
+
26
+ /**
27
+ * Converts a coolant or fuel temperature sensor ADC count to degrees
28
+ * Fahrenheit.
29
+ *
30
+ * @param adcCount - The byte read from the sensor location, 0 to 255.
31
+ * @returns Temperature in degrees Fahrenheit.
32
+ * @throws {@link InvalidReadingError} if `adcCount` is not 0 to 255.
33
+ */
34
+ export function decodeTemperatureF(adcCount: number): number {
35
+ const degrees = TEMPERATURE_ADC_TO_DEGREES_F[adcCount];
36
+
37
+ if (degrees === undefined) {
38
+ throw new InvalidReadingError(`Invalid temperature ADC count: ${adcCount}`);
39
+ }
40
+
41
+ return degrees;
42
+ }
@@ -0,0 +1,37 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ // Derived from libcomm14cux (https://github.com/colinbourassa/libcomm14cux)
3
+ // Copyright (C) Colin Bourassa. Licensed under the GNU GPL v3.
4
+ // Ported to TypeScript and modified for comm14cux-ts, 2026.
5
+
6
+ import { InvalidReadingError } from '../errors.js';
7
+
8
+ const MAX_READING = 1023;
9
+
10
+ /**
11
+ * Rejects a raw throttle reading above the 10-bit maximum.
12
+ *
13
+ * @param raw - The raw reading.
14
+ * @throws {@link InvalidReadingError} if `raw` is above 1023.
15
+ */
16
+ export function assertThrottleReading(raw: number): void {
17
+ if (raw > MAX_READING) {
18
+ throw new InvalidReadingError(`Throttle reading out of range: ${raw}`);
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Decodes the throttle position.
24
+ *
25
+ * @param raw - The 10-bit reading, 0 to 1023.
26
+ * @param minimum - 0 for an absolute reading, or the ECU's stored minimum for a
27
+ * corrected reading.
28
+ * @returns Position as a fraction from 0 (closed) to 1 (wide open).
29
+ * @throws {@link InvalidReadingError} if `raw` is above 1023.
30
+ */
31
+ export function decodeThrottlePosition(raw: number, minimum: number): number {
32
+ assertThrottleReading(raw);
33
+
34
+ // A glitch can put the reading below the stored minimum; report zero
35
+ // (this also avoids dividing by zero when the minimum is 1023).
36
+ return raw > minimum ? (raw - minimum) / (MAX_READING - minimum) : 0;
37
+ }
@@ -0,0 +1,42 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ // Derived from libcomm14cux (https://github.com/colinbourassa/libcomm14cux)
3
+ // Copyright (C) Colin Bourassa. Licensed under the GNU GPL v3.
4
+ // Ported to TypeScript and modified for comm14cux-ts, 2026.
5
+
6
+ /**
7
+ * Tune identification stored in the ROM.
8
+ */
9
+ export interface TuneRevision {
10
+ /**
11
+ * Decimal tune number decoded from two BCD bytes.
12
+ */
13
+ tuneNumber: number;
14
+ /**
15
+ * Checksum fixer byte.
16
+ */
17
+ checksumFixer: number;
18
+ /**
19
+ * Ident word, which differentiates builds of the same tune number.
20
+ */
21
+ tuneIdent: number;
22
+ }
23
+
24
+ function bcd(byte: number): number {
25
+ return (byte >> 4) * 10 + (byte & 0x0f);
26
+ }
27
+
28
+ /**
29
+ * Decodes the five tune identification bytes.
30
+ *
31
+ * @param bytes - The bytes read from 0xFFE9.
32
+ * @returns The tune number, checksum fixer and ident word.
33
+ */
34
+ export function decodeTuneRevision(bytes: Uint8Array): TuneRevision {
35
+ const [b0 = 0, b1 = 0, fixer = 0, identHigh = 0, identLow = 0] = bytes;
36
+
37
+ return {
38
+ tuneNumber: bcd(b0) * 100 + bcd(b1),
39
+ checksumFixer: fixer,
40
+ tuneIdent: (identHigh << 8) | identLow,
41
+ };
42
+ }