FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
simulationProgressStore.ts
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2025-present FERS Contributors (see AUTHORS.md).
3
4import { create } from 'zustand';
5
6export type SimulationProgressState = {
7 message: string;
8 current: number;
9 total: number;
10 details?: SimulationProgressDetail[];
11};
12
13export type SimulationProgressDetail = {
14 id: string;
15 message: string;
16 current: number;
17 total: number;
18};
19
20export type SimulationRunStatus = 'idle' | 'running' | 'completed' | 'failed';
21
22export type SimulationOutputChunkMetadata = {
23 chunk_index: number;
24 i_dataset: string;
25 q_dataset: string;
26 start_time: number;
27 sample_count: number;
28 sample_start: number;
29 sample_end_exclusive: number;
30};
31
32export type SimulationOutputCwSegmentMetadata = {
33 start_time: number;
34 end_time: number;
35 sample_count: number;
36 sample_start: number;
37 sample_end_exclusive: number;
38};
39
40export type SimulationOutputFileMetadata = {
41 receiver_id: number;
42 receiver_name: string;
43 mode: 'pulsed' | 'cw';
44 path: string;
45 total_samples: number;
46 sample_start: number;
47 sample_end_exclusive: number;
48 pulse_count: number;
49 min_pulse_length_samples: number;
50 max_pulse_length_samples: number;
51 uniform_pulse_length: boolean;
52 chunks: SimulationOutputChunkMetadata[];
53 cw_segments: SimulationOutputCwSegmentMetadata[];
54};
55
56export type SimulationOutputMetadata = {
57 schema_version: number;
58 simulation_name: string;
59 output_directory: string;
60 start_time: number;
61 end_time: number;
62 sampling_rate: number;
63 oversample_ratio: number;
64 files: SimulationOutputFileMetadata[];
65};
66
67type SimulationProgressStore = {
68 isSimulating: boolean;
69 isGeneratingKml: boolean;
70 simulationProgress: Record<string, SimulationProgressState>;
71 simulationRunStatus: SimulationRunStatus;
72 simulationRunError: string | null;
73 simulationOutputMetadata: SimulationOutputMetadata | null;
74
75 setIsSimulating: (isSimulating: boolean) => void;
76 setIsGeneratingKml: (isGeneratingKml: boolean) => void;
77 startSimulationRun: () => void;
78 setSimulationProgressSnapshot: (
79 progress: Record<string, SimulationProgressState>
80 ) => void;
81 setSimulationOutputMetadata: (
82 metadata: SimulationOutputMetadata | null
83 ) => void;
84 completeSimulationRun: () => void;
85 failSimulationRun: (errorMessage: string) => void;
86 clearSimulationProgress: () => void;
87};
88
89export const useSimulationProgressStore = create<SimulationProgressStore>()(
90 (set) => ({
91 isSimulating: false,
92 isGeneratingKml: false,
93 simulationProgress: {},
94 simulationRunStatus: 'idle',
95 simulationRunError: null,
96 simulationOutputMetadata: null,
97
98 setIsSimulating: (isSimulating) => set({ isSimulating }),
99 setIsGeneratingKml: (isGeneratingKml) => set({ isGeneratingKml }),
100 startSimulationRun: () =>
101 set({
102 isSimulating: true,
103 simulationProgress: {},
104 simulationRunStatus: 'running',
105 simulationRunError: null,
106 simulationOutputMetadata: null,
107 }),
108 setSimulationProgressSnapshot: (progress) =>
109 set({ simulationProgress: progress }),
110 setSimulationOutputMetadata: (metadata) =>
111 set({ simulationOutputMetadata: metadata }),
112 completeSimulationRun: () =>
113 set({
114 isSimulating: false,
115 simulationRunStatus: 'completed',
116 simulationRunError: null,
117 }),
118 failSimulationRun: (errorMessage) =>
119 set({
120 isSimulating: false,
121 simulationRunStatus: 'failed',
122 simulationRunError: errorMessage,
123 }),
124 clearSimulationProgress: () =>
125 set({
126 simulationProgress: {},
127 simulationRunStatus: 'idle',
128 simulationRunError: null,
129 simulationOutputMetadata: null,
130 }),
131 })
132);