diff --git a/hal/src/main/native/athena/HAL.cpp b/hal/src/main/native/athena/HAL.cpp index f239391b36..33dcc85d15 100644 --- a/hal/src/main/native/athena/HAL.cpp +++ b/hal/src/main/native/athena/HAL.cpp @@ -524,7 +524,7 @@ static bool killExistingProgram(int timeout, int mode) { return true; } -static void SetupNowRio(void) { +static bool SetupNowRio(void) { nFPGA::nRoboRIO_FPGANamespace::g_currentTargetClass = nLoadOut::getTargetClass(); @@ -534,13 +534,13 @@ static void SetupNowRio(void) { status = dladdr(reinterpret_cast(tHMB::create), &info); if (status == 0) { fmt::print(stderr, "Failed to call dladdr on chipobject {}\n", dlerror()); - return; + return false; } void* chipObjectLibrary = dlopen(info.dli_fname, RTLD_LAZY); if (chipObjectLibrary == nullptr) { fmt::print(stderr, "Failed to call dlopen on chipobject {}\n", dlerror()); - return; + return false; } std::unique_ptr hmb; @@ -548,9 +548,9 @@ static void SetupNowRio(void) { if (hmb == nullptr) { fmt::print(stderr, "Failed to open HMB on chipobject {}\n", status); dlclose(chipObjectLibrary); - return; + return false; } - wpi::impl::SetupNowRio(chipObjectLibrary, std::move(hmb)); + return wpi::impl::SetupNowRio(chipObjectLibrary, std::move(hmb)); } HAL_Bool HAL_Initialize(int32_t timeout, int32_t mode) { @@ -593,7 +593,9 @@ HAL_Bool HAL_Initialize(int32_t timeout, int32_t mode) { setNewDataSem(nullptr); }); - SetupNowRio(); + if (!SetupNowRio()) { + return false; + } int32_t status = 0; diff --git a/wpiutil/src/main/native/cpp/timestamp.cpp b/wpiutil/src/main/native/cpp/timestamp.cpp index c811964afd..dd76fb9c05 100644 --- a/wpiutil/src/main/native/cpp/timestamp.cpp +++ b/wpiutil/src/main/native/cpp/timestamp.cpp @@ -133,13 +133,15 @@ struct HMBLowLevel { dlcloseWrapper}; }; struct HMBHolder { - void Configure(void* col, std::unique_ptr hmbObject) { + bool Configure(void* col, std::unique_ptr hmbObject) { hmb = std::move(hmbObject); chipObjectLibrary.reset(col); if (!lowLevel.Configure(hmb->getSystemInterface()->getHandle())) { hmb = nullptr; chipObjectLibrary = nullptr; + return false; } + return true; } void Reset() { lowLevel.Reset(); @@ -236,20 +238,22 @@ void wpi::impl::SetupNowDefaultOnRio() { #ifdef __FRC_ROBORIO__ template <> -void wpi::impl::SetupNowRio(void* chipObjectLibrary, +bool wpi::impl::SetupNowRio(void* chipObjectLibrary, std::unique_ptr hmbObject) { if (!hmbInitialized.test()) { - hmb.Configure(chipObjectLibrary, std::move(hmbObject)); + return hmb.Configure(chipObjectLibrary, std::move(hmbObject)); } + return true; } #endif -void wpi::impl::SetupNowRio(uint32_t session) { +bool wpi::impl::SetupNowRio(uint32_t session) { #ifdef __FRC_ROBORIO__ if (!hmbInitialized.test()) { - hmb.lowLevel.Configure(session); + return hmb.lowLevel.Configure(session); } #endif + return true; } void wpi::impl::ShutdownNowRio() { @@ -311,7 +315,7 @@ void WPI_Impl_SetupNowUseDefaultOnRio(void) { } void WPI_Impl_SetupNowRioWithSession(uint32_t session) { - return wpi::impl::SetupNowRio(session); + wpi::impl::SetupNowRio(session); } void WPI_Impl_ShutdownNowRio(void) { diff --git a/wpiutil/src/main/native/include/wpi/timestamp.h b/wpiutil/src/main/native/include/wpi/timestamp.h index 4d61055d3c..26b586f26e 100644 --- a/wpiutil/src/main/native/include/wpi/timestamp.h +++ b/wpiutil/src/main/native/include/wpi/timestamp.h @@ -74,10 +74,12 @@ void SetupNowDefaultOnRio(); */ #ifdef __FRC_ROBORIO__ template -void SetupNowRio(void* chipObjectLibrary, std::unique_ptr hmbObject); +bool SetupNowRio(void* chipObjectLibrary, std::unique_ptr hmbObject); #else template -inline void SetupNowRio(void*, std::unique_ptr) {} +inline bool SetupNowRio(void*, std::unique_ptr) { + return true; +} #endif /** @@ -85,7 +87,7 @@ inline void SetupNowRio(void*, std::unique_ptr) {} * No effect on non-Rio platforms. This take an FPGA session that has * already been initialized, and is used from LabVIEW. */ -void SetupNowRio(uint32_t session); +bool SetupNowRio(uint32_t session); /** * De-initialize the on-Rio Now() implementation. No effect on non-Rio