Skip to content

Commit 3150eee

Browse files
committed
refactor(core): ♻️ extract scenarios to modules and use ScenarioManager
- move ScenarioData and SCENARIOS out of scenario-selection and into scenario-manager-backed modules (scenario1/2/3.ts) - update ScenarioManager to import scenario modules and return scenario-specific settings - update ScenarioSelectionPage to import ScenarioData and SCENARIOS from scenario-manager - minor UI tidy: set BasePage.show() to use flex layout and remove EOF newline in CSS
1 parent 99bea88 commit 3150eee

7 files changed

Lines changed: 149 additions & 127 deletions

File tree

src/pages/base-page.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export abstract class BasePage extends BaseElement {
44
abstract id: string;
55

66
show(): void {
7-
this.dom_.style.display = 'block';
7+
this.dom_.style.display = 'flex';
88
}
99

1010
hide(): void {

src/pages/scenario-selection.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,4 +354,4 @@
354354
.scenario-actions {
355355
flex-direction: column;
356356
}
357-
}
357+
}

src/pages/scenario-selection.ts

Lines changed: 1 addition & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,10 @@
11
import { qs, qsa } from "@app/engine/utils/query-selector";
22
import { Router } from "@app/router";
3+
import { ScenarioData, SCENARIOS } from "@app/scenario-manager";
34
import { html } from "../engine/utils/development/formatter";
45
import { BasePage } from "./base-page";
56
import "./scenario-selection.css";
67

7-
interface ScenarioData {
8-
id: string;
9-
number: number;
10-
title: string;
11-
subtitle: string;
12-
duration: string;
13-
difficulty: 'beginner' | 'intermediate' | 'advanced';
14-
missionType: string;
15-
description: string;
16-
equipment: string[];
17-
}
18-
19-
const SCENARIOS: ScenarioData[] = [
20-
{
21-
id: 'scenario1',
22-
number: 1,
23-
title: '"First Light"',
24-
subtitle: 'HELIOS-7 Initial Contact',
25-
duration: '25-30 min',
26-
difficulty: 'beginner',
27-
missionType: 'Commercial Communications',
28-
description: `You are a Ground Station Operator at Pacific Rim Communications facility in Guam. Your company has just launched HELIOS-7, a new C-band communications satellite. The satellite is now station-keeping at 145°E geostationary orbit. You will conduct the first ground station link test - a critical milestone before commercial operations begin.`,
29-
equipment: [
30-
'9-meter C-band Antenna',
31-
'RF Front End',
32-
'2× Spectrum Analyzers',
33-
],
34-
},
35-
{
36-
id: 'scenario2',
37-
number: 2,
38-
title: '"Signal Hunt"',
39-
subtitle: 'Deep Space Tracking Exercise',
40-
duration: '35-40 min',
41-
difficulty: 'intermediate',
42-
missionType: 'Deep Space Operations',
43-
description: `Track and analyze signals from a deep space probe passing through the outer solar system. You'll need to compensate for Doppler shift, manage antenna pointing, and maintain signal lock despite challenging signal conditions and atmospheric interference.`,
44-
equipment: [
45-
'9-meter C-band Antenna',
46-
'RF Front End',
47-
'2× Spectrum Analyzers',
48-
'Receiver',
49-
],
50-
},
51-
{
52-
id: 'scenario3',
53-
number: 3,
54-
title: '"Full Stack"',
55-
subtitle: 'Complete Link Budget Analysis',
56-
duration: '45-60 min',
57-
difficulty: 'advanced',
58-
missionType: 'Research & Development',
59-
description: `Conduct a comprehensive RF link analysis using the complete ground station suite. You'll establish both uplink and downlink connections, analyze signal quality, measure system performance parameters, and optimize the complete communications chain from transmitter to receiver.`,
60-
equipment: [
61-
'2× 9-meter C-band Antennas',
62-
'2× RF Front Ends',
63-
'4× Spectrum Analyzers',
64-
'Transmitter',
65-
'Receiver',
66-
],
67-
},
68-
];
69-
708
/**
719
* Scenario selection page implementation
7210
*/

src/scenario-manager.ts

Lines changed: 23 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { html } from "./engine/utils/development/formatter";
1+
import { scenario1Data } from './scenarios/scenario1';
2+
import { scenario2Data } from "./scenarios/scenario2";
3+
import { scenario3Data } from './scenarios/scenario3';
24

35
export interface SimulationSettings {
46
isSync: boolean;
@@ -39,73 +41,32 @@ export class ScenarioManager {
3941
static getScenarioSettings(scenarioId: string): SimulationSettings {
4042
switch (scenarioId) {
4143
case 'scenario1':
42-
return {
43-
isSync: false,
44-
antennas: 1,
45-
rfFrontEnds: 1,
46-
spectrumAnalyzers: 2,
47-
transmitters: 0,
48-
receivers: 0,
49-
};
44+
return SCENARIOS[0].settings;
5045
case 'scenario2':
51-
return {
52-
isSync: false,
53-
antennas: 1,
54-
rfFrontEnds: 1,
55-
spectrumAnalyzers: 2,
56-
transmitters: 0,
57-
receivers: 1,
58-
};
46+
return SCENARIOS[1].settings;
5947
case 'scenario3':
60-
return {
61-
isSync: false,
62-
antennas: 1,
63-
rfFrontEnds: 1,
64-
spectrumAnalyzers: 2,
65-
transmitters: 1,
66-
receivers: 1,
67-
layout: scenario3Layout,
68-
};
48+
return SCENARIOS[2].settings;
6949
default:
7050
return this.getDefaultSettings();
7151
}
7252
}
7353
}
7454

75-
const scenario3Layout = html`
76-
<div class="student-equipment">
77-
<!-- Antennas, Front Ends, and Spec Analyzers Grid -->
78-
<div id="antenna-spec-a-grid1" class="antenna-spec-a-grid">
79-
<div class="paired-equipment-container">
80-
<div id="antenna1-container" class="antenna-container"></div>
81-
<div id="antenna2-container" class="antenna-container"></div>
82-
</div>
83-
<div class="paired-equipment-container">
84-
<div id="rf-front-end1-container" class="rf-front-end-container"></div>
85-
</div>
86-
<div class="paired-equipment-container">
87-
<div id="rf-front-end2-container" class="rf-front-end-container"></div>
88-
</div>
89-
<div class="paired-equipment-container">
90-
<div id="specA1-container" class="spec-a-container"></div>
91-
<div id="specA2-container" class="spec-a-container"></div>
92-
</div>
93-
</div>
94-
95-
<!-- Spectrum Analyzers Grid -->
96-
<div id="antenna-spec-a-grid2" class="antenna-spec-a-grid">
97-
<div class="paired-equipment-container">
98-
<div id="specA3-container" class="spec-a-container"></div>
99-
<div id="specA4-container" class="spec-a-container"></div>
100-
</div>
101-
</div>
55+
export interface ScenarioData {
56+
id: string;
57+
number: number;
58+
title: string;
59+
subtitle: string;
60+
duration: string;
61+
difficulty: 'beginner' | 'intermediate' | 'advanced';
62+
missionType: string;
63+
description: string;
64+
equipment: string[];
65+
settings: SimulationSettings;
66+
}
10267

103-
<!-- Transmitter And Receivers -->
104-
<div class="tx-grid">
105-
<div class="paired-equipment-container">
106-
<div id="tx1-container" class="tx-container"></div>
107-
<div id="rx1-container" class="rx-container"></div>
108-
</div>
109-
</div>
110-
</div>
111-
`;
68+
export const SCENARIOS: ScenarioData[] = [
69+
scenario1Data,
70+
scenario2Data,
71+
scenario3Data,
72+
];

src/scenarios/scenario1.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { ScenarioData } from '../scenario-manager';
2+
3+
/**
4+
* Scenario 1: "First Light" - HELIOS-7 Initial Contact
5+
*
6+
* A beginner-level scenario where the student conducts the first ground station
7+
* link test with a newly launched C-band communications satellite.
8+
*/
9+
10+
export const scenario1Data: ScenarioData = {
11+
id: 'scenario1',
12+
number: 1,
13+
title: '"First Light"',
14+
subtitle: 'HELIOS-7 Initial Contact',
15+
duration: '25-30 min',
16+
difficulty: 'beginner',
17+
missionType: 'Commercial Communications',
18+
description: `You are a Ground Station Operator at Pacific Rim Communications facility in Guam. Your company has just launched HELIOS-7, a new C-band communications satellite. The satellite is now station-keeping at 145°E geostationary orbit. You will conduct the first ground station link test - a critical milestone before commercial operations begin.`,
19+
equipment: [
20+
'9-meter C-band Antenna',
21+
'RF Front End',
22+
'2× Spectrum Analyzers',
23+
],
24+
settings: {
25+
isSync: false,
26+
antennas: 1,
27+
rfFrontEnds: 1,
28+
spectrumAnalyzers: 2,
29+
transmitters: 0,
30+
receivers: 0,
31+
}
32+
};

src/scenarios/scenario2.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { ScenarioData } from "../scenario-manager";
2+
3+
export const scenario2Data: ScenarioData = {
4+
id: 'scenario2',
5+
number: 2,
6+
title: '"Signal Hunt"',
7+
subtitle: 'Deep Space Tracking Exercise',
8+
duration: '35-40 min',
9+
difficulty: 'intermediate',
10+
missionType: 'Deep Space Operations',
11+
description: `Track and analyze signals from a deep space probe passing through the outer solar system. You'll need to compensate for Doppler shift, manage antenna pointing, and maintain signal lock despite challenging signal conditions and atmospheric interference.`,
12+
equipment: [
13+
'9-meter C-band Antenna',
14+
'RF Front End',
15+
'2× Spectrum Analyzers',
16+
'Receiver',
17+
],
18+
settings: {
19+
isSync: false,
20+
antennas: 1,
21+
rfFrontEnds: 1,
22+
spectrumAnalyzers: 2,
23+
transmitters: 0,
24+
receivers: 1,
25+
}
26+
};

src/scenarios/scenario3.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { html } from "@app/engine/utils/development/formatter";
2+
import { ScenarioData } from "../scenario-manager";
3+
4+
export const scenario3Data: ScenarioData = {
5+
id: 'scenario3',
6+
number: 3,
7+
title: '"Full Stack"',
8+
subtitle: 'Complete Link Budget Analysis',
9+
duration: '45-60 min',
10+
difficulty: 'advanced',
11+
missionType: 'Research & Development',
12+
description: `Conduct a comprehensive RF link analysis using the complete ground station suite. You'll establish both uplink and downlink connections, analyze signal quality, measure system performance parameters, and optimize the complete communications chain from transmitter to receiver.`,
13+
equipment: [
14+
'2× 9-meter C-band Antennas',
15+
'2× RF Front Ends',
16+
'4× Spectrum Analyzers',
17+
'Transmitter',
18+
'Receiver',
19+
],
20+
settings: {
21+
isSync: false,
22+
antennas: 1,
23+
rfFrontEnds: 1,
24+
spectrumAnalyzers: 2,
25+
transmitters: 1,
26+
receivers: 1,
27+
layout: html`
28+
<div class="student-equipment">
29+
<!-- Antennas, Front Ends, and Spec Analyzers Grid -->
30+
<div id="antenna-spec-a-grid1" class="antenna-spec-a-grid">
31+
<div class="paired-equipment-container">
32+
<div id="antenna1-container" class="antenna-container"></div>
33+
<div id="antenna2-container" class="antenna-container"></div>
34+
</div>
35+
<div class="paired-equipment-container">
36+
<div id="rf-front-end1-container" class="rf-front-end-container"></div>
37+
</div>
38+
<div class="paired-equipment-container">
39+
<div id="rf-front-end2-container" class="rf-front-end-container"></div>
40+
</div>
41+
<div class="paired-equipment-container">
42+
<div id="specA1-container" class="spec-a-container"></div>
43+
<div id="specA2-container" class="spec-a-container"></div>
44+
</div>
45+
</div>
46+
47+
<!-- Spectrum Analyzers Grid -->
48+
<div id="antenna-spec-a-grid2" class="antenna-spec-a-grid">
49+
<div class="paired-equipment-container">
50+
<div id="specA3-container" class="spec-a-container"></div>
51+
<div id="specA4-container" class="spec-a-container"></div>
52+
</div>
53+
</div>
54+
55+
<!-- Transmitter And Receivers -->
56+
<div class="tx-grid">
57+
<div class="paired-equipment-container">
58+
<div id="tx1-container" class="tx-container"></div>
59+
<div id="rx1-container" class="rx-container"></div>
60+
</div>
61+
</div>
62+
</div>
63+
`,
64+
}
65+
};

0 commit comments

Comments
 (0)