mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-23 01:21:42 +00:00
119 lines
3.7 KiB
Markdown
119 lines
3.7 KiB
Markdown
# HAL XRP Client
|
|
|
|
This is an extension that provides a client version of the XRP protocol for transmitting robot hardware interface state to an XRP robot over UDP.
|
|
|
|
## Configuration
|
|
|
|
The XRP client has a number of configuration options available through environment variables.
|
|
|
|
``HALSIMXRP_HOST``: The host to connect to. Defaults to localhost.
|
|
|
|
``HALSIMXRP_PORT``: The port number to connect to. Defaults to 3540.
|
|
|
|
## XRP Protocol
|
|
|
|
The WPILib -> XRP protocol is binary-based to save on bandwidth due to hardware limitations of the XRP robot. The messages to/from the XRP follow a the format below:
|
|
|
|
| 2 bytes | 1 byte | n bytes |
|
|
|---------------------|-------------------|-------------------------------------|
|
|
| _uint16_t_ sequence | _uint8_t_ control | [<Tagged Data>](#tagged-data) |
|
|
|
|
### Control Byte
|
|
|
|
The control byte is used to indicate the current `enabled` state of the WPILib robot code. When this is set to `1`, the robot is enabled, and when it is set to `0` it is disabled.
|
|
|
|
Messages originating from the XRP have an unspecified value for the control byte.
|
|
|
|
### Tagged Data
|
|
|
|
The `Tagged Data` section can contain an arbitrary number of data blocks. Each block has the format below:
|
|
|
|
| 1 byte | 1 byte | n bytes |
|
|
|----------------|-----------------|-----------------|
|
|
| _uint8_t_ size | _uint8_t_ tagID | <payload> |
|
|
|
|
The `size` byte encodes the size of the data block, _excluding_ itself. Thus the smallest block size is 2 bytes, with a size value of 1 (1 size byte, 1 tag byte, 0 payload bytes). Maximum size of the payload is 254 bytes.
|
|
|
|
|
|
Utilizing tagged data blocks allows us to send multiple pieces of data in a single UDP packet. The tags currently implemented for the XRP are as follows:
|
|
|
|
| Tag | Description |
|
|
|------|-------------------------------|
|
|
| 0x12 | [XRPMotor](#xrpmotor) |
|
|
| 0x13 | [XRPServo](#xrpservo) |
|
|
| 0x14 | [DIO](#dio) |
|
|
| 0x15 | [AnalogIn](#analogin) |
|
|
| 0x16 | [XRPGyro](#xrpgyro) |
|
|
| 0x18 | [Encoder](#encoder) |
|
|
|
|
|
|
#### XRPMotor
|
|
|
|
| Order | Data Type | Description |
|
|
|-------|-----------|-------------------|
|
|
| 0 | _uint8_t_ | ID |
|
|
| 1 | _float_ | Value [-1.0, 1.0] |
|
|
|
|
IDs:
|
|
| ID | Description |
|
|
|----|-------------|
|
|
| 0 | Left Motor |
|
|
| 1 | Right Motor |
|
|
| 2 | Motor 3 |
|
|
| 3 | Motor 4 |
|
|
|
|
#### XRPServo
|
|
|
|
| Order | Data Type | Description |
|
|
|-------|-----------|------------------|
|
|
| 0 | _uint8_t_ | ID |
|
|
| 1 | _float_ | Value [0.0, 1.0] |
|
|
|
|
IDs:
|
|
| ID | Description |
|
|
|----|-------------|
|
|
| 4 | Servo 1 |
|
|
| 5 | Servo 2 |
|
|
|
|
#### DIO
|
|
|
|
| Order | Data Type | Description |
|
|
|-------|-----------|--------------------|
|
|
| 0 | _uint8_t_ | ID |
|
|
| 1 | _uint8_t_ | Value (True/False) |
|
|
|
|
#### AnalogIn
|
|
|
|
| Order | Data Type | Description |
|
|
|-------|-----------|-------------|
|
|
| 0 | _uint8_t_ | ID |
|
|
| 1 | _float_ | Value |
|
|
|
|
#### XRPGyro
|
|
|
|
| Order | Data Type | Description |
|
|
|-------|-----------|---------------|
|
|
| 0 | _float_ | rate_x (dps) |
|
|
| 1 | _float_ | rate_y (dps) |
|
|
| 2 | _float_ | rate_z (dps) |
|
|
| 3 | _float_ | angle_x (deg) |
|
|
| 4 | _float_ | angle_y (deg) |
|
|
| 5 | _float_ | angle_z (deg) |
|
|
|
|
#### Encoder
|
|
|
|
| Order | Data Type | Description |
|
|
|-------|------------|--------------------|
|
|
| 0 | _uint8_t_ | ID |
|
|
| 1 | _int32_t_ | Count |
|
|
| 2 | _uint32_t_ | Period Numerator |
|
|
| 3 | _uint32_t_ | Period Denominator |
|
|
|
|
IDs:
|
|
| ID | Description |
|
|
|----|---------------------|
|
|
| 0 | Left Motor Encoder |
|
|
| 1 | Right Motor Encoder |
|
|
| 2 | Motor 3 Encoder |
|
|
| 3 | Motor 4 Encoder |
|