From 87fc49c66d6f9270887ab7b1c6516b263d1a8f94 Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sat, 3 Oct 2015 09:04:38 -0700 Subject: [PATCH] Automatically set persistent on new Preferences keys. This improves interoperability with old dashboards as it enables new Preferences keys to be added from an old dashboard and still be automatically saved. Change-Id: I51e988006f8fa4fd780fac34f47633a9727f31e0 --- wpilibc/wpilibC++Devices/include/Preferences.h | 9 +++++++++ wpilibc/wpilibC++Devices/src/Preferences.cpp | 10 ++++++++++ .../java/edu/wpi/first/wpilibj/Preferences.java | 17 +++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/wpilibc/wpilibC++Devices/include/Preferences.h b/wpilibc/wpilibC++Devices/include/Preferences.h index 54371acf1a..a2c3bc4d4f 100644 --- a/wpilibc/wpilibC++Devices/include/Preferences.h +++ b/wpilibc/wpilibC++Devices/include/Preferences.h @@ -60,4 +60,13 @@ class Preferences : public ErrorBase { private: std::shared_ptr m_table; + class Listener : public ITableListener { + public: + void ValueChanged(ITable* source, llvm::StringRef key, + std::shared_ptr value, bool isNew) override; + void ValueChangedEx(ITable* source, llvm::StringRef key, + std::shared_ptr value, + unsigned int flags) override; + }; + Listener m_listener; }; diff --git a/wpilibc/wpilibC++Devices/src/Preferences.cpp b/wpilibc/wpilibC++Devices/src/Preferences.cpp index cb6d1001e3..ed3f076bcb 100644 --- a/wpilibc/wpilibC++Devices/src/Preferences.cpp +++ b/wpilibc/wpilibC++Devices/src/Preferences.cpp @@ -16,7 +16,17 @@ /** The Preferences table name */ static const char *kTableName = "Preferences"; +void Preferences::Listener::ValueChanged(ITable* source, llvm::StringRef key, + std::shared_ptr value, + bool isNew) {} +void Preferences::Listener::ValueChangedEx(ITable* source, llvm::StringRef key, + std::shared_ptr value, + unsigned int flags) { + source->SetPersistent(key); +} + Preferences::Preferences() : m_table(NetworkTable::GetTable(kTableName)) { + m_table->AddTableListenerEx(&m_listener, NT_NOTIFY_NEW | NT_NOTIFY_IMMEDIATE); HALReport(HALUsageReporting::kResourceType_Preferences, 0); } diff --git a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Preferences.java b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Preferences.java index f939c272cf..9e334ccd03 100644 --- a/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Preferences.java +++ b/wpilibj/wpilibJavaDevices/src/main/java/edu/wpi/first/wpilibj/Preferences.java @@ -11,6 +11,8 @@ import java.util.Vector; import edu.wpi.first.wpilibj.communication.FRCNetworkCommunicationsLibrary.tResourceType; import edu.wpi.first.wpilibj.communication.UsageReporting; import edu.wpi.first.wpilibj.networktables.NetworkTable; +import edu.wpi.first.wpilibj.tables.ITable; +import edu.wpi.first.wpilibj.tables.ITableListener; import edu.wpi.first.wpilibj.tables.TableKeyNotDefinedException; /** @@ -48,6 +50,20 @@ public class Preferences { * The network table */ private NetworkTable table; + /** + * Listener to set all Preferences values to persistent (for backwards + * compatibility with old dashboards). + */ + private final ITableListener listener = new ITableListener() { + @Override + public void valueChanged(ITable table, String key, Object value, boolean isNew) { + // unused + } + @Override + public void valueChangedEx(ITable table, String key, Object value, int flags) { + table.setPersistent(key); + } + }; /** * Returns the preferences instance. @@ -66,6 +82,7 @@ public class Preferences { */ private Preferences() { table = NetworkTable.getTable(TABLE_NAME); + table.addTableListenerEx(listener, ITable.NOTIFY_NEW | ITable.NOTIFY_IMMEDIATE); UsageReporting.report(tResourceType.kResourceType_Preferences, 0); }