From 13dd9dbb4282a119d0bd1ef53ea7b00328f237b3 Mon Sep 17 00:00:00 2001 From: Patrick Fairbank Date: Sat, 2 Sep 2017 13:53:47 -0700 Subject: [PATCH] Send match number in driver station packet (fixes #35). --- field/driver_station_connection.go | 21 ++++++++++++++++----- field/driver_station_connection_test.go | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/field/driver_station_connection.go b/field/driver_station_connection.go index def1ce1..5eca354 100644 --- a/field/driver_station_connection.go +++ b/field/driver_station_connection.go @@ -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. diff --git a/field/driver_station_connection_test.go b/field/driver_station_connection_test.go index 5975a26..c12661c 100644 --- a/field/driver_station_connection_test.go +++ b/field/driver_station_connection_test.go @@ -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))