// RobotBuilder Version: 0.0.2
//
// This file was generated by RobotBuilder. It contains sections of
// code that are automatically generated and assigned by robotbuilder.
// These sections will be updated in the future when you export to
// C++ from RobotBuilder. Do not put any code or make any change in
// the blocks indicating autogenerated code or it will be lost on an
// update. Deleting the comments indicating the section will prevent
// it from being updated in th future.
#ifndef ROBOTMAP_H
#define ROBOTMAP_H
#include "WPILib.h"
/**
 * The RobotMap is a mapping from the ports sensors and actuators are wired into
 * to a variable name. This provides flexibility changing wiring, makes checking
 * the wiring easier and significantly reduces the number of magic numbers
 * floating around.
 */
class RobotMap {
public:
	// BEGIN AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
	static Compressor* airCompressorAirCompressor;
	static Solenoid* driveTrainLeftShifter;
	static Solenoid* driveTrainRightShifter;
	static SpeedController* driveTrainLeftMotors1and2;
	static SpeedController* driveTrainLeftMotor3;
	static SpeedController* driveTrainRightMotors1and2;
	static SpeedController* driveTrainRightMotor3;
	static RobotDrive* driveTrainRobotDrive;
	static Encoder* driveTrainQuadratureEncoderLeft;
	static Encoder* driveTrainQuadratureEncoderRight;
	static SpeedController* shooterWheelPIDControllerShooterMotor;
	static Encoder* shooterWheelPIDControllerShooterSpeedEncoder;
	static SpeedController* shooterShooterTiltMotor;
	static Encoder* shooterShooterTiltEncoder;
	static GearTooth* shooterShooterTiltHomeSensor;
	static Solenoid* shooterLatchFrisbeeSolenoid;
	static Solenoid* shooterLoadFrisbeeSolenoid;
	static Solenoid* shooterShootSolenoid;
	static SpeedController* frisbeeStorageFrisbeeIndexerMotor;
	static Encoder* frisbeeStorageFrisbeeIndexerSpeedEncoder;
	static DigitalInput* frisbeeStorageFrisbeeInputOpticalSensor;
	static DigitalInput* frisbeeStorageFrisbeeIndexOpticalSensor;
	static DigitalInput* frisbeeStorageFrisbeeReadytoshootOpticalSensor;
	static SpeedController* frisbeePickupIntakeandCenteringRollerMotors;
	static SpeedController* pickupArmPickupArmMotor;
	static Encoder* pickupArmPickupArmEncoder;
	static PIDController* pickupArmPickupArmPIDController;
	static GearTooth* pickupArmPickupArmHomeSensor;
    // END AUTOGENERATED CODE, SOURCE=ROBOTBUILDER ID=DECLARATIONS
	static void init();
};
#endif
