WPILibC++  2018.4.1-20180926150325-1206-g8b1274d
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
NetworkTable.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #ifndef NTCORE_NETWORKTABLES_NETWORKTABLE_H_
9 #define NTCORE_NETWORKTABLES_NETWORKTABLE_H_
10 
11 #include <functional>
12 #include <memory>
13 #include <string>
14 #include <utility>
15 #include <vector>
16 
17 #include <wpi/ArrayRef.h>
18 #include <wpi/StringMap.h>
19 #include <wpi/Twine.h>
20 #include <wpi/mutex.h>
21 
22 #include "networktables/NetworkTableEntry.h"
23 #include "networktables/TableEntryListener.h"
24 #include "networktables/TableListener.h"
25 #include "ntcore_c.h"
26 #include "tables/ITable.h"
27 
28 namespace nt {
29 
30 using wpi::ArrayRef;
31 using wpi::StringRef;
32 using wpi::Twine;
33 
34 class NetworkTableInstance;
35 
36 #ifdef __GNUC__
37 #pragma GCC diagnostic push
38 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
39 #endif
40 
51 class NetworkTable final : public ITable {
52  private:
53  NT_Inst m_inst;
54  std::string m_path;
55  mutable wpi::mutex m_mutex;
56  mutable wpi::StringMap<NT_Entry> m_entries;
57  typedef std::pair<ITableListener*, NT_EntryListener> Listener;
58  std::vector<Listener> m_listeners;
59 
60  static std::vector<std::string> s_ip_addresses;
61  static std::string s_persistent_filename;
62  static bool s_client;
63  static bool s_enable_ds;
64  static bool s_running;
65  static unsigned int s_port;
66 
67  struct private_init {};
68  friend class NetworkTableInstance;
69 
70  public:
78  static StringRef BasenameKey(StringRef key);
79 
96  static std::string NormalizeKey(const Twine& key,
97  bool withLeadingSlash = true);
98 
99  static StringRef NormalizeKey(const Twine& key,
101  bool withLeadingSlash = true);
102 
111  static std::vector<std::string> GetHierarchy(const Twine& key);
112 
117  NetworkTable(NT_Inst inst, const Twine& path, const private_init&);
118  virtual ~NetworkTable();
119 
126 
130  static const char PATH_SEPARATOR_CHAR;
131 
136  "use NetworkTableInstance::StartServer() or "
137  "NetworkTableInstance::StartClient() instead")
138  static void Initialize();
139 
144  "use NetworkTableInstance::StopServer() or "
145  "NetworkTableInstance::StopClient() instead")
146  static void Shutdown();
147 
153  static void SetClientMode();
154 
160  static void SetServerMode();
161 
172  static void SetTeam(int team);
173 
179  "use NetworkTableInstance::SetServer() or "
180  "NetworkTableInstance::StartClient() instead")
181  static void SetIPAddress(StringRef address);
182 
188  "use NetworkTableInstance::SetServer() or "
189  "NetworkTableInstance::StartClient() instead")
190  static void SetIPAddress(ArrayRef<std::string> addresses);
191 
199  "use the appropriate parameters to NetworkTableInstance::SetServer(), "
202  "NetworkTableInstance::StartDSClient() instead")
203  static void SetPort(unsigned int port);
204 
211  "use NetworkTableInstance::StartDSClient() and "
212  "NetworkTableInstance::StopDSClient() instead")
213  static void SetDSClientEnabled(bool enabled);
214 
222  "use the appropriate parameter to NetworkTableInstance::StartServer() "
223  "instead")
224  static void SetPersistentFilename(StringRef filename);
225 
233  static void SetNetworkIdentity(StringRef name);
234 
239  static void GlobalDeleteAll();
240 
247  WPI_DEPRECATED("use NetworkTableInstance::Flush() instead")
248  static void Flush();
249 
257  static void SetUpdateRate(double interval);
258 
266  static const char* SavePersistent(StringRef filename);
267 
276  static const char* LoadPersistent(
277  StringRef filename,
278  std::function<void(size_t line, const char* msg)> warn);
279 
290  "use NetworkTableInstance::GetTable() or "
291  "NetworkTableInstance::GetEntry() instead")
292  static std::shared_ptr<NetworkTable> GetTable(StringRef key);
293 
300  NetworkTableEntry GetEntry(const Twine& key) const;
301 
309  NT_EntryListener AddEntryListener(TableEntryListener listener,
310  unsigned int flags) const;
311 
320  NT_EntryListener AddEntryListener(const Twine& key,
321  TableEntryListener listener,
322  unsigned int flags) const;
323 
329  void RemoveEntryListener(NT_EntryListener listener) const;
330 
340  NT_EntryListener AddSubTableListener(TableListener listener,
341  bool localNotify = false) const;
342 
348  void RemoveTableListener(NT_EntryListener listener) const;
349 
351  "use AddEntryListener() instead with flags value of NT_NOTIFY_NEW | "
352  "NT_NOTIFY_UPDATE")
353  void AddTableListener(ITableListener* listener) override;
354 
356  "use AddEntryListener() instead with flags value of NT_NOTIFY_NEW | "
357  "NT_NOTIFY_UPDATE | NT_NOTIFY_IMMEDIATE")
358  void AddTableListener(ITableListener* listener,
359  bool immediateNotify) override;
360 
361  WPI_DEPRECATED("use AddEntryListener() instead")
362  void AddTableListenerEx(ITableListener* listener,
363  unsigned int flags) override;
364 
365  WPI_DEPRECATED("use AddEntryListener() instead")
366  void AddTableListener(StringRef key, ITableListener* listener,
367  bool immediateNotify) override;
368 
369  WPI_DEPRECATED("use AddEntryListener() instead")
370  void AddTableListenerEx(StringRef key, ITableListener* listener,
371  unsigned int flags) override;
372 
373  WPI_DEPRECATED("use AddSubTableListener(TableListener, bool) instead")
374  void AddSubTableListener(ITableListener* listener) override;
375 
376  WPI_DEPRECATED("use AddSubTableListener(TableListener, bool) instead")
377  void AddSubTableListener(ITableListener* listener, bool localNotify) override;
378 
379  WPI_DEPRECATED("use RemoveTableListener(NT_EntryListener) instead")
380  void RemoveTableListener(ITableListener* listener) override;
381 
389  std::shared_ptr<NetworkTable> GetSubTable(const Twine& key) const override;
390 
397  bool ContainsKey(const Twine& key) const override;
398 
407  bool ContainsSubTable(const Twine& key) const override;
408 
415  std::vector<std::string> GetKeys(int types = 0) const override;
416 
422  std::vector<std::string> GetSubTables() const override;
423 
429  void SetPersistent(StringRef key) override;
430 
437  void ClearPersistent(StringRef key) override;
438 
445  bool IsPersistent(StringRef key) const override;
446 
454  void SetFlags(StringRef key, unsigned int flags) override;
455 
463  void ClearFlags(StringRef key, unsigned int flags) override;
464 
471  unsigned int GetFlags(StringRef key) const override;
472 
478  void Delete(const Twine& key) override;
479 
487  bool PutNumber(StringRef key, double value) override;
488 
496  bool SetDefaultNumber(StringRef key, double defaultValue) override;
497 
506  double GetNumber(StringRef key, double defaultValue) const override;
507 
515  bool PutString(StringRef key, StringRef value) override;
516 
524  bool SetDefaultString(StringRef key, StringRef defaultValue) override;
525 
535  std::string GetString(StringRef key, StringRef defaultValue) const override;
536 
544  bool PutBoolean(StringRef key, bool value) override;
545 
553  bool SetDefaultBoolean(StringRef key, bool defaultValue) override;
554 
564  bool GetBoolean(StringRef key, bool defaultValue) const override;
565 
577  bool PutBooleanArray(StringRef key, ArrayRef<int> value) override;
578 
587  ArrayRef<int> defaultValue) override;
588 
605  std::vector<int> GetBooleanArray(StringRef key,
606  ArrayRef<int> defaultValue) const override;
607 
615  bool PutNumberArray(StringRef key, ArrayRef<double> value) override;
616 
625  ArrayRef<double> defaultValue) override;
626 
639  std::vector<double> GetNumberArray(
640  StringRef key, ArrayRef<double> defaultValue) const override;
641 
649  bool PutStringArray(StringRef key, ArrayRef<std::string> value) override;
650 
659  ArrayRef<std::string> defaultValue) override;
660 
673  std::vector<std::string> GetStringArray(
674  StringRef key, ArrayRef<std::string> defaultValue) const override;
675 
683  bool PutRaw(StringRef key, StringRef value) override;
684 
692  bool SetDefaultRaw(StringRef key, StringRef defaultValue) override;
693 
706  std::string GetRaw(StringRef key, StringRef defaultValue) const override;
707 
715  bool PutValue(const Twine& key, std::shared_ptr<Value> value) override;
716 
724  bool SetDefaultValue(const Twine& key,
725  std::shared_ptr<Value> defaultValue) override;
726 
734  std::shared_ptr<Value> GetValue(const Twine& key) const override;
735 
741  StringRef GetPath() const override;
742 
750  const char* SaveEntries(const Twine& filename) const;
751 
760  const char* LoadEntries(
761  const Twine& filename,
762  std::function<void(size_t line, const char* msg)> warn);
763 };
764 
765 #ifdef __GNUC__
766 #pragma GCC diagnostic pop
767 #endif
768 
769 } // namespace nt
770 
771 // For backwards compatability
772 #ifndef NAMESPACED_NT
773 using nt::NetworkTable; // NOLINT
774 #endif
775 
776 #endif // NTCORE_NETWORKTABLES_NETWORKTABLE_H_
bool SetDefaultNumber(StringRef key, double defaultValue) override
Gets the current value in the table, setting it if it does not exist.
bool PutBoolean(StringRef key, bool value) override
Put a boolean in the table.
std::shared_ptr< NetworkTable > GetSubTable(const Twine &key) const override
Returns the table at the specified key.
std::string GetString(StringRef key, StringRef defaultValue) const override
Gets the string associated with the given name.
void ClearPersistent(StringRef key) override
Stop making a key's value persistent through program restarts.
std::vector< std::string > GetStringArray(StringRef key, ArrayRef< std::string > defaultValue) const override
Returns the string array the key maps to.
double GetNumber(StringRef key, double defaultValue) const override
Gets the number associated with the given name.
static StringRef BasenameKey(StringRef key)
Gets the "base name" of a key.
void RemoveEntryListener(NT_EntryListener listener) const
Remove an entry listener.
bool SetDefaultStringArray(StringRef key, ArrayRef< std::string > defaultValue) override
Gets the current value in the table, setting it if it does not exist.
bool PutBooleanArray(StringRef key, ArrayRef< int > value) override
Put a boolean array in the table.
static void SetNetworkIdentity(StringRef name)
Sets the network identity.
static const char PATH_SEPARATOR_CHAR
The path separator for sub-tables and keys.
Definition: NetworkTable.h:130
void RemoveTableListener(NT_EntryListener listener) const
Remove a sub-table listener.
const char * SaveEntries(const Twine &filename) const
Save table values to a file.
void SetPersistent(StringRef key) override
Makes a key's value persistent through program restarts.
void SetServer(const char *server_name, unsigned int port)
Sets server address and port for client (without restarting client).
Definition: SmallVector.h:946
StringRef GetPath() const override
Gets the full path of this table.
bool ContainsKey(const Twine &key) const override
Determines whether the given key is in this table.
bool PutRaw(StringRef key, StringRef value) override
Put a raw value (byte array) in the table.
bool SetDefaultValue(const Twine &key, std::shared_ptr< Value > defaultValue) override
Gets the current value in the table, setting it if it does not exist.
const char * LoadEntries(const Twine &filename, std::function< void(size_t line, const char *msg)> warn)
Load table values from a file.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: ArrayRef.h:41
void StartDSClient(unsigned int port)
Starts requesting server address from Driver Station.
std::vector< int > GetBooleanArray(StringRef key, ArrayRef< int > defaultValue) const override
Returns the boolean array the key maps to.
bool PutNumber(StringRef key, double value) override
Put a number in the table.
std::string GetRaw(StringRef key, StringRef defaultValue) const override
Returns the raw value (byte array) the key maps to.
NetworkTables Instance.
Definition: NetworkTableInstance.h:53
static std::vector< std::string > GetHierarchy(const Twine &key)
Gets a list of the names of all the super tables of a given key.
void StartServer(StringRef persist_filename, const char *listen_address, unsigned int port)
Starts a server using the specified filename, listening address, and port.
std::shared_ptr< Value > GetValue(const Twine &key) const override
Gets the value associated with a key as an object.
bool ContainsSubTable(const Twine &key) const override
Determines whether there exists a non-empty subtable for this key in this table.
void StopServer()
Stops the server if it is running.
std::vector< std::string > GetKeys(int types=0) const override
Gets all keys in the table (not including sub-tables).
NT_EntryListener AddSubTableListener(TableListener listener, bool localNotify=false) const
Listen for sub-table creation.
NT_Entry GetEntry(NT_Inst inst, const Twine &name)
Get Entry Handle.
bool SetDefaultBoolean(StringRef key, bool defaultValue) override
Gets the current value in the table, setting it if it does not exist.
bool IsPersistent(StringRef key) const override
Returns whether the value is persistent through program restarts.
static void Flush()
Flushes all updated values immediately to the network.
NetworkTables (ntcore) namespace.
Definition: ITable.h:21
void StopClient()
Stops the client if it is running.
void DeleteAllEntries()
Delete All Entries.
bool PutString(StringRef key, StringRef value) override
Put a string in the table.
bool GetBoolean(StringRef key, bool defaultValue) const override
Gets the boolean associated with the given name.
static const char * SavePersistent(StringRef filename)
Saves persistent keys to a file.
bool PutStringArray(StringRef key, ArrayRef< std::string > value) override
Put a string array in the table.
void ClearFlags(StringRef key, unsigned int flags) override
Clears flags on the specified key in this table.
void StartClient()
Starts a client.
std::function< void(NetworkTable *table, StringRef name, NetworkTableEntry entry, std::shared_ptr< Value > value, int flags)> TableEntryListener
A listener that listens to changes in values in a NetworkTable.
Definition: TableEntryListener.h:41
NetworkTable(NT_Inst inst, const Twine &path, const private_init &)
Constructor.
NetworkTableInstance GetInstance() const
Gets the instance for the table.
static void SetClientMode()
set that network tables should be a client This must be called before initialize or GetTable ...
std::vector< std::string > GetSubTables() const override
Gets the names of all subtables in the table.
bool SetDefaultRaw(StringRef key, StringRef defaultValue) override
Gets the current value in the table, setting it if it does not exist.
void StartClientTeam(NT_Inst inst, unsigned int team, unsigned int port)
Starts a client using commonly known robot addresses for the specified team.
WPI_DEPRECATED("use NetworkTableInstance::StartServer() or ""NetworkTableInstance::StartClient() instead") static void Initialize()
Initializes network tables.
void SetServerTeam(NT_Inst inst, unsigned int team, unsigned int port)
Sets server addresses and port for client (without restarting client).
bool SetDefaultNumberArray(StringRef key, ArrayRef< double > defaultValue) override
Gets the current value in the table, setting it if it does not exist.
static void SetServerMode()
set that network tables should be a server This must be called before initialize or GetTable ...
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
static const char * LoadPersistent(StringRef filename, std::function< void(size_t line, const char *msg)> warn)
Loads persistent keys from a file.
static void SetUpdateRate(double interval)
Set the periodic update rate.
bool SetDefaultString(StringRef key, StringRef defaultValue) override
Gets the current value in the table, setting it if it does not exist.
NetworkTables Entry.
Definition: NetworkTableEntry.h:38
void SetFlags(StringRef key, unsigned int flags) override
Sets flags on the specified key in this table.
std::vector< double > GetNumberArray(StringRef key, ArrayRef< double > defaultValue) const override
Returns the number array the key maps to.
std::function< void(NetworkTable *parent, StringRef name, NetworkTable *table)> TableListener
A listener that listens to new sub-tables in a NetworkTable.
Definition: TableListener.h:35
NT_EntryListener AddEntryListener(TableEntryListener listener, unsigned int flags) const
Listen to keys only within this table.
static std::string NormalizeKey(const Twine &key, bool withLeadingSlash=true)
Normalizes an network table key to contain no consecutive slashes and optionally start with a leading...
bool PutNumberArray(StringRef key, ArrayRef< double > value) override
Put a number array in the table.
A network table entry value.
Definition: NetworkTableValue.h:36
A network table that knows its subtable path.
Definition: NetworkTable.h:51
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:79
bool SetDefaultBooleanArray(StringRef key, ArrayRef< int > defaultValue) override
Gets the current value in the table, setting it if it does not exist.
bool PutValue(const Twine &key, std::shared_ptr< Value > value) override
Put a value in the table.
void StopDSClient()
Stops requesting server address from Driver Station.
static void GlobalDeleteAll()
Deletes ALL keys in ALL subtables.
void Delete(const Twine &key) override
Deletes the specified key in this table.
unsigned int GetFlags(StringRef key) const override
Returns the flags for the specified key.