From 8ed2d5bcf81726512d18f1c83d702df688ecda39 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Sat, 26 Oct 2024 17:54:29 -0700 Subject: [PATCH 01/10] Add usage reporting for dashboards as a resource Detects dashboards based on network tables client identity Depends on #7293 to detect SmartDashboard --- .../java/edu/wpi/first/wpilibj/RobotBase.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index 2de7cf1ce86..3a65265083b 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -14,6 +14,7 @@ import edu.wpi.first.math.MathSharedStore; import edu.wpi.first.math.MathUsageId; import edu.wpi.first.networktables.MultiSubscriber; +import edu.wpi.first.networktables.NetworkTableEvent; import edu.wpi.first.networktables.NetworkTableInstance; import edu.wpi.first.util.WPIUtilJNI; import edu.wpi.first.wpilibj.livewindow.LiveWindow; @@ -25,6 +26,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; import java.util.function.Supplier; /** @@ -158,6 +160,52 @@ protected RobotBase() { System.err.println("timed out while waiting for NT server to start"); } + Consumer dashboardConsumer = + new Consumer() { + private boolean m_detected; + + @Override + public void accept(NetworkTableEvent t) { + if (t.connInfo.remote_id.startsWith("glass")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Glass); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("SmartDashboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_SmartDashboard); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("shuffleboard")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("elastic")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("Dashboard")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_LabVIEW); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("AdvantageScope")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_AdvantageScope); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("QFRCDashboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_QFRCDashboard); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("FRC Web Components")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_FRCWebComponents); + m_detected = true; + } else { + // Only report unknown if there wasn't another dashboard already reported + // (unknown could also be another device) + if (!m_detected) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Unknown); + } + } + } + }; + + inst.addConnectionListener(true, dashboardConsumer); + LiveWindow.setEnabled(false); Shuffleboard.disableActuatorWidgets(); } From 5bbabd98e0391fcb18cabcc7185ad3b69223a396 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Sat, 26 Oct 2024 17:57:27 -0700 Subject: [PATCH 02/10] Add Dashboard instances --- hal/src/generate/Instances.txt | 9 +++++++++ .../java/edu/wpi/first/hal/FRCNetComm.java | 18 ++++++++++++++++++ .../native/include/hal/FRCUsageReporting.h | 9 +++++++++ 3 files changed, 36 insertions(+) diff --git a/hal/src/generate/Instances.txt b/hal/src/generate/Instances.txt index fc27682eea7..92c1e9c49be 100644 --- a/hal/src/generate/Instances.txt +++ b/hal/src/generate/Instances.txt @@ -52,3 +52,12 @@ kKinematics_SwerveDrive = 3 kOdometry_DifferentialDrive = 1 kOdometry_MecanumDrive = 2 kOdometry_SwerveDrive = 3 +kDashboard_Unknown = 1 +kDashboard_Glass = 2 +kDashboard_SmartDashboard = 3 +kDashboard_Shuffleboard = 4 +kDashboard_Elastic = 5 +kDashboard_LabVIEW = 6 +kDashboard_AdvantageScope = 7 +kDashboard_QFRCDashboard = 8 +kDashboard_FRCWebComponents = 9 diff --git a/hal/src/generated/main/java/edu/wpi/first/hal/FRCNetComm.java b/hal/src/generated/main/java/edu/wpi/first/hal/FRCNetComm.java index e3a2833e0ed..162cb821fb6 100644 --- a/hal/src/generated/main/java/edu/wpi/first/hal/FRCNetComm.java +++ b/hal/src/generated/main/java/edu/wpi/first/hal/FRCNetComm.java @@ -369,6 +369,24 @@ private tInstances() { public static final int kOdometry_MecanumDrive = 2; /** kOdometry_SwerveDrive = 3. */ public static final int kOdometry_SwerveDrive = 3; + /** kDashboard_Unknown = 1. */ + public static final int kDashboard_Unknown = 1; + /** kDashboard_Glass = 2. */ + public static final int kDashboard_Glass = 2; + /** kDashboard_SmartDashboard = 3. */ + public static final int kDashboard_SmartDashboard = 3; + /** kDashboard_Shuffleboard = 4. */ + public static final int kDashboard_Shuffleboard = 4; + /** kDashboard_Elastic = 5. */ + public static final int kDashboard_Elastic = 5; + /** kDashboard_LabVIEW = 6. */ + public static final int kDashboard_LabVIEW = 6; + /** kDashboard_AdvantageScope = 7. */ + public static final int kDashboard_AdvantageScope = 7; + /** kDashboard_QFRCDashboard = 8. */ + public static final int kDashboard_QFRCDashboard = 8; + /** kDashboard_FRCWebComponents = 9. */ + public static final int kDashboard_FRCWebComponents = 9; } /** Utility class. */ diff --git a/hal/src/generated/main/native/include/hal/FRCUsageReporting.h b/hal/src/generated/main/native/include/hal/FRCUsageReporting.h index 024ff13eb4f..1b3ebc1342c 100644 --- a/hal/src/generated/main/native/include/hal/FRCUsageReporting.h +++ b/hal/src/generated/main/native/include/hal/FRCUsageReporting.h @@ -223,6 +223,15 @@ namespace HALUsageReporting { kOdometry_DifferentialDrive = 1, kOdometry_MecanumDrive = 2, kOdometry_SwerveDrive = 3, + kDashboard_Unknown = 1, + kDashboard_Glass = 2, + kDashboard_SmartDashboard = 3, + kDashboard_Shuffleboard = 4, + kDashboard_Elastic = 5, + kDashboard_LabVIEW = 6, + kDashboard_AdvantageScope = 7, + kDashboard_QFRCDashboard = 8, + kDashboard_FRCWebComponents = 9, }; } #endif From 676fcdcb9453e1281f1df4aef30652db96183c79 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Mon, 28 Oct 2024 20:25:48 -0700 Subject: [PATCH 03/10] Use a case insenstive compare for Elastic --- wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index 3a65265083b..1662b1344f7 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -176,7 +176,7 @@ public void accept(NetworkTableEvent t) { } else if (t.connInfo.remote_id.startsWith("shuffleboard")) { HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); m_detected = true; - } else if (t.connInfo.remote_id.startsWith("elastic")) { + } else if (t.connInfo.remote_id.regionMatches(true, 0, "elastic", 0, 7)) { HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); m_detected = true; } else if (t.connInfo.remote_id.startsWith("Dashboard")) { From 690234ebbcf3afdcca43ff294b91f41a55f99c1b Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Wed, 30 Oct 2024 07:41:07 -0700 Subject: [PATCH 04/10] Only report on connection --- .../java/edu/wpi/first/wpilibj/RobotBase.java | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index 1662b1344f7..c269b731e54 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -166,39 +166,42 @@ protected RobotBase() { @Override public void accept(NetworkTableEvent t) { - if (t.connInfo.remote_id.startsWith("glass")) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Glass); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("SmartDashboard")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_SmartDashboard); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("shuffleboard")) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); - m_detected = true; - } else if (t.connInfo.remote_id.regionMatches(true, 0, "elastic", 0, 7)) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("Dashboard")) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_LabVIEW); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("AdvantageScope")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_AdvantageScope); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("QFRCDashboard")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_QFRCDashboard); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("FRC Web Components")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_FRCWebComponents); - m_detected = true; - } else { - // Only report unknown if there wasn't another dashboard already reported - // (unknown could also be another device) - if (!m_detected) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Unknown); + if (t.is(NetworkTableEvent.Kind.kConnected)) { + if (t.connInfo.remote_id.startsWith("glass")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Glass); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("SmartDashboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_SmartDashboard); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("shuffleboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); + m_detected = true; + } else if (t.connInfo.remote_id.regionMatches(true, 0, "elastic", 0, 7)) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("Dashboard")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_LabVIEW); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("AdvantageScope")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_AdvantageScope); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("QFRCDashboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_QFRCDashboard); + m_detected = true; + } else if (t.connInfo.remote_id.startsWith("FRC Web Components")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_FRCWebComponents); + m_detected = true; + } else { + // Only report unknown if there wasn't another dashboard already reported + // (unknown could also be another device) + if (!m_detected) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Unknown); + } } } } From 3cc0747f86aa8036470bd92403f9ca293f1de806 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Wed, 30 Oct 2024 22:15:09 -0700 Subject: [PATCH 05/10] Add C++ Implementation --- wpilibc/src/main/native/cppcs/RobotBase.cpp | 56 +++++++++++++++++++ .../src/main/native/include/frc/RobotBase.h | 2 + 2 files changed, 58 insertions(+) diff --git a/wpilibc/src/main/native/cppcs/RobotBase.cpp b/wpilibc/src/main/native/cppcs/RobotBase.cpp index 04af2fe3a4c..134453bf42c 100644 --- a/wpilibc/src/main/native/cppcs/RobotBase.cpp +++ b/wpilibc/src/main/native/cppcs/RobotBase.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -249,6 +250,61 @@ RobotBase::RobotBase() { } } + connListenerHandle = + inst.AddConnectionListener(true, [](const nt::Event& event) { + bool m_detected = false; + if (event.Is(nt::EventFlags::kConnected)) { + fmt::print("Connected to {}\n", event.GetConnectionInfo()->remote_id); + if (event.GetConnectionInfo()->remote_id.starts_with("glass")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Glass); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "SmartDashboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_SmartDashboard); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "shuffleboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Shuffleboard); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "elastic") || + event.GetConnectionInfo()->remote_id.starts_with( + "Elastic")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Elastic); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "Dashboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_LabVIEW); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "AdvantageScope")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_AdvantageScope); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "QFRCDashboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_QFRCDashboard); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "FRC Web Components")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_FRCWebComponents); + m_detected = true; + } else { + if (!m_detected) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Unknown); + } + } + } + }); + SmartDashboard::init(); if constexpr (!IsSimulation()) { diff --git a/wpilibc/src/main/native/include/frc/RobotBase.h b/wpilibc/src/main/native/include/frc/RobotBase.h index 6dff3696cdd..1166745d18d 100644 --- a/wpilibc/src/main/native/include/frc/RobotBase.h +++ b/wpilibc/src/main/native/include/frc/RobotBase.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -257,6 +258,7 @@ class RobotBase { RobotBase& operator=(RobotBase&&) = default; static std::thread::id m_threadId; + NT_Listener connListenerHandle; }; } // namespace frc From 72ef0b74b2ed34f6f64bd3e7660ba2ad7b7242b3 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Wed, 30 Oct 2024 22:18:04 -0700 Subject: [PATCH 06/10] make java Elastic comparison match C++ --- wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index c269b731e54..edd4b95fc32 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -178,7 +178,8 @@ public void accept(NetworkTableEvent t) { HAL.report( tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); m_detected = true; - } else if (t.connInfo.remote_id.regionMatches(true, 0, "elastic", 0, 7)) { + } else if (t.connInfo.remote_id.startsWith("elastic") + || t.connInfo.remote_id.startsWith("Elastic")) { HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); m_detected = true; } else if (t.connInfo.remote_id.startsWith("Dashboard")) { From ff2786fb20472e8081704bcee0042fc24024c774 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Sat, 2 Nov 2024 19:48:47 -0700 Subject: [PATCH 07/10] Use lambda for java. Report name of unknown as feature --- wpilibc/src/main/native/cppcs/RobotBase.cpp | 107 ++++++++--------- .../src/main/native/include/frc/RobotBase.h | 1 + .../java/edu/wpi/first/wpilibj/RobotBase.java | 108 ++++++++++-------- 3 files changed, 117 insertions(+), 99 deletions(-) diff --git a/wpilibc/src/main/native/cppcs/RobotBase.cpp b/wpilibc/src/main/native/cppcs/RobotBase.cpp index 134453bf42c..a2f8024b0c1 100644 --- a/wpilibc/src/main/native/cppcs/RobotBase.cpp +++ b/wpilibc/src/main/native/cppcs/RobotBase.cpp @@ -250,60 +250,65 @@ RobotBase::RobotBase() { } } - connListenerHandle = - inst.AddConnectionListener(true, [](const nt::Event& event) { - bool m_detected = false; - if (event.Is(nt::EventFlags::kConnected)) { - fmt::print("Connected to {}\n", event.GetConnectionInfo()->remote_id); - if (event.GetConnectionInfo()->remote_id.starts_with("glass")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_Glass); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "SmartDashboard")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_SmartDashboard); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "shuffleboard")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_Shuffleboard); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "elastic") || - event.GetConnectionInfo()->remote_id.starts_with( - "Elastic")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_Elastic); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "Dashboard")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_LabVIEW); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "AdvantageScope")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_AdvantageScope); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "QFRCDashboard")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_QFRCDashboard); - m_detected = true; - } else if (event.GetConnectionInfo()->remote_id.starts_with( - "FRC Web Components")) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_FRCWebComponents); - m_detected = true; + connListenerHandle = inst.AddConnectionListener(false, [&](const nt::Event& + event) { + if (event.Is(nt::EventFlags::kConnected)) { + if (event.GetConnectionInfo()->remote_id.starts_with("glass")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Glass); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "SmartDashboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_SmartDashboard); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "shuffleboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Shuffleboard); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with("elastic") || + event.GetConnectionInfo()->remote_id.starts_with("Elastic")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Elastic); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "Dashboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_LabVIEW); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "AdvantageScope")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_AdvantageScope); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "QFRCDashboard")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_QFRCDashboard); + m_detected = true; + } else if (event.GetConnectionInfo()->remote_id.starts_with( + "FRC Web Components")) { + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_FRCWebComponents); + m_detected = true; + } else { + if (!m_detected) { + size_t delim = event.GetConnectionInfo()->remote_id.find('@'); + if (delim != std::string::npos) { + HAL_Report( + HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Unknown, 0, + event.GetConnectionInfo()->remote_id.substr(0, delim).c_str()); } else { - if (!m_detected) { - HAL_Report(HALUsageReporting::kResourceType_Dashboard, - HALUsageReporting::kDashboard_Unknown); - } + HAL_Report(HALUsageReporting::kResourceType_Dashboard, + HALUsageReporting::kDashboard_Unknown, 0, + event.GetConnectionInfo()->remote_id.c_str()); } } - }); + } + } + }); SmartDashboard::init(); diff --git a/wpilibc/src/main/native/include/frc/RobotBase.h b/wpilibc/src/main/native/include/frc/RobotBase.h index 1166745d18d..a54b058d4a8 100644 --- a/wpilibc/src/main/native/include/frc/RobotBase.h +++ b/wpilibc/src/main/native/include/frc/RobotBase.h @@ -259,6 +259,7 @@ class RobotBase { static std::thread::id m_threadId; NT_Listener connListenerHandle; + bool m_detected = false; }; } // namespace frc diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index edd4b95fc32..be155ed5f13 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -26,7 +26,6 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.concurrent.locks.ReentrantLock; -import java.util.function.Consumer; import java.util.function.Supplier; /** @@ -45,6 +44,8 @@ public abstract class RobotBase implements AutoCloseable { private final MultiSubscriber m_suball; + int connListenerHandle; + private static void setupCameraServerShared() { CameraServerShared shared = new CameraServerShared() { @@ -125,6 +126,8 @@ public double getTimestamp() { }); } + private boolean m_detected; + /** * Constructor for a generic robot program. User code can be placed in the constructor that runs * before the Autonomous or Operator Control period starts. The constructor will run to completion @@ -160,55 +163,64 @@ protected RobotBase() { System.err.println("timed out while waiting for NT server to start"); } - Consumer dashboardConsumer = - new Consumer() { - private boolean m_detected; - - @Override - public void accept(NetworkTableEvent t) { - if (t.is(NetworkTableEvent.Kind.kConnected)) { - if (t.connInfo.remote_id.startsWith("glass")) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Glass); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("SmartDashboard")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_SmartDashboard); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("shuffleboard")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("elastic") - || t.connInfo.remote_id.startsWith("Elastic")) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("Dashboard")) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_LabVIEW); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("AdvantageScope")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_AdvantageScope); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("QFRCDashboard")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_QFRCDashboard); - m_detected = true; - } else if (t.connInfo.remote_id.startsWith("FRC Web Components")) { - HAL.report( - tResourceType.kResourceType_Dashboard, tInstances.kDashboard_FRCWebComponents); - m_detected = true; - } else { - // Only report unknown if there wasn't another dashboard already reported - // (unknown could also be another device) - if (!m_detected) { - HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Unknown); + connListenerHandle = + inst.addConnectionListener( + false, + event -> { + if (event.is(NetworkTableEvent.Kind.kConnected)) { + if (event.connInfo.remote_id.startsWith("glass")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Glass); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("SmartDashboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_SmartDashboard); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("shuffleboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("elastic") + || event.connInfo.remote_id.startsWith("Elastic")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("Dashboard")) { + HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_LabVIEW); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("AdvantageScope")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_AdvantageScope); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("QFRCDashboard")) { + HAL.report( + tResourceType.kResourceType_Dashboard, tInstances.kDashboard_QFRCDashboard); + m_detected = true; + } else if (event.connInfo.remote_id.startsWith("FRC Web Components")) { + HAL.report( + tResourceType.kResourceType_Dashboard, + tInstances.kDashboard_FRCWebComponents); + m_detected = true; + } else { + // Only report unknown if there wasn't another dashboard already reported + // (unknown could also be another device) + if (!m_detected) { + int delim = event.connInfo.remote_id.indexOf('@'); + if (delim != -1) { + HAL.report( + tResourceType.kResourceType_Dashboard, + tInstances.kDashboard_Unknown, + 0, + event.connInfo.remote_id.substring(0, delim)); + } else { + HAL.report( + tResourceType.kResourceType_Dashboard, + tInstances.kDashboard_Unknown, + 0, + event.connInfo.remote_id); + } + } } } - } - } - }; - - inst.addConnectionListener(true, dashboardConsumer); + }); LiveWindow.setEnabled(false); Shuffleboard.disableActuatorWidgets(); From 754459382f4cc9dcfc39cb5099eee3e466a4889f Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Sat, 2 Nov 2024 19:59:49 -0700 Subject: [PATCH 08/10] Fix lint --- wpilibc/src/main/native/cppcs/RobotBase.cpp | 1 + wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/wpilibc/src/main/native/cppcs/RobotBase.cpp b/wpilibc/src/main/native/cppcs/RobotBase.cpp index a2f8024b0c1..1650709d11b 100644 --- a/wpilibc/src/main/native/cppcs/RobotBase.cpp +++ b/wpilibc/src/main/native/cppcs/RobotBase.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index be155ed5f13..a4e4810e52a 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -44,7 +44,7 @@ public abstract class RobotBase implements AutoCloseable { private final MultiSubscriber m_suball; - int connListenerHandle; + int m_connListenerHandle; private static void setupCameraServerShared() { CameraServerShared shared = @@ -163,7 +163,7 @@ protected RobotBase() { System.err.println("timed out while waiting for NT server to start"); } - connListenerHandle = + m_connListenerHandle = inst.addConnectionListener( false, event -> { From de756600aeee79124af074eb3e8ca190af2b89c9 Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Sat, 2 Nov 2024 20:16:36 -0700 Subject: [PATCH 09/10] remove listener in close --- wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java | 1 + 1 file changed, 1 insertion(+) diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index a4e4810e52a..e89d21b1451 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -238,6 +238,7 @@ public static long getMainThreadId() { @Override public void close() { m_suball.close(); + NetworkTableInstance.getDefault().removeListener(m_connListenerHandle); } /** From 38017acd53ee82ff96b1dc7773088712482bf77c Mon Sep 17 00:00:00 2001 From: sciencewhiz Date: Sun, 3 Nov 2024 05:18:16 -0800 Subject: [PATCH 10/10] Cleanup variable names --- wpilibc/src/main/native/cppcs/RobotBase.cpp | 18 +++++++------- .../src/main/native/include/frc/RobotBase.h | 2 +- .../java/edu/wpi/first/wpilibj/RobotBase.java | 24 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/wpilibc/src/main/native/cppcs/RobotBase.cpp b/wpilibc/src/main/native/cppcs/RobotBase.cpp index 1650709d11b..32108faa55c 100644 --- a/wpilibc/src/main/native/cppcs/RobotBase.cpp +++ b/wpilibc/src/main/native/cppcs/RobotBase.cpp @@ -257,44 +257,44 @@ RobotBase::RobotBase() { if (event.GetConnectionInfo()->remote_id.starts_with("glass")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_Glass); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with( "SmartDashboard")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_SmartDashboard); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with( "shuffleboard")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_Shuffleboard); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with("elastic") || event.GetConnectionInfo()->remote_id.starts_with("Elastic")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_Elastic); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with( "Dashboard")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_LabVIEW); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with( "AdvantageScope")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_AdvantageScope); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with( "QFRCDashboard")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_QFRCDashboard); - m_detected = true; + m_dashboardDetected = true; } else if (event.GetConnectionInfo()->remote_id.starts_with( "FRC Web Components")) { HAL_Report(HALUsageReporting::kResourceType_Dashboard, HALUsageReporting::kDashboard_FRCWebComponents); - m_detected = true; + m_dashboardDetected = true; } else { - if (!m_detected) { + if (!m_dashboardDetected) { size_t delim = event.GetConnectionInfo()->remote_id.find('@'); if (delim != std::string::npos) { HAL_Report( diff --git a/wpilibc/src/main/native/include/frc/RobotBase.h b/wpilibc/src/main/native/include/frc/RobotBase.h index a54b058d4a8..87bdba3a6d5 100644 --- a/wpilibc/src/main/native/include/frc/RobotBase.h +++ b/wpilibc/src/main/native/include/frc/RobotBase.h @@ -259,7 +259,7 @@ class RobotBase { static std::thread::id m_threadId; NT_Listener connListenerHandle; - bool m_detected = false; + bool m_dashboardDetected = false; }; } // namespace frc diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java index e89d21b1451..0cd769bd133 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/RobotBase.java @@ -44,7 +44,9 @@ public abstract class RobotBase implements AutoCloseable { private final MultiSubscriber m_suball; - int m_connListenerHandle; + private final int m_connListenerHandle; + + private boolean m_dashboardDetected; private static void setupCameraServerShared() { CameraServerShared shared = @@ -126,8 +128,6 @@ public double getTimestamp() { }); } - private boolean m_detected; - /** * Constructor for a generic robot program. User code can be placed in the constructor that runs * before the Autonomous or Operator Control period starts. The constructor will run to completion @@ -170,39 +170,39 @@ protected RobotBase() { if (event.is(NetworkTableEvent.Kind.kConnected)) { if (event.connInfo.remote_id.startsWith("glass")) { HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Glass); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("SmartDashboard")) { HAL.report( tResourceType.kResourceType_Dashboard, tInstances.kDashboard_SmartDashboard); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("shuffleboard")) { HAL.report( tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Shuffleboard); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("elastic") || event.connInfo.remote_id.startsWith("Elastic")) { HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_Elastic); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("Dashboard")) { HAL.report(tResourceType.kResourceType_Dashboard, tInstances.kDashboard_LabVIEW); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("AdvantageScope")) { HAL.report( tResourceType.kResourceType_Dashboard, tInstances.kDashboard_AdvantageScope); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("QFRCDashboard")) { HAL.report( tResourceType.kResourceType_Dashboard, tInstances.kDashboard_QFRCDashboard); - m_detected = true; + m_dashboardDetected = true; } else if (event.connInfo.remote_id.startsWith("FRC Web Components")) { HAL.report( tResourceType.kResourceType_Dashboard, tInstances.kDashboard_FRCWebComponents); - m_detected = true; + m_dashboardDetected = true; } else { // Only report unknown if there wasn't another dashboard already reported // (unknown could also be another device) - if (!m_detected) { + if (!m_dashboardDetected) { int delim = event.connInfo.remote_id.indexOf('@'); if (delim != -1) { HAL.report(