@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.
- package/LICENSE +674 -0
- package/README.md +154 -0
- package/dist/bytes.d.ts +9 -0
- package/dist/bytes.d.ts.map +1 -0
- package/dist/bytes.js +13 -0
- package/dist/bytes.js.map +1 -0
- package/dist/constants.d.ts +174 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +122 -0
- package/dist/constants.js.map +1 -0
- package/dist/decoders/airflow.d.ts +19 -0
- package/dist/decoders/airflow.d.ts.map +1 -0
- package/dist/decoders/airflow.js +36 -0
- package/dist/decoders/airflow.js.map +1 -0
- package/dist/decoders/engineSpeed.d.ts +20 -0
- package/dist/decoders/engineSpeed.d.ts.map +1 -0
- package/dist/decoders/engineSpeed.js +33 -0
- package/dist/decoders/engineSpeed.js.map +1 -0
- package/dist/decoders/faultCodes.d.ts +19 -0
- package/dist/decoders/faultCodes.d.ts.map +1 -0
- package/dist/decoders/faultCodes.js +48 -0
- package/dist/decoders/faultCodes.js.map +1 -0
- package/dist/decoders/flags.d.ts +45 -0
- package/dist/decoders/flags.d.ts.map +1 -0
- package/dist/decoders/flags.js +54 -0
- package/dist/decoders/flags.js.map +1 -0
- package/dist/decoders/fuelMap.d.ts +89 -0
- package/dist/decoders/fuelMap.d.ts.map +1 -0
- package/dist/decoders/fuelMap.js +109 -0
- package/dist/decoders/fuelMap.js.map +1 -0
- package/dist/decoders/gear.d.ts +10 -0
- package/dist/decoders/gear.d.ts.map +1 -0
- package/dist/decoders/gear.js +23 -0
- package/dist/decoders/gear.js.map +1 -0
- package/dist/decoders/idleBypass.d.ts +8 -0
- package/dist/decoders/idleBypass.d.ts.map +1 -0
- package/dist/decoders/idleBypass.js +15 -0
- package/dist/decoders/idleBypass.js.map +1 -0
- package/dist/decoders/lambdaTrim.d.ts +15 -0
- package/dist/decoders/lambdaTrim.d.ts.map +1 -0
- package/dist/decoders/lambdaTrim.js +23 -0
- package/dist/decoders/lambdaTrim.js.map +1 -0
- package/dist/decoders/mainVoltage.d.ts +14 -0
- package/dist/decoders/mainVoltage.d.ts.map +1 -0
- package/dist/decoders/mainVoltage.js +26 -0
- package/dist/decoders/mainVoltage.js.map +1 -0
- package/dist/decoders/roadSpeed.d.ts +8 -0
- package/dist/decoders/roadSpeed.d.ts.map +1 -0
- package/dist/decoders/roadSpeed.js +14 -0
- package/dist/decoders/roadSpeed.js.map +1 -0
- package/dist/decoders/romRevision.d.ts +18 -0
- package/dist/decoders/romRevision.d.ts.map +1 -0
- package/dist/decoders/romRevision.js +26 -0
- package/dist/decoders/romRevision.js.map +1 -0
- package/dist/decoders/temperature.d.ts +12 -0
- package/dist/decoders/temperature.d.ts.map +1 -0
- package/dist/decoders/temperature.js +39 -0
- package/dist/decoders/temperature.js.map +1 -0
- package/dist/decoders/throttle.d.ts +18 -0
- package/dist/decoders/throttle.d.ts.map +1 -0
- package/dist/decoders/throttle.js +33 -0
- package/dist/decoders/throttle.js.map +1 -0
- package/dist/decoders/tuneRevision.d.ts +25 -0
- package/dist/decoders/tuneRevision.d.ts.map +1 -0
- package/dist/decoders/tuneRevision.js +22 -0
- package/dist/decoders/tuneRevision.js.map +1 -0
- package/dist/ecu.d.ts +473 -0
- package/dist/ecu.d.ts.map +1 -0
- package/dist/ecu.js +700 -0
- package/dist/ecu.js.map +1 -0
- package/dist/errors.d.ts +31 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +33 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/protocol.d.ts +57 -0
- package/dist/protocol/protocol.d.ts.map +1 -0
- package/dist/protocol/protocol.js +137 -0
- package/dist/protocol/protocol.js.map +1 -0
- package/dist/protocol/readCount.d.ts +21 -0
- package/dist/protocol/readCount.d.ts.map +1 -0
- package/dist/protocol/readCount.js +30 -0
- package/dist/protocol/readCount.js.map +1 -0
- package/dist/queue.d.ts +15 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +21 -0
- package/dist/queue.js.map +1 -0
- package/dist/transport/simulated.d.ts +65 -0
- package/dist/transport/simulated.d.ts.map +1 -0
- package/dist/transport/simulated.js +190 -0
- package/dist/transport/simulated.js.map +1 -0
- package/dist/transport/types.d.ts +9 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +4 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/webSerial.d.ts +49 -0
- package/dist/transport/webSerial.d.ts.map +1 -0
- package/dist/transport/webSerial.js +129 -0
- package/dist/transport/webSerial.js.map +1 -0
- package/dist/version.d.ts +18 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +58 -0
- package/src/bytes.ts +13 -0
- package/src/constants.ts +175 -0
- package/src/decoders/airflow.ts +41 -0
- package/src/decoders/engineSpeed.ts +36 -0
- package/src/decoders/faultCodes.ts +61 -0
- package/src/decoders/flags.ts +64 -0
- package/src/decoders/fuelMap.ts +167 -0
- package/src/decoders/gear.ts +26 -0
- package/src/decoders/idleBypass.ts +16 -0
- package/src/decoders/lambdaTrim.ts +24 -0
- package/src/decoders/mainVoltage.ts +37 -0
- package/src/decoders/roadSpeed.ts +14 -0
- package/src/decoders/romRevision.ts +30 -0
- package/src/decoders/temperature.ts +42 -0
- package/src/decoders/throttle.ts +37 -0
- package/src/decoders/tuneRevision.ts +42 -0
- package/src/ecu.ts +948 -0
- package/src/errors.ts +38 -0
- package/src/index.ts +16 -0
- package/src/protocol/protocol.ts +167 -0
- package/src/protocol/readCount.ts +45 -0
- package/src/queue.ts +24 -0
- package/src/test-support/ecu.ts +126 -0
- package/src/transport/simulated.ts +220 -0
- package/src/transport/types.ts +11 -0
- package/src/transport/webSerial.ts +163 -0
- package/src/version.ts +21 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 comm14cux-ts contributors
|
|
3
|
+
|
|
4
|
+
import { BAUD } from '../constants.js';
|
|
5
|
+
import { NotConnectedError, TimeoutError } from '../errors.js';
|
|
6
|
+
import type { Transport } from './types.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Options for {@link WebSerialTransport}.
|
|
10
|
+
*/
|
|
11
|
+
export interface WebSerialTransportOptions {
|
|
12
|
+
/** 7812 for standard ECUs; 15625 for modified double-speed firmware. */
|
|
13
|
+
baudRate?: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** `Transport` over a Web Serial `SerialPort` (8N1, no flow control). */
|
|
17
|
+
export class WebSerialTransport implements Transport {
|
|
18
|
+
readonly #port: SerialPort;
|
|
19
|
+
readonly #baudRate: number;
|
|
20
|
+
#reader: ReadableStreamDefaultReader<Uint8Array> | undefined;
|
|
21
|
+
#writer: WritableStreamDefaultWriter<Uint8Array> | undefined;
|
|
22
|
+
#pending: Promise<ReadableStreamReadResult<Uint8Array>> | undefined;
|
|
23
|
+
#leftover: Uint8Array = new Uint8Array(0);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Wraps a serial port. The port is not opened until {@link WebSerialTransport.open}.
|
|
27
|
+
*
|
|
28
|
+
* @param port - A port the user has granted access to, from
|
|
29
|
+
* `navigator.serial.requestPort()`.
|
|
30
|
+
* @param options - Optional settings.
|
|
31
|
+
*/
|
|
32
|
+
constructor(port: SerialPort, options: WebSerialTransportOptions = {}) {
|
|
33
|
+
this.#port = port;
|
|
34
|
+
this.#baudRate = options.baudRate ?? BAUD;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Opens the port at the configured baud rate, 8N1 with no flow control.
|
|
39
|
+
* Does nothing if already open.
|
|
40
|
+
*/
|
|
41
|
+
async open(): Promise<void> {
|
|
42
|
+
if (this.#reader) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
await this.#port.open({
|
|
47
|
+
baudRate: this.#baudRate,
|
|
48
|
+
dataBits: 8,
|
|
49
|
+
stopBits: 1,
|
|
50
|
+
parity: 'none',
|
|
51
|
+
flowControl: 'none',
|
|
52
|
+
});
|
|
53
|
+
this.#reader = this.#port.readable?.getReader();
|
|
54
|
+
this.#writer = this.#port.writable?.getWriter();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Cancels any pending read, releases the stream locks and closes the port.
|
|
59
|
+
* Does nothing if not open.
|
|
60
|
+
*/
|
|
61
|
+
async close(): Promise<void> {
|
|
62
|
+
const reader = this.#reader;
|
|
63
|
+
const writer = this.#writer;
|
|
64
|
+
|
|
65
|
+
this.#reader = undefined;
|
|
66
|
+
this.#writer = undefined;
|
|
67
|
+
this.#pending = undefined;
|
|
68
|
+
this.#leftover = new Uint8Array(0);
|
|
69
|
+
|
|
70
|
+
if (!reader) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
await reader.cancel().catch(() => undefined);
|
|
75
|
+
reader.releaseLock();
|
|
76
|
+
writer?.releaseLock();
|
|
77
|
+
await this.#port.close();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Writes bytes to the port.
|
|
82
|
+
*
|
|
83
|
+
* @param data - Bytes to send.
|
|
84
|
+
* @throws {@link NotConnectedError} if the port is not open.
|
|
85
|
+
*/
|
|
86
|
+
async write(data: Uint8Array): Promise<void> {
|
|
87
|
+
if (!this.#writer) {
|
|
88
|
+
throw new NotConnectedError('Serial port is not open');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
await this.#writer.write(data);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Reads exactly `length` bytes, assembling them from as many chunks as needed.
|
|
96
|
+
* Surplus bytes are kept for the next call.
|
|
97
|
+
*
|
|
98
|
+
* @param length - Number of bytes wanted.
|
|
99
|
+
* @param timeoutMs - Longest silence to wait for more data, in milliseconds.
|
|
100
|
+
* @returns Exactly `length` bytes.
|
|
101
|
+
* @throws {@link TimeoutError} if no data arrives within `timeoutMs`.
|
|
102
|
+
* @throws {@link NotConnectedError} if the port is not open or the stream ends.
|
|
103
|
+
*/
|
|
104
|
+
async read(length: number, timeoutMs: number): Promise<Uint8Array> {
|
|
105
|
+
const reader = this.#reader;
|
|
106
|
+
|
|
107
|
+
if (!reader) {
|
|
108
|
+
throw new NotConnectedError('Serial port is not open');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const result = new Uint8Array(length);
|
|
112
|
+
let filled = 0;
|
|
113
|
+
|
|
114
|
+
while (filled < length) {
|
|
115
|
+
if (this.#leftover.length === 0) {
|
|
116
|
+
this.#leftover = await this.#nextChunk(reader, timeoutMs);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const take = Math.min(length - filled, this.#leftover.length);
|
|
120
|
+
|
|
121
|
+
result.set(this.#leftover.subarray(0, take), filled);
|
|
122
|
+
this.#leftover = this.#leftover.subarray(take);
|
|
123
|
+
filled += take;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async #nextChunk(
|
|
130
|
+
reader: ReadableStreamDefaultReader<Uint8Array>,
|
|
131
|
+
timeoutMs: number,
|
|
132
|
+
): Promise<Uint8Array> {
|
|
133
|
+
// A read that timed out is still pending; reuse it so no data is lost.
|
|
134
|
+
const pending = (this.#pending ??= reader.read());
|
|
135
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
136
|
+
|
|
137
|
+
const timeout = new Promise<never>((_, reject) => {
|
|
138
|
+
timer = setTimeout(() => {
|
|
139
|
+
reject(new TimeoutError(`No data from ECU for ${timeoutMs} ms`));
|
|
140
|
+
}, timeoutMs);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
const chunk = await Promise.race([pending, timeout]);
|
|
145
|
+
|
|
146
|
+
this.#pending = undefined;
|
|
147
|
+
|
|
148
|
+
if (chunk.done) {
|
|
149
|
+
throw new NotConnectedError('Serial stream ended');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return chunk.value;
|
|
153
|
+
} catch (error) {
|
|
154
|
+
if (!(error instanceof TimeoutError)) {
|
|
155
|
+
this.#pending = undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
throw error;
|
|
159
|
+
} finally {
|
|
160
|
+
clearTimeout(timer);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
package/src/version.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-only
|
|
2
|
+
// Copyright (C) 2026 comm14cux-ts contributors
|
|
3
|
+
|
|
4
|
+
/** Major/minor/patch version of this library (`c14cux_version`). */
|
|
5
|
+
export interface Version {
|
|
6
|
+
/**
|
|
7
|
+
* Major version number.
|
|
8
|
+
*/
|
|
9
|
+
major: number;
|
|
10
|
+
/**
|
|
11
|
+
* Minor version number.
|
|
12
|
+
*/
|
|
13
|
+
minor: number;
|
|
14
|
+
/**
|
|
15
|
+
* Patch version number.
|
|
16
|
+
*/
|
|
17
|
+
patch: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Must match `version` in package.json (enforced by a test). */
|
|
21
|
+
export const LIBRARY_VERSION: Version = { major: 0, minor: 0, patch: 0 };
|