// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #include "FPGACalls.h" #include #include "dlfcn.h" #include "hal/Errors.h" static void* NiFpgaLibrary = nullptr; namespace hal { HAL_NiFpga_ReserveIrqContextFunc HAL_NiFpga_ReserveIrqContext; HAL_NiFpga_UnreserveIrqContextFunc HAL_NiFpga_UnreserveIrqContext; HAL_NiFpga_WaitOnIrqsFunc HAL_NiFpga_WaitOnIrqs; HAL_NiFpga_AcknowledgeIrqsFunc HAL_NiFpga_AcknowledgeIrqs; HAL_NiFpga_OpenHmbFunc HAL_NiFpga_OpenHmb; HAL_NiFpga_CloseHmbFunc HAL_NiFpga_CloseHmb; namespace init { int InitializeFPGA() { NiFpgaLibrary = dlopen("libNiFpga.so", RTLD_LAZY); if (!NiFpgaLibrary) { return errno; } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" HAL_NiFpga_ReserveIrqContext = reinterpret_cast( dlsym(NiFpgaLibrary, "NiFpgaDll_ReserveIrqContext")); HAL_NiFpga_UnreserveIrqContext = reinterpret_cast( dlsym(NiFpgaLibrary, "NiFpgaDll_UnreserveIrqContext")); HAL_NiFpga_WaitOnIrqs = reinterpret_cast( dlsym(NiFpgaLibrary, "NiFpgaDll_WaitOnIrqs")); HAL_NiFpga_AcknowledgeIrqs = reinterpret_cast( dlsym(NiFpgaLibrary, "NiFpgaDll_AcknowledgeIrqs")); HAL_NiFpga_OpenHmb = reinterpret_cast( dlsym(NiFpgaLibrary, "NiFpgaDll_OpenHmb")); HAL_NiFpga_CloseHmb = reinterpret_cast( dlsym(NiFpgaLibrary, "NiFpgaDll_CloseHmb")); #pragma GCC diagnostic pop if (HAL_NiFpga_ReserveIrqContext == nullptr || HAL_NiFpga_UnreserveIrqContext == nullptr || HAL_NiFpga_WaitOnIrqs == nullptr || HAL_NiFpga_AcknowledgeIrqs == nullptr || HAL_NiFpga_OpenHmb == nullptr || HAL_NiFpga_CloseHmb == nullptr) { HAL_NiFpga_ReserveIrqContext = nullptr; HAL_NiFpga_UnreserveIrqContext = nullptr; HAL_NiFpga_WaitOnIrqs = nullptr; HAL_NiFpga_AcknowledgeIrqs = nullptr; HAL_NiFpga_OpenHmb = nullptr; HAL_NiFpga_CloseHmb = nullptr; dlclose(NiFpgaLibrary); NiFpgaLibrary = nullptr; return NO_AVAILABLE_RESOURCES; } return HAL_SUCCESS; } } // namespace init } // namespace hal