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