Skip to content

Log management

This page covers how to get logs off the robot and into AdvantageScope, live or after the fact.

Where logs are written

FateWeaver opens a log file when an OpMode initializes and closes it when the OpMode stops. You don't create anything. Anything you send through Fate.log or a Fate.table while the OpMode runs ends up in that file.

Files go to the FateWeaver/Logs folder on the Robot Controller. Each one is named yyyy_MM_dd__HH_mm_ss_SSS__<OpModeName>.fate. When the folder passes 250 MB, FateWeaver deletes the oldest logs first, before it opens the next one.

Values logged while no OpMode is running are not recorded. Each log also has an OpMode/Event channel that records PRE_INIT, PRE_START and POST_STOP.

Live streaming

FlightProjector sends your log to AdvantageScope while the OpMode runs, so you can watch a pose move or a PID settle without downloading a file. It sends the same bytes a .fate file contains, so anything you can see in a file is available live.

Turn this off at competition

The 2026-2027 competition manual prohibits live streaming from third-party libraries during competition. FlightProjector is for testing and tuning only. Switch it off before matches with the toggle on the dashboard at 192.168.43.1:8080/fate, which closes the server and unbinds the port. The setting is remembered across robot restarts, so you only have to do it once per event. Recording to files is always allowed and is not affected.

Watching a robot

You don't need any setup on the robot. When the Robot Controller starts, FateWeaver starts the projector on port 8110, and every OpMode streams as it logs.

In AdvantageScope, set the robot address to 192.168.43.1 for a Control Hub or 192.168.49.1 for a phone. Then choose File → Connect to Robot → FateWeaver. Channels appear in the tree the first time you log to them, and the timeline follows the robot.

You can connect partway through an OpMode. The projector replays the schemas to every new client, so you get a full tree right away and data from that moment on. If a new OpMode starts while you are connected, the tree resets and streaming continues.

If a client receives a message for a channel it has no schema for, it can send the text frame resync (FlightProjector.RESYNC_REQUEST). The projector replies with the header and every schema entry again. The client resets its channel table and rebuilds it from the replay, and the log it has already received is untouched. Any other message from a client is ignored.

Turning it off

There are three ways. The first two are remembered across robot restarts, so you turn streaming off once at the start of a competition day instead of before every match.

How Where Reach
"Enable/Disable FateWeaver Live" OpMode Driver Station, FateWeaver group Anywhere. Start it, read the current state, press START to flip it
Dashboard toggle 192.168.43.1:8080/fate Needs a laptop on the robot's network
FateLogManager.mode = LogMode.FILE Your code Set at runtime. Keeps logs from streaming and stops FateWeaver from starting the projector

Use the OpMode at a competition. You won't have a laptop on the robot's network in the queue line, but the Driver Station is always with you.

Only the OpMode and the dashboard toggle are sure to unbind the port. They close the server and save the choice. Setting FateLogManager.mode does not close a server that is already running, and FlightProjector.setEnabled(true) in your code can start the server again. To confirm streaming is off, run the toggle OpMode and read what it reports, or check that nothing answers on port 8110.

LogMode has three values, FILE, LIVE and BOTH, and it lives in gay.zharel.fateweaver.flight. It is read when an OpMode starts, so set it before the OpMode you want to affect initializes.

What off means

The server closes and the port is unbound, so nothing is listening. FTC Dashboard is different. It keeps its port bound while disabled and only ignores messages.

Recording and streaming at once

LogMode.BOTH is the default, so one OpMode writes a .fate file and streams at the same time. A slow or disconnected viewer does not slow your robot. Each client has a queue of 2048 entries, and a client that falls behind that is dropped instead of holding up your loop. If the projector is off, the file is still written.

Timestamps

An entry written without a timestamp is stamped with the time elapsed since its writer was created. FateLogWriter takes an optional timeSource (default TimeSource.Monotonic) and exposes timestamp(), so you can stamp a value yourself from the same clock. Only differences between timestamps in one log mean anything. A writer fed by the telemetry registry takes its stamps from the registry instead.

Downloading logs

FateWeaver serves your logs over the robot's own WiFi. Connect to the robot network and open 192.168.43.1:8080/fate in a browser. You get a list of log files with their timestamps and sizes. Click one to download it.

Browser compatibility

Any modern browser works. We have tested Chrome, Firefox and Safari.

Viewing saved logs with AdvantageScope

AdvantageScope is what we use to read FateWeaver logs. Download a build from Releases and install it for your platform.

Opening FateWeaver logs

Choose File → Open Log(s)..., pick your .fate file and wait for it to load. Your channels show up in the data tree on the left.

Requires AdvantageScope with FateWeaver v3 support

Logs are written in format version 3, which timestamps every message in nanoseconds. An AdvantageScope build without v3 support rejects the file with an unsupported-version message. Logs from older versions still open in a build that supports their version, but they have no per-message timestamps.

Working with the data

The channel tree

Slashes in names become folders, so a table like Fate.table("Robot/Pose") with a value named x gives you a tree you can navigate, which robotPoseX does not:

📁 Robot
  📁 Pose
    📊 x (double)
    📊 y (double)
    📊 heading (double)
  📁 Velocity
    📊 x (double)
    📊 y (double)
    📊 omega (double)
📁 Motors
  📁 Left
    📊 Position (int)
    📊 Velocity (double)
  📁 Right
    📊 Position (int)
    📊 Velocity (double)
📁 Sensors
  📁 Gyro
    📊 Heading (double)
  📁 Vision
    📊 TargetCount (int)
    📊 Confidence (double)

Views worth knowing

Use Line Graph for anything numeric over time. Use Field View for a pose channel, which draws the robot's path on the field. Use 3D Field for a full 3D pose, Console for string channels and Joysticks for gamepad input.

You can open several views at once, and they stay on the same timeline. If you scrub to the moment the robot stalled, every view shows that instant. Plots export as images and data exports as CSV.

A typical pass over a match log

Open the log and drop Robot/Pose into a Field View to see where the robot went. Put motor velocities and battery voltage on a line graph below it. When voltage sag lines up with a velocity drop, that is often the whole explanation. Scrub to anything that looks wrong and check what the sensors reported at that time. Then export the plots that show the problem.