blob: fb3c6aa325629fba9864f41354830b1a81041419 [file] [log] [blame]
Brian Silverman26e4e522015-12-17 01:56:40 -05001/*----------------------------------------------------------------------------*/
2/* Copyright (c) FIRST 2013. 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 $(WIND_BASE)/WPILib. */
5/*----------------------------------------------------------------------------*/
6#pragma once
7
8#include <stdint.h>
9#include <cmath>
10
11#include "Accelerometer.hpp"
12#include "Analog.hpp"
13#include "Compressor.hpp"
14#include "Digital.hpp"
15#include "Solenoid.hpp"
16#include "Notifier.hpp"
17#include "Interrupts.hpp"
18#include "Errors.hpp"
19#include "PDP.hpp"
20#include "Power.hpp"
21#include "SerialPort.hpp"
22
23#include "Utilities.hpp"
24#include "Semaphore.hpp"
25#include "Task.hpp"
26
27#define HAL_IO_CONFIG_DATA_SIZE 32
28#define HAL_SYS_STATUS_DATA_SIZE 44
29#define HAL_USER_STATUS_DATA_SIZE (984 - HAL_IO_CONFIG_DATA_SIZE - HAL_SYS_STATUS_DATA_SIZE)
30
31#define HALFRC_NetworkCommunication_DynamicType_DSEnhancedIO_Input 17
32#define HALFRC_NetworkCommunication_DynamicType_DSEnhancedIO_Output 18
33#define HALFRC_NetworkCommunication_DynamicType_Kinect_Header 19
34#define HALFRC_NetworkCommunication_DynamicType_Kinect_Extra1 20
35#define HALFRC_NetworkCommunication_DynamicType_Kinect_Vertices1 21
36#define HALFRC_NetworkCommunication_DynamicType_Kinect_Extra2 22
37#define HALFRC_NetworkCommunication_DynamicType_Kinect_Vertices2 23
38#define HALFRC_NetworkCommunication_DynamicType_Kinect_Joystick 24
39#define HALFRC_NetworkCommunication_DynamicType_Kinect_Custom 25
40
41namespace HALUsageReporting
42{
43 enum tResourceType
44 {
45 kResourceType_Controller,
46 kResourceType_Module,
47 kResourceType_Language,
48 kResourceType_CANPlugin,
49 kResourceType_Accelerometer,
50 kResourceType_ADXL345,
51 kResourceType_AnalogChannel,
52 kResourceType_AnalogTrigger,
53 kResourceType_AnalogTriggerOutput,
54 kResourceType_CANJaguar,
55 kResourceType_Compressor,
56 kResourceType_Counter,
57 kResourceType_Dashboard,
58 kResourceType_DigitalInput,
59 kResourceType_DigitalOutput,
60 kResourceType_DriverStationCIO,
61 kResourceType_DriverStationEIO,
62 kResourceType_DriverStationLCD,
63 kResourceType_Encoder,
64 kResourceType_GearTooth,
65 kResourceType_Gyro,
66 kResourceType_I2C,
67 kResourceType_Framework,
68 kResourceType_Jaguar,
69 kResourceType_Joystick,
70 kResourceType_Kinect,
71 kResourceType_KinectStick,
72 kResourceType_PIDController,
73 kResourceType_Preferences,
74 kResourceType_PWM,
75 kResourceType_Relay,
76 kResourceType_RobotDrive,
77 kResourceType_SerialPort,
78 kResourceType_Servo,
79 kResourceType_Solenoid,
80 kResourceType_SPI,
81 kResourceType_Task,
82 kResourceType_Ultrasonic,
83 kResourceType_Victor,
84 kResourceType_Button,
85 kResourceType_Command,
86 kResourceType_AxisCamera,
87 kResourceType_PCVideoServer,
88 kResourceType_SmartDashboard,
89 kResourceType_Talon,
90 kResourceType_HiTechnicColorSensor,
91 kResourceType_HiTechnicAccel,
92 kResourceType_HiTechnicCompass,
93 kResourceType_SRF08,
94 kResourceType_AnalogOutput,
95 kResourceType_VictorSP,
96 kResourceType_TalonSRX,
97 kResourceType_CANTalonSRX,
98 kResourceType_ADXL362,
99 kResourceType_ADXRS450,
100 kResourceType_RevSPARK,
101 kResourceType_MindsensorsSD540,
102 kResourceType_DigitalFilter,
103 };
104
105 enum tInstances
106 {
107 kLanguage_LabVIEW = 1,
108 kLanguage_CPlusPlus = 2,
109 kLanguage_Java = 3,
110 kLanguage_Python = 4,
111
112 kCANPlugin_BlackJagBridge = 1,
113 kCANPlugin_2CAN = 2,
114
115 kFramework_Iterative = 1,
116 kFramework_Sample = 2,
117 kFramework_CommandControl = 3,
118
119 kRobotDrive_ArcadeStandard = 1,
120 kRobotDrive_ArcadeButtonSpin = 2,
121 kRobotDrive_ArcadeRatioCurve = 3,
122 kRobotDrive_Tank = 4,
123 kRobotDrive_MecanumPolar = 5,
124 kRobotDrive_MecanumCartesian = 6,
125
126 kDriverStationCIO_Analog = 1,
127 kDriverStationCIO_DigitalIn = 2,
128 kDriverStationCIO_DigitalOut = 3,
129
130 kDriverStationEIO_Acceleration = 1,
131 kDriverStationEIO_AnalogIn = 2,
132 kDriverStationEIO_AnalogOut = 3,
133 kDriverStationEIO_Button = 4,
134 kDriverStationEIO_LED = 5,
135 kDriverStationEIO_DigitalIn = 6,
136 kDriverStationEIO_DigitalOut = 7,
137 kDriverStationEIO_FixedDigitalOut = 8,
138 kDriverStationEIO_PWM = 9,
139 kDriverStationEIO_Encoder = 10,
140 kDriverStationEIO_TouchSlider = 11,
141
142 kADXL345_SPI = 1,
143 kADXL345_I2C = 2,
144
145 kCommand_Scheduler = 1,
146
147 kSmartDashboard_Instance = 1,
148 };
149}
150
151struct HALControlWord {
152 uint32_t enabled : 1;
153 uint32_t autonomous : 1;
154 uint32_t test :1;
155 uint32_t eStop : 1;
156 uint32_t fmsAttached:1;
157 uint32_t dsAttached:1;
158 uint32_t control_reserved : 26;
159};
160
161enum HALAllianceStationID {
162 kHALAllianceStationID_red1,
163 kHALAllianceStationID_red2,
164 kHALAllianceStationID_red3,
165 kHALAllianceStationID_blue1,
166 kHALAllianceStationID_blue2,
167 kHALAllianceStationID_blue3,
168};
169
170/* The maximum number of axes that will be stored in a single HALJoystickAxes
171 struct. This is used for allocating buffers, not bounds checking, since
172 there are usually less axes in practice. */
173static const size_t kMaxJoystickAxes = 12;
174static const size_t kMaxJoystickPOVs = 12;
175
176struct HALJoystickAxes {
177 uint16_t count;
178 int16_t axes[kMaxJoystickAxes];
179};
180
181struct HALJoystickPOVs {
182 uint16_t count;
183 int16_t povs[kMaxJoystickPOVs];
184};
185
186struct HALJoystickButtons {
187 uint32_t buttons;
188 uint8_t count;
189};
190
191struct HALJoystickDescriptor {
192 uint8_t isXbox;
193 uint8_t type;
194 char name[256];
195 uint8_t axisCount;
196 uint8_t axisTypes[kMaxJoystickAxes];
197 uint8_t buttonCount;
198 uint8_t povCount;
199};
200
201inline float intToFloat(int value)
202{
203 return (float)value;
204}
205
206inline int floatToInt(float value)
207{
208 return round(value);
209}
210
211extern "C"
212{
213 extern const uint32_t dio_kNumSystems;
214 extern const uint32_t solenoid_kNumDO7_0Elements;
215 extern const uint32_t interrupt_kNumSystems;
216 extern const uint32_t kSystemClockTicksPerMicrosecond;
217
218 void* getPort(uint8_t pin);
219 void* getPortWithModule(uint8_t module, uint8_t pin);
220 void freePort(void* port);
221 const char* getHALErrorMessage(int32_t code);
222
223 uint16_t getFPGAVersion(int32_t *status);
224 uint32_t getFPGARevision(int32_t *status);
Brian Silverman1a675112016-02-20 20:42:49 -0500225 uint64_t getFPGATime(int32_t *status);
Brian Silverman26e4e522015-12-17 01:56:40 -0500226
227 bool getFPGAButton(int32_t *status);
228
229 int HALSetErrorData(const char *errors, int errorsLength, int wait_ms);
Brian Silverman1a675112016-02-20 20:42:49 -0500230 int HALSendError(int isError, int32_t errorCode, int isLVCode,
231 const char *details, const char *location, const char *callStack,
232 int printMsg);
Brian Silverman26e4e522015-12-17 01:56:40 -0500233
234 int HALGetControlWord(HALControlWord *data);
235 int HALGetAllianceStation(enum HALAllianceStationID *allianceStation);
236 int HALGetJoystickAxes(uint8_t joystickNum, HALJoystickAxes *axes);
237 int HALGetJoystickPOVs(uint8_t joystickNum, HALJoystickPOVs *povs);
238 int HALGetJoystickButtons(uint8_t joystickNum, HALJoystickButtons *buttons);
239 int HALGetJoystickDescriptor(uint8_t joystickNum, HALJoystickDescriptor *desc);
240 int HALGetJoystickIsXbox(uint8_t joystickNum);
241 int HALGetJoystickType(uint8_t joystickNum);
242 char* HALGetJoystickName(uint8_t joystickNum);
243 int HALGetJoystickAxisType(uint8_t joystickNum, uint8_t axis);
244 int HALSetJoystickOutputs(uint8_t joystickNum, uint32_t outputs, uint16_t leftRumble, uint16_t rightRumble);
245 int HALGetMatchTime(float *matchTime);
246
247 void HALSetNewDataSem(MULTIWAIT_ID sem);
248
249 bool HALGetSystemActive(int32_t *status);
250 bool HALGetBrownedOut(int32_t *status);
251
252 int HALInitialize(int mode = 0);
253 void HALNetworkCommunicationObserveUserProgramStarting();
254 void HALNetworkCommunicationObserveUserProgramDisabled();
255 void HALNetworkCommunicationObserveUserProgramAutonomous();
256 void HALNetworkCommunicationObserveUserProgramTeleop();
257 void HALNetworkCommunicationObserveUserProgramTest();
258
259 uint32_t HALReport(uint8_t resource, uint8_t instanceNumber, uint8_t context = 0,
260 const char *feature = NULL);
261}
262
263// TODO: HACKS for now...
264extern "C"
265{
266
267 void NumericArrayResize();
268 void RTSetCleanupProc();
269 void EDVR_CreateReference();
270 void Occur();
271}