From 62a29a18a74cc61dcd5a4e3d432587e440376536 Mon Sep 17 00:00:00 2001 From: Jay <44783760+jschenke488@users.noreply.github.com> Date: Thu, 24 Oct 2024 04:25:52 -0500 Subject: [PATCH] Revert "Remove 2nd AP, fix AP channel setting, fix error with team wifi status" This reverts commit 7310a6daad6817aac1b57bb6c513a0ea111d9250. --- field/arena.go | 60 ++++++++++++++++------------ field/arena_notifiers.go | 10 +++-- model/event_settings.go | 13 ++++++- templates/setup_settings.html | 73 ++++++++++++++++++++++++++++++----- web/setup_settings.go | 13 ++++++- 5 files changed, 129 insertions(+), 40 deletions(-) diff --git a/field/arena.go b/field/arena.go index ec0a81aa..7d4a24ff 100755 --- a/field/arena.go +++ b/field/arena.go @@ -48,6 +48,7 @@ type Arena struct { Database *model.Database EventSettings *model.EventSettings accessPoint network.AccessPoint + accessPoint2 network.AccessPoint networkSwitch *network.Switch dnsMasq *network.DnsMasq Plc plc.Plc @@ -84,13 +85,12 @@ type Arena struct { } type AllianceStation struct { - DsConn *DriverStationConnection - Ethernet bool - Astop bool - Estop bool - Bypass bool - Team *model.Team - WifiStatus network.TeamWifiStatus + DsConn *DriverStationConnection + Ethernet bool + Astop bool + Estop bool + Bypass bool + Team *model.Team } // Creates the arena and sets it to its initial state. @@ -148,26 +148,24 @@ func (arena *Arena) LoadSettings() error { arena.EventSettings = settings // Initialize the components that depend on settings. - accessPointWifiStatuses := [6]*network.TeamWifiStatus{ - &arena.AllianceStations["R1"].WifiStatus, - &arena.AllianceStations["R2"].WifiStatus, - &arena.AllianceStations["R3"].WifiStatus, - &arena.AllianceStations["B1"].WifiStatus, - &arena.AllianceStations["B2"].WifiStatus, - &arena.AllianceStations["B3"].WifiStatus, - } - arena.accessPoint.SetSettings( - settings.ApAddress, - settings.ApPassword, - settings.ApChannel, - settings.NetworkSecurityEnabled, - accessPointWifiStatuses, - ) + arena.accessPoint.SetSettings(settings.ApAddress, settings.ApUsername, settings.ApPassword, + settings.ApTeamChannel, settings.ApAdminChannel, settings.ApAdminWpaKey, settings.NetworkSecurityEnabled) + arena.accessPoint2.SetSettings(settings.Ap2Address, settings.Ap2Username, settings.Ap2Password, + settings.Ap2TeamChannel, 0, "", settings.NetworkSecurityEnabled) arena.networkSwitch = network.NewSwitch(settings.SwitchAddress, settings.SwitchPassword) arena.dnsMasq = network.NewDnsMasq() arena.Plc.SetAddress(settings.PlcAddress) arena.TbaClient = partner.NewTbaClient(settings.TbaEventCode, settings.TbaSecretId, settings.TbaSecret) + if arena.EventSettings.NetworkSecurityEnabled && arena.MatchState == PreMatch { + if err = arena.accessPoint.ConfigureAdminWifi(); err != nil { + log.Printf("Failed to configure admin WiFi: %s", err.Error()) + } + if err = arena.accessPoint2.ConfigureAdminWifi(); err != nil { + log.Printf("Failed to configure admin WiFi: %s", err.Error()) + } + } + game.MatchTiming.WarmupDurationSec = settings.WarmupDurationSec game.MatchTiming.AutoDurationSec = settings.AutoDurationSec game.MatchTiming.PauseDurationSec = settings.PauseDurationSec @@ -572,6 +570,7 @@ func (arena *Arena) Run() { go arena.listenForDriverStations() go arena.listenForDsUdpPackets() go arena.accessPoint.Run() + go arena.accessPoint2.Run() go arena.Plc.Run() for { @@ -682,8 +681,21 @@ func (arena *Arena) preLoadNextMatch() { // Asynchronously reconfigures the networking hardware for the new set of teams. func (arena *Arena) setupNetwork(teams [6]*model.Team) { if arena.EventSettings.NetworkSecurityEnabled { - if err := arena.accessPoint.ConfigureTeamWifi(teams); err != nil { - log.Printf("Failed to configure team WiFi: %s", err.Error()) + if arena.EventSettings.Ap2TeamChannel == 0 { + // Only one AP is being used. + if err := arena.accessPoint.ConfigureTeamWifi(teams); err != nil { + log.Printf("Failed to configure team WiFi: %s", err.Error()) + } + } else { + // Two APs are being used. Configure the first for the red teams and the second for the blue teams. + if err := arena.accessPoint.ConfigureTeamWifi([6]*model.Team{teams[0], teams[1], teams[2], nil, nil, + nil}); err != nil { + log.Printf("Failed to configure red alliance WiFi: %s", err.Error()) + } + if err := arena.accessPoint2.ConfigureTeamWifi([6]*model.Team{nil, nil, nil, teams[3], teams[4], + teams[5]}); err != nil { + log.Printf("Failed to configure blue alliance WiFi: %s", err.Error()) + } } go func() { if err := arena.networkSwitch.ConfigureTeamEthernet(teams); err != nil { diff --git a/field/arena_notifiers.go b/field/arena_notifiers.go index 9d4844b5..48edf0e5 100755 --- a/field/arena_notifiers.go +++ b/field/arena_notifiers.go @@ -76,9 +76,13 @@ func (arena *Arena) generateAllianceStationDisplayModeMessage() interface{} { func (arena *Arena) generateArenaStatusMessage() interface{} { // Convert AP team wifi network status array to a map by station for ease of client use. - teamWifiStatuses := make(map[string]*network.TeamWifiStatus) + teamWifiStatuses := make(map[string]network.TeamWifiStatus) for i, station := range []string{"R1", "R2", "R3", "B1", "B2", "B3"} { - teamWifiStatuses[station] = arena.accessPoint.TeamWifiStatuses[i] + if arena.EventSettings.Ap2TeamChannel == 0 || i < 3 { + teamWifiStatuses[station] = arena.accessPoint.TeamWifiStatuses[i] + } else { + teamWifiStatuses[station] = arena.accessPoint2.TeamWifiStatuses[i] + } } startMatchErr := arena.checkCanStartMatch() @@ -89,7 +93,7 @@ func (arena *Arena) generateArenaStatusMessage() interface{} { return &struct { MatchId int AllianceStations map[string]*AllianceStation - TeamWifiStatuses map[string]*network.TeamWifiStatus + TeamWifiStatuses map[string]network.TeamWifiStatus MatchState CanStartMatch bool CanStartMatchReason string diff --git a/model/event_settings.go b/model/event_settings.go index e4c3e44c..bad0e725 100755 --- a/model/event_settings.go +++ b/model/event_settings.go @@ -23,7 +23,13 @@ type EventSettings struct { ApAddress string ApUsername string ApPassword string - ApChannel int + ApTeamChannel int + ApAdminChannel int + ApAdminWpaKey string + Ap2Address string + Ap2Username string + Ap2Password string + Ap2TeamChannel int SwitchAddress string SwitchPassword string PlcAddress string @@ -52,7 +58,10 @@ func (database *Database) GetEventSettings() (*EventSettings, error) { SelectionRound2Order: "L", SelectionRound3Order: "", TBADownloadEnabled: true, - ApChannel: 36, + ApTeamChannel: 157, + ApAdminChannel: 0, + ApAdminWpaKey: "1234Five", + Ap2TeamChannel: 0, WarmupDurationSec: game.MatchTiming.WarmupDurationSec, AutoDurationSec: game.MatchTiming.AutoDurationSec, PauseDurationSec: game.MatchTiming.PauseDurationSec, diff --git a/templates/setup_settings.html b/templates/setup_settings.html index 177e657b..11c31fba 100755 --- a/templates/setup_settings.html +++ b/templates/setup_settings.html @@ -172,20 +172,37 @@
- +
- + 36 + 40 + 44 + 48 + 149 + 153 + 157 + 161
+
+ +
+ +
+
+
+ +
+ +
+
@@ -198,6 +215,42 @@
+

If you have a second access point available and want to use one for each alliance to increase available + bandwidth, configure the second one below.

+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
PLC diff --git a/web/setup_settings.go b/web/setup_settings.go index d315219e..b3840491 100755 --- a/web/setup_settings.go +++ b/web/setup_settings.go @@ -65,7 +65,13 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) { eventSettings.ApAddress = r.PostFormValue("apAddress") eventSettings.ApUsername = r.PostFormValue("apUsername") eventSettings.ApPassword = r.PostFormValue("apPassword") - eventSettings.ApChannel, _ = strconv.Atoi(r.PostFormValue("apChannel")) + eventSettings.ApTeamChannel, _ = strconv.Atoi(r.PostFormValue("apTeamChannel")) + eventSettings.ApAdminChannel, _ = strconv.Atoi(r.PostFormValue("apAdminChannel")) + eventSettings.ApAdminWpaKey = r.PostFormValue("apAdminWpaKey") + eventSettings.Ap2Address = r.PostFormValue("ap2Address") + eventSettings.Ap2Username = r.PostFormValue("ap2Username") + eventSettings.Ap2Password = r.PostFormValue("ap2Password") + eventSettings.Ap2TeamChannel, _ = strconv.Atoi(r.PostFormValue("ap2TeamChannel")) eventSettings.SwitchAddress = r.PostFormValue("switchAddress") eventSettings.SwitchPassword = r.PostFormValue("switchPassword") eventSettings.PlcAddress = r.PostFormValue("plcAddress") @@ -76,6 +82,11 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) { eventSettings.TeleopDurationSec, _ = strconv.Atoi(r.PostFormValue("teleopDurationSec")) eventSettings.WarningRemainingDurationSec, _ = strconv.Atoi(r.PostFormValue("warningRemainingDurationSec")) + if eventSettings.Ap2TeamChannel != 0 && eventSettings.Ap2TeamChannel == eventSettings.ApTeamChannel { + web.renderSettings(w, r, "Cannot use same channel for both access points.") + return + } + err := web.arena.Database.UpdateEventSettings(eventSettings) if err != nil { handleWebErr(w, err)