Project 1: Configure a QRScout Form for REEFSCAPE
Build a real, scannable QRScout config.json with counters, booleans, and selects for the 2025 REEFSCAPE game, then test the full scan-to-spreadsheet pipeline.
Sign in to track progress, earn XP, and save lessons.
Goal
Produce a working config.json for QRScout (FRC Team 2713, Red Hawk Robotics) that a stand scout can fill in during a REEFSCAPE match, and that encodes everything into one scannable QR code. QRScout runs offline in a browser at https://frc2713.github.io/QRScout/.
The fields you need (from the official REEFSCAPE manual)
REEFSCAPE robots score Coral (PVC pipe) on four levels and Algae (balls) into the Processor or Net, then climb a Cage. Coral is worth more in AUTO than TELEOP: AUTO L1=3, L2=4, L3=6, L4=7; TELEOP L1=2, L2=3, L3=4, L4=5. Algae in the Net=4, in the Processor=6. Leave (auto)=3, Park=2, shallow Cage=6, deep Cage=12. Because the auto/teleop coral values differ, your form must split coral counters by phase so each can be weighted correctly later.
A minimal config.json
{
"$schema": "../schema.json",
"title": "2713 Reefscape Scout",
"page_title": "REEFSCAPE Match Scouting",
"delimiter": "\t",
"sections": [
{
"name": "Pre-Match",
"fields": [
{ "title": "Scout Name", "type": "text", "code": "scoutName",
"required": true, "formResetBehavior": "preserve" },
{ "title": "Match #", "type": "number", "code": "matchNumber",
"required": true, "formResetBehavior": "increment" },
{ "title": "Team #", "type": "TBA-team-and-robot", "code": "teamNumber",
"required": true, "formResetBehavior": "reset" }
]
},
{
"name": "Auto",
"fields": [
{ "title": "Left Start Line", "type": "boolean", "code": "autoLeave",
"defaultValue": false, "formResetBehavior": "reset" },
{ "title": "Auto Coral L4", "type": "counter", "code": "autoCoralL4",
"defaultValue": 0, "formResetBehavior": "reset" },
{ "title": "Auto Coral L1", "type": "counter", "code": "autoCoralL1",
"defaultValue": 0, "formResetBehavior": "reset" }
]
},
{
"name": "Teleop",
"fields": [
{ "title": "Teleop Coral L4", "type": "counter", "code": "telCoralL4",
"defaultValue": 0, "formResetBehavior": "reset" },
{ "title": "Algae Processor", "type": "counter", "code": "algaeProc",
"defaultValue": 0, "formResetBehavior": "reset" },
{ "title": "Endgame", "type": "select", "code": "endgame",
"choices": { "none": "None", "park": "Park",
"shallow": "Shallow Cage", "deep": "Deep Cage" },
"defaultValue": "none", "formResetBehavior": "reset" }
]
}
]
}
Key design choices that prevent real errors:
formResetBehavior: "preserve"on Scout Name keeps the scout's name between matches;"increment"on Match # auto-advances;"reset"clears scoring counters every match. These three values are the only ones QRScout accepts.- Use the
TBA-team-and-robotfield type so scouts pick the team from the pre-loaded match schedule (shown as "Team 2713 (Red 1)") instead of typing a 4-digit number, the single biggest source of mislabeled data. - The
delimiteris a tab (\t), so when you scan the QR, the values drop into adjacent spreadsheet cells in one paste.
Test the pipeline before the event
- Load your config via Upload Config or Load from URL (host it on GitHub Pages:
https://<user>.github.io/<repo>/config.json). - Fill out a fake match, generate the QR, and scan it with a laptop webcam into the QRScout scanner page.
- Confirm the tab-separated row lands correctly in Google Sheets. Verify column order matches your field order exactly.
If anything is off, you fix it at home, not at 8 a.m. on match day.
Key takeaways
- QRScout configs are plain JSON: sections contain fields, each with a type, camelCase code, and one of three formResetBehavior values (reset, preserve, increment).
- Use TBA-team-and-robot so scouts select teams from the schedule instead of typing numbers, eliminating the top mislabeling error.
- Always scan a test QR into your live spreadsheet before an event to validate column order and delimiter behavior.
Lesson quiz
RequiredAnswer all 3 questions correctly to complete this lesson.
1.In a QRScout config.json, how are the form's inputs organized at the top level?
2.Which set of values is valid for a QRScout field's "formResetBehavior" property?
3.How can a team deploy a custom REEFSCAPE config to scouts without rebuilding QRScout?
Answer every question to submit.