FERS 0.1.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
TimingInspector.tsx
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 DeleteIcon from '@mui/icons-material/Delete';
5import { Box, Button, IconButton } from '@mui/material';
6import { Timing, useScenarioStore } from '@/stores/scenarioStore';
7import { BufferedTextField, NumberField, Section } from './InspectorControls';
8
9interface TimingInspectorProps {
10 item: Timing;
11}
12
13export function TimingInspector({ item }: TimingInspectorProps) {
14 const { updateItem, addNoiseEntry, removeNoiseEntry } =
15 useScenarioStore.getState();
16 const handleChange = (path: string, value: unknown) =>
17 updateItem(item.id, path, value);
18
19 return (
20 <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
21 <BufferedTextField
22 label="Name"
23 variant="outlined"
24 size="small"
25 fullWidth
26 value={item.name}
27 allowEmpty={false}
28 onChange={(v) => handleChange('name', v)}
29 />
30 <NumberField
31 label="Frequency (Hz)"
32 value={item.frequency}
33 emptyBehavior="revert"
34 onChange={(v) => handleChange('frequency', v)}
35 />
36 <NumberField
37 label="Frequency Offset (Hz)"
38 value={item.freqOffset}
39 emptyBehavior="null"
40 onChange={(v) => handleChange('freqOffset', v)}
41 />
42 <NumberField
43 label="Random Freq. Offset Stdev (Hz)"
44 value={item.randomFreqOffsetStdev}
45 emptyBehavior="null"
46 onChange={(v) => handleChange('randomFreqOffsetStdev', v)}
47 />
48 <NumberField
49 label="Phase Offset (rad)"
50 value={item.phaseOffset}
51 emptyBehavior="null"
52 onChange={(v) => handleChange('phaseOffset', v)}
53 />
54 <NumberField
55 label="Random Phase Offset Stdev (rad)"
56 value={item.randomPhaseOffsetStdev}
57 emptyBehavior="null"
58 onChange={(v) => handleChange('randomPhaseOffsetStdev', v)}
59 />
60 <Section title="Noise Entries">
61 {item.noiseEntries.map((entry, index) => (
62 <Box
63 key={entry.id}
64 sx={{
65 display: 'flex',
66 alignItems: 'center',
67 gap: 1,
68 p: 1,
69 border: 1,
70 borderColor: 'divider',
71 borderRadius: 1,
72 }}
73 >
74 <Box sx={{ flexGrow: 1, display: 'flex', gap: 1 }}>
75 <NumberField
76 label="Alpha"
77 value={entry.alpha}
78 emptyBehavior="revert"
79 onChange={(v) =>
80 handleChange(
81 `noiseEntries.${index}.alpha`,
82 v
83 )
84 }
85 />
86 <NumberField
87 label="Weight"
88 value={entry.weight}
89 emptyBehavior="revert"
90 onChange={(v) =>
91 handleChange(
92 `noiseEntries.${index}.weight`,
93 v
94 )
95 }
96 />
97 </Box>
98 <IconButton
99 size="small"
100 onClick={() => removeNoiseEntry(item.id, entry.id)}
101 >
102 <DeleteIcon fontSize="small" />
103 </IconButton>
104 </Box>
105 ))}
106 <Button onClick={() => addNoiseEntry(item.id)} size="small">
107 Add Noise Entry
108 </Button>
109 </Section>
110 </Box>
111 );
112}