-
Notifications
You must be signed in to change notification settings - Fork 0
/
MissionMenu.ts
112 lines (86 loc) · 3.54 KB
/
MissionMenu.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
class MissionMenu {
private readonly missions: IMission[];
private readonly missionHandlers: IMissionHandler[];
private selectedMissionIndex: number;
constructor() {
this.missions = [];
this.missionHandlers = [];
this.selectedMissionIndex = -1;
}
public addMission(mission: IMission): void {
this.missions.push(mission);
if (this.missions.length === 1) {
this.selectedMissionIndex = 0;
}
this.updateDisplay();
}
public defineMissionHandler(missionId: number, missionHandler: () => void): void {
const missionHandlerItem: IMissionHandler = {
id: missionId,
handler: missionHandler
};
this.missionHandlers.push(missionHandlerItem);
}
public clearAllMissions(): void {
this.missions.splice(0, this.missions.length);
this.missionHandlers.splice(0, this.missionHandlers.length);
brick.clearScreen();
}
public runSelectedMission(): void {
if (this.missionMenuIndexIsValid(this.selectedMissionIndex)) {
const selectedMission = this.missions[this.selectedMissionIndex];
const selectedMissionHandler = this.findMissionHandler(selectedMission.id);
selectedMission.isRunning = true;
this.updateDisplay();
if (selectedMissionHandler) {
motors.stopAll();
motors.resetAll();
selectedMissionHandler.handler();
}
selectedMission.isRunning = false;
this.updateDisplay();
this.selectNextMission();
this.updateDisplay();
}
}
public selectPreviousMission(): void {
if (this.missionMenuIndexIsValid(this.selectedMissionIndex)) {
this.selectedMissionIndex = this.selectedMissionIndex === 0 ? this.missions.length - 1 : this.selectedMissionIndex - 1;
}
this.updateDisplay();
}
public selectNextMission(): void {
if (this.missionMenuIndexIsValid(this.selectedMissionIndex)) {
this.selectedMissionIndex = (this.selectedMissionIndex + 1) % this.missions.length;
}
this.updateDisplay();
}
private findMissionHandler(missionId: number): IMissionHandler | undefined {
if (this.missionHandlers.length > 0) {
for (let missionHandlerIndex = 0; missionHandlerIndex < this.missionHandlers.length; missionHandlerIndex++) {
if (this.missionHandlers[missionHandlerIndex].id === missionId) {
return this.missionHandlers[missionHandlerIndex];
}
}
}
return undefined;
}
private updateDisplay(): void {
for (let missionMenuIndex = 0; missionMenuIndex < this.missions.length; missionMenuIndex++) {
brick.showString(this.getMissionMenuItemPrefix(missionMenuIndex) + this.missions[missionMenuIndex].displayName, missionMenuIndex + 1);
}
}
private getMissionMenuItemPrefix(missionMenuIndex: number): string {
let prefix = ' ';
if (this.missionMenuIndexIsValid(missionMenuIndex)) {
const mission = this.missions[missionMenuIndex];
if (missionMenuIndex === this.selectedMissionIndex) {
prefix = mission.isRunning ? '>*' : '> ';
}
}
return prefix;
}
private missionMenuIndexIsValid(missionMenuIndex: number): boolean {
return this.missions.length > 0 && missionMenuIndex >= 0 && missionMenuIndex < this.missions.length;
}
}