feat(k1): complete primary acquisition lifecycle

This commit is contained in:
DCCONSTRUCTIONS
2026-07-17 23:03:59 +03:00
parent 9d51080d2e
commit aa3680948f
66 changed files with 6093 additions and 544 deletions
@@ -40,7 +40,13 @@ function ModelCard({
);
}
export function DeviceWorkspace({ onOpenSpatialScene }: { onOpenSpatialScene: () => void }) {
export function DeviceWorkspace({
onOpenSpatialScene,
onActivateAutomaticSpatialSource,
}: {
onOpenSpatialScene: () => void;
onActivateAutomaticSpatialSource: () => void;
}) {
const {
registry,
selection,
@@ -115,7 +121,10 @@ export function DeviceWorkspace({ onOpenSpatialScene }: { onOpenSpatialScene: ()
</div>
<ConnectionView
model={selection.model}
host={{ openSpatialScene: onOpenSpatialScene }}
host={{
openSpatialScene: onOpenSpatialScene,
activateAutomaticSpatialSource: onActivateAutomaticSpatialSource,
}}
/>
</div>
);
@@ -1,4 +1,11 @@
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import {
useCallback,
useEffect,
useMemo,
useRef,
useState,
type ComponentType,
} from "react";
import {
Button,
GlassSurface,
@@ -21,6 +28,10 @@ import type {
RecordedCameraAdmissionState,
} from "../core/observation/recordedSessionAdmission";
import type { ObservationLayoutController } from "../core/observation/useObservationLayout";
import type {
DeviceModelDefinition,
DevicePluginConnectionProps,
} from "../core/device-plugins/contracts";
import type {
BackendStatus,
MissionRuntimeState,
@@ -98,6 +109,7 @@ export interface WorkspaceNavigation {
openSource: () => void;
openDisplay: () => void;
openLayers: () => void;
activateAutomaticSpatialSource: () => void;
}
export interface WorkspaceRendererProps {
@@ -113,6 +125,10 @@ export interface WorkspaceRendererProps {
onAccumulationCommit: () => void;
observationLayout: ObservationLayoutController;
navigation: WorkspaceNavigation;
spatialControls: {
View: ComponentType<DevicePluginConnectionProps>;
model: DeviceModelDefinition;
} | null;
}
function OverviewWorkspace({
@@ -271,6 +287,7 @@ function SpatialWorkspace({
onAccumulationCommit,
observationLayout,
navigation,
spatialControls,
}: WorkspaceRendererProps) {
const [viewerStatus, setViewerStatus] = useState<RerunViewportStatus>(sourceUrl ? "loading" : "idle");
const [viewerMessage, setViewerMessage] = useState("");
@@ -435,6 +452,18 @@ function SpatialWorkspace({
<EmptySpatialStage settings={sceneSettings} />
)}
{spatialControls && !recordedSource ? (
<div className="scene-device-controls">
<spatialControls.View
model={spatialControls.model}
host={{
openSpatialScene: () => navigation.openView("spatial-scene"),
activateAutomaticSpatialSource: navigation.activateAutomaticSpatialSource,
}}
/>
</div>
) : null}
{pointCloudFocused ? (
<button
type="button"