mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 21:56:50 -04:00
Expand configurable period timings and adjust game sounds timing accordingly.
This commit is contained in:
@@ -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
|
||||
);
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user