FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
assetSlice.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 { StateCreator } from 'zustand';
5import { v4 as uuidv4 } from 'uuid';
6import { ScenarioStore, AssetActions, Antenna } from '../types';
7import { defaultWaveform, defaultTiming, defaultAntenna } from '../defaults';
8
9export const createAssetSlice: StateCreator<
10 ScenarioStore,
11 [['zustand/immer', never]],
12 [],
13 AssetActions
14> = (set) => ({
15 addWaveform: () =>
16 set((state) => {
17 const id = uuidv4();
18 state.waveforms.push({
19 ...defaultWaveform,
20 id,
21 name: `Waveform ${state.waveforms.length + 1}`,
22 });
23 state.isDirty = true;
24 }),
25 addTiming: () =>
26 set((state) => {
27 const id = uuidv4();
28 state.timings.push({
29 ...defaultTiming,
30 id,
31 name: `Timing ${state.timings.length + 1}`,
32 });
33 state.isDirty = true;
34 }),
35 addAntenna: () =>
36 set((state) => {
37 const id = uuidv4();
38 state.antennas.push({
39 ...defaultAntenna,
40 id,
41 name: `Antenna ${state.antennas.length + 1}`,
42 });
43 state.isDirty = true;
44 }),
45 addNoiseEntry: (timingId) =>
46 set((state) => {
47 const timing = state.timings.find((t) => t.id === timingId);
48 if (timing) {
49 timing.noiseEntries.push({
50 id: uuidv4(),
51 alpha: 0,
52 weight: 0,
53 });
54 state.isDirty = true;
55 }
56 }),
57 removeNoiseEntry: (timingId, entryId) =>
58 set((state) => {
59 const timing = state.timings.find((t) => t.id === timingId);
60 if (timing) {
61 const index = timing.noiseEntries.findIndex(
62 (e) => e.id === entryId
63 );
64 if (index > -1) {
65 timing.noiseEntries.splice(index, 1);
66 state.isDirty = true;
67 }
68 }
69 }),
70 setAntennaPattern: (antennaId, newPattern) =>
71 set((state) => {
72 const index = state.antennas.findIndex((a) => a.id === antennaId);
73 if (index === -1) return;
74
75 const oldAntenna = state.antennas[index];
76 const baseAntenna = {
77 id: oldAntenna.id,
78 type: oldAntenna.type,
79 name: oldAntenna.name,
80 efficiency: oldAntenna.efficiency,
81 meshScale: oldAntenna.meshScale,
82 design_frequency: oldAntenna.design_frequency,
83 };
84
85 let newAntennaState: Antenna;
86
87 switch (newPattern) {
88 case 'isotropic':
89 newAntennaState = {
90 ...baseAntenna,
91 pattern: 'isotropic',
92 };
93 break;
94 case 'sinc':
95 newAntennaState = {
96 ...baseAntenna,
97 pattern: 'sinc',
98 alpha: 1.0,
99 beta: 1.0,
100 gamma: 2.0,
101 };
102 break;
103 case 'gaussian':
104 newAntennaState = {
105 ...baseAntenna,
106 pattern: 'gaussian',
107 azscale: 1.0,
108 elscale: 1.0,
109 };
110 break;
111 case 'squarehorn':
112 case 'parabolic':
113 newAntennaState = {
114 ...baseAntenna,
115 pattern: newPattern,
116 diameter: 0.5,
117 };
118 break;
119 case 'xml':
120 case 'file':
121 newAntennaState = {
122 ...baseAntenna,
123 pattern: newPattern,
124 filename: '',
125 };
126 break;
127 }
128 state.antennas[index] = newAntennaState;
129 state.isDirty = true;
130 }),
131});