Add starting quadrant and Auto balls to the scouting database

This patch makes sure that the starting quadrant data and the auto
balls that get picked actually make it into the database.

Signed-off-by: Philipp Schrader <philipp.schrader@gmail.com>
Change-Id: Icfbe31009913a7fa42b499c6d53fe07310e1e12a
diff --git a/scouting/db/db.go b/scouting/db/db.go
index 98cc788..d9bebc9 100644
--- a/scouting/db/db.go
+++ b/scouting/db/db.go
@@ -21,7 +21,10 @@
 }
 
 type Stats struct {
-	TeamNumber, MatchNumber                                      int32
+	TeamNumber, MatchNumber int32
+	StartingQuadrant        int32
+	AutoBallPickedUp        [5]bool
+	// TODO(phil): Re-order auto and teleop fields so auto comes first.
 	ShotsMissed, UpperGoalShots, LowerGoalShots                  int32
 	ShotsMissedAuto, UpperGoalAuto, LowerGoalAuto, PlayedDefense int32
 	Climbing                                                     int32
@@ -80,6 +83,12 @@
 		"id SERIAL PRIMARY KEY, " +
 		"TeamNumber INTEGER, " +
 		"MatchNumber INTEGER, " +
+		"StartingQuadrant INTEGER, " +
+		"AutoBall1PickedUp BOOLEAN, " +
+		"AutoBall2PickedUp BOOLEAN, " +
+		"AutoBall3PickedUp BOOLEAN, " +
+		"AutoBall4PickedUp BOOLEAN, " +
+		"AutoBall5PickedUp BOOLEAN, " +
 		"ShotsMissed INTEGER, " +
 		"UpperGoalShots INTEGER, " +
 		"LowerGoalShots INTEGER, " +
@@ -152,14 +161,20 @@
 func (database *Database) AddToMatch(m Match) error {
 	statement, err := database.Prepare("INSERT INTO team_match_stats(" +
 		"TeamNumber, MatchNumber, " +
+		"StartingQuadrant, " +
+		"AutoBall1PickedUp, AutoBall2PickedUp, AutoBall3PickedUp, " +
+		"AutoBall4PickedUp, AutoBall5PickedUp, " +
 		"ShotsMissed, UpperGoalShots, LowerGoalShots, " +
 		"ShotsMissedAuto, UpperGoalAuto, LowerGoalAuto, " +
 		"PlayedDefense, Climbing, CollectedBy) " +
 		"VALUES (" +
 		"$1, $2, " +
-		"$3, $4, $5, " +
-		"$6, $7, $8, " +
-		"$9, $10, $11) " +
+		"$3, " +
+		"$4, $5, $6, " +
+		"$7, $8, " +
+		"$9, $10, $11, " +
+		"$12, $13, $14, " +
+		"$15, $16, $17) " +
 		"RETURNING id")
 	if err != nil {
 		return errors.New(fmt.Sprint("Failed to prepare insertion into stats database: ", err))
@@ -168,7 +183,14 @@
 
 	var rowIds [6]int64
 	for i, TeamNumber := range []int32{m.R1, m.R2, m.R3, m.B1, m.B2, m.B3} {
-		row := statement.QueryRow(TeamNumber, m.MatchNumber, 0, 0, 0, 0, 0, 0, 0, 0, "")
+		row := statement.QueryRow(
+			TeamNumber, m.MatchNumber,
+			0,
+			false, false, false,
+			false, false,
+			0, 0, 0,
+			0, 0, 0,
+			0, 0, "")
 		err = row.Scan(&rowIds[i])
 		if err != nil {
 			return errors.New(fmt.Sprint("Failed to insert stats: ", err))
@@ -200,16 +222,23 @@
 func (database *Database) AddToStats(s Stats) error {
 	statement, err := database.Prepare("UPDATE team_match_stats SET " +
 		"TeamNumber = $1, MatchNumber = $2, " +
-		"ShotsMissed = $3, UpperGoalShots = $4, LowerGoalShots = $5, " +
-		"ShotsMissedAuto = $6, UpperGoalAuto = $7, LowerGoalAuto = $8, " +
-		"PlayedDefense = $9, Climbing = $10, CollectedBy = $11 " +
-		"WHERE MatchNumber = $12 AND TeamNumber = $13")
+		"StartingQuadrant = $3, " +
+		"AutoBall1PickedUp = $4, AutoBall2PickedUp = $5, AutoBall3PickedUp = $6, " +
+		"AutoBall4PickedUp = $7, AutoBall5PickedUp = $8, " +
+		"ShotsMissed = $9, UpperGoalShots = $10, LowerGoalShots = $11, " +
+		"ShotsMissedAuto = $12, UpperGoalAuto = $13, LowerGoalAuto = $14, " +
+		"PlayedDefense = $15, Climbing = $16, CollectedBy = $17 " +
+		"WHERE MatchNumber = $18 AND TeamNumber = $19")
 	if err != nil {
 		return errors.New(fmt.Sprint("Failed to prepare stats update statement: ", err))
 	}
 	defer statement.Close()
 
-	result, err := statement.Exec(s.TeamNumber, s.MatchNumber,
+	result, err := statement.Exec(
+		s.TeamNumber, s.MatchNumber,
+		s.StartingQuadrant,
+		s.AutoBallPickedUp[0], s.AutoBallPickedUp[1], s.AutoBallPickedUp[2],
+		s.AutoBallPickedUp[3], s.AutoBallPickedUp[4],
 		s.ShotsMissed, s.UpperGoalShots, s.LowerGoalShots,
 		s.ShotsMissedAuto, s.UpperGoalAuto, s.LowerGoalAuto,
 		s.PlayedDefense, s.Climbing, s.CollectedBy,
@@ -263,7 +292,11 @@
 	for rows.Next() {
 		var team Stats
 		var id int
-		err = rows.Scan(&id, &team.TeamNumber, &team.MatchNumber,
+		err = rows.Scan(&id,
+			&team.TeamNumber, &team.MatchNumber,
+			&team.StartingQuadrant,
+			&team.AutoBallPickedUp[0], &team.AutoBallPickedUp[1], &team.AutoBallPickedUp[2],
+			&team.AutoBallPickedUp[3], &team.AutoBallPickedUp[4],
 			&team.ShotsMissed, &team.UpperGoalShots, &team.LowerGoalShots,
 			&team.ShotsMissedAuto, &team.UpperGoalAuto, &team.LowerGoalAuto,
 			&team.PlayedDefense, &team.Climbing, &team.CollectedBy)
@@ -310,7 +343,11 @@
 	for rows.Next() {
 		var team Stats
 		var id int
-		err = rows.Scan(&id, &team.TeamNumber, &team.MatchNumber,
+		err = rows.Scan(&id,
+			&team.TeamNumber, &team.MatchNumber,
+			&team.StartingQuadrant,
+			&team.AutoBallPickedUp[0], &team.AutoBallPickedUp[1], &team.AutoBallPickedUp[2],
+			&team.AutoBallPickedUp[3], &team.AutoBallPickedUp[4],
 			&team.ShotsMissed, &team.UpperGoalShots, &team.LowerGoalShots,
 			&team.ShotsMissedAuto, &team.UpperGoalAuto, &team.LowerGoalAuto,
 			&team.PlayedDefense, &team.Climbing, &team.CollectedBy)
diff --git a/scouting/db/db_test.go b/scouting/db/db_test.go
index b06706d..c5bea5e 100644
--- a/scouting/db/db_test.go
+++ b/scouting/db/db_test.go
@@ -89,42 +89,54 @@
 	correct := []Stats{
 		Stats{
 			TeamNumber: 1236, MatchNumber: 7,
-			ShotsMissed: 9, UpperGoalShots: 5, LowerGoalShots: 4,
+			StartingQuadrant: 2,
+			AutoBallPickedUp: [5]bool{false, false, false, true, false},
+			ShotsMissed:      9, UpperGoalShots: 5, LowerGoalShots: 4,
 			ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
 			PlayedDefense: 2, Climbing: 3,
 			CollectedBy: "josh",
 		},
 		Stats{
 			TeamNumber: 1001, MatchNumber: 7,
-			ShotsMissed: 6, UpperGoalShots: 9, LowerGoalShots: 9,
+			StartingQuadrant: 3,
+			AutoBallPickedUp: [5]bool{true, false, true, true, false},
+			ShotsMissed:      6, UpperGoalShots: 9, LowerGoalShots: 9,
 			ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
 			PlayedDefense: 0, Climbing: 0,
 			CollectedBy: "rupert",
 		},
 		Stats{
 			TeamNumber: 777, MatchNumber: 7,
-			ShotsMissed: 5, UpperGoalShots: 7, LowerGoalShots: 12,
+			StartingQuadrant: 4,
+			AutoBallPickedUp: [5]bool{false, true, true, true, false},
+			ShotsMissed:      5, UpperGoalShots: 7, LowerGoalShots: 12,
 			ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
 			PlayedDefense: 0, Climbing: 0,
 			CollectedBy: "felix",
 		},
 		Stats{
 			TeamNumber: 1000, MatchNumber: 7,
-			ShotsMissed: 12, UpperGoalShots: 6, LowerGoalShots: 10,
+			StartingQuadrant: 1,
+			AutoBallPickedUp: [5]bool{false, false, false, false, false},
+			ShotsMissed:      12, UpperGoalShots: 6, LowerGoalShots: 10,
 			ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
 			PlayedDefense: 0, Climbing: 0,
 			CollectedBy: "thea",
 		},
 		Stats{
 			TeamNumber: 4321, MatchNumber: 7,
-			ShotsMissed: 14, UpperGoalShots: 12, LowerGoalShots: 3,
+			StartingQuadrant: 2,
+			AutoBallPickedUp: [5]bool{true, false, false, false, false},
+			ShotsMissed:      14, UpperGoalShots: 12, LowerGoalShots: 3,
 			ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
 			PlayedDefense: 0, Climbing: 0,
 			CollectedBy: "amy",
 		},
 		Stats{
 			TeamNumber: 1234, MatchNumber: 7,
-			ShotsMissed: 3, UpperGoalShots: 4, LowerGoalShots: 0,
+			StartingQuadrant: 3,
+			AutoBallPickedUp: [5]bool{false, false, false, false, true},
+			ShotsMissed:      3, UpperGoalShots: 4, LowerGoalShots: 0,
 			ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
 			PlayedDefense: 0, Climbing: 0,
 			CollectedBy: "beth",
@@ -195,36 +207,48 @@
 	testDatabase := []Stats{
 		Stats{
 			TeamNumber: 1235, MatchNumber: 94,
-			ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
+			StartingQuadrant: 1,
+			AutoBallPickedUp: [5]bool{false, false, false, false, false},
+			ShotsMissed:      2, UpperGoalShots: 2, LowerGoalShots: 2,
 			ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
 			PlayedDefense: 2, Climbing: 2},
 		Stats{
 			TeamNumber: 1234, MatchNumber: 94,
-			ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
+			StartingQuadrant: 2,
+			AutoBallPickedUp: [5]bool{false, false, false, false, true},
+			ShotsMissed:      4, UpperGoalShots: 4, LowerGoalShots: 4,
 			ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
 			PlayedDefense: 7, Climbing: 2,
 		},
 		Stats{
 			TeamNumber: 1233, MatchNumber: 94,
-			ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
+			StartingQuadrant: 3,
+			AutoBallPickedUp: [5]bool{false, false, false, false, false},
+			ShotsMissed:      3, UpperGoalShots: 3, LowerGoalShots: 3,
 			ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
 			PlayedDefense: 3, Climbing: 3,
 		},
 		Stats{
 			TeamNumber: 1232, MatchNumber: 94,
-			ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
+			StartingQuadrant: 2,
+			AutoBallPickedUp: [5]bool{true, false, false, false, true},
+			ShotsMissed:      5, UpperGoalShots: 5, LowerGoalShots: 5,
 			ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
 			PlayedDefense: 7, Climbing: 1,
 		},
 		Stats{
 			TeamNumber: 1231, MatchNumber: 94,
-			ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
+			StartingQuadrant: 3,
+			AutoBallPickedUp: [5]bool{false, false, true, false, false},
+			ShotsMissed:      6, UpperGoalShots: 6, LowerGoalShots: 6,
 			ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
 			PlayedDefense: 7, Climbing: 1,
 		},
 		Stats{
 			TeamNumber: 1239, MatchNumber: 94,
-			ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
+			StartingQuadrant: 4,
+			AutoBallPickedUp: [5]bool{false, true, true, false, false},
+			ShotsMissed:      7, UpperGoalShots: 7, LowerGoalShots: 7,
 			ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
 			PlayedDefense: 7, Climbing: 1,
 		},
@@ -237,13 +261,15 @@
 
 	for i := 0; i < len(testDatabase); i++ {
 		err = fixture.db.AddToStats(testDatabase[i])
-		check(t, err, fmt.Sprint("Failed to add stats", i))
+		check(t, err, fmt.Sprint("Failed to add stats ", i))
 	}
 
 	correct := []Stats{
 		Stats{
 			TeamNumber: 1235, MatchNumber: 94,
-			ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
+			StartingQuadrant: 1,
+			AutoBallPickedUp: [5]bool{false, false, false, false, false},
+			ShotsMissed:      2, UpperGoalShots: 2, LowerGoalShots: 2,
 			ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
 			PlayedDefense: 2, Climbing: 2,
 		},
@@ -309,37 +335,48 @@
 	correct := []Stats{
 		Stats{
 			TeamNumber: 1235, MatchNumber: 94,
-			ShotsMissed: 2, UpperGoalShots: 2, LowerGoalShots: 2,
+			StartingQuadrant: 1,
+			AutoBallPickedUp: [5]bool{false, false, false, false, false},
+			ShotsMissed:      2, UpperGoalShots: 2, LowerGoalShots: 2,
 			ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
-			PlayedDefense: 2, Climbing: 2,
-		},
+			PlayedDefense: 2, Climbing: 2},
 		Stats{
 			TeamNumber: 1236, MatchNumber: 94,
-			ShotsMissed: 4, UpperGoalShots: 4, LowerGoalShots: 4,
+			StartingQuadrant: 2,
+			AutoBallPickedUp: [5]bool{false, false, false, false, true},
+			ShotsMissed:      4, UpperGoalShots: 4, LowerGoalShots: 4,
 			ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
 			PlayedDefense: 7, Climbing: 2,
 		},
 		Stats{
 			TeamNumber: 1237, MatchNumber: 94,
-			ShotsMissed: 3, UpperGoalShots: 3, LowerGoalShots: 3,
+			StartingQuadrant: 3,
+			AutoBallPickedUp: [5]bool{false, false, false, false, false},
+			ShotsMissed:      3, UpperGoalShots: 3, LowerGoalShots: 3,
 			ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
 			PlayedDefense: 3, Climbing: 3,
 		},
 		Stats{
 			TeamNumber: 1238, MatchNumber: 94,
-			ShotsMissed: 5, UpperGoalShots: 5, LowerGoalShots: 5,
+			StartingQuadrant: 2,
+			AutoBallPickedUp: [5]bool{true, false, false, false, true},
+			ShotsMissed:      5, UpperGoalShots: 5, LowerGoalShots: 5,
 			ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
 			PlayedDefense: 7, Climbing: 1,
 		},
 		Stats{
 			TeamNumber: 1239, MatchNumber: 94,
-			ShotsMissed: 6, UpperGoalShots: 6, LowerGoalShots: 6,
+			StartingQuadrant: 3,
+			AutoBallPickedUp: [5]bool{false, false, true, false, false},
+			ShotsMissed:      6, UpperGoalShots: 6, LowerGoalShots: 6,
 			ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
 			PlayedDefense: 7, Climbing: 1,
 		},
 		Stats{
 			TeamNumber: 1233, MatchNumber: 94,
-			ShotsMissed: 7, UpperGoalShots: 7, LowerGoalShots: 7,
+			StartingQuadrant: 4,
+			AutoBallPickedUp: [5]bool{false, true, true, false, false},
+			ShotsMissed:      7, UpperGoalShots: 7, LowerGoalShots: 7,
 			ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
 			PlayedDefense: 7, Climbing: 1,
 		},
@@ -352,7 +389,7 @@
 
 	for i := 0; i < len(correct); i++ {
 		err = fixture.db.AddToStats(correct[i])
-		check(t, err, fmt.Sprint("Failed to add stats", i))
+		check(t, err, fmt.Sprint("Failed to add stats ", i))
 	}
 
 	got, err := fixture.db.ReturnStats()
diff --git a/scouting/webserver/requests/debug/cli/cli_test.py b/scouting/webserver/requests/debug/cli/cli_test.py
index b20703b..8bebc69 100644
--- a/scouting/webserver/requests/debug/cli/cli_test.py
+++ b/scouting/webserver/requests/debug/cli/cli_test.py
@@ -62,6 +62,12 @@
         json_path = write_json_request({
             "team": 100,
             "match": 1,
+            "starting_quadrant": 3,
+            "auto_ball_1": True,
+            "auto_ball_2": False,
+            "auto_ball_3": False,
+            "auto_ball_4": False,
+            "auto_ball_5": True,
             "missed_shots_auto": 10,
             "upper_goal_auto": 11,
             "lower_goal_auto": 12,
@@ -92,7 +98,13 @@
             LowerGoalTele: (int32) 15,
             DefenseRating: (int32) 3,
             Climbing: (int32) 1,
-            CollectedBy: (string) (len=9) "debug_cli"
+            CollectedBy: (string) (len=9) "debug_cli",
+            AutoBall1: (bool) true,
+            AutoBall2: (bool) false,
+            AutoBall3: (bool) false,
+            AutoBall4: (bool) false,
+            AutoBall5: (bool) true,
+            StartingQuadrant: (int32) 3
             }"""), stdout)
 
     def test_request_all_matches(self):
diff --git a/scouting/webserver/requests/messages/request_data_scouting_response.fbs b/scouting/webserver/requests/messages/request_data_scouting_response.fbs
index 5703a07..7d91cb7 100644
--- a/scouting/webserver/requests/messages/request_data_scouting_response.fbs
+++ b/scouting/webserver/requests/messages/request_data_scouting_response.fbs
@@ -3,6 +3,7 @@
 table Stats {
     team:int (id: 0);
     match:int (id: 1);
+
     missed_shots_auto:int (id: 2);
     upper_goal_auto:int (id:3);
     lower_goal_auto:int (id:4);
@@ -12,6 +13,15 @@
     defense_rating:int (id:8);
     climbing:int (id:9);
     collected_by:string (id:10);
+
+    auto_ball_1:bool (id:11);
+    auto_ball_2:bool (id:12);
+    auto_ball_3:bool (id:13);
+    auto_ball_4:bool (id:14);
+    auto_ball_5:bool (id:15);
+    // The quadrant that the robot starts in for autonomous mode.
+    // Valid values are 1 through 4.
+    starting_quadrant: int (id:16);
 }
 
 table RequestDataScoutingResponse {
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index 5a469b5..13d7396 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -142,8 +142,13 @@
 	}
 
 	stats := db.Stats{
-		TeamNumber:      request.Team(),
-		MatchNumber:     request.Match(),
+		TeamNumber:       request.Team(),
+		MatchNumber:      request.Match(),
+		StartingQuadrant: request.StartingQuadrant(),
+		AutoBallPickedUp: [5]bool{
+			request.AutoBall1(), request.AutoBall2(), request.AutoBall3(),
+			request.AutoBall4(), request.AutoBall5(),
+		},
 		ShotsMissedAuto: request.MissedShotsAuto(),
 		UpperGoalAuto:   request.UpperGoalAuto(),
 		LowerGoalAuto:   request.LowerGoalAuto(),
@@ -155,9 +160,17 @@
 		CollectedBy:     username,
 	}
 
+	// Do some error checking.
+	if stats.StartingQuadrant < 1 || stats.StartingQuadrant > 4 {
+		respondWithError(w, http.StatusBadRequest, fmt.Sprint(
+			"Invalid starting_quadrant field value of ", stats.StartingQuadrant))
+		return
+	}
+
 	err = handler.db.AddToStats(stats)
 	if err != nil {
 		respondWithError(w, http.StatusInternalServerError, fmt.Sprint("Failed to submit datascouting data: ", err))
+		return
 	}
 
 	builder := flatbuffers.NewBuilder(50 * 1024)
@@ -316,17 +329,23 @@
 	var response RequestDataScoutingResponseT
 	for _, stat := range stats {
 		response.StatsList = append(response.StatsList, &request_data_scouting_response.StatsT{
-			Team:            stat.TeamNumber,
-			Match:           stat.MatchNumber,
-			MissedShotsAuto: stat.ShotsMissedAuto,
-			UpperGoalAuto:   stat.UpperGoalAuto,
-			LowerGoalAuto:   stat.LowerGoalAuto,
-			MissedShotsTele: stat.ShotsMissed,
-			UpperGoalTele:   stat.UpperGoalShots,
-			LowerGoalTele:   stat.LowerGoalShots,
-			DefenseRating:   stat.PlayedDefense,
-			Climbing:        stat.Climbing,
-			CollectedBy:     stat.CollectedBy,
+			Team:             stat.TeamNumber,
+			Match:            stat.MatchNumber,
+			StartingQuadrant: stat.StartingQuadrant,
+			AutoBall1:        stat.AutoBallPickedUp[0],
+			AutoBall2:        stat.AutoBallPickedUp[1],
+			AutoBall3:        stat.AutoBallPickedUp[2],
+			AutoBall4:        stat.AutoBallPickedUp[3],
+			AutoBall5:        stat.AutoBallPickedUp[4],
+			MissedShotsAuto:  stat.ShotsMissedAuto,
+			UpperGoalAuto:    stat.UpperGoalAuto,
+			LowerGoalAuto:    stat.LowerGoalAuto,
+			MissedShotsTele:  stat.ShotsMissed,
+			UpperGoalTele:    stat.UpperGoalShots,
+			LowerGoalTele:    stat.LowerGoalShots,
+			DefenseRating:    stat.PlayedDefense,
+			Climbing:         stat.Climbing,
+			CollectedBy:      stat.CollectedBy,
 		})
 	}
 
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index c716b44..12d918b 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -82,16 +82,22 @@
 
 	builder := flatbuffers.NewBuilder(1024)
 	builder.Finish((&submit_data_scouting.SubmitDataScoutingT{
-		Team:            971,
-		Match:           1,
-		MissedShotsAuto: 9971,
-		UpperGoalAuto:   9971,
-		LowerGoalAuto:   9971,
-		MissedShotsTele: 9971,
-		UpperGoalTele:   9971,
-		LowerGoalTele:   9971,
-		DefenseRating:   9971,
-		Climbing:        9971,
+		Team:             971,
+		Match:            1,
+		StartingQuadrant: 2,
+		AutoBall1:        true,
+		AutoBall2:        false,
+		AutoBall3:        false,
+		AutoBall4:        false,
+		AutoBall5:        false,
+		MissedShotsAuto:  9971,
+		UpperGoalAuto:    9971,
+		LowerGoalAuto:    9971,
+		MissedShotsTele:  9971,
+		UpperGoalTele:    9971,
+		LowerGoalTele:    9971,
+		DefenseRating:    9971,
+		Climbing:         9971,
 	}).Pack(builder))
 
 	response, err := debug.SubmitDataScouting("http://localhost:8080", builder.FinishedBytes())
@@ -221,14 +227,18 @@
 		stats: []db.Stats{
 			{
 				TeamNumber: 971, MatchNumber: 1,
-				ShotsMissed: 1, UpperGoalShots: 2, LowerGoalShots: 3,
+				StartingQuadrant: 1,
+				AutoBallPickedUp: [5]bool{true, false, false, false, true},
+				ShotsMissed:      1, UpperGoalShots: 2, LowerGoalShots: 3,
 				ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
 				PlayedDefense: 7, Climbing: 8,
 				CollectedBy: "john",
 			},
 			{
 				TeamNumber: 972, MatchNumber: 1,
-				ShotsMissed: 2, UpperGoalShots: 3, LowerGoalShots: 4,
+				StartingQuadrant: 2,
+				AutoBallPickedUp: [5]bool{false, false, true, false, false},
+				ShotsMissed:      2, UpperGoalShots: 3, LowerGoalShots: 4,
 				ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
 				PlayedDefense: 8, Climbing: 9,
 				CollectedBy: "andrea",
@@ -255,12 +265,18 @@
 			// MissedShotsTele, UpperGoalTele, LowerGoalTele,
 			// DefenseRating, Climbing,
 			// CollectedBy,
+			// AutoBall1, AutoBall2, AutoBall3,
+			// AutoBall4, AutoBall5,
+			// StartingQuadrant,
 			{
 				971, 1,
 				4, 5, 6,
 				1, 2, 3,
 				7, 8,
 				"john",
+				true, false, false,
+				false, true,
+				1,
 			},
 			{
 				972, 1,
@@ -268,6 +284,9 @@
 				2, 3, 4,
 				8, 9,
 				"andrea",
+				false, false, true,
+				false, false,
+				2,
 			},
 		},
 	}