diff --git a/field/arena.go b/field/arena.go
index 318b13e..f58ddef 100644
--- a/field/arena.go
+++ b/field/arena.go
@@ -22,29 +22,31 @@ const (
)
// Progression of match states.
+type MatchState int
+
const (
- PreMatch = 0
- StartMatch = 1
- WarmupPeriod = 2
- AutoPeriod = 3
- PausePeriod = 4
- TeleopPeriod = 5
- EndgamePeriod = 6
- PostMatch = 7
+ PreMatch MatchState = iota
+ StartMatch
+ WarmupPeriod
+ AutoPeriod
+ PausePeriod
+ TeleopPeriod
+ EndgamePeriod
+ PostMatch
)
type Arena struct {
- Database *model.Database
- EventSettings *model.EventSettings
- accessPoint *AccessPoint
- networkSwitch *NetworkSwitch
- Plc Plc
- TbaClient *partner.TbaClient
- StemTvClient *partner.StemTvClient
- AllianceStations map[string]*AllianceStation
- CurrentMatch *model.Match
- MatchState int
- lastMatchState int
+ Database *model.Database
+ EventSettings *model.EventSettings
+ accessPoint *AccessPoint
+ networkSwitch *NetworkSwitch
+ Plc Plc
+ TbaClient *partner.TbaClient
+ StemTvClient *partner.StemTvClient
+ AllianceStations map[string]*AllianceStation
+ CurrentMatch *model.Match
+ MatchState
+ lastMatchState MatchState
MatchStartTime time.Time
LastMatchTimeSec float64
RedRealtimeScore *RealtimeScore
@@ -81,7 +83,7 @@ type Arena struct {
type ArenaStatus struct {
AllianceStations map[string]*AllianceStation
- MatchState int
+ MatchState
CanStartMatch bool
PlcIsHealthy bool
FieldEstop bool
diff --git a/field/coil_string.go b/field/coil_string.go
new file mode 100644
index 0000000..316c575
--- /dev/null
+++ b/field/coil_string.go
@@ -0,0 +1,16 @@
+// Code generated by "stringer -type=coil"; DO NOT EDIT.
+
+package field
+
+import "strconv"
+
+const _coil_name = "heartbeatstackLightGreenstackLightOrangestackLightRedstackLightBluecoilCount"
+
+var _coil_index = [...]uint8{0, 9, 24, 40, 53, 67, 76}
+
+func (i coil) String() string {
+ if i < 0 || i >= coil(len(_coil_index)-1) {
+ return "coil(" + strconv.FormatInt(int64(i), 10) + ")"
+ }
+ return _coil_name[_coil_index[i]:_coil_index[i+1]]
+}
diff --git a/field/input_string.go b/field/input_string.go
new file mode 100644
index 0000000..cbb3d06
--- /dev/null
+++ b/field/input_string.go
@@ -0,0 +1,16 @@
+// Code generated by "stringer -type=input"; DO NOT EDIT.
+
+package field
+
+import "strconv"
+
+const _input_name = "fieldEstopredEstop1redEstop2redEstop3blueEstop1blueEstop2blueEstop3redConnected1redConnected2redConnected3blueConnected1blueConnected2blueConnected3scaleNearscaleFarredSwitchNearredSwitchFarblueSwitchNearblueSwitchFarredForceActivateredLevitateActivateredBoostActivateblueForceActivateblueLevitateActivateblueBoostActivateinputCount"
+
+var _input_index = [...]uint16{0, 10, 19, 28, 37, 47, 57, 67, 80, 93, 106, 120, 134, 148, 157, 165, 178, 190, 204, 217, 233, 252, 268, 285, 305, 322, 332}
+
+func (i input) String() string {
+ if i < 0 || i >= input(len(_input_index)-1) {
+ return "input(" + strconv.FormatInt(int64(i), 10) + ")"
+ }
+ return _input_name[_input_index[i]:_input_index[i+1]]
+}
diff --git a/field/plc.go b/field/plc.go
index c772aaa..185f16b 100644
--- a/field/plc.go
+++ b/field/plc.go
@@ -31,8 +31,10 @@ const (
)
// Discrete inputs
+type input int
+
const (
- fieldEstop = iota
+ fieldEstop input = iota
redEstop1
redEstop2
redEstop3
@@ -61,8 +63,10 @@ const (
)
// 16-bit registers
+type register int
+
const (
- red1Bandwidth = iota
+ red1Bandwidth register = iota
red2Bandwidth
red3Bandwidth
blue1Bandwidth
@@ -78,8 +82,10 @@ const (
)
// Coils
+type coil int
+
const (
- heartbeat = iota
+ heartbeat coil = iota
stackLightGreen
stackLightOrange
stackLightRed
@@ -178,6 +184,30 @@ func (plc *Plc) GetCycleState(max, index, duration int) bool {
return plc.cycleCounter/duration%max == index
}
+func (plc *Plc) GetInputNames() []string {
+ inputNames := make([]string, inputCount)
+ for i := range plc.Inputs {
+ inputNames[i] = input(i).String()
+ }
+ return inputNames
+}
+
+func (plc *Plc) GetRegisterNames() []string {
+ registerNames := make([]string, registerCount)
+ for i := range plc.Registers {
+ registerNames[i] = register(i).String()
+ }
+ return registerNames
+}
+
+func (plc *Plc) GetCoilNames() []string {
+ coilNames := make([]string, coilCount)
+ for i := range plc.Coils {
+ coilNames[i] = coil(i).String()
+ }
+ return coilNames
+}
+
func (plc *Plc) connect() error {
address := fmt.Sprintf("%s:%d", plc.address, modbusPort)
handler := modbus.NewTCPClientHandler(address)
diff --git a/field/register_string.go b/field/register_string.go
new file mode 100644
index 0000000..b5cc47e
--- /dev/null
+++ b/field/register_string.go
@@ -0,0 +1,16 @@
+// Code generated by "stringer -type=register"; DO NOT EDIT.
+
+package field
+
+import "strconv"
+
+const _register_name = "red1Bandwidthred2Bandwidthred3Bandwidthblue1Bandwidthblue2Bandwidthblue3BandwidthredForceDistanceredLevitateDistanceredBoostDistanceblueForceDistanceblueLevitateDistanceblueBoostDistanceregisterCount"
+
+var _register_index = [...]uint8{0, 13, 26, 39, 53, 67, 81, 97, 116, 132, 149, 169, 186, 199}
+
+func (i register) String() string {
+ if i < 0 || i >= register(len(_register_index)-1) {
+ return "register(" + strconv.FormatInt(int64(i), 10) + ")"
+ }
+ return _register_name[_register_index[i]:_register_index[i+1]]
+}
diff --git a/game/power_up.go b/game/power_up.go
index bc7525f..8f5688d 100644
--- a/game/power_up.go
+++ b/game/power_up.go
@@ -12,21 +12,25 @@ import (
const powerUpDurationSec = 10
// Power up type/effect enum.
+type effect int
+
const (
- force = iota
+ force effect = iota
boost
)
// Power up state enum.
+type state int
+
const (
- queued = iota
+ queued state = iota
active
expired
)
type PowerUp struct {
- alliance int
- kind int
+ alliance
+ effect
level int
startTime time.Time
}
@@ -37,7 +41,7 @@ func ResetPowerUps() {
powerUpUses = powerUpUses[:0]
}
-func (powerUp *PowerUp) GetState(currentTime time.Time) int {
+func (powerUp *PowerUp) GetState(currentTime time.Time) state {
if powerUp.startTime.After(currentTime) {
return queued
}
diff --git a/game/seesaw.go b/game/seesaw.go
index f515851..cb6bb46 100644
--- a/game/seesaw.go
+++ b/game/seesaw.go
@@ -9,21 +9,23 @@ import (
"time"
)
+type alliance int
+
const (
- neitherAlliance = iota
+ neitherAlliance alliance = iota
redAlliance
blueAlliance
)
type Seesaw struct {
- kind int
+ kind alliance // Red or blue indicates that it is a switch; neither indicates the scale.
nearIsRed bool
ownerships []*Ownership
}
type Ownership struct {
seesaw *Seesaw
- ownedBy int
+ ownedBy alliance
startTime time.Time
endTime *time.Time
}
@@ -40,7 +42,7 @@ func (seesaw *Seesaw) UpdateState(state [2]bool, currentTime time.Time) {
// Check if there is an active force power up for this seesaw.
currentPowerUp := getActivePowerUp(currentTime)
- if currentPowerUp != nil && currentPowerUp.kind == force &&
+ if currentPowerUp != nil && currentPowerUp.effect == force &&
(seesaw.kind == neitherAlliance && currentPowerUp.level >= 2 ||
(seesaw.kind == currentPowerUp.alliance && (currentPowerUp.level == 1 || currentPowerUp.level == 3))) {
ownedBy = currentPowerUp.alliance
@@ -88,7 +90,7 @@ func (seesaw *Seesaw) getCurrentOwnership() *Ownership {
return nil
}
-func (seesaw *Seesaw) getAllianceSeconds(ownedBy int, startTime, endTime time.Time) float64 {
+func (seesaw *Seesaw) getAllianceSeconds(ownedBy alliance, startTime, endTime time.Time) float64 {
var seconds float64
for _, ownership := range seesaw.ownerships {
if ownership.ownedBy == ownedBy {
@@ -120,7 +122,7 @@ func (ownership *Ownership) getSeconds(startTime, endTime time.Time, ignoreBoost
// Find the boost power up applicable to this seesaw and alliance, if it exists.
var boostPowerUp *PowerUp
for _, powerUp := range powerUpUses {
- if powerUp.kind == boost && ownership.ownedBy == powerUp.alliance {
+ if powerUp.effect == boost && ownership.ownedBy == powerUp.alliance {
if ownership.seesaw.kind == neitherAlliance && powerUp.level >= 2 ||
ownership.seesaw.kind != neitherAlliance && (powerUp.level == 1 || powerUp.level == 3) {
boostPowerUp = powerUp
diff --git a/game/seesaw_test.go b/game/seesaw_test.go
index 9fc2779..4d9e94f 100644
--- a/game/seesaw_test.go
+++ b/game/seesaw_test.go
@@ -77,7 +77,7 @@ func TestForce(t *testing.T) {
// Force switch only.
blueSwitch.UpdateState([2]bool{true, false}, timeAfterStart(0))
scale.UpdateState([2]bool{true, false}, timeAfterStart(0))
- powerUp := &PowerUp{alliance: blueAlliance, kind: force, level: 1}
+ powerUp := &PowerUp{alliance: blueAlliance, effect: force, level: 1}
maybeActivatePowerUp(powerUp, timeAfterStart(2.5))
blueSwitch.UpdateState([2]bool{true, false}, timeAfterStart(2.5))
scale.UpdateState([2]bool{true, false}, timeAfterStart(2.5))
@@ -91,7 +91,7 @@ func TestForce(t *testing.T) {
assert.Equal(t, 0.0, scale.GetBlueSeconds(timeAfterStart(0), timeAfterStart(15)))
// Force scale only.
- powerUp = &PowerUp{alliance: blueAlliance, kind: force, level: 2}
+ powerUp = &PowerUp{alliance: blueAlliance, effect: force, level: 2}
maybeActivatePowerUp(powerUp, timeAfterStart(20))
blueSwitch.UpdateState([2]bool{true, false}, timeAfterStart(20))
scale.UpdateState([2]bool{true, false}, timeAfterStart(20))
@@ -101,7 +101,7 @@ func TestForce(t *testing.T) {
assert.Equal(t, 10.0, scale.GetBlueSeconds(timeAfterStart(20), timeAfterStart(40)))
// Force both switch and scale.
- powerUp = &PowerUp{alliance: blueAlliance, kind: force, level: 3}
+ powerUp = &PowerUp{alliance: blueAlliance, effect: force, level: 3}
maybeActivatePowerUp(powerUp, timeAfterStart(50))
blueSwitch.UpdateState([2]bool{true, false}, timeAfterStart(50))
scale.UpdateState([2]bool{true, false}, timeAfterStart(50))
@@ -122,7 +122,7 @@ func TestBoost(t *testing.T) {
// Test within continuous ownership period.
blueSwitch.UpdateState([2]bool{false, true}, timeAfterStart(20))
scale.UpdateState([2]bool{true, false}, timeAfterStart(20))
- powerUp := &PowerUp{alliance: blueAlliance, kind: boost, level: 2}
+ powerUp := &PowerUp{alliance: blueAlliance, effect: boost, level: 2}
maybeActivatePowerUp(powerUp, timeAfterStart(25))
assert.Equal(t, 5.0, scale.GetBlueSeconds(timeAfterStart(0), timeAfterStart(25)))
assert.Equal(t, 6.0, scale.GetBlueSeconds(timeAfterStart(0), timeAfterStart(25.5)))
@@ -136,7 +136,7 @@ func TestBoost(t *testing.T) {
ResetPowerUps()
blueSwitch.UpdateState([2]bool{false, false}, timeAfterStart(44))
scale.UpdateState([2]bool{false, false}, timeAfterStart(44))
- powerUp = &PowerUp{alliance: blueAlliance, kind: boost, level: 3}
+ powerUp = &PowerUp{alliance: blueAlliance, effect: boost, level: 3}
maybeActivatePowerUp(powerUp, timeAfterStart(45))
assert.Equal(t, 0.0, blueSwitch.GetBlueSeconds(timeAfterStart(45), timeAfterStart(50)))
assert.Equal(t, 0.0, scale.GetBlueSeconds(timeAfterStart(45), timeAfterStart(50)))
@@ -151,7 +151,7 @@ func TestBoost(t *testing.T) {
ResetPowerUps()
scale.UpdateState([2]bool{false, true}, timeAfterStart(65))
assert.Equal(t, 5.0, scale.GetRedSeconds(timeAfterStart(65), timeAfterStart(70)))
- powerUp = &PowerUp{alliance: redAlliance, kind: boost, level: 2}
+ powerUp = &PowerUp{alliance: redAlliance, effect: boost, level: 2}
maybeActivatePowerUp(powerUp, timeAfterStart(70))
scale.UpdateState([2]bool{false, false}, timeAfterStart(72.5))
assert.Equal(t, 10.0, scale.GetRedSeconds(timeAfterStart(65), timeAfterStart(72.5)))
@@ -163,7 +163,7 @@ func TestBoost(t *testing.T) {
// Test with just the switch.
blueSwitch.UpdateState([2]bool{false, true}, timeAfterStart(100))
scale.UpdateState([2]bool{true, false}, timeAfterStart(100))
- powerUp = &PowerUp{alliance: blueAlliance, kind: boost, level: 1}
+ powerUp = &PowerUp{alliance: blueAlliance, effect: boost, level: 1}
maybeActivatePowerUp(powerUp, timeAfterStart(100))
assert.Equal(t, 20.0, blueSwitch.GetBlueSeconds(timeAfterStart(100), timeAfterStart(110)))
assert.Equal(t, 10.0, scale.GetBlueSeconds(timeAfterStart(100), timeAfterStart(110)))
diff --git a/game/vault.go b/game/vault.go
index 2198611..a5b2601 100644
--- a/game/vault.go
+++ b/game/vault.go
@@ -10,7 +10,7 @@ import (
)
type Vault struct {
- alliance int
+ alliance alliance
numForceCubes int
numLevitateCubes int
numBoostCubes int
@@ -33,12 +33,12 @@ func (vault *Vault) UpdateButtons(forceButton, levitateButton, boostButton bool,
}
if forceButton && vault.numForceCubes > 0 && vault.ForcePowerUp == nil {
- vault.ForcePowerUp = maybeActivatePowerUp(&PowerUp{kind: force, alliance: vault.alliance,
+ vault.ForcePowerUp = maybeActivatePowerUp(&PowerUp{effect: force, alliance: vault.alliance,
level: vault.numForceCubes}, currentTime)
}
if boostButton && vault.numBoostCubes > 0 && vault.BoostPowerUp == nil {
- vault.BoostPowerUp = maybeActivatePowerUp(&PowerUp{kind: boost, alliance: vault.alliance,
+ vault.BoostPowerUp = maybeActivatePowerUp(&PowerUp{effect: boost, alliance: vault.alliance,
level: vault.numBoostCubes}, currentTime)
}
}
diff --git a/game/vault_test.go b/game/vault_test.go
index fe9210a..857377a 100644
--- a/game/vault_test.go
+++ b/game/vault_test.go
@@ -75,7 +75,7 @@ func TestVaultForce(t *testing.T) {
vault.UpdateButtons(true, false, false, time.Now())
if assert.NotNil(t, vault.ForcePowerUp) {
assert.Equal(t, blueAlliance, vault.ForcePowerUp.alliance)
- assert.Equal(t, force, vault.ForcePowerUp.kind)
+ assert.Equal(t, force, vault.ForcePowerUp.effect)
assert.Equal(t, 1, vault.ForcePowerUp.level)
}
@@ -86,7 +86,7 @@ func TestVaultForce(t *testing.T) {
vault.UpdateButtons(true, false, false, time.Now())
if assert.NotNil(t, vault.ForcePowerUp) {
assert.Equal(t, redAlliance, vault.ForcePowerUp.alliance)
- assert.Equal(t, force, vault.ForcePowerUp.kind)
+ assert.Equal(t, force, vault.ForcePowerUp.effect)
assert.Equal(t, 2, vault.ForcePowerUp.level)
}
@@ -98,7 +98,7 @@ func TestVaultForce(t *testing.T) {
assert.NotNil(t, vault.ForcePowerUp)
if assert.NotNil(t, vault.ForcePowerUp) {
assert.Equal(t, blueAlliance, vault.ForcePowerUp.alliance)
- assert.Equal(t, force, vault.ForcePowerUp.kind)
+ assert.Equal(t, force, vault.ForcePowerUp.effect)
assert.Equal(t, 3, vault.ForcePowerUp.level)
}
@@ -124,7 +124,7 @@ func TestVaultBoost(t *testing.T) {
vault.UpdateButtons(false, false, true, time.Now())
if assert.NotNil(t, vault.BoostPowerUp) {
assert.Equal(t, blueAlliance, vault.BoostPowerUp.alliance)
- assert.Equal(t, boost, vault.BoostPowerUp.kind)
+ assert.Equal(t, boost, vault.BoostPowerUp.effect)
assert.Equal(t, 1, vault.BoostPowerUp.level)
}
@@ -135,7 +135,7 @@ func TestVaultBoost(t *testing.T) {
vault.UpdateButtons(false, false, true, time.Now())
if assert.NotNil(t, vault.BoostPowerUp) {
assert.Equal(t, redAlliance, vault.BoostPowerUp.alliance)
- assert.Equal(t, boost, vault.BoostPowerUp.kind)
+ assert.Equal(t, boost, vault.BoostPowerUp.effect)
assert.Equal(t, 2, vault.BoostPowerUp.level)
}
@@ -147,7 +147,7 @@ func TestVaultBoost(t *testing.T) {
assert.NotNil(t, vault.BoostPowerUp)
if assert.NotNil(t, vault.BoostPowerUp) {
assert.Equal(t, blueAlliance, vault.BoostPowerUp.alliance)
- assert.Equal(t, boost, vault.BoostPowerUp.kind)
+ assert.Equal(t, boost, vault.BoostPowerUp.effect)
assert.Equal(t, 3, vault.BoostPowerUp.level)
}
diff --git a/led/led_strip.go b/led/led_strip.go
index e22a6d1..f32e531 100644
--- a/led/led_strip.go
+++ b/led/led_strip.go
@@ -19,8 +19,10 @@ const (
)
// LED sequence modes
+type Mode int
+
const (
- OffMode = iota
+ OffMode Mode = iota
RedMode
GreenMode
BlueMode
@@ -31,9 +33,23 @@ const (
FadeMode
)
+var ModeNames = map[Mode]string{
+ OffMode: "Off",
+ RedMode: "Red",
+ GreenMode: "Green",
+ BlueMode: "Blue",
+ WhiteMode: "White",
+ ChaseMode: "Chase",
+ WarmupMode: "Warmup",
+ RandomMode: "Random",
+ FadeMode: "Fade",
+}
+
// Color RGB mappings
+type color int
+
const (
- red = iota
+ red color = iota
orange
yellow
green
@@ -43,20 +59,21 @@ const (
white
black
)
-var colors = [][3]byte{
- {255, 0, 0}, // Red
- {255, 50, 0}, // Orange
- {255, 255, 0}, // Yellow
- {0, 255, 0}, // Green
- {0, 100, 100}, // Teal
- {0, 0, 255}, // Blue
- {100, 0, 100}, // Purple
- {255, 255, 255}, // White
- {0, 0, 0}, // Black
+
+var colors = map[color][3]byte{
+ red: {255, 0, 0},
+ orange: {255, 50, 0},
+ yellow: {255, 255, 0},
+ green: {0, 255, 0},
+ teal: {0, 100, 100},
+ blue: {0, 0, 255},
+ purple: {100, 0, 100},
+ white: {255, 255, 255},
+ black: {0, 0, 0},
}
type LedStrip struct {
- Mode int
+ CurrentMode Mode
conn net.Conn
pixels [][3]byte
oldPixels [][3]byte
@@ -82,8 +99,8 @@ func NewLedStrip(controllerAddress string, dmxUniverse int, numPixels int) (*Led
}
// Sets the current LED sequence mode and resets the intra-sequence counter to the beginning.
-func (strip *LedStrip) SetMode(mode int) {
- strip.Mode = mode
+func (strip *LedStrip) SetMode(mode Mode) {
+ strip.CurrentMode = mode
strip.counter = 0
}
@@ -91,7 +108,7 @@ func (strip *LedStrip) SetMode(mode int) {
// loop.
func (strip *LedStrip) Update() error {
// Determine the pixel values.
- switch strip.Mode {
+ switch strip.CurrentMode {
case RedMode:
strip.updateSingleColorMode(red)
case GreenMode:
@@ -259,7 +276,7 @@ func (strip *LedStrip) updateOffMode() {
}
}
-func (strip *LedStrip) updateSingleColorMode(color int) {
+func (strip *LedStrip) updateSingleColorMode(color color) {
for i := 0; i < len(strip.pixels); i++ {
strip.pixels[i] = colors[color]
}
@@ -269,7 +286,7 @@ func (strip *LedStrip) updateChaseMode() {
if strip.counter == len(colors)*len(strip.pixels) {
strip.counter = 0
}
- color := strip.counter / len(strip.pixels)
+ color := color(strip.counter / len(strip.pixels))
pixelIndex := strip.counter % len(strip.pixels)
strip.pixels[pixelIndex] = colors[color]
}
@@ -299,7 +316,7 @@ func (strip *LedStrip) updateRandomMode() {
return
}
for i := 0; i < len(strip.pixels); i++ {
- strip.pixels[i] = colors[rand.Intn(len(colors))]
+ strip.pixels[i] = colors[color(rand.Intn(len(colors)))]
}
}
@@ -332,7 +349,7 @@ func (strip *LedStrip) updateFadeMode() {
}
// Interpolates between the two colors based on the given fraction.
-func getFadeColor(fromColor, toColor, numerator, denominator int) [3]byte {
+func getFadeColor(fromColor, toColor color, numerator, denominator int) [3]byte {
from := colors[fromColor]
to := colors[toColor]
var fadeColor [3]byte
diff --git a/templates/setup_field.html b/templates/setup_field.html
index 0b851a6..0a3f67f 100644
--- a/templates/setup_field.html
+++ b/templates/setup_field.html
@@ -7,7 +7,7 @@
{{define "title"}}Field Configuration{{end}}
{{define "body"}}
-
+
{{range $displayId, $station := .AllianceStationDisplays}}
@@ -35,44 +35,44 @@
-
+
-
+
- | Inputs |
+ Inputs |
{{range $i, $value := .Inputs}}
- | {{$i}} |
+ {{index $.InputNames $i}} |
{{$value}} |
{{end}}
-
+
- | Counters |
+ Registers |
- {{range $i, $value := .Counters}}
+ {{range $i, $value := .Registers}}
- | {{$i}} |
+ {{index $.RegisterNames $i}} |
{{$value}} |
{{end}}
-
+
- | Coils |
+ Coils |
{{range $i, $value := .Coils}}
- | {{$i}} |
+ {{index $.CoilNames $i}} |
{{$value}} |
{{end}}
@@ -81,65 +81,19 @@
-
+
diff --git a/web/alliance_station_display.go b/web/alliance_station_display.go
index ef3dea2..a25c851 100644
--- a/web/alliance_station_display.go
+++ b/web/alliance_station_display.go
@@ -96,7 +96,7 @@ func (web *Web) allianceStationDisplayWebsocketHandler(w http.ResponseWriter, r
log.Printf("Websocket error: %s", err)
return
}
- err = websocket.Write("matchTime", MatchTimeMessage{web.arena.MatchState, int(web.arena.LastMatchTimeSec)})
+ err = websocket.Write("matchTime", MatchTimeMessage{int(web.arena.MatchState), int(web.arena.LastMatchTimeSec)})
if err != nil {
log.Printf("Websocket error: %s", err)
return
@@ -134,7 +134,8 @@ func (web *Web) allianceStationDisplayWebsocketHandler(w http.ResponseWriter, r
if !ok {
return
}
- websocket.Write("matchTime", MatchTimeMessage{web.arena.MatchState, int(web.arena.LastMatchTimeSec)})
+ websocket.Write("matchTime",
+ MatchTimeMessage{int(web.arena.MatchState), int(web.arena.LastMatchTimeSec)})
messageType = "setAllianceStationDisplay"
message = web.arena.AllianceStationDisplayScreen
case _, ok := <-matchLoadTeamsListener:
@@ -170,7 +171,7 @@ func (web *Web) allianceStationDisplayWebsocketHandler(w http.ResponseWriter, r
return
}
messageType = "matchTime"
- message = MatchTimeMessage{web.arena.MatchState, matchTimeSec.(int)}
+ message = MatchTimeMessage{int(web.arena.MatchState), matchTimeSec.(int)}
case _, ok := <-realtimeScoreListener:
if !ok {
return
diff --git a/web/announcer_display.go b/web/announcer_display.go
index 6bcdd5f..37ea27a 100644
--- a/web/announcer_display.go
+++ b/web/announcer_display.go
@@ -86,7 +86,7 @@ func (web *Web) announcerDisplayWebsocketHandler(w http.ResponseWriter, r *http.
log.Printf("Websocket error: %s", err)
return
}
- err = websocket.Write("matchTime", MatchTimeMessage{web.arena.MatchState, int(web.arena.LastMatchTimeSec)})
+ err = websocket.Write("matchTime", MatchTimeMessage{int(web.arena.MatchState), int(web.arena.LastMatchTimeSec)})
if err != nil {
log.Printf("Websocket error: %s", err)
return
@@ -130,7 +130,7 @@ func (web *Web) announcerDisplayWebsocketHandler(w http.ResponseWriter, r *http.
return
}
messageType = "matchTime"
- message = MatchTimeMessage{web.arena.MatchState, matchTimeSec.(int)}
+ message = MatchTimeMessage{int(web.arena.MatchState), matchTimeSec.(int)}
case _, ok := <-realtimeScoreListener:
if !ok {
return
diff --git a/web/audience_display.go b/web/audience_display.go
index 755039e..07a2d95 100644
--- a/web/audience_display.go
+++ b/web/audience_display.go
@@ -74,7 +74,7 @@ func (web *Web) audienceDisplayWebsocketHandler(w http.ResponseWriter, r *http.R
log.Printf("Websocket error: %s", err)
return
}
- err = websocket.Write("matchTime", MatchTimeMessage{web.arena.MatchState, int(web.arena.LastMatchTimeSec)})
+ err = websocket.Write("matchTime", MatchTimeMessage{int(web.arena.MatchState), int(web.arena.LastMatchTimeSec)})
if err != nil {
log.Printf("Websocket error: %s", err)
return
@@ -149,7 +149,7 @@ func (web *Web) audienceDisplayWebsocketHandler(w http.ResponseWriter, r *http.R
return
}
messageType = "matchTime"
- message = MatchTimeMessage{web.arena.MatchState, matchTimeSec.(int)}
+ message = MatchTimeMessage{int(web.arena.MatchState), matchTimeSec.(int)}
case _, ok := <-realtimeScoreListener:
if !ok {
return
diff --git a/web/match_play.go b/web/match_play.go
index 8213b5f..464ed8e 100644
--- a/web/match_play.go
+++ b/web/match_play.go
@@ -196,7 +196,7 @@ func (web *Web) matchPlayWebsocketHandler(w http.ResponseWriter, r *http.Request
log.Printf("Websocket error: %s", err)
return
}
- data = MatchTimeMessage{web.arena.MatchState, int(web.arena.LastMatchTimeSec)}
+ data = MatchTimeMessage{int(web.arena.MatchState), int(web.arena.LastMatchTimeSec)}
err = websocket.Write("matchTime", data)
if err != nil {
log.Printf("Websocket error: %s", err)
@@ -244,7 +244,7 @@ func (web *Web) matchPlayWebsocketHandler(w http.ResponseWriter, r *http.Request
return
}
messageType = "matchTime"
- message = MatchTimeMessage{web.arena.MatchState, matchTimeSec.(int)}
+ message = MatchTimeMessage{int(web.arena.MatchState), matchTimeSec.(int)}
case _, ok := <-realtimeScoreListener:
if !ok {
return
diff --git a/web/scoring_display.go b/web/scoring_display.go
index 4955fd1..bc59a0c 100644
--- a/web/scoring_display.go
+++ b/web/scoring_display.go
@@ -93,7 +93,7 @@ func (web *Web) scoringDisplayWebsocketHandler(w http.ResponseWriter, r *http.Re
log.Printf("Websocket error: %s", err)
return
}
- err = websocket.Write("matchTime", MatchTimeMessage{web.arena.MatchState, int(web.arena.LastMatchTimeSec)})
+ err = websocket.Write("matchTime", MatchTimeMessage{int(web.arena.MatchState), int(web.arena.LastMatchTimeSec)})
if err != nil {
log.Printf("Websocket error: %s", err)
return
@@ -116,7 +116,7 @@ func (web *Web) scoringDisplayWebsocketHandler(w http.ResponseWriter, r *http.Re
return
}
messageType = "matchTime"
- message = MatchTimeMessage{web.arena.MatchState, matchTimeSec.(int)}
+ message = MatchTimeMessage{int(web.arena.MatchState), matchTimeSec.(int)}
case _, ok := <-reloadDisplaysListener:
if !ok {
return
diff --git a/web/setup_field.go b/web/setup_field.go
index ce046a2..78dfa91 100644
--- a/web/setup_field.go
+++ b/web/setup_field.go
@@ -7,6 +7,7 @@ package web
import (
"github.com/Team254/cheesy-arena/field"
+ "github.com/Team254/cheesy-arena/led"
"github.com/Team254/cheesy-arena/model"
"net/http"
"strconv"
@@ -23,15 +24,21 @@ func (web *Web) fieldGetHandler(w http.ResponseWriter, r *http.Request) {
handleWebErr(w, err)
return
}
+ plc := web.arena.Plc
data := struct {
*model.EventSettings
AllianceStationDisplays map[string]string
Inputs []bool
- Counters []uint16
+ InputNames []string
+ Registers []uint16
+ RegisterNames []string
Coils []bool
- LedMode int
- }{web.arena.EventSettings, web.arena.AllianceStationDisplays, web.arena.Plc.Inputs[:],
- web.arena.Plc.Registers[:], web.arena.Plc.Coils[:], web.arena.RedSwitchLedStrip.Mode}
+ CoilNames []string
+ CurrentLedMode led.Mode
+ LedModeNames map[led.Mode]string
+ }{web.arena.EventSettings, web.arena.AllianceStationDisplays, plc.Inputs[:], plc.GetInputNames(), plc.Registers[:],
+ plc.GetRegisterNames(), plc.Coils[:], plc.GetCoilNames(), web.arena.RedSwitchLedStrip.CurrentMode,
+ led.ModeNames}
err = template.ExecuteTemplate(w, "base", data)
if err != nil {
handleWebErr(w, err)
@@ -74,7 +81,7 @@ func (web *Web) fieldTestPostHandler(w http.ResponseWriter, r *http.Request) {
}
mode, _ := strconv.Atoi(r.PostFormValue("mode"))
- web.arena.RedSwitchLedStrip.SetMode(mode)
+ web.arena.RedSwitchLedStrip.SetMode(led.Mode(mode))
http.Redirect(w, r, "/setup/field", 303)
}
diff --git a/web/setup_field_test.go b/web/setup_field_test.go
index 7a92bf6..33a68d1 100644
--- a/web/setup_field_test.go
+++ b/web/setup_field_test.go
@@ -25,5 +25,5 @@ func TestSetupField(t *testing.T) {
recorder = web.postHttpResponse("/setup/field/test", "mode=1")
assert.Equal(t, 303, recorder.Code)
- assert.Equal(t, 1, web.arena.RedSwitchLedStrip.Mode)
+ assert.Equal(t, 1, int(web.arena.RedSwitchLedStrip.CurrentMode))
}