Fix SmartDashboard PutData to hook setters. (#851)

* Fix SmartDashboard PutData to hook setters.

Also update all PutData values in main periodic loop (same as LiveWindow).

* Improve SmartDashboard.putData() repeat call handling.
This commit is contained in:
Peter Johnson
2017-12-26 17:18:02 -06:00
committed by bradamiller
parent a3e5378d14
commit 40eb6dfc9b
8 changed files with 97 additions and 25 deletions

View File

@@ -20,7 +20,11 @@
using namespace frc;
namespace {
struct SmartDashboardData {
class SmartDashboardData {
public:
SmartDashboardData() = default;
explicit SmartDashboardData(Sendable* sendable_) : sendable(sendable_) {}
Sendable* sendable = nullptr;
SendableBuilderImpl builder;
};
@@ -157,11 +161,12 @@ void SmartDashboard::PutData(llvm::StringRef key, Sendable* data) {
std::lock_guard<wpi::mutex> lock(inst.tablesToDataMutex);
auto& sddata = inst.tablesToData[key];
if (!sddata.sendable || sddata.sendable != data) {
sddata.sendable = data;
sddata = SmartDashboardData(data);
sddata.builder.SetTable(inst.table->GetSubTable(key));
data->InitSendable(sddata.builder);
sddata.builder.UpdateTable();
sddata.builder.StartListeners();
}
sddata.builder.UpdateTable();
}
/**
@@ -541,3 +546,14 @@ std::string SmartDashboard::GetRaw(llvm::StringRef key,
llvm::StringRef defaultValue) {
return Singleton::GetInstance().table->GetEntry(key).GetRaw(defaultValue);
}
/**
* Puts all sendable data to the dashboard.
*/
void SmartDashboard::UpdateValues() {
auto& inst = Singleton::GetInstance();
std::lock_guard<wpi::mutex> lock(inst.tablesToDataMutex);
for (auto& i : inst.tablesToData) {
i.getValue().builder.UpdateTable();
}
}