Send match number in driver station packet (fixes #35).

This commit is contained in:
Patrick Fairbank
2017-09-02 13:53:47 -07:00
parent c25a2377b8
commit 13dd9dbb42
2 changed files with 35 additions and 5 deletions

View File

@@ -175,7 +175,7 @@ func (dsConn *DriverStationConnection) encodeControlPacket(arena *Arena) [22]byt
// Alliance station.
packet[5] = allianceStationPositionMap[dsConn.AllianceStation]
// Match information.
// Match type.
match := arena.CurrentMatch
if match.Type == "practice" {
packet[6] = 1
@@ -186,10 +186,21 @@ func (dsConn *DriverStationConnection) encodeControlPacket(arena *Arena) [22]byt
} else {
packet[6] = 0
}
// TODO(patrick): Implement if it ever becomes necessary; the official FMS has a different concept of
// match numbers so it's hard to translate.
packet[7] = 0 // Match number
packet[8] = 1 // Match number
// Match number.
if match.Type == "practice" || match.Type == "qualification" {
matchNumber, _ := strconv.Atoi(match.DisplayName)
packet[7] = byte(matchNumber >> 8)
packet[8] = byte(matchNumber & 0xff)
} else if match.Type == "elimination" {
// E.g. Quarter-final 3, match 1 will be numbered 431.
matchNumber := match.ElimRound*100 + match.ElimGroup*10 + match.ElimInstance
packet[7] = byte(matchNumber >> 8)
packet[8] = byte(matchNumber & 0xff)
} else {
packet[7] = 0
packet[8] = 1
}
packet[9] = 1 // Match repeat number
// Current time.

View File

@@ -89,6 +89,25 @@ func TestEncodeControlPacket(t *testing.T) {
data = dsConn.encodeControlPacket(arena)
assert.Equal(t, byte(3), data[6])
// Check match numbers.
arena.CurrentMatch.Type = "practice"
arena.CurrentMatch.DisplayName = "42"
data = dsConn.encodeControlPacket(arena)
assert.Equal(t, byte(0), data[7])
assert.Equal(t, byte(42), data[8])
arena.CurrentMatch.Type = "qualification"
arena.CurrentMatch.DisplayName = "258"
data = dsConn.encodeControlPacket(arena)
assert.Equal(t, byte(1), data[7])
assert.Equal(t, byte(2), data[8])
arena.CurrentMatch.Type = "elimination"
arena.CurrentMatch.ElimRound = 8
arena.CurrentMatch.ElimGroup = 5
arena.CurrentMatch.ElimInstance = 2
data = dsConn.encodeControlPacket(arena)
assert.Equal(t, byte(3), data[7])
assert.Equal(t, byte(84), data[8])
// Check the countdown at different points during the match.
arena.MatchState = AutoPeriod
arena.MatchStartTime = time.Now().Add(-time.Duration(4 * time.Second))