Skip to content

Commit 686a100

Browse files
committed
Ongoing sim/server refactor
- Moved everything scenario-related to server; sim is now unaware of all that; Sim creation is now entirely driven by a new NewSimConfiguration struct that collects all of the individual things that it needs. - Cleaned up duplicate state in sim.Sim and sim.State - Client/server dance for Sim creation is better isolated, now handled via a (currently confusingly named) server.NewSimConfiguration struct that is passed between them.
1 parent bf6e151 commit 686a100

21 files changed

+502
-443
lines changed

launch.go

+21-18
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@ var (
3737
)
3838

3939
type NewSimConfiguration struct {
40-
sim.NewSimConfiguration
40+
server.NewSimConfiguration
41+
42+
TRACON map[string]*server.Configuration
43+
44+
DisplayError error
4145

42-
// Local use only; not sent to the server when we create one.
4346
lastRemoteSimsUpdate time.Time
4447
updateRemoteSimsCall *util.PendingCall
4548

@@ -57,7 +60,7 @@ func MakeNewSimConfiguration(mgr *server.ConnectionManager, defaultTRACON *strin
5760
selectedServer: mgr.LocalServer,
5861
defaultTRACON: defaultTRACON,
5962
tfrCache: tfrCache,
60-
NewSimConfiguration: sim.MakeNewSimConfiguration(),
63+
NewSimConfiguration: server.MakeNewSimConfiguration(),
6164
}
6265

6366
c.SetTRACON(*defaultTRACON)
@@ -110,7 +113,7 @@ func (c *NewSimConfiguration) SetTRACON(name string) {
110113

111114
func (c *NewSimConfiguration) SetScenario(groupName, scenarioName string) {
112115
var ok bool
113-
var groupConfig *sim.Configuration
116+
var groupConfig *server.Configuration
114117
if groupConfig, ok = c.TRACON[groupName]; !ok {
115118
c.lg.Errorf("%s: group not found in TRACON %s", groupName, c.TRACONName)
116119
groupName = util.SortedMapKeys(c.TRACON)[0]
@@ -129,11 +132,11 @@ func (c *NewSimConfiguration) SetScenario(groupName, scenarioName string) {
129132
}
130133

131134
func (c *NewSimConfiguration) UIButtonText() string {
132-
return util.Select(c.NewSimType == sim.NewSimJoinRemote, "Join", "Next")
135+
return util.Select(c.NewSimType == server.NewSimJoinRemote, "Join", "Next")
133136
}
134137

135138
func (c *NewSimConfiguration) ShowRatesWindow() bool {
136-
return c.NewSimType == sim.NewSimCreateLocal || c.NewSimType == sim.NewSimCreateRemote
139+
return c.NewSimType == server.NewSimCreateLocal || c.NewSimType == server.NewSimCreateRemote
137140
}
138141

139142
func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
@@ -164,8 +167,8 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
164167
origType := c.NewSimType
165168

166169
imgui.TableNextColumn()
167-
if imgui.RadioButtonInt("Create single-controller", &c.NewSimType, sim.NewSimCreateLocal) &&
168-
origType != sim.NewSimCreateLocal {
170+
if imgui.RadioButtonInt("Create single-controller", &c.NewSimType, server.NewSimCreateLocal) &&
171+
origType != server.NewSimCreateLocal {
169172
c.selectedServer = c.mgr.LocalServer
170173
c.SetTRACON(*c.defaultTRACON)
171174
c.DisplayError = nil
@@ -174,8 +177,8 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
174177
imgui.TableNextRow()
175178
imgui.TableNextColumn()
176179
imgui.TableNextColumn()
177-
if imgui.RadioButtonInt("Create multi-controller", &c.NewSimType, sim.NewSimCreateRemote) &&
178-
origType != sim.NewSimCreateRemote {
180+
if imgui.RadioButtonInt("Create multi-controller", &c.NewSimType, server.NewSimCreateRemote) &&
181+
origType != server.NewSimCreateRemote {
179182
c.selectedServer = c.mgr.RemoteServer
180183
c.SetTRACON(*c.defaultTRACON)
181184
c.DisplayError = nil
@@ -186,8 +189,8 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
186189
imgui.TableNextColumn()
187190

188191
uiStartDisable(len(c.mgr.RemoteServer.GetRunningSims()) == 0)
189-
if imgui.RadioButtonInt("Join multi-controller", &c.NewSimType, sim.NewSimJoinRemote) &&
190-
origType != sim.NewSimJoinRemote {
192+
if imgui.RadioButtonInt("Join multi-controller", &c.NewSimType, server.NewSimJoinRemote) &&
193+
origType != server.NewSimJoinRemote {
191194
c.selectedServer = c.mgr.RemoteServer
192195
c.DisplayError = nil
193196
}
@@ -200,11 +203,11 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
200203
imgui.Text("Unable to connect to the multi-controller vice server; " +
201204
"only single-player scenarios are available.")
202205
imgui.PopStyleColor()
203-
c.NewSimType = sim.NewSimCreateLocal
206+
c.NewSimType = server.NewSimCreateLocal
204207
}
205208
imgui.Separator()
206209

207-
if c.NewSimType == sim.NewSimCreateLocal || c.NewSimType == sim.NewSimCreateRemote {
210+
if c.NewSimType == server.NewSimCreateLocal || c.NewSimType == server.NewSimCreateRemote {
208211
flags := imgui.TableFlagsBordersV | imgui.TableFlagsBordersOuterH | imgui.TableFlagsRowBg |
209212
imgui.TableFlagsSizingStretchProp
210213
tableScale := util.Select(runtime.GOOS == "windows", p.DPIScale(), float32(1))
@@ -291,7 +294,7 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
291294
}
292295

293296
if imgui.BeginTableV("scenario", 2, 0, imgui.Vec2{tableScale * 500, 0}, 0.) {
294-
if c.NewSimType == sim.NewSimCreateRemote {
297+
if c.NewSimType == server.NewSimCreateRemote {
295298
imgui.TableNextRow()
296299
imgui.TableNextColumn()
297300
imgui.Text("Name:")
@@ -342,7 +345,7 @@ func (c *NewSimConfiguration) DrawUI(p platform.Platform) bool {
342345
}
343346
uiEndDisable(!validAirport)
344347

345-
if c.NewSimType == sim.NewSimCreateRemote {
348+
if c.NewSimType == server.NewSimCreateRemote {
346349
imgui.Checkbox("Require Password", &c.RequirePassword)
347350
if c.RequirePassword {
348351
imgui.InputTextV("Password", &c.Password, 0, nil)
@@ -585,7 +588,7 @@ func refreshWeather() {
585588
}
586589

587590
func (c *NewSimConfiguration) OkDisabled() bool {
588-
return c.NewSimType == sim.NewSimCreateRemote && (c.NewSimName == "" || (c.RequirePassword && c.Password == ""))
591+
return c.NewSimType == server.NewSimCreateRemote && (c.NewSimName == "" || (c.RequirePassword && c.Password == ""))
589592
}
590593

591594
func (c *NewSimConfiguration) Start() error {
@@ -993,7 +996,7 @@ func (lc *LaunchControlWindow) Draw(eventStream *sim.EventStream, p platform.Pla
993996
// imgui.SetCursorPos(imgui.Vec2{imgui.CursorPosX() + imgui.ContentRegionAvail().X - float32(3*width+10),
994997
imgui.SetCursorPos(imgui.Vec2{imgui.WindowWidth() - float32(7*width), imgui.CursorPosY()})
995998
if lc.controlClient != nil && lc.controlClient.Connected() {
996-
if lc.controlClient.SimIsPaused {
999+
if lc.controlClient.State.Paused {
9971000
if imgui.Button(renderer.FontAwesomeIconPlayCircle) {
9981001
lc.controlClient.ToggleSimPause()
9991002
}

main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func main() {
9292
if *lintScenarios {
9393
var e util.ErrorLogger
9494
scenarioGroups, _, _ :=
95-
sim.LoadScenarioGroups(true, *scenarioFilename, *videoMapFilename, &e, lg)
95+
server.LoadScenarioGroups(true, *scenarioFilename, *videoMapFilename, &e, lg)
9696

9797
videoMaps := make(map[string]interface{})
9898
for _, sgs := range scenarioGroups {

pkg/panes/stars/commands.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -1641,15 +1641,15 @@ func (sp *STARSPane) executeSTARSCommand(cmd string, ctx *panes.Context) (status
16411641
} else if len(cmd) > 0 {
16421642
// Index, character id, or name
16431643
if i, err := strconv.Atoi(cmd); err == nil {
1644-
if i < 0 || i >= len(ctx.ControlClient.RadarSites) {
1644+
if i < 0 || i >= len(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites) {
16451645
status.err = ErrSTARSIllegalValue
16461646
} else {
1647-
ps.RadarSiteSelected = util.SortedMapKeys(ctx.ControlClient.RadarSites)[i]
1647+
ps.RadarSiteSelected = util.SortedMapKeys(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites)[i]
16481648
status.clear = true
16491649
}
16501650
return
16511651
}
1652-
for id, rs := range ctx.ControlClient.RadarSites {
1652+
for id, rs := range ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites {
16531653
if cmd == rs.Char || cmd == id {
16541654
ps.RadarSiteSelected = id
16551655
status.clear = true
@@ -3842,7 +3842,7 @@ func (sp *STARSPane) consumeMouseEvents(ctx *panes.Context, ghosts []*av.GhostAi
38423842
state.IsSelected = !state.IsSelected
38433843
}
38443844
}
3845-
} else if !ctx.ControlClient.SimIsPaused {
3845+
} else if !ctx.ControlClient.State.Paused {
38463846
switch sp.currentPrefs().DwellMode {
38473847
case DwellModeOff:
38483848
sp.dwellAircraft = ""

pkg/panes/stars/datablock.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,7 @@ func (sp *STARSPane) getDatablockAlerts(ctx *panes.Context, ac *av.Aircraft, dbt
11971197
}
11981198

11991199
// Both FDB and PDB
1200-
if sp.radarMode(ctx.ControlClient.RadarSites) == RadarModeFused &&
1200+
if sp.radarMode(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites) == RadarModeFused &&
12011201
ac.TrackingController != "" && ac.PilotReportedAltitude == 0 &&
12021202
(ac.Mode != av.Altitude || ac.InhibitModeCAltitudeDisplay) {
12031203
// No altitude being reported, one way or another (off or mode

pkg/panes/stars/dcb.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,8 @@ func (sp *STARSPane) drawDCB(ctx *panes.Context, transforms ScopeTransformations
252252
}
253253
unsupportedButton(ctx, "MODE\nFSL", buttonFull, buttonScale)
254254

255-
site := sp.radarSiteId(ctx.ControlClient.RadarSites)
256-
if len(ctx.ControlClient.RadarSites) == 0 {
255+
site := sp.radarSiteId(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites)
256+
if len(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites) == 0 {
257257
disabledButton(ctx, "SITE\n"+site, maybeDisable(buttonFull), buttonScale)
258258
} else if selectButton(ctx, "SITE\n"+site, maybeDisable(buttonFull), buttonScale) {
259259
sp.activeDCBMenu = dcbMenuSite
@@ -443,11 +443,12 @@ func (sp *STARSPane) drawDCB(ctx *panes.Context, transforms ScopeTransformations
443443
}
444444

445445
if sp.activeDCBMenu == dcbMenuSite {
446-
rewindDCBCursor(3+len(ctx.ControlClient.RadarSites)+3, buttonScale)
446+
radarSites := ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites
447+
rewindDCBCursor(3+len(radarSites)+3, buttonScale)
447448
dcbStartCaptureMouseRegion()
448449

449-
for _, id := range util.SortedMapKeys(ctx.ControlClient.RadarSites) {
450-
site := ctx.ControlClient.RadarSites[id]
450+
for _, id := range util.SortedMapKeys(radarSites) {
451+
site := radarSites[id]
451452
label := " " + site.Char + " " + "\n" + id
452453
selected := ps.RadarSiteSelected == id
453454
if toggleButton(ctx, label, &selected, buttonFull, buttonScale) {
@@ -458,15 +459,15 @@ func (sp *STARSPane) drawDCB(ctx *panes.Context, transforms ScopeTransformations
458459
}
459460
}
460461
}
461-
multi := sp.radarMode(ctx.ControlClient.RadarSites) == RadarModeMulti
462+
multi := sp.radarMode(radarSites) == RadarModeMulti
462463
if toggleButton(ctx, "MULTI", &multi, buttonFull, buttonScale) && multi {
463464
ps.RadarSiteSelected = ""
464465
if ps.FusedRadarMode {
465466
sp.discardTracks = true
466467
}
467468
ps.FusedRadarMode = false
468469
}
469-
fused := sp.radarMode(ctx.ControlClient.RadarSites) == RadarModeFused
470+
fused := sp.radarMode(radarSites) == RadarModeFused
470471
if toggleButton(ctx, "FUSED", &fused, buttonFull, buttonScale) && fused {
471472
ps.RadarSiteSelected = ""
472473
ps.FusedRadarMode = true

pkg/panes/stars/lists.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ func (sp *STARSPane) drawSSAList(ctx *panes.Context, pw [2]float32, aircraft []*
265265
}
266266
}
267267
if filter.All || filter.Radar {
268-
pw = td.AddText(sp.radarSiteId(ctx.ControlClient.RadarSites), pw, listStyle)
268+
pw = td.AddText(sp.radarSiteId(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites), pw, listStyle)
269269
}
270270
newline()
271271
}

pkg/panes/stars/prefs.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,8 @@ func (p *Preferences) Reset(ss sim.State, sp *STARSPane) {
306306

307307
// Make the scenario's default video maps visible
308308
p.VideoMapVisible = make(map[int]interface{})
309-
_, defaultVideoMaps := ss.GetControllerVideoMaps()
310-
for _, dm := range defaultVideoMaps {
309+
310+
for _, dm := range ss.ControllerDefaultVideoMaps {
311311
if idx := slices.IndexFunc(sp.allVideoMaps, func(v av.VideoMap) bool { return v.Name == dm }); idx != -1 {
312312
p.VideoMapVisible[sp.allVideoMaps[idx].Id] = nil
313313
} else {

pkg/panes/stars/stars.go

+9-24
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,6 @@ type STARSPane struct {
221221
overflights map[string]map[int]bool // group->index
222222
airspace map[string]map[string]bool // ctrl -> volume name
223223
}
224-
225-
mapLibrary *av.VideoMapLibrary // just cached per session; not saved to disk.
226224
}
227225

228226
type PointOutControllers struct {
@@ -462,8 +460,6 @@ func (sp *STARSPane) ResetSim(client *server.ControlClient, ss sim.State, pl pla
462460
clear(sp.scopeDraw.departures)
463461
clear(sp.scopeDraw.overflights)
464462
clear(sp.scopeDraw.airspace)
465-
466-
sp.mapLibrary = nil
467463
}
468464

469465
func (sp *STARSPane) makeMaps(client *server.ControlClient, ss sim.State, lg *log.Logger) {
@@ -490,9 +486,8 @@ func (sp *STARSPane) makeMaps(client *server.ControlClient, ss sim.State, lg *lo
490486
}
491487

492488
// First grab the video maps needed for the DCB
493-
ctrlMaps, _ := ss.GetControllerVideoMaps()
494489
sp.allVideoMaps = util.FilterSlice(vmf.Maps, func(vm av.VideoMap) bool {
495-
return slices.Contains(ctrlMaps, vm.Name)
490+
return slices.Contains(ss.ControllerVideoMaps, vm.Name)
496491
})
497492
for _, vm := range sp.allVideoMaps {
498493
usedIds[vm.Id] = nil
@@ -564,15 +559,15 @@ func (sp *STARSPane) makeMaps(client *server.ControlClient, ss sim.State, lg *lo
564559

565560
// Radar maps
566561
radarIndex := 801
567-
for _, name := range util.SortedMapKeys(ss.RadarSites) {
562+
for _, name := range util.SortedMapKeys(ss.STARSFacilityAdaptation.RadarSites) {
568563
sm := av.VideoMap{
569564
Label: name + "RCM",
570565
Name: name + " RADAR COVERAGE MAP",
571566
Id: radarIndex,
572567
Category: VideoMapProcessingAreas,
573568
}
574569

575-
site := ss.RadarSites[name]
570+
site := ss.STARSFacilityAdaptation.RadarSites[name]
576571
ld := renderer.GetLinesDrawBuilder()
577572
ld.AddLatLongCircle(site.Position, ss.NmPerLongitude, float32(site.PrimaryRange), 360)
578573
ld.AddLatLongCircle(site.Position, ss.NmPerLongitude, float32(site.SecondaryRange), 360)
@@ -612,7 +607,7 @@ func (sp *STARSPane) makeMaps(client *server.ControlClient, ss sim.State, lg *lo
612607

613608
// Start with the video maps associated with the Sim.
614609
sp.dcbVideoMaps = nil
615-
for _, name := range ctrlMaps {
610+
for _, name := range ss.ControllerVideoMaps {
616611
if idx := slices.IndexFunc(sp.allVideoMaps, func(v av.VideoMap) bool { return v.Name == name }); idx != -1 && name != "" {
617612
sp.dcbVideoMaps = append(sp.dcbVideoMaps, &sp.allVideoMaps[idx])
618613
} else {
@@ -622,21 +617,11 @@ func (sp *STARSPane) makeMaps(client *server.ControlClient, ss sim.State, lg *lo
622617
}
623618

624619
func (sp *STARSPane) getVideoMapLibrary(ss sim.State, client *server.ControlClient) (*av.VideoMapLibrary, error) {
625-
if sp.mapLibrary != nil {
626-
return sp.mapLibrary, nil
627-
}
628-
629620
filename := ss.STARSFacilityAdaptation.VideoMapFile
630-
ml, err := av.HashCheckLoadVideoMap(filename, ss.VideoMapLibraryHash)
631-
if err == nil {
632-
sp.mapLibrary = ml
621+
if ml, err := av.HashCheckLoadVideoMap(filename, ss.VideoMapLibraryHash); err == nil {
633622
return ml, nil
634623
} else {
635-
ml, err = client.GetVideoMapLibrary(filename)
636-
if err == nil {
637-
sp.mapLibrary = ml
638-
}
639-
return ml, err
624+
return client.GetVideoMapLibrary(filename)
640625
}
641626
}
642627

@@ -1214,7 +1199,7 @@ func (sp *STARSPane) radarMode(radarSites map[string]*av.RadarSite) int {
12141199
func (sp *STARSPane) visibleAircraft(ctx *panes.Context) []*av.Aircraft {
12151200
var aircraft []*av.Aircraft
12161201
ps := sp.currentPrefs()
1217-
single := sp.radarMode(ctx.ControlClient.RadarSites) == RadarModeSingle
1202+
single := sp.radarMode(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites) == RadarModeSingle
12181203
now := ctx.ControlClient.SimTime
12191204
for callsign, state := range sp.Aircraft {
12201205
ac, ok := ctx.ControlClient.Aircraft[callsign]
@@ -1229,7 +1214,7 @@ func (sp *STARSPane) visibleAircraft(ctx *panes.Context) []*av.Aircraft {
12291214

12301215
visible := false
12311216

1232-
if sp.radarMode(ctx.ControlClient.RadarSites) == RadarModeFused {
1217+
if sp.radarMode(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites) == RadarModeFused {
12331218
// visible unless if it's almost on the ground
12341219
alt := float32(state.TrackAltitude())
12351220
if ctx.ControlClient.IsDeparture(ac) &&
@@ -1244,7 +1229,7 @@ func (sp *STARSPane) visibleAircraft(ctx *panes.Context) []*av.Aircraft {
12441229
visible = true
12451230
} else {
12461231
// Otherwise see if any of the radars can see it
1247-
for id, site := range ctx.ControlClient.RadarSites {
1232+
for id, site := range ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites {
12481233
if single && ps.RadarSiteSelected != id {
12491234
continue
12501235
}

pkg/panes/stars/track.go

+5-4
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ func (sp *STARSPane) updateMSAWs(ctx *panes.Context) {
463463
func (sp *STARSPane) updateRadarTracks(ctx *panes.Context) {
464464
// FIXME: all aircraft radar tracks are updated at the same time.
465465
now := ctx.ControlClient.SimTime
466-
if sp.radarMode(ctx.ControlClient.RadarSites) == RadarModeFused {
466+
if sp.radarMode(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites) == RadarModeFused {
467467
if now.Sub(sp.lastTrackUpdate) < 1*time.Second {
468468
return
469469
}
@@ -733,9 +733,9 @@ func (sp *STARSPane) drawRadarTrack(ac *av.Aircraft, state *AircraftState, headi
733733

734734
primaryTargetBrightness := ps.Brightness.PrimarySymbols
735735
if primaryTargetBrightness > 0 {
736-
switch mode := sp.radarMode(ctx.ControlClient.RadarSites); mode {
736+
switch mode := sp.radarMode(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites); mode {
737737
case RadarModeSingle:
738-
site := ctx.ControlClient.RadarSites[ps.RadarSiteSelected]
738+
site := ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites[ps.RadarSiteSelected]
739739
primary, secondary, dist := site.CheckVisibility(pos, state.TrackAltitude())
740740

741741
// Orient the box toward the radar
@@ -772,7 +772,8 @@ func (sp *STARSPane) drawRadarTrack(ac *av.Aircraft, state *AircraftState, headi
772772
ld.AddLine(line[0], line[1], primaryTargetBrightness.ScaleRGB(renderer.RGB{R: .1, G: .8, B: .1}))
773773

774774
case RadarModeMulti:
775-
primary, secondary, _ := sp.radarVisibility(ctx.ControlClient.RadarSites, pos, state.TrackAltitude())
775+
primary, secondary, _ := sp.radarVisibility(ctx.ControlClient.State.STARSFacilityAdaptation.RadarSites,
776+
pos, state.TrackAltitude())
776777
rot := math.Rotator2f(heading)
777778

778779
// blue box: x +/-9 pixels, y +/-3 pixels

0 commit comments

Comments
 (0)