blob: 2414ed7fbe327bcad2ea0e94bbc630f63be171c7 [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Brian Silverman8fce7482020-01-05 13:18:21 -08004
5#include "frc/RobotController.h"
6
James Kuszmaulcf324122023-01-14 14:07:17 -08007#include <cstddef>
8
Brian Silverman8fce7482020-01-05 13:18:21 -08009#include <hal/CAN.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080010#include <hal/HALBase.h>
Maxwell Henderson80bec322024-01-09 15:48:44 -080011#include <hal/LEDs.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080012#include <hal/Power.h>
13
Austin Schuh812d0d12021-11-04 20:16:48 -070014#include "frc/Errors.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080015
16using namespace frc;
17
18int RobotController::GetFPGAVersion() {
19 int32_t status = 0;
20 int version = HAL_GetFPGAVersion(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080021 FRC_CheckErrorStatus(status, "GetFPGAVersion");
Brian Silverman8fce7482020-01-05 13:18:21 -080022 return version;
23}
24
25int64_t RobotController::GetFPGARevision() {
26 int32_t status = 0;
27 int64_t revision = HAL_GetFPGARevision(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080028 FRC_CheckErrorStatus(status, "GetFPGARevision");
Brian Silverman8fce7482020-01-05 13:18:21 -080029 return revision;
30}
31
James Kuszmaulcf324122023-01-14 14:07:17 -080032std::string RobotController::GetSerialNumber() {
33 // Serial number is 8 characters
34 char serialNum[9];
35 size_t len = HAL_GetSerialNumber(serialNum, sizeof(serialNum));
36 return std::string(serialNum, len);
37}
38
39std::string RobotController::GetComments() {
40 char comments[65];
41 size_t len = HAL_GetComments(comments, sizeof(comments));
42 return std::string(comments, len);
43}
44
James Kuszmaulb13e13f2023-11-22 20:44:04 -080045int32_t RobotController::GetTeamNumber() {
46 return HAL_GetTeamNumber();
47}
48
Brian Silverman8fce7482020-01-05 13:18:21 -080049uint64_t RobotController::GetFPGATime() {
50 int32_t status = 0;
51 uint64_t time = HAL_GetFPGATime(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080052 FRC_CheckErrorStatus(status, "GetFPGATime");
Brian Silverman8fce7482020-01-05 13:18:21 -080053 return time;
54}
55
56bool RobotController::GetUserButton() {
57 int32_t status = 0;
Brian Silverman8fce7482020-01-05 13:18:21 -080058 bool value = HAL_GetFPGAButton(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080059 FRC_CheckErrorStatus(status, "GetUserButton");
Brian Silverman8fce7482020-01-05 13:18:21 -080060 return value;
61}
62
Austin Schuh812d0d12021-11-04 20:16:48 -070063units::volt_t RobotController::GetBatteryVoltage() {
64 int32_t status = 0;
65 double retVal = HAL_GetVinVoltage(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080066 FRC_CheckErrorStatus(status, "GetBatteryVoltage");
Austin Schuh812d0d12021-11-04 20:16:48 -070067 return units::volt_t{retVal};
68}
69
Brian Silverman8fce7482020-01-05 13:18:21 -080070bool RobotController::IsSysActive() {
71 int32_t status = 0;
72 bool retVal = HAL_GetSystemActive(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080073 FRC_CheckErrorStatus(status, "IsSysActive");
Brian Silverman8fce7482020-01-05 13:18:21 -080074 return retVal;
75}
76
77bool RobotController::IsBrownedOut() {
78 int32_t status = 0;
79 bool retVal = HAL_GetBrownedOut(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -080080 FRC_CheckErrorStatus(status, "IsBrownedOut");
Brian Silverman8fce7482020-01-05 13:18:21 -080081 return retVal;
82}
83
James Kuszmaulb13e13f2023-11-22 20:44:04 -080084bool RobotController::GetRSLState() {
85 int32_t status = 0;
86 bool retVal = HAL_GetRSLState(&status);
87 FRC_CheckErrorStatus(status, "GetRSLState");
88 return retVal;
89}
90
91bool RobotController::IsSystemTimeValid() {
92 int32_t status = 0;
93 bool retVal = HAL_GetSystemTimeValid(&status);
94 FRC_CheckErrorStatus(status, "IsSystemTimeValid");
95 return retVal;
96}
97
Brian Silverman8fce7482020-01-05 13:18:21 -080098double RobotController::GetInputVoltage() {
99 int32_t status = 0;
100 double retVal = HAL_GetVinVoltage(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800101 FRC_CheckErrorStatus(status, "GetInputVoltage");
Brian Silverman8fce7482020-01-05 13:18:21 -0800102 return retVal;
103}
104
105double RobotController::GetInputCurrent() {
106 int32_t status = 0;
107 double retVal = HAL_GetVinCurrent(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800108 FRC_CheckErrorStatus(status, "GetInputCurrent");
Brian Silverman8fce7482020-01-05 13:18:21 -0800109 return retVal;
110}
111
112double RobotController::GetVoltage3V3() {
113 int32_t status = 0;
114 double retVal = HAL_GetUserVoltage3V3(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800115 FRC_CheckErrorStatus(status, "GetVoltage3V3");
Brian Silverman8fce7482020-01-05 13:18:21 -0800116 return retVal;
117}
118
119double RobotController::GetCurrent3V3() {
120 int32_t status = 0;
121 double retVal = HAL_GetUserCurrent3V3(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800122 FRC_CheckErrorStatus(status, "GetCurrent3V3");
Brian Silverman8fce7482020-01-05 13:18:21 -0800123 return retVal;
124}
125
James Kuszmaulb13e13f2023-11-22 20:44:04 -0800126void RobotController::SetEnabled3V3(bool enabled) {
127 int32_t status = 0;
128 HAL_SetUserRailEnabled3V3(enabled, &status);
129 FRC_CheckErrorStatus(status, "SetEnabled3V3");
130}
131
Brian Silverman8fce7482020-01-05 13:18:21 -0800132bool RobotController::GetEnabled3V3() {
133 int32_t status = 0;
134 bool retVal = HAL_GetUserActive3V3(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800135 FRC_CheckErrorStatus(status, "GetEnabled3V3");
Brian Silverman8fce7482020-01-05 13:18:21 -0800136 return retVal;
137}
138
139int RobotController::GetFaultCount3V3() {
140 int32_t status = 0;
141 int retVal = HAL_GetUserCurrentFaults3V3(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800142 FRC_CheckErrorStatus(status, "GetFaultCount3V3");
Brian Silverman8fce7482020-01-05 13:18:21 -0800143 return retVal;
144}
145
146double RobotController::GetVoltage5V() {
147 int32_t status = 0;
148 double retVal = HAL_GetUserVoltage5V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800149 FRC_CheckErrorStatus(status, "GetVoltage5V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800150 return retVal;
151}
152
153double RobotController::GetCurrent5V() {
154 int32_t status = 0;
155 double retVal = HAL_GetUserCurrent5V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800156 FRC_CheckErrorStatus(status, "GetCurrent5V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800157 return retVal;
158}
159
James Kuszmaulb13e13f2023-11-22 20:44:04 -0800160void RobotController::SetEnabled5V(bool enabled) {
161 int32_t status = 0;
162 HAL_SetUserRailEnabled5V(enabled, &status);
163 FRC_CheckErrorStatus(status, "SetEnabled5V");
164}
165
Brian Silverman8fce7482020-01-05 13:18:21 -0800166bool RobotController::GetEnabled5V() {
167 int32_t status = 0;
168 bool retVal = HAL_GetUserActive5V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800169 FRC_CheckErrorStatus(status, "GetEnabled5V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800170 return retVal;
171}
172
173int RobotController::GetFaultCount5V() {
174 int32_t status = 0;
175 int retVal = HAL_GetUserCurrentFaults5V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800176 FRC_CheckErrorStatus(status, "GetFaultCount5V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800177 return retVal;
178}
179
180double RobotController::GetVoltage6V() {
181 int32_t status = 0;
182 double retVal = HAL_GetUserVoltage6V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800183 FRC_CheckErrorStatus(status, "GetVoltage6V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800184 return retVal;
185}
186
187double RobotController::GetCurrent6V() {
188 int32_t status = 0;
189 double retVal = HAL_GetUserCurrent6V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800190 FRC_CheckErrorStatus(status, "GetCurrent6V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800191 return retVal;
192}
193
James Kuszmaulb13e13f2023-11-22 20:44:04 -0800194void RobotController::SetEnabled6V(bool enabled) {
195 int32_t status = 0;
196 HAL_SetUserRailEnabled6V(enabled, &status);
197 FRC_CheckErrorStatus(status, "SetEnabled6V");
198}
199
Brian Silverman8fce7482020-01-05 13:18:21 -0800200bool RobotController::GetEnabled6V() {
201 int32_t status = 0;
202 bool retVal = HAL_GetUserActive6V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800203 FRC_CheckErrorStatus(status, "GetEnabled6V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800204 return retVal;
205}
206
207int RobotController::GetFaultCount6V() {
208 int32_t status = 0;
209 int retVal = HAL_GetUserCurrentFaults6V(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800210 FRC_CheckErrorStatus(status, "GetFaultCount6V");
Brian Silverman8fce7482020-01-05 13:18:21 -0800211 return retVal;
212}
213
Austin Schuh812d0d12021-11-04 20:16:48 -0700214units::volt_t RobotController::GetBrownoutVoltage() {
215 int32_t status = 0;
216 double retVal = HAL_GetBrownoutVoltage(&status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800217 FRC_CheckErrorStatus(status, "GetBrownoutVoltage");
218 return units::volt_t{retVal};
Austin Schuh812d0d12021-11-04 20:16:48 -0700219}
220
221void RobotController::SetBrownoutVoltage(units::volt_t brownoutVoltage) {
222 int32_t status = 0;
223 HAL_SetBrownoutVoltage(brownoutVoltage.value(), &status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800224 FRC_CheckErrorStatus(status, "SetBrownoutVoltage");
Austin Schuh812d0d12021-11-04 20:16:48 -0700225}
226
James Kuszmaulb13e13f2023-11-22 20:44:04 -0800227units::celsius_t RobotController::GetCPUTemp() {
228 int32_t status = 0;
229 double retVal = HAL_GetCPUTemp(&status);
230 FRC_CheckErrorStatus(status, "GetCPUTemp");
231 return units::celsius_t{retVal};
232}
233
Maxwell Henderson80bec322024-01-09 15:48:44 -0800234static_assert(RadioLEDState::kOff ==
235 static_cast<RadioLEDState>(HAL_RadioLEDState::HAL_RadioLED_kOff));
236static_assert(
237 RadioLEDState::kGreen ==
238 static_cast<RadioLEDState>(HAL_RadioLEDState::HAL_RadioLED_kGreen));
239static_assert(RadioLEDState::kRed ==
240 static_cast<RadioLEDState>(HAL_RadioLEDState::HAL_RadioLED_kRed));
241static_assert(
242 RadioLEDState::kOrange ==
243 static_cast<RadioLEDState>(HAL_RadioLEDState::HAL_RadioLED_kOrange));
244
245void RobotController::SetRadioLEDState(RadioLEDState state) {
246 int32_t status = 0;
247 HAL_SetRadioLEDState(static_cast<HAL_RadioLEDState>(state), &status);
248 FRC_CheckErrorStatus(status, "SetRadioLEDState");
249}
250
251RadioLEDState RobotController::GetRadioLEDState() {
252 int32_t status = 0;
253 auto retVal = static_cast<RadioLEDState>(HAL_GetRadioLEDState(&status));
254 FRC_CheckErrorStatus(status, "GetRadioLEDState");
255 return retVal;
256}
257
Brian Silverman8fce7482020-01-05 13:18:21 -0800258CANStatus RobotController::GetCANStatus() {
259 int32_t status = 0;
260 float percentBusUtilization = 0;
261 uint32_t busOffCount = 0;
262 uint32_t txFullCount = 0;
263 uint32_t receiveErrorCount = 0;
264 uint32_t transmitErrorCount = 0;
265 HAL_CAN_GetCANStatus(&percentBusUtilization, &busOffCount, &txFullCount,
266 &receiveErrorCount, &transmitErrorCount, &status);
James Kuszmaulcf324122023-01-14 14:07:17 -0800267 FRC_CheckErrorStatus(status, "GetCANStatus");
Brian Silverman8fce7482020-01-05 13:18:21 -0800268 return {percentBusUtilization, static_cast<int>(busOffCount),
269 static_cast<int>(txFullCount), static_cast<int>(receiveErrorCount),
270 static_cast<int>(transmitErrorCount)};
271}