Expand configurable period timings and adjust game sounds timing accordingly.

This commit is contained in:
Patrick Fairbank
2020-03-15 15:55:22 -07:00
parent 0b7880ec2f
commit 20724ba0e1
11 changed files with 127 additions and 82 deletions

View File

@@ -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
);

View File

@@ -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

View File

@@ -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

View File

@@ -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
}

View File

@@ -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

View File

@@ -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},
}
}

View File

@@ -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}

View File

@@ -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)

View File

@@ -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

View File

@@ -30,18 +30,6 @@
<input type="text" class="form-control" name="numElimAlliances" value="{{.NumElimAlliances}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Autonomous Duration (secs)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="durationAuto" value="{{.DurationAuto}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Teleop Duration (secs)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="durationTeleop" value="{{.DurationTeleop}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Round 2 Selection Order</label>
<div class="col-lg-7">
@@ -261,6 +249,38 @@
<input type="text" class="form-control" name="habDockingThreshold" value="{{.HabDockingThreshold}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Autonomous Period Duration (seconds)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="autoDurationSec" value="{{.AutoDurationSec}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Pause Duration (seconds)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="pauseDurationSec" value="{{.PauseDurationSec}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Teleoperated Period Duration (seconds)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="teleopDurationSec" value="{{.TeleopDurationSec}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">First Warning Remaining Duration (seconds)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="warning1RemainingDurationSec"
value="{{.Warning1RemainingDurationSec}}">
</div>
</div>
<div class="form-group">
<label class="col-lg-5 control-label">Second Warning Remaining Duration (seconds)</label>
<div class="col-lg-7">
<input type="text" class="form-control" name="warning2RemainingDurationSec"
value="{{.Warning2RemainingDurationSec}}">
</div>
</div>
</fieldset>
<div class="form-group">
<div class="col-lg-7 col-lg-offset-5">

View File

@@ -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 {