diff --git a/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp b/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp index a19cc6a3f0..8c0880a588 100644 --- a/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp +++ b/wpilibc/src/main/native/cpp/shuffleboard/ShuffleboardInstance.cpp @@ -30,12 +30,17 @@ ShuffleboardInstance::ShuffleboardInstance(nt::NetworkTableInstance ntInstance) m_impl->selectedTabPub = m_impl->rootMetaTable->GetStringTopic("Selected") .Publish(nt::PubSubOptions{.keepDuplicates = true}); - HAL_Report(HALUsageReporting::kResourceType_Shuffleboard, 0); } ShuffleboardInstance::~ShuffleboardInstance() = default; +static bool gReported = false; + frc::ShuffleboardTab& ShuffleboardInstance::GetTab(std::string_view title) { + if (!gReported) { + HAL_Report(HALUsageReporting::kResourceType_Shuffleboard, 0); + gReported = true; + } if (m_impl->tabs.find(title) == m_impl->tabs.end()) { m_impl->tabs.try_emplace(title, std::make_unique(*this, title)); diff --git a/wpilibc/src/main/native/cpp/smartdashboard/SmartDashboard.cpp b/wpilibc/src/main/native/cpp/smartdashboard/SmartDashboard.cpp index e6991d44fa..65ca59799e 100644 --- a/wpilibc/src/main/native/cpp/smartdashboard/SmartDashboard.cpp +++ b/wpilibc/src/main/native/cpp/smartdashboard/SmartDashboard.cpp @@ -19,8 +19,6 @@ using namespace frc; namespace { struct Instance { - Instance() { HAL_Report(HALUsageReporting::kResourceType_SmartDashboard, 0); } - detail::ListenerExecutor listenerExecutor; std::shared_ptr table = nt::NetworkTableInstance::GetDefault().GetTable("SmartDashboard"); @@ -46,6 +44,8 @@ void ResetSmartDashboardInstance() { } // namespace frc::impl #endif +static bool gReported = false; + void SmartDashboard::init() { GetInstance(); } @@ -59,18 +59,22 @@ std::vector SmartDashboard::GetKeys(int types) { } void SmartDashboard::SetPersistent(std::string_view key) { - GetInstance().table->GetEntry(key).SetPersistent(); + GetEntry(key).SetPersistent(); } void SmartDashboard::ClearPersistent(std::string_view key) { - GetInstance().table->GetEntry(key).ClearPersistent(); + GetEntry(key).ClearPersistent(); } bool SmartDashboard::IsPersistent(std::string_view key) { - return GetInstance().table->GetEntry(key).IsPersistent(); + return GetEntry(key).IsPersistent(); } nt::NetworkTableEntry SmartDashboard::GetEntry(std::string_view key) { + if (!gReported) { + HAL_Report(HALUsageReporting::kResourceType_SmartDashboard, 0); + gReported = true; + } return GetInstance().table->GetEntry(key); } @@ -78,6 +82,10 @@ void SmartDashboard::PutData(std::string_view key, wpi::Sendable* data) { if (!data) { throw FRC_MakeError(err::NullParameter, "value"); } + if (!gReported) { + HAL_Report(HALUsageReporting::kResourceType_SmartDashboard, 0); + gReported = true; + } auto& inst = GetInstance(); std::scoped_lock lock(inst.tablesToDataMutex); auto& uid = inst.tablesToData[key]; @@ -120,7 +128,7 @@ bool SmartDashboard::PutBoolean(std::string_view keyName, bool value) { bool SmartDashboard::SetDefaultBoolean(std::string_view key, bool defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultBoolean(defaultValue); + return GetEntry(key).SetDefaultBoolean(defaultValue); } bool SmartDashboard::GetBoolean(std::string_view keyName, bool defaultValue) { @@ -133,7 +141,7 @@ bool SmartDashboard::PutNumber(std::string_view keyName, double value) { bool SmartDashboard::SetDefaultNumber(std::string_view key, double defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultDouble(defaultValue); + return GetEntry(key).SetDefaultDouble(defaultValue); } double SmartDashboard::GetNumber(std::string_view keyName, @@ -148,7 +156,7 @@ bool SmartDashboard::PutString(std::string_view keyName, bool SmartDashboard::SetDefaultString(std::string_view key, std::string_view defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultString(defaultValue); + return GetEntry(key).SetDefaultString(defaultValue); } std::string SmartDashboard::GetString(std::string_view keyName, @@ -158,63 +166,62 @@ std::string SmartDashboard::GetString(std::string_view keyName, bool SmartDashboard::PutBooleanArray(std::string_view key, std::span value) { - return GetInstance().table->GetEntry(key).SetBooleanArray(value); + return GetEntry(key).SetBooleanArray(value); } bool SmartDashboard::SetDefaultBooleanArray(std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultBooleanArray( - defaultValue); + return GetEntry(key).SetDefaultBooleanArray(defaultValue); } std::vector SmartDashboard::GetBooleanArray( std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).GetBooleanArray(defaultValue); + return GetEntry(key).GetBooleanArray(defaultValue); } bool SmartDashboard::PutNumberArray(std::string_view key, std::span value) { - return GetInstance().table->GetEntry(key).SetDoubleArray(value); + return GetEntry(key).SetDoubleArray(value); } bool SmartDashboard::SetDefaultNumberArray( std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultDoubleArray(defaultValue); + return GetEntry(key).SetDefaultDoubleArray(defaultValue); } std::vector SmartDashboard::GetNumberArray( std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).GetDoubleArray(defaultValue); + return GetEntry(key).GetDoubleArray(defaultValue); } bool SmartDashboard::PutStringArray(std::string_view key, std::span value) { - return GetInstance().table->GetEntry(key).SetStringArray(value); + return GetEntry(key).SetStringArray(value); } bool SmartDashboard::SetDefaultStringArray( std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultStringArray(defaultValue); + return GetEntry(key).SetDefaultStringArray(defaultValue); } std::vector SmartDashboard::GetStringArray( std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).GetStringArray(defaultValue); + return GetEntry(key).GetStringArray(defaultValue); } bool SmartDashboard::PutRaw(std::string_view key, std::span value) { - return GetInstance().table->GetEntry(key).SetRaw(value); + return GetEntry(key).SetRaw(value); } bool SmartDashboard::SetDefaultRaw(std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultRaw(defaultValue); + return GetEntry(key).SetDefaultRaw(defaultValue); } std::vector SmartDashboard::GetRaw( std::string_view key, std::span defaultValue) { - return GetInstance().table->GetEntry(key).GetRaw(defaultValue); + return GetEntry(key).GetRaw(defaultValue); } bool SmartDashboard::PutValue(std::string_view keyName, @@ -224,7 +231,7 @@ bool SmartDashboard::PutValue(std::string_view keyName, bool SmartDashboard::SetDefaultValue(std::string_view key, const nt::Value& defaultValue) { - return GetInstance().table->GetEntry(key).SetDefaultValue(defaultValue); + return GetEntry(key).SetDefaultValue(defaultValue); } nt::Value SmartDashboard::GetValue(std::string_view keyName) { diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/ShuffleboardInstance.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/ShuffleboardInstance.java index df2f117e1d..88e1e495e1 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/ShuffleboardInstance.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/shuffleboard/ShuffleboardInstance.java @@ -18,7 +18,7 @@ import java.util.function.Consumer; final class ShuffleboardInstance implements ShuffleboardRoot { private final Map m_tabs = new LinkedHashMap<>(); - + private boolean m_reported = false; // NOPMD redundant field initializer private boolean m_tabsChanged = false; // NOPMD redundant field initializer private final NetworkTable m_rootTable; private final NetworkTable m_rootMetaTable; @@ -35,12 +35,15 @@ final class ShuffleboardInstance implements ShuffleboardRoot { m_rootMetaTable = m_rootTable.getSubTable(".metadata"); m_selectedTabPub = m_rootMetaTable.getStringTopic("Selected").publish(PubSubOption.keepDuplicates(true)); - HAL.report(tResourceType.kResourceType_Shuffleboard, 0); } @Override public ShuffleboardTab getTab(String title) { requireNonNullParam(title, "title", "getTab"); + if (!m_reported) { + HAL.report(tResourceType.kResourceType_Shuffleboard, 0); + m_reported = true; + } if (!m_tabs.containsKey(title)) { m_tabs.put(title, new ShuffleboardTab(this, title)); m_tabsChanged = true; diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SmartDashboard.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SmartDashboard.java index 8a8f147964..d96158586a 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SmartDashboard.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SmartDashboard.java @@ -35,9 +35,10 @@ public final class SmartDashboard { /** The executor for listener tasks; calls listener tasks synchronously from main thread. */ private static final ListenerExecutor listenerExecutor = new ListenerExecutor(); + private static boolean m_reported = false; // NOPMD redundant field initializer + static { setNetworkTableInstance(NetworkTableInstance.getDefault()); - HAL.report(tResourceType.kResourceType_SmartDashboard, 0); } private SmartDashboard() { @@ -64,6 +65,10 @@ public final class SmartDashboard { */ @SuppressWarnings("PMD.CompareObjectsWithEquals") public static synchronized void putData(String key, Sendable data) { + if (!m_reported) { + HAL.report(tResourceType.kResourceType_SmartDashboard, 0); + m_reported = true; + } Sendable sddata = tablesToData.get(key); if (sddata == null || sddata != data) { tablesToData.put(key, data); @@ -114,6 +119,10 @@ public final class SmartDashboard { * @return Network table entry. */ public static NetworkTableEntry getEntry(String key) { + if (!m_reported) { + HAL.report(tResourceType.kResourceType_SmartDashboard, 0); + m_reported = true; + } return table.getEntry(key); }