Don't start a match unless all robots are connected.

This commit is contained in:
Patrick Fairbank
2014-07-04 17:47:28 -07:00
parent 576bccacd3
commit 118619d477
2 changed files with 106 additions and 3 deletions

View File

@@ -67,6 +67,7 @@ func (arena *Arena) AssignTeam(teamId int, station string) error {
if _, ok := arena.allianceStations[station]; !ok {
return fmt.Errorf("Invalid alliance station '%s'.", station)
}
// Do nothing if the station is already assigned to the requested team.
dsConn := arena.allianceStations[station].driverStationConnection
if dsConn != nil && dsConn.TeamId == teamId {
@@ -145,6 +146,18 @@ func (arena *Arena) StartMatch() error {
if arena.currentMatch == nil {
return fmt.Errorf("Cannot start match when no match is loaded.")
}
for _, allianceStation := range arena.allianceStations {
if allianceStation.emergencyStop {
return fmt.Errorf("Cannot start match while an emergency stop is active.")
}
if !allianceStation.bypass {
dsConn := allianceStation.driverStationConnection
if dsConn == nil || !dsConn.DriverStationStatus.RobotLinked {
return fmt.Errorf("Cannot start match until all robots are connected or bypassed.")
}
}
}
arena.matchState = START_MATCH
return nil
}

View File

@@ -71,8 +71,7 @@ func TestArenaMatchFlow(t *testing.T) {
db, err = OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
err = db.CreateTeam(&Team{Id: 254})
assert.Nil(t, err)
db.CreateTeam(&Team{Id: 254})
mainArena.Setup()
err = mainArena.AssignTeam(254, "B3")
assert.Nil(t, err)
@@ -91,7 +90,14 @@ func TestArenaMatchFlow(t *testing.T) {
assert.Equal(t, lastPacketCount+1, mainArena.allianceStations["B3"].driverStationConnection.packetCount)
// Check match start, autonomous and transition to teleop.
mainArena.StartMatch()
mainArena.allianceStations["R1"].bypass = true
mainArena.allianceStations["R2"].bypass = true
mainArena.allianceStations["R3"].bypass = true
mainArena.allianceStations["B1"].bypass = true
mainArena.allianceStations["B2"].bypass = true
mainArena.allianceStations["B3"].driverStationConnection.DriverStationStatus.RobotLinked = true
err = mainArena.StartMatch()
assert.Nil(t, err)
mainArena.Update()
assert.Equal(t, AUTO_PERIOD, mainArena.matchState)
assert.Equal(t, true, mainArena.allianceStations["B3"].driverStationConnection.Auto)
@@ -176,6 +182,12 @@ func TestArenaMatchFlow(t *testing.T) {
func TestArenaStateEnforcement(t *testing.T) {
mainArena.Setup()
mainArena.allianceStations["R1"].bypass = true
mainArena.allianceStations["R2"].bypass = true
mainArena.allianceStations["R3"].bypass = true
mainArena.allianceStations["B1"].bypass = true
mainArena.allianceStations["B2"].bypass = true
mainArena.allianceStations["B3"].bypass = true
err := mainArena.LoadMatch(new(Match))
assert.Nil(t, err)
@@ -268,3 +280,81 @@ func TestArenaStateEnforcement(t *testing.T) {
err = mainArena.LoadMatch(new(Match))
assert.Nil(t, err)
}
func TestMatchStartRobotLinkEnforcement(t *testing.T) {
clearDb()
defer clearDb()
var err error
db, err = OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
db.CreateTeam(&Team{Id: 101})
db.CreateTeam(&Team{Id: 102})
db.CreateTeam(&Team{Id: 103})
db.CreateTeam(&Team{Id: 104})
db.CreateTeam(&Team{Id: 105})
db.CreateTeam(&Team{Id: 106})
match := Match{Red1: 101, Red2: 102, Red3: 103, Blue1: 104, Blue2: 105, Blue3: 106}
db.CreateMatch(&match)
mainArena.Setup()
err = mainArena.LoadMatch(&match)
assert.Nil(t, err)
for _, station := range mainArena.allianceStations {
station.driverStationConnection.DriverStationStatus.RobotLinked = true
}
err = mainArena.StartMatch()
assert.Nil(t, err)
mainArena.matchState = PRE_MATCH
// Check with a single team e-stopped, not linked and bypassed.
mainArena.allianceStations["R1"].emergencyStop = true
err = mainArena.StartMatch()
if assert.NotNil(t, err) {
assert.Contains(t, err.Error(), "while an emergency stop is active")
}
mainArena.allianceStations["R1"].emergencyStop = false
mainArena.allianceStations["R1"].driverStationConnection.DriverStationStatus.RobotLinked = false
err = mainArena.StartMatch()
if assert.NotNil(t, err) {
assert.Contains(t, err.Error(), "until all robots are connected or bypassed")
}
mainArena.allianceStations["R1"].bypass = true
err = mainArena.StartMatch()
assert.Nil(t, err)
mainArena.allianceStations["R1"].bypass = false
mainArena.matchState = PRE_MATCH
// Check with a team missing.
err = mainArena.AssignTeam(0, "R1")
assert.Nil(t, err)
err = mainArena.StartMatch()
if assert.NotNil(t, err) {
assert.Contains(t, err.Error(), "until all robots are connected or bypassed")
}
mainArena.allianceStations["R1"].bypass = true
err = mainArena.StartMatch()
assert.Nil(t, err)
mainArena.matchState = PRE_MATCH
// Check with no teams present.
mainArena.LoadMatch(new(Match))
err = mainArena.StartMatch()
if assert.NotNil(t, err) {
assert.Contains(t, err.Error(), "until all robots are connected or bypassed")
}
mainArena.allianceStations["R1"].bypass = true
mainArena.allianceStations["R2"].bypass = true
mainArena.allianceStations["R3"].bypass = true
mainArena.allianceStations["B1"].bypass = true
mainArena.allianceStations["B2"].bypass = true
mainArena.allianceStations["B3"].bypass = true
mainArena.allianceStations["B3"].emergencyStop = true
err = mainArena.StartMatch()
if assert.NotNil(t, err) {
assert.Contains(t, err.Error(), "while an emergency stop is active")
}
mainArena.allianceStations["B3"].emergencyStop = false
err = mainArena.StartMatch()
assert.Nil(t, err)
}