282 lines
5.4 KiB
Markdown
282 lines
5.4 KiB
Markdown
# Quick Start Guide
|
|
|
|
## Installation
|
|
|
|
### Linux/macOS
|
|
|
|
```bash
|
|
# Option 1: System-wide install (recommended)
|
|
sudo ./install.sh
|
|
|
|
# Option 2: User install
|
|
INSTALL_DIR=~/.local/bin ./install.sh
|
|
# (Make sure ~/.local/bin is in your PATH)
|
|
|
|
# Option 3: Use directly
|
|
./ftc-new-project my-robot
|
|
```
|
|
|
|
### Windows
|
|
|
|
```batch
|
|
REM Add directory to PATH or use directly
|
|
ftc-new-project.bat my-robot
|
|
```
|
|
|
|
## Creating Your First Project
|
|
|
|
```bash
|
|
# Create project
|
|
ftc-new-project my-robot
|
|
|
|
# Enter and start development
|
|
cd my-robot
|
|
./gradlew test --continuous
|
|
```
|
|
|
|
That's it! You now have a clean FTC project with:
|
|
- ✓ Example drive subsystem
|
|
- ✓ Unit tests that run on PC
|
|
- ✓ Build scripts
|
|
- ✓ Deploy scripts
|
|
- ✓ Git repository initialized
|
|
|
|
## Development Workflow
|
|
|
|
### 1. Write Code
|
|
Edit files in `src/main/java/robot/`:
|
|
- `subsystems/` - Your robot logic
|
|
- `hardware/` - FTC hardware implementations
|
|
- `opmodes/` - FTC OpModes
|
|
|
|
### 2. Write Tests
|
|
Edit files in `src/test/java/robot/`:
|
|
- Create tests for each subsystem
|
|
- Tests run instantly on PC (no robot needed!)
|
|
|
|
### 3. Test Continuously
|
|
```bash
|
|
./gradlew test --continuous
|
|
```
|
|
|
|
This watches your files and re-runs tests whenever you save. Fast iteration!
|
|
|
|
### 4. Deploy to Robot
|
|
|
|
When ready:
|
|
|
|
```bash
|
|
# 1. Uncomment FTC imports in:
|
|
# - src/main/java/robot/hardware/MecanumDrive.java
|
|
# - src/main/java/robot/opmodes/TeleOp.java
|
|
|
|
# 2. Deploy
|
|
./deploy-to-robot.sh
|
|
```
|
|
|
|
## Adding a New Subsystem
|
|
|
|
**1. Create the subsystem:**
|
|
```java
|
|
// src/main/java/robot/subsystems/Intake.java
|
|
package robot.subsystems;
|
|
|
|
public class Intake {
|
|
private final Hardware hardware;
|
|
|
|
public Intake(Hardware hardware) {
|
|
this.hardware = hardware;
|
|
}
|
|
|
|
public void grab() {
|
|
hardware.setPower(1.0);
|
|
}
|
|
|
|
public void release() {
|
|
hardware.setPower(-1.0);
|
|
}
|
|
|
|
public void stop() {
|
|
hardware.setPower(0.0);
|
|
}
|
|
|
|
// Hardware interface - inner interface pattern
|
|
public interface Hardware {
|
|
void setPower(double power);
|
|
}
|
|
}
|
|
```
|
|
|
|
**2. Create the test:**
|
|
```java
|
|
// src/test/java/robot/subsystems/IntakeTest.java
|
|
package robot.subsystems;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
class IntakeTest {
|
|
// Inline mock - no FTC SDK needed!
|
|
static class MockHardware implements Intake.Hardware {
|
|
double power = 0;
|
|
public void setPower(double p) { power = p; }
|
|
}
|
|
|
|
@Test
|
|
void testGrab() {
|
|
MockHardware mock = new MockHardware();
|
|
Intake intake = new Intake(mock);
|
|
|
|
intake.grab();
|
|
|
|
assertEquals(1.0, mock.power);
|
|
}
|
|
|
|
@Test
|
|
void testRelease() {
|
|
MockHardware mock = new MockHardware();
|
|
Intake intake = new Intake(mock);
|
|
|
|
intake.release();
|
|
|
|
assertEquals(-1.0, mock.power);
|
|
}
|
|
}
|
|
```
|
|
|
|
**3. Test it:**
|
|
```bash
|
|
./gradlew test
|
|
```
|
|
|
|
**4. Create hardware implementation:**
|
|
```java
|
|
// src/main/java/robot/hardware/IntakeHardware.java
|
|
package robot.hardware;
|
|
|
|
import robot.subsystems.Intake;
|
|
// import com.qualcomm.robotcore.hardware.DcMotor;
|
|
// import com.qualcomm.robotcore.hardware.HardwareMap;
|
|
|
|
public class IntakeHardware implements Intake.Hardware {
|
|
// private final DcMotor motor;
|
|
|
|
public IntakeHardware(/* HardwareMap hardwareMap */) {
|
|
// motor = hardwareMap.get(DcMotor.class, "intake");
|
|
}
|
|
|
|
@Override
|
|
public void setPower(double power) {
|
|
// motor.setPower(power);
|
|
}
|
|
}
|
|
```
|
|
|
|
**5. Use in OpMode:**
|
|
```java
|
|
// In your TeleOp init():
|
|
// IntakeHardware intakeHw = new IntakeHardware(hardwareMap);
|
|
// Intake intake = new Intake(intakeHw);
|
|
|
|
// In your TeleOp loop():
|
|
// if (gamepad1.a) intake.grab();
|
|
// if (gamepad1.b) intake.release();
|
|
```
|
|
|
|
## Common Commands
|
|
|
|
```bash
|
|
# Run tests once
|
|
./gradlew test
|
|
|
|
# Watch tests (auto-rerun)
|
|
./gradlew test --continuous
|
|
|
|
# Build (compile check)
|
|
./gradlew build
|
|
# or
|
|
./build.sh
|
|
|
|
# Deploy to robot
|
|
./deploy-to-robot.sh
|
|
|
|
# Deploy via WiFi to custom IP
|
|
./deploy-to-robot.sh -i 192.168.1.100
|
|
|
|
# Clean build
|
|
./gradlew clean build
|
|
|
|
# List all available Gradle tasks
|
|
./gradlew tasks
|
|
```
|
|
|
|
## Upgrading Your Project
|
|
|
|
When a new version of the generator is released:
|
|
|
|
```bash
|
|
# Commit your work first
|
|
git add .
|
|
git commit -m "Save before upgrade"
|
|
|
|
# Run upgrade
|
|
ftc-new-project my-robot --upgrade
|
|
|
|
# Review changes
|
|
git diff
|
|
|
|
# Test
|
|
./gradlew test
|
|
```
|
|
|
|
Only infrastructure files are updated. Your code is never touched!
|
|
|
|
## Tips
|
|
|
|
1. **Keep FTC imports commented** during development
|
|
2. **Write tests for everything** - they're fast and catch bugs early
|
|
3. **Use continuous testing** - `./gradlew test --continuous`
|
|
4. **Commit often** - Git protects you during upgrades
|
|
5. **One SDK, many projects** - Create multiple projects, they share the SDK
|
|
|
|
## Troubleshooting
|
|
|
|
**Tests fail:**
|
|
```bash
|
|
./gradlew clean test
|
|
```
|
|
|
|
**Build fails:**
|
|
```bash
|
|
./gradlew clean build --refresh-dependencies
|
|
```
|
|
|
|
**Can't deploy:**
|
|
```bash
|
|
# Check adb connection
|
|
adb devices
|
|
|
|
# Try manual connection
|
|
adb connect 192.168.43.1:5555
|
|
```
|
|
|
|
**Gradle issues:**
|
|
```bash
|
|
# Regenerate wrapper
|
|
gradle wrapper --gradle-version 8.9
|
|
```
|
|
|
|
## Next Steps
|
|
|
|
- Read the full [README.md](README.md)
|
|
- Check out [DEVELOPER.md](DEVELOPER.md) if you want to contribute
|
|
- See [CHANGELOG.md](CHANGELOG.md) for version history
|
|
|
|
## Getting Help
|
|
|
|
- Check documentation in README.md
|
|
- Review example code in generated project
|
|
- Look at test examples in `src/test/java/robot/`
|
|
|
|
Happy coding! 🤖
|