[sim] Add DoubleSolenoidSim and SolenoidSim classes (#3177)

This commit is contained in:
Starlight220
2021-02-17 04:03:57 +02:00
committed by GitHub
parent cb7f39afa1
commit d241bc81ae
15 changed files with 747 additions and 0 deletions

View File

@@ -148,6 +148,14 @@ void DoubleSolenoid::Toggle() {
}
}
int DoubleSolenoid::GetFwdChannel() const {
return m_forwardChannel;
}
int DoubleSolenoid::GetRevChannel() const {
return m_reverseChannel;
}
bool DoubleSolenoid::IsFwdSolenoidBlackListed() const {
int blackList = GetPCMSolenoidBlackList(m_moduleNumber);
return (blackList & m_forwardMask) != 0;

View File

@@ -79,6 +79,10 @@ void Solenoid::Toggle() {
Set(!Get());
}
int Solenoid::GetChannel() const {
return m_channel;
}
bool Solenoid::IsBlackListed() const {
int value = GetPCMSolenoidBlackList(m_moduleNumber) & (1 << m_channel);
return (value != 0);

View File

@@ -58,3 +58,7 @@ void SolenoidBase::ClearAllPCMStickyFaults() {
}
SolenoidBase::SolenoidBase(int moduleNumber) : m_moduleNumber(moduleNumber) {}
int SolenoidBase::GetModuleNumber() const {
return m_moduleNumber;
}

View File

@@ -0,0 +1,91 @@
// 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.
#include "frc/simulation/DoubleSolenoidSim.h"
#include "frc/SensorUtil.h"
#include "frc/simulation/PCMSim.h"
using namespace frc;
using namespace frc::sim;
DoubleSolenoidSim::DoubleSolenoidSim(int fwd, int rev)
: m_fwd{fwd}, m_rev{rev} {}
DoubleSolenoidSim::DoubleSolenoidSim(int module, int fwd, int rev)
: m_pcm{module}, m_fwd{fwd}, m_rev{rev} {}
DoubleSolenoidSim::DoubleSolenoidSim(PCMSim& pcm, int fwd, int rev)
: m_pcm{pcm}, m_fwd{fwd}, m_rev{rev} {}
DoubleSolenoidSim::DoubleSolenoidSim(DoubleSolenoid& solenoid)
: m_pcm{solenoid.GetModuleNumber()},
m_fwd{solenoid.GetFwdChannel()},
m_rev{solenoid.GetRevChannel()} {}
std::unique_ptr<CallbackStore>
DoubleSolenoidSim::RegisterFwdInitializedCallback(NotifyCallback callback,
bool initialNotify) {
return m_pcm.RegisterSolenoidInitializedCallback(m_fwd, callback,
initialNotify);
}
bool DoubleSolenoidSim::GetFwdInitialized() const {
return m_pcm.GetSolenoidInitialized(m_fwd);
}
void DoubleSolenoidSim::SetFwdInitialized(bool initialized) {
m_pcm.SetSolenoidInitialized(m_fwd, initialized);
}
std::unique_ptr<CallbackStore>
DoubleSolenoidSim::RegisterRevInitializedCallback(NotifyCallback callback,
bool initialNotify) {
return m_pcm.RegisterSolenoidInitializedCallback(m_rev, callback,
initialNotify);
}
bool DoubleSolenoidSim::GetRevInitialized() const {
return m_pcm.GetSolenoidInitialized(m_rev);
}
void DoubleSolenoidSim::SetRevInitialized(bool initialized) {
m_pcm.SetSolenoidInitialized(m_rev, initialized);
}
void DoubleSolenoidSim::Set(DoubleSolenoid::Value value) {
bool forward = false;
bool reverse = false;
switch (value) {
case DoubleSolenoid::Value::kOff:
forward = false;
reverse = false;
break;
case DoubleSolenoid::Value::kForward:
forward = true;
reverse = false;
break;
case DoubleSolenoid::Value::kReverse:
forward = false;
reverse = true;
break;
}
m_pcm.SetSolenoidOutput(m_fwd, forward);
m_pcm.SetSolenoidOutput(m_rev, reverse);
}
DoubleSolenoid::Value DoubleSolenoidSim::Get() const {
bool valueForward = m_pcm.GetSolenoidOutput(m_fwd);
bool valueReverse = m_pcm.GetSolenoidOutput(m_rev);
if (valueForward) {
return DoubleSolenoid::Value::kForward;
} else if (valueReverse) {
return DoubleSolenoid::Value::kReverse;
} else {
return DoubleSolenoid::Value::kOff;
}
}

View File

@@ -0,0 +1,50 @@
// 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.
#include "frc/simulation/SolenoidSim.h"
#include "frc/SensorUtil.h"
#include "frc/simulation/PCMSim.h"
using namespace frc;
using namespace frc::sim;
SolenoidSim::SolenoidSim(int channel) : m_channel{channel} {}
SolenoidSim::SolenoidSim(int module, int channel)
: m_pcm{module}, m_channel{channel} {}
SolenoidSim::SolenoidSim(PCMSim& pcm, int channel)
: m_pcm{pcm}, m_channel{channel} {}
SolenoidSim::SolenoidSim(Solenoid& solenoid)
: m_pcm{solenoid.GetModuleNumber()}, m_channel{solenoid.GetChannel()} {}
std::unique_ptr<CallbackStore> SolenoidSim::RegisterInitializedCallback(
NotifyCallback callback, bool initialNotify) {
return m_pcm.RegisterSolenoidInitializedCallback(m_channel, callback,
initialNotify);
}
bool SolenoidSim::GetInitialized() const {
return m_pcm.GetSolenoidInitialized(m_channel);
}
void SolenoidSim::SetInitialized(bool initialized) {
m_pcm.SetSolenoidInitialized(m_channel, initialized);
}
std::unique_ptr<CallbackStore> SolenoidSim::RegisterOutputCallback(
NotifyCallback callback, bool initialNotify) {
return m_pcm.RegisterSolenoidOutputCallback(m_channel, callback,
initialNotify);
}
bool SolenoidSim::GetOutput() const {
return m_pcm.GetSolenoidOutput(m_channel);
}
void SolenoidSim::SetOutput(bool output) {
m_pcm.SetSolenoidOutput(m_channel, output);
}

View File

@@ -74,6 +74,20 @@ class DoubleSolenoid : public SolenoidBase,
*/
void Toggle();
/**
* Get the forward channel.
*
* @return the forward channel.
*/
int GetFwdChannel() const;
/**
* Get the reverse channel.
*
* @return the reverse channel.
*/
int GetRevChannel() const;
/**
* Check if the forward solenoid is blacklisted.
*

View File

@@ -66,6 +66,11 @@ class Solenoid : public SolenoidBase,
*/
void Toggle();
/**
* Get the channel this solenoid is connected to.
*/
int GetChannel() const;
/**
* Check if solenoid is blacklisted.
*

View File

@@ -14,6 +14,13 @@ namespace frc {
*/
class SolenoidBase : public ErrorBase {
public:
/**
* Get the CAN ID of the module this solenoid is connected to.
*
* @return the module number.
*/
int GetModuleNumber() const;
/**
* Read all 8 solenoids as a single byte
*

View File

@@ -0,0 +1,116 @@
// 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 <memory>
#include "frc/DoubleSolenoid.h"
#include "frc/simulation/CallbackStore.h"
#include "frc/simulation/PCMSim.h"
namespace frc::sim {
/**
* Class to control a simulated Pneumatic Control Module (PCM).
*/
class DoubleSolenoidSim {
public:
/**
* Constructs for a solenoid on the default PCM.
*
* @param channel the solenoid channel.
*/
DoubleSolenoidSim(int fwd, int rev);
/**
* Constructs for a solenoid on the given PCM.
*
* @param pcm the PCM the solenoid is connected to.
* @param channel the solenoid channel.
*/
DoubleSolenoidSim(int module, int fwd, int rev);
/**
* Constructs from a PCMSim object.
*
* @param pcm the PCM the solenoid is connected to.
*/
DoubleSolenoidSim(PCMSim& pcm, int fwd, int rev);
/**
* Constructs for the given solenoid.
*
* @param solenoid the solenoid to simulate.
*/
explicit DoubleSolenoidSim(DoubleSolenoid& solenoid);
/**
* Register a callback to be run when the forward solenoid is initialized.
*
* @param callback the callback
* @param initialNotify should the callback be run with the initial state
* @return the {@link CallbackStore} object associated with this callback.
*/
[[nodiscard]] std::unique_ptr<CallbackStore> RegisterFwdInitializedCallback(
NotifyCallback callback, bool initialNotify);
/**
* Check if the forward solenoid has been initialized.
*
* @return true if initialized
*/
bool GetFwdInitialized() const;
/**
* Define whether the forward solenoid has been initialized.
*
* @param initialized whether the solenoid is intiialized.
*/
void SetFwdInitialized(bool initialized);
/**
* Register a callback to be run when the reverse solenoid is initialized.
*
* @param callback the callback
* @param initialNotify should the callback be run with the initial state
* @return the {@link CallbackStore} object associated with this callback.
*/
[[nodiscard]] std::unique_ptr<CallbackStore> RegisterRevInitializedCallback(
NotifyCallback callback, bool initialNotify);
/**
* Define whether the reverse solenoid has been initialized.
*
* @param initialized whether the solenoid is intiialized.
*/
void SetRevInitialized(bool initialized);
/**
* Check if the reverse solenoid has been initialized.
*
* @return true if initialized
*/
bool GetRevInitialized() const;
/**
* Set the value of the double solenoid output.
*
* @param value The value to set (Off, Forward, Reverse)
*/
void Set(DoubleSolenoid::Value value);
/**
* Check the value of the double solenoid output.
*
* @return the output value of the double solenoid.
*/
DoubleSolenoid::Value Get() const;
private:
PCMSim m_pcm;
int m_fwd;
int m_rev;
};
} // namespace frc::sim

View File

@@ -0,0 +1,104 @@
// 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 <memory>
#include "frc/Solenoid.h"
#include "frc/simulation/CallbackStore.h"
#include "frc/simulation/PCMSim.h"
namespace frc::sim {
/**
* Class to control a simulated Pneumatic Control Module (PCM).
*/
class SolenoidSim {
public:
/**
* Constructs for a solenoid on the default PCM.
*
* @param channel the solenoid channel.
*/
explicit SolenoidSim(int channel);
/**
* Constructs for the given solenoid.
*
* @param doubleSolenoid the solenoid to simulate.
*/
explicit SolenoidSim(Solenoid& solenoid);
/**
* Constructs for a solenoid.
*
* @param module the CAN ID of the PCM the solenoid is connected to.
* @param channel the solenoid channel.
*
* @see PCMSim#PCMSim(int)
*/
SolenoidSim(int module, int channel);
/**
* Constructs for a solenoid on the given PCM.
*
* @param pcm the PCM the solenoid is connected to.
* @param channel the solenoid channel.
*/
SolenoidSim(PCMSim& pcm, int channel);
/**
* Register a callback to be run when this solenoid is initialized.
*
* @param callback the callback
* @param initialNotify should the callback be run with the initial state
* @return the {@link CallbackStore} object associated with this callback.
*/
[[nodiscard]] std::unique_ptr<CallbackStore> RegisterInitializedCallback(
NotifyCallback callback, bool initialNotify);
/**
* Check if this solenoid has been initialized.
*
* @return true if initialized
*/
bool GetInitialized() const;
/**
* Define whether this solenoid has been initialized.
*
* @param initialized whether the solenoid is intiialized.
*/
void SetInitialized(bool initialized);
/**
* Register a callback to be run when the output of this solenoid has changed.
*
* @param callback the callback
* @param initialNotify should the callback be run with the initial value
* @return the {@link CallbackStore} object associated with this callback.
*/
[[nodiscard]] std::unique_ptr<CallbackStore> RegisterOutputCallback(
NotifyCallback callback, bool initialNotify);
/**
* Check the solenoid output.
*
* @return the solenoid output
*/
bool GetOutput() const;
/**
* Change the solenoid output.
*
* @param output the new solenoid output
*/
void SetOutput(bool output);
private:
PCMSim m_pcm;
int m_channel;
};
} // namespace frc::sim