mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-29 02:21:44 +00:00
[hal,wpiutil] Error out of HAL_Initialize if SetupRioNow fails (#6374)
This commit is contained in:
@@ -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<void*>(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<tHMB> 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;
|
||||
|
||||
|
||||
@@ -133,13 +133,15 @@ struct HMBLowLevel {
|
||||
dlcloseWrapper};
|
||||
};
|
||||
struct HMBHolder {
|
||||
void Configure(void* col, std::unique_ptr<fpga::tHMB> hmbObject) {
|
||||
bool Configure(void* col, std::unique_ptr<fpga::tHMB> 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<fpga::tHMB> 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) {
|
||||
|
||||
@@ -74,10 +74,12 @@ void SetupNowDefaultOnRio();
|
||||
*/
|
||||
#ifdef __FRC_ROBORIO__
|
||||
template <typename T>
|
||||
void SetupNowRio(void* chipObjectLibrary, std::unique_ptr<T> hmbObject);
|
||||
bool SetupNowRio(void* chipObjectLibrary, std::unique_ptr<T> hmbObject);
|
||||
#else
|
||||
template <typename T>
|
||||
inline void SetupNowRio(void*, std::unique_ptr<T>) {}
|
||||
inline bool SetupNowRio(void*, std::unique_ptr<T>) {
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
@@ -85,7 +87,7 @@ inline void SetupNowRio(void*, std::unique_ptr<T>) {}
|
||||
* 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
|
||||
|
||||
Reference in New Issue
Block a user