Squashed 'third_party/allwpilib_2019/' content from commit bd05dfa1c
Change-Id: I2b1c2250cdb9b055133780c33593292098c375b7
git-subtree-dir: third_party/allwpilib_2019
git-subtree-split: bd05dfa1c7cca74c4fac451e7b9d6a37e7b53447
diff --git a/hal/src/test/java/edu/wpi/first/hal/sim/AccelerometerSimTest.java b/hal/src/test/java/edu/wpi/first/hal/sim/AccelerometerSimTest.java
new file mode 100644
index 0000000..383165c
--- /dev/null
+++ b/hal/src/test/java/edu/wpi/first/hal/sim/AccelerometerSimTest.java
@@ -0,0 +1,42 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+package edu.wpi.first.hal.sim;
+
+import org.junit.jupiter.api.Test;
+
+import edu.wpi.first.hal.AccelerometerJNI;
+import edu.wpi.first.hal.HAL;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class AccelerometerSimTest {
+ static class TriggeredStore {
+ public boolean m_wasTriggered;
+ public boolean m_setValue = true;
+ }
+
+ @Test
+ void testCallbacks() {
+ HAL.initialize(500, 0);
+ AccelerometerSim sim = new AccelerometerSim();
+ sim.resetData();
+
+ TriggeredStore store = new TriggeredStore();
+
+ try (CallbackStore cb = sim.registerActiveCallback((s, v) -> {
+ store.m_wasTriggered = true;
+ store.m_setValue = v.getBoolean();
+ }, false)) {
+ assertFalse(store.m_wasTriggered);
+ AccelerometerJNI.setAccelerometerActive(true);
+ assertTrue(store.m_wasTriggered);
+ assertTrue(store.m_setValue);
+ }
+ }
+}
diff --git a/hal/src/test/native/cpp/HALTests.cpp b/hal/src/test/native/cpp/HALTests.cpp
new file mode 100644
index 0000000..b387c14
--- /dev/null
+++ b/hal/src/test/native/cpp/HALTests.cpp
@@ -0,0 +1,22 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/Solenoid.h"
+
+namespace hal {
+TEST(HALTests, RuntimeType) {
+ EXPECT_EQ(HAL_RuntimeType::HAL_Mock, HAL_GetRuntimeType());
+}
+
+TEST(HALSOLENOID, SolenoidTest) {
+ int32_t status = 0;
+ HAL_InitializeSolenoidPort(0, &status);
+ EXPECT_NE(status, 0);
+}
+} // namespace hal
diff --git a/hal/src/test/native/cpp/can/CANTest.cpp b/hal/src/test/native/cpp/can/CANTest.cpp
new file mode 100644
index 0000000..6f5549c
--- /dev/null
+++ b/hal/src/test/native/cpp/can/CANTest.cpp
@@ -0,0 +1,83 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/CANAPI.h"
+#include "hal/HAL.h"
+#include "mockdata/CanData.h"
+
+namespace hal {
+struct CANTestStore {
+ CANTestStore(int32_t deviceId, int32_t* status) {
+ this->deviceId = deviceId;
+ handle = HAL_InitializeCAN(
+ HAL_CANManufacturer::HAL_CAN_Man_kTeamUse, deviceId,
+ HAL_CANDeviceType::HAL_CAN_Dev_kMiscellaneous, status);
+ }
+
+ ~CANTestStore() {
+ if (handle != HAL_kInvalidHandle) {
+ HAL_CleanCAN(handle);
+ }
+ }
+
+ int32_t deviceId;
+ HAL_CANHandle handle;
+};
+
+struct CANReceiveCallbackStore {
+ explicit CANReceiveCallbackStore(int32_t handle) { this->handle = handle; }
+ ~CANReceiveCallbackStore() { HALSIM_CancelCanReceiveMessageCallback(handle); }
+ int32_t handle;
+};
+
+struct CANSendCallbackStore {
+ explicit CANSendCallbackStore(int32_t handle) { this->handle = handle; }
+ ~CANSendCallbackStore() { HALSIM_CancelCanSendMessageCallback(handle); }
+ int32_t handle;
+};
+
+TEST(HALCanTests, CanIdPackingTest) {
+ int32_t status = 0;
+ int32_t deviceId = 12;
+ CANTestStore testStore(deviceId, &status);
+ ASSERT_EQ(0, status);
+
+ std::pair<int32_t, bool> storePair;
+ storePair.second = false;
+
+ auto cbHandle = HALSIM_RegisterCanSendMessageCallback(
+ [](const char* name, void* param, uint32_t messageID, const uint8_t* data,
+ uint8_t dataSize, int32_t periodMs, int32_t* status) {
+ std::pair<int32_t, bool>* paramI =
+ reinterpret_cast<std::pair<int32_t, bool>*>(param);
+ paramI->first = messageID;
+ paramI->second = true;
+ },
+ &storePair);
+
+ CANSendCallbackStore cbStore(cbHandle);
+ uint8_t data[8];
+
+ int32_t apiId = 42;
+
+ HAL_WriteCANPacket(testStore.handle, data, 8, 42, &status);
+
+ ASSERT_EQ(0, status);
+
+ ASSERT_TRUE(storePair.second);
+
+ ASSERT_NE(0, storePair.first);
+
+ ASSERT_EQ(deviceId, storePair.first & 0x3F);
+ ASSERT_EQ(apiId, (storePair.first & 0x0000FFC0) >> 6);
+ ASSERT_EQ(static_cast<int32_t>(HAL_CANManufacturer::HAL_CAN_Man_kTeamUse),
+ (storePair.first & 0x00FF0000) >> 16);
+ ASSERT_EQ(static_cast<int32_t>(HAL_CANDeviceType::HAL_CAN_Dev_kMiscellaneous),
+ (storePair.first & 0x1F000000) >> 24);
+}
+} // namespace hal
diff --git a/hal/src/test/native/cpp/handles/HandleTests.cpp b/hal/src/test/native/cpp/handles/HandleTests.cpp
new file mode 100644
index 0000000..e893c78
--- /dev/null
+++ b/hal/src/test/native/cpp/handles/HandleTests.cpp
@@ -0,0 +1,28 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/handles/IndexedClassedHandleResource.h"
+
+#define HAL_TestHandle HAL_Handle
+
+namespace {
+class MyTestClass {};
+} // namespace
+
+namespace hal {
+TEST(HandleTests, ClassedHandleTest) {
+ hal::IndexedClassedHandleResource<HAL_TestHandle, MyTestClass, 8,
+ HAL_HandleEnum::Vendor>
+ testClass;
+ int32_t status = 0;
+ testClass.Allocate(0, std::make_unique<MyTestClass>(), &status);
+ EXPECT_EQ(0, status);
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/main.cpp b/hal/src/test/native/cpp/main.cpp
new file mode 100644
index 0000000..33990f0
--- /dev/null
+++ b/hal/src/test/native/cpp/main.cpp
@@ -0,0 +1,16 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+
+int main(int argc, char** argv) {
+ HAL_Initialize(500, 0);
+ ::testing::InitGoogleTest(&argc, argv);
+ int ret = RUN_ALL_TESTS();
+ return ret;
+}
diff --git a/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp b/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp
new file mode 100644
index 0000000..791be79
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/AnalogInDataTests.cpp
@@ -0,0 +1,80 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/AnalogInput.h"
+#include "hal/HAL.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/AnalogInData.h"
+
+namespace hal {
+
+std::string gTestAnalogInCallbackName;
+HAL_Value gTestAnalogInCallbackValue;
+
+void TestAnalogInInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestAnalogInCallbackName = name;
+ gTestAnalogInCallbackValue = *value;
+}
+
+TEST(AnalogInSimTests, TestAnalogInInitialization) {
+ const int INDEX_TO_TEST = 1;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterAnalogInInitializedCallback(
+ INDEX_TO_TEST, &TestAnalogInInitializationCallback, &callbackParam,
+ false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+ HAL_PortHandle portHandle;
+ HAL_DigitalHandle analogInHandle;
+
+ // Use out of range index
+ status = 0;
+ portHandle = 8000;
+ gTestAnalogInCallbackName = "Unset";
+ analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, analogInHandle);
+ EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status);
+ EXPECT_STREQ("Unset", gTestAnalogInCallbackName.c_str());
+
+ // Successful setup
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestAnalogInCallbackName = "Unset";
+ analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != analogInHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestAnalogInCallbackName.c_str());
+
+ // Double initialize... should fail
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestAnalogInCallbackName = "Unset";
+ analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, analogInHandle);
+ EXPECT_EQ(RESOURCE_IS_ALLOCATED, status);
+ EXPECT_STREQ("Unset", gTestAnalogInCallbackName.c_str());
+
+ // Reset, should allow you to re-register
+ hal::HandleBase::ResetGlobalHandles();
+ HALSIM_ResetAnalogInData(INDEX_TO_TEST);
+ callbackId = HALSIM_RegisterAnalogInInitializedCallback(
+ INDEX_TO_TEST, &TestAnalogInInitializationCallback, &callbackParam,
+ false);
+
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestAnalogInCallbackName = "Unset";
+ analogInHandle = HAL_InitializeAnalogInputPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != analogInHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestAnalogInCallbackName.c_str());
+}
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp b/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp
new file mode 100644
index 0000000..8f6d6f0
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/AnalogOutDataTests.cpp
@@ -0,0 +1,80 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/AnalogOutput.h"
+#include "hal/HAL.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/AnalogOutData.h"
+
+namespace hal {
+
+std::string gTestAnalogOutCallbackName;
+HAL_Value gTestAnalogOutCallbackValue;
+
+void TestAnalogOutInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestAnalogOutCallbackName = name;
+ gTestAnalogOutCallbackValue = *value;
+}
+
+TEST(AnalogOutSimTests, TestAnalogOutInitialization) {
+ const int INDEX_TO_TEST = 1;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterAnalogOutInitializedCallback(
+ INDEX_TO_TEST, &TestAnalogOutInitializationCallback, &callbackParam,
+ false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+ HAL_PortHandle portHandle;
+ HAL_DigitalHandle analogOutHandle;
+
+ // Use out of range index
+ status = 0;
+ portHandle = 8000;
+ gTestAnalogOutCallbackName = "Unset";
+ analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, analogOutHandle);
+ EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status);
+ EXPECT_STREQ("Unset", gTestAnalogOutCallbackName.c_str());
+
+ // Successful setup
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestAnalogOutCallbackName = "Unset";
+ analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != analogOutHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestAnalogOutCallbackName.c_str());
+
+ // Double initialize... should fail
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestAnalogOutCallbackName = "Unset";
+ analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, analogOutHandle);
+ EXPECT_EQ(RESOURCE_IS_ALLOCATED, status);
+ EXPECT_STREQ("Unset", gTestAnalogOutCallbackName.c_str());
+
+ // Reset, should allow you to re-register
+ hal::HandleBase::ResetGlobalHandles();
+ HALSIM_ResetAnalogOutData(INDEX_TO_TEST);
+ callbackId = HALSIM_RegisterAnalogOutInitializedCallback(
+ INDEX_TO_TEST, &TestAnalogOutInitializationCallback, &callbackParam,
+ false);
+
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestAnalogOutCallbackName = "Unset";
+ analogOutHandle = HAL_InitializeAnalogOutputPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != analogOutHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestAnalogOutCallbackName.c_str());
+}
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/DIODataTests.cpp b/hal/src/test/native/cpp/mockdata/DIODataTests.cpp
new file mode 100644
index 0000000..19fe994
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/DIODataTests.cpp
@@ -0,0 +1,81 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/DIO.h"
+#include "hal/HAL.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/DIOData.h"
+
+namespace hal {
+
+std::string gTestDigitalIoCallbackName;
+HAL_Value gTestDigitalIoCallbackValue;
+
+void TestDigitalIoInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestDigitalIoCallbackName = name;
+ gTestDigitalIoCallbackValue = *value;
+}
+
+TEST(DigitalIoSimTests, TestDigitalIoInitialization) {
+ const int INDEX_TO_TEST = 3;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterDIOInitializedCallback(
+ INDEX_TO_TEST, &TestDigitalIoInitializationCallback, &callbackParam,
+ false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+ HAL_PortHandle portHandle;
+ HAL_DigitalHandle digitalIoHandle;
+
+ // Use out of range index
+ status = 0;
+ portHandle = 8000;
+ gTestDigitalIoCallbackName = "Unset";
+ digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, digitalIoHandle);
+ EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status);
+ EXPECT_STREQ("Unset", gTestDigitalIoCallbackName.c_str());
+
+ // Successful setup
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestDigitalIoCallbackName = "Unset";
+ digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != digitalIoHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestDigitalIoCallbackName.c_str());
+
+ // Double initialize... should fail
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestDigitalIoCallbackName = "Unset";
+ digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, digitalIoHandle);
+ EXPECT_EQ(RESOURCE_IS_ALLOCATED, status);
+ EXPECT_STREQ("Unset", gTestDigitalIoCallbackName.c_str());
+
+ // Reset, should allow you to re-register
+ hal::HandleBase::ResetGlobalHandles();
+ HALSIM_ResetDIOData(INDEX_TO_TEST);
+ callbackId = HALSIM_RegisterDIOInitializedCallback(
+ INDEX_TO_TEST, &TestDigitalIoInitializationCallback, &callbackParam,
+ false);
+
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestDigitalIoCallbackName = "Unset";
+ digitalIoHandle = HAL_InitializeDIOPort(portHandle, true, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != digitalIoHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestDigitalIoCallbackName.c_str());
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp b/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp
new file mode 100644
index 0000000..35c0d54
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/DriverStationDataTests.cpp
@@ -0,0 +1,143 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include <cstring>
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/Solenoid.h"
+#include "mockdata/DriverStationData.h"
+
+namespace hal {
+
+TEST(DriverStationTests, JoystickTests) {
+ HAL_JoystickAxes axes;
+ HAL_JoystickPOVs povs;
+ HAL_JoystickButtons buttons;
+
+ // Check default values before anything has been set
+ for (int joystickNum = 0; joystickNum < 6; ++joystickNum) {
+ HAL_GetJoystickAxes(joystickNum, &axes);
+ HAL_GetJoystickPOVs(joystickNum, &povs);
+ HAL_GetJoystickButtons(joystickNum, &buttons);
+
+ EXPECT_EQ(0, axes.count);
+ for (int i = 0; i < HAL_kMaxJoystickAxes; ++i) {
+ EXPECT_EQ(0, axes.axes[i]);
+ }
+
+ EXPECT_EQ(0, povs.count);
+ for (int i = 0; i < HAL_kMaxJoystickPOVs; ++i) {
+ EXPECT_EQ(0, povs.povs[i]);
+ }
+
+ EXPECT_EQ(0, buttons.count);
+ EXPECT_EQ(0u, buttons.buttons);
+ }
+
+ HAL_JoystickAxes set_axes;
+ std::memset(&set_axes, 0, sizeof(HAL_JoystickAxes));
+ HAL_JoystickPOVs set_povs;
+ std::memset(&set_povs, 0, sizeof(HAL_JoystickPOVs));
+ HAL_JoystickButtons set_buttons;
+ std::memset(&set_buttons, 0, sizeof(HAL_JoystickButtons));
+
+ // Set values
+ int joystickUnderTest = 4;
+ set_axes.count = 5;
+ for (int i = 0; i < set_axes.count; ++i) {
+ set_axes.axes[i] = i * .125;
+ }
+
+ set_povs.count = 3;
+ for (int i = 0; i < set_povs.count; ++i) {
+ set_povs.povs[i] = i * 15 + 12;
+ }
+
+ set_buttons.count = 8;
+ set_buttons.buttons = 0xDEADBEEF;
+
+ HALSIM_SetJoystickAxes(joystickUnderTest, &set_axes);
+ HALSIM_SetJoystickPOVs(joystickUnderTest, &set_povs);
+ HALSIM_SetJoystickButtons(joystickUnderTest, &set_buttons);
+
+ // Check the set values
+ HAL_GetJoystickAxes(joystickUnderTest, &axes);
+ HAL_GetJoystickPOVs(joystickUnderTest, &povs);
+ HAL_GetJoystickButtons(joystickUnderTest, &buttons);
+
+ EXPECT_EQ(5, axes.count);
+ EXPECT_NEAR(0.000, axes.axes[0], 0.000001);
+ EXPECT_NEAR(0.125, axes.axes[1], 0.000001);
+ EXPECT_NEAR(0.250, axes.axes[2], 0.000001);
+ EXPECT_NEAR(0.375, axes.axes[3], 0.000001);
+ EXPECT_NEAR(0.500, axes.axes[4], 0.000001);
+ EXPECT_NEAR(0, axes.axes[5], 0.000001); // Should not have been set, still 0
+ EXPECT_NEAR(0, axes.axes[6], 0.000001); // Should not have been set, still 0
+
+ EXPECT_EQ(3, povs.count);
+ EXPECT_EQ(12, povs.povs[0]);
+ EXPECT_EQ(27, povs.povs[1]);
+ EXPECT_EQ(42, povs.povs[2]);
+ EXPECT_EQ(0, povs.povs[3]); // Should not have been set, still 0
+ EXPECT_EQ(0, povs.povs[4]); // Should not have been set, still 0
+ EXPECT_EQ(0, povs.povs[5]); // Should not have been set, still 0
+ EXPECT_EQ(0, povs.povs[6]); // Should not have been set, still 0
+
+ EXPECT_EQ(8, buttons.count);
+ EXPECT_EQ(0xDEADBEEFu, buttons.buttons);
+
+ // Reset
+ HALSIM_ResetDriverStationData();
+ for (int joystickNum = 0; joystickNum < 6; ++joystickNum) {
+ HAL_GetJoystickAxes(joystickNum, &axes);
+ HAL_GetJoystickPOVs(joystickNum, &povs);
+ HAL_GetJoystickButtons(joystickNum, &buttons);
+
+ EXPECT_EQ(0, axes.count);
+ for (int i = 0; i < HAL_kMaxJoystickAxes; ++i) {
+ EXPECT_EQ(0, axes.axes[i]);
+ }
+
+ EXPECT_EQ(0, povs.count);
+ for (int i = 0; i < HAL_kMaxJoystickPOVs; ++i) {
+ EXPECT_EQ(0, povs.povs[i]);
+ }
+
+ EXPECT_EQ(0, buttons.count);
+ EXPECT_EQ(0u, buttons.buttons);
+ }
+}
+
+TEST(DriverStationTests, EventInfoTest) {
+ std::string eventName = "UnitTest";
+ std::string gameData = "Insert game specific info here :D";
+ HAL_MatchInfo info;
+ std::snprintf(info.eventName, sizeof(info.eventName), "%s",
+ eventName.c_str());
+ std::snprintf(reinterpret_cast<char*>(info.gameSpecificMessage),
+ sizeof(info.gameSpecificMessage), "%s", gameData.c_str());
+ info.gameSpecificMessageSize = gameData.size();
+ info.matchNumber = 5;
+ info.matchType = HAL_MatchType::HAL_kMatchType_qualification;
+ info.replayNumber = 42;
+ HALSIM_SetMatchInfo(&info);
+
+ HAL_MatchInfo dataBack;
+ HAL_GetMatchInfo(&dataBack);
+
+ std::string gsm{reinterpret_cast<char*>(dataBack.gameSpecificMessage),
+ dataBack.gameSpecificMessageSize};
+
+ EXPECT_STREQ(eventName.c_str(), dataBack.eventName);
+ EXPECT_EQ(gameData, gsm);
+ EXPECT_EQ(5, dataBack.matchNumber);
+ EXPECT_EQ(HAL_MatchType::HAL_kMatchType_qualification, dataBack.matchType);
+ EXPECT_EQ(42, dataBack.replayNumber);
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp b/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp
new file mode 100644
index 0000000..3a8e01c
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/I2CDataTests.cpp
@@ -0,0 +1,43 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/I2C.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/I2CData.h"
+
+namespace hal {
+
+std::string gTestI2CCallbackName;
+HAL_Value gTestI2CCallbackValue;
+
+void TestI2CInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestI2CCallbackName = name;
+ gTestI2CCallbackValue = *value;
+}
+
+TEST(I2CSimTests, TestI2CInitialization) {
+ const int INDEX_TO_TEST = 1;
+
+ int32_t status;
+ HAL_I2CPort port;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterI2CInitializedCallback(
+ INDEX_TO_TEST, &TestI2CInitializationCallback, &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ status = 0;
+ port = HAL_I2C_kMXP;
+ gTestI2CCallbackName = "Unset";
+ HAL_InitializeI2C(port, &status);
+ EXPECT_STREQ("Initialized", gTestI2CCallbackName.c_str());
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp b/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp
new file mode 100644
index 0000000..50a8ae3
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/PCMDataTests.cpp
@@ -0,0 +1,83 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/Solenoid.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/PCMData.h"
+
+namespace hal {
+
+std::string gTestSolenoidCallbackName;
+HAL_Value gTestSolenoidCallbackValue;
+
+void TestSolenoidInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestSolenoidCallbackName = name;
+ gTestSolenoidCallbackValue = *value;
+}
+
+TEST(SolenoidSimTests, TestSolenoidInitialization) {
+ const int MODULE_TO_TEST = 2;
+ const int CHANNEL_TO_TEST = 3;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterPCMSolenoidInitializedCallback(
+ MODULE_TO_TEST, CHANNEL_TO_TEST, &TestSolenoidInitializationCallback,
+ &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+ HAL_PortHandle portHandle;
+ HAL_DigitalHandle solenoidHandle;
+
+ // Use out of range index
+ status = 0;
+ portHandle = 8000;
+ gTestSolenoidCallbackName = "Unset";
+ solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, solenoidHandle);
+ EXPECT_EQ(HAL_HANDLE_ERROR, status);
+ EXPECT_STREQ("Unset", gTestSolenoidCallbackName.c_str());
+
+ // Successful setup
+ status = 0;
+ portHandle = HAL_GetPortWithModule(MODULE_TO_TEST, CHANNEL_TO_TEST);
+ gTestSolenoidCallbackName = "Unset";
+ solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != solenoidHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("SolenoidInitialized", gTestSolenoidCallbackName.c_str());
+
+ // Double initialize... should fail
+ status = 0;
+ portHandle = HAL_GetPortWithModule(MODULE_TO_TEST, CHANNEL_TO_TEST);
+ gTestSolenoidCallbackName = "Unset";
+ solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, solenoidHandle);
+ EXPECT_EQ(NO_AVAILABLE_RESOURCES, status);
+ EXPECT_STREQ("Unset", gTestSolenoidCallbackName.c_str());
+
+ // Reset, should allow you to re-register
+ hal::HandleBase::ResetGlobalHandles();
+ HALSIM_ResetPCMData(MODULE_TO_TEST);
+ callbackId = HALSIM_RegisterPCMSolenoidInitializedCallback(
+ MODULE_TO_TEST, CHANNEL_TO_TEST, &TestSolenoidInitializationCallback,
+ &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ status = 0;
+ portHandle = HAL_GetPortWithModule(MODULE_TO_TEST, CHANNEL_TO_TEST);
+ gTestSolenoidCallbackName = "Unset";
+ solenoidHandle = HAL_InitializeSolenoidPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != solenoidHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("SolenoidInitialized", gTestSolenoidCallbackName.c_str());
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp b/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp
new file mode 100644
index 0000000..a46454f
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/PDPDataTests.cpp
@@ -0,0 +1,43 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/PDP.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/PDPData.h"
+
+namespace hal {
+
+std::string gTestPdpCallbackName;
+HAL_Value gTestPdpCallbackValue;
+
+void TestPdpInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestPdpCallbackName = name;
+ gTestPdpCallbackValue = *value;
+}
+
+TEST(PdpSimTests, TestPdpInitialization) {
+ const int INDEX_TO_TEST = 1;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterPDPInitializedCallback(
+ INDEX_TO_TEST, &TestPdpInitializationCallback, &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+
+ // Use out of range index
+ status = 0;
+ gTestPdpCallbackName = "Unset";
+ HAL_InitializePDP(INDEX_TO_TEST, &status);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestPdpCallbackName.c_str());
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp b/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp
new file mode 100644
index 0000000..447a510
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/PWMDataTests.cpp
@@ -0,0 +1,78 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/PWM.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/PWMData.h"
+
+namespace hal {
+
+std::string gTestPwmCallbackName;
+HAL_Value gTestPwmCallbackValue;
+
+void TestPwmInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestPwmCallbackName = name;
+ gTestPwmCallbackValue = *value;
+}
+
+TEST(PWMSimTests, TestPwmInitialization) {
+ const int INDEX_TO_TEST = 7;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterPWMInitializedCallback(
+ INDEX_TO_TEST, &TestPwmInitializationCallback, &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+ HAL_PortHandle portHandle;
+ HAL_DigitalHandle pwmHandle;
+
+ // Use out of range index
+ status = 0;
+ portHandle = 8000;
+ gTestPwmCallbackName = "Unset";
+ pwmHandle = HAL_InitializePWMPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, pwmHandle);
+ EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status);
+ EXPECT_STREQ("Unset", gTestPwmCallbackName.c_str());
+
+ // Successful setup
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestPwmCallbackName = "Unset";
+ pwmHandle = HAL_InitializePWMPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != pwmHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestPwmCallbackName.c_str());
+
+ // Double initialize... should fail
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestPwmCallbackName = "Unset";
+ pwmHandle = HAL_InitializePWMPort(portHandle, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, pwmHandle);
+ EXPECT_EQ(RESOURCE_IS_ALLOCATED, status);
+ EXPECT_STREQ("Unset", gTestPwmCallbackName.c_str());
+
+ // Reset, should allow you to re-register
+ hal::HandleBase::ResetGlobalHandles();
+ HALSIM_ResetPWMData(INDEX_TO_TEST);
+ callbackId = HALSIM_RegisterPWMInitializedCallback(
+ INDEX_TO_TEST, &TestPwmInitializationCallback, &callbackParam, false);
+
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestPwmCallbackName = "Unset";
+ pwmHandle = HAL_InitializePWMPort(portHandle, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != pwmHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("Initialized", gTestPwmCallbackName.c_str());
+}
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp b/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp
new file mode 100644
index 0000000..408657a
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/RelayDataTests.cpp
@@ -0,0 +1,79 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/Relay.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/RelayData.h"
+
+namespace hal {
+
+std::string gTestRelayCallbackName;
+HAL_Value gTestRelayCallbackValue;
+
+void TestRelayInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestRelayCallbackName = name;
+ gTestRelayCallbackValue = *value;
+}
+
+TEST(RelaySimTests, TestRelayInitialization) {
+ const int INDEX_TO_TEST = 3;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterRelayInitializedForwardCallback(
+ INDEX_TO_TEST, &TestRelayInitializationCallback, &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ int32_t status;
+ HAL_PortHandle portHandle;
+ HAL_DigitalHandle pdpHandle;
+
+ // Use out of range index
+ status = 0;
+ portHandle = 8000;
+ gTestRelayCallbackName = "Unset";
+ pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, pdpHandle);
+ EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status);
+ EXPECT_STREQ("Unset", gTestRelayCallbackName.c_str());
+
+ // Successful setup
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestRelayCallbackName = "Unset";
+ pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != pdpHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("InitializedForward", gTestRelayCallbackName.c_str());
+
+ // Double initialize... should fail
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestRelayCallbackName = "Unset";
+ pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status);
+ EXPECT_EQ(HAL_kInvalidHandle, pdpHandle);
+ EXPECT_EQ(RESOURCE_IS_ALLOCATED, status);
+ EXPECT_STREQ("Unset", gTestRelayCallbackName.c_str());
+
+ // Reset, should allow you to re-register
+ hal::HandleBase::ResetGlobalHandles();
+ HALSIM_ResetRelayData(INDEX_TO_TEST);
+ callbackId = HALSIM_RegisterRelayInitializedForwardCallback(
+ INDEX_TO_TEST, &TestRelayInitializationCallback, &callbackParam, false);
+
+ status = 0;
+ portHandle = HAL_GetPort(INDEX_TO_TEST);
+ gTestRelayCallbackName = "Unset";
+ pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status);
+ EXPECT_TRUE(HAL_kInvalidHandle != pdpHandle);
+ EXPECT_EQ(0, status);
+ EXPECT_STREQ("InitializedForward", gTestRelayCallbackName.c_str());
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp b/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp
new file mode 100644
index 0000000..64c8555
--- /dev/null
+++ b/hal/src/test/native/cpp/mockdata/SPIDataTests.cpp
@@ -0,0 +1,43 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2015-2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "hal/SPI.h"
+#include "hal/handles/HandlesInternal.h"
+#include "mockdata/SPIData.h"
+
+namespace hal {
+
+std::string gTestSpiCallbackName;
+HAL_Value gTestSpiCallbackValue;
+
+void TestSpiInitializationCallback(const char* name, void* param,
+ const struct HAL_Value* value) {
+ gTestSpiCallbackName = name;
+ gTestSpiCallbackValue = *value;
+}
+
+TEST(SpiSimTests, TestSpiInitialization) {
+ const int INDEX_TO_TEST = 2;
+
+ int32_t status;
+ HAL_SPIPort port;
+
+ int callbackParam = 0;
+ int callbackId = HALSIM_RegisterSPIInitializedCallback(
+ INDEX_TO_TEST, &TestSpiInitializationCallback, &callbackParam, false);
+ ASSERT_TRUE(0 != callbackId);
+
+ status = 0;
+ port = HAL_SPI_kOnboardCS2;
+ gTestSpiCallbackName = "Unset";
+ HAL_InitializeSPI(port, &status);
+ EXPECT_STREQ("Initialized", gTestSpiCallbackName.c_str());
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/sim/AccelerometerSimTest.cpp b/hal/src/test/native/cpp/sim/AccelerometerSimTest.cpp
new file mode 100644
index 0000000..54be6e3
--- /dev/null
+++ b/hal/src/test/native/cpp/sim/AccelerometerSimTest.cpp
@@ -0,0 +1,42 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/Accelerometer.h"
+#include "hal/HAL.h"
+#include "simulation/AccelerometerSim.h"
+
+using namespace frc::sim;
+
+namespace hal {
+
+TEST(AcclerometerSimTests, TestActiveCallback) {
+ HAL_Initialize(500, 0);
+
+ AccelerometerSim sim{0};
+
+ sim.ResetData();
+
+ bool wasTriggered = false;
+ bool lastValue = false;
+
+ auto cb = sim.RegisterActiveCallback(
+ [&](wpi::StringRef name, const HAL_Value* value) {
+ wasTriggered = true;
+ lastValue = value->data.v_boolean;
+ },
+ false);
+
+ EXPECT_FALSE(wasTriggered);
+
+ HAL_SetAccelerometerActive(true);
+
+ EXPECT_TRUE(wasTriggered);
+ EXPECT_TRUE(lastValue);
+}
+
+} // namespace hal
diff --git a/hal/src/test/native/cpp/sim/SimInitializationTest.cpp b/hal/src/test/native/cpp/sim/SimInitializationTest.cpp
new file mode 100644
index 0000000..fdd34cd
--- /dev/null
+++ b/hal/src/test/native/cpp/sim/SimInitializationTest.cpp
@@ -0,0 +1,49 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) 2018 FIRST. All Rights Reserved. */
+/* Open Source Software - may be modified and shared by FRC teams. The code */
+/* must be accompanied by the FIRST BSD license file in the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#include "gtest/gtest.h"
+#include "hal/HAL.h"
+#include "simulation/AccelerometerSim.h"
+#include "simulation/AnalogGyroSim.h"
+#include "simulation/AnalogInSim.h"
+#include "simulation/AnalogOutSim.h"
+#include "simulation/AnalogTriggerSim.h"
+#include "simulation/DIOSim.h"
+#include "simulation/DigitalPWMSim.h"
+#include "simulation/DriverStationSim.h"
+#include "simulation/EncoderSim.h"
+#include "simulation/PCMSim.h"
+#include "simulation/PDPSim.h"
+#include "simulation/PWMSim.h"
+#include "simulation/RelaySim.h"
+#include "simulation/RoboRioSim.h"
+#include "simulation/SPIAccelerometerSim.h"
+
+using namespace frc::sim;
+
+namespace hal {
+
+TEST(SimInitializationTests, TestAllInitialize) {
+ HAL_Initialize(500, 0);
+ AccelerometerSim acsim{0};
+ AnalogGyroSim agsim{0};
+ AnalogInSim aisim{0};
+ AnalogOutSim aosim{0};
+ AnalogTriggerSim atsim{0};
+ DigitalPWMSim dpsim{0};
+ DIOSim diosim{0};
+ DriverStationSim dssim;
+ (void)dssim;
+ EncoderSim esim{0};
+ PCMSim pcmsim{0};
+ PDPSim pdpsim{0};
+ PWMSim pwmsim{0};
+ RelaySim rsim{0};
+ RoboRioSim rrsim{0};
+ SPIAccelerometerSim sasim{0};
+}
+} // namespace hal