Expose team in AllianceStation JSON for field monitor (fixes #32).

This commit is contained in:
Patrick Fairbank
2016-10-16 15:18:22 -07:00
parent 067b53d347
commit 33844049ed
8 changed files with 51 additions and 45 deletions

View File

@@ -65,8 +65,8 @@ func AllianceStationDisplayWebsocketHandler(w http.ResponseWriter, r *http.Reque
}
rankings := make(map[string]*Ranking)
for _, allianceStation := range mainArena.AllianceStations {
if allianceStation.team != nil {
rankings[strconv.Itoa(allianceStation.team.Id)], _ = db.GetRankingForTeam(allianceStation.team.Id)
if allianceStation.Team != nil {
rankings[strconv.Itoa(allianceStation.Team.Id)], _ = db.GetRankingForTeam(allianceStation.Team.Id)
}
}
@@ -104,10 +104,10 @@ func AllianceStationDisplayWebsocketHandler(w http.ResponseWriter, r *http.Reque
AllianceStation string
Teams map[string]*Team
Rankings map[string]*Ranking
}{station, map[string]*Team{"R1": mainArena.AllianceStations["R1"].team,
"R2": mainArena.AllianceStations["R2"].team, "R3": mainArena.AllianceStations["R3"].team,
"B1": mainArena.AllianceStations["B1"].team, "B2": mainArena.AllianceStations["B2"].team,
"B3": mainArena.AllianceStations["B3"].team}, rankings}
}{station, map[string]*Team{"R1": mainArena.AllianceStations["R1"].Team,
"R2": mainArena.AllianceStations["R2"].Team, "R3": mainArena.AllianceStations["R3"].Team,
"B1": mainArena.AllianceStations["B1"].Team, "B2": mainArena.AllianceStations["B2"].Team,
"B3": mainArena.AllianceStations["B3"].Team}, rankings}
err = websocket.Write("setMatch", data)
if err != nil {
log.Printf("Websocket error: %s", err)
@@ -145,18 +145,18 @@ func AllianceStationDisplayWebsocketHandler(w http.ResponseWriter, r *http.Reque
station = mainArena.allianceStationDisplays[displayId]
rankings := make(map[string]*Ranking)
for _, allianceStation := range mainArena.AllianceStations {
if allianceStation.team != nil {
rankings[strconv.Itoa(allianceStation.team.Id)], _ = db.GetRankingForTeam(allianceStation.team.Id)
if allianceStation.Team != nil {
rankings[strconv.Itoa(allianceStation.Team.Id)], _ = db.GetRankingForTeam(allianceStation.Team.Id)
}
}
message = struct {
AllianceStation string
Teams map[string]*Team
Rankings map[string]*Ranking
}{station, map[string]*Team{"R1": mainArena.AllianceStations["R1"].team,
"R2": mainArena.AllianceStations["R2"].team, "R3": mainArena.AllianceStations["R3"].team,
"B1": mainArena.AllianceStations["B1"].team, "B2": mainArena.AllianceStations["B2"].team,
"B3": mainArena.AllianceStations["B3"].team}, rankings}
}{station, map[string]*Team{"R1": mainArena.AllianceStations["R1"].Team,
"R2": mainArena.AllianceStations["R2"].Team, "R3": mainArena.AllianceStations["R3"].Team,
"B1": mainArena.AllianceStations["B1"].Team, "B2": mainArena.AllianceStations["B2"].Team,
"B3": mainArena.AllianceStations["B3"].Team}, rankings}
case _, ok := <-robotStatusListener:
if !ok {
return

View File

@@ -73,9 +73,9 @@ func AnnouncerDisplayWebsocketHandler(w http.ResponseWriter, r *http.Request) {
Blue2 *Team
Blue3 *Team
}{mainArena.currentMatch.CapitalizedType(), mainArena.currentMatch.DisplayName,
mainArena.AllianceStations["R1"].team, mainArena.AllianceStations["R2"].team,
mainArena.AllianceStations["R3"].team, mainArena.AllianceStations["B1"].team,
mainArena.AllianceStations["B2"].team, mainArena.AllianceStations["B3"].team}
mainArena.AllianceStations["R1"].Team, mainArena.AllianceStations["R2"].Team,
mainArena.AllianceStations["R3"].Team, mainArena.AllianceStations["B1"].Team,
mainArena.AllianceStations["B2"].Team, mainArena.AllianceStations["B3"].Team}
err = websocket.Write("setMatch", data)
if err != nil {
log.Printf("Websocket error: %s", err)
@@ -123,9 +123,9 @@ func AnnouncerDisplayWebsocketHandler(w http.ResponseWriter, r *http.Request) {
Blue2 *Team
Blue3 *Team
}{mainArena.currentMatch.CapitalizedType(), mainArena.currentMatch.DisplayName,
mainArena.AllianceStations["R1"].team, mainArena.AllianceStations["R2"].team,
mainArena.AllianceStations["R3"].team, mainArena.AllianceStations["B1"].team,
mainArena.AllianceStations["B2"].team, mainArena.AllianceStations["B3"].team}
mainArena.AllianceStations["R1"].Team, mainArena.AllianceStations["R2"].Team,
mainArena.AllianceStations["R3"].Team, mainArena.AllianceStations["B1"].Team,
mainArena.AllianceStations["B2"].Team, mainArena.AllianceStations["B3"].Team}
case matchTimeSec, ok := <-matchTimeListener:
if !ok {
return

View File

@@ -32,7 +32,7 @@ type AllianceStation struct {
DsConn *DriverStationConnection
EmergencyStop bool
Bypass bool
team *Team
Team *Team
}
// Match period timings.
@@ -161,12 +161,13 @@ func (arena *Arena) AssignTeam(teamId int, station string) error {
}
if dsConn != nil {
dsConn.Close()
arena.AllianceStations[station].team = nil
arena.AllianceStations[station].Team = nil
arena.AllianceStations[station].DsConn = nil
}
// Leave the station empty if the team number is zero.
if teamId == 0 {
arena.AllianceStations[station].Team = nil
return nil
}
@@ -179,7 +180,7 @@ func (arena *Arena) AssignTeam(teamId int, station string) error {
team = &Team{Id: teamId}
}
arena.AllianceStations[station].team = team
arena.AllianceStations[station].Team = team
return nil
}
@@ -292,17 +293,17 @@ func (arena *Arena) SubstituteTeam(teamId int, station string) error {
func (arena *Arena) SetupNetwork() {
if eventSettings.NetworkSecurityEnabled {
go func() {
err := ConfigureTeamWifi(arena.AllianceStations["R1"].team, arena.AllianceStations["R2"].team,
arena.AllianceStations["R3"].team, arena.AllianceStations["B1"].team,
arena.AllianceStations["B2"].team, arena.AllianceStations["B3"].team)
err := ConfigureTeamWifi(arena.AllianceStations["R1"].Team, arena.AllianceStations["R2"].Team,
arena.AllianceStations["R3"].Team, arena.AllianceStations["B1"].Team,
arena.AllianceStations["B2"].Team, arena.AllianceStations["B3"].Team)
if err != nil {
log.Printf("Failed to configure team WiFi: %s", err.Error())
}
}()
go func() {
err := ConfigureTeamEthernet(arena.AllianceStations["R1"].team, arena.AllianceStations["R2"].team,
arena.AllianceStations["R3"].team, arena.AllianceStations["B1"].team,
arena.AllianceStations["B2"].team, arena.AllianceStations["B3"].team)
err := ConfigureTeamEthernet(arena.AllianceStations["R1"].Team, arena.AllianceStations["R2"].Team,
arena.AllianceStations["R3"].Team, arena.AllianceStations["B1"].Team,
arena.AllianceStations["B2"].Team, arena.AllianceStations["B3"].Team)
if err != nil {
log.Printf("Failed to configure team Ethernet: %s", err.Error())
}
@@ -513,7 +514,7 @@ func (arena *Arena) sendDsPacket(auto bool, enabled bool) {
dsConn.Enabled = enabled && !allianceStation.EmergencyStop && !allianceStation.Bypass
err := dsConn.Update()
if err != nil {
log.Printf("Unable to send driver station packet for team %d.", allianceStation.team.Id)
log.Printf("Unable to send driver station packet for team %d.", allianceStation.Team.Id)
}
}
}
@@ -562,7 +563,7 @@ func (arena *Arena) handleLighting() {
// in the current match.
func (arena *Arena) getAssignedAllianceStation(teamId int) string {
for station, allianceStation := range arena.AllianceStations {
if allianceStation.team != nil && allianceStation.team.Id == teamId {
if allianceStation.Team != nil && allianceStation.Team.Id == teamId {
return station
}
}

View File

@@ -28,27 +28,27 @@ func TestAssignTeam(t *testing.T) {
err = mainArena.AssignTeam(254, "B1")
assert.Nil(t, err)
assert.Equal(t, team, *mainArena.AllianceStations["B1"].team)
assert.Equal(t, team, *mainArena.AllianceStations["B1"].Team)
dummyDs := &DriverStationConnection{TeamId: 254}
mainArena.AllianceStations["B1"].DsConn = dummyDs
// Nothing should happen if the same team is assigned to the same station.
err = mainArena.AssignTeam(254, "B1")
assert.Nil(t, err)
assert.Equal(t, team, *mainArena.AllianceStations["B1"].team)
assert.Equal(t, team, *mainArena.AllianceStations["B1"].Team)
assert.NotNil(t, mainArena.AllianceStations["B1"])
assert.Equal(t, dummyDs, mainArena.AllianceStations["B1"].DsConn) // Pointer equality
// Test reassignment to another team.
err = mainArena.AssignTeam(1114, "B1")
assert.Nil(t, err)
assert.NotEqual(t, team, *mainArena.AllianceStations["B1"].team)
assert.NotEqual(t, team, *mainArena.AllianceStations["B1"].Team)
assert.Nil(t, mainArena.AllianceStations["B1"].DsConn)
// Check assigning zero as the team number.
err = mainArena.AssignTeam(0, "R2")
assert.Nil(t, err)
assert.Nil(t, mainArena.AllianceStations["R2"].team)
assert.Nil(t, mainArena.AllianceStations["R2"].Team)
assert.Nil(t, mainArena.AllianceStations["R2"].DsConn)
// Check assigning to a non-existent station.
@@ -451,7 +451,7 @@ func TestSubstituteTeam(t *testing.T) {
err = mainArena.SubstituteTeam(101, "B1")
assert.Nil(t, err)
assert.Equal(t, 101, mainArena.currentMatch.Blue1)
assert.Equal(t, 101, mainArena.AllianceStations["B1"].team.Id)
assert.Equal(t, 101, mainArena.AllianceStations["B1"].Team.Id)
err = mainArena.AssignTeam(104, "R4")
if assert.NotNil(t, err) {
assert.Contains(t, err.Error(), "Invalid alliance station")
@@ -464,7 +464,7 @@ func TestSubstituteTeam(t *testing.T) {
err = mainArena.SubstituteTeam(107, "R1")
assert.Nil(t, err)
assert.Equal(t, 107, mainArena.currentMatch.Red1)
assert.Equal(t, 107, mainArena.AllianceStations["R1"].team.Id)
assert.Equal(t, 107, mainArena.AllianceStations["R1"].Team.Id)
CommitMatchScore(mainArena.currentMatch, &MatchResult{MatchId: mainArena.currentMatch.Id}, false)
match2, _ := db.GetMatchById(match.Id)
assert.Equal(t, 107, match2.Red1)

View File

@@ -79,7 +79,7 @@ func ListenForDsUdpPackets() {
var dsConn *DriverStationConnection
for _, allianceStation := range mainArena.AllianceStations {
if allianceStation.team != nil && allianceStation.team.Id == teamId {
if allianceStation.Team != nil && allianceStation.Team.Id == teamId {
dsConn = allianceStation.DsConn
break
}

View File

@@ -30,7 +30,7 @@ func TestEncodeControlPacket(t *testing.T) {
assert.Equal(t, byte(0), data[5])
assert.Equal(t, byte(0), data[6])
assert.Equal(t, byte(0), data[20])
assert.Equal(t, byte(150), data[21])
assert.Equal(t, byte(15), data[21])
// Check the different alliance station values.
dsConn.AllianceStation = "R2"
@@ -100,7 +100,7 @@ func TestEncodeControlPacket(t *testing.T) {
mainArena.MatchState = AUTO_PERIOD
mainArena.matchStartTime = time.Now().Add(-time.Duration(4 * time.Second))
data = dsConn.encodeControlPacket()
assert.Equal(t, byte(146), data[21])
assert.Equal(t, byte(11), data[21])
mainArena.MatchState = PAUSE_PERIOD
mainArena.matchStartTime = time.Now().Add(-time.Duration(16 * time.Second))
data = dsConn.encodeControlPacket()

View File

@@ -42,27 +42,27 @@ func RefereeDisplayHandler(w http.ResponseWriter, r *http.Request) {
match := mainArena.currentMatch
matchType := match.CapitalizedType()
red1 := mainArena.AllianceStations["R1"].team
red1 := mainArena.AllianceStations["R1"].Team
if red1 == nil {
red1 = &Team{}
}
red2 := mainArena.AllianceStations["R2"].team
red2 := mainArena.AllianceStations["R2"].Team
if red2 == nil {
red2 = &Team{}
}
red3 := mainArena.AllianceStations["R3"].team
red3 := mainArena.AllianceStations["R3"].Team
if red3 == nil {
red3 = &Team{}
}
blue1 := mainArena.AllianceStations["B1"].team
blue1 := mainArena.AllianceStations["B1"].Team
if blue1 == nil {
blue1 = &Team{}
}
blue2 := mainArena.AllianceStations["B2"].team
blue2 := mainArena.AllianceStations["B2"].Team
if blue2 == nil {
blue2 = &Team{}
}
blue3 := mainArena.AllianceStations["B3"].team
blue3 := mainArena.AllianceStations["B3"].Team
if blue3 == nil {
blue3 = &Team{}
}

View File

@@ -10,9 +10,14 @@ var websocket;
var handleStatus = function(data) {
// Update the team status view.
$.each(data.AllianceStations, function(station, stationStatus) {
if (stationStatus.Team) {
$("#status" + station + " .team").text(stationStatus.Team.Id);
} else {
$("#status" + station + " .team").text("");
}
if (stationStatus.DsConn) {
var dsConn = stationStatus.DsConn;
$("#status" + station + " .team").text(stationStatus.DsConn.TeamId);
$("#status" + station + " .ds-status").attr("data-status-ok", dsConn.DsLinked);
$("#status" + station + " .ds-status").text(dsConn.MBpsToRobot.toFixed(1) + "/" + dsConn.MBpsFromRobot.toFixed(1));
$("#status" + station + " .robot-status").attr("data-status-ok", dsConn.RobotLinked);