@depz/sensor-sdk 0.5.0 → 0.6.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 +6 -3
- package/dist/dataset.d.ts.map +1 -1
- package/dist/dataset.js +15 -7
- package/dist/dataset.js.map +1 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +3 -0
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/protocol/common.d.ts +6 -4
- package/dist/protocol/common.d.ts.map +1 -1
- package/dist/protocol/common.js +6 -4
- package/dist/protocol/common.js.map +1 -1
- package/dist/protocol/identity.d.ts +1 -1
- package/dist/protocol/identity.d.ts.map +1 -1
- package/dist/protocol/identity.js +1 -0
- package/dist/protocol/identity.js.map +1 -1
- package/dist/protocol/tmf8829.d.ts +113 -0
- package/dist/protocol/tmf8829.d.ts.map +1 -0
- package/dist/protocol/tmf8829.js +195 -0
- package/dist/protocol/tmf8829.js.map +1 -0
- package/dist/protocol/usb-ids.d.ts.map +1 -1
- package/dist/protocol/usb-ids.js +1 -0
- package/dist/protocol/usb-ids.js.map +1 -1
- package/dist/sensors/tmf8829/builder.d.ts +61 -0
- package/dist/sensors/tmf8829/builder.d.ts.map +1 -0
- package/dist/sensors/tmf8829/builder.js +175 -0
- package/dist/sensors/tmf8829/builder.js.map +1 -0
- package/dist/sensors/tmf8829/clock.d.ts +76 -0
- package/dist/sensors/tmf8829/clock.d.ts.map +1 -0
- package/dist/sensors/tmf8829/clock.js +166 -0
- package/dist/sensors/tmf8829/clock.js.map +1 -0
- package/dist/sensors/tmf8829/config.d.ts +22 -0
- package/dist/sensors/tmf8829/config.d.ts.map +1 -0
- package/dist/sensors/tmf8829/config.js +82 -0
- package/dist/sensors/tmf8829/config.js.map +1 -0
- package/dist/sensors/tmf8829/firmware-asset.d.ts +3 -0
- package/dist/sensors/tmf8829/firmware-asset.d.ts.map +1 -0
- package/dist/sensors/tmf8829/firmware-asset.js +7 -0
- package/dist/sensors/tmf8829/firmware-asset.js.map +1 -0
- package/dist/sensors/tmf8829/firmware-license.d.ts +3 -0
- package/dist/sensors/tmf8829/firmware-license.d.ts.map +1 -0
- package/dist/sensors/tmf8829/firmware-license.js +5 -0
- package/dist/sensors/tmf8829/firmware-license.js.map +1 -0
- package/dist/sensors/tmf8829/frames.d.ts +79 -0
- package/dist/sensors/tmf8829/frames.d.ts.map +1 -0
- package/dist/sensors/tmf8829/frames.js +190 -0
- package/dist/sensors/tmf8829/frames.js.map +1 -0
- package/dist/sensors/tmf8829/tmf8829.d.ts +144 -0
- package/dist/sensors/tmf8829/tmf8829.d.ts.map +1 -0
- package/dist/sensors/tmf8829/tmf8829.js +473 -0
- package/dist/sensors/tmf8829/tmf8829.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sensor clock model and frame capture time (contracts/14_SENSOR_TMF8829.md §5).
|
|
3
|
+
* Mirrors the Python reference `depz_sensor_sdk.tmf8829.clock`; the vectors in
|
|
4
|
+
* `contracts/vectors/tmf8829_frame_time.json` pin it bit for bit.
|
|
5
|
+
*
|
|
6
|
+
* Plain numbers, not bigint: every intermediate stays below 2^53 (µs values
|
|
7
|
+
* ~2^31, `span << 16` ~2^37, tick × ratio ~2^51), so `Math.floor(a / b)` is
|
|
8
|
+
* exact. `>>` in JS is 32-bit, so the Q16 shifts are divisions by 65536.
|
|
9
|
+
*/
|
|
10
|
+
export const TMF8829_NOMINAL_Q16 = 8 * 65536;
|
|
11
|
+
const CLOCK_WINDOW_MIN_US = 200_000;
|
|
12
|
+
const CLOCK_WINDOW_SLIDE_US = 1_000_000;
|
|
13
|
+
const EDGE_LATE_US = 2000;
|
|
14
|
+
/** Clock ratio not measured yet (nominal 8 µs/tick used). */
|
|
15
|
+
export const TMF8829_FT_NOMINAL = 0x01;
|
|
16
|
+
/** Clock model restarted at this frame (SYSTICK jump). */
|
|
17
|
+
export const TMF8829_FT_CLOCK_RESET = 0x02;
|
|
18
|
+
/** INT edge > 2 ms later after t1 than usual in this stream. */
|
|
19
|
+
export const TMF8829_FT_EDGE_LATE = 0x04;
|
|
20
|
+
/** Sub-integrations not back to back (histogram FIFO wait). */
|
|
21
|
+
export const TMF8829_FT_STALLED = 0x08;
|
|
22
|
+
/** Histograms + 32x32/48x32: T1 may be too long, centre late. */
|
|
23
|
+
export const TMF8829_FT_T1_UNSURE = 0x10;
|
|
24
|
+
export const TMF8829_FT_NAMES = [
|
|
25
|
+
[TMF8829_FT_NOMINAL, "nominal"],
|
|
26
|
+
[TMF8829_FT_CLOCK_RESET, "clock_reset"],
|
|
27
|
+
[TMF8829_FT_EDGE_LATE, "edge_late"],
|
|
28
|
+
[TMF8829_FT_STALLED, "stalled"],
|
|
29
|
+
[TMF8829_FT_T1_UNSURE, "t1_unsure"],
|
|
30
|
+
];
|
|
31
|
+
export function tmf8829FlagNames(flags) {
|
|
32
|
+
return TMF8829_FT_NAMES.filter(([bit]) => flags & bit).map(([, name]) => name);
|
|
33
|
+
}
|
|
34
|
+
/** Sub-integrations per results frame by fp_mode. */
|
|
35
|
+
const FP_SUBINTS = { 0: 2, 1: 2, 2: 2, 3: 4, 4: 4, 5: 6 };
|
|
36
|
+
const TWO32 = 2 ** 32;
|
|
37
|
+
const u32 = (x) => ((x % TWO32) + TWO32) % TWO32;
|
|
38
|
+
const s32 = (x) => {
|
|
39
|
+
const u = u32(x);
|
|
40
|
+
return u >= 2 ** 31 ? u - TWO32 : u;
|
|
41
|
+
};
|
|
42
|
+
/** Arithmetic `>> 16` for values beyond 32 bits. */
|
|
43
|
+
const shr16 = (x) => Math.floor(x / 65536);
|
|
44
|
+
/**
|
|
45
|
+
* Sensor SYSTICK (125 kHz) → MCU µs, fed one clock pair per frame. The ratio
|
|
46
|
+
* is taken over a sliding 1..2 s window, first after 200 ms; it is also the
|
|
47
|
+
* distance correction.
|
|
48
|
+
*/
|
|
49
|
+
export class Tmf8829SensorClock {
|
|
50
|
+
ratioQ16 = TMF8829_NOMINAL_Q16;
|
|
51
|
+
nominal = true;
|
|
52
|
+
valid = false;
|
|
53
|
+
last = [0, 0];
|
|
54
|
+
anchor = [0, 0];
|
|
55
|
+
mid = null;
|
|
56
|
+
reset() {
|
|
57
|
+
this.valid = false;
|
|
58
|
+
this.last = [0, 0];
|
|
59
|
+
this.anchor = [0, 0];
|
|
60
|
+
this.mid = null;
|
|
61
|
+
this.ratioQ16 = TMF8829_NOMINAL_Q16;
|
|
62
|
+
this.nominal = true;
|
|
63
|
+
}
|
|
64
|
+
/** MCU/sensor clock ratio (≈ 1.015): distances are scaled by it. */
|
|
65
|
+
get ratio() {
|
|
66
|
+
return this.ratioQ16 / TMF8829_NOMINAL_Q16;
|
|
67
|
+
}
|
|
68
|
+
static stepOk(dUs, dTick) {
|
|
69
|
+
const expect = dTick * 8;
|
|
70
|
+
const tol = Math.floor(dUs / 10) + 50;
|
|
71
|
+
return expect + tol >= dUs && expect <= dUs + tol;
|
|
72
|
+
}
|
|
73
|
+
/** Add a pair → TMF8829_FT_CLOCK_RESET if it does not fit the model, else 0. */
|
|
74
|
+
add(us, tick) {
|
|
75
|
+
let flags = 0;
|
|
76
|
+
if (this.valid && !Tmf8829SensorClock.stepOk(us - this.last[0], u32(tick - this.last[1]))) {
|
|
77
|
+
this.valid = false;
|
|
78
|
+
flags = TMF8829_FT_CLOCK_RESET;
|
|
79
|
+
}
|
|
80
|
+
this.last = [us, tick];
|
|
81
|
+
if (!this.valid) {
|
|
82
|
+
this.valid = true;
|
|
83
|
+
this.anchor = this.last;
|
|
84
|
+
this.mid = null;
|
|
85
|
+
this.ratioQ16 = TMF8829_NOMINAL_Q16;
|
|
86
|
+
this.nominal = true;
|
|
87
|
+
return flags;
|
|
88
|
+
}
|
|
89
|
+
const span = us - this.anchor[0];
|
|
90
|
+
if (span >= CLOCK_WINDOW_MIN_US) {
|
|
91
|
+
this.ratioQ16 = u32(Math.floor((span * 65536) / u32(tick - this.anchor[1])));
|
|
92
|
+
this.nominal = false;
|
|
93
|
+
}
|
|
94
|
+
if (this.mid === null && span >= CLOCK_WINDOW_SLIDE_US) {
|
|
95
|
+
this.mid = this.last;
|
|
96
|
+
}
|
|
97
|
+
else if (this.mid !== null && span >= 2 * CLOCK_WINDOW_SLIDE_US) {
|
|
98
|
+
this.anchor = this.mid;
|
|
99
|
+
this.mid = null;
|
|
100
|
+
}
|
|
101
|
+
return flags;
|
|
102
|
+
}
|
|
103
|
+
/** SYSTICK `tick` → MCU µs through the pair (pairUs, pairTick). */
|
|
104
|
+
toUs(pairUs, pairTick, tick) {
|
|
105
|
+
return pairUs + shr16(s32(tick - pairTick) * this.ratioQ16);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* When a results frame was captured: the centre of [t0, t1 + T1], T1 the
|
|
110
|
+
* stream's shortest (t1 − t0)/(N − 1).
|
|
111
|
+
*/
|
|
112
|
+
export class Tmf8829CaptureTimer {
|
|
113
|
+
clock;
|
|
114
|
+
lagMin = null;
|
|
115
|
+
histSeen = false;
|
|
116
|
+
subMin = 0;
|
|
117
|
+
constructor(clock) {
|
|
118
|
+
this.clock = clock;
|
|
119
|
+
}
|
|
120
|
+
reset() {
|
|
121
|
+
this.lagMin = null;
|
|
122
|
+
this.histSeen = false;
|
|
123
|
+
this.subMin = 0;
|
|
124
|
+
}
|
|
125
|
+
/** A histogram frame was seen in the stream. */
|
|
126
|
+
histograms() {
|
|
127
|
+
this.histSeen = true;
|
|
128
|
+
}
|
|
129
|
+
results(fpMode, systick, t0Tick, t1Tick, pairUs, edgeUs, flagsIn) {
|
|
130
|
+
const c = this.clock;
|
|
131
|
+
let flags = flagsIn;
|
|
132
|
+
if (c.nominal)
|
|
133
|
+
flags |= TMF8829_FT_NOMINAL;
|
|
134
|
+
const t0 = c.toUs(pairUs, systick, t0Tick);
|
|
135
|
+
const t1 = c.toUs(pairUs, systick, t1Tick);
|
|
136
|
+
if (edgeUs && !this.histSeen) {
|
|
137
|
+
const lag = edgeUs - t1;
|
|
138
|
+
if (lag <= 0 || (this.lagMin !== null && lag > this.lagMin + EDGE_LATE_US)) {
|
|
139
|
+
flags |= TMF8829_FT_EDGE_LATE;
|
|
140
|
+
}
|
|
141
|
+
else if (this.lagMin === null || lag < this.lagMin) {
|
|
142
|
+
this.lagMin = lag;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const n1 = (FP_SUBINTS[fpMode] ?? 2) - 1;
|
|
146
|
+
const sub = Math.floor(u32(t1Tick - t0Tick) / n1);
|
|
147
|
+
if (!this.subMin || sub < this.subMin)
|
|
148
|
+
this.subMin = sub;
|
|
149
|
+
if (sub > this.subMin + 1)
|
|
150
|
+
flags |= TMF8829_FT_STALLED;
|
|
151
|
+
if (this.histSeen && n1 > 1)
|
|
152
|
+
flags |= TMF8829_FT_T1_UNSURE;
|
|
153
|
+
const t1Len = u32(shr16(this.subMin * c.ratioQ16));
|
|
154
|
+
return {
|
|
155
|
+
timestampUs: Math.floor((t0 + t1 + t1Len) / 2),
|
|
156
|
+
flags,
|
|
157
|
+
t1LenUs: t1Len,
|
|
158
|
+
t0Us: t0,
|
|
159
|
+
t1Us: t1,
|
|
160
|
+
edgeUs,
|
|
161
|
+
pairUs,
|
|
162
|
+
ratioQ16: c.ratioQ16,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../../src/sensors/tmf8829/clock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TMF8829 presets and config-page fields (contracts/14_SENSOR_TMF8829.md §4).
|
|
3
|
+
* Mirrors the Python reference `depz_sensor_sdk.tmf8829.config`.
|
|
4
|
+
*/
|
|
5
|
+
/** Config page 0x22..0xDF. */
|
|
6
|
+
export declare const TMF8829_REG_CFG = 34;
|
|
7
|
+
export declare const TMF8829_CFG_SIZE: number;
|
|
8
|
+
export type Tmf8829Preset = "8x8" | "8x8-lr" | "8x8-ha" | "16x16" | "16x16-ha" | "32x32" | "32x32-ha" | "48x32" | "48x32-ha" | "8x8-xr";
|
|
9
|
+
/** Preset → load command (each loads its config page). */
|
|
10
|
+
export declare const TMF8829_PRESETS: Readonly<Record<Tmf8829Preset, number>>;
|
|
11
|
+
/** The preset's own kilo_iterations (a preset rescales a stale value, it does not reset it). */
|
|
12
|
+
export declare const TMF8829_PRESET_KILO_ITERATIONS: Readonly<Record<Tmf8829Preset, number>>;
|
|
13
|
+
/** The sensor's own period after init(). */
|
|
14
|
+
export declare const TMF8829_DEFAULT_PERIOD_MS = 33;
|
|
15
|
+
export type Tmf8829CfgField = "period_ms" | "kilo_iterations" | "fp_mode" | "nr_peaks" | "signal_strength" | "noise_strength" | "xtalk" | "dump_histograms" | "ref_spad_frame" | "power_modes" | "ha_kilo_iterations" | "dual_mode" | "fov_correction" | "distance_in_mm";
|
|
16
|
+
/** Field → [register, bit shift, width in bits]; width 16 = little-endian register pair. */
|
|
17
|
+
export declare const TMF8829_CFG_FIELDS: Readonly<Record<Tmf8829CfgField, readonly [number, number, number]>>;
|
|
18
|
+
export declare function tmf8829CfgGet(page: Uint8Array, name: Tmf8829CfgField): number;
|
|
19
|
+
export declare function tmf8829CfgSet(page: Uint8Array, name: Tmf8829CfgField, value: number): void;
|
|
20
|
+
/** Every named field of a config page. */
|
|
21
|
+
export declare function tmf8829ConfigFields(page: Uint8Array): Record<Tmf8829CfgField, number>;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/sensors/tmf8829/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,8BAA8B;AAC9B,eAAO,MAAM,eAAe,KAAO,CAAC;AACpC,eAAO,MAAM,gBAAgB,QAA6B,CAAC;AAE3D,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,GACV,QAAQ,CAAC;AAEb,0DAA0D;AAC1D,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAWnE,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAWlF,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,iBAAiB,GACjB,SAAS,GACT,UAAU,GACV,iBAAiB,GACjB,gBAAgB,GAChB,OAAO,GACP,iBAAiB,GACjB,gBAAgB,GAChB,aAAa,GACb,oBAAoB,GACpB,WAAW,GACX,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAenG,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,CAK7E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAa1F;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAIrF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TMF8829 presets and config-page fields (contracts/14_SENSOR_TMF8829.md §4).
|
|
3
|
+
* Mirrors the Python reference `depz_sensor_sdk.tmf8829.config`.
|
|
4
|
+
*/
|
|
5
|
+
/** Config page 0x22..0xDF. */
|
|
6
|
+
export const TMF8829_REG_CFG = 0x22;
|
|
7
|
+
export const TMF8829_CFG_SIZE = 0xdf - TMF8829_REG_CFG + 1;
|
|
8
|
+
/** Preset → load command (each loads its config page). */
|
|
9
|
+
export const TMF8829_PRESETS = {
|
|
10
|
+
"8x8": 0x40,
|
|
11
|
+
"8x8-lr": 0x41, // long range
|
|
12
|
+
"8x8-ha": 0x42, // high accuracy
|
|
13
|
+
"16x16": 0x43,
|
|
14
|
+
"16x16-ha": 0x44,
|
|
15
|
+
"32x32": 0x45,
|
|
16
|
+
"32x32-ha": 0x46,
|
|
17
|
+
"48x32": 0x47,
|
|
18
|
+
"48x32-ha": 0x48,
|
|
19
|
+
"8x8-xr": 0x49, // extended range, distances in mm
|
|
20
|
+
};
|
|
21
|
+
/** The preset's own kilo_iterations (a preset rescales a stale value, it does not reset it). */
|
|
22
|
+
export const TMF8829_PRESET_KILO_ITERATIONS = {
|
|
23
|
+
"8x8": 586,
|
|
24
|
+
"8x8-lr": 586,
|
|
25
|
+
"8x8-ha": 586,
|
|
26
|
+
"8x8-xr": 586,
|
|
27
|
+
"16x16": 586,
|
|
28
|
+
"16x16-ha": 586,
|
|
29
|
+
"32x32": 2344,
|
|
30
|
+
"32x32-ha": 2344,
|
|
31
|
+
"48x32": 3516,
|
|
32
|
+
"48x32-ha": 3516,
|
|
33
|
+
};
|
|
34
|
+
/** The sensor's own period after init(). */
|
|
35
|
+
export const TMF8829_DEFAULT_PERIOD_MS = 33;
|
|
36
|
+
/** Field → [register, bit shift, width in bits]; width 16 = little-endian register pair. */
|
|
37
|
+
export const TMF8829_CFG_FIELDS = {
|
|
38
|
+
period_ms: [0x22, 0, 16],
|
|
39
|
+
kilo_iterations: [0x24, 0, 16],
|
|
40
|
+
fp_mode: [0x26, 0, 3],
|
|
41
|
+
nr_peaks: [0x2a, 0, 3],
|
|
42
|
+
signal_strength: [0x2a, 3, 1],
|
|
43
|
+
noise_strength: [0x2a, 4, 1],
|
|
44
|
+
xtalk: [0x2a, 5, 1],
|
|
45
|
+
dump_histograms: [0x2b, 0, 1],
|
|
46
|
+
ref_spad_frame: [0x2c, 0, 1],
|
|
47
|
+
power_modes: [0x2e, 0, 8],
|
|
48
|
+
ha_kilo_iterations: [0x4a, 0, 16],
|
|
49
|
+
dual_mode: [0x4c, 0, 2],
|
|
50
|
+
fov_correction: [0x78, 0, 4],
|
|
51
|
+
distance_in_mm: [0x8f, 0, 1],
|
|
52
|
+
};
|
|
53
|
+
export function tmf8829CfgGet(page, name) {
|
|
54
|
+
const [reg, shift, width] = TMF8829_CFG_FIELDS[name];
|
|
55
|
+
const i = reg - TMF8829_REG_CFG;
|
|
56
|
+
if (width === 16)
|
|
57
|
+
return page[i] | (page[i + 1] << 8);
|
|
58
|
+
return (page[i] >> shift) & ((1 << width) - 1);
|
|
59
|
+
}
|
|
60
|
+
export function tmf8829CfgSet(page, name, value) {
|
|
61
|
+
const [reg, shift, width] = TMF8829_CFG_FIELDS[name];
|
|
62
|
+
const i = reg - TMF8829_REG_CFG;
|
|
63
|
+
if (!Number.isInteger(value) || value < 0 || value >= 2 ** width) {
|
|
64
|
+
throw new RangeError(`${name}: ${value} out of range for ${width} bit`);
|
|
65
|
+
}
|
|
66
|
+
if (width === 16) {
|
|
67
|
+
page[i] = value & 0xff;
|
|
68
|
+
page[i + 1] = value >> 8;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const mask = ((1 << width) - 1) << shift;
|
|
72
|
+
page[i] = (page[i] & ~mask) | (value << shift);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Every named field of a config page. */
|
|
76
|
+
export function tmf8829ConfigFields(page) {
|
|
77
|
+
const out = {};
|
|
78
|
+
for (const name of Object.keys(TMF8829_CFG_FIELDS))
|
|
79
|
+
out[name] = tmf8829CfgGet(page, name);
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/sensors/tmf8829/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** tmf8829_application.bin (14444 bytes, sha256 973c89b72403a002a76a21647e7ccfaba1a8c3850117faea6f4875b9338a20f8) */
|
|
2
|
+
export declare const tmf8829FirmwareB64 = "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";
|
|
3
|
+
//# sourceMappingURL=firmware-asset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firmware-asset.d.ts","sourceRoot":"","sources":["../../../src/sensors/tmf8829/firmware-asset.ts"],"names":[],"mappings":"AAKA,qHAAqH;AACrH,eAAO,MAAM,kBAAkB,i0lBACiylB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-tmf8829-assets.mjs from
|
|
2
|
+
// packages/depz-sensor-sdk-python/depz_sensor_sdk/tmf8829/data/tmf8829_application.bin — do not edit.
|
|
3
|
+
// ams-OSRAM TMF8829 application 2.200.0, MIT — license text in firmware-license.ts.
|
|
4
|
+
/* eslint-disable */
|
|
5
|
+
/** tmf8829_application.bin (14444 bytes, sha256 973c89b72403a002a76a21647e7ccfaba1a8c3850117faea6f4875b9338a20f8) */
|
|
6
|
+
export const tmf8829FirmwareB64 = "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";
|
|
7
|
+
//# sourceMappingURL=firmware-asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firmware-asset.js","sourceRoot":"","sources":["../../../src/sensors/tmf8829/firmware-asset.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,sGAAsG;AACtG,oFAAoF;AACpF,oBAAoB;AAEpB,qHAAqH;AACrH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,8zlBAA8zlB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** The MIT license (ams-OSRAM) of the TMF8829 sensor firmware the SDK embeds. */
|
|
2
|
+
export declare const TMF8829_FIRMWARE_LICENSE = "Copyright (C) 2025 AMS-OSRAM\n\n The MIT License (MIT)\n Copyright \u00A9 2025 <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software\nand associated documentation files (the \u201CSoftware\u201D), to deal in the Software without\nrestriction, including without limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or \nsubstantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \u201CAS IS\u201D, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING \nBUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, \nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.";
|
|
3
|
+
//# sourceMappingURL=firmware-license.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firmware-license.d.ts","sourceRoot":"","sources":["../../../src/sensors/tmf8829/firmware-license.ts"],"names":[],"mappings":"AAGA,iFAAiF;AACjF,eAAO,MAAM,wBAAwB,qrCAA4pC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// GENERATED by scripts/gen-tmf8829-assets.mjs — do not edit.
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/** The MIT license (ams-OSRAM) of the TMF8829 sensor firmware the SDK embeds. */
|
|
4
|
+
export const TMF8829_FIRMWARE_LICENSE = "Copyright (C) 2025 AMS-OSRAM\n\n The MIT License (MIT)\n Copyright © 2025 <copyright holders>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software\nand associated documentation files (the “Software”), to deal in the Software without\nrestriction, including without limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or \nsubstantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING \nBUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, \nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING \nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.";
|
|
5
|
+
//# sourceMappingURL=firmware-license.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firmware-license.js","sourceRoot":"","sources":["../../../src/sensors/tmf8829/firmware-license.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,oBAAoB;AAEpB,iFAAiF;AACjF,MAAM,CAAC,MAAM,wBAAwB,GAAG,ypCAAypC,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TMF8829 frame layout and pixel decoding (contracts/14_SENSOR_TMF8829.md §3).
|
|
3
|
+
* Mirrors the Python reference `depz_sensor_sdk.tmf8829.frames`.
|
|
4
|
+
*/
|
|
5
|
+
export declare const TMF8829_PRE_HEADER_SIZE = 5;
|
|
6
|
+
export declare const TMF8829_HEADER_SIZE = 16;
|
|
7
|
+
export declare const TMF8829_FOOTER_SIZE = 12;
|
|
8
|
+
/** The 21 bytes the bridge reads at 0xFA. */
|
|
9
|
+
export declare const TMF8829_FRAME_HEAD: number;
|
|
10
|
+
export declare const TMF8829_FRAME_EOF = 57591;
|
|
11
|
+
export declare const TMF8829_FID_MASK = 240;
|
|
12
|
+
export declare const TMF8829_FID_RESULTS = 16;
|
|
13
|
+
export declare const TMF8829_FID_HISTOGRAMS = 32;
|
|
14
|
+
export declare const TMF8829_FID_REF_SPAD = 48;
|
|
15
|
+
export declare const TMF8829_LAYOUT_PEAKS = 7;
|
|
16
|
+
export declare const TMF8829_LAYOUT_SIGNAL = 8;
|
|
17
|
+
export declare const TMF8829_LAYOUT_NOISE = 16;
|
|
18
|
+
export declare const TMF8829_LAYOUT_XTALK = 32;
|
|
19
|
+
/** 32x32/48x32: set on the second (odd-row) half-frame. */
|
|
20
|
+
export declare const TMF8829_LAYOUT_SUBFRAME = 64;
|
|
21
|
+
/** fp_mode → [rows, cols] of the full focal plane. */
|
|
22
|
+
export declare const TMF8829_FP_GRID: Readonly<Record<number, readonly [number, number]>>;
|
|
23
|
+
export declare const TMF8829_FP_NAMES: Readonly<Record<number, string>>;
|
|
24
|
+
/** Pre-header, header and footer of one frame (any kind). */
|
|
25
|
+
export interface Tmf8829FrameInfo {
|
|
26
|
+
fifoStatus: number;
|
|
27
|
+
systick: number;
|
|
28
|
+
id: number;
|
|
29
|
+
/** TMF8829_FID_RESULTS / _HISTOGRAMS / _REF_SPAD */
|
|
30
|
+
kind: number;
|
|
31
|
+
fpMode: number;
|
|
32
|
+
layout: number;
|
|
33
|
+
payload: number;
|
|
34
|
+
fNumber: number;
|
|
35
|
+
temperature: [number, number, number];
|
|
36
|
+
bdv: number;
|
|
37
|
+
refPos: [number, number];
|
|
38
|
+
t0Integration: number;
|
|
39
|
+
t1Integration: number;
|
|
40
|
+
frameStatus: number;
|
|
41
|
+
reserved: number;
|
|
42
|
+
eof: number;
|
|
43
|
+
size: number;
|
|
44
|
+
isSecondHalf: boolean;
|
|
45
|
+
distanceInMm: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Full frame size (pre-header included) from its first 21 bytes. */
|
|
48
|
+
export declare function tmf8829FrameSize(head: Uint8Array): number;
|
|
49
|
+
export declare function parseTmf8829Frame(raw: Uint8Array): Tmf8829FrameInfo;
|
|
50
|
+
/** What is wrong with a frame, human-readable; empty when fine. */
|
|
51
|
+
export declare function tmf8829FrameProblems(f: Tmf8829FrameInfo): string[];
|
|
52
|
+
/**
|
|
53
|
+
* Decoded results of one frame or of a merged measurement. Per-peak arrays
|
|
54
|
+
* are flat `[peak][row][col]` (row-major); noise / xtalk `[row][col]`. Raw
|
|
55
|
+
* sensor integers: distance in 0.25 mm (or mm with the footer flag), not yet
|
|
56
|
+
* clock-corrected. Absent fields are null.
|
|
57
|
+
*/
|
|
58
|
+
export interface Tmf8829PixelResults {
|
|
59
|
+
peaks: number;
|
|
60
|
+
rows: number;
|
|
61
|
+
cols: number;
|
|
62
|
+
distance: Uint16Array | null;
|
|
63
|
+
snr: Uint8Array | null;
|
|
64
|
+
signal: Uint16Array | null;
|
|
65
|
+
noise: Uint16Array | null;
|
|
66
|
+
xtalk: Uint16Array | null;
|
|
67
|
+
}
|
|
68
|
+
/** [rows, cols] one results frame carries: half the rows for 32x32/48x32. */
|
|
69
|
+
export declare function tmf8829FrameRows(fpMode: number): [number, number];
|
|
70
|
+
/** Pixel results of one results frame. */
|
|
71
|
+
export declare function parseTmf8829Results(raw: Uint8Array, info?: Tmf8829FrameInfo): Tmf8829PixelResults;
|
|
72
|
+
/** 32x32/48x32: the first half-frame holds the even rows, the second the odd ones. */
|
|
73
|
+
export declare function mergeTmf8829Halves(first: Tmf8829PixelResults, second: Tmf8829PixelResults): Tmf8829PixelResults;
|
|
74
|
+
/** A raw histogram frame (25 377 B); decoding the bins is left to the caller. */
|
|
75
|
+
export interface Tmf8829HistogramFrame {
|
|
76
|
+
info: Tmf8829FrameInfo;
|
|
77
|
+
raw: Uint8Array;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=frames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.d.ts","sourceRoot":"","sources":["../../../src/sensors/tmf8829/frames.ts"],"names":[],"mappings":"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"}
|