/*----------------------------------------------------------------------------*/ /* Copyright (c) 2011-2019 FIRST. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #pragma once #include #include #include #include #include #include "frc/ErrorBase.h" #include "frc/smartdashboard/ListenerExecutor.h" #include "frc/smartdashboard/Sendable.h" #include "frc/smartdashboard/SendableHelper.h" namespace frc { class SmartDashboard : public ErrorBase, public Sendable, public SendableHelper { public: static void init(); /** * Determines whether the given key is in this table. * * @param key the key to search for * @return true if the table as a value assigned to the given key */ static bool ContainsKey(wpi::StringRef key); /** * @param types bitmask of types; 0 is treated as a "don't care". * @return keys currently in the table */ static std::vector GetKeys(int types = 0); /** * Makes a key's value persistent through program restarts. * * @param key the key to make persistent */ static void SetPersistent(wpi::StringRef key); /** * Stop making a key's value persistent through program restarts. * The key cannot be null. * * @param key the key name */ static void ClearPersistent(wpi::StringRef key); /** * Returns whether the value is persistent through program restarts. * The key cannot be null. * * @param key the key name */ static bool IsPersistent(wpi::StringRef key); /** * Sets flags on the specified key in this table. The key can * not be null. * * @param key the key name * @param flags the flags to set (bitmask) */ static void SetFlags(wpi::StringRef key, unsigned int flags); /** * Clears flags on the specified key in this table. The key can * not be null. * * @param key the key name * @param flags the flags to clear (bitmask) */ static void ClearFlags(wpi::StringRef key, unsigned int flags); /** * Returns the flags for the specified key. * * @param key the key name * @return the flags, or 0 if the key is not defined */ static unsigned int GetFlags(wpi::StringRef key); /** * Deletes the specified key in this table. * * @param key the key name */ static void Delete(wpi::StringRef key); /** * Returns an NT Entry mapping to the specified key * * This is useful if an entry is used often, or is read and then modified. * * @param key the key * @return the entry for the key */ static nt::NetworkTableEntry GetEntry(wpi::StringRef key); /** * Maps the specified key to the specified value in this table. * * The value can be retrieved by calling the get method with a key that is * equal to the original key. * * In order for the value to appear in the dashboard, it must be registered * with SendableRegistry. WPILib components do this automatically. * * @param keyName the key * @param value the value */ static void PutData(wpi::StringRef key, Sendable* data); /** * Maps the specified key (where the key is the name of the Sendable) * to the specified value in this table. * * The value can be retrieved by calling the get method with a key that is * equal to the original key. * * In order for the value to appear in the dashboard, it must be registered * with SendableRegistry. WPILib components do this automatically. * * @param value the value */ static void PutData(Sendable* value); /** * Returns the value at the specified key. * * @param keyName the key * @return the value */ static Sendable* GetData(wpi::StringRef keyName); /** * Maps the specified key to the specified value in this table. * * The value can be retrieved by calling the get method with a key that is * equal to the original key. * * @param keyName the key * @param value the value * @return False if the table key already exists with a different type */ static bool PutBoolean(wpi::StringRef keyName, bool value); /** * Gets the current value in the table, setting it if it does not exist. * @param key the key * @param defaultValue the default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultBoolean(wpi::StringRef key, bool defaultValue); /** * Returns the value at the specified key. * * If the key is not found, returns the default value. * * @param keyName the key * @return the value */ static bool GetBoolean(wpi::StringRef keyName, bool defaultValue); /** * Maps the specified key to the specified value in this table. * * The value can be retrieved by calling the get method with a key that is * equal to the original key. * * @param keyName the key * @param value the value * @return False if the table key already exists with a different type */ static bool PutNumber(wpi::StringRef keyName, double value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key The key. * @param defaultValue The default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultNumber(wpi::StringRef key, double defaultValue); /** * Returns the value at the specified key. * * If the key is not found, returns the default value. * * @param keyName the key * @return the value */ static double GetNumber(wpi::StringRef keyName, double defaultValue); /** * Maps the specified key to the specified value in this table. * * The value can be retrieved by calling the get method with a key that is * equal to the original key. * * @param keyName the key * @param value the value * @return False if the table key already exists with a different type */ static bool PutString(wpi::StringRef keyName, wpi::StringRef value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key the key * @param defaultValue the default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultString(wpi::StringRef key, wpi::StringRef defaultValue); /** * Returns the value at the specified key. * * If the key is not found, returns the default value. * * @param keyName the key * @return the value */ static std::string GetString(wpi::StringRef keyName, wpi::StringRef defaultValue); /** * Put a boolean array in the table. * * @param key the key to be assigned to * @param value the value that will be assigned * @return False if the table key already exists with a different type * * @note The array must be of int's rather than of bool's because * std::vector is special-cased in C++. 0 is false, any * non-zero value is true. */ static bool PutBooleanArray(wpi::StringRef key, wpi::ArrayRef value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key the key * @param defaultValue the default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultBooleanArray(wpi::StringRef key, wpi::ArrayRef defaultValue); /** * Returns the boolean array the key maps to. * * If the key does not exist or is of different type, it will return the * default value. * * @param key The key to look up. * @param defaultValue The value to be returned if no value is found. * @return the value associated with the given key or the given default value * if there is no value associated with the key * * @note This makes a copy of the array. If the overhead of this is a concern, * use GetValue() instead. * * @note The returned array is std::vector instead of std::vector * because std::vector is special-cased in C++. 0 is false, any * non-zero value is true. */ static std::vector GetBooleanArray(wpi::StringRef key, wpi::ArrayRef defaultValue); /** * Put a number array in the table. * * @param key The key to be assigned to. * @param value The value that will be assigned. * @return False if the table key already exists with a different type */ static bool PutNumberArray(wpi::StringRef key, wpi::ArrayRef value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key The key. * @param defaultValue The default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultNumberArray(wpi::StringRef key, wpi::ArrayRef defaultValue); /** * Returns the number array the key maps to. * * If the key does not exist or is of different type, it will return the * default value. * * @param key The key to look up. * @param defaultValue The value to be returned if no value is found. * @return the value associated with the given key or the given default value * if there is no value associated with the key * * @note This makes a copy of the array. If the overhead of this is a concern, * use GetValue() instead. */ static std::vector GetNumberArray(wpi::StringRef key, wpi::ArrayRef defaultValue); /** * Put a string array in the table. * * @param key The key to be assigned to. * @param value The value that will be assigned. * @return False if the table key already exists with a different type */ static bool PutStringArray(wpi::StringRef key, wpi::ArrayRef value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key The key. * @param defaultValue The default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultStringArray(wpi::StringRef key, wpi::ArrayRef defaultValue); /** * Returns the string array the key maps to. * * If the key does not exist or is of different type, it will return the * default value. * * @param key The key to look up. * @param defaultValue The value to be returned if no value is found. * @return the value associated with the given key or the given default value * if there is no value associated with the key * * @note This makes a copy of the array. If the overhead of this is a concern, * use GetValue() instead. */ static std::vector GetStringArray( wpi::StringRef key, wpi::ArrayRef defaultValue); /** * Put a raw value (byte array) in the table. * * @param key The key to be assigned to. * @param value The value that will be assigned. * @return False if the table key already exists with a different type */ static bool PutRaw(wpi::StringRef key, wpi::StringRef value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key The key. * @param defaultValue The default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultRaw(wpi::StringRef key, wpi::StringRef defaultValue); /** * Returns the raw value (byte array) the key maps to. * * If the key does not exist or is of different type, it will return the * default value. * * @param key The key to look up. * @param defaultValue The value to be returned if no value is found. * @return the value associated with the given key or the given default value * if there is no value associated with the key * * @note This makes a copy of the raw contents. If the overhead of this is a * concern, use GetValue() instead. */ static std::string GetRaw(wpi::StringRef key, wpi::StringRef defaultValue); /** * Maps the specified key to the specified complex value (such as an array) in * this table. * * The value can be retrieved by calling the RetrieveValue method with a key * that is equal to the original key. * * @param keyName the key * @param value the value * @return False if the table key already exists with a different type */ static bool PutValue(wpi::StringRef keyName, std::shared_ptr value); /** * Gets the current value in the table, setting it if it does not exist. * * @param key the key * @param defaultValue The default value to set if key doesn't exist. * @returns False if the table key exists with a different type */ static bool SetDefaultValue(wpi::StringRef key, std::shared_ptr defaultValue); /** * Retrieves the complex value (such as an array) in this table into the * complex data object. * * @param keyName the key * @param value the object to retrieve the value into */ static std::shared_ptr GetValue(wpi::StringRef keyName); /** * Posts a task from a listener to the ListenerExecutor, so that it can be run * synchronously from the main loop on the next call to {@link * SmartDashboard#updateValues()}. * * @param task The task to run synchronously from the main thread. */ static void PostListenerTask(std::function task); /** * Puts all sendable data to the dashboard. */ static void UpdateValues(); private: virtual ~SmartDashboard() = default; static detail::ListenerExecutor listenerExecutor; }; } // namespace frc