WPILibC++ 2027.0.0-alpha-4
Loading...
Searching...
No Matches
SimDevice.h
Go to the documentation of this file.
1// 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.
4
5#pragma once
6
7#include <stdint.h>
8
9#include "wpi/hal/Types.h"
10#include "wpi/hal/Value.h"
11
12/**
13 * @defgroup hal_simdevice Simulator Device Framework
14 * @ingroup hal_capi
15 * HAL Simulator Device Framework. This enables creating simulation-only
16 * variables for higher level device access. For example, a device such as
17 * a SPI gyro can expose angle and rate variables to enable direct access
18 * from simulation extensions or user test code instead of requiring that
19 * the SPI bit-level protocol be implemented in simulation code.
20 *
21 * @{
22 */
23
24/**
25 * Direction of a simulated value (from the perspective of user code).
26 */
28 HAL_SimValueInput = 0, /**< input to user code from the simulator */
29 HAL_SimValueOutput, /**< output from user code to the simulator */
30 HAL_SimValueBidir /**< bidirectional between user code and simulator */
31};
32
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37/**
38 * Creates a simulated device.
39 *
40 * The device name must be unique. 0 is returned if the device name already
41 * exists. If multiple instances of the same device are desired, recommend
42 * appending the instance/unique identifier in brackets to the base name,
43 * e.g. "device[1]".
44 *
45 * Using a device name of the form "Type:Name" will create a WebSockets node
46 * with a type value of "Type" and a device value of "Name"
47 *
48 * 0 is returned if not in simulation.
49 *
50 * @param name device name
51 * @return simulated device handle
52 */
54
55/**
56 * Frees a simulated device.
57 *
58 * This also allows the same device name to be used again.
59 * This also frees all the simulated values created on the device.
60 *
61 * @param handle simulated device handle
62 */
64
65/**
66 * Get the name of a simulated device
67 *
68 * @param handle simulated device handle
69 * @return name of the simulated device
70 */
72
73/**
74 * Creates a value on a simulated device.
75 *
76 * Returns 0 if not in simulation; this can be used to avoid calls
77 * to Set/Get functions.
78 *
79 * @param device simulated device handle
80 * @param name value name
81 * @param direction input/output/bidir (from perspective of user code)
82 * @param initialValue initial value
83 * @return simulated value handle
84 */
86 const char* name, int32_t direction,
87 const struct HAL_Value* initialValue);
88
89/**
90 * Creates an int value on a simulated device.
91 *
92 * Returns 0 if not in simulation; this can be used to avoid calls
93 * to Set/Get functions.
94 *
95 * @param device simulated device handle
96 * @param name value name
97 * @param direction input/output/bidir (from perspective of user code)
98 * @param initialValue initial value
99 * @return simulated value handle
100 */
102 const char* name,
103 int32_t direction,
104 int32_t initialValue) {
105 struct HAL_Value v = HAL_MakeInt(initialValue);
106 return HAL_CreateSimValue(device, name, direction, &v);
107}
108
109/**
110 * Creates a long value on a simulated device.
111 *
112 * Returns 0 if not in simulation; this can be used to avoid calls
113 * to Set/Get functions.
114 *
115 * @param device simulated device handle
116 * @param name value name
117 * @param direction input/output/bidir (from perspective of user code)
118 * @param initialValue initial value
119 * @return simulated value handle
120 */
122 const char* name,
123 int32_t direction,
124 int64_t initialValue) {
125 struct HAL_Value v = HAL_MakeLong(initialValue);
126 return HAL_CreateSimValue(device, name, direction, &v);
127}
128
129/**
130 * Creates a double value on a simulated device.
131 *
132 * Returns 0 if not in simulation; this can be used to avoid calls
133 * to Set/Get functions.
134 *
135 * @param device simulated device handle
136 * @param name value name
137 * @param direction input/output/bidir (from perspective of user code)
138 * @param initialValue initial value
139 * @return simulated value handle
140 */
142 const char* name,
143 int32_t direction,
144 double initialValue) {
145 struct HAL_Value v = HAL_MakeDouble(initialValue);
146 return HAL_CreateSimValue(device, name, direction, &v);
147}
148
149/**
150 * Creates an enumerated value on a simulated device.
151 *
152 * Enumerated values are always in the range 0 to numOptions-1.
153 *
154 * Returns 0 if not in simulation; this can be used to avoid calls
155 * to Set/Get functions.
156 *
157 * @param device simulated device handle
158 * @param name value name
159 * @param direction input/output/bidir (from perspective of user code)
160 * @param numOptions number of enumerated value options (length of options)
161 * @param options array of option descriptions
162 * @param initialValue initial value (selection)
163 * @return simulated value handle
164 */
166 const char* name, int32_t direction,
167 int32_t numOptions,
168 const char** options,
169 int32_t initialValue);
170
171/**
172 * Creates an enumerated value on a simulated device with double values.
173 *
174 * Enumerated values are always in the range 0 to numOptions-1.
175 *
176 * Returns 0 if not in simulation; this can be used to avoid calls
177 * to Set/Get functions.
178 *
179 * @param device simulated device handle
180 * @param name value name
181 * @param direction input/output/bidir (from perspective of user code)
182 * @param numOptions number of enumerated value options (length of options)
183 * @param options array of option descriptions
184 * @param optionValues array of option double values
185 * @param initialValue initial value (selection)
186 * @return simulated value handle
187 */
189 HAL_SimDeviceHandle device, const char* name, int32_t direction,
190 int32_t numOptions, const char** options, const double* optionValues,
191 int32_t initialValue);
192
193/**
194 * Creates a boolean value on a simulated device.
195 *
196 * Returns 0 if not in simulation; this can be used to avoid calls
197 * to Set/Get functions.
198 *
199 * @param device simulated device handle
200 * @param name value name
201 * @param direction input/output/bidir (from perspective of user code)
202 * @param initialValue initial value
203 * @return simulated value handle
204 */
206 const char* name,
207 int32_t direction,
208 HAL_Bool initialValue) {
209 struct HAL_Value v = HAL_MakeBoolean(initialValue);
210 return HAL_CreateSimValue(device, name, direction, &v);
211}
212
213/**
214 * Gets a simulated value.
215 *
216 * @param handle simulated value handle
217 * @param value value (output parameter)
218 */
219void HAL_GetSimValue(HAL_SimValueHandle handle, struct HAL_Value* value);
220
221/**
222 * Gets a simulated value (int).
223 *
224 * @param handle simulated value handle
225 * @return The current value
226 */
228 struct HAL_Value v;
229 HAL_GetSimValue(handle, &v);
230 return v.type == HAL_INT ? v.data.v_int : 0;
231}
232
233/**
234 * Gets a simulated value (long).
235 *
236 * @param handle simulated value handle
237 * @return The current value
238 */
240 struct HAL_Value v;
241 HAL_GetSimValue(handle, &v);
242 return v.type == HAL_LONG ? v.data.v_long : 0;
243}
244
245/**
246 * Gets a simulated value (double).
247 *
248 * @param handle simulated value handle
249 * @return The current value
250 */
252 struct HAL_Value v;
253 HAL_GetSimValue(handle, &v);
254 return v.type == HAL_DOUBLE ? v.data.v_double : 0.0;
255}
256
257/**
258 * Gets a simulated value (enum).
259 *
260 * @param handle simulated value handle
261 * @return The current value
262 */
264 struct HAL_Value v;
265 HAL_GetSimValue(handle, &v);
266 return v.type == HAL_ENUM ? v.data.v_enum : 0;
267}
268
269/**
270 * Gets a simulated value (boolean).
271 *
272 * @param handle simulated value handle
273 * @return The current value
274 */
276 struct HAL_Value v;
277 HAL_GetSimValue(handle, &v);
278 return v.type == HAL_BOOLEAN ? v.data.v_boolean : 0;
279}
280
281/**
282 * Sets a simulated value.
283 *
284 * @param handle simulated value handle
285 * @param value the value to set
286 */
287void HAL_SetSimValue(HAL_SimValueHandle handle, const struct HAL_Value* value);
288
289/**
290 * Sets a simulated value (int).
291 *
292 * @param handle simulated value handle
293 * @param value the value to set
294 */
295inline void HAL_SetSimValueInt(HAL_SimValueHandle handle, int value) {
296 struct HAL_Value v = HAL_MakeInt(value);
297 HAL_SetSimValue(handle, &v);
298}
299
300/**
301 * Sets a simulated value (long).
302 *
303 * @param handle simulated value handle
304 * @param value the value to set
305 */
306inline void HAL_SetSimValueLong(HAL_SimValueHandle handle, int64_t value) {
307 struct HAL_Value v = HAL_MakeLong(value);
308 HAL_SetSimValue(handle, &v);
309}
310
311/**
312 * Sets a simulated value (double).
313 *
314 * @param handle simulated value handle
315 * @param value the value to set
316 */
317inline void HAL_SetSimValueDouble(HAL_SimValueHandle handle, double value) {
318 struct HAL_Value v = HAL_MakeDouble(value);
319 HAL_SetSimValue(handle, &v);
320}
321
322/**
323 * Sets a simulated value (enum).
324 *
325 * @param handle simulated value handle
326 * @param value the value to set
327 */
328inline void HAL_SetSimValueEnum(HAL_SimValueHandle handle, int32_t value) {
329 struct HAL_Value v = HAL_MakeEnum(value);
330 HAL_SetSimValue(handle, &v);
331}
332
333/**
334 * Sets a simulated value (boolean).
335 *
336 * @param handle simulated value handle
337 * @param value the value to set
338 */
340 struct HAL_Value v = HAL_MakeBoolean(value);
341 HAL_SetSimValue(handle, &v);
342}
343
344/**
345 * Resets a simulated double or integral value to 0.
346 * Has no effect on other value types.
347 * Use this instead of Set(0) for resetting incremental sensor values like
348 * encoder counts or gyro accumulated angle to ensure correct behavior in a
349 * distributed system (e.g. WebSockets).
350 *
351 * @param handle simulated value handle
352 */
354
355/** @} */
356
357#ifdef __cplusplus
358} // extern "C"
359#endif
@ name
Definition base.h:690
HAL_SimValueHandle HAL_CreateSimValueEnumDouble(HAL_SimDeviceHandle device, const char *name, int32_t direction, int32_t numOptions, const char **options, const double *optionValues, int32_t initialValue)
Creates an enumerated value on a simulated device with double values.
HAL_SimValueHandle HAL_CreateSimValueInt(HAL_SimDeviceHandle device, const char *name, int32_t direction, int32_t initialValue)
Creates an int value on a simulated device.
Definition SimDevice.h:101
double HAL_GetSimValueDouble(HAL_SimValueHandle handle)
Gets a simulated value (double).
Definition SimDevice.h:251
HAL_SimValueHandle HAL_CreateSimValue(HAL_SimDeviceHandle device, const char *name, int32_t direction, const struct HAL_Value *initialValue)
Creates a value on a simulated device.
int32_t HAL_GetSimValueEnum(HAL_SimValueHandle handle)
Gets a simulated value (enum).
Definition SimDevice.h:263
HAL_SimValueHandle HAL_CreateSimValueBoolean(HAL_SimDeviceHandle device, const char *name, int32_t direction, HAL_Bool initialValue)
Creates a boolean value on a simulated device.
Definition SimDevice.h:205
void HAL_SetSimValueEnum(HAL_SimValueHandle handle, int32_t value)
Sets a simulated value (enum).
Definition SimDevice.h:328
void HAL_SetSimValueDouble(HAL_SimValueHandle handle, double value)
Sets a simulated value (double).
Definition SimDevice.h:317
void HAL_FreeSimDevice(HAL_SimDeviceHandle handle)
Frees a simulated device.
void HAL_SetSimValue(HAL_SimValueHandle handle, const struct HAL_Value *value)
Sets a simulated value.
void HAL_SetSimValueLong(HAL_SimValueHandle handle, int64_t value)
Sets a simulated value (long).
Definition SimDevice.h:306
HAL_SimDeviceHandle HAL_CreateSimDevice(const char *name)
Creates a simulated device.
HAL_SimValueHandle HAL_CreateSimValueEnum(HAL_SimDeviceHandle device, const char *name, int32_t direction, int32_t numOptions, const char **options, int32_t initialValue)
Creates an enumerated value on a simulated device.
HAL_SimValueHandle HAL_CreateSimValueDouble(HAL_SimDeviceHandle device, const char *name, int32_t direction, double initialValue)
Creates a double value on a simulated device.
Definition SimDevice.h:141
HAL_SimValueHandle HAL_CreateSimValueLong(HAL_SimDeviceHandle device, const char *name, int32_t direction, int64_t initialValue)
Creates a long value on a simulated device.
Definition SimDevice.h:121
void HAL_SetSimValueInt(HAL_SimValueHandle handle, int value)
Sets a simulated value (int).
Definition SimDevice.h:295
HAL_SimValueDirection
Direction of a simulated value (from the perspective of user code).
Definition SimDevice.h:27
HAL_Bool HAL_GetSimValueBoolean(HAL_SimValueHandle handle)
Gets a simulated value (boolean).
Definition SimDevice.h:275
void HAL_GetSimValue(HAL_SimValueHandle handle, struct HAL_Value *value)
Gets a simulated value.
int64_t HAL_GetSimValueLong(HAL_SimValueHandle handle)
Gets a simulated value (long).
Definition SimDevice.h:239
const char * HAL_GetSimDeviceName(HAL_SimDeviceHandle handle)
Get the name of a simulated device.
void HAL_SetSimValueBoolean(HAL_SimValueHandle handle, HAL_Bool value)
Sets a simulated value (boolean).
Definition SimDevice.h:339
int32_t HAL_GetSimValueInt(HAL_SimValueHandle handle)
Gets a simulated value (int).
Definition SimDevice.h:227
void HAL_ResetSimValue(HAL_SimValueHandle handle)
Resets a simulated double or integral value to 0.
@ HAL_SimValueBidir
bidirectional between user code and simulator
Definition SimDevice.h:30
@ HAL_SimValueOutput
output from user code to the simulator
Definition SimDevice.h:29
@ HAL_SimValueInput
input to user code from the simulator
Definition SimDevice.h:28
int32_t HAL_Bool
Definition Types.h:75
HAL_Handle HAL_SimDeviceHandle
Definition Types.h:53
#define HAL_ENUM(name)
Definition Types.h:90
HAL_Handle HAL_SimValueHandle
Definition Types.h:55
struct HAL_Value HAL_MakeBoolean(HAL_Bool v)
Build a HAL boolean value.
Definition Value.h:46
struct HAL_Value HAL_MakeDouble(double v)
Build a HAL double value.
Definition Value.h:98
struct HAL_Value HAL_MakeEnum(int v)
Build a HAL enum value.
Definition Value.h:59
struct HAL_Value HAL_MakeInt(int v)
Build a HAL int value.
Definition Value.h:72
struct HAL_Value HAL_MakeLong(int64_t v)
Build a HAL long value.
Definition Value.h:85
@ HAL_DOUBLE
Double.
Definition Value.h:16
@ HAL_LONG
Long.
Definition Value.h:22
@ HAL_BOOLEAN
Boolean.
Definition Value.h:14
@ HAL_INT
Int.
Definition Value.h:20
HAL Entry Value.
Definition Value.h:26
double v_double
Definition Value.h:32
union HAL_Value::@312327364243022352044307226257102247016122023071 data
int64_t v_long
Definition Value.h:31
HAL_Bool v_boolean
Definition Value.h:28
int32_t v_int
Definition Value.h:30
enum HAL_Type type
Definition Value.h:34
int32_t v_enum
Definition Value.h:29