/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2008. 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 $(WIND_BASE)/WPILib. */ /*----------------------------------------------------------------------------*/ #include "SolenoidBase.h" void* SolenoidBase::m_ports[m_maxModules][m_maxPorts]; std::unique_ptr SolenoidBase::m_allocated; /** * Constructor * * @param moduleNumber The CAN PCM ID. */ SolenoidBase::SolenoidBase(uint8_t moduleNumber) : m_moduleNumber(moduleNumber) { for (uint32_t i = 0; i < kSolenoidChannels; i++) { void* port = getPortWithModule(moduleNumber, i); int32_t status = 0; SolenoidBase::m_ports[moduleNumber][i] = initializeSolenoidPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); freePort(port); } } /** * Set the value of a solenoid. * * @param value The value you want to set on the module. * @param mask The channels you want to be affected. */ void SolenoidBase::Set(uint8_t value, uint8_t mask, int module) { int32_t status = 0; for (int i = 0; i < m_maxPorts; i++) { uint8_t local_mask = 1 << i; if (mask & local_mask) setSolenoid(m_ports[module][i], value & local_mask, &status); } wpi_setErrorWithContext(status, getHALErrorMessage(status)); } /** * Read all 8 solenoids as a single byte * * @return The current value of all 8 solenoids on the module. */ uint8_t SolenoidBase::GetAll(int module) const { uint8_t value = 0; int32_t status = 0; value = getAllSolenoids(m_ports[module][0], &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); return value; } /** * Reads complete solenoid blacklist for all 8 solenoids as a single byte. * * If a solenoid is shorted, it is added to the blacklist and * disabled until power cycle, or until faults are cleared. * @see ClearAllPCMStickyFaults() * * @return The solenoid blacklist of all 8 solenoids on the module. */ uint8_t SolenoidBase::GetPCMSolenoidBlackList(int module) const { int32_t status = 0; return getPCMSolenoidBlackList(m_ports[module][0], &status); } /** * @return true if PCM sticky fault is set : The common * highside solenoid voltage rail is too low, * most likely a solenoid channel is shorted. */ bool SolenoidBase::GetPCMSolenoidVoltageStickyFault(int module) const { int32_t status = 0; return getPCMSolenoidVoltageStickyFault(m_ports[module][0], &status); } /** * @return true if PCM is in fault state : The common * highside solenoid voltage rail is too low, * most likely a solenoid channel is shorted. */ bool SolenoidBase::GetPCMSolenoidVoltageFault(int module) const { int32_t status = 0; return getPCMSolenoidVoltageFault(m_ports[module][0], &status); } /** * Clear ALL sticky faults inside PCM that Compressor is wired to. * * If a sticky fault is set, then it will be persistently cleared. Compressor * drive * maybe momentarily disable while flags are being cleared. Care * should be * taken to not call this too frequently, otherwise normal * compressor * functionality may be prevented. * * If no sticky faults are set then this call will have no effect. */ void SolenoidBase::ClearAllPCMStickyFaults(int module) { int32_t status = 0; return clearAllPCMStickyFaults_sol(m_ports[module][0], &status); }