diff --git a/db/migrations/20140524160241_CreateEventSettings.sql b/db/migrations/20140524160241_CreateEventSettings.sql index fc616d1..35e68f5 100644 --- a/db/migrations/20140524160241_CreateEventSettings.sql +++ b/db/migrations/20140524160241_CreateEventSettings.sql @@ -26,6 +26,12 @@ CREATE TABLE event_settings ( plcaddress VARCHAR(255), tbadownloadenabled bool, adminpassword VARCHAR(255), + warmupdurationsec int, + autodurationsec int, + pausedurationsec int, + teleopdurationsec int, + warning1remainingdurationsec int, + warning2remainingdurationsec int, habdockingthreshold int ); diff --git a/db/migrations/20191218083501_AddMatchTimes.sql b/db/migrations/20191218083501_AddMatchTimes.sql deleted file mode 100644 index 08a2350..0000000 --- a/db/migrations/20191218083501_AddMatchTimes.sql +++ /dev/null @@ -1,12 +0,0 @@ --- +goose Up --- +goose StatementBegin -ALTER TABLE event_settings ADD durationauto int; -ALTER TABLE event_settings ADD durationteleop int; -UPDATE event_settings SET durationauto = 15, durationteleop = 135; --- +goose StatementEnd - --- +goose Down --- +goose StatementBegin -ALTER TABLE event_settings DROP durationauto; -ALTER TABLE event_settings DROP durationteleop; --- +goose StatementEnd diff --git a/field/arena.go b/field/arena.go index 2634294..b06b7d5 100644 --- a/field/arena.go +++ b/field/arena.go @@ -85,6 +85,7 @@ type AllianceStation struct { // Creates the arena and sets it to its initial state. func NewArena(dbPath string) (*Arena, error) { arena := new(Arena) + arena.configureNotifiers() var err error arena.Database, err = model.OpenDatabase(dbPath) @@ -106,8 +107,6 @@ func NewArena(dbPath string) (*Arena, error) { arena.Displays = make(map[string]*Display) - arena.configureNotifiers() - arena.ScoringPanelRegistry.initialize() // Load empty match as current. @@ -151,6 +150,15 @@ func (arena *Arena) LoadSettings() error { } } + game.MatchTiming.WarmupDurationSec = settings.WarmupDurationSec + game.MatchTiming.AutoDurationSec = settings.AutoDurationSec + game.MatchTiming.PauseDurationSec = settings.PauseDurationSec + game.MatchTiming.TeleopDurationSec = settings.TeleopDurationSec + game.MatchTiming.Warning1RemainingDurationSec = settings.Warning1RemainingDurationSec + game.MatchTiming.Warning2RemainingDurationSec = settings.Warning2RemainingDurationSec + game.UpdateMatchSounds() + arena.MatchTimingNotifier.Notify() + game.HabDockingThreshold = settings.HabDockingThreshold return nil @@ -401,7 +409,7 @@ func (arena *Arena) Update() { case AutoPeriod: auto = true enabled = true - if matchTimeSec >= float64(game.MatchTiming.WarmupDurationSec+arena.EventSettings.DurationAuto) { + if matchTimeSec >= float64(game.MatchTiming.WarmupDurationSec+game.MatchTiming.AutoDurationSec) { auto = false sendDsPacket = true if game.MatchTiming.PauseDurationSec > 0 { @@ -415,7 +423,7 @@ func (arena *Arena) Update() { case PausePeriod: auto = false enabled = false - if matchTimeSec >= float64(game.MatchTiming.WarmupDurationSec+arena.EventSettings.DurationAuto+ + if matchTimeSec >= float64(game.MatchTiming.WarmupDurationSec+game.MatchTiming.AutoDurationSec+ game.MatchTiming.PauseDurationSec) { arena.MatchState = TeleopPeriod auto = false @@ -425,8 +433,8 @@ func (arena *Arena) Update() { case TeleopPeriod: auto = false enabled = true - if matchTimeSec >= float64(game.MatchTiming.WarmupDurationSec+arena.EventSettings.DurationAuto+ - game.MatchTiming.PauseDurationSec+arena.EventSettings.DurationTeleop) { + if matchTimeSec >= float64(game.MatchTiming.WarmupDurationSec+game.MatchTiming.AutoDurationSec+ + game.MatchTiming.PauseDurationSec+game.MatchTiming.TeleopDurationSec) { arena.MatchState = PostMatch auto = false enabled = false diff --git a/field/arena_notifiers.go b/field/arena_notifiers.go index fcff131..61f5b73 100644 --- a/field/arena_notifiers.go +++ b/field/arena_notifiers.go @@ -148,8 +148,6 @@ func (arena *Arena) generateMatchTimeMessage() interface{} { } func (arena *Arena) generateMatchTimingMessage() interface{} { - game.MatchTiming.TeleopDurationSec = arena.EventSettings.DurationTeleop - game.MatchTiming.AutoDurationSec = arena.EventSettings.DurationAuto return &game.MatchTiming } diff --git a/field/driver_station_connection.go b/field/driver_station_connection.go index 0e247a7..39fbfd9 100644 --- a/field/driver_station_connection.go +++ b/field/driver_station_connection.go @@ -223,15 +223,15 @@ func (dsConn *DriverStationConnection) encodeControlPacket(arena *Arena) [22]byt case TimeoutActive: fallthrough case PostTimeout: - matchSecondsRemaining = arena.EventSettings.DurationAuto + matchSecondsRemaining = game.MatchTiming.AutoDurationSec case StartMatch: fallthrough case AutoPeriod: - matchSecondsRemaining = arena.EventSettings.DurationAuto - int(arena.MatchTimeSec()) + matchSecondsRemaining = game.MatchTiming.AutoDurationSec - int(arena.MatchTimeSec()) case PausePeriod: - matchSecondsRemaining = arena.EventSettings.DurationTeleop + matchSecondsRemaining = game.MatchTiming.TeleopDurationSec case TeleopPeriod: - matchSecondsRemaining = arena.EventSettings.DurationAuto + arena.EventSettings.DurationTeleop + + matchSecondsRemaining = game.MatchTiming.AutoDurationSec + game.MatchTiming.TeleopDurationSec + game.MatchTiming.PauseDurationSec - int(arena.MatchTimeSec()) default: matchSecondsRemaining = 0 diff --git a/game/match_sounds.go b/game/match_sounds.go index 80dcba2..4bb2dbb 100644 --- a/game/match_sounds.go +++ b/game/match_sounds.go @@ -13,11 +13,18 @@ type MatchSound struct { // List of sounds and how many seconds into the match they are played. A negative time indicates that the sound can only // be triggered explicitly. -var MatchSounds = []*MatchSound{ - {"start", "wav", 0}, - {"resume", "wav", 15}, - {"warning1", "wav", 120}, - {"warning2", "wav", 130}, - {"end", "wav", 150}, - {"abort", "mp3", -1}, +var MatchSounds []*MatchSound + +func UpdateMatchSounds() { + MatchSounds = []*MatchSound{ + {"start", "wav", 0}, + {"resume", "wav", float64(MatchTiming.AutoDurationSec + MatchTiming.PauseDurationSec)}, + {"warning1", "wav", float64(MatchTiming.AutoDurationSec + MatchTiming.PauseDurationSec + + MatchTiming.TeleopDurationSec - MatchTiming.Warning1RemainingDurationSec)}, + {"warning2", "wav", float64(MatchTiming.AutoDurationSec + MatchTiming.PauseDurationSec + + MatchTiming.TeleopDurationSec - MatchTiming.Warning2RemainingDurationSec)}, + {"end", "wav", float64(MatchTiming.AutoDurationSec + MatchTiming.PauseDurationSec + + MatchTiming.TeleopDurationSec)}, + {"abort", "mp3", -1}, + } } diff --git a/game/match_timing.go b/game/match_timing.go index 2ec16db..b207c64 100644 --- a/game/match_timing.go +++ b/game/match_timing.go @@ -6,9 +6,11 @@ package game var MatchTiming = struct { - WarmupDurationSec int - AutoDurationSec int - PauseDurationSec int - TeleopDurationSec int - TimeoutDurationSec int -}{0, 0, 0, 0, 0} + WarmupDurationSec int + AutoDurationSec int + PauseDurationSec int + TeleopDurationSec int + Warning1RemainingDurationSec int + Warning2RemainingDurationSec int + TimeoutDurationSec int +}{0, 15, 0, 135, 30, 20, 0} diff --git a/model/event_settings.go b/model/event_settings.go index 521ab1b..1c8bc27 100644 --- a/model/event_settings.go +++ b/model/event_settings.go @@ -5,35 +5,41 @@ package model +import "github.com/Team254/cheesy-arena/game" + type EventSettings struct { - Id int - Name string - NumElimAlliances int - DurationAuto int - DurationTeleop int - SelectionRound2Order string - SelectionRound3Order string - TBADownloadEnabled bool - TbaPublishingEnabled bool - TbaEventCode string - TbaSecretId string - TbaSecret string - NetworkSecurityEnabled bool - ApAddress string - ApUsername string - ApPassword string - ApTeamChannel int - ApAdminChannel int - ApAdminWpaKey string - Ap2Address string - Ap2Username string - Ap2Password string - Ap2TeamChannel int - SwitchAddress string - SwitchPassword string - PlcAddress string - AdminPassword string - HabDockingThreshold int + Id int + Name string + NumElimAlliances int + SelectionRound2Order string + SelectionRound3Order string + TBADownloadEnabled bool + TbaPublishingEnabled bool + TbaEventCode string + TbaSecretId string + TbaSecret string + NetworkSecurityEnabled bool + ApAddress string + ApUsername string + ApPassword string + ApTeamChannel int + ApAdminChannel int + ApAdminWpaKey string + Ap2Address string + Ap2Username string + Ap2Password string + Ap2TeamChannel int + SwitchAddress string + SwitchPassword string + PlcAddress string + AdminPassword string + WarmupDurationSec int + AutoDurationSec int + PauseDurationSec int + TeleopDurationSec int + Warning1RemainingDurationSec int + Warning2RemainingDurationSec int + HabDockingThreshold int } const eventSettingsId = 0 @@ -45,8 +51,6 @@ func (database *Database) GetEventSettings() (*EventSettings, error) { // Database record doesn't exist yet; create it now. eventSettings.Name = "Untitled Event" eventSettings.NumElimAlliances = 8 - eventSettings.DurationAuto = 15 - eventSettings.DurationTeleop = 135 eventSettings.SelectionRound2Order = "L" eventSettings.SelectionRound3Order = "" eventSettings.TBADownloadEnabled = true @@ -54,6 +58,12 @@ func (database *Database) GetEventSettings() (*EventSettings, error) { eventSettings.ApAdminChannel = 0 eventSettings.ApAdminWpaKey = "1234Five" eventSettings.Ap2TeamChannel = 0 + eventSettings.WarmupDurationSec = game.MatchTiming.WarmupDurationSec + eventSettings.AutoDurationSec = game.MatchTiming.AutoDurationSec + eventSettings.PauseDurationSec = game.MatchTiming.PauseDurationSec + eventSettings.TeleopDurationSec = game.MatchTiming.TeleopDurationSec + eventSettings.Warning1RemainingDurationSec = game.MatchTiming.Warning1RemainingDurationSec + eventSettings.Warning2RemainingDurationSec = game.MatchTiming.Warning2RemainingDurationSec eventSettings.HabDockingThreshold = 15 err = database.eventSettingsMap.Insert(eventSettings) diff --git a/model/event_settings_test.go b/model/event_settings_test.go index 06376c1..db6d1d2 100644 --- a/model/event_settings_test.go +++ b/model/event_settings_test.go @@ -15,7 +15,9 @@ func TestEventSettingsReadWrite(t *testing.T) { assert.Nil(t, err) assert.Equal(t, EventSettings{Id: 0, Name: "Untitled Event", NumElimAlliances: 8, SelectionRound2Order: "L", SelectionRound3Order: "", TBADownloadEnabled: true, ApTeamChannel: 157, ApAdminChannel: 0, - ApAdminWpaKey: "1234Five", HabDockingThreshold: 15}, *eventSettings) + ApAdminWpaKey: "1234Five", WarmupDurationSec: 0, AutoDurationSec: 15, PauseDurationSec: 0, + TeleopDurationSec: 135, Warning1RemainingDurationSec: 30, Warning2RemainingDurationSec: 20, + HabDockingThreshold: 15}, *eventSettings) eventSettings.Name = "Chezy Champs" eventSettings.NumElimAlliances = 6 diff --git a/templates/setup_settings.html b/templates/setup_settings.html index 5357686..8069054 100644 --- a/templates/setup_settings.html +++ b/templates/setup_settings.html @@ -30,18 +30,6 @@ -
- -
- -
-
-
- -
- -
-
@@ -261,6 +249,38 @@
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
diff --git a/web/setup_settings.go b/web/setup_settings.go index d9f8863..7f1acf3 100644 --- a/web/setup_settings.go +++ b/web/setup_settings.go @@ -48,8 +48,6 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) { } eventSettings.NumElimAlliances = numAlliances - eventSettings.DurationAuto, _ = strconv.Atoi(r.PostFormValue("durationAuto")) - eventSettings.DurationTeleop, _ = strconv.Atoi(r.PostFormValue("durationTeleop")) eventSettings.SelectionRound2Order = r.PostFormValue("selectionRound2Order") eventSettings.SelectionRound3Order = r.PostFormValue("selectionRound3Order") eventSettings.TBADownloadEnabled = r.PostFormValue("TBADownloadEnabled") == "on" @@ -72,6 +70,12 @@ func (web *Web) settingsPostHandler(w http.ResponseWriter, r *http.Request) { eventSettings.SwitchPassword = r.PostFormValue("switchPassword") eventSettings.PlcAddress = r.PostFormValue("plcAddress") eventSettings.AdminPassword = r.PostFormValue("adminPassword") + eventSettings.WarmupDurationSec, _ = strconv.Atoi(r.PostFormValue("warmupDurationSec")) + eventSettings.AutoDurationSec, _ = strconv.Atoi(r.PostFormValue("autoDurationSec")) + eventSettings.PauseDurationSec, _ = strconv.Atoi(r.PostFormValue("pauseDurationSec")) + eventSettings.TeleopDurationSec, _ = strconv.Atoi(r.PostFormValue("teleopDurationSec")) + eventSettings.Warning1RemainingDurationSec, _ = strconv.Atoi(r.PostFormValue("warning1RemainingDurationSec")) + eventSettings.Warning2RemainingDurationSec, _ = strconv.Atoi(r.PostFormValue("warning2RemainingDurationSec")) eventSettings.HabDockingThreshold, _ = strconv.Atoi(r.PostFormValue("habDockingThreshold")) if eventSettings.Ap2TeamChannel != 0 && eventSettings.Ap2TeamChannel == eventSettings.ApTeamChannel {