void DriveSubsystem::AutoModeDisable() {
	if (autoMode != Off) {
		if (autoMode == Driving)
		{
			// Cancel Driving
			if (autoActionState == InProgress)
			{
				SetMotorSpeeds(0.0);
			}
		}
		else if (autoMode == Rotating) {
			if (autoActionState == InProgress)
			{
				robotDrive->SetLeftRightMotorOutputs(0, 0);
			}
		}

		autoMode = Off;
		autoActionState = NotStarted;

		Logger::GetInstance()->Log(DriveSubsystemLogId,Logger::kINFO,"Auto Drive Mode DISABLED\n");
	}
	else {
		Logger::GetInstance()->Log(DriveSubsystemLogId,Logger::kINFO,"Auto Drive Mode ALREADY disabled,IGNNORING\n");
	}
}
void RobotDriveControl::Disable()
{
	m_left_speed = 0.0f;
	m_right_speed = 0.0f;
	m_current_left_speed = 0.0f;
	m_current_right_speed = 0.0f;
	m_shift_factor = m_initial_shift;
	SetMotorSpeeds();
}
void RobotDriveControl::Update(double delta)
{
	// Handle the shift input
	bool shift_changed = false;
	if(m_joystick->IsPressed(XBOX_360_BUTTON_R_BUMPER))
	{
		m_shift_factor += m_shift_step;
		shift_changed = true;
	}
	if(m_joystick->IsPressed(XBOX_360_BUTTON_L_BUMPER))
	{
		m_shift_factor -= m_shift_step;
		shift_changed = true;
	}
	if (shift_changed)
	{
		m_shift_factor = MotorControlHelper::Limit(m_shift_factor, m_min_shift, m_max_shift);
		SmartDashboard::PutNumber("Drive/Shift/Current", m_shift_factor);
	}

	// Handle the stick inputs
	m_left_speed = m_joystick->GetAxis(XBOX_360_AXIS_Y_LEFT);
	m_right_speed = m_joystick->GetAxis(XBOX_360_AXIS_Y_RIGHT);

	int pov = m_joystick->GetPOV();

	SmartDashboard::PutNumber("Drive/POV", pov);
	if (pov >= XBOX_360_POV_DIR_UP)
	{
		switch (pov)
		{
		case XBOX_360_POV_DIR_UP:
			m_left_speed = -1.0f;
			m_right_speed = -1.0f;
			break;
		case XBOX_360_POV_DIR_UP_RIGHT:
			m_left_speed = -1.0f;
			m_right_speed = 0.0f;
			break;
		case XBOX_360_POV_DIR_RIGHT:
			m_left_speed = -1.0f;
			m_right_speed = 1.0f;
			break;
		case XBOX_360_POV_DIR_DOWN_RIGHT:
			m_left_speed = 0.0f;
			m_right_speed = 1.0f;
			break;
		case XBOX_360_POV_DIR_DOWN:
			m_left_speed = 1.0f;
			m_right_speed = 1.0f;
			break;
		case XBOX_360_POV_DIR_DOWN_LEFT:
			m_left_speed = 1.0f;
			m_right_speed = 0.0f;
			break;
		case XBOX_360_POV_DIR_LEFT:
			m_left_speed = 1.0f;
			m_right_speed = -1.0f;
			break;
		case XBOX_360_POV_DIR_UP_LEFT:
			m_left_speed = 0.0f;
			m_right_speed = -1.0f;
			break;
		}
	}


	m_left_speed = MotorControlHelper::Limit(m_left_speed, -1.0f, 1.0f) * m_shift_factor;
	m_right_speed = MotorControlHelper::Limit(m_right_speed, -1.0f, 1.0f) * m_shift_factor;

	// Set the output
	SetMotorSpeeds();
}
Exemple #4
0
void SetMotorSpeedsNoReturn(signed int left, signed int right, signed long winkel)
{
  SetMotorSpeeds(&left, &right, winkel);
}
void DriveSubsystem::AutoDriveMakeProgress(double distanceTraveledSoFar[]) {
	//RotateDirection being a new enum with just left and right
	// or we can find the shortest distance by comparing the
	if (autoMode == Driving)
	{
		Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO, "AutoDriveMakeProgress:: Step 1");
		if (autoActionState == InProgress)
		{
			double distanceFromGoal[4];

			AutoDriveCalcDistanceFromGoal(distanceTraveledSoFar, distanceFromGoal);

			Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO, "AutoDriveMakeProgress:: Step 2");

			// If the distance from the goal is NOT within the epsilon AND
			// if the distance from the targeted distance has not grown
			// since the last distance calculation apply voltage.
			if (!AutoDriveShouldStop(distanceFromGoal)) {

				Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO, "AutoDriveMakeProgress:: Step 3");

				// Calculate the speed that the Robot should start rotating at.

				float slowDownPercentageOfSpeed = 1.0; /*CalcPercentageOfMaxSpeed(distanceFromGoal[0],
																	  	  autoDrivingParams.totalRotationsToDesiredPosition,
																		  autoDrivingParams.slowDownRotationCountThreshold); */

				if ((autoDrivingParams.autoHeading == DriveForward) || (autoDrivingParams.autoHeading == DriveBack))
				{
					AutoDriveFrontLeftMotorSpeed *= slowDownPercentageOfSpeed * AutoDriveForwardBackHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
					AutoDriveBackLeftMotorSpeed *= slowDownPercentageOfSpeed * AutoDriveForwardBackHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
					AutoDriveFrontRightMotorSpeed *= slowDownPercentageOfSpeed * AutoDriveForwardBackHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
					AutoDriveBackRightMotorSpeed *= slowDownPercentageOfSpeed * AutoDriveForwardBackHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
				}
				else
				{
					AutoDriveFrontLeftMotorSpeed *= AutoDriveLeftRightHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
					AutoDriveBackLeftMotorSpeed *= AutoDriveLeftRightHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
					AutoDriveFrontRightMotorSpeed *= AutoDriveLeftRightHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
					AutoDriveBackRightMotorSpeed *= AutoDriveLeftRightHeadingSpeedScaleFactor * autoDrivingParams.speedScaleFactor;
				}

				Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO,"AutoDriveMakeProgress: InProgress, distanceFromGoal=%g, distanceSoFar=%g, absFrontLeftSpeed=%f, absBackLeftSpeed=%f, absFrontRightSpeed=%f, absBackRightSpeed=%f\n",
										   distanceFromGoal[0],
										   distanceTraveledSoFar[0],
										   AutoDriveFrontLeftMotorSpeed,
										   AutoDriveBackLeftMotorSpeed,
										   AutoDriveFrontRightMotorSpeed,
										   AutoDriveBackRightMotorSpeed);

				switch (autoDrivingParams.autoHeading)
				{
				case DriveForward:
					Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO,"AutoDriveMakeProgress: Heading Forward\n");
					SetMotorSpeeds(-AutoDriveFrontLeftMotorSpeed,
								   -AutoDriveBackLeftMotorSpeed,
								   AutoDriveFrontRightMotorSpeed,
								   AutoDriveBackRightMotorSpeed);
					break;

				case DriveBack:
					Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO,"AutoDriveMakeProgress: Heading Backward\n");
					SetMotorSpeeds(AutoDriveFrontLeftMotorSpeed,
								   AutoDriveBackLeftMotorSpeed,
								  -AutoDriveFrontRightMotorSpeed,
								  -AutoDriveBackRightMotorSpeed);
					break;

				case DriveLeft:
					Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO,"AutoDriveMakeProgress: Heading Left\n");
					SetMotorSpeeds(AutoDriveFrontLeftMotorSpeed,
								   -AutoDriveBackLeftMotorSpeed,
								   AutoDriveFrontRightMotorSpeed,
								   -AutoDriveBackRightMotorSpeed);
					break;

				case DriveRight:
					Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO,"AutoDriveMakeProgress: Heading Right\n");
					SetMotorSpeeds(-AutoDriveFrontLeftMotorSpeed,
									AutoDriveBackLeftMotorSpeed,
								   -AutoDriveFrontRightMotorSpeed,
								   AutoDriveBackRightMotorSpeed);
					break;
				}
			}
			else {
				// Hit the stopping point, shutdown.
				SetMotorSpeeds(0.0);
				autoActionState = Completed;

				Logger::GetInstance()->Log(DriveSubsystemLogId, Logger::kINFO,"AutoDriveMakeProgress: InProgress, Stopping Motors\n");
			}
		}
	}
	else {
		Logger::GetInstance()->Log(DriveSubsystemLogId,Logger::kERROR,"***Auto Rotation not setup or already Rotating (%s), IGNNORING***\n", AutoModeToString(autoMode).c_str());
	}
}
void DriveSubsystem::AutoDriveExecute()
{
	if (autoMode == Driving) {

		if (autoActionState == Completed)
		{
			return;
		}

		double distanceTraveledSoFar[4];

		if (autoActionState == NotStarted) {
			// Indicate that the rotation is now in progress.
			autoActionState = InProgress;

			// here is where we would start the PID or the manual encoder code
			SetMotorSpeeds(0.0);
			cANTalon1->SetPosition(0.0);
			cANTalon2->SetPosition(0.0);
			cANTalon3->SetPosition(0.0);
			cANTalon4->SetPosition(0.0);
			Wait(0.100);

			AutoDriveReadMotorRotationCounts();

			autoDrivingParams.positionCountAtStartOfAutoDrive[0] = autoDrivingParams.lastPositionReading[0];
			autoDrivingParams.lastDistanceFromGoal[0] = autoDrivingParams.totalRotationsToDesiredPosition - (autoDrivingParams.lastPositionReading[0] - autoDrivingParams.positionCountAtStartOfAutoDrive[0]);

			if (!AutoDriveUseOneMotorForDistanceDrive)
			{
				autoDrivingParams.positionCountAtStartOfAutoDrive[1] = autoDrivingParams.lastPositionReading[1];
				autoDrivingParams.positionCountAtStartOfAutoDrive[2] = autoDrivingParams.lastPositionReading[2];
				autoDrivingParams.positionCountAtStartOfAutoDrive[3] = autoDrivingParams.lastPositionReading[3];

				autoDrivingParams.lastDistanceFromGoal[1] = autoDrivingParams.totalRotationsToDesiredPosition - (autoDrivingParams.lastPositionReading[1] - autoDrivingParams.positionCountAtStartOfAutoDrive[1]);
				autoDrivingParams.lastDistanceFromGoal[2] = autoDrivingParams.totalRotationsToDesiredPosition - (autoDrivingParams.lastPositionReading[2] - autoDrivingParams.positionCountAtStartOfAutoDrive[2]);
				autoDrivingParams.lastDistanceFromGoal[3] = autoDrivingParams.totalRotationsToDesiredPosition - (autoDrivingParams.lastPositionReading[3] - autoDrivingParams.positionCountAtStartOfAutoDrive[3]);
			}

			distanceTraveledSoFar[0] = 0.0;
			distanceTraveledSoFar[1] = 0.0;
			distanceTraveledSoFar[2] = 0.0;
			distanceTraveledSoFar[3] = 0.0;

			Logger::GetInstance()->Log(DriveSubsystemLogId,Logger::kINFO,"AutoDriveExecute: Switching to InProgress, (position, lastPostion)=%g, lastDistance=%gMode\n",
									   autoDrivingParams.lastPositionReading[0],
									   autoDrivingParams.lastDistanceFromGoal[0]);
		}
		else {
			AutoDriveReadMotorRotationCounts();

			distanceTraveledSoFar[0] = autoDrivingParams.lastPositionReading[0] - autoDrivingParams.positionCountAtStartOfAutoDrive[0];

			distanceTraveledSoFar[0] = ImposeMinimumOnValue(distanceTraveledSoFar[0], 0.0);

			Logger::GetInstance()->Log(DriveSubsystemLogId,Logger::kINFO,"AutoDriveExecute: InProgress, lastPostion=%g, distanceSoFar=%g, prevDistance=%g\n",
									   autoDrivingParams.lastPositionReading[0],
									   distanceTraveledSoFar[0],
									   autoDrivingParams.lastDistanceFromGoal[0]);

			if (!AutoDriveUseOneMotorForDistanceDrive)
			{
				distanceTraveledSoFar[1] = ImposeMinimumOnValue(autoDrivingParams.lastPositionReading[1] - autoDrivingParams.positionCountAtStartOfAutoDrive[1], 0.0);
				distanceTraveledSoFar[2] = ImposeMinimumOnValue(autoDrivingParams.lastPositionReading[2] - autoDrivingParams.positionCountAtStartOfAutoDrive[2], 0.0);
				distanceTraveledSoFar[3] = ImposeMinimumOnValue(autoDrivingParams.lastPositionReading[3] - autoDrivingParams.positionCountAtStartOfAutoDrive[3], 0.0);
			}
		}

		AutoDriveMakeProgress(distanceTraveledSoFar);
	}
	else {
		Logger::GetInstance()->Log(DriveSubsystemLogId,Logger::kERROR,"***Auto Driving not setup or already Auto Driving (%s), IGNNORING***\n", AutoModeToString(autoMode).c_str());
	}
}