5845f1a41d
This symbol is defined as a static member object inside of a boost detail header. When boost headers are used in a project that uses Boost in both the main binary as well as dlopen()'d shlibs, the top_ symbol gets duplicated and the metadata gets partitioned. We use the Boost shlib to unify both the main binary and the shlibs to use the same memory address for top_. This involves marking the templated object call_stack::top_ as "extern" and then declaring to Boost that we intend to use the shlibs.
124 lines
2.9 KiB
C++
124 lines
2.9 KiB
C++
#include <boostAsioLinkageFix.h>
|
|
#include <stdexcept>
|
|
#include <callback.h>
|
|
#include <boost/asio/posix/stream_descriptor.hpp>
|
|
#include "livoxProto1.h"
|
|
#include "device.h"
|
|
#include "core.h"
|
|
#include "udpCommandDemuxer.h"
|
|
|
|
|
|
extern "C" {
|
|
|
|
void livoxProto1_getOrCreateDeviceReq(
|
|
const std::string& deviceIdentifier,
|
|
const std::shared_ptr<smo::ComponentThread>& componentThread,
|
|
int commandTimeoutMs, int retryDelayMs,
|
|
const std::string& smoIp, uint8_t smoSubnetNbits,
|
|
uint16_t dataPort, uint16_t cmdPort, uint16_t imuPort,
|
|
smo::Callback<livoxProto1_getOrCreateDeviceReqCbFn> callback
|
|
)
|
|
{
|
|
// Get the global DeviceManager instance
|
|
auto& protoState = livoxProto1::getProtoState();
|
|
if (!protoState.deviceManager)
|
|
{
|
|
throw std::runtime_error(
|
|
std::string(__func__) + ": LivoxProto1 not initialized - call "
|
|
"livoxProto1_main first");
|
|
}
|
|
|
|
// Delegate to DeviceManager
|
|
protoState.deviceManager->getOrCreateDeviceReq(
|
|
deviceIdentifier, componentThread,
|
|
commandTimeoutMs, retryDelayMs,
|
|
smoIp, smoSubnetNbits,
|
|
dataPort, cmdPort, imuPort,
|
|
callback);
|
|
}
|
|
|
|
void livoxProto1_destroyDeviceReq(
|
|
std::shared_ptr<livoxProto1::Device> device,
|
|
smo::Callback<livoxProto1_destroyDeviceReqCbFn> callback
|
|
)
|
|
{
|
|
auto& protoState = livoxProto1::getProtoState();
|
|
if (!protoState.deviceManager)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": DeviceManager not initialized");
|
|
}
|
|
|
|
protoState.deviceManager->destroyDeviceReq(
|
|
device, callback);
|
|
}
|
|
|
|
void livoxProto1_main(
|
|
const std::shared_ptr<smo::ComponentThread>& componentThread,
|
|
const smo::stim_buff::SmoCallbacks& smoCallbacks)
|
|
{
|
|
livoxProto1::main(componentThread, smoCallbacks);
|
|
}
|
|
|
|
void livoxProto1_exit(void)
|
|
{
|
|
livoxProto1::exit();
|
|
}
|
|
|
|
void livoxProto1_device_enablePcloudDataReq(
|
|
std::shared_ptr<livoxProto1::Device> device,
|
|
smo::Callback<livoxProto1_device_enablePcloudDataReqCbFn> callback
|
|
)
|
|
{
|
|
if (!device)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Device pointer is null");
|
|
}
|
|
|
|
device->enablePcloudDataReq(callback);
|
|
}
|
|
|
|
void livoxProto1_device_disablePcloudDataReq(
|
|
std::shared_ptr<livoxProto1::Device> device,
|
|
smo::Callback<livoxProto1_device_disablePcloudDataReqCbFn> callback
|
|
)
|
|
{
|
|
if (!device)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Device pointer is null");
|
|
}
|
|
|
|
device->disablePcloudDataReq(callback);
|
|
}
|
|
|
|
void livoxProto1_device_getReturnModeReq(
|
|
std::shared_ptr<livoxProto1::Device> device,
|
|
smo::Callback<livoxProto1_device_getReturnModeReqCbFn> callback
|
|
)
|
|
{
|
|
if (!device)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Device pointer is null");
|
|
}
|
|
|
|
device->getReturnModeReq(callback);
|
|
}
|
|
|
|
std::shared_ptr<boost::asio::posix::stream_descriptor>
|
|
livoxProto1_getPcloudDataFdDesc(void)
|
|
{
|
|
auto& protoState = livoxProto1::getProtoState();
|
|
if (!protoState.deviceManager)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": DeviceManager not initialized");
|
|
}
|
|
|
|
return protoState.deviceManager->udpCommandDemuxer.getPcloudDataFdDesc();
|
|
}
|
|
|
|
} // extern "C"
|