@depz/sensor-sdk 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/README.md +69 -0
- package/dist/dataset.d.ts +93 -0
- package/dist/dataset.d.ts.map +1 -0
- package/dist/dataset.js +253 -0
- package/dist/dataset.js.map +1 -0
- package/dist/device/device.d.ts +185 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +421 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/link.d.ts +62 -0
- package/dist/device/link.d.ts.map +1 -0
- package/dist/device/link.js +130 -0
- package/dist/device/link.js.map +1 -0
- package/dist/discovery.d.ts +109 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +281 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/bno086.d.ts +36 -0
- package/dist/protocol/bno086.d.ts.map +1 -0
- package/dist/protocol/bno086.js +38 -0
- package/dist/protocol/bno086.js.map +1 -0
- package/dist/protocol/common.d.ts +103 -0
- package/dist/protocol/common.d.ts.map +1 -0
- package/dist/protocol/common.js +121 -0
- package/dist/protocol/common.js.map +1 -0
- package/dist/protocol/crc.d.ts +17 -0
- package/dist/protocol/crc.d.ts.map +1 -0
- package/dist/protocol/crc.js +55 -0
- package/dist/protocol/crc.js.map +1 -0
- package/dist/protocol/framing.d.ts +65 -0
- package/dist/protocol/framing.d.ts.map +1 -0
- package/dist/protocol/framing.js +152 -0
- package/dist/protocol/framing.js.map +1 -0
- package/dist/protocol/fwdepz.d.ts +21 -0
- package/dist/protocol/fwdepz.d.ts.map +1 -0
- package/dist/protocol/fwdepz.js +46 -0
- package/dist/protocol/fwdepz.js.map +1 -0
- package/dist/protocol/identity.d.ts +14 -0
- package/dist/protocol/identity.d.ts.map +1 -0
- package/dist/protocol/identity.js +28 -0
- package/dist/protocol/identity.js.map +1 -0
- package/dist/protocol/sr04.d.ts +38 -0
- package/dist/protocol/sr04.d.ts.map +1 -0
- package/dist/protocol/sr04.js +58 -0
- package/dist/protocol/sr04.js.map +1 -0
- package/dist/protocol/usb-ids.d.ts +60 -0
- package/dist/protocol/usb-ids.d.ts.map +1 -0
- package/dist/protocol/usb-ids.js +79 -0
- package/dist/protocol/usb-ids.js.map +1 -0
- package/dist/protocol/vl53l8.d.ts +59 -0
- package/dist/protocol/vl53l8.d.ts.map +1 -0
- package/dist/protocol/vl53l8.js +116 -0
- package/dist/protocol/vl53l8.js.map +1 -0
- package/dist/sensors/bno086/bno086.d.ts +197 -0
- package/dist/sensors/bno086/bno086.d.ts.map +1 -0
- package/dist/sensors/bno086/bno086.js +543 -0
- package/dist/sensors/bno086/bno086.js.map +1 -0
- package/dist/sensors/bno086/reports.d.ts +289 -0
- package/dist/sensors/bno086/reports.d.ts.map +1 -0
- package/dist/sensors/bno086/reports.js +397 -0
- package/dist/sensors/bno086/reports.js.map +1 -0
- package/dist/sensors/bno086/sh2.d.ts +307 -0
- package/dist/sensors/bno086/sh2.d.ts.map +1 -0
- package/dist/sensors/bno086/sh2.js +480 -0
- package/dist/sensors/bno086/sh2.js.map +1 -0
- package/dist/sensors/bno086/shtp.d.ts +98 -0
- package/dist/sensors/bno086/shtp.d.ts.map +1 -0
- package/dist/sensors/bno086/shtp.js +205 -0
- package/dist/sensors/bno086/shtp.js.map +1 -0
- package/dist/sensors/sr04.d.ts +65 -0
- package/dist/sensors/sr04.d.ts.map +1 -0
- package/dist/sensors/sr04.js +121 -0
- package/dist/sensors/sr04.js.map +1 -0
- package/dist/sensors/vl53l8/assets/ch.d.ts +16 -0
- package/dist/sensors/vl53l8/assets/ch.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/ch.js +22 -0
- package/dist/sensors/vl53l8/assets/ch.js.map +1 -0
- package/dist/sensors/vl53l8/assets/cx.d.ts +16 -0
- package/dist/sensors/vl53l8/assets/cx.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/cx.js +22 -0
- package/dist/sensors/vl53l8/assets/cx.js.map +1 -0
- package/dist/sensors/vl53l8/assets/decode.d.ts +7 -0
- package/dist/sensors/vl53l8/assets/decode.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/decode.js +35 -0
- package/dist/sensors/vl53l8/assets/decode.js.map +1 -0
- package/dist/sensors/vl53l8/assets/index.d.ts +19 -0
- package/dist/sensors/vl53l8/assets/index.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/index.js +11 -0
- package/dist/sensors/vl53l8/assets/index.js.map +1 -0
- package/dist/sensors/vl53l8/cnh.d.ts +113 -0
- package/dist/sensors/vl53l8/cnh.d.ts.map +1 -0
- package/dist/sensors/vl53l8/cnh.js +299 -0
- package/dist/sensors/vl53l8/cnh.js.map +1 -0
- package/dist/sensors/vl53l8/uld.d.ts +346 -0
- package/dist/sensors/vl53l8/uld.d.ts.map +1 -0
- package/dist/sensors/vl53l8/uld.js +1388 -0
- package/dist/sensors/vl53l8/uld.js.map +1 -0
- package/dist/sensors/vl53l8/vl53l8.d.ts +182 -0
- package/dist/sensors/vl53l8/vl53l8.d.ts.map +1 -0
- package/dist/sensors/vl53l8/vl53l8.js +411 -0
- package/dist/sensors/vl53l8/vl53l8.js.map +1 -0
- package/dist/transport/loopback.d.ts +18 -0
- package/dist/transport/loopback.d.ts.map +1 -0
- package/dist/transport/loopback.js +53 -0
- package/dist/transport/loopback.js.map +1 -0
- package/dist/transport/node.d.ts +51 -0
- package/dist/transport/node.d.ts.map +1 -0
- package/dist/transport/node.js +123 -0
- package/dist/transport/node.js.map +1 -0
- package/dist/transport/replay.d.ts +68 -0
- package/dist/transport/replay.d.ts.map +1 -0
- package/dist/transport/replay.js +196 -0
- package/dist/transport/replay.js.map +1 -0
- package/dist/transport/types.d.ts +23 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +7 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/webserial.d.ts +69 -0
- package/dist/transport/webserial.d.ts.map +1 -0
- package/dist/transport/webserial.js +196 -0
- package/dist/transport/webserial.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BNO086 bridge-level wire codecs (contracts/05_SENSOR_BNO086.md §1–2).
|
|
3
|
+
*
|
|
4
|
+
* The MCU is a thin SHTP pass-through: SEND_SHTP_PACKET carries a raw SHTP
|
|
5
|
+
* frame to the sensor, and every inbound SHTP frame arrives as RPT_DATA.
|
|
6
|
+
* Per ERRATA E2 the RPT_DATA `cmd` echo is always 0x00 — correlation happens
|
|
7
|
+
* at the SH-2 layer, never here.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the Python reference `depz_sensor_sdk.protocol.bno086`.
|
|
10
|
+
*/
|
|
11
|
+
export declare enum Bno086Cmd {
|
|
12
|
+
/** Hardware reset via nRST; RPT_STATUS OK. */
|
|
13
|
+
SensorReset = 50,
|
|
14
|
+
/** 1 ms WAKE (PS0) pulse; RPT_STATUS OK. */
|
|
15
|
+
SensorWakeUp = 51,
|
|
16
|
+
/** Payload = raw SHTP frame; RPT_STATUS OK/ERR_BUSY. */
|
|
17
|
+
SendShtpPacket = 52
|
|
18
|
+
}
|
|
19
|
+
export declare enum Bno086Rpt {
|
|
20
|
+
/** rpt_data_t: cmd u8, timestamp_us u64, raw SHTP frame. */
|
|
21
|
+
Data = 145
|
|
22
|
+
}
|
|
23
|
+
export declare const TX_SLOTS = 2;
|
|
24
|
+
export declare const TX_SLOT_SIZE = 64;
|
|
25
|
+
export declare const BUSY_BACKOFF_MS = 200;
|
|
26
|
+
/** One RPT_DATA report: an SHTP frame captured from the sensor bus. */
|
|
27
|
+
export interface Bno086Data {
|
|
28
|
+
/** Always 0x00 in practice (ERRATA E2) — never correlate on it. */
|
|
29
|
+
cmd: number;
|
|
30
|
+
/** MCU uptime at frame capture (µs). */
|
|
31
|
+
timestampUs: bigint;
|
|
32
|
+
/** Raw SHTP frame (4-byte header + cargo fragment). */
|
|
33
|
+
shtp: Uint8Array;
|
|
34
|
+
}
|
|
35
|
+
export declare function unpackBno086Data(payload: Uint8Array): Bno086Data;
|
|
36
|
+
//# sourceMappingURL=bno086.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bno086.d.ts","sourceRoot":"","sources":["../../src/protocol/bno086.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oBAAY,SAAS;IACnB,8CAA8C;IAC9C,WAAW,KAAO;IAClB,4CAA4C;IAC5C,YAAY,KAAO;IACnB,wDAAwD;IACxD,cAAc,KAAO;CACtB;AAED,oBAAY,SAAS;IACnB,4DAA4D;IAC5D,IAAI,MAAO;CACZ;AAID,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU,CAOhE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BNO086 bridge-level wire codecs (contracts/05_SENSOR_BNO086.md §1–2).
|
|
3
|
+
*
|
|
4
|
+
* The MCU is a thin SHTP pass-through: SEND_SHTP_PACKET carries a raw SHTP
|
|
5
|
+
* frame to the sensor, and every inbound SHTP frame arrives as RPT_DATA.
|
|
6
|
+
* Per ERRATA E2 the RPT_DATA `cmd` echo is always 0x00 — correlation happens
|
|
7
|
+
* at the SH-2 layer, never here.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors the Python reference `depz_sensor_sdk.protocol.bno086`.
|
|
10
|
+
*/
|
|
11
|
+
export var Bno086Cmd;
|
|
12
|
+
(function (Bno086Cmd) {
|
|
13
|
+
/** Hardware reset via nRST; RPT_STATUS OK. */
|
|
14
|
+
Bno086Cmd[Bno086Cmd["SensorReset"] = 50] = "SensorReset";
|
|
15
|
+
/** 1 ms WAKE (PS0) pulse; RPT_STATUS OK. */
|
|
16
|
+
Bno086Cmd[Bno086Cmd["SensorWakeUp"] = 51] = "SensorWakeUp";
|
|
17
|
+
/** Payload = raw SHTP frame; RPT_STATUS OK/ERR_BUSY. */
|
|
18
|
+
Bno086Cmd[Bno086Cmd["SendShtpPacket"] = 52] = "SendShtpPacket";
|
|
19
|
+
})(Bno086Cmd || (Bno086Cmd = {}));
|
|
20
|
+
export var Bno086Rpt;
|
|
21
|
+
(function (Bno086Rpt) {
|
|
22
|
+
/** rpt_data_t: cmd u8, timestamp_us u64, raw SHTP frame. */
|
|
23
|
+
Bno086Rpt[Bno086Rpt["Data"] = 145] = "Data";
|
|
24
|
+
})(Bno086Rpt || (Bno086Rpt = {}));
|
|
25
|
+
// The MCU keeps two fixed 64-byte SHTP transmit slots (ERRATA E2). A third
|
|
26
|
+
// in-flight SEND_SHTP_PACKET gets RPT_STATUS(ERR_BUSY); back off >= 200 ms.
|
|
27
|
+
export const TX_SLOTS = 2;
|
|
28
|
+
export const TX_SLOT_SIZE = 64;
|
|
29
|
+
export const BUSY_BACKOFF_MS = 200;
|
|
30
|
+
export function unpackBno086Data(payload) {
|
|
31
|
+
const v = new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
|
|
32
|
+
return {
|
|
33
|
+
cmd: v.getUint8(0),
|
|
34
|
+
timestampUs: v.getBigUint64(1, true),
|
|
35
|
+
shtp: payload.subarray(9),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=bno086.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bno086.js","sourceRoot":"","sources":["../../src/protocol/bno086.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAN,IAAY,SAOX;AAPD,WAAY,SAAS;IACnB,8CAA8C;IAC9C,wDAAkB,CAAA;IAClB,4CAA4C;IAC5C,0DAAmB,CAAA;IACnB,wDAAwD;IACxD,8DAAqB,CAAA;AACvB,CAAC,EAPW,SAAS,KAAT,SAAS,QAOpB;AAED,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,4DAA4D;IAC5D,2CAAW,CAAA;AACb,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAED,2EAA2E;AAC3E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC1B,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAC/B,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAYnC,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/E,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClB,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;QACpC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common command/report IDs and payload codecs
|
|
3
|
+
* (contracts/02_COMMON_COMMANDS.md). Raw wire integers only; unit
|
|
4
|
+
* conversions (0.1 °C, µs) happen in the device layer. u64 timestamps are
|
|
5
|
+
* `bigint`.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum Cmd {
|
|
8
|
+
Bootloader = 1,
|
|
9
|
+
DeviceReset = 2,
|
|
10
|
+
GetDeviceName = 3,
|
|
11
|
+
GetNameActiveSoftware = 4,
|
|
12
|
+
GetSerial = 5,
|
|
13
|
+
SyncTime = 6,
|
|
14
|
+
GetMcuTemperature = 7,
|
|
15
|
+
GetPayloadCrcType = 8,
|
|
16
|
+
SetPayloadCrcType = 9,
|
|
17
|
+
ThroughputTxStart = 28,
|
|
18
|
+
ThroughputTxStop = 29,
|
|
19
|
+
ThroughputRxData = 30,
|
|
20
|
+
GetSyncPinConfig = 48,
|
|
21
|
+
SetSyncPinConfig = 49
|
|
22
|
+
}
|
|
23
|
+
export declare enum Rpt {
|
|
24
|
+
Status = 128,
|
|
25
|
+
Text = 129,
|
|
26
|
+
SyncTime = 130,
|
|
27
|
+
Temperature = 131,
|
|
28
|
+
SequenceError = 132,
|
|
29
|
+
PayloadCrcType = 135,
|
|
30
|
+
ThroughputData = 136,
|
|
31
|
+
SyncPinConfig = 144
|
|
32
|
+
}
|
|
33
|
+
export declare enum Status {
|
|
34
|
+
Ok = 0,
|
|
35
|
+
Error = 1,
|
|
36
|
+
ErrInvalidCmd = 2,
|
|
37
|
+
ErrPayloadFormat = 3,
|
|
38
|
+
ErrInvalidParam = 4,
|
|
39
|
+
ErrPayloadCrc = 5,
|
|
40
|
+
ErrBusy = 6,
|
|
41
|
+
ErrCmdNotSupported = 7,
|
|
42
|
+
ErrNotInitialized = 8,
|
|
43
|
+
ErrHardwareFault = 9
|
|
44
|
+
}
|
|
45
|
+
export declare enum SyncPinMode {
|
|
46
|
+
Disable = 0,
|
|
47
|
+
In = 1,
|
|
48
|
+
OutStart = 2,
|
|
49
|
+
OutEnd = 3,
|
|
50
|
+
OutBoth = 4
|
|
51
|
+
}
|
|
52
|
+
export declare enum SyncPinPolarity {
|
|
53
|
+
IdleLow = 0,
|
|
54
|
+
IdleHigh = 1
|
|
55
|
+
}
|
|
56
|
+
/** Value of the echoed-cmd byte in unsolicited reports. */
|
|
57
|
+
export declare const UNSOLICITED = 0;
|
|
58
|
+
export interface StatusReport {
|
|
59
|
+
cmd: number;
|
|
60
|
+
status: number;
|
|
61
|
+
}
|
|
62
|
+
export interface TextReport {
|
|
63
|
+
cmd: number;
|
|
64
|
+
text: string;
|
|
65
|
+
}
|
|
66
|
+
export interface SyncTimeReport {
|
|
67
|
+
pcTimestampUs: bigint;
|
|
68
|
+
mcuRxUs: bigint;
|
|
69
|
+
mcuTxUs: bigint;
|
|
70
|
+
}
|
|
71
|
+
export interface TemperatureReport {
|
|
72
|
+
timestampUs: bigint;
|
|
73
|
+
rawDecidegrees: number;
|
|
74
|
+
}
|
|
75
|
+
export interface SequenceErrorReport {
|
|
76
|
+
expectedSeq: number;
|
|
77
|
+
receivedSeq: number;
|
|
78
|
+
}
|
|
79
|
+
export interface SyncPinConfig {
|
|
80
|
+
pin: number;
|
|
81
|
+
mode: SyncPinMode;
|
|
82
|
+
polarity: SyncPinPolarity;
|
|
83
|
+
}
|
|
84
|
+
export declare function unpackStatus(p: Uint8Array): StatusReport;
|
|
85
|
+
export declare function unpackText(p: Uint8Array): TextReport;
|
|
86
|
+
export declare function unpackSyncTime(p: Uint8Array): SyncTimeReport;
|
|
87
|
+
export declare function unpackTemperature(p: Uint8Array): TemperatureReport;
|
|
88
|
+
export declare function unpackSequenceError(p: Uint8Array): SequenceErrorReport;
|
|
89
|
+
export declare function packSyncTime(pcTimestampUs: bigint): Uint8Array;
|
|
90
|
+
export declare function packSyncPinConfig(cfg: SyncPinConfig): Uint8Array;
|
|
91
|
+
export declare function unpackSyncPinConfig(p: Uint8Array): SyncPinConfig;
|
|
92
|
+
/**
|
|
93
|
+
* NTP-style clock math, all µs (contract 02 §5). offset = device − host,
|
|
94
|
+
* `((T2-T1)+(T3-T4))/2` truncated toward zero (bigint division is exactly
|
|
95
|
+
* that); rtt = (T4-T1)-(T3-T2).
|
|
96
|
+
*/
|
|
97
|
+
export declare function syncTimeOffsetRtt(t1: bigint, t2: bigint, t3: bigint, t4: bigint): {
|
|
98
|
+
offsetUs: bigint;
|
|
99
|
+
rttUs: bigint;
|
|
100
|
+
};
|
|
101
|
+
/** Decode an ASCII device string, dropping trailing NUL/0xFF filler. */
|
|
102
|
+
export declare function stripDeviceString(raw: Uint8Array): string;
|
|
103
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/protocol/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common command/report IDs and payload codecs
|
|
3
|
+
* (contracts/02_COMMON_COMMANDS.md). Raw wire integers only; unit
|
|
4
|
+
* conversions (0.1 °C, µs) happen in the device layer. u64 timestamps are
|
|
5
|
+
* `bigint`.
|
|
6
|
+
*/
|
|
7
|
+
export var Cmd;
|
|
8
|
+
(function (Cmd) {
|
|
9
|
+
Cmd[Cmd["Bootloader"] = 1] = "Bootloader";
|
|
10
|
+
Cmd[Cmd["DeviceReset"] = 2] = "DeviceReset";
|
|
11
|
+
Cmd[Cmd["GetDeviceName"] = 3] = "GetDeviceName";
|
|
12
|
+
Cmd[Cmd["GetNameActiveSoftware"] = 4] = "GetNameActiveSoftware";
|
|
13
|
+
Cmd[Cmd["GetSerial"] = 5] = "GetSerial";
|
|
14
|
+
Cmd[Cmd["SyncTime"] = 6] = "SyncTime";
|
|
15
|
+
Cmd[Cmd["GetMcuTemperature"] = 7] = "GetMcuTemperature";
|
|
16
|
+
Cmd[Cmd["GetPayloadCrcType"] = 8] = "GetPayloadCrcType";
|
|
17
|
+
Cmd[Cmd["SetPayloadCrcType"] = 9] = "SetPayloadCrcType";
|
|
18
|
+
Cmd[Cmd["ThroughputTxStart"] = 28] = "ThroughputTxStart";
|
|
19
|
+
Cmd[Cmd["ThroughputTxStop"] = 29] = "ThroughputTxStop";
|
|
20
|
+
Cmd[Cmd["ThroughputRxData"] = 30] = "ThroughputRxData";
|
|
21
|
+
Cmd[Cmd["GetSyncPinConfig"] = 48] = "GetSyncPinConfig";
|
|
22
|
+
Cmd[Cmd["SetSyncPinConfig"] = 49] = "SetSyncPinConfig";
|
|
23
|
+
})(Cmd || (Cmd = {}));
|
|
24
|
+
export var Rpt;
|
|
25
|
+
(function (Rpt) {
|
|
26
|
+
Rpt[Rpt["Status"] = 128] = "Status";
|
|
27
|
+
Rpt[Rpt["Text"] = 129] = "Text";
|
|
28
|
+
Rpt[Rpt["SyncTime"] = 130] = "SyncTime";
|
|
29
|
+
Rpt[Rpt["Temperature"] = 131] = "Temperature";
|
|
30
|
+
Rpt[Rpt["SequenceError"] = 132] = "SequenceError";
|
|
31
|
+
Rpt[Rpt["PayloadCrcType"] = 135] = "PayloadCrcType";
|
|
32
|
+
Rpt[Rpt["ThroughputData"] = 136] = "ThroughputData";
|
|
33
|
+
Rpt[Rpt["SyncPinConfig"] = 144] = "SyncPinConfig";
|
|
34
|
+
})(Rpt || (Rpt = {}));
|
|
35
|
+
export var Status;
|
|
36
|
+
(function (Status) {
|
|
37
|
+
Status[Status["Ok"] = 0] = "Ok";
|
|
38
|
+
Status[Status["Error"] = 1] = "Error";
|
|
39
|
+
Status[Status["ErrInvalidCmd"] = 2] = "ErrInvalidCmd";
|
|
40
|
+
Status[Status["ErrPayloadFormat"] = 3] = "ErrPayloadFormat";
|
|
41
|
+
Status[Status["ErrInvalidParam"] = 4] = "ErrInvalidParam";
|
|
42
|
+
Status[Status["ErrPayloadCrc"] = 5] = "ErrPayloadCrc";
|
|
43
|
+
Status[Status["ErrBusy"] = 6] = "ErrBusy";
|
|
44
|
+
Status[Status["ErrCmdNotSupported"] = 7] = "ErrCmdNotSupported";
|
|
45
|
+
Status[Status["ErrNotInitialized"] = 8] = "ErrNotInitialized";
|
|
46
|
+
Status[Status["ErrHardwareFault"] = 9] = "ErrHardwareFault";
|
|
47
|
+
})(Status || (Status = {}));
|
|
48
|
+
export var SyncPinMode;
|
|
49
|
+
(function (SyncPinMode) {
|
|
50
|
+
SyncPinMode[SyncPinMode["Disable"] = 0] = "Disable";
|
|
51
|
+
SyncPinMode[SyncPinMode["In"] = 1] = "In";
|
|
52
|
+
SyncPinMode[SyncPinMode["OutStart"] = 2] = "OutStart";
|
|
53
|
+
SyncPinMode[SyncPinMode["OutEnd"] = 3] = "OutEnd";
|
|
54
|
+
SyncPinMode[SyncPinMode["OutBoth"] = 4] = "OutBoth";
|
|
55
|
+
})(SyncPinMode || (SyncPinMode = {}));
|
|
56
|
+
export var SyncPinPolarity;
|
|
57
|
+
(function (SyncPinPolarity) {
|
|
58
|
+
SyncPinPolarity[SyncPinPolarity["IdleLow"] = 0] = "IdleLow";
|
|
59
|
+
SyncPinPolarity[SyncPinPolarity["IdleHigh"] = 1] = "IdleHigh";
|
|
60
|
+
})(SyncPinPolarity || (SyncPinPolarity = {}));
|
|
61
|
+
/** Value of the echoed-cmd byte in unsolicited reports. */
|
|
62
|
+
export const UNSOLICITED = 0x00;
|
|
63
|
+
function dv(p) {
|
|
64
|
+
return new DataView(p.buffer, p.byteOffset, p.byteLength);
|
|
65
|
+
}
|
|
66
|
+
export function unpackStatus(p) {
|
|
67
|
+
return { cmd: p[0], status: p[1] };
|
|
68
|
+
}
|
|
69
|
+
export function unpackText(p) {
|
|
70
|
+
return { cmd: p[0], text: stripDeviceString(p.subarray(1)) };
|
|
71
|
+
}
|
|
72
|
+
export function unpackSyncTime(p) {
|
|
73
|
+
const v = dv(p);
|
|
74
|
+
return {
|
|
75
|
+
pcTimestampUs: v.getBigUint64(0, true),
|
|
76
|
+
mcuRxUs: v.getBigUint64(8, true),
|
|
77
|
+
mcuTxUs: v.getBigUint64(16, true),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function unpackTemperature(p) {
|
|
81
|
+
const v = dv(p);
|
|
82
|
+
return { timestampUs: v.getBigUint64(0, true), rawDecidegrees: v.getInt16(8, true) };
|
|
83
|
+
}
|
|
84
|
+
export function unpackSequenceError(p) {
|
|
85
|
+
return { expectedSeq: p[0], receivedSeq: p[1] };
|
|
86
|
+
}
|
|
87
|
+
export function packSyncTime(pcTimestampUs) {
|
|
88
|
+
const out = new Uint8Array(8);
|
|
89
|
+
new DataView(out.buffer).setBigUint64(0, pcTimestampUs, true);
|
|
90
|
+
return out;
|
|
91
|
+
}
|
|
92
|
+
export function packSyncPinConfig(cfg) {
|
|
93
|
+
return Uint8Array.of(cfg.pin, cfg.mode, cfg.polarity);
|
|
94
|
+
}
|
|
95
|
+
export function unpackSyncPinConfig(p) {
|
|
96
|
+
return { pin: p[0], mode: p[1], polarity: p[2] };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* NTP-style clock math, all µs (contract 02 §5). offset = device − host,
|
|
100
|
+
* `((T2-T1)+(T3-T4))/2` truncated toward zero (bigint division is exactly
|
|
101
|
+
* that); rtt = (T4-T1)-(T3-T2).
|
|
102
|
+
*/
|
|
103
|
+
export function syncTimeOffsetRtt(t1, t2, t3, t4) {
|
|
104
|
+
return {
|
|
105
|
+
offsetUs: (t2 - t1 + (t3 - t4)) / 2n,
|
|
106
|
+
rttUs: t4 - t1 - (t3 - t2),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** Decode an ASCII device string, dropping trailing NUL/0xFF filler. */
|
|
110
|
+
export function stripDeviceString(raw) {
|
|
111
|
+
let end = raw.length;
|
|
112
|
+
while (end > 0 && (raw[end - 1] === 0x00 || raw[end - 1] === 0xff))
|
|
113
|
+
end--;
|
|
114
|
+
let s = "";
|
|
115
|
+
for (let i = 0; i < end; i++) {
|
|
116
|
+
const c = raw[i];
|
|
117
|
+
s += c < 0x80 ? String.fromCharCode(c) : "�";
|
|
118
|
+
}
|
|
119
|
+
return s;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/protocol/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRC algorithms of the DEPZ transport (contracts/01_TRANSPORT_FRAMING.md §3).
|
|
3
|
+
* Byte-exact with the firmware; CRC-8 init is 0x00 for every device
|
|
4
|
+
* (contracts/ERRATA.md E1).
|
|
5
|
+
*/
|
|
6
|
+
/** CRC-8/MAXIM: poly 0x31 reflected, init 0x00, xorout 0x00. */
|
|
7
|
+
export declare function crc8Maxim(data: Uint8Array): number;
|
|
8
|
+
/** CRC-16/MODBUS: poly 0x8005 reflected, init 0xFFFF, xorout 0x0000. */
|
|
9
|
+
export declare function crc16Modbus(data: Uint8Array): number;
|
|
10
|
+
/** CRC-32/ISO-HDLC: poly 0x04C11DB7 reflected, init/xorout 0xFFFFFFFF. */
|
|
11
|
+
export declare function crc32IsoHdlc(data: Uint8Array): number;
|
|
12
|
+
/**
|
|
13
|
+
* CRC-16/CCITT-FALSE: poly 0x1021, init 0xFFFF, not reflected.
|
|
14
|
+
* Used only for the `.fwdepz` file header (contract 06), never on the wire.
|
|
15
|
+
*/
|
|
16
|
+
export declare function crc16CcittFalse(data: Uint8Array): number;
|
|
17
|
+
//# sourceMappingURL=crc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crc.d.ts","sourceRoot":"","sources":["../../src/protocol/crc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAIlD;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAIrD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CASxD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRC algorithms of the DEPZ transport (contracts/01_TRANSPORT_FRAMING.md §3).
|
|
3
|
+
* Byte-exact with the firmware; CRC-8 init is 0x00 for every device
|
|
4
|
+
* (contracts/ERRATA.md E1).
|
|
5
|
+
*/
|
|
6
|
+
function makeTable(polyReflected) {
|
|
7
|
+
const t = new Uint32Array(256);
|
|
8
|
+
for (let i = 0; i < 256; i++) {
|
|
9
|
+
let crc = i;
|
|
10
|
+
for (let b = 0; b < 8; b++) {
|
|
11
|
+
crc = crc & 1 ? (crc >>> 1) ^ polyReflected : crc >>> 1;
|
|
12
|
+
}
|
|
13
|
+
t[i] = crc >>> 0;
|
|
14
|
+
}
|
|
15
|
+
return t;
|
|
16
|
+
}
|
|
17
|
+
const CRC8_TABLE = makeTable(0x8c);
|
|
18
|
+
const CRC16_TABLE = makeTable(0xa001);
|
|
19
|
+
const CRC32_TABLE = makeTable(0xedb88320);
|
|
20
|
+
/** CRC-8/MAXIM: poly 0x31 reflected, init 0x00, xorout 0x00. */
|
|
21
|
+
export function crc8Maxim(data) {
|
|
22
|
+
let crc = 0x00;
|
|
23
|
+
for (const b of data)
|
|
24
|
+
crc = CRC8_TABLE[crc ^ b];
|
|
25
|
+
return crc;
|
|
26
|
+
}
|
|
27
|
+
/** CRC-16/MODBUS: poly 0x8005 reflected, init 0xFFFF, xorout 0x0000. */
|
|
28
|
+
export function crc16Modbus(data) {
|
|
29
|
+
let crc = 0xffff;
|
|
30
|
+
for (const b of data)
|
|
31
|
+
crc = (crc >>> 8) ^ CRC16_TABLE[(crc ^ b) & 0xff];
|
|
32
|
+
return crc;
|
|
33
|
+
}
|
|
34
|
+
/** CRC-32/ISO-HDLC: poly 0x04C11DB7 reflected, init/xorout 0xFFFFFFFF. */
|
|
35
|
+
export function crc32IsoHdlc(data) {
|
|
36
|
+
let crc = 0xffffffff;
|
|
37
|
+
for (const b of data)
|
|
38
|
+
crc = (crc >>> 8) ^ CRC32_TABLE[(crc ^ b) & 0xff];
|
|
39
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* CRC-16/CCITT-FALSE: poly 0x1021, init 0xFFFF, not reflected.
|
|
43
|
+
* Used only for the `.fwdepz` file header (contract 06), never on the wire.
|
|
44
|
+
*/
|
|
45
|
+
export function crc16CcittFalse(data) {
|
|
46
|
+
let crc = 0xffff;
|
|
47
|
+
for (const b of data) {
|
|
48
|
+
crc ^= b << 8;
|
|
49
|
+
for (let i = 0; i < 8; i++) {
|
|
50
|
+
crc = crc & 0x8000 ? ((crc << 1) ^ 0x1021) & 0xffff : (crc << 1) & 0xffff;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return crc;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=crc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crc.js","sourceRoot":"","sources":["../../src/protocol/crc.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS,SAAS,CAAC,aAAqB;IACtC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACnC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;AACtC,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AAE1C,gEAAgE;AAChE,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC;IACjD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,IAAgB;IAC1C,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAE,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,IAAI,GAAG,GAAG,UAAU,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAE,CAAC;IACzE,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,IAAI,GAAG,GAAG,MAAM,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packet framing and incremental parser (contracts/01_TRANSPORT_FRAMING.md).
|
|
3
|
+
* Mirrors the Python reference (`depz_sensor_sdk.transport.framing`) and the
|
|
4
|
+
* firmware `common/transport/transport.c`. Empty payloads never carry CRC
|
|
5
|
+
* bytes even when crc_type bits are set (contracts/ERRATA.md E6).
|
|
6
|
+
*/
|
|
7
|
+
export declare const MAGIC0 = 165;
|
|
8
|
+
export declare const MAGIC1 = 195;
|
|
9
|
+
export declare const HEADER_SIZE = 7;
|
|
10
|
+
export declare const MAX_PAYLOAD = 16383;
|
|
11
|
+
export declare enum CrcType {
|
|
12
|
+
None = 0,
|
|
13
|
+
Crc8 = 1,
|
|
14
|
+
Crc16 = 2,
|
|
15
|
+
Crc32 = 3
|
|
16
|
+
}
|
|
17
|
+
/** CRC trailer for a payload; empty payloads never carry CRC bytes. */
|
|
18
|
+
export declare function payloadCrcBytes(crcType: CrcType, payload: Uint8Array): Uint8Array;
|
|
19
|
+
/**
|
|
20
|
+
* Frame one packet. `crcType` bits are set in the header even for an empty
|
|
21
|
+
* payload (matching device TX), but CRC bytes are only appended for
|
|
22
|
+
* non-empty payloads.
|
|
23
|
+
*/
|
|
24
|
+
export declare function buildPacket(cmd: number, payload?: Uint8Array, seq?: number, crcType?: CrcType): Uint8Array;
|
|
25
|
+
export interface PacketEvent {
|
|
26
|
+
type: "packet";
|
|
27
|
+
cmd: number;
|
|
28
|
+
seq: number;
|
|
29
|
+
payload: Uint8Array;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Bytes discarded while hunting for a valid frame. Boundaries between
|
|
33
|
+
* consecutive trash events depend on read chunking; only the concatenated
|
|
34
|
+
* byte stream is deterministic.
|
|
35
|
+
*/
|
|
36
|
+
export interface TrashEvent {
|
|
37
|
+
type: "trash";
|
|
38
|
+
data: Uint8Array;
|
|
39
|
+
}
|
|
40
|
+
/** A frame with a valid header whose payload CRC failed; dropped. */
|
|
41
|
+
export interface CrcErrorEvent {
|
|
42
|
+
type: "crcError";
|
|
43
|
+
cmd: number;
|
|
44
|
+
seq: number;
|
|
45
|
+
}
|
|
46
|
+
export type ParserEvent = PacketEvent | TrashEvent | CrcErrorEvent;
|
|
47
|
+
/**
|
|
48
|
+
* Incremental frame parser. Feed arbitrary byte chunks; get events.
|
|
49
|
+
* Event order is invariant to chunking (contract 01 §5) except trash event
|
|
50
|
+
* boundaries — concatenate trash data when comparing streams.
|
|
51
|
+
*/
|
|
52
|
+
export declare class PacketParser {
|
|
53
|
+
private buf;
|
|
54
|
+
packets: number;
|
|
55
|
+
crcErrors: number;
|
|
56
|
+
headerErrors: number;
|
|
57
|
+
trashBytes: number;
|
|
58
|
+
feed(data: Uint8Array): ParserEvent[];
|
|
59
|
+
/** Unconsumed bytes currently buffered (diagnostics/tests). */
|
|
60
|
+
get residue(): Uint8Array;
|
|
61
|
+
private findMagic;
|
|
62
|
+
private emitTrash;
|
|
63
|
+
private parseOne;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=framing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.d.ts","sourceRoot":"","sources":["../../src/protocol/framing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,eAAO,MAAM,MAAM,MAAO,CAAC;AAC3B,eAAO,MAAM,MAAM,MAAO,CAAC;AAC3B,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,WAAW,QAAS,CAAC;AAElC,oBAAY,OAAO;IACjB,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;IACT,KAAK,IAAI;CACV;AASD,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU,CAQjF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,UAA8B,EACvC,GAAG,SAAI,EACP,OAAO,GAAE,OAAsB,GAC9B,UAAU,CAiBZ;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,UAAU,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;AAEnE;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,SAAK;IACZ,SAAS,SAAK;IACd,YAAY,SAAK;IACjB,UAAU,SAAK;IAEf,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,EAAE;IAgBrC,+DAA+D;IAC/D,IAAI,OAAO,IAAI,UAAU,CAExB;IAED,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,QAAQ;CAwCjB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Packet framing and incremental parser (contracts/01_TRANSPORT_FRAMING.md).
|
|
3
|
+
* Mirrors the Python reference (`depz_sensor_sdk.transport.framing`) and the
|
|
4
|
+
* firmware `common/transport/transport.c`. Empty payloads never carry CRC
|
|
5
|
+
* bytes even when crc_type bits are set (contracts/ERRATA.md E6).
|
|
6
|
+
*/
|
|
7
|
+
import { crc8Maxim, crc16Modbus, crc32IsoHdlc } from "./crc.js";
|
|
8
|
+
export const MAGIC0 = 0xa5;
|
|
9
|
+
export const MAGIC1 = 0xc3;
|
|
10
|
+
export const HEADER_SIZE = 7;
|
|
11
|
+
export const MAX_PAYLOAD = 0x3fff;
|
|
12
|
+
export var CrcType;
|
|
13
|
+
(function (CrcType) {
|
|
14
|
+
CrcType[CrcType["None"] = 0] = "None";
|
|
15
|
+
CrcType[CrcType["Crc8"] = 1] = "Crc8";
|
|
16
|
+
CrcType[CrcType["Crc16"] = 2] = "Crc16";
|
|
17
|
+
CrcType[CrcType["Crc32"] = 3] = "Crc32";
|
|
18
|
+
})(CrcType || (CrcType = {}));
|
|
19
|
+
const CRC_SIZES = {
|
|
20
|
+
[CrcType.None]: 0,
|
|
21
|
+
[CrcType.Crc8]: 1,
|
|
22
|
+
[CrcType.Crc16]: 2,
|
|
23
|
+
[CrcType.Crc32]: 4,
|
|
24
|
+
};
|
|
25
|
+
/** CRC trailer for a payload; empty payloads never carry CRC bytes. */
|
|
26
|
+
export function payloadCrcBytes(crcType, payload) {
|
|
27
|
+
if (crcType === CrcType.None || payload.length === 0)
|
|
28
|
+
return new Uint8Array(0);
|
|
29
|
+
const out = new Uint8Array(CRC_SIZES[crcType]);
|
|
30
|
+
const dv = new DataView(out.buffer);
|
|
31
|
+
if (crcType === CrcType.Crc8)
|
|
32
|
+
dv.setUint8(0, crc8Maxim(payload));
|
|
33
|
+
else if (crcType === CrcType.Crc16)
|
|
34
|
+
dv.setUint16(0, crc16Modbus(payload), true);
|
|
35
|
+
else
|
|
36
|
+
dv.setUint32(0, crc32IsoHdlc(payload), true);
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Frame one packet. `crcType` bits are set in the header even for an empty
|
|
41
|
+
* payload (matching device TX), but CRC bytes are only appended for
|
|
42
|
+
* non-empty payloads.
|
|
43
|
+
*/
|
|
44
|
+
export function buildPacket(cmd, payload = new Uint8Array(0), seq = 0, crcType = CrcType.None) {
|
|
45
|
+
if (payload.length > MAX_PAYLOAD) {
|
|
46
|
+
throw new RangeError(`payload too long: ${payload.length} > ${MAX_PAYLOAD}`);
|
|
47
|
+
}
|
|
48
|
+
const trailer = payloadCrcBytes(crcType, payload);
|
|
49
|
+
const out = new Uint8Array(HEADER_SIZE + payload.length + trailer.length);
|
|
50
|
+
const dataSize = payload.length | (crcType << 14);
|
|
51
|
+
out[0] = MAGIC0;
|
|
52
|
+
out[1] = MAGIC1;
|
|
53
|
+
out[2] = dataSize & 0xff;
|
|
54
|
+
out[3] = dataSize >>> 8;
|
|
55
|
+
out[4] = cmd & 0xff;
|
|
56
|
+
out[5] = seq & 0xff;
|
|
57
|
+
out[6] = crc8Maxim(out.subarray(2, 6));
|
|
58
|
+
out.set(payload, HEADER_SIZE);
|
|
59
|
+
out.set(trailer, HEADER_SIZE + payload.length);
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Incremental frame parser. Feed arbitrary byte chunks; get events.
|
|
64
|
+
* Event order is invariant to chunking (contract 01 §5) except trash event
|
|
65
|
+
* boundaries — concatenate trash data when comparing streams.
|
|
66
|
+
*/
|
|
67
|
+
export class PacketParser {
|
|
68
|
+
buf = new Uint8Array(0);
|
|
69
|
+
packets = 0;
|
|
70
|
+
crcErrors = 0;
|
|
71
|
+
headerErrors = 0;
|
|
72
|
+
trashBytes = 0;
|
|
73
|
+
feed(data) {
|
|
74
|
+
if (data.length > 0) {
|
|
75
|
+
const next = new Uint8Array(this.buf.length + data.length);
|
|
76
|
+
next.set(this.buf, 0);
|
|
77
|
+
next.set(data, this.buf.length);
|
|
78
|
+
this.buf = next;
|
|
79
|
+
}
|
|
80
|
+
const out = [];
|
|
81
|
+
for (;;) {
|
|
82
|
+
const ev = this.parseOne();
|
|
83
|
+
if (ev === null)
|
|
84
|
+
break;
|
|
85
|
+
out.push(ev);
|
|
86
|
+
}
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
/** Unconsumed bytes currently buffered (diagnostics/tests). */
|
|
90
|
+
get residue() {
|
|
91
|
+
return this.buf;
|
|
92
|
+
}
|
|
93
|
+
findMagic(from = 0) {
|
|
94
|
+
const b = this.buf;
|
|
95
|
+
for (let i = from; i + 1 < b.length; i++) {
|
|
96
|
+
if (b[i] === MAGIC0 && b[i + 1] === MAGIC1)
|
|
97
|
+
return i;
|
|
98
|
+
}
|
|
99
|
+
return -1;
|
|
100
|
+
}
|
|
101
|
+
emitTrash(count) {
|
|
102
|
+
const data = this.buf.slice(0, count);
|
|
103
|
+
this.buf = this.buf.slice(count);
|
|
104
|
+
this.trashBytes += count;
|
|
105
|
+
return { type: "trash", data };
|
|
106
|
+
}
|
|
107
|
+
parseOne() {
|
|
108
|
+
const buf = this.buf;
|
|
109
|
+
const pos = this.findMagic();
|
|
110
|
+
if (pos === -1) {
|
|
111
|
+
// Keep the last byte: it may be a split 0xA5.
|
|
112
|
+
if (buf.length > 1)
|
|
113
|
+
return this.emitTrash(buf.length - 1);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
if (pos > 0)
|
|
117
|
+
return this.emitTrash(pos);
|
|
118
|
+
if (buf.length < HEADER_SIZE)
|
|
119
|
+
return null;
|
|
120
|
+
const dataSize = buf[2] | (buf[3] << 8);
|
|
121
|
+
const payloadSize = dataSize & MAX_PAYLOAD;
|
|
122
|
+
const crcType = ((dataSize >>> 14) & 0x03);
|
|
123
|
+
if (crc8Maxim(buf.subarray(2, 6)) !== buf[6]) {
|
|
124
|
+
// Header corrupt: advance one byte past the magic start and let the
|
|
125
|
+
// magic hunt resync (firmware: rb_skip(off + 1)).
|
|
126
|
+
this.headerErrors += 1;
|
|
127
|
+
return this.emitTrash(1);
|
|
128
|
+
}
|
|
129
|
+
// ERRATA E6: empty payload never carries CRC bytes.
|
|
130
|
+
const crcSize = payloadSize > 0 ? CRC_SIZES[crcType] : 0;
|
|
131
|
+
const total = HEADER_SIZE + payloadSize + crcSize;
|
|
132
|
+
if (buf.length < total)
|
|
133
|
+
return null;
|
|
134
|
+
const cmd = buf[4];
|
|
135
|
+
const seq = buf[5];
|
|
136
|
+
const payload = buf.slice(HEADER_SIZE, HEADER_SIZE + payloadSize);
|
|
137
|
+
const trailer = buf.subarray(HEADER_SIZE + payloadSize, total);
|
|
138
|
+
this.buf = this.buf.slice(total);
|
|
139
|
+
if (crcSize > 0) {
|
|
140
|
+
const expected = payloadCrcBytes(crcType, payload);
|
|
141
|
+
for (let i = 0; i < crcSize; i++) {
|
|
142
|
+
if (expected[i] !== trailer[i]) {
|
|
143
|
+
this.crcErrors += 1;
|
|
144
|
+
return { type: "crcError", cmd, seq };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
this.packets += 1;
|
|
149
|
+
return { type: "packet", cmd, seq, payload };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=framing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framing.js","sourceRoot":"","sources":["../../src/protocol/framing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.fwdepz` firmware container parse/validate (contracts/06 §2).
|
|
3
|
+
* Pure functions — used by the browser flashing flow to validate a dropped
|
|
4
|
+
* file before touching the device.
|
|
5
|
+
*/
|
|
6
|
+
export declare const FWDEPZ_MAGIC = "FWDEPZ00";
|
|
7
|
+
export declare const FWDEPZ_HEADER_SIZE = 64;
|
|
8
|
+
export declare class FwDepzError extends Error {
|
|
9
|
+
}
|
|
10
|
+
export interface FwDepzImage {
|
|
11
|
+
loadAddr: number;
|
|
12
|
+
fwSize: number;
|
|
13
|
+
fwCrc32: number;
|
|
14
|
+
curSec: number;
|
|
15
|
+
totSec: number;
|
|
16
|
+
payload: Uint8Array;
|
|
17
|
+
}
|
|
18
|
+
/** Validation order (contract 06 §2): magic → header CRC → size. */
|
|
19
|
+
export declare function parseFwDepz(blob: Uint8Array): FwDepzImage;
|
|
20
|
+
export declare function fwDepzPayloadCrcOk(img: FwDepzImage): boolean;
|
|
21
|
+
//# sourceMappingURL=fwdepz.d.ts.map
|