blob: d058c1a1dfabae7de92663a52a61781c52a00b36 [file] [log] [blame]
Brian Silverman41cdd3e2019-01-19 19:48:58 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) 2016-2018 FIRST. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#include "hal/HAL.h"
9
10#include <wpi/mutex.h>
11#include <wpi/raw_ostream.h>
12
13#include "ErrorsInternal.h"
14#include "HALInitializer.h"
15#include "MockHooksInternal.h"
16#include "hal/DriverStation.h"
17#include "hal/Errors.h"
18#include "hal/Extensions.h"
19#include "hal/handles/HandlesInternal.h"
20#include "mockdata/RoboRioDataInternal.h"
21
22using namespace hal;
23
24namespace hal {
25namespace init {
26void InitializeHAL() {
27 InitializeAccelerometerData();
28 InitializeAnalogGyroData();
29 InitializeAnalogInData();
30 InitializeAnalogOutData();
31 InitializeAnalogTriggerData();
32 InitializeCanData();
33 InitializeCANAPI();
34 InitializeDigitalPWMData();
35 InitializeDIOData();
36 InitializeDriverStationData();
37 InitializeEncoderData();
38 InitializeI2CData();
39 InitializePCMData();
40 InitializePDPData();
41 InitializePWMData();
42 InitializeRelayData();
43 InitializeRoboRioData();
44 InitializeSPIAccelerometerData();
45 InitializeSPIData();
46 InitializeAccelerometer();
47 InitializeAnalogAccumulator();
48 InitializeAnalogGyro();
49 InitializeAnalogInput();
50 InitializeAnalogInternal();
51 InitializeAnalogOutput();
52 InitializeCAN();
53 InitializeCompressor();
54 InitializeConstants();
55 InitializeCounter();
56 InitializeDigitalInternal();
57 InitializeDIO();
58 InitializeDriverStation();
59 InitializeEncoder();
60 InitializeExtensions();
61 InitializeI2C();
62 InitializeInterrupts();
63 InitializeMockHooks();
64 InitializeNotifier();
65 InitializePDP();
66 InitializePorts();
67 InitializePower();
68 InitializePWM();
69 InitializeRelay();
70 InitializeSerialPort();
71 InitializeSolenoid();
72 InitializeSPI();
73 InitializeThreads();
74}
75} // namespace init
76} // namespace hal
77
78extern "C" {
79
80HAL_PortHandle HAL_GetPort(int32_t channel) {
81 // Dont allow a number that wouldn't fit in a uint8_t
82 if (channel < 0 || channel >= 255) return HAL_kInvalidHandle;
83 return createPortHandle(channel, 1);
84}
85
86HAL_PortHandle HAL_GetPortWithModule(int32_t module, int32_t channel) {
87 // Dont allow a number that wouldn't fit in a uint8_t
88 if (channel < 0 || channel >= 255) return HAL_kInvalidHandle;
89 if (module < 0 || module >= 255) return HAL_kInvalidHandle;
90 return createPortHandle(channel, module);
91}
92
93const char* HAL_GetErrorMessage(int32_t code) {
94 switch (code) {
95 case 0:
96 return "";
97 case CTR_RxTimeout:
98 return CTR_RxTimeout_MESSAGE;
99 case CTR_TxTimeout:
100 return CTR_TxTimeout_MESSAGE;
101 case CTR_InvalidParamValue:
102 return CTR_InvalidParamValue_MESSAGE;
103 case CTR_UnexpectedArbId:
104 return CTR_UnexpectedArbId_MESSAGE;
105 case CTR_TxFailed:
106 return CTR_TxFailed_MESSAGE;
107 case CTR_SigNotUpdated:
108 return CTR_SigNotUpdated_MESSAGE;
109 case NiFpga_Status_FifoTimeout:
110 return NiFpga_Status_FifoTimeout_MESSAGE;
111 case NiFpga_Status_TransferAborted:
112 return NiFpga_Status_TransferAborted_MESSAGE;
113 case NiFpga_Status_MemoryFull:
114 return NiFpga_Status_MemoryFull_MESSAGE;
115 case NiFpga_Status_SoftwareFault:
116 return NiFpga_Status_SoftwareFault_MESSAGE;
117 case NiFpga_Status_InvalidParameter:
118 return NiFpga_Status_InvalidParameter_MESSAGE;
119 case NiFpga_Status_ResourceNotFound:
120 return NiFpga_Status_ResourceNotFound_MESSAGE;
121 case NiFpga_Status_ResourceNotInitialized:
122 return NiFpga_Status_ResourceNotInitialized_MESSAGE;
123 case NiFpga_Status_HardwareFault:
124 return NiFpga_Status_HardwareFault_MESSAGE;
125 case NiFpga_Status_IrqTimeout:
126 return NiFpga_Status_IrqTimeout_MESSAGE;
127 case SAMPLE_RATE_TOO_HIGH:
128 return SAMPLE_RATE_TOO_HIGH_MESSAGE;
129 case VOLTAGE_OUT_OF_RANGE:
130 return VOLTAGE_OUT_OF_RANGE_MESSAGE;
131 case LOOP_TIMING_ERROR:
132 return LOOP_TIMING_ERROR_MESSAGE;
133 case SPI_WRITE_NO_MOSI:
134 return SPI_WRITE_NO_MOSI_MESSAGE;
135 case SPI_READ_NO_MISO:
136 return SPI_READ_NO_MISO_MESSAGE;
137 case SPI_READ_NO_DATA:
138 return SPI_READ_NO_DATA_MESSAGE;
139 case INCOMPATIBLE_STATE:
140 return INCOMPATIBLE_STATE_MESSAGE;
141 case NO_AVAILABLE_RESOURCES:
142 return NO_AVAILABLE_RESOURCES_MESSAGE;
143 case RESOURCE_IS_ALLOCATED:
144 return RESOURCE_IS_ALLOCATED_MESSAGE;
145 case RESOURCE_OUT_OF_RANGE:
146 return RESOURCE_OUT_OF_RANGE_MESSAGE;
147 case HAL_INVALID_ACCUMULATOR_CHANNEL:
148 return HAL_INVALID_ACCUMULATOR_CHANNEL_MESSAGE;
149 case HAL_HANDLE_ERROR:
150 return HAL_HANDLE_ERROR_MESSAGE;
151 case NULL_PARAMETER:
152 return NULL_PARAMETER_MESSAGE;
153 case ANALOG_TRIGGER_LIMIT_ORDER_ERROR:
154 return ANALOG_TRIGGER_LIMIT_ORDER_ERROR_MESSAGE;
155 case ANALOG_TRIGGER_PULSE_OUTPUT_ERROR:
156 return ANALOG_TRIGGER_PULSE_OUTPUT_ERROR_MESSAGE;
157 case PARAMETER_OUT_OF_RANGE:
158 return PARAMETER_OUT_OF_RANGE_MESSAGE;
159 case HAL_COUNTER_NOT_SUPPORTED:
160 return HAL_COUNTER_NOT_SUPPORTED_MESSAGE;
161 case HAL_ERR_CANSessionMux_InvalidBuffer:
162 return ERR_CANSessionMux_InvalidBuffer_MESSAGE;
163 case HAL_ERR_CANSessionMux_MessageNotFound:
164 return ERR_CANSessionMux_MessageNotFound_MESSAGE;
165 case HAL_WARN_CANSessionMux_NoToken:
166 return WARN_CANSessionMux_NoToken_MESSAGE;
167 case HAL_ERR_CANSessionMux_NotAllowed:
168 return ERR_CANSessionMux_NotAllowed_MESSAGE;
169 case HAL_ERR_CANSessionMux_NotInitialized:
170 return ERR_CANSessionMux_NotInitialized_MESSAGE;
171 case VI_ERROR_SYSTEM_ERROR:
172 return VI_ERROR_SYSTEM_ERROR_MESSAGE;
173 case VI_ERROR_INV_OBJECT:
174 return VI_ERROR_INV_OBJECT_MESSAGE;
175 case VI_ERROR_RSRC_LOCKED:
176 return VI_ERROR_RSRC_LOCKED_MESSAGE;
177 case VI_ERROR_RSRC_NFOUND:
178 return VI_ERROR_RSRC_NFOUND_MESSAGE;
179 case VI_ERROR_INV_RSRC_NAME:
180 return VI_ERROR_INV_RSRC_NAME_MESSAGE;
181 case VI_ERROR_QUEUE_OVERFLOW:
182 return VI_ERROR_QUEUE_OVERFLOW_MESSAGE;
183 case VI_ERROR_IO:
184 return VI_ERROR_IO_MESSAGE;
185 case VI_ERROR_ASRL_PARITY:
186 return VI_ERROR_ASRL_PARITY_MESSAGE;
187 case VI_ERROR_ASRL_FRAMING:
188 return VI_ERROR_ASRL_FRAMING_MESSAGE;
189 case VI_ERROR_ASRL_OVERRUN:
190 return VI_ERROR_ASRL_OVERRUN_MESSAGE;
191 case VI_ERROR_RSRC_BUSY:
192 return VI_ERROR_RSRC_BUSY_MESSAGE;
193 case VI_ERROR_INV_PARAMETER:
194 return VI_ERROR_INV_PARAMETER_MESSAGE;
195 case HAL_PWM_SCALE_ERROR:
196 return HAL_PWM_SCALE_ERROR_MESSAGE;
197 case HAL_CAN_TIMEOUT:
198 return HAL_CAN_TIMEOUT_MESSAGE;
199 default:
200 return "Unknown error status";
201 }
202}
203
204HAL_RuntimeType HAL_GetRuntimeType(void) { return HAL_Mock; }
205
206int32_t HAL_GetFPGAVersion(int32_t* status) {
207 return 2018; // Automatically script this at some point
208}
209
210int64_t HAL_GetFPGARevision(int32_t* status) {
211 return 0; // TODO: Find a better number to return;
212}
213
214uint64_t HAL_GetFPGATime(int32_t* status) { return hal::GetFPGATime(); }
215
216HAL_Bool HAL_GetFPGAButton(int32_t* status) {
217 return SimRoboRioData[0].fpgaButton;
218}
219
220HAL_Bool HAL_GetSystemActive(int32_t* status) {
221 return true; // Figure out if we need to handle this
222}
223
224HAL_Bool HAL_GetBrownedOut(int32_t* status) {
225 return false; // Figure out if we need to detect a brownout condition
226}
227
228HAL_Bool HAL_Initialize(int32_t timeout, int32_t mode) {
229 static std::atomic_bool initialized{false};
230 static wpi::mutex initializeMutex;
231 // Initial check, as if it's true initialization has finished
232 if (initialized) return true;
233
234 std::lock_guard<wpi::mutex> lock(initializeMutex);
235 // Second check in case another thread was waiting
236 if (initialized) return true;
237
238 hal::init::InitializeHAL();
239
240 hal::init::HAL_IsInitialized.store(true);
241
242 wpi::outs().SetUnbuffered();
243 if (HAL_LoadExtensions() < 0) return false;
244 hal::RestartTiming();
245 HAL_InitializeDriverStation();
246
247 initialized = true;
248 return true; // Add initialization if we need to at a later point
249}
250
251int64_t HAL_Report(int32_t resource, int32_t instanceNumber, int32_t context,
252 const char* feature) {
253 return 0; // Do nothing for now
254}
255
256} // extern "C"