FERS 1.0.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 { Box, TextField, Button, IconButton } from '@mui/material';
5import { useScenarioStore, Timing } from '@/stores/scenarioStore';
6import { NumberField, Section } from './InspectorControls';
7import DeleteIcon from '@mui/icons-material/Delete';
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 <TextField
22 label="Name"
23 variant="outlined"
24 size="small"
25 fullWidth
26 value={item.name}
27 onChange={(e) => handleChange('name', e.target.value)}
28 />
29 <NumberField
30 label="Frequency (Hz)"
31 value={item.frequency}
32 onChange={(v) => handleChange('frequency', v)}
33 />
34 <NumberField
35 label="Frequency Offset (Hz)"
36 value={item.freqOffset}
37 onChange={(v) => handleChange('freqOffset', v)}
38 />
39 <NumberField
40 label="Random Freq. Offset Stdev (Hz)"
41 value={item.randomFreqOffsetStdev}
42 onChange={(v) => handleChange('randomFreqOffsetStdev', v)}
43 />
44 <NumberField
45 label="Phase Offset (rad)"
46 value={item.phaseOffset}
47 onChange={(v) => handleChange('phaseOffset', v)}
48 />
49 <NumberField
50 label="Random Phase Offset Stdev (rad)"
51 value={item.randomPhaseOffsetStdev}
52 onChange={(v) => handleChange('randomPhaseOffsetStdev', v)}
53 />
54 <Section title="Noise Entries">
55 {item.noiseEntries.map((entry, index) => (
56 <Box
57 key={entry.id}
58 sx={{
59 display: 'flex',
60 alignItems: 'center',
61 gap: 1,
62 p: 1,
63 border: 1,
64 borderColor: 'divider',
65 borderRadius: 1,
66 }}
67 >
68 <Box sx={{ flexGrow: 1, display: 'flex', gap: 1 }}>
69 <NumberField
70 label="Alpha"
71 value={entry.alpha}
72 onChange={(v) =>
73 handleChange(
74 `noiseEntries.${index}.alpha`,
75 v
76 )
77 }
78 />
79 <NumberField
80 label="Weight"
81 value={entry.weight}
82 onChange={(v) =>
83 handleChange(
84 `noiseEntries.${index}.weight`,
85 v
86 )
87 }
88 />
89 </Box>
90 <IconButton
91 size="small"
92 onClick={() => removeNoiseEntry(item.id, entry.id)}
93 >
94 <DeleteIcon fontSize="small" />
95 </IconButton>
96 </Box>
97 ))}
98 <Button onClick={() => addNoiseEntry(item.id)} size="small">
99 Add Noise Entry
100 </Button>
101 </Section>
102 </Box>
103 );
104}