2020-12-26 14:12:05 -08:00
|
|
|
// 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.
|
2020-10-30 13:55:38 -07:00
|
|
|
|
|
|
|
|
#include "frc/smartdashboard/Field2d.h"
|
|
|
|
|
|
|
|
|
|
#include "frc/smartdashboard/SendableBuilder.h"
|
2020-12-24 12:26:03 -08:00
|
|
|
#include "frc/smartdashboard/SendableRegistry.h"
|
2020-10-30 13:55:38 -07:00
|
|
|
|
|
|
|
|
using namespace frc;
|
|
|
|
|
|
|
|
|
|
Field2d::Field2d() {
|
|
|
|
|
m_objects.emplace_back(
|
|
|
|
|
std::make_unique<FieldObject2d>("Robot", FieldObject2d::private_init{}));
|
|
|
|
|
m_objects[0]->SetPose(Pose2d{});
|
2020-12-24 12:26:03 -08:00
|
|
|
SendableRegistry::GetInstance().Add(this, "Field");
|
2020-10-30 13:55:38 -07:00
|
|
|
}
|
|
|
|
|
|
2020-12-24 12:26:03 -08:00
|
|
|
Field2d::Field2d(Field2d&& rhs) : SendableHelper(std::move(rhs)) {
|
2020-12-23 20:36:51 -08:00
|
|
|
std::swap(m_table, rhs.m_table);
|
|
|
|
|
std::swap(m_objects, rhs.m_objects);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Field2d& Field2d::operator=(Field2d&& rhs) {
|
2020-12-24 12:26:03 -08:00
|
|
|
SendableHelper::operator=(std::move(rhs));
|
|
|
|
|
|
2020-12-23 20:36:51 -08:00
|
|
|
std::swap(m_table, rhs.m_table);
|
|
|
|
|
std::swap(m_objects, rhs.m_objects);
|
|
|
|
|
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-30 13:55:38 -07:00
|
|
|
void Field2d::SetRobotPose(const Pose2d& pose) {
|
|
|
|
|
std::scoped_lock lock(m_mutex);
|
|
|
|
|
m_objects[0]->SetPose(pose);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Field2d::SetRobotPose(units::meter_t x, units::meter_t y,
|
|
|
|
|
Rotation2d rotation) {
|
|
|
|
|
std::scoped_lock lock(m_mutex);
|
|
|
|
|
m_objects[0]->SetPose(x, y, rotation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Pose2d Field2d::GetRobotPose() const {
|
|
|
|
|
std::scoped_lock lock(m_mutex);
|
|
|
|
|
return m_objects[0]->GetPose();
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-26 17:44:18 -07:00
|
|
|
FieldObject2d* Field2d::GetObject(std::string_view name) {
|
2020-10-30 13:55:38 -07:00
|
|
|
std::scoped_lock lock(m_mutex);
|
|
|
|
|
for (auto&& obj : m_objects) {
|
2021-05-26 17:44:18 -07:00
|
|
|
if (obj->m_name == name) {
|
2020-12-28 12:58:06 -08:00
|
|
|
return obj.get();
|
|
|
|
|
}
|
2020-10-30 13:55:38 -07:00
|
|
|
}
|
2021-05-26 17:44:18 -07:00
|
|
|
m_objects.emplace_back(
|
|
|
|
|
std::make_unique<FieldObject2d>(name, FieldObject2d::private_init{}));
|
2020-10-30 13:55:38 -07:00
|
|
|
auto obj = m_objects.back().get();
|
2020-12-28 12:58:06 -08:00
|
|
|
if (m_table) {
|
|
|
|
|
obj->m_entry = m_table->GetEntry(obj->m_name);
|
|
|
|
|
}
|
2020-10-30 13:55:38 -07:00
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FieldObject2d* Field2d::GetRobotObject() {
|
|
|
|
|
std::scoped_lock lock(m_mutex);
|
|
|
|
|
return m_objects[0].get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Field2d::InitSendable(SendableBuilder& builder) {
|
|
|
|
|
builder.SetSmartDashboardType("Field2d");
|
|
|
|
|
m_table = builder.GetTable();
|
|
|
|
|
|
|
|
|
|
std::scoped_lock lock(m_mutex);
|
|
|
|
|
for (auto&& obj : m_objects) {
|
|
|
|
|
std::scoped_lock lock2(obj->m_mutex);
|
|
|
|
|
obj->m_entry = m_table->GetEntry(obj->m_name);
|
|
|
|
|
obj->UpdateEntry(true);
|
|
|
|
|
}
|
|
|
|
|
}
|