001 /*----------------------------------------------------------------------------*/ 002 /* Copyright (c) FIRST 2008-2012. All Rights Reserved. */ 003 /* Open Source Software - may be modified and shared by FRC teams. The code */ 004 /* must be accompanied by the FIRST BSD license file in the root directory of */ 005 /* the project. */ 006 /*----------------------------------------------------------------------------*/ 007 008 package edu.wpi.first.wpilibj; 009 010 /** 011 * 012 * @author brad 013 */ 014 public class SafePWM extends PWM implements MotorSafety { 015 016 private MotorSafetyHelper m_safetyHelper; 017 018 /** 019 * Initialize a SafePWM object by setting defaults 020 */ 021 void initSafePWM() { 022 m_safetyHelper = new MotorSafetyHelper(this); 023 m_safetyHelper.setExpiration(0.0); 024 m_safetyHelper.setSafetyEnabled(false); 025 } 026 027 028 /** 029 * Constructor for a SafePWM object taking a channel number 030 * @param channel The channel number to be used for the underlying PWM object 031 */ 032 public SafePWM(final int channel) { 033 super(channel); 034 initSafePWM(); 035 } 036 037 /** 038 * Constructor for a SafePWM object taking channel and slot numbers. 039 * @param slot The slot number of the digital module for this PWM object 040 * @param channel The channel number in the module for this PWM object 041 */ 042 public SafePWM(final int slot, final int channel) { 043 super(slot, channel); 044 initSafePWM(); 045 } 046 047 /* 048 * Set the expiration time for the PWM object 049 * @param timeout The timeout (in seconds) for this motor object 050 */ 051 public void setExpiration(double timeout) { 052 m_safetyHelper.setExpiration(timeout); 053 } 054 055 /** 056 * Return the expiration time for the PWM object. 057 * @return The expiration time value. 058 */ 059 public double getExpiration() { 060 return m_safetyHelper.getExpiration(); 061 } 062 063 /** 064 * Check if the PWM object is currently alive or stopped due to a timeout. 065 * @return a bool value that is true if the motor has NOT timed out and should still 066 * be running. 067 */ 068 public boolean isAlive() { 069 return m_safetyHelper.isAlive(); 070 } 071 072 /** 073 * Stop the motor associated with this PWM object. 074 * This is called by the MotorSafetyHelper object when it has a timeout for this PWM and needs to 075 * stop it from running. 076 */ 077 public void stopMotor() { 078 disable(); 079 } 080 081 /** 082 * Check if motor safety is enabled for this object 083 * @return True if motor safety is enforced for this object 084 */ 085 public boolean isSafetyEnabled() { 086 return m_safetyHelper.isSafetyEnabled(); 087 } 088 089 /** 090 * Feed the MotorSafety timer. 091 * This method is called by the subclass motor whenever it updates its speed, thereby reseting 092 * the timeout value. 093 */ 094 public void Feed() { 095 m_safetyHelper.feed(); 096 } 097 098 public void setSafetyEnabled(boolean enabled) { 099 m_safetyHelper.setSafetyEnabled(enabled); 100 } 101 102 public String getDescription() { 103 return "PWM "+getChannel()+" on module "+getModuleNumber(); 104 } 105 106 public void disable() { 107 setRaw(kPwmDisabled); 108 } 109 }