---
# System prepended metadata

title: 程式101
tags: [程式]

---

# 程式101
###### tags: `程式` `函式庫安裝`

## 安裝環境
有(at least)三包東西要安裝

### 1. FRC game tool
由NI(National Instrument)提供
對機器通訊用的程式們，例如Driver Station
(以及LabVIEW編寫FRC機器用的library [^LabVIEWLib])
https://www.ni.com/zh-tw/support/downloads/drivers/download.frc-game-tools.html#440024

[^LabVIEWLib]: 類似於java要裝WPILib這個程式庫才能寫FRC的程式，LabVIEW要裝這些library才能寫FRC，總之不是我們要用的東西

### 2. WPILib
由[WPI](https://zh.wikipedia.org/zh-tw/%E4%BC%8D%E6%96%AF%E7%89%B9%E7%90%86%E5%B7%A5%E5%AD%A6%E9%99%A2)提供
讓C++/java可以寫FRC機器程式的library，以及code裡面寫說在`edu.wpi.first.wpilibj`package底下的所有東西
內含VSCode、Smart dashboard等，一堆很厲害的東西
https://github.com/wpilibsuite/allwpilib/releases

### 3. [3rd Party libraries](https://docs.wpilib.org/en/stable/docs/software/vscode-overview/3rd-party-libraries.html)
#### [線上安裝方法(Online Installation)](https://docs.wpilib.org/en/latest/docs/software/vscode-overview/3rd-party-libraries.html#adding-offline-libraries)
* 打開 WPILib VS Code 並點擊右上角的 WPILib 圖示
* 選擇Manage Vendor Libraries
* 按一下Install new libraries (online)
* 貼上URL並按下Enter
#### 1.REV Robotics REVLib
搭配SPARK MAX和Color Sensor V3
*Online Installation URL:*
https://software-metadata.revrobotics.com/REVLib-2024.json
*Offline Installation*
* 下載REVLib壓縮檔
* 解壓縮後將所有資料夾複製到”C:\Users\Public\wpilib\2024”中
* 完成安裝
https://docs.revrobotics.com/brushless/revlib/revlib-overview#c-and-java-installation
#### 2.[CTRE Phoenix Framework](https://store.ctr-electronics.com/software/)
由CTRE(Victor SPX, Talon SRX馬達控制器和CANcoder, CANifier, Pigeon IMU, 
Pigeon 2.0等CAN裝置的製造商)提供
要操作這兩種馬達控制器用的，還有馬達控制器的很多特異功能
還有[Pheonix tuner X](https://v6.docs.ctr-electronics.com/en/stable/docs/tuner/index.html)
*Online Installation URL:*
Phoenix 6: https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2024-latest.json
*Offline Installation*
* 選擇FRC Offline Installer
* 在FRC Libraries中勾選"C++/Java"
* 等待安裝完成
https://docs.ctr-electronics.com/

ref: https://docs.wpilib.org/en/stable/docs/software/can-devices/third-party-devices.html
#### 3.[Kauai Labs](https://pdocs.kauailabs.com/navx-mxp/software/roborio-libraries/java/)
搭配NavX-MXP使用，離線安裝的檔案目前沒有更新，建議使用線上安裝
*Online Installation URL:*
https://dev.studica.com/releases/2024/NavX.json
```
//宣告
m_ahrs = new AHRS(SerialPort.Port.kMXP);
```
---

## 創建新專案
1. 打開VSCode
2. ctrl+shift+P -> "WPILib: create a new project"
3. (GUI表單) 選擇語言(C++/Java), 框架(Timed/Command), 資料夾, 隊號
4. ctrl+shift+P -> "WPILib: Manage Vendor Libraries" 或 檔案列表build.gradle按右鍵"Manage Vendor Libraries"
5.  -> "install new libraries" -> "CTRE-Pheonix"

(1,2,3 ref: https://docs.wpilib.org/en/latest/docs/zero-to-robot/step-4/creating-benchtop-test-program-cpp-java.html)
(1,2,3 ref: https://docs.wpilib.org/en/stable/docs/software/vscode-overview/creating-robot-program.html)
(4,5 ref: https://docs.wpilib.org/en/latest/docs/software/vscode-overview/3rd-party-libraries.html)

---

## 編譯上傳
ctrl+shift+P -> "WPILib: Deploy Robot Code" 或 檔案列表build.gradle按右鍵"Deploy Robot Code"

---

## Timed Robot 基本架構
`src\main\java\frc\robot\Robot.java`
```java
public void robotInit() {
    // 機器剛開機執行一次
    // 用來初始化各個元件(搖桿&馬達)
}

public void teleopInit() {
    // 剛進入teleOp模式時執行一次
    // 通常留空，或者設定一些狀態例如變速檔位，以及機器初始狀態所有馬達靜止
}

public void teleopPeriodic() {
    // 在teleOp模式時每20ms一直重複執行
    // 大部分事情寫在這裡
}

// 自走模式的init和periodic
public void autonomousInit() {
}
public void autonomousPeriodic() {
}
```

---

## 基本元件

### XboxController
`XboxController` extends `GenericHID`
https://docs.wpilib.org/en/stable/docs/software/basic-programming/joystick.html#xboxcontroller-class
https://first.wpi.edu/wpilib/allwpilib/docs/release/java/edu/wpi/first/wpilibj/XboxController.html
```java
import edu.wpi.first.wpilibj.XboxController;
...
XboxController con;
...
con = new XboxController(0);

...

con.getAButton();                   // 被按著
con.getAButtonPressed();            // 按一次
con.getAButtonReleased();           // 放開(一次)
...
con.getLeftX();                     // 左蘑菇頭的X軸

...

// methods inherit from GenericHID
con.getPOV(0)                      // 第0個POV被按下的角度
con.getPOV()                       // 預設(第0個)POV被按下的角度
/* Don't use these:
con.getRawButton(6) 	           // 第6顆按鈕被按著
con.getRawButtonPressed(6)         // 第6顆按鈕被按下過 	
con.getRawButtonReleased(6)        // 第6顆按鈕被放開過
// 按鈕編號從1開始
con.getRawAxis(3)                  // 第0個軸
// 軸編號從0開始
*/
```

### WPI_VictorSPX
`WPI_VictorSPX` extends `VictorSPX`
https://api.ctr-electronics.com/phoenix/release/java/com/ctre/phoenix/motorcontrol/can/WPI_VictorSPX.html
```java
import com.ctre.phoenix.motorcontrol.can.WPI_VictorSPX;
...
WPI_VictorSPX motor1;
...
motor1 = new WPI_VictorSPX(8);

...

motor1.set(-0.4)
```

---

## Smart Dashboard
https://docs.wpilib.org/en/stable/docs/software/dashboards/shuffleboard/getting-started/shuffleboard-tour.html
https://first.wpi.edu/wpilib/allwpilib/docs/release/java/edu/wpi/first/wpilibj/smartdashboard/SmartDashboard.html
```java
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
...
SmartDashboard.putNumber("Car_Speed", 0);
...
carspeed=SmartDashboard.getNumber("Car_Speed", 0);
```

---

## Example code

```java
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

package frc.robot;

import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.XboxController;
import com.ctre.phoenix.motorcontrol.can.WPI_VictorSPX;

/**
 * The VM is configured to automatically run this class, and to call the
 * functions corresponding to
 * each mode, as described in the TimedRobot documentation. If you change the
 * name of this class or
 * the package after creating this project, you must also update the
 * build.gradle file in the
 * project.
 */
public class Robot extends TimedRobot {
  private XboxController con;
  private WPI_VictorSPX motor1;

  /**
   * This function is run when the robot is first started up and should be used
   * for any
   * initialization code.
   */
  @Override
  public void robotInit() {
    con = new XboxController(0);
    motor1 = new WPI_VictorSPX(8);
  }

  /**
   * This function is called every 20 ms, no matter the mode. Use this for items
   * like diagnostics
   * that you want ran during disabled, autonomous, teleoperated and test.
   *
   * <p>
   * This runs after the mode specific periodic functions, but before LiveWindow
   * and
   * SmartDashboard integrated updating.
   */
  @Override
  public void robotPeriodic() {
  }

  /**
   * This autonomous (along with the chooser code above) shows how to select
   * between different
   * autonomous modes using the dashboard. The sendable chooser code works with
   * the Java
   * SmartDashboard. If you prefer the LabVIEW Dashboard, remove all of the
   * chooser code and
   * uncomment the getString line to get the auto name from the text box below the
   * Gyro
   *
   * <p>
   * You can add additional auto modes by adding additional comparisons to the
   * switch structure
   * below with additional strings. If using the SendableChooser make sure to add
   * them to the
   * chooser code above as well.
   */
  @Override
  public void autonomousInit() {
  }

  /** This function is called periodically during autonomous. */
  @Override
  public void autonomousPeriodic() {
  }

  /** This function is called once when teleop is enabled. */
  @Override
  public void teleopInit() {
  }

  /** This function is called periodically during operator control. */
  @Override
  public void teleopPeriodic() {
    if (con.getAButton()) {
      motor1.set(0.3);
    } else {
      motor1.set(0.0);
    }
  }

  /** This function is called once when the robot is disabled. */
  @Override
  public void disabledInit() {
  }

  /** This function is called periodically when disabled. */
  @Override
  public void disabledPeriodic() {
  }

  /** This function is called once when test mode is enabled. */
  @Override
  public void testInit() {
  }

  /** This function is called periodically during test mode. */
  @Override
  public void testPeriodic() {
  }

  /** This function is called once when the robot is first started up. */
  @Override
  public void simulationInit() {
  }

  /** This function is called periodically whilst in simulation. */
  @Override
  public void simulationPeriodic() {
  }
}

```


```java
// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

package frc.robot;

import edu.wpi.first.wpilibj.TimedRobot;

/**
 * The VM is configured to automatically run this class, and to call the
 * functions corresponding to
 * each mode, as described in the TimedRobot documentation. If you change the
 * name of this class or
 * the package after creating this project, you must also update the
 * build.gradle file in the
 * project.
 */
public class Robot extends TimedRobot {
  /**
   * This function is run when the robot is first started up and should be used
   * for any
   * initialization code.
   */
  @Override
  public void robotInit() {
  }

  /**
   * This function is called every 20 ms, no matter the mode. Use this for items
   * like diagnostics
   * that you want ran during disabled, autonomous, teleoperated and test.
   *
   * <p>
   * This runs after the mode specific periodic functions, but before LiveWindow
   * and
   * SmartDashboard integrated updating.
   */
  @Override
  public void robotPeriodic() {
  }

  /**
   * This autonomous (along with the chooser code above) shows how to select
   * between different
   * autonomous modes using the dashboard. The sendable chooser code works with
   * the Java
   * SmartDashboard. If you prefer the LabVIEW Dashboard, remove all of the
   * chooser code and
   * uncomment the getString line to get the auto name from the text box below the
   * Gyro
   *
   * <p>
   * You can add additional auto modes by adding additional comparisons to the
   * switch structure
   * below with additional strings. If using the SendableChooser make sure to add
   * them to the
   * chooser code above as well.
   */
  @Override
  public void autonomousInit() {
  }

  /** This function is called periodically during autonomous. */
  @Override
  public void autonomousPeriodic() {
  }

  /** This function is called once when teleop is enabled. */
  @Override
  public void teleopInit() {
  }

  /** This function is called periodically during operator control. */
  @Override
  public void teleopPeriodic() {
  }

  /** This function is called once when the robot is disabled. */
  @Override
  public void disabledInit() {
  }

  /** This function is called periodically when disabled. */
  @Override
  public void disabledPeriodic() {
  }

  /** This function is called once when test mode is enabled. */
  @Override
  public void testInit() {
  }

  /** This function is called periodically during test mode. */
  @Override
  public void testPeriodic() {
  }

  /** This function is called once when the robot is first started up. */
  @Override
  public void simulationInit() {
  }

  /** This function is called periodically whilst in simulation. */
  @Override
  public void simulationPeriodic() {
  }
}

```