skillZs
★ LIVE SKILL TAGS ★
>>> LIVE SKILLS INDEX <<<
* OPEN SOURCE *
NO LOGIN, NO TRACKING
※ REAL INSTALL DATA ※
← back to all skills
jonahsnider/wpilog-parser104 installs

analyze-wpilog

Analyze WPILOG log files from FRC robots using the wpilog-parser library with TypeScript.

How do I install this agent skill?

npx skills add https://github.com/jonahsnider/wpilog-parser --skill analyze-wpilog
view source ↗

Is this agent skill safe to install?

  • Gen Agent Trust Hubpass

    The skill provides instructions and TypeScript examples for parsing and analyzing FRC robot log files (WPILOG format). It uses the wpilog-parser library to read records, decode data structures, and calculate robot state durations from local files. No security risks were identified.

  • Socketpass

    No alerts

  • Snykpass

    Risk: LOW · No issues

What does this agent skill do?

wpilog-parser

WPILOG is the binary log format used by logging libraries in the FRC ecosystem. The wpilog-parser library makes it easy to read and analyze the log files using TS/JS.

Creating a project

  1. Init a project using pnpm init or similar

  2. Add wpilog-parser as a dependency

  3. Catalog the entries in the WPILOG file before deciding what to analyze

    pnpm wpilog catalog ./example.wpilog
    

    The default output is plaintext. Use --json, --jsonl/--ndjson, or --csv when another format is more useful.

Analyzing logs

Use parseDataLog to parse DataLog bytes. Filter by name and narrow on type:

import { readFile } from 'node:fs/promises';
import { isDataRecord, parseDataLog, RecordType } from 'wpilog-parser';

const bytes = await readFile('./example.wpilog');

for (const record of parseDataLog(bytes)) {
	if (!isDataRecord(record)) continue;

	if (record.name === '/Robot/Intake/Voltage' && record.type === RecordType.Double) {
		console.log(record.timestamp, record.payload);
	}
}

Decoding structs

import { parseDataLog, RecordType, structPayloadToJson } from 'wpilog-parser';

for (const record of parseDataLog(bytes)) {
	if (record.type === RecordType.Struct && record.name === '/Robot/Localization/EstimatedPose') {
		console.log(record.timestamp, structPayloadToJson(record.payload));
		// 18688018n {
		//   translation: { x: 10.289, y: 0.47 },
		//   rotation: { value: 1.5707961072652017 },
		// }
	}
}

Strict mode

for (const record of parseDataLog(bytes, { strict: true })) {
	// throws on orphan data records instead of skipping
}

Robot state cheatsheet

When DriverStation logging is on, every WPILOG has these boolean entries:

EntryMeaning
/DS:enabledtrue while the robot is enabled (any mode).
/DS:autonomoustrue during autonomous. false means teleop (unless /DS:test).
/DS:testtrue during test mode.
/DS:estoptrue if e-stopped.

The mode flags (autonomous, test) reflect what the DS would run if enabled, so check /DS:enabled together with them. Timestamps are microseconds (bigint).

Tracking enable/mode durations

import { isDataRecord, parseDataLog, RecordType } from 'wpilog-parser';

type Mode = 'auto' | 'teleop' | 'test';
function modeOf(auto: boolean, test: boolean): Mode {
	if (test) return 'test';
	if (auto) return 'auto';
	return 'teleop';
}

let enabled = false;
let auto = false;
let test = false;
let enabledSince: bigint | null = null;
const totals = { auto: 0n, teleop: 0n, test: 0n };

for (const r of parseDataLog(bytes)) {
	if (!isDataRecord(r) || r.type !== RecordType.Boolean) continue;

	const wasEnabled = enabled;
	const prevMode = modeOf(auto, test);

	if (r.name === '/DS:enabled') enabled = r.payload;
	else if (r.name === '/DS:autonomous') auto = r.payload;
	else if (r.name === '/DS:test') test = r.payload;
	else continue;

	if (wasEnabled && (!enabled || modeOf(auto, test) !== prevMode)) {
		totals[prevMode] += r.timestamp - (enabledSince ?? r.timestamp);
		enabledSince = enabled ? r.timestamp : null;
	} else if (!wasEnabled && enabled) {
		enabledSince = r.timestamp;
	}
}

// Durations in microseconds; divide by 1_000_000n for seconds.
console.log(totals);

Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.

<a href="https://skillzs.dev/skills/jonahsnider/wpilog-parser/analyze-wpilog">View analyze-wpilog on skillZs</a>