blob: 48faf78305fe57672775cd374c50a6ea7e763d3c [file] [log] [blame]
/*----------------------------------------------------------------------------*/
/* 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 "CInterfaces/CRobotDrive.h"
#include "Joystick.h"
#include "RobotDrive.h"
#include "Utility.h"
#include "WPIErrors.h"
static RobotDrive *drive = NULL;
/*
* Driving functions
* These functions provide an interface to multiple motors that is used for C programming
* The Drive(speed, direction) function is the main part of the set that makes it easy
* to set speeds and direction independently in one call.
*/
/**
* Create a RobotDrive with 4 motors specified with channel numbers.
* Set up parameters for a four wheel drive system where all four motor
* pwm channels are specified in the call.
* This call assumes Jaguars for controlling the motors.
*
* @param frontLeftMotor Front left motor channel number on the default digital module
* @param rearLeftMotor Rear Left motor channel number on the default digital module
* @param frontRightMotor Front right motor channel number on the default digital module
* @param rearRightMotor Rear Right motor channel number on the default digital module
*/
void CreateRobotDrive(UINT32 frontLeftMotor, UINT32 rearLeftMotor,
UINT32 frontRightMotor, UINT32 rearRightMotor)
{
if (drive == NULL)
drive = new RobotDrive(frontLeftMotor, rearLeftMotor,
frontRightMotor, rearRightMotor);
}
/**
* Constructor for RobotDrive with 2 motors specified with channel numbers.
* Set up parameters for a four wheel drive system where all four motor
* pwm channels are specified in the call.
* This call assumes Jaguars for controlling the motors.
*
* @param leftMotor Front left motor channel number on the default digital module
* @param rightMotor Front right motor channel number on the default digital module
*/
void CreateRobotDrive(UINT32 leftMotor, UINT32 rightMotor)
{
if (drive == NULL)
drive = new RobotDrive(leftMotor, rightMotor);
}
/**
* Drive the motors at "speed" and "curve".
*
* The speed and curve are -1.0 to +1.0 values where 0.0 represents stopped and
* not turning. The algorithm for adding in the direction attempts to provide a constant
* turn radius for differing speeds.
*
* This function sill most likely be used in an autonomous routine.
*
* @param speed The forward component of the speed to send to the motors.
* @param curve The rate of turn, constant for different forward speeds.
*/
void Drive(float speed, float curve)
{
if (drive == NULL)
wpi_setGlobalWPIError(DriveUninitialized);
else
drive->Drive(speed, curve);
}
/**
* Provide tank steering using the stored robot configuration.
* Drive the robot using two joystick inputs. The Y-axis will be selected from
* each Joystick object.
*
* @param leftStickPort The joystick port to control the left side of the robot.
* @param rightStickPort The joystick port to control the right side of the robot.
*/
void TankDrive(UINT32 leftStickPort, UINT32 rightStickPort)
{
if (drive == NULL)
{
wpi_setGlobalWPIError(DriveUninitialized);
}
else
{
Joystick *leftStick = Joystick::GetStickForPort(leftStickPort);
Joystick *rightStick = Joystick::GetStickForPort(rightStickPort);
drive->TankDrive(leftStick, rightStick);
}
}
/**
* Arcade drive implements single stick driving.
* Given a single Joystick, the class assumes the Y axis for the move value and the X axis
* for the rotate value.
* (Should add more information here regarding the way that arcade drive works.)
*
* @param stickPort The joystick to use for Arcade single-stick driving. The Y-axis will be selected
* for forwards/backwards and the X-axis will be selected for rotation rate.
* @param squaredInputs If true, the sensitivity will be increased for small values
*/
void ArcadeDrive(UINT32 stickPort, bool squaredInputs)
{
if (drive == NULL)
{
wpi_setGlobalWPIError(DriveUninitialized);
}
else
{
Joystick *stick = Joystick::GetStickForPort(stickPort);
drive->ArcadeDrive(stick);
}
}
/**
* Provide tank steering using the stored robot configuration.
* This function lets you directly provide joystick values from any source.
* @param leftSpeed The value of the left stick.
* @param rightSpeed The value of the right stick.
*/
void TankByValue(float leftSpeed, float rightSpeed)
{
if (drive == NULL)
{
wpi_setGlobalWPIError(DriveUninitialized);
}
else
{
drive->Drive(leftSpeed, rightSpeed);
}
}
/**
* Arcade drive implements single stick driving.
* This function lets you directly provide joystick values from any source.
*
* @param moveValue The value to use for fowards/backwards
* @param rotateValue The value to use for the rotate right/left
* @param squaredInputs If set, increases the sensitivity at low speeds
*/
void ArcadeByValue(float moveValue, float rotateValue, bool squaredInputs)
{
if (drive == NULL)
wpi_setGlobalWPIError(DriveUninitialized);
else
drive->ArcadeDrive(moveValue, rotateValue, squaredInputs);
}