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 import edu.wpi.first.wpilibj.communication.UsageReporting;
011 import edu.wpi.first.wpilibj.livewindow.LiveWindow;
012 import edu.wpi.first.wpilibj.parsing.IDeviceController;
013
014 /**
015 * VEX Robotics Victor Speed Controller
016 */
017 public class Victor extends SafePWM implements SpeedController, IDeviceController {
018
019 /**
020 * Common initialization code called by all constructors.
021 *
022 * Note that the Victor uses the following bounds for PWM values. These values were determined
023 * empirically and optimized for the Victor 888. These values should work reasonably well for
024 * Victor 884 controllers also but if users experience issues such as asymmetric behavior around
025 * the deadband or inability to saturate the controller in either direction, calibration is recommended.
026 * The calibration procedure can be found in the Victor 884 User Manual available from VEX Robotics:
027 * http://content.vexrobotics.com/docs/ifi-v884-users-manual-9-25-06.pdf
028 *
029 * - 2.027ms = full "forward"
030 * - 1.525ms = the "high end" of the deadband range
031 * - 1.507ms = center of the deadband range (off)
032 * - 1.49ms = the "low end" of the deadband range
033 * - 1.026ms = full "reverse"
034 */
035 private void initVictor() {
036 setBounds(2.027, 1.525, 1.507, 1.49, 1.026);
037 setPeriodMultiplier(PeriodMultiplier.k2X);
038 setRaw(m_centerPwm);
039
040 LiveWindow.addActuator("Victor", getModuleNumber(), getChannel(), this);
041 UsageReporting.report(UsageReporting.kResourceType_Victor, getChannel(), getModuleNumber()-1);
042 }
043
044 /**
045 * Constructor that assumes the default digital module.
046 *
047 * @param channel The PWM channel on the digital module that the Victor is attached to.
048 */
049 public Victor(final int channel) {
050 super(channel);
051 initVictor();
052 }
053
054 /**
055 * Constructor that specifies the digital module.
056 *
057 * @param slot The slot in the chassis that the digital module is plugged into.
058 * @param channel The PWM channel on the digital module that the Victor is attached to.
059 */
060 public Victor(final int slot, final int channel) {
061 super(slot, channel);
062 initVictor();
063 }
064
065 /**
066 * Set the PWM value.
067 *
068 * @deprecated For compatibility with CANJaguar
069 *
070 * The PWM value is set using a range of -1.0 to 1.0, appropriately
071 * scaling the value for the FPGA.
072 *
073 * @param speed The speed to set. Value should be between -1.0 and 1.0.
074 * @param syncGroup The update group to add this Set() to, pending UpdateSyncGroup(). If 0, update immediately.
075 */
076 public void set(double speed, byte syncGroup) {
077 setSpeed(speed);
078 Feed();
079 }
080
081 /**
082 * Set the PWM value.
083 *
084 * The PWM value is set using a range of -1.0 to 1.0, appropriately
085 * scaling the value for the FPGA.
086 *
087 * @param speed The speed value between -1.0 and 1.0 to set.
088 */
089 public void set(double speed) {
090 setSpeed(speed);
091 Feed();
092 }
093
094 /**
095 * Get the recently set value of the PWM.
096 *
097 * @return The most recently set value for the PWM between -1.0 and 1.0.
098 */
099 public double get() {
100 return getSpeed();
101 }
102
103 /**
104 * Write out the PID value as seen in the PIDOutput base object.
105 *
106 * @param output Write out the PWM value as was found in the PIDController
107 */
108 public void pidWrite(double output) {
109 set(output);
110 }
111 }