// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include namespace frc { class SendableBuilderImpl : public nt::NTSendableBuilder { public: SendableBuilderImpl() = default; ~SendableBuilderImpl() override = default; SendableBuilderImpl(SendableBuilderImpl&&) = default; SendableBuilderImpl& operator=(SendableBuilderImpl&&) = default; /** * Set the network table. Must be called prior to any Add* functions being * called. * @param table Network table */ void SetTable(std::shared_ptr table); /** * Get the network table. * @return The network table */ std::shared_ptr GetTable() override; /** * Return whether this sendable has an associated table. * @return True if it has a table, false if not. */ bool IsPublished() const override; /** * Return whether this sendable should be treated as an actuator. * @return True if actuator, false if not. */ bool IsActuator() const; /** * Synchronize with network table values by calling the getters for all * properties and setters when the network table value has changed. */ void Update() override; /** * Hook setters for all properties. */ void StartListeners(); /** * Unhook setters for all properties. */ void StopListeners(); /** * Start LiveWindow mode by hooking the setters for all properties. Also * calls the SafeState function if one was provided. */ void StartLiveWindowMode(); /** * Stop LiveWindow mode by unhooking the setters for all properties. Also * calls the SafeState function if one was provided. */ void StopLiveWindowMode(); /** * Clear properties. */ void ClearProperties() override; void SetSmartDashboardType(std::string_view type) override; void SetActuator(bool value) override; void SetSafeState(std::function func) override; void SetUpdateTable(wpi::unique_function func) override; nt::Topic GetTopic(std::string_view key) override; void AddBooleanProperty(std::string_view key, std::function getter, std::function setter) override; void PublishConstBoolean(std::string_view key, bool value) override; void AddIntegerProperty(std::string_view key, std::function getter, std::function setter) override; void PublishConstInteger(std::string_view key, int64_t value) override; void AddFloatProperty(std::string_view key, std::function getter, std::function setter) override; void PublishConstFloat(std::string_view key, float value) override; void AddDoubleProperty(std::string_view key, std::function getter, std::function setter) override; void PublishConstDouble(std::string_view key, double value) override; void AddStringProperty(std::string_view key, std::function getter, std::function setter) override; void PublishConstString(std::string_view key, std::string_view value) override; void AddBooleanArrayProperty( std::string_view key, std::function()> getter, std::function)> setter) override; void PublishConstBooleanArray(std::string_view key, std::span value) override; void AddIntegerArrayProperty( std::string_view key, std::function()> getter, std::function)> setter) override; void PublishConstIntegerArray(std::string_view key, std::span value) override; void AddFloatArrayProperty( std::string_view key, std::function()> getter, std::function)> setter) override; void PublishConstFloatArray(std::string_view key, std::span value) override; void AddDoubleArrayProperty( std::string_view key, std::function()> getter, std::function)> setter) override; void PublishConstDoubleArray(std::string_view key, std::span value) override; void AddStringArrayProperty( std::string_view key, std::function()> getter, std::function)> setter) override; void PublishConstStringArray(std::string_view key, std::span value) override; void AddRawProperty( std::string_view key, std::string_view typeString, std::function()> getter, std::function)> setter) override; void PublishConstRaw(std::string_view key, std::string_view typeString, std::span value) override; void AddSmallStringProperty( std::string_view key, std::function& buf)> getter, std::function setter) override; void AddSmallBooleanArrayProperty( std::string_view key, std::function(wpi::SmallVectorImpl& buf)> getter, std::function)> setter) override; void AddSmallIntegerArrayProperty( std::string_view key, std::function< std::span(wpi::SmallVectorImpl& buf)> getter, std::function)> setter) override; void AddSmallFloatArrayProperty( std::string_view key, std::function(wpi::SmallVectorImpl& buf)> getter, std::function)> setter) override; void AddSmallDoubleArrayProperty( std::string_view key, std::function(wpi::SmallVectorImpl& buf)> getter, std::function)> setter) override; void AddSmallStringArrayProperty( std::string_view key, std::function< std::span(wpi::SmallVectorImpl& buf)> getter, std::function)> setter) override; void AddSmallRawProperty( std::string_view key, std::string_view typeString, std::function(wpi::SmallVectorImpl& buf)> getter, std::function)> setter) override; private: struct Property { virtual ~Property() = default; virtual void Update(bool controllable, int64_t time) = 0; }; template struct PropertyImpl : public Property { void Update(bool controllable, int64_t time) override; using Publisher = typename Topic::PublisherType; using Subscriber = typename Topic::SubscriberType; Publisher pub; Subscriber sub; std::function updateNetwork; std::function updateLocal; }; template void AddPropertyImpl(Topic topic, Getter getter, Setter setter); template void PublishConstImpl(Topic topic, Value value); template void AddSmallPropertyImpl(Topic topic, Getter getter, Setter setter); std::vector> m_properties; std::function m_safeState; std::vector> m_updateTables; std::shared_ptr m_table; bool m_controllable = false; bool m_actuator = false; nt::BooleanPublisher m_controllablePublisher; nt::StringPublisher m_typePublisher; nt::BooleanPublisher m_actuatorPublisher; }; } // namespace frc