diff --git a/wpilibc/src/main/native/cpp/livewindow/LiveWindow.cpp b/wpilibc/src/main/native/cpp/livewindow/LiveWindow.cpp index 8a4badc780..135d044ae5 100644 --- a/wpilibc/src/main/native/cpp/livewindow/LiveWindow.cpp +++ b/wpilibc/src/main/native/cpp/livewindow/LiveWindow.cpp @@ -175,6 +175,10 @@ void LiveWindow::SetEnabled(bool enabled) { std::lock_guard lock(m_impl->mutex); if (m_impl->liveWindowEnabled == enabled) return; Scheduler* scheduler = Scheduler::GetInstance(); + m_impl->startLiveWindow = enabled; + m_impl->liveWindowEnabled = enabled; + // Force table generation now to make sure everything is defined + UpdateValuesUnsafe(); if (enabled) { scheduler->SetEnabled(false); scheduler->RemoveAll(); @@ -184,13 +188,15 @@ void LiveWindow::SetEnabled(bool enabled) { } scheduler->SetEnabled(true); } - m_impl->startLiveWindow = enabled; - m_impl->liveWindowEnabled = enabled; m_impl->enabledEntry.SetBoolean(enabled); } void LiveWindow::UpdateValues() { std::lock_guard lock(m_impl->mutex); + UpdateValuesUnsafe(); +} + +void LiveWindow::UpdateValuesUnsafe() { // Only do this if either LiveWindow mode or telemetry is enabled. if (!m_impl->liveWindowEnabled && !m_impl->telemetryEnabled) return; diff --git a/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp b/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp index 5eb9d6285b..bce03b5de9 100644 --- a/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp +++ b/wpilibc/src/main/native/cpp/smartdashboard/SendableBuilderImpl.cpp @@ -33,12 +33,12 @@ void SendableBuilderImpl::UpdateTable() { void SendableBuilderImpl::StartListeners() { for (auto& property : m_properties) property.StartListener(); - m_controllableEntry.SetBoolean(true); + if (m_controllableEntry) m_controllableEntry.SetBoolean(true); } void SendableBuilderImpl::StopListeners() { for (auto& property : m_properties) property.StopListener(); - m_controllableEntry.SetBoolean(false); + if (m_controllableEntry) m_controllableEntry.SetBoolean(false); } void SendableBuilderImpl::StartLiveWindowMode() { diff --git a/wpilibc/src/main/native/include/frc/livewindow/LiveWindow.h b/wpilibc/src/main/native/include/frc/livewindow/LiveWindow.h index 1c5477684e..465a4bbb7b 100644 --- a/wpilibc/src/main/native/include/frc/livewindow/LiveWindow.h +++ b/wpilibc/src/main/native/include/frc/livewindow/LiveWindow.h @@ -208,6 +208,11 @@ class LiveWindow { struct Impl; std::unique_ptr m_impl; + + /** + * Updates the entries, without using a mutex or lock. + */ + void UpdateValuesUnsafe(); }; } // namespace frc diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/livewindow/LiveWindow.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/livewindow/LiveWindow.java index f0cdc0a738..1cdb4ab9a2 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/livewindow/LiveWindow.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/livewindow/LiveWindow.java @@ -65,6 +65,9 @@ public class LiveWindow { */ public static synchronized void setEnabled(boolean enabled) { if (liveWindowEnabled != enabled) { + startLiveWindow = enabled; + liveWindowEnabled = enabled; + updateValues(); // Force table generation now to make sure everything is defined Scheduler scheduler = Scheduler.getInstance(); if (enabled) { System.out.println("Starting live window mode."); @@ -77,8 +80,6 @@ public class LiveWindow { } scheduler.enable(); } - startLiveWindow = enabled; - liveWindowEnabled = enabled; enabledEntry.setBoolean(enabled); } } diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableBuilderImpl.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableBuilderImpl.java index 13986f5726..aec5a27b56 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableBuilderImpl.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/smartdashboard/SendableBuilderImpl.java @@ -107,7 +107,9 @@ public class SendableBuilderImpl implements SendableBuilder { for (Property property : m_properties) { property.startListener(); } - m_controllableEntry.setBoolean(true); + if (m_controllableEntry != null) { + m_controllableEntry.setBoolean(true); + } } /** @@ -117,7 +119,9 @@ public class SendableBuilderImpl implements SendableBuilder { for (Property property : m_properties) { property.stopListener(); } - m_controllableEntry.setBoolean(false); + if (m_controllableEntry != null) { + m_controllableEntry.setBoolean(false); + } } /**