gps-plus-slam-app-framework 1.3.0 → 1.7.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/dist/absolute-orientation-CAEh840t.d.ts +54 -0
- package/dist/{app-selectors-B8VQoMDY.d.ts → app-selectors-ikTUQZpe.d.ts} +1 -1
- package/dist/ar/bresenham3d.d.ts +1 -1
- package/dist/ar/camera-blit-capture.d.ts +2 -2
- package/dist/ar/camera-blit-capture.js +74 -9
- package/dist/ar/capability-checker.d.ts +1 -1
- package/dist/ar/capture-failure-tracker.d.ts +1 -1
- package/dist/ar/chromium-camera-access-workaround.d.ts +1 -1
- package/dist/ar/depth-grid-lookup.d.ts +2 -0
- package/dist/ar/depth-grid-lookup.js +43 -0
- package/dist/ar/depth-sampler.d.ts +2 -2
- package/dist/ar/depth-sampler.js +2 -4
- package/dist/ar/depth-unprojection.d.ts +1 -1
- package/dist/ar/enable-gps-ar.d.ts +1 -1
- package/dist/ar/enable-gps-ar.js +26 -1
- package/dist/ar/frame-loop.d.ts +1 -1
- package/dist/ar/image-capture.d.ts +2 -2
- package/dist/ar/image-capture.js +1 -154
- package/dist/ar/image-quality.d.ts +2 -0
- package/dist/ar/image-quality.js +168 -0
- package/dist/ar/index.d.ts +31 -19
- package/dist/ar/index.js +17 -5
- package/dist/ar/occupancy-grid.d.ts +1 -1
- package/dist/ar/occupancy-grid.js +29 -2
- package/dist/ar/planar-pnp.d.ts +2 -0
- package/dist/ar/planar-pnp.js +425 -0
- package/dist/ar/qr-debug-view.d.ts +2 -0
- package/dist/ar/qr-debug-view.js +89 -0
- package/dist/ar/qr-derived-pose.d.ts +2 -0
- package/dist/ar/qr-derived-pose.js +114 -0
- package/dist/ar/qr-detection-controller.d.ts +2 -0
- package/dist/ar/qr-detection-controller.js +2 -0
- package/dist/ar/qr-frontend.d.ts +2 -0
- package/dist/ar/qr-frontend.js +60 -0
- package/dist/ar/qr-pose.d.ts +2 -0
- package/dist/ar/qr-pose.js +267 -0
- package/dist/ar/qr-size-depth-context.d.ts +3 -0
- package/dist/ar/qr-size-depth-context.js +42 -0
- package/dist/ar/qr-size-measurer.d.ts +2 -0
- package/dist/ar/qr-size-measurer.js +2 -0
- package/dist/ar/replay-scene.d.ts +1 -1
- package/dist/ar/replay-scene.js +1 -1
- package/dist/ar/scene-node-names.d.ts +1 -1
- package/dist/ar/webxr-nue-basis.d.ts +1 -1
- package/dist/ar/webxr-session.d.ts +4 -4
- package/dist/ar/webxr-session.js +2 -2
- package/dist/ar/xr-camera-texture.d.ts +1 -1
- package/dist/ar/xr-error-handler.d.ts +1 -1
- package/dist/ar/xr-frame-loop.d.ts +1 -1
- package/dist/ar-MFpFlV7j.js +382 -0
- package/dist/{ar-world-group-alignment-C9lwwIyI.d.ts → ar-world-group-alignment-69fgnB39.d.ts} +1 -1
- package/dist/{camera-blit-capture-CnxUDbKx.d.ts → camera-blit-capture-NKT9H5-e.d.ts} +57 -4
- package/dist/capture-motion-gate-0Yl2NpQG.d.ts +24 -0
- package/dist/capture-motion-gate-4EscNZCw.js +94 -0
- package/dist/concurrency-By0oOTZt.d.ts +50 -0
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.js +2 -2
- package/dist/create-slam-app-store-DkCHOpvb.js +149 -0
- package/dist/{create-slam-app-store-BljusOua.d.ts → create-slam-app-store-n_VF63D5.d.ts} +50 -40
- package/dist/depth-grid-lookup-DQ-IYhO3.d.ts +21 -0
- package/dist/{depth-sampler-Bhanfwla.d.ts → depth-sampler-asc8exHt.d.ts} +1 -1
- package/dist/{depth-unprojection-Y6i_mJuT.d.ts → depth-unprojection-DjsbJW9L.d.ts} +1 -1
- package/dist/{enable-gps-ar-BfUJOgpW.d.ts → enable-gps-ar-DkNhFv4Y.d.ts} +4 -4
- package/dist/{frame-conversions-BfsafGWR.d.ts → frame-conversions-DObhj8Wf.d.ts} +1 -1
- package/dist/{fused-path-DJoVu98b.d.ts → fused-path-v6eOmLl3.d.ts} +1 -1
- package/dist/geo/h3-proximity.d.ts +2 -2
- package/dist/geo/h3-proximity.js +61 -2
- package/dist/geo/index.d.ts +2 -2
- package/dist/geo/index.js +2 -2
- package/dist/geodesic-angle-BTldfFgs.js +39 -0
- package/dist/{gps-anchor-dYeCvvp5.d.ts → gps-anchor-BeFO2RYa.d.ts} +1 -1
- package/dist/{gps-ar-pose-sampler-DVb96iOy.d.ts → gps-ar-pose-sampler-DHMZmYAc.d.ts} +1 -1
- package/dist/{gps-event-coordinator-CWIDOk4U.d.ts → gps-event-coordinator-CjWW636x.d.ts} +21 -11
- package/dist/{gps-event-markers-Dc9FT-q1.d.ts → gps-event-markers-Cz9RMA2k.d.ts} +18 -0
- package/dist/{h3-proximity-I1msGPgE.d.ts → h3-proximity-C-j0pw1j.d.ts} +39 -1
- package/dist/image-capture-B2-b6tKK.js +374 -0
- package/dist/{image-capture-qAZ5Fh5X.d.ts → image-capture-CNZDrQXG.d.ts} +103 -3
- package/dist/image-quality-smCBoFj1.d.ts +158 -0
- package/dist/index-BAPokxMb.d.ts +22 -0
- package/dist/{index-BYYUdf9v.d.ts → index-BODDUTvD.d.ts} +1 -1
- package/dist/index-BneSj4_5.d.ts +399 -0
- package/dist/index-_Rhgoqkh.d.ts +2 -0
- package/dist/index.d.ts +80 -67
- package/dist/index.js +24 -12
- package/dist/{leaflet-map-overlay-6CJC-E1l.d.ts → leaflet-map-overlay-CmIyiE8n.d.ts} +1 -1
- package/dist/{map-data-CkloBxIl.d.ts → map-data-B4oEehUh.d.ts} +1 -1
- package/dist/{map-overlay-draw-krOKwDAq.d.ts → map-overlay-draw-ymz1s7fG.d.ts} +1 -1
- package/dist/{null-storage-backend-uKQE8tl7.d.ts → null-storage-backend-B9rtyDfG.d.ts} +2 -2
- package/dist/{occupancy-grid-BRNRaPyT.d.ts → occupancy-grid-DnOc-6PU.d.ts} +12 -2
- package/dist/{opfs-storage-D5zAn_lx.d.ts → opfs-storage-3VZh-qH6.d.ts} +23 -4
- package/dist/{opfs-storage-backend-6aYMUZlJ.d.ts → opfs-storage-backend-JJiUJo-3.d.ts} +3 -3
- package/dist/{persistence-middleware-B9ei4Nhx.d.ts → persistence-middleware-DAPTTwB2.d.ts} +1 -1
- package/dist/planar-pnp-my9bqULS.d.ts +67 -0
- package/dist/qr-debug-view-Brl73HGO.d.ts +29 -0
- package/dist/qr-derived-pose-CmxTP2m4.d.ts +122 -0
- package/dist/qr-detected-slice-VQssZmQJ.d.ts +166 -0
- package/dist/qr-detection-controller-B-tLVd-S.js +119 -0
- package/dist/qr-detection-controller-CDurHv8E.d.ts +48 -0
- package/dist/qr-frontend--fFX25mV.d.ts +58 -0
- package/dist/qr-pose-D2rfu5DA.d.ts +138 -0
- package/dist/qr-pose-aggregation-B7tWJq7j.d.ts +90 -0
- package/dist/qr-pose-aggregation-DBiaLW0O.js +191 -0
- package/dist/qr-size-depth-context-CeAG53fy.d.ts +13 -0
- package/dist/qr-size-measurer-DLb33geH.js +596 -0
- package/dist/qr-size-measurer-DQdAsid1.d.ts +165 -0
- package/dist/recording-options-BPCpMHLK.d.ts +514 -0
- package/dist/{recording-replayer-r0DZ9ALp.d.ts → recording-replayer-DQKpAGyQ.d.ts} +2 -2
- package/dist/recording-slice-DaxHZvNu.d.ts +55 -0
- package/dist/{replay-engine-XpDa0dy1.d.ts → replay-engine-CmKh_4wf.d.ts} +7 -4
- package/dist/{replay-scene-Bw58VL6p.d.ts → replay-scene-DBlDrV_x.d.ts} +3 -3
- package/dist/sensors/absolute-orientation.d.ts +2 -0
- package/dist/sensors/absolute-orientation.js +145 -0
- package/dist/sensors/gps-error-handler.d.ts +1 -1
- package/dist/sensors/gps.d.ts +1 -1
- package/dist/sensors/index.d.ts +5 -4
- package/dist/sensors/index.js +2 -1
- package/dist/sensors/permission-checker.d.ts +1 -1
- package/dist/sensors/permission-checker.js +1 -1
- package/dist/state/app-selectors.d.ts +1 -1
- package/dist/state/combined-root-state.d.ts +1 -1
- package/dist/state/create-slam-app-store.d.ts +1 -1
- package/dist/state/create-slam-app-store.js +1 -74
- package/dist/state/gps-ar-pose-sampler.d.ts +3 -3
- package/dist/state/gps-event-coordinator.d.ts +2 -2
- package/dist/state/gps-event-coordinator.js +27 -17
- package/dist/state/index.d.ts +20 -17
- package/dist/state/index.js +5 -4
- package/dist/state/persistence-middleware.d.ts +1 -1
- package/dist/state/persistence-middleware.js +30 -19
- package/dist/state/qr-detected-slice.d.ts +4 -0
- package/dist/state/qr-detected-slice.js +311 -0
- package/dist/state/recording-options.d.ts +2 -2
- package/dist/state/recording-options.js +273 -7
- package/dist/state/recording-replayer.d.ts +2 -2
- package/dist/state/recording-replayer.js +1 -1
- package/dist/state/recording-slice.d.ts +1 -1
- package/dist/state/recording-slice.js +5 -1
- package/dist/state/replay-engine.d.ts +1 -1
- package/dist/state/replay-engine.js +7 -3
- package/dist/state/store-subscribers.d.ts +2 -2
- package/dist/state/subscribe-to-selector.d.ts +1 -1
- package/dist/state/tracking-quality.d.ts +2 -2
- package/dist/state/tracking-quality.js +40 -128
- package/dist/state/tracking-slice.d.ts +1 -1
- package/dist/{state-BkIfpiyA.js → state-E51QT_-j.js} +2 -1
- package/dist/storage/file-system-utils.d.ts +1 -1
- package/dist/storage/index.d.ts +9 -9
- package/dist/storage/index.js +4 -4
- package/dist/storage/null-storage-backend.d.ts +1 -1
- package/dist/storage/opfs-storage-backend.d.ts +1 -1
- package/dist/storage/opfs-storage-backend.js +3 -3
- package/dist/storage/opfs-storage.d.ts +1 -1
- package/dist/storage/opfs-storage.js +5 -4
- package/dist/storage/storage-backend.d.ts +1 -1
- package/dist/storage/zip-coverage-embed.d.ts +2 -0
- package/dist/storage/zip-coverage-embed.js +88 -0
- package/dist/storage/zip-export.d.ts +2 -2
- package/dist/storage/zip-export.js +37 -59
- package/dist/storage/zip-reader.d.ts +1 -1
- package/dist/{storage-backend-Do6YDpNo.d.ts → storage-backend-BdVLD0dU.d.ts} +1 -1
- package/dist/{store-subscribers-0YWyOLvV.d.ts → store-subscribers-CA6AJH_8.d.ts} +2 -2
- package/dist/{subscribe-to-selector-CZ6k1NFP.d.ts → subscribe-to-selector-B6EUmQ3I.d.ts} +1 -1
- package/dist/test-utils/browser-mocks.d.ts +7 -1
- package/dist/test-utils/browser-mocks.js +6 -0
- package/dist/test-utils/zip-round-trip-helpers.d.ts +9 -1
- package/dist/test-utils/zip-round-trip-helpers.js +5 -1
- package/dist/{tracking-slice-CdK8c-8P.d.ts → tracking-slice-BuAZxXZ5.d.ts} +1 -1
- package/dist/types/ar-types.d.ts +1 -1
- package/dist/types/geo-types.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/utils/concurrency.d.ts +2 -2
- package/dist/utils/concurrency.js +66 -2
- package/dist/utils/failure-tracker.d.ts +1 -1
- package/dist/utils/format-file-size.d.ts +1 -1
- package/dist/utils/fused-path.d.ts +1 -1
- package/dist/utils/index.d.ts +8 -7
- package/dist/utils/index.js +2 -1
- package/dist/utils/list-formatter.d.ts +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/visualization/accuracy-circles.d.ts +1 -1
- package/dist/visualization/alignment-lerper.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.d.ts +1 -1
- package/dist/visualization/ar-world-group-alignment.js +1 -1
- package/dist/visualization/camera-follower.d.ts +1 -1
- package/dist/visualization/css3d-renderer-manager.d.ts +1 -1
- package/dist/visualization/frame-conversions.d.ts +1 -1
- package/dist/visualization/frustum-visibility.d.ts +1 -1
- package/dist/visualization/gps-anchor.d.ts +1 -1
- package/dist/visualization/gps-compass-cubes.d.ts +1 -1
- package/dist/visualization/gps-event-markers.d.ts +1 -1
- package/dist/visualization/gps-event-markers.js +40 -5
- package/dist/visualization/hit-test-reticle.d.ts +1 -1
- package/dist/visualization/hit-test-reticle.js +1 -0
- package/dist/visualization/index.d.ts +18 -18
- package/dist/visualization/leaflet-map-overlay.d.ts +1 -1
- package/dist/visualization/leaflet-map-overlay.js +15 -3
- package/dist/visualization/lerp-utils.d.ts +1 -1
- package/dist/visualization/map-data.d.ts +1 -1
- package/dist/visualization/map-overlay-draw.d.ts +1 -1
- package/dist/visualization/map-overlay.d.ts +1 -1
- package/dist/visualization/three-dispose.d.ts +1 -1
- package/dist/visualization/vis-colors.d.ts +1 -1
- package/dist/{webxr-session-TIaD883f.js → webxr-session-DG-eNfny.js} +244 -11
- package/dist/{webxr-session-GjZ2BIpS.d.ts → webxr-session-Do5L6G3B.d.ts} +86 -8
- package/dist/zip-coverage-embed-DCAREVmw.d.ts +41 -0
- package/dist/{zip-export-G14hkSPG.d.ts → zip-export-ol0S_Ofd.d.ts} +27 -23
- package/package.json +2 -2
- package/dist/concurrency-CO1FQvs3.d.ts +0 -24
- package/dist/file-system-CwXTNHmB.d.ts +0 -114
- package/dist/index-CF05QV2m.d.ts +0 -2
- package/dist/recording-options-DJBXuMxV.d.ts +0 -182
- package/dist/recording-slice-89O07ebs.d.ts +0 -36
- package/dist/storage/file-system.d.ts +0 -2
- package/dist/storage/file-system.js +0 -289
- /package/dist/{accuracy-circles-BpwWAs8G.d.ts → accuracy-circles-BtqOP_v1.d.ts} +0 -0
- /package/dist/{alignment-lerper-Dm9G7JJO.d.ts → alignment-lerper-Bil6vbVw.d.ts} +0 -0
- /package/dist/{ar-types-Dan1MVTi.d.ts → ar-types-BFX2r1wk.d.ts} +0 -0
- /package/dist/{bresenham3d-CFfd7n6B.d.ts → bresenham3d-CU1Gv2W4.d.ts} +0 -0
- /package/dist/{camera-follower-C2mwEn7c.d.ts → camera-follower-CqJJ7zRj.d.ts} +0 -0
- /package/dist/{capability-checker-CQXJHxXg.d.ts → capability-checker-DUQLg6gq.d.ts} +0 -0
- /package/dist/{capture-failure-tracker-CUeU3L_M.d.ts → capture-failure-tracker-gsm8q7yi.d.ts} +0 -0
- /package/dist/{chromium-camera-access-workaround-Jqbn0apH.d.ts → chromium-camera-access-workaround-D4K2uwwQ.d.ts} +0 -0
- /package/dist/{css3d-renderer-manager-ptu_t3B3.d.ts → css3d-renderer-manager-B3kGNtcn.d.ts} +0 -0
- /package/dist/{failure-tracker-Cn8Fo9D4.d.ts → failure-tracker-BO7M7jF_.d.ts} +0 -0
- /package/dist/{file-system-utils-CXIoL-DM.d.ts → file-system-utils-DOajnMm-.d.ts} +0 -0
- /package/dist/{format-file-size-CLCZz3lC.d.ts → format-file-size-Dc98ulzB.d.ts} +0 -0
- /package/dist/{frame-loop-CMewS8cY.d.ts → frame-loop-CpVjQ1dH.d.ts} +0 -0
- /package/dist/{frustum-visibility-CmI96ESS.d.ts → frustum-visibility-CeoCZchO.d.ts} +0 -0
- /package/dist/{geo-types-SaPnIEUM.d.ts → geo-types-3Ip1NzVR.d.ts} +0 -0
- /package/dist/{gps-VuezJWK3.d.ts → gps-BBO3hKfT.d.ts} +0 -0
- /package/dist/{gps-compass-cubes-BM1uGiYV.d.ts → gps-compass-cubes-DSN87L8p.d.ts} +0 -0
- /package/dist/{gps-error-handler-CJl_2MVm.d.ts → gps-error-handler-BbPsfw-_.d.ts} +0 -0
- /package/dist/{hit-test-reticle-BEzEybxZ.d.ts → hit-test-reticle-DV-2TpB9.d.ts} +0 -0
- /package/dist/{lerp-utils-BpV-0Dtk.d.ts → lerp-utils-BLmHhkVe.d.ts} +0 -0
- /package/dist/{list-formatter-RRcBe8Vg.d.ts → list-formatter-KNMS0ay2.d.ts} +0 -0
- /package/dist/{logger-BEHXsnnq.d.ts → logger-CLnPrHiD.d.ts} +0 -0
- /package/dist/{map-overlay-bcogY5fK.d.ts → map-overlay-Dh2B97MP.d.ts} +0 -0
- /package/dist/{permission-checker-GpAiSCwd.d.ts → permission-checker-CDuI8BwC.d.ts} +0 -0
- /package/dist/{scene-node-names-Bu0S66H1.d.ts → scene-node-names-BiShOQDB.d.ts} +0 -0
- /package/dist/{session-disposers-M-oashRH.js → session-disposers-zv9OGXPB.js} +0 -0
- /package/dist/{three-dispose-D950t71B.d.ts → three-dispose-Bt1k7WKh.d.ts} +0 -0
- /package/dist/{vis-colors-D6omC64K.d.ts → vis-colors-Obw2pLqT.d.ts} +0 -0
- /package/dist/{webxr-nue-basis-CqKQmZzT.d.ts → webxr-nue-basis-3nfjDJJp.d.ts} +0 -0
- /package/dist/{xr-camera-texture-DBwCaKTd.d.ts → xr-camera-texture-Cva1q3Qj.d.ts} +0 -0
- /package/dist/{xr-error-handler-C0AQRmxs.d.ts → xr-error-handler-CtvHpjfm.d.ts} +0 -0
- /package/dist/{xr-frame-loop-BtYytZJg.d.ts → xr-frame-loop-DIYtRcUa.d.ts} +0 -0
- /package/dist/{zip-reader-DSEXt7K6.d.ts → zip-reader-D9iPQwdQ.d.ts} +0 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger.js";
|
|
2
|
+
import { t as DEFAULT_MOTION_FILTER } from "../capture-motion-gate-4EscNZCw.js";
|
|
3
|
+
import { DEFAULT_QUALITY_FILTER } from "../ar/image-quality.js";
|
|
2
4
|
//#region ../src/state/recording-options.ts
|
|
3
5
|
/**
|
|
4
6
|
* Recording Options - User-configurable settings for data capture.
|
|
@@ -31,7 +33,9 @@ const DEFAULT_RECORDING_OPTIONS = {
|
|
|
31
33
|
enabled: true,
|
|
32
34
|
intervalMs: 2e3,
|
|
33
35
|
quality: .7,
|
|
34
|
-
resolutionDivisor: 1
|
|
36
|
+
resolutionDivisor: 1,
|
|
37
|
+
motionFilter: { ...DEFAULT_MOTION_FILTER },
|
|
38
|
+
qualityFilter: { ...DEFAULT_QUALITY_FILTER }
|
|
35
39
|
},
|
|
36
40
|
arCrashIsolation: {
|
|
37
41
|
enableDomOverlay: true,
|
|
@@ -40,6 +44,27 @@ const DEFAULT_RECORDING_OPTIONS = {
|
|
|
40
44
|
enableCss3dRenderer: true,
|
|
41
45
|
enableCameraTextureAcquisition: true,
|
|
42
46
|
applyChromiumProjectionLayerWorkaround: true
|
|
47
|
+
},
|
|
48
|
+
occupancy: {
|
|
49
|
+
cellSizeM: .15,
|
|
50
|
+
minConfidence: 3
|
|
51
|
+
},
|
|
52
|
+
frameTileDisplay: { divisor: 2 },
|
|
53
|
+
visualization: {
|
|
54
|
+
frameTiles: true,
|
|
55
|
+
occupancyCubes: true,
|
|
56
|
+
gpsAlignmentMarkers: true,
|
|
57
|
+
compassCubes: true
|
|
58
|
+
},
|
|
59
|
+
qr: {
|
|
60
|
+
enabled: false,
|
|
61
|
+
intervalMs: 125,
|
|
62
|
+
captureSize: 1024
|
|
63
|
+
},
|
|
64
|
+
compassDebug: {
|
|
65
|
+
coldStartOverride: true,
|
|
66
|
+
rotationPrior: false,
|
|
67
|
+
webXRConsistency: false
|
|
43
68
|
}
|
|
44
69
|
};
|
|
45
70
|
/** Validation constraints for depth options */
|
|
@@ -74,6 +99,125 @@ const IMAGE_CONSTRAINTS = {
|
|
|
74
99
|
}
|
|
75
100
|
};
|
|
76
101
|
/**
|
|
102
|
+
* Validation constraints for the motion-filter (blurry-frame gate) thresholds.
|
|
103
|
+
*
|
|
104
|
+
* The velocity ranges (0.05–5) bracket the plausible scanning regime: below
|
|
105
|
+
* ~0.05 the gate would reject almost everything; above ~5 rad/s ≈ 286°/s (or
|
|
106
|
+
* 5 m/s) it would never reject, so the gate would be inert. `maxWaitMs` is
|
|
107
|
+
* clamped to 0.5–20 s — the never-calm fallback must always be able to fire.
|
|
108
|
+
* All three back a (currently advanced/hidden) settings slider, so a corrupt
|
|
109
|
+
* stored value can never disable capture. The default thresholds themselves are
|
|
110
|
+
* placeholders pending on-device field tuning (plan §7).
|
|
111
|
+
*/
|
|
112
|
+
const MOTION_FILTER_CONSTRAINTS = {
|
|
113
|
+
maxAngularVelocity: {
|
|
114
|
+
min: .05,
|
|
115
|
+
max: 5,
|
|
116
|
+
step: .05
|
|
117
|
+
},
|
|
118
|
+
maxLinearVelocity: {
|
|
119
|
+
min: .05,
|
|
120
|
+
max: 5,
|
|
121
|
+
step: .05
|
|
122
|
+
},
|
|
123
|
+
maxWaitMs: {
|
|
124
|
+
min: 500,
|
|
125
|
+
max: 2e4,
|
|
126
|
+
step: 500
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Validation constraints for the image-quality (blur/blackness) gate thresholds.
|
|
131
|
+
*
|
|
132
|
+
* `blurRelativeThreshold` (`k` in `sharpness < k·median`) is clamped to
|
|
133
|
+
* 0.05–0.95: it is a fraction of the recent sharpness median, so values must sit
|
|
134
|
+
* strictly inside (0, 1) — at ~0 the blur check never rejects, near 1 it rejects
|
|
135
|
+
* almost everything. `minMeanLuminance` (the absolute black cutoff on a 0–255
|
|
136
|
+
* luma scale) is clamped to 0–128: 0 disables the black check, and a cutoff
|
|
137
|
+
* above mid-grey would reject normally-lit frames. `maxWaitMs` mirrors the motion
|
|
138
|
+
* gate's range (0.5–20 s) so the never-good fallback can always fire. All back a
|
|
139
|
+
* (currently advanced/hidden) settings slider, so a corrupt stored value can
|
|
140
|
+
* never disable capture. The default thresholds are placeholders pending
|
|
141
|
+
* on-device field tuning (plan §5, §10).
|
|
142
|
+
*/
|
|
143
|
+
const QUALITY_FILTER_CONSTRAINTS = {
|
|
144
|
+
blurRelativeThreshold: {
|
|
145
|
+
min: .05,
|
|
146
|
+
max: .95,
|
|
147
|
+
step: .05
|
|
148
|
+
},
|
|
149
|
+
minMeanLuminance: {
|
|
150
|
+
min: 0,
|
|
151
|
+
max: 128,
|
|
152
|
+
step: 1
|
|
153
|
+
},
|
|
154
|
+
maxWaitMs: {
|
|
155
|
+
min: 500,
|
|
156
|
+
max: 2e4,
|
|
157
|
+
step: 500
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
/**
|
|
161
|
+
* Validation constraints for occupancy options.
|
|
162
|
+
*
|
|
163
|
+
* `cellSizeM` is clamped to 1–20 cm. The floor exists because cell count (and
|
|
164
|
+
* therefore the cube `InstancedMesh`, the grid `Map`, and the COLMAP
|
|
165
|
+
* `points3D` row count) scales as 1/cellSize³ — sub-centimetre voxels are both
|
|
166
|
+
* a memory/perf cliff on a phone and below the depth sensor's noise floor.
|
|
167
|
+
* Step is 1 cm (the settings slider operates in cm).
|
|
168
|
+
*
|
|
169
|
+
* `minConfidence` is clamped to 1–10 (integer). 1 disables the filter (legacy
|
|
170
|
+
* behaviour: a single observation counts as occupied); the ceiling exists
|
|
171
|
+
* because real surfaces accumulate only a handful of observations per second
|
|
172
|
+
* of dwell, so a floor above ~10 would start hiding genuine geometry.
|
|
173
|
+
*/
|
|
174
|
+
const OCCUPANCY_CONSTRAINTS = {
|
|
175
|
+
cellSizeM: {
|
|
176
|
+
min: .01,
|
|
177
|
+
max: .2,
|
|
178
|
+
step: .01
|
|
179
|
+
},
|
|
180
|
+
minConfidence: {
|
|
181
|
+
min: 1,
|
|
182
|
+
max: 10,
|
|
183
|
+
step: 1
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Validation constraints for the frame-tile display-resolution divisor.
|
|
188
|
+
*
|
|
189
|
+
* Clamped to 1–8 (full down to one-eighth per dimension), mirroring the capture
|
|
190
|
+
* `IMAGE_CONSTRAINTS.resolutionDivisor` range so the settings slider behaves the
|
|
191
|
+
* same. The intended stops are 1, 2, 4, 8 (full / half / quarter / eighth); the
|
|
192
|
+
* divisor is rounded to an integer so the resize target dimensions stay clean.
|
|
193
|
+
*/
|
|
194
|
+
const FRAME_TILE_DISPLAY_CONSTRAINTS = { divisor: {
|
|
195
|
+
min: 1,
|
|
196
|
+
max: 8,
|
|
197
|
+
step: 1
|
|
198
|
+
} };
|
|
199
|
+
/**
|
|
200
|
+
* Validation constraints for QR-capture options.
|
|
201
|
+
*
|
|
202
|
+
* `intervalMs` is clamped to 50–1000 ms (20 Hz down to 1 Hz): below ~50 ms the
|
|
203
|
+
* detector cannot keep up and frames just queue; above 1 s tracking feels dead.
|
|
204
|
+
* `captureSize` is clamped to 256–2048 px: under 256 even a near QR loses its
|
|
205
|
+
* modules; over 2048 the blit + decode cost is not worth it on a phone. Both
|
|
206
|
+
* back a settings slider so a corrupt stored value can never break capture.
|
|
207
|
+
*/
|
|
208
|
+
const QR_CONSTRAINTS = {
|
|
209
|
+
intervalMs: {
|
|
210
|
+
min: 50,
|
|
211
|
+
max: 1e3,
|
|
212
|
+
step: 25
|
|
213
|
+
},
|
|
214
|
+
captureSize: {
|
|
215
|
+
min: 256,
|
|
216
|
+
max: 2048,
|
|
217
|
+
step: 128
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
77
221
|
* Validate and normalize AR crash isolation flags.
|
|
78
222
|
* Missing or invalid values fall back to defaults.
|
|
79
223
|
*/
|
|
@@ -89,12 +233,56 @@ function validateArCrashIsolationOptions(options) {
|
|
|
89
233
|
};
|
|
90
234
|
}
|
|
91
235
|
/**
|
|
236
|
+
* Validate and normalize the compass alignment debug toggles. Boolean-or-default
|
|
237
|
+
* per field; a missing/corrupted/pre-feature value falls back to the OFF default
|
|
238
|
+
* so a bad persisted value can never silently turn an alignment override ON.
|
|
239
|
+
*/
|
|
240
|
+
function validateCompassDebugOptions(options) {
|
|
241
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.compassDebug;
|
|
242
|
+
return {
|
|
243
|
+
coldStartOverride: typeof options.coldStartOverride === "boolean" ? options.coldStartOverride : defaults.coldStartOverride,
|
|
244
|
+
rotationPrior: typeof options.rotationPrior === "boolean" ? options.rotationPrior : defaults.rotationPrior,
|
|
245
|
+
webXRConsistency: typeof options.webXRConsistency === "boolean" ? options.webXRConsistency : defaults.webXRConsistency
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Validate and normalize the live debug-overlay visibility toggles.
|
|
250
|
+
* Each field is boolean-or-default (same policy as the AR-crash-isolation
|
|
251
|
+
* flags): a missing, corrupted, or pre-feature persisted value falls back to
|
|
252
|
+
* the ON default so an overlay is never silently disabled by bad input.
|
|
253
|
+
*/
|
|
254
|
+
function validateVisualizationOptions(options) {
|
|
255
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.visualization;
|
|
256
|
+
return {
|
|
257
|
+
frameTiles: typeof options.frameTiles === "boolean" ? options.frameTiles : defaults.frameTiles,
|
|
258
|
+
occupancyCubes: typeof options.occupancyCubes === "boolean" ? options.occupancyCubes : defaults.occupancyCubes,
|
|
259
|
+
gpsAlignmentMarkers: typeof options.gpsAlignmentMarkers === "boolean" ? options.gpsAlignmentMarkers : defaults.gpsAlignmentMarkers,
|
|
260
|
+
compassCubes: typeof options.compassCubes === "boolean" ? options.compassCubes : defaults.compassCubes
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
92
264
|
* Clamp a value to the specified constraints.
|
|
93
265
|
*/
|
|
94
266
|
function clamp(value, min, max) {
|
|
95
267
|
return Math.max(min, Math.min(max, value));
|
|
96
268
|
}
|
|
97
269
|
/**
|
|
270
|
+
* Validate and normalize QR-capture options. `enabled` is boolean-or-default
|
|
271
|
+
* (a corrupt/pre-feature value falls back to the OFF default so QR never
|
|
272
|
+
* silently turns ON); `intervalMs`/`captureSize` are clamped to
|
|
273
|
+
* {@link QR_CONSTRAINTS}, with a `Number.isFinite` guard so a stored `NaN`
|
|
274
|
+
* (which is `typeof 'number'` and survives `clamp`) falls back to the default
|
|
275
|
+
* rather than breaking the camera-frame source.
|
|
276
|
+
*/
|
|
277
|
+
function validateQrOptions(options) {
|
|
278
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.qr;
|
|
279
|
+
return {
|
|
280
|
+
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
281
|
+
intervalMs: clamp(typeof options.intervalMs === "number" && Number.isFinite(options.intervalMs) ? options.intervalMs : defaults.intervalMs, QR_CONSTRAINTS.intervalMs.min, QR_CONSTRAINTS.intervalMs.max),
|
|
282
|
+
captureSize: clamp(typeof options.captureSize === "number" && Number.isFinite(options.captureSize) ? options.captureSize : defaults.captureSize, QR_CONSTRAINTS.captureSize.min, QR_CONSTRAINTS.captureSize.max)
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
98
286
|
* Validate and normalize depth options.
|
|
99
287
|
* Invalid values are clamped to valid ranges.
|
|
100
288
|
*/
|
|
@@ -103,11 +291,46 @@ function validateDepthOptions(options) {
|
|
|
103
291
|
return {
|
|
104
292
|
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
105
293
|
intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, DEPTH_CONSTRAINTS.intervalMs.min, DEPTH_CONSTRAINTS.intervalMs.max),
|
|
106
|
-
gridSize: clamp(typeof options.gridSize === "number" ? options.gridSize : defaults.gridSize, DEPTH_CONSTRAINTS.gridSize.min, DEPTH_CONSTRAINTS.gridSize.max),
|
|
294
|
+
gridSize: clamp(typeof options.gridSize === "number" && Number.isFinite(options.gridSize) ? Math.round(options.gridSize) : defaults.gridSize, DEPTH_CONSTRAINTS.gridSize.min, DEPTH_CONSTRAINTS.gridSize.max),
|
|
107
295
|
rgb: typeof options.rgb === "boolean" ? options.rgb : defaults.rgb
|
|
108
296
|
};
|
|
109
297
|
}
|
|
110
298
|
/**
|
|
299
|
+
* Validate and normalize the motion-filter (blurry-frame gate) options.
|
|
300
|
+
* `enabled` is boolean-or-default; the three numeric thresholds are clamped to
|
|
301
|
+
* {@link MOTION_FILTER_CONSTRAINTS} with a `Number.isFinite` guard (a stored
|
|
302
|
+
* `NaN` is `typeof 'number'` and would survive `clamp`). A missing group
|
|
303
|
+
* default-fills entirely — a pre-feature persisted options object that lacks
|
|
304
|
+
* `motionFilter` therefore loads with the gate enabled rather than crashing.
|
|
305
|
+
*/
|
|
306
|
+
function validateMotionFilterOptions(options) {
|
|
307
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.images.motionFilter;
|
|
308
|
+
return {
|
|
309
|
+
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
310
|
+
maxAngularVelocity: clamp(typeof options.maxAngularVelocity === "number" && Number.isFinite(options.maxAngularVelocity) ? options.maxAngularVelocity : defaults.maxAngularVelocity, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.min, MOTION_FILTER_CONSTRAINTS.maxAngularVelocity.max),
|
|
311
|
+
maxLinearVelocity: clamp(typeof options.maxLinearVelocity === "number" && Number.isFinite(options.maxLinearVelocity) ? options.maxLinearVelocity : defaults.maxLinearVelocity, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.min, MOTION_FILTER_CONSTRAINTS.maxLinearVelocity.max),
|
|
312
|
+
maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, MOTION_FILTER_CONSTRAINTS.maxWaitMs.min, MOTION_FILTER_CONSTRAINTS.maxWaitMs.max)
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Validate and normalize the image-quality (blur/blackness gate) options. Same
|
|
317
|
+
* policy as {@link validateMotionFilterOptions}: `enabled` is boolean-or-default;
|
|
318
|
+
* the three numeric thresholds are clamped to {@link QUALITY_FILTER_CONSTRAINTS}
|
|
319
|
+
* with a `Number.isFinite` guard (a stored `NaN` is `typeof 'number'` and would
|
|
320
|
+
* survive `clamp`). A missing group default-fills entirely — a pre-feature
|
|
321
|
+
* persisted options object that lacks `qualityFilter` loads with the gate
|
|
322
|
+
* disabled (the safe default) rather than crashing.
|
|
323
|
+
*/
|
|
324
|
+
function validateQualityFilterOptions(options) {
|
|
325
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.images.qualityFilter;
|
|
326
|
+
return {
|
|
327
|
+
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
328
|
+
blurRelativeThreshold: clamp(typeof options.blurRelativeThreshold === "number" && Number.isFinite(options.blurRelativeThreshold) ? options.blurRelativeThreshold : defaults.blurRelativeThreshold, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.min, QUALITY_FILTER_CONSTRAINTS.blurRelativeThreshold.max),
|
|
329
|
+
minMeanLuminance: clamp(typeof options.minMeanLuminance === "number" && Number.isFinite(options.minMeanLuminance) ? options.minMeanLuminance : defaults.minMeanLuminance, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.min, QUALITY_FILTER_CONSTRAINTS.minMeanLuminance.max),
|
|
330
|
+
maxWaitMs: clamp(typeof options.maxWaitMs === "number" && Number.isFinite(options.maxWaitMs) ? options.maxWaitMs : defaults.maxWaitMs, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.min, QUALITY_FILTER_CONSTRAINTS.maxWaitMs.max)
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
111
334
|
* Validate and normalize image options.
|
|
112
335
|
* Invalid values are clamped to valid ranges.
|
|
113
336
|
*/
|
|
@@ -117,10 +340,39 @@ function validateImageOptions(options) {
|
|
|
117
340
|
enabled: typeof options.enabled === "boolean" ? options.enabled : defaults.enabled,
|
|
118
341
|
intervalMs: clamp(typeof options.intervalMs === "number" ? options.intervalMs : defaults.intervalMs, IMAGE_CONSTRAINTS.intervalMs.min, IMAGE_CONSTRAINTS.intervalMs.max),
|
|
119
342
|
quality: clamp(typeof options.quality === "number" ? options.quality : defaults.quality, IMAGE_CONSTRAINTS.quality.min, IMAGE_CONSTRAINTS.quality.max),
|
|
120
|
-
resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max)
|
|
343
|
+
resolutionDivisor: clamp(typeof options.resolutionDivisor === "number" ? options.resolutionDivisor : defaults.resolutionDivisor, IMAGE_CONSTRAINTS.resolutionDivisor.min, IMAGE_CONSTRAINTS.resolutionDivisor.max),
|
|
344
|
+
motionFilter: validateMotionFilterOptions(options.motionFilter ?? {}),
|
|
345
|
+
qualityFilter: validateQualityFilterOptions(options.qualityFilter ?? {})
|
|
121
346
|
};
|
|
122
347
|
}
|
|
123
348
|
/**
|
|
349
|
+
* Validate and normalize occupancy options.
|
|
350
|
+
* Invalid values are clamped to valid ranges.
|
|
351
|
+
*
|
|
352
|
+
* Note the explicit `Number.isFinite` guard: `OccupancyGrid` throws a
|
|
353
|
+
* `RangeError` on a non-finite cell size, and `clamp(NaN, …)` would otherwise
|
|
354
|
+
* pass `NaN` straight through (it is `typeof 'number'`). Falling back to the
|
|
355
|
+
* default keeps a corrupted stored value from crashing grid construction.
|
|
356
|
+
*/
|
|
357
|
+
function validateOccupancyOptions(options) {
|
|
358
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.occupancy;
|
|
359
|
+
return {
|
|
360
|
+
cellSizeM: clamp(typeof options.cellSizeM === "number" && Number.isFinite(options.cellSizeM) ? options.cellSizeM : defaults.cellSizeM, OCCUPANCY_CONSTRAINTS.cellSizeM.min, OCCUPANCY_CONSTRAINTS.cellSizeM.max),
|
|
361
|
+
minConfidence: clamp(typeof options.minConfidence === "number" && Number.isFinite(options.minConfidence) ? Math.round(options.minConfidence) : defaults.minConfidence, OCCUPANCY_CONSTRAINTS.minConfidence.min, OCCUPANCY_CONSTRAINTS.minConfidence.max)
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Validate and normalize frame-tile display options. `divisor` is clamped to
|
|
366
|
+
* {@link FRAME_TILE_DISPLAY_CONSTRAINTS} and rounded to an integer, with a
|
|
367
|
+
* `Number.isFinite` guard so a stored `NaN` (which is `typeof 'number'` and
|
|
368
|
+
* survives `clamp`) falls back to the default rather than producing a broken
|
|
369
|
+
* resize target.
|
|
370
|
+
*/
|
|
371
|
+
function validateFrameTileDisplayOptions(options) {
|
|
372
|
+
const defaults = DEFAULT_RECORDING_OPTIONS.frameTileDisplay;
|
|
373
|
+
return { divisor: clamp(typeof options.divisor === "number" && Number.isFinite(options.divisor) ? Math.round(options.divisor) : defaults.divisor, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.min, FRAME_TILE_DISPLAY_CONSTRAINTS.divisor.max) };
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
124
376
|
* Validate and normalize a full RecordingOptions object.
|
|
125
377
|
* Merges with defaults and clamps invalid values.
|
|
126
378
|
*/
|
|
@@ -128,7 +380,12 @@ function validateRecordingOptions(options) {
|
|
|
128
380
|
return {
|
|
129
381
|
depth: validateDepthOptions(options.depth ?? {}),
|
|
130
382
|
images: validateImageOptions(options.images ?? {}),
|
|
131
|
-
arCrashIsolation: validateArCrashIsolationOptions(options.arCrashIsolation ?? {})
|
|
383
|
+
arCrashIsolation: validateArCrashIsolationOptions(options.arCrashIsolation ?? {}),
|
|
384
|
+
occupancy: validateOccupancyOptions(options.occupancy ?? {}),
|
|
385
|
+
frameTileDisplay: validateFrameTileDisplayOptions(options.frameTileDisplay ?? {}),
|
|
386
|
+
visualization: validateVisualizationOptions(options.visualization ?? {}),
|
|
387
|
+
qr: validateQrOptions(options.qr ?? {}),
|
|
388
|
+
compassDebug: validateCompassDebugOptions(options.compassDebug ?? {})
|
|
132
389
|
};
|
|
133
390
|
}
|
|
134
391
|
/**
|
|
@@ -186,9 +443,18 @@ function resetRecordingOptions(storageKey = STORAGE_KEY) {
|
|
|
186
443
|
function cloneRecordingOptions(options) {
|
|
187
444
|
return {
|
|
188
445
|
depth: { ...options.depth },
|
|
189
|
-
images: {
|
|
190
|
-
|
|
446
|
+
images: {
|
|
447
|
+
...options.images,
|
|
448
|
+
motionFilter: { ...options.images.motionFilter },
|
|
449
|
+
qualityFilter: { ...options.images.qualityFilter }
|
|
450
|
+
},
|
|
451
|
+
arCrashIsolation: { ...options.arCrashIsolation },
|
|
452
|
+
occupancy: { ...options.occupancy },
|
|
453
|
+
frameTileDisplay: { ...options.frameTileDisplay },
|
|
454
|
+
visualization: { ...options.visualization },
|
|
455
|
+
qr: { ...options.qr },
|
|
456
|
+
compassDebug: { ...options.compassDebug }
|
|
191
457
|
};
|
|
192
458
|
}
|
|
193
459
|
//#endregion
|
|
194
|
-
export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, IMAGE_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateDepthOptions, validateImageOptions, validateRecordingOptions };
|
|
460
|
+
export { DEFAULT_RECORDING_OPTIONS, DEPTH_CONSTRAINTS, FRAME_TILE_DISPLAY_CONSTRAINTS, IMAGE_CONSTRAINTS, MOTION_FILTER_CONSTRAINTS, OCCUPANCY_CONSTRAINTS, QR_CONSTRAINTS, QUALITY_FILTER_CONSTRAINTS, STORAGE_KEY, cloneRecordingOptions, loadRecordingOptions, resetRecordingOptions, saveRecordingOptions, validateArCrashIsolationOptions, validateCompassDebugOptions, validateDepthOptions, validateFrameTileDisplayOptions, validateImageOptions, validateMotionFilterOptions, validateOccupancyOptions, validateQrOptions, validateQualityFilterOptions, validateRecordingOptions, validateVisualizationOptions };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-
|
|
1
|
+
import { N as CombinedRootState } from "../create-slam-app-store-n_VF63D5.js";
|
|
2
|
+
import { n as replayRecording, t as ReplayRecordingOptions } from "../recording-replayer-DQKpAGyQ.js";
|
|
3
3
|
export { CombinedRootState, ReplayRecordingOptions, replayRecording };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { loadActionsFromZip } from "../storage/zip-reader.js";
|
|
2
2
|
import { NullStorageBackend } from "../storage/null-storage-backend.js";
|
|
3
|
-
import { createSlamAppStore } from "
|
|
3
|
+
import { t as createSlamAppStore } from "../create-slam-app-store-DkCHOpvb.js";
|
|
4
4
|
//#region ../src/state/recording-replayer.ts
|
|
5
5
|
/**
|
|
6
6
|
* Recording Replayer
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-
|
|
1
|
+
import { a as recordWriteFailure, i as recordDepthSample, n as SessionMetadata, o as recordingReducer, r as endSession, s as startSession, t as RecordingState } from "../recording-slice-DaxHZvNu.js";
|
|
2
2
|
export { RecordingState, SessionMetadata, endSession, recordDepthSample, recordWriteFailure, recordingReducer, startSession };
|
|
@@ -11,8 +11,12 @@ const recordingSlice = createSlice({
|
|
|
11
11
|
},
|
|
12
12
|
reducers: {
|
|
13
13
|
startSession(state, action) {
|
|
14
|
+
const { scenarioName, contextTag, ...rest } = action.payload;
|
|
14
15
|
state.isRecording = true;
|
|
15
|
-
state.sessionMetadata =
|
|
16
|
+
state.sessionMetadata = {
|
|
17
|
+
...rest,
|
|
18
|
+
contextTag: contextTag ?? scenarioName ?? ""
|
|
19
|
+
};
|
|
16
20
|
state.actionCount = 0;
|
|
17
21
|
state.failedWriteCount = 0;
|
|
18
22
|
state.latestDepthSample = null;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-
|
|
1
|
+
import { a as ReplayAction, c as computeInterActionDelay, i as ProgressCallback, l as extractActionTimestamp, n as DEFAULT_MAX_DELAY_MS, o as ReplayEngine, r as ErrorCallback, s as ReplayState, t as CompleteCallback } from "../replay-engine-CmKh_4wf.js";
|
|
2
2
|
export { CompleteCallback, DEFAULT_MAX_DELAY_MS, ErrorCallback, ProgressCallback, ReplayAction, ReplayEngine, ReplayState, computeInterActionDelay, extractActionTimestamp };
|
|
@@ -7,9 +7,12 @@ const MAX_CONSECUTIVE_ERRORS = 10;
|
|
|
7
7
|
* Extract an absolute epoch-ms timestamp from a Redux action, or null
|
|
8
8
|
* if the action type doesn't carry one.
|
|
9
9
|
*
|
|
10
|
-
* IMPORTANT:
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* IMPORTANT: the high-frequency sensor streams (depthSample, qrDetected) return
|
|
11
|
+
* null here ON PURPOSE — they are NOT used to pace replay delays (they anchor to
|
|
12
|
+
* the GPS/image/session timeline by recorded ORDER instead). Their payload
|
|
13
|
+
* `timestamp` IS epoch ms (`performance.timeOrigin + frameTs`, see
|
|
14
|
+
* `ar/depth-sampler.ts`); the QR size as-of join reads those payload timestamps
|
|
15
|
+
* directly, independently of this pacing function. (Risk R4)
|
|
13
16
|
*
|
|
14
17
|
* @param action - A Redux action with type and optional payload
|
|
15
18
|
* @returns Epoch milliseconds, or null if unavailable/unreliable
|
|
@@ -37,6 +40,7 @@ function extractActionTimestamp(action) {
|
|
|
37
40
|
return null;
|
|
38
41
|
}
|
|
39
42
|
case "recording/recordDepthSample": return null;
|
|
43
|
+
case "qrDetected/recordQrDetection": return null;
|
|
40
44
|
case "recording/endSession": return null;
|
|
41
45
|
default: return null;
|
|
42
46
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { t as SubscribableStore } from "../subscribe-to-selector-
|
|
2
|
-
import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-
|
|
1
|
+
import { t as SubscribableStore } from "../subscribe-to-selector-B6EUmQ3I.js";
|
|
2
|
+
import { n as wireStoreSubscribers, t as StoreSubscriberDeps } from "../store-subscribers-CA6AJH_8.js";
|
|
3
3
|
export { StoreSubscriberDeps, SubscribableStore, wireStoreSubscribers };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-
|
|
1
|
+
import { n as subscribeToSelector, t as SubscribableStore } from "../subscribe-to-selector-B6EUmQ3I.js";
|
|
2
2
|
export { SubscribableStore, subscribeToSelector };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
2
|
-
export { AlignmentSnapshot,
|
|
1
|
+
import { A as snapshotPushed, C as createTrackingQualityListenerMiddleware, D as resetTrackingQuality, E as reportUpdated, M as trackingQualityReducer, O as selectRecentAlignments, S as computeTrackingQualityReport, T as matrixDelta, _ as computeConvergence, b as computeGpsVsFusedDivergence, c as ConvergenceResult, d as GpsAccuracyResult, f as ResidualConsensusResult, g as TrackingQualityState, h as TrackingQualitySliceState, j as snapshotsTrimmed, k as selectTrackingQuality, l as CoverageResult, m as TrackingQualityReport, p as TrackingQualityOptions, s as AlignmentSnapshot, u as DEFAULT_TRACKING_QUALITY_OPTIONS, v as computeCoverage, w as degradedCountUpdated, x as computeResidualConsensus, y as computeGpsAccuracy } from "../create-slam-app-store-n_VF63D5.js";
|
|
2
|
+
export { AlignmentSnapshot, ConvergenceResult, CoverageResult, DEFAULT_TRACKING_QUALITY_OPTIONS, GpsAccuracyResult, ResidualConsensusResult, TrackingQualityOptions, TrackingQualityReport, TrackingQualitySliceState, TrackingQualityState, computeConvergence, computeCoverage, computeGpsAccuracy, computeGpsVsFusedDivergence, computeResidualConsensus, computeTrackingQualityReport, createTrackingQualityListenerMiddleware, degradedCountUpdated, matrixDelta, reportUpdated, resetTrackingQuality, selectRecentAlignments, selectTrackingQuality, snapshotPushed, snapshotsTrimmed, trackingQualityReducer };
|