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"}}
-
+
Alliance Station Displays {{range $displayId, $station := .AllianceStationDisplays}} @@ -35,44 +35,44 @@
-
+
PLC
- +
- + {{range $i, $value := .Inputs}} - + {{end}}
InputsInputs
{{$i}}{{index $.InputNames $i}} {{$value}}
- +
- + - {{range $i, $value := .Counters}} + {{range $i, $value := .Registers}} - + {{end}}
CountersRegisters
{{$i}}{{index $.RegisterNames $i}} {{$value}}
- +
- + {{range $i, $value := .Coils}} - + {{end}} @@ -81,65 +81,19 @@ -
+
LEDs
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
+ {{range $i, $name := .LedModeNames}} +
+ +
+ {{end}}
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)) }
CoilsCoils
{{$i}}{{index $.CoilNames $i}} {{$value}}