FRCture – Reverse Engineering FRC¶
Documenting the results of reversing engineering various proprietary aspects of the FIRST Robotics Competition system.
This is a work in progress. Report any suggestions or corrections on the issues page.
Driver Station¶
The Driver Station communicates with both the RoboRIO and Field Management System using a set of network protocols.
Driver Station to RoboRIO¶
UDP¶
Sent every 20ms to the RoboRIO, UDP port 1110 (port 1115 when connected to FMS)
Field | Length | Type | Comment |
---|---|---|---|
Sequence Num | 2 | uint16 | |
Comm Version | 1 | uint8 | 0x01 is currently the only observed value |
Control | 1 | Control | |
Request | 1 | Request | |
Alliance | 1 | Alliance | |
Tags | n | Tags |
Control¶
Field | Mask | Comment |
---|---|---|
E-Stop | x....... |
|
FMS Connected | ....x... |
|
Enabled | .....x.. |
|
Mode | ......xx |
0: Teleop, 1: Test, 2: Autonomous |
Request¶
Field | Mask | Comment |
---|---|---|
Reboot RoboRIO | ....x... |
|
Restart Code | .....x.. |
Alliance¶
Color is Red if value < 3
, else Blue. Position is value % 3 + 1
Tags¶
Field | Length | Type | Comment |
---|---|---|---|
Size | 1 | uint8 | |
ID | 1 | uint8 | See table below |
Data | n | Depends on tag type |
ID | Tag |
---|---|
0x07 |
Countdown |
0x0c |
Joystick |
0x0f |
Date |
0x10 |
Timezone |
Countdown 0x07
¶
Field | Length | Type | Comment |
---|---|---|---|
Countdown | 4 | float | In seconds |
Joystick 0x0c
¶
Field | Length | Type | Comment |
---|---|---|---|
Axis Count | 1 | uint8 | Number of axis bytes to follow |
Axes | n | int8 | -128 to 127, for each axis |
Button Count | 1 | uint8 | Number of buttons |
Buttons | n | Button | Bytes containing button data |
POV Count | 1 | uint8 | Number of POVs |
POVs | 2 * n | int16 | 0 to 360, -1 if not pressed |
Date 0x0f
¶
This and Timezone below are sent once when the DS first connects.
Field | Length | Type | Comment |
Microseconds | 4 | uint32 | |
Second | 1 | uint8 | |
Minute | 1 | uint8 | |
Hour | 1 | uint8 | In UTC |
Day | 1 | uint8 | |
Month | 1 | uint8 | 0 is January |
Year | 1 | uint8 | Year (starting at 1900) |
Timezone 0x10
¶
Field | Length | Type | Comment |
Timezone | n | string | Timezone |
TCP¶
Sent over TCP port 1740. Strings are either prefixed with a length (specified) or implied.
Field | Length | Type | Comment |
Size | 2 | uint16 | Including ID |
ID | 1 | uint8 | See table below (only if Size > 0) |
Tags | n | Tags |
Tags¶
ID | Tag |
0x02 |
Joystick Descriptor |
0x07 |
Match Info |
0x0e |
Game Data |
Joystick Descriptor 0x02
¶
Sends everything on the USB Devices tab of the DS, whether connected or not. Sent when joystick is plugged in, unplugged, or reordered.
Field | Length | Type | Comment |
---|---|---|---|
Index | 1 | uint8 | |
Is Xbox | 1 | bool | True if XBox controller |
Type | 1 | int8 | See below |
Name | 1 + n | string | |
Axis Count | 1 | uint8 | |
Axis Types | n | bytes | See below (one per axis) |
Button Count | 1 | uint8 | |
POV Count | 1 | uint8 |
Num | Type | Num | Type |
-1 | Unknown | 8 | XInput Drum Kit |
0 | XInput Unknown | 11 | XInput Guitar 3 |
1 | XInput Gamepad | 19 | XINput Arcade Pad |
2 | XInput Wheel | 20 | HID Joystick |
3 | XInput Arcade | 21 | HID Gamepad |
4 | XInput Flight Stick | 22 | HID Driving |
5 | XInput Dance Pad | 23 | HID Flight |
6 | XInput Guitar | 24 | HID 1st Person |
7 | XInput Guitar 2 |
Num | Type | Num | Type |
---|---|---|---|
0 | X Axis | 3 | Twist Axis |
1 | Y Axis | 4 | Throttle Axis |
2 | Z Axis |
Match Info 0x07
¶
Field | Length | Type | Comment |
---|---|---|---|
Competition | 1 + n | string | |
Match Type | 1 | enum | 0:”None”, 1:Practice, 2:Qualifications, 3:Eliminations |
Game Data 0x0e
¶
Field | Length | Type | Comment |
---|---|---|---|
Game Data | n | string |
RoboRIO to Driver Station¶
UDP¶
Sent every 20ms in response to Driver Station packets, UDP port 1150
Field | Length | Type | Comment |
---|---|---|---|
Sequence Num | 2 | uint16 | |
Comm Version | 1 | uint8 | 0x01 is currently the only observed value |
Status | 1 | Status | Basically an echo if everything is operating properly |
Trace | 1 | Trace | |
Battery | 2 | Battery | |
Request Date? | 1 | uint8 | 0x01 when first connecting, 0x00 otherwise |
Tags | n | Tags |
Status¶
Field | Mask | Comment |
---|---|---|
E-Stop | x....... |
|
Brownout | ...x.... |
0: Normal, 1: Voltage Brownout |
Code Start | ....x... |
0: Running, 1: Initializing |
Enabled | .....x.. |
|
Mode | ......xx |
0: Teleop, 1: Test, 2: Autonomous |
Trace¶
Field | Mask | Comment |
---|---|---|
Robot Code | ..x..... |
|
Is RoboRIO | ...x.... |
|
Test Mode | ....x... |
|
Autonomous Mode | .....x.. |
|
TeleOp Code | ......x. |
|
Disabled | .......x |
Tags¶
Field | Length | Type | Comment |
---|---|---|---|
Size | 1 | uint8 | |
ID | 1 | uint8 | See table below |
Data | n | Depends on tag type |
ID | Tag |
---|---|
0x01 |
Joystick Output |
0x04 |
Disk Info |
0x05 |
CPU Info |
0x06 |
RAM Info |
0x08 |
PDP Log |
0x09 |
Unknown |
0x0e |
CAN Metrics |
Joystick Output 0x01
¶
If multiple joysticks, the extended packets are concatenated together. If a joystick isn’t outputting anything, the size will be 1 (to include the packet type ID) and not contain any of the below. So if the 3rd joystick is outputting, it’ll output 01 01 01 01 09 01 <below structure>.
Field | Length | Type | Comment |
---|---|---|---|
Outputs | 4 | Output | |
Left Rumble | 2 | uint16 | |
Right Rumble | 2 | uint16 |
Disk Info 0x04
¶
Field | Length | Type | Comment |
Free Space | 4 | uint32 | Number of bytes available |
CPU Info 0x05
¶
Field | Length | Type | Comment |
---|---|---|---|
Num of CPUs | 4 | float | 0x02 on the RoboRIO |
CPUn Time Critical % | 4 | float | |
CPUn Above Normal % | 4 | float | |
CPUn Normal % | 4 | float | |
CPUn Low % | 4 | float |
RAM Info 0x06
¶
Field | Length | Type | Comment |
Block | 4 | uint32 | |
Free Space | 4 | uint32 | Number of bytes available |
PDP Log 0x08
¶
Field | Length | Type | Comment |
Unknown | 1 | ||
PDP Stats | 21 | ||
Unknown | 3 |
The statistics for each PDP port is 10 bits, padding together for a total of 21 bytes.
struct PDP {
uint16_t port_00 : 10; //
uint16_t port_01 : 10; // 8 bytes, 40 bits
uint16_t port_02 : 10; //
uint16_t port_03 : 10; //
uint16_t port_04 : 10; //
uint16_t port_05 : 10; //
uint16_t pad1 : 4; //
uint16_t port_06 : 10; //
uint16_t port_07 : 10; // 8 bytes, 40 bits
uint16_t port_08 : 10; //
uint16_t port_09 : 10; //
uint16_t port_10 : 10; //
uint16_t port_10 : 10; //
uint16_t pad2 : 4; //
uint16_t port_12 : 10; //
uint16_t port_13 : 10; // 5 bytes, 40 bits
uint16_t port_14 : 10; //
uint16_t port_15 : 10; //
}
Unknown 0x09
¶
Field | Length | Type | Comment |
Unknown | 9 |
CAN Metrics 0x0e
¶
Field | Length | Type | Comment |
Utilization % | 4 | float | |
Bus Off | 4 | uint32 | |
TX Full | 4 | uint32 | |
RX Errors | 1 | uint8 | |
TX Errors | 1 | uint8 |
TCP¶
Sent over TCP port 1740. Strings are either prefixed with a length (specified) or implied.
Field | Length | Type | Comment |
Size | 2 | uint16 | Including ID |
ID | 1 | uint8 | See table below (only if Size > 0) |
Tags | 1 | Depends on tag type |
Tags¶
ID | Tag |
0x00 |
Radio Events? |
0x01 |
Usage Report |
0x04 |
Disable Faults |
0x05 |
Rail Faults |
0x0a |
Version Info |
0x0b |
Error Message |
0x0c |
Standard Output |
0x0d |
Unknown |
Radio Events? 0x00
¶
Might just be generic “Error Strings” or something.
Field | Length | Type | Comment |
Message | n | string |
Usage Report 0x01
¶
Field | Length | Type | Comment |
---|---|---|---|
Team Num | 2 | string | |
Unknown | 1 | uint8 | |
Entries | n | Entry Data |
Disable Faults 0x04
¶
Field | Length | Type | Comment |
---|---|---|---|
Comms | 2 | uint16 | |
12V | 2 | uint16 |
Rail Faults 0x05
¶
Field | Length | Type | Comment |
---|---|---|---|
6V | 2 | uint16 | |
5V | 2 | uint16 | |
3.3V | 2 | uint16 |
Version Info 0x0a
¶
Field | Length | Type | Comment |
---|---|---|---|
Type | 1 | Device | See below |
Unknown | 2 | ||
ID | 1 | uint8 | CAN ID? |
Name | 1 + n | string | |
Version | 1 + n | string |
Empty message (00 00 00 00 00 00
) signifies end of list.
Num | Type |
---|---|
0 | Software (roboRIO image , FRC_Lib_Version ) |
2 | CAN Talon |
8 | PDP |
9 | PCM |
Error Message 0x0b
¶
Shows up in main Driver Station log. Sequence Number increments along with Standard Output.
Field | Length | Type | Comment |
---|---|---|---|
Timestamp | 4 | float | Seconds since start of log |
SeqNum | 2 | uint16 | |
Unknown | 2 | Only seen as 01 ? |
|
Error Code | 4 | int32 | |
Flags | 1 | Flags | |
Details | 2 + n | string | |
Location | 2 + n | string | |
Call Stack | 2 + n | string |
Field | Mask | Comment |
---|---|---|
Error | .......x |
|
isLVcode | ......x. |
Standard Output 0x0c
¶
Sequence Number increments along with Error Message.
Field | Length | Type | Comment |
---|---|---|---|
Timestamp | 4 | float | Seconds since start of log |
SeqNum | 2 | uint16 | |
Message | n | string |
Unknown 0x0d
¶
00 00 04 04 04 04
Driver Station to FMS¶
UDP¶
Sent to 10.0.100.5 UDP port 1160 (from UDP port 1145).
Field | Length | Type | Comment |
---|---|---|---|
Sequence Num | 2 | uint16 | |
Comm Version | 1 | uint8 | Only 0x00 has been observed |
Status Byte | 1 | Status | Contains control bits |
Team Num | 2 | uint16 | |
Battery | 2 | Battery | Battery voltage |
Tags | N | Tags |
Status¶
Field | Mask | Comment |
E-Stop | x....... |
0: Normal, 1: Emergency Stopped |
Robot Comms Active | ..x..... |
0: No, 1: Yes |
Radio Ping | ...x.... |
0: No, 1: Yes |
Rio Ping | ....x... |
0: No, 1: Yes |
Enabled | .....x.. |
0: Disabled, 1: Enabled |
Mode | ......xx |
0: TeleOp, 1: Test, 2: Autonomous |
Reserved | .x...... |
Battery¶
Received as a uint16, XXYY
. Voltage is calculated by: XX + YY/256
Tags¶
Field | Length | Type | Comment |
---|---|---|---|
Size | 1 | uint8 | |
ID | 1 | uint8 | See table below |
Data | n | Depends on tag type |
ID | Packet Type |
---|---|
0x00 | Field Radio Metrics |
0x01 | Comms Metrics |
0x02 | Laptop Metrics |
0x03 | Robot Radio Metrics |
0x04 | PD Info |
Field Radio Metrics (0x00
)¶
Field | Length | Type | Comment |
---|---|---|---|
Signal Strength | 1 | uint8 | |
Bandwidth Utilization | 2 | uint16 |
Comms Metrics (0x01
)¶
Field | Length | Type | Comment |
---|---|---|---|
Lost Packets | 2 | uint16 | |
Sent Packets | 2 | uint16 | |
Average Trip Time | 1 | uint8 |
Laptop Metrics (0x02
)¶
Field | Length | Type | Comment |
---|---|---|---|
Battery Percent | 1 | uint8 | |
CPU Percent | 1 | uint8 |
Robot Radio Metrics (0x03
)¶
Decompiling the Offseason FMS code shows “Robot Radio Metrics” in the enum, and a “UDPTagBridgeWifiMetrics”. Neither of which are used or handled, but I assume they are the same thing.
Field | Length | Type | Comment |
---|---|---|---|
Signal Strength | 1 | uint8 | |
Bandwidth Utilization | 2 | uint16 |
TCP¶
Sent to 10.0.100.5 TCP port 1750.
Field | Length | Type | Comment |
---|---|---|---|
Size | 2 | uint16 | Including ID |
ID | 1 | uint8 | See table below (only of Size > 0) |
Tags | n | Depends on tag type |
Tags¶
ID | Tag |
---|---|
0x00 |
WPILib Version |
0x01 |
RIO Version |
0x02 |
DS Version |
0x03 |
PDP Version |
0x04 |
PCM Version |
0x05 |
CANJag Version |
0x06 |
CANTalon Version |
0x07 |
Third Party Device Version |
0x15 |
Usage Report |
0x16 |
Log Data |
0x17 |
Error and Event Data |
0x18 |
Team Number |
0x1b |
Challenge Response |
0x1c |
DS Ping |
Versions all take the same format
Version¶
See above table for devices and their associated tag IDs.
Field | Length | Type | Comment |
---|---|---|---|
Status | n | string | <bad>, <good>, or <preferred> |
Version | n | string |
Usage Report (0x15
)¶
Field | Length | Type | Comment |
---|---|---|---|
Team Num | 2 | uint16 | |
Unknown | 1 | uint8 | |
Entries | n | Entry Data |
See Usage Reporting for details about the Entries format.
Log Data (0x16
)¶
Field | Length | Type | Comment |
---|---|---|---|
Trip Time | 1 | uint8 | This is round trip time, actual trip time is half of this |
Lost Packets | 1 | uint8 | |
Voltage | 2 | Battery | XXYY, XX + YY / 256 |
Robot Status | 1 | Status | |
CAN | 1 | uint8 | Value is halved |
SignalDb | 1 | uint8 | Value is halved |
Bandwidth | 2 | Bandwidth | round(float(uint16) / 256, 2) |
Field | Mask | Comment |
---|---|---|
Brownout | x....... |
|
Watchdog | .x...... |
|
DS TeleOp | ..x..... |
|
DS Auto | ...x.... |
|
DS Disable | ....x... |
|
Robot TeleOp | .....x.. |
|
Robot Auto | ......x. |
|
Robot Disable | .......x |
Error and Event Data (0x17
)¶
Field | Length | Type | Comment |
---|---|---|---|
Message Count | 4 | uint32 | Number of messages to process |
Timestamp | 8 | uint64 | Number of seconds since 1904/01/01 00:00:00 GMT |
Unknown | 8 | 86 48 b0 00 00 00 00 00 |
|
Log Message | 4 + n | string |
Team Number (0x18
)¶
Sent immediately upon TCP connection. Sending this triggers a challenge response.
Field | Length | Type | Comment |
---|---|---|---|
Team Num | 2 | uint16 | Looks like it takes over the FMS’s Driver Station context associated with that team number. Would probably be bad to send another team’s number from your own station |
Challenge Response (0x1b
)¶
Used to verify if the Driver Station is “official”. Trivial to figure out the correct response from the off-season FMS, which isn’t incredibly useful.
Field | Length | Type | Comment |
---|---|---|---|
Response | n | string |
As of 2017, there’s 23 possible responses. These change year to year.
ID | Response |
---|---|
0 | Johnny Five |
1 | Data |
2 | ED-209 |
3 | Bishop |
4 | NXT |
5 | Optimus Prime |
6 | Roomba |
7 | Rosie |
8 | The Terminator |
9 | HAL 9000 |
10 | Sojourner |
11 | R2-D2 |
12 | C-3PO |
13 | Wall-E |
14 | Curiosity |
15 | Opportunity |
16 | Spirit |
17 | Cylons |
18 | Stinky |
19 | Iron Giant |
20 | RCX |
21 | EV3 |
22 | ASIMO |
The correct response uses the Random Value sent by the Challenge Question.
id = ( (team number) * (random value) ) % 23
FMS to Driver Station¶
UDP¶
Sent to the DS every 500ms on UDP port 1121 by the normal FMS, or to UDP port 1120 by the offseason FMS. Sending to 1120 causes the DS to display a prompt asking to approve FMS control, whereas sending to 1121 starts FMS control immediatley.
Field | Length | Type | Comment |
---|---|---|---|
Sequence Num | 2 | uint16 | |
Comm Version | 1 | uint8 | Only 0x00 has been observed |
Control Byte | 1 | Control | Contains control bits |
Request Byte | 1 | Request | Stays at 0x00, not used |
Alliance Station | 1 | Alliance Station | Represents the station the DS connects to |
Tournament Level | 1 | Tournament Level | What level of competition this is |
Match Number | 2 | uint16 | Represents the number of current match |
Play Number | 1 | uint8 | Increments if there’s a replay |
Date | 10 | Date | |
Remaining Time | 2 | uint16 | Time left in current mode |
Tags | n | Tags | Offseason FMS has code for sending tags but none to send |
Control¶
Field | Mask | Comment |
E-Stop | x....... |
0: Normal, 1: Emergency Stopped |
Enabled | .....x.. |
0: Disabled, 1: Enabled |
Mode | ......xx |
0: TeloOp, 1: Test, 2: Autonomous |
Alliance Station¶
Computed by taking station [1, 3] and subtracting 1 for red, or adding 2 for blue.
Color is Red if value < 3
, else Blue. Position is value % 3 + 1
Tournament Level¶
Level | Value | Comment |
---|---|---|
Match Test | 0 | Only used during FMS setup for testing purposes |
Practice | 1 | |
Qualification | 2 | |
Playoff | 3 |
Date¶
Field | Length | Type | Comment |
---|---|---|---|
Microseconds | 4 | uint32 | |
Second | 1 | uint8 | |
Minute | 1 | uint8 | |
Hour | 1 | uint8 | In UTC? |
Day | 1 | uint8 | |
Month | 1 | uint8 | 0 is January |
Year | 1 | uint8 | Year (starting at 1900) |
TCP¶
10.0.100.5
, listening on TCP port 1750.
Field | Length | Type | Comment |
---|---|---|---|
Size | 2 | uint16 | Including ID |
ID | 1 | uint8 | See table below (only of Size > 0) |
Tags | n | Depends on tag type |
Tags¶
ID | Tag |
---|---|
0x00 |
WPILib Version |
0x01 |
RIO Version |
0x02 |
DS Version |
0x03 |
PDP Version |
0x04 |
PCM Version |
0x05 |
CANJag Version |
0x06 |
CANTalon Version |
0x07 |
Third Party Device Version |
0x14 |
Event Code |
0x19 |
Station Info |
0x1a |
Challenge Question |
0x1c |
Game Data |
Versions all take the same format
Version¶
See above table for devices and their associated tag IDs. Seems only the “preferred” DS version is sent to the Driver Station.
Field | Length | Type | Comment |
---|---|---|---|
Status | n | string | <bad>, <good>, or <preferred> |
Version | n | string |
Event Code (0x14
)¶
Field | Length | Type | Comment |
---|---|---|---|
Event Code | 1 + n | string | Event name |
Station Info (0x19
)¶
Field | Length | Type | Comment |
Alliance Station | 1 | Alliance Station | |
Station Status | 1 | Station Status |
Num | Status | Comment |
---|---|---|
0 | Good | Sent if FMS Driver Station context is valid. Causes the DS to display “FMS Connected” |
1 | Bad | Sent if the Driver Station is plugged into the wrong station. Causes the DS to display “Wrong station. Go to X” |
2 | Waiting | Sent if FMS Driver Station context is invalid. Causes the DS to display “FMS Waiting” |
Challenge Question (0x1a
)¶
Field | Length | Type | Comment |
---|---|---|---|
Question | 1 + n | string | Coolest robot EVER!!?? |
Random Value | 2 | uint16 | Random number [1000, 2000] associated with the FMS Driver Station context |
Offseason FMS allows for sending multiple questions, but the responses are only checked against the first one (as of 2018).
See the Challenge Response for possible responses.
Game Data (0x1c
)¶
Field | Length | Type | Comment |
---|---|---|---|
Data | 1 + n | string |
Dashboard¶
TODO: Based on LabVIEW Dashboard code. Need to actually listen and see if they are exact copies
The Driver Station uses a variety of ports to communicate with any Dashboard software. Either connects to these ports localhost or to them on the specified Remote Dashboard IP.
Control (UDP port 1164)¶
Simply a copy of the packets sent to the RoboRIO
Status (UDP port 1166)¶
Simply a copy of the packets sent from the RoboRIO
TCP (port 1741)¶
Might have the other tags, but at least have the `Robot IP` and `DB Mode` tags special
Field | Length | Type | Comment |
---|---|---|---|
Size | 2 | uint16 | Including ID |
ID | 1 | uint8 | See table below (only of Size > 0) |
Tags | n | Depends on tag type |
ID | Tag |
---|---|
0x00 | Error Messages |
0x04 | Disable Counts |
0x05 | Rail Faults |
0x07 | Match Info |
0x08 | Robot IP |
0x09 | DB Mode |
Error Messages (0x00
)¶
Field | Length | Type | Comment |
---|---|---|---|
Message | n | string |
Disable Counts (0x04
)¶
Field | Length | Type | Comment |
---|---|---|---|
Comms | 2 | uint16 | |
12V | 2 | uint16 |
Rail Faults (0x05
)¶
Field | Length | Type | Comment |
---|---|---|---|
6V | 2 | uint16 | |
5V | 2 | uint16 | |
3.3V | 2 | uint16 |
Match Info (0x07
)¶
Field | Length | Type | Comment |
---|---|---|---|
Competition | 1 + n | string | |
Match Type | 1 | 0: “None”, 1: Practice, 2: Qualifications, 3: Eliminations | |
Match Number | 2 | uint16 | |
Replay Number | 1 | uint8 |
Robot IP (0x08
)¶
Field | Length | Type | Comment |
---|---|---|---|
IP | 4 | IPv4 Address |
TCP Listening (port 1742)¶
The Driver Station listens on TCP port 1742 and sends the following JSON:
{"robotIP":0,"dashboardiP":3232235818,"FMS Connected":false,"Robot Connected":false,"RobotCode":false}
This is sent whenever one of the values changes.
Logging¶
The Driver Station saves 2 types of log files to disk (in C:\Users\Public\Documents\FRC\Log Files
)
for later viewing. A .dslog
and a .dsevents
.
The log populates the list with any file ending with .dslog
, but the Driver Station helpfully names
them with the current date and time. (e.g. 2018_04_22 23_39_25 Sun.dslog
)
.dslog
¶
Stored in Big Endian
Field | Length | Type | Comments |
---|---|---|---|
Header | 20 | Header | |
Entries | n | Entry | Array of n entries |
Header¶
Field | Length | Type | Comments |
---|---|---|---|
Version | 4 | uint32 | |
Unknown | 4 | ||
Timestamp | 4 | uint32 | Seconds since 1904/1/1 |
Fractional Seconds? | 1 | uint8 | Divide by 256 to get decimal part of timestamp? |
Unknown | 7 |
Entry¶
Field | Length | Type | Comments |
---|---|---|---|
Trip Time | 1 | uint8 | x / 15 = ms |
Packet Loss % | 1 | uint8 | x * 4 |
Battery | 2 | Battery | xx + yy/256 |
RoboRIO CPU % | 1 | uint8 | x / 2 |
Trace | 1 | Trace | |
CAN Percent | 1 | uint8 | x / 2 |
Wifi dB | 1 | uint8 | x / 2 |
Wifi Mb | 1 | uint8 | |
Unknown | 2 | ||
PDP Stats | 21 | PDP | |
Unknown | 3 |
Trace¶
Field | Mask | Comment |
---|---|---|
Brownout | x....... |
|
Watchdog | .x...... |
|
DS Teleop | ..x..... |
|
Unused | ...x.... |
|
DS Disabled | ....x... |
|
Robot Teleop | .....x.. |
|
Robot Auton | ......x. |
|
Robot Disabled | .......x |
PDP¶
Current for each PDP port is stored as 10 bits, (mostly) packed together. 0-5 are packed and padded into the first 64 bits, 6-11 are packed and padded into the next 64 bits, 12-15 are packed into the next 40 bits. Each of the 10 bit numbers is the current of the port * 8.
Ports | Bits | Total Bytes |
---|---|---|
0, 1, 2, 3, 4, 5 | 60 bits + 4 padding | 8 bytes |
6, 7, 8, 9, 10, 11 | 60 bits + 4 bits padding | 8 bytes |
12, 13, 14, 15 | 40 bits | 5 bytes |
.dsevent
¶
TODO
Usage Reporting¶
Format¶
Not quite sure what happens if the “feature” has a parentheses in it.
BNF¶
(..ish. Too lazy to make it actually proper)
<extended> ::= ">" | ""
<type> ::= <letter>
<instance> ::= <integer>
<context> ::= <integer>
<feature> ::= <text>
<opt-context> ::= "" | ":" <integer>
<opt-feature> :: "" | "(" <feature> ")"
<entry> ::= <extended> <type> <instance> <opt-context> <opt-feature>
<entry-list> ::= <entry> | <entry> <entry-list>
<report> ::= "V1" <entry-list>
PCRE¶
(?'extended'>)?(?'type'[A-Za-z])(?'instance'\d+)(?::(?'context'\d+))?(?:\((?'feature'.*?)\))
Entries¶
Entries with blank instances are either unused, or reported by an external library
Letter | Resource | Instance | Context | Feature | Comments |
---|---|---|---|---|---|
A |
Controller | ||||
B |
Module | ||||
C |
Language | Language Type | |||
D |
CANPlugin | ||||
E |
Accelerometer | Channel | Built-in accelerometer if using the built-in one |
||
F |
ADXL345 | 1: SPI, 2: I2C | |||
G |
AnalogChannel | Channel | |||
H |
AnalogTrigger | Channel | |||
I |
AnalogTriggerOutput | Trigger Index | Trigger Type | ||
J |
CANJaguar | ||||
K |
Compressor | PCM ID | |||
L |
Counter | Index | Counter Mode | ||
M |
Dashboard | ||||
N |
DigitalInput | Channel | |||
O |
DigitalOutput | Channel | |||
P |
DriverStationCIO | ||||
Q |
DriverStationEIO | ||||
R |
DriverStationLCD | ||||
S |
Encoder | FPGA Index | 0: 1X, 1: 2X, 2: 4X | ||
T |
GearTooth | Channel | D if direction sensitive. Not used in C++, is just a counter |
||
U |
Gyro | Channel | |||
V |
I2C | Device Address | |||
W |
Framework | Framework Type | |||
X |
Jaguar | Channel | |||
Y |
Joystick | Port | |||
Z |
Kinect | ||||
a |
KinectStick | ||||
b |
PIDController | Instance num (starting at 1) | |||
c |
Preferences | 0 |
|||
d |
PWM | Channel | |||
e |
Relay | Channel, (+128 if reversable) | |||
f |
RobotDrive | Num Motors | Drive Type | ||
g |
SerialPort | 0 | |||
h |
Servo | Channel | |||
i |
Solenoid | Channel | |||
j |
SPI | Instance num (starting at 1) | |||
k |
Task | ||||
l |
Ultrasonic | Channel | |||
m |
Victor | Channel | |||
n |
Button | ||||
o |
Command | 1 (kCommandScheduler) | |||
p |
AxisCamera | Handle | |||
q |
PCVideoServer | Handle | |||
r |
SmartDashboard | 0 | |||
s |
Talon | Channel | |||
t |
HiTechnicColorSensor | ||||
u |
HiTechnicAccel | ||||
v |
HiTechnicCompass | ||||
w
x |
SRF08 AnalogOutput | Channel | |||
y
z |
VictorSP PWMTalonSRX | Channel Channel | |||
>A |
CANTalonSRX | Device ID + 1 | |||
>B |
ADXL362 | SPI Port | |||
>C |
ADXRS450 | SPI Port | |||
>D |
RevSPARK | Channel | |||
>E |
MindsensorsSD540 | Channel | |||
>F |
DigitalFilter | Channel | |||
>G |
ADIS16448 | ||||
>H |
PDP | ||||
>I |
PCM | ||||
>J |
PigeonIMU | Device ID + 1 | |||
>K |
NidecBrushless | Channel | |||
>L |
CANifier | Device ID + 1 | |||
>M |
CTRE_future0 | Talon device ID + 1 | Pigeon IMU via Talon SRX | ||
>N |
CTRE_future1 | Device ID + 1 | Victor SPX | ||
>O |
CTRE_future2 | Device ID + 1 | WPI_TalonSRX | ||
>P |
CTRE_future3 | Device ID + 1 | WPI_VictorSPX | ||
>Q |
CTRE_future4 | ||||
>R |
CTRE_future5 | ||||
>S |
CTRE_future6 |
Language¶
ID | Language |
---|---|
1 | LabVIEW |
2 | CPlusPlus |
3 | Java |
4 | Python |
5 | DotNet |
Trigger Type¶
ID | Type |
---|---|
0 | InWindow |
1 | State |
2 | RisingPulse |
3 | FallingPulse |
Counter Mode¶
ID | Mode |
---|---|
0 | TwoPulse |
1 | Semiperiod |
2 | PulseLength |
3 | ExternalDirection |
Framework¶
ID | Framework |
---|---|
1 | Iterative |
2 | Simple |
3 | CommandControl |
Robot Drive Type¶
ID | Type |
---|---|
1 | ArcadeStandard |
2 | ArcadeButtonSpin |
3 | ArcadeRatioCurve |
4 | Tank |
5 | MecanumPolar |
6 | MecanumCartesian |
SPI Port¶
ID | Port |
---|---|
0 | OnboardCS0 |
1 | OnboardCS1 |
2 | OnboardCS2 |
3 | OnboardCS3 |
4 | MXP |
Example¶
V1K0N0Y0c0i0q0r0N1W1Y1b1i1j1o1q1C2i2i3A4>A31>O31>A32>O32>A33>O33>A34>O34>A35>O35>A36>O36f2:1S0:2
Entry | Description |
---|---|
V1 |
Magic String? (Not an I2C at least) |
K0 |
Compressor (PCM 0) |
N0 |
Digital Input (Channel 0) |
Y0 |
Joystick (Port 0) |
c0 |
Preferences |
i0 |
Solenoid (Channel 0) |
q0 |
PCVideoServer (Handle 0) |
r0 |
SmartDashboard |
N1 |
Digital Input (Channel 1) |
W1 |
Framework (Iterative) |
Y1 |
Joystick (Port 1) |
b1 |
PID Controller (#1) |
i1 |
Solenoid (Channel 1) |
j1 |
SPI (#1) |
o1 |
Command |
q1 |
PCVideoServer (Handle 1) |
C2 |
Language (C++) |
i2 |
Solenoid (Channel 2) |
i3 |
Solenoid (Channel 3) |
A4 |
Controller (RoboRIO probably) |
>A31 |
CANTalonSRX (ID 31) |
>O31 |
CTRE_future2 (ID 31) |
>A32 |
CANTalonSRX (ID 32) |
>O32 |
CTRE_future2 (ID 32) |
>A33 |
CANTalonSRX (ID 33) |
>O33 |
CTRE_future2 (ID 33) |
>A34 |
CANTalonSRX (ID 34) |
>O34 |
CTRE_future2 (ID 34) |
>A35 |
CANTalonSRX (ID 35) |
>O35 |
CTRE_future2 (ID 35) |
>A36 |
CANTalonSRX (ID 36) |
>O36 |
CTRE_future2 (ID 36) |
f2:1 |
Robot Drive (2 motors, ArcadeStandard) |
S0:2 |
Encoder (FPGA Index 0, 4X) |
FPGA¶
The RoboRIO has an onboard FPGA which handles much of the hardware, including digital IO, relays, analog inputs, PWM, etc. It’s what ultimately handles the safety of the robot, by preventing hardware from being used when disabled.
Registers¶
The FPGA has a variety of registers that can be interacted with using the standard NI FPGA library function calls.
The following was generated from the roboRIO_FPGA_2019_19.0.2.lvbitx
file.
Register | Offset | Dir | Type/Size | Comments | |
---|---|---|---|---|---|
0 | LocalTime |
18000 |
Indicator | U32 | |
1 | Revision |
18004 |
Indicator | U32 | |
2 | Version |
1800a |
Indicator | U16 | |
3 | LocalTimeUpper |
1800c |
Indicator | U32 | |
4 | LEDs |
18010 |
Control | Cluster (17) | |
4.0 | > Comm |
U8 | |||
4.1 | > Mode |
U8 | |||
4.2 | > RSL |
Boolean | |||
5 | UserButton |
18016 |
Indicator | Boolean | |
6 | SysWatchdog.Status |
18018 |
Indicator | Cluster (32) | |
6.0 | > SystemActive |
Boolean | |||
6.1 | > PowerAlive |
Boolean | |||
6.2 | > SysDisableCount |
uint (15) | |||
6.3 | > PowerDisableCount |
uint (15) | |||
7 | SysWatchdog.Command |
1801c |
Control | U32 | |
8 | SysWatchdog.Challenge |
18020 |
Indicator | U32 | |
9 | SysWatchdog.Timer |
18024 |
Indicator | U32 | |
10 | SysWatchdog.Active |
1802a |
Control | Boolean | |
11 | SysWatchdog.ForcedKills |
1802e |
Indicator | uint (15) | |
12 | AI.ReadSelect |
18032 |
Control | Cluster (4) | |
12.0 | > Channel |
uint (3) | |||
12.1 | > Averaged |
Boolean | |||
13 | AI.LatchOutput |
18036 |
Control | Boolean | |
14 | AI.Output |
18038 |
Indicator | I32 | |
15 | AI.Config |
1803c |
Control | Cluster (29) | |
15.0 | > ScanSize |
uint (3) | |||
15.1 | > ConvertRate |
uint (26) | |||
16 | AI.ScanList |
18040 |
Control | uint (3) x 8 (24) | |
17 | AI.OversampleBits |
18044 |
Control | uint (4) x 8 (32) | |
18 | AI.AverageBits |
18048 |
Control | uint (4) x 8 (32) | |
19 | AI.LoopTiming |
1804c |
Indicator | U32 | |
20 | Accumulator0.Center |
18050 |
Control | I32 | |
21 | Accumulator0.Reset |
18056 |
Control | Boolean | |
22 | Accumulator0.Output |
18058 |
Indicator | Cluster (96) | |
22.0 | > Value |
I64 | |||
22.1 | > Count |
U32 | |||
23 | Accumulator0.Deadband |
1805c |
Control | I32 | |
24 | Accumulator1.Center |
18060 |
Control | I32 | |
25 | Accumulator1.Reset |
18066 |
Control | Boolean | |
26 | Accumulator1.Output |
18068 |
Indicator | Cluster (96) | |
26.0 | > Value |
I64 | |||
26.1 | > Count |
U32 | |||
27 | Accumulator1.Deadband |
1806c |
Control | I32 | |
28 | AnalogTrigger.Output |
18070 |
Indicator | Cluster (4) x 8 (32) | |
28 | > AnalogTrigger.Output |
Cluster (4) | |||
28.0 | > > InHysteresis |
Boolean | |||
28.1 | > > OverLimit |
Boolean | |||
28.2 | > > Rising |
Boolean | |||
28.3 | > > Falling |
Boolean | |||
29 | AnalogTrigger0.SourceSelect |
18076 |
Control | Cluster (14) | |
29.0 | > Channel |
uint (3) | |||
29.1 | > Averaged |
Boolean | |||
29.2 | > Filter |
Boolean | |||
29.3 | > FloatingRollover |
Boolean | |||
29.4 | > RolloverLimit |
int (8) | |||
30 | AnalogTrigger0.UpperLimit |
18078 |
Control | I32 | |
31 | AnalogTrigger0.LowerLimit |
1807c |
Control | I32 | |
32 | AnalogTrigger1.SourceSelect |
18082 |
Control | Cluster (14) | |
32.0 | > Channel |
uint (3) | |||
32.1 | > Averaged |
Boolean | |||
32.2 | > Filter |
Boolean | |||
32.3 | > FloatingRollover |
Boolean | |||
32.4 | > RolloverLimit |
int (8) | |||
33 | AnalogTrigger1.UpperLimit |
18084 |
Control | I32 | |
34 | AnalogTrigger1.LowerLimit |
18088 |
Control | I32 | |
35 | AnalogTrigger2.SourceSelect |
1808e |
Control | Cluster (14) | |
35.0 | > Channel |
uint (3) | |||
35.1 | > Averaged |
Boolean | |||
35.2 | > Filter |
Boolean | |||
35.3 | > FloatingRollover |
Boolean | |||
35.4 | > RolloverLimit |
int (8) | |||
36 | AnalogTrigger2.UpperLimit |
18090 |
Control | I32 | |
37 | AnalogTrigger2.LowerLimit |
18094 |
Control | I32 | |
38 | AnalogTrigger3.SourceSelect |
1809a |
Control | Cluster (14) | |
38.0 | > Channel |
uint (3) | |||
38.1 | > Averaged |
Boolean | |||
38.2 | > Filter |
Boolean | |||
38.3 | > FloatingRollover |
Boolean | |||
38.4 | > RolloverLimit |
int (8) | |||
39 | AnalogTrigger3.UpperLimit |
1809c |
Control | I32 | |
40 | AnalogTrigger3.LowerLimit |
180a0 |
Control | I32 | |
41 | AnalogTrigger4.SourceSelect |
180a6 |
Control | Cluster (14) | |
41.0 | > Channel |
uint (3) | |||
41.1 | > Averaged |
Boolean | |||
41.2 | > Filter |
Boolean | |||
41.3 | > FloatingRollover |
Boolean | |||
41.4 | > RolloverLimit |
int (8) | |||
42 | AnalogTrigger4.UpperLimit |
180a8 |
Control | I32 | |
43 | AnalogTrigger4.LowerLimit |
180ac |
Control | I32 | |
44 | AnalogTrigger5.SourceSelect |
180b2 |
Control | Cluster (14) | |
44.0 | > Channel |
uint (3) | |||
44.1 | > Averaged |
Boolean | |||
44.2 | > Filter |
Boolean | |||
44.3 | > FloatingRollover |
Boolean | |||
44.4 | > RolloverLimit |
int (8) | |||
45 | AnalogTrigger6.UpperLimit |
180b4 |
Control | I32 | |
46 | AnalogTrigger6.LowerLimit |
180b8 |
Control | I32 | |
47 | AnalogTrigger6.SourceSelect |
180be |
Control | Cluster (14) | |
47.0 | > Channel |
uint (3) | |||
47.1 | > Averaged |
Boolean | |||
47.2 | > Filter |
Boolean | |||
47.3 | > FloatingRollover |
Boolean | |||
47.4 | > RolloverLimit |
int (8) | |||
48 | AnalogTrigger5.UpperLimit |
180c0 |
Control | I32 | |
49 | AnalogTrigger5.LowerLimit |
180c4 |
Control | I32 | |
50 | AnalogTrigger7.SourceSelect |
180ca |
Control | Cluster (14) | |
50.0 | > Channel |
uint (3) | |||
50.1 | > Averaged |
Boolean | |||
50.2 | > Filter |
Boolean | |||
50.3 | > FloatingRollover |
Boolean | |||
50.4 | > RolloverLimit |
int (8) | |||
51 | AnalogTrigger7.UpperLimit |
180cc |
Control | I32 | |
52 | AnalogTrigger7.LowerLimit |
180d0 |
Control | I32 | |
53 | PWM.LoopTiming |
180d6 |
Indicator | U16 | |
54 | PWM.CycleStartTimeUpper |
180d8 |
Indicator | U32 | |
55 | PWM.CycleStartTime |
180dc |
Indicator | U32 | |
56 | PWM.Config |
180e0 |
Control | Cluster (32) | |
56.0 | > Period |
U16 | |||
56.1 | > MinHigh |
U16 | |||
57 | PWM.PeriodScaleHdr |
180e4 |
Control | uint (2) x 10 (20) | |
58 | PWM.PeriodScaleMXP |
180e8 |
Control | uint (2) x 10 (20) | |
59 | PWM.ZeroLatch |
180ec |
Control | Boolean x 20 (20) | |
60 | PWM.Hdr0 |
180f2 |
Control | uint (12) | |
61 | PWM.Hdr1 |
180f6 |
Control | uint (12) | |
62 | PWM.Hdr2 |
180fa |
Control | uint (12) | |
63 | PWM.Hdr3 |
180fe |
Control | uint (12) | |
64 | PWM.Hdr4 |
18102 |
Control | uint (12) | |
65 | PWM.Hdr5 |
18106 |
Control | uint (12) | |
66 | PWM.Hdr6 |
1810a |
Control | uint (12) | |
67 | PWM.Hdr7 |
1810e |
Control | uint (12) | |
68 | PWM.Hdr8 |
18112 |
Control | uint (12) | |
69 | PWM.Hdr9 |
18116 |
Control | uint (12) | |
70 | PWM.MXP0 |
1811a |
Control | uint (12) | |
71 | PWM.MXP1 |
1811e |
Control | uint (12) | |
72 | PWM.MXP2 |
18122 |
Control | uint (12) | |
73 | PWM.MXP3 |
18126 |
Control | uint (12) | |
74 | PWM.MXP4 |
1812a |
Control | uint (12) | |
75 | PWM.MXP5 |
1812e |
Control | uint (12) | |
76 | PWM.MXP6 |
18132 |
Control | uint (12) | |
77 | PWM.MXP7 |
18136 |
Control | uint (12) | |
78 | PWM.MXP8 |
1813a |
Control | uint (12) | |
79 | PWM.MXP9 |
1813e |
Control | uint (12) | |
80 | DIO.OutputEnable |
18140 |
Control | Cluster (32) | |
80.0 | > Headers |
uint (10) | |||
80.1 | > SPIPort |
uint (5) | |||
80.2 | > Reserved |
uint (1) | |||
80.3 | > MXP |
U16 | |||
81 | DIO.DO |
18144 |
Control | Cluster (32) | |
81.0 | > Headers |
uint (10) | |||
81.1 | > SPIPort |
uint (5) | |||
81.2 | > Reserved |
uint (1) | |||
81.3 | > MXP |
U16 | |||
82 | DIO.DI |
18148 |
Indicator | Cluster (32) | |
82.0 | > Headers |
uint (10) | |||
82.1 | > SPIPort |
uint (5) | |||
82.2 | > Reserved |
uint (1) | |||
82.3 | > MXP |
U16 | |||
83 | DIO.FilterSelectHdr |
1814c |
Control | uint (2) x 16 (32) | |
84 | DIO.FilterPeriodHdr0 |
18150 |
Control | uint (24) | |
85 | DIO.FilterPeriodHdr1 |
18154 |
Control | uint (24) | |
86 | DIO.FilterPeriodHdr2 |
18158 |
Control | uint (24) | |
87 | DIO.FilterSelectMXP |
1815c |
Control | uint (2) x 16 (32) | |
88 | DIO.FilterPeriodMXP0 |
18160 |
Control | uint (24) | |
89 | DIO.FilterPeriodMXP1 |
18164 |
Control | uint (24) | |
90 | DIO.FilterPeriodMXP2 |
18168 |
Control | uint (24) | |
91 | DIO.EnableMXPSpecialFunction |
1816e |
Control | U16 | |
92 | DIO.PulseLength |
18172 |
Control | U8 | |
93 | DIO.Pulse |
18174 |
Control | Cluster (32) | |
93.0 | > Headers |
uint (10) | |||
93.1 | > SPIPort |
uint (5) | |||
93.2 | > Reserved |
uint (1) | |||
93.3 | > MXP |
U16 | |||
94 | DIO.PWMDutyCycleA |
18178 |
Control | U8 x 4 (32) | |
95 | DIO.PWMDutyCycleB |
1817e |
Control | U8 x 2 (16) | |
96 | DIO.PWMOutputSelect |
18180 |
Control | uint (5) x 6 (30) | |
97 | DIO.PWMPeriodPower |
18186 |
Control | U16 | |
98 | Counter0.Config |
18188 |
Control | Cluster (32) | |
98.0 | > UpSource |
Cluster (6) | |||
98.0.0 | > > Channel |
uint (4) | |||
98.0.1 | > > Module |
uint (1) | |||
98.0.2 | > > AnalogTrigger |
Boolean | |||
98.1 | > DownSource |
Cluster (6) | |||
98.1.0 | > > Channel |
uint (4) | |||
98.1.1 | > > Module |
uint (1) | |||
98.1.2 | > > AnalogTrigger |
Boolean | |||
98.2 | > IndexSource |
Cluster (6) | |||
98.2.0 | > > Channel |
uint (4) | |||
98.2.1 | > > Module |
uint (1) | |||
98.2.2 | > > AnalogTrigger |
Boolean | |||
98.3 | > IndexActiveHigh |
Boolean | |||
98.4 | > IndexEdgeSensitive |
Boolean | |||
98.5 | > UpRisingEdge |
Boolean | |||
98.6 | > UpFallingEdge |
Boolean | |||
98.7 | > DownRisingEdge |
Boolean | |||
98.8 | > DownFallingEdge |
Boolean | |||
98.9 | > Mode |
uint (2) | |||
98.10 | > PulseLengthThreshold |
uint (6) | |||
99 | Counter0.Reset |
1818e |
Control | Boolean | |
100 | Counter0.Output |
18190 |
Indicator | Cluster (32) | |
100.0 | > Direction |
Boolean | |||
100.1 | > Value |
int (31) | |||
101 | Counter0.TimerConfig |
18194 |
Control | Cluster (32) | |
101.0 | > StallPeriod |
uint (24) | |||
101.1 | > AverageSize |
uint (7) | |||
101.2 | > UpdateWhenEmpty |
Boolean | |||
102 | Counter0.TimerOutput |
18198 |
Indicator | Cluster (32) | |
102.0 | > Period |
uint (23) | |||
102.1 | > Count |
int (8) | |||
102.2 | > Stalled |
Boolean | |||
103 | Counter1.Config |
1819c |
Control | Cluster (32) | |
103.0 | > UpSource |
Cluster (6) | |||
103.0.0 | > > Channel |
uint (4) | |||
103.0.1 | > > Module |
uint (1) | |||
103.0.2 | > > AnalogTrigger |
Boolean | |||
103.1 | > DownSource |
Cluster (6) | |||
103.1.0 | > > Channel |
uint (4) | |||
103.1.1 | > > Module |
uint (1) | |||
103.1.2 | > > AnalogTrigger |
Boolean | |||
103.2 | > IndexSource |
Cluster (6) | |||
103.2.0 | > > Channel |
uint (4) | |||
103.2.1 | > > Module |
uint (1) | |||
103.2.2 | > > AnalogTrigger |
Boolean | |||
103.3 | > IndexActiveHigh |
Boolean | |||
103.4 | > IndexEdgeSensitive |
Boolean | |||
103.5 | > UpRisingEdge |
Boolean | |||
103.6 | > UpFallingEdge |
Boolean | |||
103.7 | > DownRisingEdge |
Boolean | |||
103.8 | > DownFallingEdge |
Boolean | |||
103.9 | > Mode |
uint (2) | |||
103.10 | > PulseLengthThreshold |
uint (6) | |||
104 | Counter1.Reset |
181a2 |
Control | Boolean | |
105 | Counter1.Output |
181a4 |
Indicator | Cluster (32) | |
105.0 | > Direction |
Boolean | |||
105.1 | > Value |
int (31) | |||
106 | Counter1.TimerConfig |
181a8 |
Control | Cluster (32) | |
106.0 | > StallPeriod |
uint (24) | |||
106.1 | > AverageSize |
uint (7) | |||
106.2 | > UpdateWhenEmpty |
Boolean | |||
107 | Counter1.TimerOutput |
181ac |
Indicator | Cluster (32) | |
107.0 | > Period |
uint (23) | |||
107.1 | > Count |
int (8) | |||
107.2 | > Stalled |
Boolean | |||
108 | Counter2.Config |
181b0 |
Control | Cluster (32) | |
108.0 | > UpSource |
Cluster (6) | |||
108.0.0 | > > Channel |
uint (4) | |||
108.0.1 | > > Module |
uint (1) | |||
108.0.2 | > > AnalogTrigger |
Boolean | |||
108.1 | > DownSource |
Cluster (6) | |||
108.1.0 | > > Channel |
uint (4) | |||
108.1.1 | > > Module |
uint (1) | |||
108.1.2 | > > AnalogTrigger |
Boolean | |||
108.2 | > IndexSource |
Cluster (6) | |||
108.2.0 | > > Channel |
uint (4) | |||
108.2.1 | > > Module |
uint (1) | |||
108.2.2 | > > AnalogTrigger |
Boolean | |||
108.3 | > IndexActiveHigh |
Boolean | |||
108.4 | > IndexEdgeSensitive |
Boolean | |||
108.5 | > UpRisingEdge |
Boolean | |||
108.6 | > UpFallingEdge |
Boolean | |||
108.7 | > DownRisingEdge |
Boolean | |||
108.8 | > DownFallingEdge |
Boolean | |||
108.9 | > Mode |
uint (2) | |||
108.10 | > PulseLengthThreshold |
uint (6) | |||
109 | Counter2.Reset |
181b6 |
Control | Boolean | |
110 | Counter2.Output |
181b8 |
Indicator | Cluster (32) | |
110.0 | > Direction |
Boolean | |||
110.1 | > Value |
int (31) | |||
111 | Counter2.TimerConfig |
181bc |
Control | Cluster (32) | |
111.0 | > StallPeriod |
uint (24) | |||
111.1 | > AverageSize |
uint (7) | |||
111.2 | > UpdateWhenEmpty |
Boolean | |||
112 | Counter2.TimerOutput |
181c0 |
Indicator | Cluster (32) | |
112.0 | > Period |
uint (23) | |||
112.1 | > Count |
int (8) | |||
112.2 | > Stalled |
Boolean | |||
113 | Counter3.Config |
181c4 |
Control | Cluster (32) | |
113.0 | > UpSource |
Cluster (6) | |||
113.0.0 | > > Channel |
uint (4) | |||
113.0.1 | > > Module |
uint (1) | |||
113.0.2 | > > AnalogTrigger |
Boolean | |||
113.1 | > DownSource |
Cluster (6) | |||
113.1.0 | > > Channel |
uint (4) | |||
113.1.1 | > > Module |
uint (1) | |||
113.1.2 | > > AnalogTrigger |
Boolean | |||
113.2 | > IndexSource |
Cluster (6) | |||
113.2.0 | > > Channel |
uint (4) | |||
113.2.1 | > > Module |
uint (1) | |||
113.2.2 | > > AnalogTrigger |
Boolean | |||
113.3 | > IndexActiveHigh |
Boolean | |||
113.4 | > IndexEdgeSensitive |
Boolean | |||
113.5 | > UpRisingEdge |
Boolean | |||
113.6 | > UpFallingEdge |
Boolean | |||
113.7 | > DownRisingEdge |
Boolean | |||
113.8 | > DownFallingEdge |
Boolean | |||
113.9 | > Mode |
uint (2) | |||
113.10 | > PulseLengthThreshold |
uint (6) | |||
114 | Counter3.Reset |
181ca |
Control | Boolean | |
115 | Counter3.Output |
181cc |
Indicator | Cluster (32) | |
115.0 | > Direction |
Boolean | |||
115.1 | > Value |
int (31) | |||
116 | Counter3.TimerConfig |
181d0 |
Control | Cluster (32) | |
116.0 | > StallPeriod |
uint (24) | |||
116.1 | > AverageSize |
uint (7) | |||
116.2 | > UpdateWhenEmpty |
Boolean | |||
117 | Counter3.TimerOutput |
181d4 |
Indicator | Cluster (32) | |
117.0 | > Period |
uint (23) | |||
117.1 | > Count |
int (8) | |||
117.2 | > Stalled |
Boolean | |||
118 | Counter4.Config |
181d8 |
Control | Cluster (32) | |
118.0 | > UpSource |
Cluster (6) | |||
118.0.0 | > > Channel |
uint (4) | |||
118.0.1 | > > Module |
uint (1) | |||
118.0.2 | > > AnalogTrigger |
Boolean | |||
118.1 | > DownSource |
Cluster (6) | |||
118.1.0 | > > Channel |
uint (4) | |||
118.1.1 | > > Module |
uint (1) | |||
118.1.2 | > > AnalogTrigger |
Boolean | |||
118.2 | > IndexSource |
Cluster (6) | |||
118.2.0 | > > Channel |
uint (4) | |||
118.2.1 | > > Module |
uint (1) | |||
118.2.2 | > > AnalogTrigger |
Boolean | |||
118.3 | > IndexActiveHigh |
Boolean | |||
118.4 | > IndexEdgeSensitive |
Boolean | |||
118.5 | > UpRisingEdge |
Boolean | |||
118.6 | > UpFallingEdge |
Boolean | |||
118.7 | > DownRisingEdge |
Boolean | |||
118.8 | > DownFallingEdge |
Boolean | |||
118.9 | > Mode |
uint (2) | |||
118.10 | > PulseLengthThreshold |
uint (6) | |||
119 | Counter4.Reset |
181de |
Control | Boolean | |
120 | Counter4.Output |
181e0 |
Indicator | Cluster (32) | |
120.0 | > Direction |
Boolean | |||
120.1 | > Value |
int (31) | |||
121 | Counter4.TimerConfig |
181e4 |
Control | Cluster (32) | |
121.0 | > StallPeriod |
uint (24) | |||
121.1 | > AverageSize |
uint (7) | |||
121.2 | > UpdateWhenEmpty |
Boolean | |||
122 | Counter4.TimerOutput |
181e8 |
Indicator | Cluster (32) | |
122.0 | > Period |
uint (23) | |||
122.1 | > Count |
int (8) | |||
122.2 | > Stalled |
Boolean | |||
123 | Counter5.Config |
181ec |
Control | Cluster (32) | |
123.0 | > UpSource |
Cluster (6) | |||
123.0.0 | > > Channel |
uint (4) | |||
123.0.1 | > > Module |
uint (1) | |||
123.0.2 | > > AnalogTrigger |
Boolean | |||
123.1 | > DownSource |
Cluster (6) | |||
123.1.0 | > > Channel |
uint (4) | |||
123.1.1 | > > Module |
uint (1) | |||
123.1.2 | > > AnalogTrigger |
Boolean | |||
123.2 | > IndexSource |
Cluster (6) | |||
123.2.0 | > > Channel |
uint (4) | |||
123.2.1 | > > Module |
uint (1) | |||
123.2.2 | > > AnalogTrigger |
Boolean | |||
123.3 | > IndexActiveHigh |
Boolean | |||
123.4 | > IndexEdgeSensitive |
Boolean | |||
123.5 | > UpRisingEdge |
Boolean | |||
123.6 | > UpFallingEdge |
Boolean | |||
123.7 | > DownRisingEdge |
Boolean | |||
123.8 | > DownFallingEdge |
Boolean | |||
123.9 | > Mode |
uint (2) | |||
123.10 | > PulseLengthThreshold |
uint (6) | |||
124 | Counter5.Reset |
181f2 |
Control | Boolean | |
125 | Counter5.Output |
181f4 |
Indicator | Cluster (32) | |
125.0 | > Direction |
Boolean | |||
125.1 | > Value |
int (31) | |||
126 | Counter5.TimerConfig |
181f8 |
Control | Cluster (32) | |
126.0 | > StallPeriod |
uint (24) | |||
126.1 | > AverageSize |
uint (7) | |||
126.2 | > UpdateWhenEmpty |
Boolean | |||
127 | Counter5.TimerOutput |
181fc |
Indicator | Cluster (32) | |
127.0 | > Period |
uint (23) | |||
127.1 | > Count |
int (8) | |||
127.2 | > Stalled |
Boolean | |||
128 | Counter6.Config |
18200 |
Control | Cluster (32) | |
128.0 | > UpSource |
Cluster (6) | |||
128.0.0 | > > Channel |
uint (4) | |||
128.0.1 | > > Module |
uint (1) | |||
128.0.2 | > > AnalogTrigger |
Boolean | |||
128.1 | > DownSource |
Cluster (6) | |||
128.1.0 | > > Channel |
uint (4) | |||
128.1.1 | > > Module |
uint (1) | |||
128.1.2 | > > AnalogTrigger |
Boolean | |||
128.2 | > IndexSource |
Cluster (6) | |||
128.2.0 | > > Channel |
uint (4) | |||
128.2.1 | > > Module |
uint (1) | |||
128.2.2 | > > AnalogTrigger |
Boolean | |||
128.3 | > IndexActiveHigh |
Boolean | |||
128.4 | > IndexEdgeSensitive |
Boolean | |||
128.5 | > UpRisingEdge |
Boolean | |||
128.6 | > UpFallingEdge |
Boolean | |||
128.7 | > DownRisingEdge |
Boolean | |||
128.8 | > DownFallingEdge |
Boolean | |||
128.9 | > Mode |
uint (2) | |||
128.10 | > PulseLengthThreshold |
uint (6) | |||
129 | Counter6.Reset |
18206 |
Control | Boolean | |
130 | Counter6.Output |
18208 |
Indicator | Cluster (32) | |
130.0 | > Direction |
Boolean | |||
130.1 | > Value |
int (31) | |||
131 | Counter6.TimerConfig |
1820c |
Control | Cluster (32) | |
131.0 | > StallPeriod |
uint (24) | |||
131.1 | > AverageSize |
uint (7) | |||
131.2 | > UpdateWhenEmpty |
Boolean | |||
132 | Counter6.TimerOutput |
18210 |
Indicator | Cluster (32) | |
132.0 | > Period |
uint (23) | |||
132.1 | > Count |
int (8) | |||
132.2 | > Stalled |
Boolean | |||
133 | Counter7.Config |
18214 |
Control | Cluster (32) | |
133.0 | > UpSource |
Cluster (6) | |||
133.0.0 | > > Channel |
uint (4) | |||
133.0.1 | > > Module |
uint (1) | |||
133.0.2 | > > AnalogTrigger |
Boolean | |||
133.1 | > DownSource |
Cluster (6) | |||
133.1.0 | > > Channel |
uint (4) | |||
133.1.1 | > > Module |
uint (1) | |||
133.1.2 | > > AnalogTrigger |
Boolean | |||
133.2 | > IndexSource |
Cluster (6) | |||
133.2.0 | > > Channel |
uint (4) | |||
133.2.1 | > > Module |
uint (1) | |||
133.2.2 | > > AnalogTrigger |
Boolean | |||
133.3 | > IndexActiveHigh |
Boolean | |||
133.4 | > IndexEdgeSensitive |
Boolean | |||
133.5 | > UpRisingEdge |
Boolean | |||
133.6 | > UpFallingEdge |
Boolean | |||
133.7 | > DownRisingEdge |
Boolean | |||
133.8 | > DownFallingEdge |
Boolean | |||
133.9 | > Mode |
uint (2) | |||
133.10 | > PulseLengthThreshold |
uint (6) | |||
134 | Counter7.Reset |
1821a |
Control | Boolean | |
135 | Counter7.Output |
1821c |
Indicator | Cluster (32) | |
135.0 | > Direction |
Boolean | |||
135.1 | > Value |
int (31) | |||
136 | Counter7.TimerConfig |
18220 |
Control | Cluster (32) | |
136.0 | > StallPeriod |
uint (24) | |||
136.1 | > AverageSize |
uint (7) | |||
136.2 | > UpdateWhenEmpty |
Boolean | |||
137 | Counter7.TimerOutput |
18224 |
Indicator | Cluster (32) | |
137.0 | > Period |
uint (23) | |||
137.1 | > Count |
int (8) | |||
137.2 | > Stalled |
Boolean | |||
138 | Encoder0.Config |
18228 |
Control | Cluster (21) | |
138.0 | > ASource |
Cluster (6) | |||
138.0.0 | > > Channel |
uint (4) | |||
138.0.1 | > > Module |
uint (1) | |||
138.0.2 | > > AnalogTrigger |
Boolean | |||
138.1 | > BSource |
Cluster (6) | |||
138.1.0 | > > Channel |
uint (4) | |||
138.1.1 | > > Module |
uint (1) | |||
138.1.2 | > > AnalogTrigger |
Boolean | |||
138.2 | > IndexSource |
Cluster (6) | |||
138.2.0 | > > Channel |
uint (4) | |||
138.2.1 | > > Module |
uint (1) | |||
138.2.2 | > > AnalogTrigger |
Boolean | |||
138.3 | > IndexActiveHigh |
Boolean | |||
138.4 | > IndexEdgeSensitive |
Boolean | |||
138.5 | > Reverse |
Boolean | |||
139 | Encoder0.Reset |
1822e |
Control | Boolean | |
140 | Encoder0.Output |
18230 |
Indicator | Cluster (32) | |
140.0 | > Direction |
Boolean | |||
140.1 | > Value |
int (31) | |||
141 | Encoder0.TimerConfig |
18234 |
Control | Cluster (32) | |
141.0 | > StallPeriod |
uint (24) | |||
141.1 | > AverageSize |
uint (7) | |||
141.2 | > UpdateWhenEmpty |
Boolean | |||
142 | Encoder0.TimerOutput |
18238 |
Indicator | Cluster (32) | |
142.0 | > Period |
uint (23) | |||
142.1 | > Count |
int (8) | |||
142.2 | > Stalled |
Boolean | |||
143 | Encoder1.Config |
1823c |
Control | Cluster (21) | |
143.0 | > ASource |
Cluster (6) | |||
143.0.0 | > > Channel |
uint (4) | |||
143.0.1 | > > Module |
uint (1) | |||
143.0.2 | > > AnalogTrigger |
Boolean | |||
143.1 | > BSource |
Cluster (6) | |||
143.1.0 | > > Channel |
uint (4) | |||
143.1.1 | > > Module |
uint (1) | |||
143.1.2 | > > AnalogTrigger |
Boolean | |||
143.2 | > IndexSource |
Cluster (6) | |||
143.2.0 | > > Channel |
uint (4) | |||
143.2.1 | > > Module |
uint (1) | |||
143.2.2 | > > AnalogTrigger |
Boolean | |||
143.3 | > IndexActiveHigh |
Boolean | |||
143.4 | > IndexEdgeSensitive |
Boolean | |||
143.5 | > Reverse |
Boolean | |||
144 | Encoder1.Reset |
18242 |
Control | Boolean | |
145 | Encoder1.Output |
18244 |
Indicator | Cluster (32) | |
145.0 | > Direction |
Boolean | |||
145.1 | > Value |
int (31) | |||
146 | Encoder1.TimerConfig |
18248 |
Control | Cluster (32) | |
146.0 | > StallPeriod |
uint (24) | |||
146.1 | > AverageSize |
uint (7) | |||
146.2 | > UpdateWhenEmpty |
Boolean | |||
147 | Encoder1.TimerOutput |
1824c |
Indicator | Cluster (32) | |
147.0 | > Period |
uint (23) | |||
147.1 | > Count |
int (8) | |||
147.2 | > Stalled |
Boolean | |||
148 | Encoder2.Config |
18250 |
Control | Cluster (21) | |
148.0 | > ASource |
Cluster (6) | |||
148.0.0 | > > Channel |
uint (4) | |||
148.0.1 | > > Module |
uint (1) | |||
148.0.2 | > > AnalogTrigger |
Boolean | |||
148.1 | > BSource |
Cluster (6) | |||
148.1.0 | > > Channel |
uint (4) | |||
148.1.1 | > > Module |
uint (1) | |||
148.1.2 | > > AnalogTrigger |
Boolean | |||
148.2 | > IndexSource |
Cluster (6) | |||
148.2.0 | > > Channel |
uint (4) | |||
148.2.1 | > > Module |
uint (1) | |||
148.2.2 | > > AnalogTrigger |
Boolean | |||
148.3 | > IndexActiveHigh |
Boolean | |||
148.4 | > IndexEdgeSensitive |
Boolean | |||
148.5 | > Reverse |
Boolean | |||
149 | Encoder2.Reset |
18256 |
Control | Boolean | |
150 | Encoder2.Output |
18258 |
Indicator | Cluster (32) | |
150.0 | > Direction |
Boolean | |||
150.1 | > Value |
int (31) | |||
151 | Encoder2.TimerConfig |
1825c |
Control | Cluster (32) | |
151.0 | > StallPeriod |
uint (24) | |||
151.1 | > AverageSize |
uint (7) | |||
151.2 | > UpdateWhenEmpty |
Boolean | |||
152 | Encoder2.TimerOutput |
18260 |
Indicator | Cluster (32) | |
152.0 | > Period |
uint (23) | |||
152.1 | > Count |
int (8) | |||
152.2 | > Stalled |
Boolean | |||
153 | Encoder3.Config |
18264 |
Control | Cluster (21) | |
153.0 | > ASource |
Cluster (6) | |||
153.0.0 | > > Channel |
uint (4) | |||
153.0.1 | > > Module |
uint (1) | |||
153.0.2 | > > AnalogTrigger |
Boolean | |||
153.1 | > BSource |
Cluster (6) | |||
153.1.0 | > > Channel |
uint (4) | |||
153.1.1 | > > Module |
uint (1) | |||
153.1.2 | > > AnalogTrigger |
Boolean | |||
153.2 | > IndexSource |
Cluster (6) | |||
153.2.0 | > > Channel |
uint (4) | |||
153.2.1 | > > Module |
uint (1) | |||
153.2.2 | > > AnalogTrigger |
Boolean | |||
153.3 | > IndexActiveHigh |
Boolean | |||
153.4 | > IndexEdgeSensitive |
Boolean | |||
153.5 | > Reverse |
Boolean | |||
154 | Encoder3.Reset |
1826a |
Control | Boolean | |
155 | Encoder3.Output |
1826c |
Indicator | Cluster (32) | |
155.0 | > Direction |
Boolean | |||
155.1 | > Value |
int (31) | |||
156 | Encoder3.TimerConfig |
18270 |
Control | Cluster (32) | |
156.0 | > StallPeriod |
uint (24) | |||
156.1 | > AverageSize |
uint (7) | |||
156.2 | > UpdateWhenEmpty |
Boolean | |||
157 | Encoder3.TimerOutput |
18274 |
Indicator | Cluster (32) | |
157.0 | > Period |
uint (23) | |||
157.1 | > Count |
int (8) | |||
157.2 | > Stalled |
Boolean | |||
158 | Encoder4.Config |
18278 |
Control | Cluster (21) | |
158.0 | > ASource |
Cluster (6) | |||
158.0.0 | > > Channel |
uint (4) | |||
158.0.1 | > > Module |
uint (1) | |||
158.0.2 | > > AnalogTrigger |
Boolean | |||
158.1 | > BSource |
Cluster (6) | |||
158.1.0 | > > Channel |
uint (4) | |||
158.1.1 | > > Module |
uint (1) | |||
158.1.2 | > > AnalogTrigger |
Boolean | |||
158.2 | > IndexSource |
Cluster (6) | |||
158.2.0 | > > Channel |
uint (4) | |||
158.2.1 | > > Module |
uint (1) | |||
158.2.2 | > > AnalogTrigger |
Boolean | |||
158.3 | > IndexActiveHigh |
Boolean | |||
158.4 | > IndexEdgeSensitive |
Boolean | |||
158.5 | > Reverse |
Boolean | |||
159 | Encoder4.Reset |
1827e |
Control | Boolean | |
160 | Encoder4.Output |
18280 |
Indicator | Cluster (32) | |
160.0 | > Direction |
Boolean | |||
160.1 | > Value |
int (31) | |||
161 | Encoder4.TimerConfig |
18284 |
Control | Cluster (32) | |
161.0 | > StallPeriod |
uint (24) | |||
161.1 | > AverageSize |
uint (7) | |||
161.2 | > UpdateWhenEmpty |
Boolean | |||
162 | Encoder4.TimerOutput |
18288 |
Indicator | Cluster (32) | |
162.0 | > Period |
uint (23) | |||
162.1 | > Count |
int (8) | |||
162.2 | > Stalled |
Boolean | |||
163 | Encoder5.Config |
1828c |
Control | Cluster (21) | |
163.0 | > ASource |
Cluster (6) | |||
163.0.0 | > > Channel |
uint (4) | |||
163.0.1 | > > Module |
uint (1) | |||
163.0.2 | > > AnalogTrigger |
Boolean | |||
163.1 | > BSource |
Cluster (6) | |||
163.1.0 | > > Channel |
uint (4) | |||
163.1.1 | > > Module |
uint (1) | |||
163.1.2 | > > AnalogTrigger |
Boolean | |||
163.2 | > IndexSource |
Cluster (6) | |||
163.2.0 | > > Channel |
uint (4) | |||
163.2.1 | > > Module |
uint (1) | |||
163.2.2 | > > AnalogTrigger |
Boolean | |||
163.3 | > IndexActiveHigh |
Boolean | |||
163.4 | > IndexEdgeSensitive |
Boolean | |||
163.5 | > Reverse |
Boolean | |||
164 | Encoder5.Reset |
18292 |
Control | Boolean | |
165 | Encoder5.Output |
18294 |
Indicator | Cluster (32) | |
165.0 | > Direction |
Boolean | |||
165.1 | > Value |
int (31) | |||
166 | Encoder5.TimerConfig |
18298 |
Control | Cluster (32) | |
166.0 | > StallPeriod |
uint (24) | |||
166.1 | > AverageSize |
uint (7) | |||
166.2 | > UpdateWhenEmpty |
Boolean | |||
167 | Encoder5.TimerOutput |
1829c |
Indicator | Cluster (32) | |
167.0 | > Period |
uint (23) | |||
167.1 | > Count |
int (8) | |||
167.2 | > Stalled |
Boolean | |||
168 | Encoder6.Config |
182a0 |
Control | Cluster (21) | |
168.0 | > ASource |
Cluster (6) | |||
168.0.0 | > > Channel |
uint (4) | |||
168.0.1 | > > Module |
uint (1) | |||
168.0.2 | > > AnalogTrigger |
Boolean | |||
168.1 | > BSource |
Cluster (6) | |||
168.1.0 | > > Channel |
uint (4) | |||
168.1.1 | > > Module |
uint (1) | |||
168.1.2 | > > AnalogTrigger |
Boolean | |||
168.2 | > IndexSource |
Cluster (6) | |||
168.2.0 | > > Channel |
uint (4) | |||
168.2.1 | > > Module |
uint (1) | |||
168.2.2 | > > AnalogTrigger |
Boolean | |||
168.3 | > IndexActiveHigh |
Boolean | |||
168.4 | > IndexEdgeSensitive |
Boolean | |||
168.5 | > Reverse |
Boolean | |||
169 | Encoder6.Reset |
182a6 |
Control | Boolean | |
170 | Encoder6.Output |
182a8 |
Indicator | Cluster (32) | |
170.0 | > Direction |
Boolean | |||
170.1 | > Value |
int (31) | |||
171 | Encoder6.TimerConfig |
182ac |
Control | Cluster (32) | |
171.0 | > StallPeriod |
uint (24) | |||
171.1 | > AverageSize |
uint (7) | |||
171.2 | > UpdateWhenEmpty |
Boolean | |||
172 | Encoder6.TimerOutput |
182b0 |
Indicator | Cluster (32) | |
172.0 | > Period |
uint (23) | |||
172.1 | > Count |
int (8) | |||
172.2 | > Stalled |
Boolean | |||
173 | Encoder7.Config |
182b4 |
Control | Cluster (21) | |
173.0 | > ASource |
Cluster (6) | |||
173.0.0 | > > Channel |
uint (4) | |||
173.0.1 | > > Module |
uint (1) | |||
173.0.2 | > > AnalogTrigger |
Boolean | |||
173.1 | > BSource |
Cluster (6) | |||
173.1.0 | > > Channel |
uint (4) | |||
173.1.1 | > > Module |
uint (1) | |||
173.1.2 | > > AnalogTrigger |
Boolean | |||
173.2 | > IndexSource |
Cluster (6) | |||
173.2.0 | > > Channel |
uint (4) | |||
173.2.1 | > > Module |
uint (1) | |||
173.2.2 | > > AnalogTrigger |
Boolean | |||
173.3 | > IndexActiveHigh |
Boolean | |||
173.4 | > IndexEdgeSensitive |
Boolean | |||
173.5 | > Reverse |
Boolean | |||
174 | Encoder7.Reset |
182ba |
Control | Boolean | |
175 | Encoder7.Output |
182bc |
Indicator | Cluster (32) | |
175.0 | > Direction |
Boolean | |||
175.1 | > Value |
int (31) | |||
176 | Encoder7.TimerConfig |
182c0 |
Control | Cluster (32) | |
176.0 | > StallPeriod |
uint (24) | |||
176.1 | > AverageSize |
uint (7) | |||
176.2 | > UpdateWhenEmpty |
Boolean | |||
177 | Encoder7.TimerOutput |
182c4 |
Indicator | Cluster (32) | |
177.0 | > Period |
uint (23) | |||
177.1 | > Count |
int (8) | |||
177.2 | > Stalled |
Boolean | |||
178 | Interrupt0.Config |
182ca |
Control | Cluster (9) | |
178.0 | > Source |
Cluster (6) | |||
178.0.0 | > > Channel |
uint (4) | |||
178.0.1 | > > Module |
uint (1) | |||
178.0.2 | > > AnalogTrigger |
Boolean | |||
178.1 | > RisingEdge |
Boolean | |||
178.2 | > FallingEdge |
Boolean | |||
178.3 | > WaitForAck |
Boolean | |||
179 | Interrupt0.RisingTimeStamp |
182cc |
Indicator | U32 | |
180 | Interrupt0.FallingTimeStamp |
182d0 |
Indicator | U32 | |
181 | Interrupt1.Config |
182d6 |
Control | Cluster (9) | |
181.0 | > Source |
Cluster (6) | |||
181.0.0 | > > Channel |
uint (4) | |||
181.0.1 | > > Module |
uint (1) | |||
181.0.2 | > > AnalogTrigger |
Boolean | |||
181.1 | > RisingEdge |
Boolean | |||
181.2 | > FallingEdge |
Boolean | |||
181.3 | > WaitForAck |
Boolean | |||
182 | Interrupt1.RisingTimeStamp |
182d8 |
Indicator | U32 | |
183 | Interrupt1.FallingTimeStamp |
182dc |
Indicator | U32 | |
184 | Interrupt2.Config |
182e2 |
Control | Cluster (9) | |
184.0 | > Source |
Cluster (6) | |||
184.0.0 | > > Channel |
uint (4) | |||
184.0.1 | > > Module |
uint (1) | |||
184.0.2 | > > AnalogTrigger |
Boolean | |||
184.1 | > RisingEdge |
Boolean | |||
184.2 | > FallingEdge |
Boolean | |||
184.3 | > WaitForAck |
Boolean | |||
185 | Interrupt2.RisingTimeStamp |
182e4 |
Indicator | U32 | |
186 | Interrupt2.FallingTimeStamp |
182e8 |
Indicator | U32 | |
187 | Interrupt3.Config |
182ee |
Control | Cluster (9) | |
187.0 | > Source |
Cluster (6) | |||
187.0.0 | > > Channel |
uint (4) | |||
187.0.1 | > > Module |
uint (1) | |||
187.0.2 | > > AnalogTrigger |
Boolean | |||
187.1 | > RisingEdge |
Boolean | |||
187.2 | > FallingEdge |
Boolean | |||
187.3 | > WaitForAck |
Boolean | |||
188 | Interrupt3.RisingTimeStamp |
182f0 |
Indicator | U32 | |
189 | Interrupt3.FallingTimeStamp |
182f4 |
Indicator | U32 | |
190 | Interrupt4.Config |
182fa |
Control | Cluster (9) | |
190.0 | > Source |
Cluster (6) | |||
190.0.0 | > > Channel |
uint (4) | |||
190.0.1 | > > Module |
uint (1) | |||
190.0.2 | > > AnalogTrigger |
Boolean | |||
190.1 | > RisingEdge |
Boolean | |||
190.2 | > FallingEdge |
Boolean | |||
190.3 | > WaitForAck |
Boolean | |||
191 | Interrupt4.RisingTimeStamp |
182fc |
Indicator | U32 | |
192 | Interrupt4.FallingTimeStamp |
18300 |
Indicator | U32 | |
193 | Interrupt5.Config |
18306 |
Control | Cluster (9) | |
193.0 | > Source |
Cluster (6) | |||
193.0.0 | > > Channel |
uint (4) | |||
193.0.1 | > > Module |
uint (1) | |||
193.0.2 | > > AnalogTrigger |
Boolean | |||
193.1 | > RisingEdge |
Boolean | |||
193.2 | > FallingEdge |
Boolean | |||
193.3 | > WaitForAck |
Boolean | |||
194 | Interrupt5.RisingTimeStamp |
18308 |
Indicator | U32 | |
195 | Interrupt5.FallingTimeStamp |
1830c |
Indicator | U32 | |
196 | Interrupt6.Config |
18312 |
Control | Cluster (9) | |
196.0 | > Source |
Cluster (6) | |||
196.0.0 | > > Channel |
uint (4) | |||
196.0.1 | > > Module |
uint (1) | |||
196.0.2 | > > AnalogTrigger |
Boolean | |||
196.1 | > RisingEdge |
Boolean | |||
196.2 | > FallingEdge |
Boolean | |||
196.3 | > WaitForAck |
Boolean | |||
197 | Interrupt6.RisingTimeStamp |
18314 |
Indicator | U32 | |
198 | Interrupt6.FallingTimeStamp |
18318 |
Indicator | U32 | |
199 | Interrupt7.Config |
1831e |
Control | Cluster (9) | |
199.0 | > Source |
Cluster (6) | |||
199.0.0 | > > Channel |
uint (4) | |||
199.0.1 | > > Module |
uint (1) | |||
199.0.2 | > > AnalogTrigger |
Boolean | |||
199.1 | > RisingEdge |
Boolean | |||
199.2 | > FallingEdge |
Boolean | |||
199.3 | > WaitForAck |
Boolean | |||
200 | Interrupt7.RisingTimeStamp |
18320 |
Indicator | U32 | |
201 | Interrupt7.FallingTimeStamp |
18324 |
Indicator | U32 | |
202 | DMA.Rate |
18328 |
Control | U32 | |
203 | DMA.Config |
1832c |
Control | Cluster (22) | |
203.0 | > Pause |
Boolean | |||
203.1 | > Enable |
Cluster (20) | |||
203.1.0 | > > AI0_Low |
Boolean | |||
203.1.1 | > > AI0_High |
Boolean | |||
203.1.2 | > > AIAveraged0_Low |
Boolean | |||
203.1.3 | > > AIAveraged0_High |
Boolean | |||
203.1.4 | > > AI1_Low |
Boolean | |||
203.1.5 | > > AI1_High |
Boolean | |||
203.1.6 | > > AIAveraged1_Low |
Boolean | |||
203.1.7 | > > AIAveraged1_High |
Boolean | |||
203.1.8 | > > Accumulator0 |
Boolean | |||
203.1.9 | > > Accumulator1 |
Boolean | |||
203.1.10 | > > DI |
Boolean | |||
203.1.11 | > > AnalogTriggers |
Boolean | |||
203.1.12 | > > Counters_Low |
Boolean | |||
203.1.13 | > > Counters_High |
Boolean | |||
203.1.14 | > > CounterTimers_Low |
Boolean | |||
203.1.15 | > > CounterTimers_High |
Boolean | |||
203.1.16 | > > Encoders_Low |
Boolean | |||
203.1.17 | > > Encoders_High |
Boolean | |||
203.1.18 | > > EncoderTimers_Low |
Boolean | |||
203.1.19 | > > EncoderTimers_High |
Boolean | |||
203.2 | > ExternalClock |
Boolean | |||
204 | DMA.ExternalTriggers0 |
18330 |
Control | Cluster (8) x 4 (32) | |
204 | > Trigger |
Cluster (8) | |||
204.0 | > > ExternalClockSource |
Cluster (6) | |||
204.0.0 | > > > Channel |
uint (4) | |||
204.0.1 | > > > Module |
uint (1) | |||
204.0.2 | > > > AnalogTrigger |
Boolean | |||
204.1 | > > RisingEdge |
Boolean | |||
204.2 | > > FallingEdge |
Boolean | |||
205 | DMA.ExternalTriggers1 |
18334 |
Control | Cluster (8) x 4 (32) | |
205 | > Trigger |
Cluster (8) | |||
205.0 | > > ExternalClockSource |
Cluster (6) | |||
205.0.0 | > > > Channel |
uint (4) | |||
205.0.1 | > > > Module |
uint (1) | |||
205.0.2 | > > > AnalogTrigger |
Boolean | |||
205.1 | > > RisingEdge |
Boolean | |||
205.2 | > > FallingEdge |
Boolean | |||
206 | Alarm.TriggerTime |
18338 |
Control | U32 | |
207 | Alarm.Enable |
1833e |
Control | Boolean | |
208 | Relay.Value |
18342 |
Control | Cluster (8) | |
208.0 | > Forward |
uint (4) | |||
208.1 | > Reverse |
uint (4) | |||
209 | Power.Status |
18344 |
Indicator | Cluster (24) | |
209.0 | > User3V3 |
U8 | |||
209.1 | > User5V |
U8 | |||
209.2 | > User6V |
U8 | |||
210 | Power.Disable |
1834a |
Control | Cluster (3) | |
210.0 | > User3V3 |
Boolean | |||
210.1 | > User5V |
Boolean | |||
210.2 | > User6V |
Boolean | |||
211 | Power.UserVoltage6V |
1834e |
Indicator | U16 | |
212 | Power.UserCurrent6V |
18352 |
Indicator | U16 | |
213 | Power.UserVoltage5V |
18356 |
Indicator | U16 | |
214 | Power.UserCurrent5V |
1835a |
Indicator | U16 | |
215 | Power.UserVoltage3V3 |
1835e |
Indicator | U16 | |
216 | Power.UserCurrent3V3 |
18362 |
Indicator | U16 | |
217 | Power.VinVoltage |
18366 |
Indicator | U16 | |
218 | Power.VinCurrent |
1836a |
Indicator | U16 | |
219 | Power.OnChipTemperature |
1836e |
Indicator | U16 | |
220 | Power.MXP_DIOVoltage |
18372 |
Indicator | U16 | |
221 | Power.IntegratedIO |
18376 |
Indicator | U16 | |
222 | Power.AOVoltage |
1837a |
Indicator | U16 | |
223 | Power.FaultCounts |
1837c |
Indicator | Cluster (32) | |
223.0 | > OverCurrentFaultCount3V3 |
U8 | |||
223.1 | > OverCurrentFaultCount5V |
U8 | |||
223.2 | > OverCurrentFaultCount6V |
U8 | |||
223.3 | > UnderVoltageFaultCount5V |
U8 | |||
224 | Power.ResetFaultCounts |
18382 |
Control | Boolean | |
225 | BIST.Enable |
18386 |
Control | Boolean | |
226 | BIST.DO0SquareEnable |
1838a |
Control | Boolean | |
227 | BIST.DO0SquareTicks |
1838c |
Control | U32 | |
228 | BIST.DO0 |
18392 |
Control | Boolean | |
229 | BIST.DO1SquareEnable |
18396 |
Control | Boolean | |
230 | BIST.DO1SquareTicks |
18398 |
Control | U32 | |
231 | BIST.DO1 |
1839e |
Control | Boolean | |
232 | AO.MXP0 |
183a2 |
Control | U16 | |
233 | AO.MXP1 |
183a6 |
Control | U16 | |
234 | SPI.ChipSelectActiveHigh |
183aa |
Control | Cluster (5) | |
234.0 | > Hdr |
uint (4) | |||
234.1 | > MXP |
uint (1) | |||
235 | SPI.EnableDIO |
183ae |
Control | uint (5) | |
236 | SPI.AutoSPI1Select |
183b2 |
Control | Boolean | |
237 | SPI.AutoByteCount |
183b6 |
Control | Cluster (11) | |
237.0 | > TxByteCount |
uint (4) | |||
237.1 | > ZeroByteCount |
uint (7) | |||
238 | SPI.AutoForceOne |
183ba |
Control | Boolean | |
239 | SPI.AutoRate |
183bc |
Control | U32 | |
240 | SPI.AutoTriggerConfig |
183c2 |
Control | Cluster (9) | |
240.0 | > ExternalClockSource |
Cluster (6) | |||
240.0.0 | > > Channel |
uint (4) | |||
240.0.1 | > > Module |
uint (1) | |||
240.0.2 | > > AnalogTrigger |
Boolean | |||
240.1 | > RisingEdge |
Boolean | |||
240.2 | > FallingEdge |
Boolean | |||
240.3 | > ExternalClock |
Boolean | |||
241 | SPI.AutoChipSelect |
183c6 |
Control | U8 | |
242 | SPI.AutoTx0 |
183c8 |
Control | U8 x 4 (32) | |
243 | SPI.AutoTx1 |
183cc |
Control | U8 x 4 (32) | |
244 | SPI.AutoTx2 |
183d0 |
Control | U8 x 4 (32) | |
245 | SPI.AutoTx3 |
183d4 |
Control | U8 x 4 (32) | |
246 | SPI.TransferSkippedFullCount |
183d8 |
Indicator | U32 | |
247 | SPI.DebugState |
183de |
Indicator | EnumU16 | Idle, Check Window, Check Available, Set Fifo Mark, Enable SPI, Stuff Fifo, Check Mark, Shuffle Data, Disable |
248 | SPI.DebugSubstate |
183e2 |
Indicator | U8 | |
249 | SPI.DebugRevision |
183e4 |
Indicator | U32 | |
250 | SPI.DebugEnabled |
183e8 |
Indicator | U32 | |
251 | SPI.DebugIntStat |
183ec |
Indicator | U32 | |
252 | SPI.DebugIntStatReadCount |
183f0 |
Indicator | U32 | |
253 | Accel.ADDR |
183f6 |
Control | U8 | |
254 | Accel.CNTR |
183fa |
Control | U8 | |
255 | Accel.DATO |
183fe |
Control | U8 | |
256 | Accel.DATI |
18402 |
Indicator | U8 | |
257 | Accel.CNTL |
18406 |
Control | U8 | |
258 | Accel.STAT |
1840a |
Indicator | U8 | |
259 | Accel.CNFG |
1840e |
Control | U8 | |
260 | Accel.GO |
18412 |
Control | Boolean | |
261 | HMB.Config |
18414 |
Control | Cluster (24) | |
261.0 | > Enables |
Cluster (24) | |||
261.0.0 | > > AI0_Low |
Boolean | |||
261.0.1 | > > AI0_High |
Boolean | |||
261.0.2 | > > AIAveraged0_Low |
Boolean | |||
261.0.3 | > > AIAveraged0_High |
Boolean | |||
261.0.4 | > > AI1_Low |
Boolean | |||
261.0.5 | > > AI1_High |
Boolean | |||
261.0.6 | > > AIAveraged1_Low |
Boolean | |||
261.0.7 | > > AIAveraged1_High |
Boolean | |||
261.0.8 | > > Accumulator0 |
Boolean | |||
261.0.9 | > > Accumulator1 |
Boolean | |||
261.0.10 | > > DI |
Boolean | |||
261.0.11 | > > AnalogTriggers |
Boolean | |||
261.0.12 | > > Counters_Low |
Boolean | |||
261.0.13 | > > Counters_High |
Boolean | |||
261.0.14 | > > CounterTimers_Low |
Boolean | |||
261.0.15 | > > CounterTimers_High |
Boolean | |||
261.0.16 | > > Encoders_Low |
Boolean | |||
261.0.17 | > > Encoders_High |
Boolean | |||
261.0.18 | > > EncoderTimers_Low |
Boolean | |||
261.0.19 | > > EncoderTimers_High |
Boolean | |||
261.0.20 | > > Interrupts |
Boolean | |||
261.0.21 | > > PWM |
Boolean | |||
261.0.22 | > > PWM_MXP |
Boolean | |||
261.0.23 | > > Relay_DO_AO |
Boolean | |||
262 | HMB.ForceOnce |
1841a |
Control | Boolean | |
263 | ViControl |
17000 |
Control | U32 | |
264 | DiagramReset |
17008 |
Control | U32 | |
265 | ViSignature |
17004 |
Indicator | U32 x 4 (128) | |
266 | InterruptEnable |
16000 |
Control | U32 | |
267 | InterruptMask |
16008 |
Control | U32 | |
268 | InterruptStatus |
1600c |
Control | U32 |
Watchdog¶
The FPGA has a watchdog which, when fed properly, enables all the outputs on the robot (e.g. PWM, Relays, CAN (albeit, indirectly), etc).
Danger
Manually feeding the watchdog bypasses all the built in safeties preventing the robot from moving. Do not manually feed the watchdog on a robot that has any chance of injuring someone.
Feeding¶
The 2019 FPGA watchdog was updated to be slightly obfuscated, but is still based on a single byte challenge-response, so still has the same problem.
- Write
0xb007
toSysWatchdog.Command
- Read from
SysWatchdog.Challenge
(4 bytes as of 2019) - Apply the following deobfuscation to the challenge:
uint32_t swapped = obfuscated;
swapped = ((swapped >> 1) & (0x55555555)) | ((swapped & (0x55555555)) << 1);
// Swap consecutive pairs
swapped = ((swapped >> 2) & (0x33333333)) | ((swapped & (0x33333333)) << 2);
// Swap nibbles
swapped = ((swapped >> 4) & (0x0f0f0f0f)) | ((swapped & (0x0f0f0f0f)) << 4);
// XOR outer bytes of swapped with inner bytes of original obfuscated challenge
challenge = ( (swapped >> 24) ^ (obfuscated >> 16) ^ (obfuscated >> 8) ^ swapped ) & 0xff;
- The official code combines the response with random data to reobfuscate it. The result is that the lower two bytes XORed together produce the response.
response = 0xcc | ((0xcc ^ responses[challenge]) << 8)
Note
This can be any byte (0xcc
used above) other than 0x00
. Using 0x00
will
cause the watchdog to die when the response is 0x00
. This is what
lead to FIRST to release a late build season image, since the original didn’t check.
When enabled, every 20ms there’s a \(\frac{1}{256}\) chance for the (lower byte of the) random obfuscation number to be 0, and a \(\frac{1}{256}\) chance for the response to be 0. When both were 0 (on average, every 21.8 minutes), the watchdog would die.
- Write the response to
SysWatchdog.Command
- Write
0xfeed
toSysWatchdog.Command
and go to step 2
To stop feeding, one should write 0xdead
to SysWatchdog.Command
Challenge-response¶
The challenge-response is a single byte in 2019, just obfuscated, so simply intercepting, deobfuscating, and recording all the proper responses is trivial.
The current responses are:
uint8_t responses[256] = {
118, 154, 243, 85, 81, 32, 153, 216, 137, 123, 26, 45, 165, 28, 100, 2,
168, 234, 61, 231, 155, 250, 248, 74, 58, 230, 246, 69, 77, 163, 7, 52,
106, 239, 240, 64, 188, 147, 254, 5, 126, 138, 121, 113, 229, 179, 49, 161,
109, 57, 27, 18, 86, 148, 195, 55, 222, 211, 117, 210, 104, 3, 226, 67,
209, 217, 177, 12, 219, 101, 73, 145, 99, 164, 215, 214, 94, 78, 17, 0,
169, 225, 245, 119, 53, 157, 224, 107, 212, 51, 218, 63, 8, 174, 252, 96,
184, 223, 105, 38, 129, 82, 92, 134, 194, 80, 102, 48, 146, 36, 204, 242,
238, 253, 130, 40, 152, 182, 70, 178, 247, 84, 187, 235, 208, 42, 202, 71,
23, 54, 141, 175, 180, 20, 89, 29, 97, 108, 221, 156, 206, 236, 189, 143,
9, 30, 125, 35, 87, 144, 159, 90, 114, 191, 139, 6, 201, 171, 228, 213,
15, 65, 232, 50, 79, 150, 220, 133, 116, 181, 185, 16, 190, 91, 200, 47,
197, 203, 68, 21, 43, 167, 199, 241, 142, 255, 183, 158, 122, 251, 59, 176,
39, 1, 192, 83, 124, 37, 115, 132, 128, 22, 244, 249, 93, 46, 227, 11,
149, 172, 196, 136, 193, 207, 76, 13, 162, 19, 170, 10, 66, 131, 44, 110,
75, 31, 103, 33, 56, 198, 140, 120, 166, 72, 98, 95, 127, 112, 160, 25,
34, 186, 173, 135, 88, 14, 4, 237, 62, 24, 233, 60, 111, 205, 151, 41
};