Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 1 | // Copyright (c) FIRST and other WPILib contributors. |
| 2 | // Open Source Software; you can modify and/or share it under the terms of |
| 3 | // the WPILib BSD license file in the root directory of this project. |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 4 | |
| 5 | #include "frc/Solenoid.h" |
| 6 | |
| 7 | #include <utility> |
| 8 | |
| 9 | #include <hal/FRCUsageReporting.h> |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 10 | #include <wpi/NullDeleter.h> |
| 11 | #include <wpi/sendable/SendableBuilder.h> |
| 12 | #include <wpi/sendable/SendableRegistry.h> |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 13 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 14 | #include "frc/Errors.h" |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 15 | #include "frc/SensorUtil.h" |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 16 | |
| 17 | using namespace frc; |
| 18 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 19 | Solenoid::Solenoid(int module, PneumaticsModuleType moduleType, int channel) |
| 20 | : m_module{PneumaticsBase::GetForType(module, moduleType)}, |
| 21 | m_channel{channel} { |
| 22 | if (!m_module->CheckSolenoidChannel(m_channel)) { |
| 23 | throw FRC_MakeError(err::ChannelIndexOutOfRange, "Channel {}", m_channel); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 24 | } |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 25 | m_mask = 1 << channel; |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 26 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 27 | if (m_module->CheckAndReserveSolenoids(m_mask) != 0) { |
| 28 | throw FRC_MakeError(err::ResourceAlreadyAllocated, "Channel {}", m_channel); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 29 | } |
| 30 | |
| 31 | HAL_Report(HALUsageReporting::kResourceType_Solenoid, m_channel + 1, |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 32 | m_module->GetModuleNumber() + 1); |
| 33 | wpi::SendableRegistry::AddLW(this, "Solenoid", m_module->GetModuleNumber(), |
| 34 | m_channel); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 35 | } |
| 36 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 37 | Solenoid::Solenoid(PneumaticsModuleType moduleType, int channel) |
| 38 | : Solenoid{PneumaticsBase::GetDefaultForType(moduleType), moduleType, |
| 39 | channel} {} |
| 40 | |
| 41 | Solenoid::~Solenoid() { |
| 42 | m_module->UnreserveSolenoids(m_mask); |
| 43 | } |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 44 | |
| 45 | void Solenoid::Set(bool on) { |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 46 | int value = on ? (0xFFFF & m_mask) : 0; |
| 47 | m_module->SetSolenoids(m_mask, value); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 48 | } |
| 49 | |
| 50 | bool Solenoid::Get() const { |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 51 | int currentAll = m_module->GetSolenoids(); |
| 52 | return (currentAll & m_mask) != 0; |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 53 | } |
| 54 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 55 | void Solenoid::Toggle() { |
| 56 | Set(!Get()); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 57 | } |
| 58 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 59 | int Solenoid::GetChannel() const { |
| 60 | return m_channel; |
| 61 | } |
| 62 | |
| 63 | bool Solenoid::IsDisabled() const { |
| 64 | return (m_module->GetSolenoidDisabledList() & m_mask) != 0; |
| 65 | } |
| 66 | |
| 67 | void Solenoid::SetPulseDuration(units::second_t duration) { |
| 68 | m_module->SetOneShotDuration(m_channel, duration); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | void Solenoid::StartPulse() { |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 72 | m_module->FireOneShot(m_channel); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 73 | } |
| 74 | |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 75 | void Solenoid::InitSendable(wpi::SendableBuilder& builder) { |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 76 | builder.SetSmartDashboardType("Solenoid"); |
| 77 | builder.SetActuator(true); |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 78 | builder.SetSafeState([=] { Set(false); }); |
Austin Schuh | 1e69f94 | 2020-11-14 15:06:14 -0800 | [diff] [blame] | 79 | builder.AddBooleanProperty( |
Austin Schuh | 812d0d1 | 2021-11-04 20:16:48 -0700 | [diff] [blame^] | 80 | "Value", [=] { return Get(); }, [=](bool value) { Set(value); }); |
Brian Silverman | 8fce748 | 2020-01-05 13:18:21 -0800 | [diff] [blame] | 81 | } |