diff --git a/adc_pin_probe.cpp b/adc_pin_probe.cpp index 4e62d08..e67a982 100644 --- a/adc_pin_probe.cpp +++ b/adc_pin_probe.cpp @@ -369,7 +369,25 @@ Fn load_symbol(ModuleHandle module, const char* name) { #endif } +template +Fn load_symbol_optional(ModuleHandle module, const char* name) { +#ifdef _WIN32 + const auto addr = GetProcAddress(module, name); + return (addr != nullptr) ? reinterpret_cast(addr) : nullptr; +#else + dlerror(); + void* addr = dlsym(module, name); + const char* error = dlerror(); + if ((addr == nullptr) || (error != nullptr)) { + return nullptr; + } + return reinterpret_cast(addr); +#endif +} + struct Api { + using GetDevInfoFn = int32_t (*)(t_x502_hnd, t_x502_info*); + ModuleHandle x502_module = nullptr; ModuleHandle e502_module = nullptr; @@ -377,6 +395,7 @@ struct Api { decltype(&X502_Free) Free = nullptr; decltype(&X502_Close) Close = nullptr; decltype(&X502_GetErrorString) GetErrorString = nullptr; + GetDevInfoFn GetDevInfo = nullptr; decltype(&X502_GetDevInfo2) GetDevInfo2 = nullptr; decltype(&X502_SetMode) SetMode = nullptr; decltype(&X502_StreamsStop) StreamsStop = nullptr; @@ -416,7 +435,11 @@ struct Api { Free = load_symbol(x502_module, "X502_Free"); Close = load_symbol(x502_module, "X502_Close"); GetErrorString = load_symbol(x502_module, "X502_GetErrorString"); - GetDevInfo2 = load_symbol(x502_module, "X502_GetDevInfo2"); + GetDevInfo = load_symbol_optional(x502_module, "X502_GetDevInfo"); + GetDevInfo2 = load_symbol_optional(x502_module, "X502_GetDevInfo2"); + if ((GetDevInfo == nullptr) && (GetDevInfo2 == nullptr)) { + fail("Neither X502_GetDevInfo2 nor X502_GetDevInfo is available in x502 API library"); + } SetMode = load_symbol(x502_module, "X502_SetMode"); StreamsStop = load_symbol(x502_module, "X502_StreamsStop"); StreamsDisable = load_symbol(x502_module, "X502_StreamsDisable"); @@ -669,7 +692,11 @@ int run(const Config& cfg) { device.opened = true; t_x502_info info{}; - err = api.GetDevInfo2(device.hnd, &info, sizeof(info)); + if (api.GetDevInfo2 != nullptr) { + err = api.GetDevInfo2(device.hnd, &info, sizeof(info)); + } else { + err = api.GetDevInfo(device.hnd, &info); + } expect_ok(api, err, "Get device info"); print_device_info(info);