diff --git a/wpilibc/src/main/native/cpp/SpeedControllerGroup.cpp b/wpilibc/src/main/native/cpp/SpeedControllerGroup.cpp index a807afcf33..7e13f27cdd 100644 --- a/wpilibc/src/main/native/cpp/SpeedControllerGroup.cpp +++ b/wpilibc/src/main/native/cpp/SpeedControllerGroup.cpp @@ -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>&& 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); diff --git a/wpilibc/src/main/native/include/frc/SpeedControllerGroup.h b/wpilibc/src/main/native/include/frc/SpeedControllerGroup.h index 80adf1cc07..e62563ce44 100644 --- a/wpilibc/src/main/native/include/frc/SpeedControllerGroup.h +++ b/wpilibc/src/main/native/include/frc/SpeedControllerGroup.h @@ -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 explicit SpeedControllerGroup(SpeedController& speedController, SpeedControllers&... speedControllers); - ~SpeedControllerGroup() override = default; + explicit SpeedControllerGroup( + std::vector>&& speedControllers); SpeedControllerGroup(SpeedControllerGroup&&) = default; SpeedControllerGroup& operator=(SpeedControllerGroup&&) = default; @@ -41,6 +42,8 @@ class SpeedControllerGroup : public Sendable, private: bool m_isInverted = false; std::vector> m_speedControllers; + + void Initialize(); }; } // namespace frc diff --git a/wpilibc/src/main/native/include/frc/SpeedControllerGroup.inc b/wpilibc/src/main/native/include/frc/SpeedControllerGroup.inc index 5848746f4f..d9e773d8e3 100644 --- a/wpilibc/src/main/native/include/frc/SpeedControllerGroup.inc +++ b/wpilibc/src/main/native/include/frc/SpeedControllerGroup.inc @@ -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 +#include namespace frc { template 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>{ + speedController, speedControllers...}) { + Initialize(); } } // namespace frc diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java index 7dd3f76e9f..81b5470713 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SpeedControllerGroup.java @@ -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,6 +7,8 @@ package edu.wpi.first.wpilibj; +import java.util.Arrays; + import edu.wpi.first.wpilibj.smartdashboard.SendableBuilder; import edu.wpi.first.wpilibj.smartdashboard.SendableRegistry; @@ -28,13 +30,23 @@ public class SpeedControllerGroup implements SpeedController, Sendable, AutoClos SpeedController... speedControllers) { m_speedControllers = new SpeedController[speedControllers.length + 1]; m_speedControllers[0] = speedController; - SendableRegistry.addChild(this, speedController); for (int i = 0; i < speedControllers.length; i++) { m_speedControllers[i + 1] = speedControllers[i]; - SendableRegistry.addChild(this, speedControllers[i]); + } + init(); + } + + public SpeedControllerGroup(SpeedController[] speedControllers) { + m_speedControllers = Arrays.copyOf(speedControllers, speedControllers.length); + init(); + } + + private void init() { + for (SpeedController controller : m_speedControllers) { + SendableRegistry.addChild(this, controller); } instances++; - SendableRegistry.addLW(this, "tSpeedControllerGroup", instances); + SendableRegistry.addLW(this, "SpeedControllerGroup", instances); } @Override