[wpilib] SpeedControllerGroup: Add vector-taking constructor (#2194)

This allows the list to be constructed dynamically.

Co-authored-by: Thad House <thadhouse1@gmail.com>
This commit is contained in:
Peter Johnson
2020-04-03 08:39:57 -07:00
committed by GitHub
parent 21aafea098
commit 576d427f03
4 changed files with 46 additions and 15 deletions

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2016-2018 FIRST. All Rights Reserved. */
/* Copyright (c) 2016-2020 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. */
@@ -8,9 +8,27 @@
#include "frc/SpeedControllerGroup.h"
#include "frc/smartdashboard/SendableBuilder.h"
#include "frc/smartdashboard/SendableRegistry.h"
using namespace frc;
// Can't use a delegated constructor here because of an MSVC bug.
// https://developercommunity.visualstudio.com/content/problem/583/compiler-bug-with-delegating-a-constructor.html
SpeedControllerGroup::SpeedControllerGroup(
std::vector<std::reference_wrapper<SpeedController>>&& speedControllers)
: m_speedControllers(std::move(speedControllers)) {
Initialize();
}
void SpeedControllerGroup::Initialize() {
for (auto& speedController : m_speedControllers)
SendableRegistry::GetInstance().AddChild(this, &speedController.get());
static int instances = 0;
++instances;
SendableRegistry::GetInstance().Add(this, "SpeedControllerGroup", instances);
}
void SpeedControllerGroup::Set(double speed) {
for (auto speedController : m_speedControllers) {
speedController.get().Set(m_isInverted ? -speed : speed);

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2016-2019 FIRST. All Rights Reserved. */
/* Copyright (c) 2016-2020 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. */
@@ -23,7 +23,8 @@ class SpeedControllerGroup : public Sendable,
template <class... SpeedControllers>
explicit SpeedControllerGroup(SpeedController& speedController,
SpeedControllers&... speedControllers);
~SpeedControllerGroup() override = default;
explicit SpeedControllerGroup(
std::vector<std::reference_wrapper<SpeedController>>&& speedControllers);
SpeedControllerGroup(SpeedControllerGroup&&) = default;
SpeedControllerGroup& operator=(SpeedControllerGroup&&) = default;
@@ -41,6 +42,8 @@ class SpeedControllerGroup : public Sendable,
private:
bool m_isInverted = false;
std::vector<std::reference_wrapper<SpeedController>> m_speedControllers;
void Initialize();
};
} // namespace frc

View File

@@ -1,5 +1,5 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2016-2019 FIRST. All Rights Reserved. */
/* Copyright (c) 2016-2020 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. */
@@ -7,19 +7,17 @@
#pragma once
#include "frc/smartdashboard/SendableRegistry.h"
#include <functional>
#include <vector>
namespace frc {
template <class... SpeedControllers>
SpeedControllerGroup::SpeedControllerGroup(
SpeedController& speedController, SpeedControllers&... speedControllers)
: m_speedControllers{speedController, speedControllers...} {
for (auto& speedController : m_speedControllers)
SendableRegistry::GetInstance().AddChild(this, &speedController.get());
static int instances = 0;
++instances;
SendableRegistry::GetInstance().Add(this, "SpeedControllerGroup", instances);
: m_speedControllers(std::vector<std::reference_wrapper<SpeedController>>{
speedController, speedControllers...}) {
Initialize();
}
} // namespace frc