2 /// Copyright (c) Titan Robotics Club. All rights reserved.
4 /// <module name="CanJag.h" />
7 /// This module contains the definition and implementation of the
12 /// Environment: Wind River C++ for National Instrument cRIO based Robot.
22 #define MOD_ID MOD_CANJAG
26 #define MOD_NAME "CanJag"
29 * This class defines and implements the CanJag object. The CanJag object
30 * inherits from the CANJaguar object in the WPI library. It basically wraps
31 * the CANJaguar class so it can shadow all the volatile Jaguar configuration
32 * parameters. If the Jaguar ever browns out, we will be able to restore the
33 * Jaguar configurations.
35 class CanJag: public CANJaguar
38 UINT16 m_encoderLines;
41 NeutralMode m_neutralMode;
44 double m_voltRampRate;
46 SpeedReference m_speedRef;
47 PositionReference m_posRef;
58 PerfData *m_setMotorPerfData;
59 PerfData *m_getPosPerfData;
60 PerfData *m_getSpeedPerfData;
64 * This funcion checks if a power cycle has occurred. If so, it will
65 * reconfigure the Jaguar with the shadowed information.
67 * @return Returns true if the Jaguar has been power cycled since we
78 m_fPowerCycled = GetPowerCycled();
82 // Jaguar has lost power, restore configuration appropriately.
84 TWarn(("Detected brownout on Jag %d.", m_deviceNumber));
85 CANJaguar::ChangeControlMode(m_controlMode);
86 if (m_controlMode == kPosition)
88 CANJaguar::SetPID(m_Kp, m_Ki, m_Kd);
89 CANJaguar::SetPositionReference(m_posRef);
90 if (m_posRef == kPosRef_QuadEncoder)
92 CANJaguar::ConfigEncoderCodesPerRev(m_encoderLines);
94 else if (m_posRef == kPosRef_Potentiometer)
96 CANJaguar::ConfigPotentiometerTurns(m_potTurns);
99 else if (m_controlMode == kSpeed)
101 CANJaguar::SetPID(m_Kp, m_Ki, m_Kd);
102 CANJaguar::SetSpeedReference(m_speedRef);
103 if (m_speedRef != kSpeedRef_None)
105 CANJaguar::ConfigEncoderCodesPerRev(m_encoderLines);
108 else if (m_controlMode == kCurrent)
110 CANJaguar::SetPID(m_Kp, m_Ki, m_Kd);
113 if (m_maxOutputVoltage > 0.0)
115 CANJaguar::ConfigMaxOutputVoltage(m_maxOutputVoltage);
118 if (m_faultTime > 0.0)
120 CANJaguar::ConfigFaultTime(m_faultTime);
123 if (m_neutralMode != kNeutralMode_Jumper)
125 CANJaguar::ConfigNeutralMode(m_neutralMode);
128 if (m_fwdLimitPos == 0.0 && m_revLimitPos == 0.0)
130 CANJaguar::DisableSoftPositionLimits();
134 CANJaguar::ConfigSoftPositionLimits(m_fwdLimitPos,
138 if (m_voltRampRate > 0.0)
140 CANJaguar::SetVoltageRampRate(m_voltRampRate);
143 CANJaguar::EnableControl();
146 TExitMsg(("=%d", m_fPowerCycled));
147 return m_fPowerCycled;
152 * Constructor: Create an instance of the CanJag object that inherits
153 * the CANJaguar class.
155 * @param deviceNumber Specifies the CAN ID for the device.
156 * @param controlMode Specifies the control mode to set the device to.
160 ControlMode controlMode = kPercentVbus
161 ): CANJaguar(deviceNumber, controlMode)
165 , m_neutralMode(kNeutralMode_Jumper)
168 , m_voltRampRate(0.0)
169 , m_speedRef(kSpeedRef_None)
170 , m_posRef(kPosRef_None)
179 TEnterMsg(("CanID=%d,mode=%d", deviceNumber, controlMode));
181 if (controlMode == kSpeed)
183 m_speedRef = GetSpeedReference();
188 else if (controlMode == kPosition)
190 m_posRef = GetPositionReference();
195 else if (controlMode == kCurrent)
202 m_motorValue = CANJaguar::Get();
203 m_position = CANJaguar::GetPosition();
204 m_speed = CANJaguar::GetSpeed();
206 // Clear the power cycled flag.
208 m_fPowerCycled = GetPowerCycled();
210 #ifdef _LOGDATA_CANJAG
211 DataLogger *dataLogger = DataLogger::GetInstance();
213 snprintf(szID, sizeof(szID), "%02d", deviceNumber);
214 dataLogger->AddDataPoint(MOD_NAME, szID, "PowerCycled", "%d",
215 DataInt8, &m_fPowerCycled);
216 dataLogger->AddDataPoint(MOD_NAME, szID, "MotorValue", "%f",
217 DataFloat, &m_motorValue);
218 dataLogger->AddDataPoint(MOD_NAME, szID, "MotorPos", "%f",
219 DataDouble, &m_position);
220 dataLogger->AddDataPoint(MOD_NAME, szID, "MotorSpeed", "%f",
221 DataDouble, &m_speed);
225 m_setMotorPerfData = NULL;
226 m_getPosPerfData = NULL;
227 m_getSpeedPerfData = NULL;
235 * Destructor: Destroy an instance of the CanJag object.
248 * This function sets the motor power.
250 * @param value Specifies the motor power.
251 * @param syncGroup Optionally specifies the syncgroup of the motor.
260 TEnterMsg(("value=%f,group=%d", value, syncGroup));
263 if (value != m_motorValue)
266 // Only setting the motor value if it has changed.
268 m_motorValue = value;
270 if (m_setMotorPerfData != NULL)
272 m_setMotorPerfData->StartPerf();
275 CANJaguar::Set(value, syncGroup);
277 if (m_setMotorPerfData != NULL)
279 m_setMotorPerfData->EndPerf();
283 else if (m_safetyHelper != NULL)
286 // Motor value did not change but we still need to feed the
289 m_safetyHelper->Feed();
297 * This function sets the reference source device for speed control mode.
299 * @param reference Specifies the reference device.
303 SpeedReference reference
307 TEnterMsg(("ref=%d", reference));
309 m_speedRef = reference;
310 CANJaguar::SetSpeedReference(reference);
314 } //SetSpeedReference
317 * This function sets the reference source device for position control mode.
319 * @param reference Specifies the reference device.
322 SetPositionReference(
323 PositionReference reference
327 TEnterMsg(("ref=%d", reference));
329 m_posRef = reference;
330 CANJaguar::SetPositionReference(reference);
334 } //SetPositionReference
337 * This function sets the PID constants for the closed loop modes.
339 * @param Kp Specifies the P constant.
340 * @param Ki SPecifies the I constant.
341 * @param Kd Specifies the D constant.
351 TEnterMsg(("Kp=%f,Ki=%f,Kd=%f", Kp, Ki, Kd));
356 CANJaguar::SetPID(Kp, Ki, Kd);
363 * This function sets the maximum voltage change rate.
365 * @param rampRate Specifies the max voltage ramp rate.
373 TEnterMsg(("rampRate=%f", rampRate));
375 m_voltRampRate = rampRate;
376 CANJaguar::SetVoltageRampRate(rampRate);
380 } //SetVoltageRampRate
383 * This function configures the neutral mode.
385 * @param mode Specifies the neutral mode.
393 TEnterMsg(("mode=%d", mode));
395 m_neutralMode = mode;
396 CANJaguar::ConfigNeutralMode(mode);
400 } //ConfigNeutralMode
403 * This function configures the number of encoder lines per revolution.
405 * @param encoderLines Specifies the number of encoder lines per rev.
408 ConfigEncoderCodesPerRev(
413 TEnterMsg(("lines=%d", encoderLines));
415 m_encoderLines = encoderLines;
416 CANJaguar::ConfigEncoderCodesPerRev(encoderLines);
420 } //ConfigEncoderCodesPerRev
423 * This function configures the number of turns of the potentiometer.
425 * @param turns Specifies the number of turns of the potentiometer.
428 ConfigPotentiometerTurns(
433 TEnterMsg(("turns=%d", turns));
436 CANJaguar::ConfigPotentiometerTurns(turns);
440 } //ConfigPotentiometerTurns
443 * This function configures the forward and reverse position limits.
445 * @param fwdLimitPos Specifies the forward limit position.
446 * @param revLimitPos Specifies the reverse limit position.
449 ConfigSoftPositionLimits(
455 TEnterMsg(("fwdLimit=%f,revLimit=%f", fwdLimitPos, revLimitPos));
457 m_fwdLimitPos = fwdLimitPos;
458 m_revLimitPos = revLimitPos;
459 CANJaguar::ConfigSoftPositionLimits(fwdLimitPos, revLimitPos);
463 } //ConfigSoftPositionLimits
466 * This function disables soft position limits.
469 DisableSoftPositionLimits(
478 CANJaguar::DisableSoftPositionLimits();
482 } //DisableSoftPositionLimits
485 * This function configures how long the Jaguar waits in the case of a
486 * fault before resuming operation.
488 * @param faultTime Specifies the fault time.
496 TEnterMsg(("faultTime=%f", faultTime));
498 m_faultTime = faultTime;
499 CANJaguar::ConfigFaultTime(faultTime);
506 * This function gets the motor position from the Jaguar controller.
508 * @return Returns the motor position.
519 if (m_getPosPerfData != NULL)
521 m_getPosPerfData->StartPerf();
524 m_position = CANJaguar::GetPosition();
526 if (m_getPosPerfData != NULL)
528 m_getPosPerfData->EndPerf();
532 TExitMsg(("=%f", m_position));
537 * This function gets the motor speed from the Jaguar controller.
539 * @return Returns the motor speed.
550 if (m_getSpeedPerfData != NULL)
552 m_getSpeedPerfData->StartPerf();
555 m_speed = CANJaguar::GetSpeed();
557 if (m_getSpeedPerfData != NULL)
559 m_getSpeedPerfData->EndPerf();
563 TExitMsg(("=%f", m_speed));
569 * This function sets up the various perfdata objects.
571 * @param setMotorPerfData Points to the perfdata object to collect
573 * @param getPosPerfData Points to the perfdata object to collect
574 * GetPosition() performance.
575 * @param getSpeedPerfData Points to the perfdata object to collect
576 * GetSpeed() performance.
580 PerfData *setMotorPerfData,
581 PerfData *getPosPerfData,
582 PerfData *getSpeedPerfData
588 m_setMotorPerfData = setMotorPerfData;
589 m_getPosPerfData = getPosPerfData;
590 m_getSpeedPerfData = getSpeedPerfData;
599 #endif //ifndef _CANJAG_H