diff --git a/plugins/xgrids-k1/frontend/src/sensors/K1Detail.tsx b/plugins/xgrids-k1/frontend/src/sensors/K1Detail.tsx
index 274dcb1..7104d08 100644
--- a/plugins/xgrids-k1/frontend/src/sensors/K1Detail.tsx
+++ b/plugins/xgrids-k1/frontend/src/sensors/K1Detail.tsx
@@ -1,3 +1,6 @@
+import {K1AcquisitionFields} from '../components/K1AcquisitionFields';
+import {SUPPORTED_MOUNT_TYPE,SUPPORTED_GNSS_MODE,type MountType,type GnssMode} from '../configuration';
+import {validateProjectName} from '../projectName';
import {K1SpatialSession, k1SpatialPhasePresentation} from '../components/K1SpatialSession';
import {deviceTelemetry} from '../spatialSessionModel';
import type {AcquisitionState} from '../spatialSessionModel';
@@ -9,11 +12,12 @@ import type {RerunHostFactory} from '@mission-core/sensor-sdk';
import {K1SceneWindows,type SceneTool} from './K1SceneWindows';
import {useK1SceneSettings} from './useK1SceneSettings';
import {k1ConnectionNotice,k1ManualState,k1Status} from './presentation';
-import {pendingPreview} from './useK1Preview';
-export function K1Detail({device,transport,enabled,back,refresh,failure,createRerunHost}:{device:Sensor;transport:SensorTransport;enabled:boolean;back:()=>void;refresh:()=>Promise
;failure:(error:unknown)=>void;createRerunHost?:RerunHostFactory}){
+export function K1Detail({device,transport,enabled,back,refresh,failure,createRerunHost,reconnect}:{device:Sensor;transport:SensorTransport;enabled:boolean;back:()=>void;refresh:()=>Promise;failure:(error:unknown)=>void;createRerunHost?:RerunHostFactory;reconnect?:()=>void}){
const [busy,setBusy]=useState(''),[tool,setTool]=useState(null),[operationError,setOperationError]=useState('');
- const [preview,setPreview]=useState(pendingPreview);
+ const [projectName,setProjectName]=useState(''),[projectNameTouched,setProjectNameTouched]=useState(false);
+ const [mountType,setMountType]=useState(SUPPORTED_MOUNT_TYPE),[gnssMode,setGnssMode]=useState(SUPPORTED_GNSS_MODE);
+ const project=validateProjectName(projectName);
const [sceneOpen,setSceneOpen]=useState(['preparing','starting','streaming','stopping'].includes(device.snapshot.acquisition));
const acquisitionId=device.control?.acquisition_id;
useEffect(()=>{if(acquisitionId&&['preparing','starting','streaming','stopping'].includes(device.snapshot.acquisition))setSceneOpen(true);},[acquisitionId]);
@@ -25,10 +29,10 @@ export function K1Detail({device,transport,enabled,back,refresh,failure,createRe
const pending=busy||(['preparing','starting'].includes(device.snapshot.acquisition)?'start':device.snapshot.acquisition==='stopping'?'stop':'');
async function act(action:'start'|'stop'|'verify'){
if(running.current||!enabled)return;
- if(action==='start')setSceneOpen(true);
+ if(action==='start'){setProjectNameTouched(true);if(project.error)return;setSceneOpen(true);}
running.current=true;setBusy(action);failedAction.current='';setOperationError('');failure(null);
- try{await perform(transport,device,action,action==='verify'?{}:{operator_confirmed:true,control_generation:device.control?.generation,acquisition_id:device.control?.acquisition_id??null});await refresh();}
- catch{failedAction.current=action;setOperationError(action==='start'?'Результат запуска пока не подтверждён.':action==='stop'?'Результат остановки пока не подтверждён.':'Не удалось подтвердить связь с K1.');await refresh().catch(()=>{});}
+ try{await perform(transport,device,action,action==='verify'?{}:{operator_confirmed:true,control_generation:device.control?.generation,acquisition_id:device.control?.acquisition_id??null,...(action==='start'?{project_name:project.value,mount_type:mountType,gnss_mode:gnssMode}:{})});await refresh();}
+ catch{failedAction.current=action;setOperationError(action==='start'?'Результат запуска пока не подтверждён.':action==='stop'?'Результат остановки пока не подтверждён.':'Не удалось подтвердить связь с K1. Проверьте питание сканера; если связь не восстановится, откройте подключение устройства и найдите K1 заново.');await refresh().catch(()=>{});}
finally{running.current=false;setBusy('');}
}
const confirmed=(failedAction.current==='start'&&streaming)||(failedAction.current==='stop'&&device.control?.phase==='completed')||(failedAction.current==='verify'&&manual.connected);
@@ -42,15 +46,19 @@ export function K1Detail({device,transport,enabled,back,refresh,failure,createRe
К устройствам {status.label}
setTool('display')}> }>
- {manual.connected&&(!manual.showStop||pending==='start')&&}
+ {manual.connected&&(!manual.showStop||pending==='start')&& :undefined} onClick={()=>void act('start')}>{pending==='start'?'Запускаем устройство':'Инициировать запуск'} }
{manual.showStop&&pending!=='start'&& :undefined} onClick={()=>void act('stop')}>{pending==='stop'?'Останавливаем устройство':'Остановить устройство'}}
{!manual.connected&&device.control?.can_verify&& :undefined} onClick={()=>void act('verify')}>Проверить состояние K1}
+ {!manual.connected&&{summary}
}
+ {!manual.connected&&reconnect&&!manual.active&&Подключить устройство }
+ {manual.connected&&!confirmed&&operationError&&{operationError}
}
- {streaming?`${summary}. ${preview.lidar}. ${preview.camera}.`:summary}
{manual.connected&&setTool(null)} scene={scene} connected={enabled}/>}
{!sceneOpen&&manual.showStop&&setSceneOpen(true)}>Открыть пространственную сцену }
- {sceneOpen&&createRerunHost&&setSceneOpen(false)} sessionControls={sessionControls}/>}
+ {sceneOpen&&createRerunHost&&setSceneOpen(false)} sessionControls={sessionControls}/>}
;
}
diff --git a/plugins/xgrids-k1/frontend/src/sensors/K1LiveView.tsx b/plugins/xgrids-k1/frontend/src/sensors/K1LiveView.tsx
index bd7f71b..b329f43 100644
--- a/plugins/xgrids-k1/frontend/src/sensors/K1LiveView.tsx
+++ b/plugins/xgrids-k1/frontend/src/sensors/K1LiveView.tsx
@@ -6,11 +6,10 @@ import type { Sensor, SensorTransport } from './runtime';
import type { K1SceneState, SceneTool } from './K1SceneWindows';
import { useK1Preview, pendingPreview, type PreviewStatus } from './useK1Preview';
import './livePreview.css';
-export function K1LiveView({ device, transport, createRerunHost, onStatus, enabled, scene, openTool, close, sessionControls }: {
+export function K1LiveView({ device, transport, createRerunHost, enabled, scene, openTool, close, sessionControls }: {
device: Sensor;
transport: SensorTransport;
createRerunHost: RerunHostFactory;
- onStatus: (value: PreviewStatus) => void;
enabled: boolean;
scene: K1SceneState;
openTool: (tool: SceneTool) => void;
@@ -22,7 +21,7 @@ export function K1LiveView({ device, transport, createRerunHost, onStatus, enabl
const [visible, setVisible] = useState(() => new Set(['lidar', 'camera']));
const [generation, setGeneration] = useState(0), [status, setStatus] = useState