From a6425d3e1e60dff25bfef0424b1954891d3fbf60 Mon Sep 17 00:00:00 2001 From: Zach Harel Date: Fri, 24 Apr 2026 22:20:45 -0400 Subject: [PATCH] [wpilib] DriverStation: Add usage reporting for opmodes (#8761) --- .../internal/DriverStationBackend.cpp | 15 +++++++++++++++ .../internal/DriverStationBackend.java | 9 +++++++++ 2 files changed, 24 insertions(+) diff --git a/wpilibc/src/main/native/cpp/driverstation/internal/DriverStationBackend.cpp b/wpilibc/src/main/native/cpp/driverstation/internal/DriverStationBackend.cpp index 0d64153be4..ce975a507f 100644 --- a/wpilibc/src/main/native/cpp/driverstation/internal/DriverStationBackend.cpp +++ b/wpilibc/src/main/native/cpp/driverstation/internal/DriverStationBackend.cpp @@ -22,6 +22,7 @@ #include "wpi/hal/DriverStationTypes.h" #include "wpi/hal/HAL.h" #include "wpi/hal/Power.h" +#include "wpi/hal/UsageReporting.hpp" #include "wpi/nt/BooleanTopic.hpp" #include "wpi/nt/IntegerTopic.hpp" #include "wpi/nt/NetworkTable.hpp" @@ -677,6 +678,20 @@ void DriverStationBackend::PublishOpModes() { options.emplace_back(option); } HAL_SetOpModeOptions(options.data(), options.size()); + + int modeCounts[HAL_ROBOT_MODE_UTILITY + 1] = {0, 0, 0, 0}; + for (const auto& opMode : options) { + ++modeCounts[HAL_OpMode_GetRobotMode(opMode.id)]; + } + + HAL_ReportUsage("OpMode/AUTONOMOUS", + std::to_string(modeCounts[HAL_ROBOT_MODE_AUTONOMOUS])); + HAL_ReportUsage("OpMode/TELEOPERATED", + std::to_string(modeCounts[HAL_ROBOT_MODE_TELEOPERATED])); + HAL_ReportUsage("OpMode/UTILITY", + std::to_string(modeCounts[HAL_ROBOT_MODE_UTILITY])); + HAL_ReportUsage("OpMode/UNKNOWN", + std::to_string(modeCounts[HAL_ROBOT_MODE_UNKNOWN])); } void DriverStationBackend::ClearOpModes() { diff --git a/wpilibj/src/main/java/org/wpilib/driverstation/internal/DriverStationBackend.java b/wpilibj/src/main/java/org/wpilib/driverstation/internal/DriverStationBackend.java index cd74c2c555..94c38a270d 100644 --- a/wpilibj/src/main/java/org/wpilib/driverstation/internal/DriverStationBackend.java +++ b/wpilibj/src/main/java/org/wpilib/driverstation/internal/DriverStationBackend.java @@ -10,6 +10,7 @@ import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; import org.wpilib.datalog.BooleanArrayLogEntry; import org.wpilib.datalog.DataLog; import org.wpilib.datalog.FloatArrayLogEntry; @@ -1343,6 +1344,14 @@ public final class DriverStationBackend { } finally { m_opModesMutex.unlock(); } + + var modeCounts = + m_opModes.values().stream() + .collect(Collectors.groupingBy(OpModeOption::getMode, Collectors.counting())); + + for (RobotMode mode : RobotMode.values()) { + HAL.reportUsage("OpMode/" + mode, String.valueOf(modeCounts.getOrDefault(mode, 0L))); + } } /** Clears all operating mode options and publishes an empty list to the driver station. */