FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
AntennaInspector.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 {
5 Box,
6 FormControl,
7 InputLabel,
8 MenuItem,
9 Select,
10 TextField,
11} from '@mui/material';
12import { useScenarioStore, Antenna } from '@/stores/scenarioStore';
13import { FileInput, NumberField } from './InspectorControls';
14
15interface AntennaInspectorProps {
16 item: Antenna;
17}
18
19export function AntennaInspector({ item }: AntennaInspectorProps) {
20 const { updateItem, setAntennaPattern } = useScenarioStore.getState();
21 const handleChange = (path: string, value: unknown) =>
22 updateItem(item.id, path, value);
23
24 return (
25 <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
26 <TextField
27 label="Name"
28 variant="outlined"
29 size="small"
30 fullWidth
31 value={item.name}
32 onChange={(e) => handleChange('name', e.target.value)}
33 />
34 <FormControl fullWidth size="small">
35 <InputLabel>Pattern</InputLabel>
36 <Select
37 label="Pattern"
38 value={item.pattern}
39 onChange={(e) =>
40 setAntennaPattern(
41 item.id,
42 e.target.value as Antenna['pattern']
43 )
44 }
45 >
46 <MenuItem value="isotropic">Isotropic</MenuItem>
47 <MenuItem value="sinc">Sinc</MenuItem>
48 <MenuItem value="gaussian">Gaussian</MenuItem>
49 <MenuItem value="squarehorn">Square Horn</MenuItem>
50 <MenuItem value="parabolic">Parabolic</MenuItem>
51 <MenuItem value="xml">XML</MenuItem>
52 <MenuItem value="file">File (H5)</MenuItem>
53 </Select>
54 </FormControl>
55 <NumberField
56 label="Efficiency"
57 value={item.efficiency}
58 onChange={(v) => handleChange('efficiency', v)}
59 />
60 <NumberField
61 label="Mesh Scale Multiplier"
62 value={item.meshScale ?? null}
63 onChange={(v) => handleChange('meshScale', v)}
64 />
65
66 {item.pattern === 'sinc' && (
67 <>
68 <NumberField
69 label="Alpha"
70 value={item.alpha ?? null}
71 onChange={(v) => handleChange('alpha', v)}
72 />
73 <NumberField
74 label="Beta"
75 value={item.beta ?? null}
76 onChange={(v) => handleChange('beta', v)}
77 />
78 <NumberField
79 label="Gamma"
80 value={item.gamma ?? null}
81 onChange={(v) => handleChange('gamma', v)}
82 />
83 </>
84 )}
85 {item.pattern === 'gaussian' && (
86 <>
87 <NumberField
88 label="Azimuth Scale"
89 value={item.azscale ?? null}
90 onChange={(v) => handleChange('azscale', v)}
91 />
92 <NumberField
93 label="Elevation Scale"
94 value={item.elscale ?? null}
95 onChange={(v) => handleChange('elscale', v)}
96 />
97 </>
98 )}
99 {(item.pattern === 'squarehorn' ||
100 item.pattern === 'parabolic') && (
101 <>
102 <NumberField
103 label="Diameter (m)"
104 value={item.diameter ?? null}
105 onChange={(v) => handleChange('diameter', v)}
106 />
107 <NumberField
108 label="Design Frequency (Hz)"
109 value={item.design_frequency ?? null}
110 onChange={(v) => handleChange('design_frequency', v)}
111 />
112 </>
113 )}
114
115 {(item.pattern === 'xml' || item.pattern === 'file') && (
116 <FileInput
117 label="Pattern File"
118 value={item.filename}
119 onChange={(v) => handleChange('filename', v)}
120 filters={[
121 {
122 name: 'Antenna Pattern',
123 extensions:
124 item.pattern === 'xml' ? ['xml'] : ['h5'],
125 },
126 { name: 'All Files', extensions: ['*'] },
127 ]}
128 />
129 )}
130 </Box>
131 );
132}