[hal,wpiutil] Error out of HAL_Initialize if SetupRioNow fails (#6374)

This commit is contained in:
Thad House
2024-02-15 22:57:06 -08:00
committed by GitHub
parent 6afff99640
commit ba15844c28
3 changed files with 23 additions and 15 deletions

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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