ab930a2df3
Register comparator types via a dedicated manager and expose lookup/create hooks through SmoCallbacks so stimbuff libs can resolve comparators at load time. Co-authored-by: Cursor <cursoragent@cursor.com>
116 lines
3.3 KiB
C++
116 lines
3.3 KiB
C++
#include <iostream>
|
|
#include <stdexcept>
|
|
#include <opts.h>
|
|
#include <body/body.h>
|
|
#include <body/bodyThread.h>
|
|
#include <componentThread.h>
|
|
#include <deviceManager/deviceManager.h>
|
|
#include <mind.h>
|
|
#include <stimBuffApis/stimBuffApiManager.h>
|
|
#include <comparatorLibs/comparatorApiManager.h>
|
|
|
|
namespace smo {
|
|
namespace body {
|
|
|
|
Body::Body(Mind &parent, const std::shared_ptr<sscl::PuppetThread> &thread)
|
|
: MindComponent(static_cast<sscl::PuppetApplication&>(parent), thread)
|
|
{
|
|
}
|
|
|
|
BodyViralPostingInvoker<void> Body::initializeCReq()
|
|
{
|
|
auto self = sscl::ComponentThread::getSelf();
|
|
if (self->id != SmoThreadId::BODY)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Must be executed on Body thread");
|
|
}
|
|
|
|
/** EXPLANATION:
|
|
* The ComponentThread instance we pass in here is the one that will be
|
|
* used by Senseapi libs to perform device-independent background
|
|
* operations.
|
|
* For example, liblivoxProto1's BroadcastListener will use this thread
|
|
* to listen for UDP broadcast dgrams from Livox devices.
|
|
*
|
|
* We used to use Marionette, but there's a strong argument for using
|
|
* Body instead since it's meant to handle device-management operations.
|
|
*/
|
|
// Upcast to Mind to access Mind-specific members
|
|
Mind &mind = static_cast<Mind&>(parent);
|
|
|
|
comparator_lib::ComparatorApiManager::getInstance()
|
|
.loadComparatorLib("libcomparatorCore.so");
|
|
|
|
stim_buff::StimBuffApiManager::getInstance()
|
|
.loadAllStimBuffApiLibsFromOptions(mind.body.thread);
|
|
|
|
/** EXPLANATION:
|
|
* Consider body::initializeCReq to have been called if even one of its
|
|
* operations was executed at all, whether successfully or
|
|
* unsuccessfully.
|
|
*/
|
|
mind.bodyComponentInitialized = true;
|
|
|
|
std::cout << stim_buff::StimBuffApiManager::getInstance().stringifyLibs()
|
|
<< std::endl;
|
|
|
|
if (OptionParser::getOptions().verbose)
|
|
{
|
|
std::cout << __func__ << ": About to initializeAllStimBuffApiLibs"
|
|
<< '\n';
|
|
}
|
|
co_await stim_buff::StimBuffApiManager::getInstance()
|
|
.initializeAllStimBuffApiLibsCReq();
|
|
|
|
if (OptionParser::getOptions().verbose)
|
|
{
|
|
std::cout << __func__ << ": About to attachAllUnattachedDevicesFromCmdline"
|
|
<< '\n';
|
|
}
|
|
|
|
co_await device::DeviceManager::getInstance()
|
|
.attachAllUnattachedDevicesFromCmdlineCReq();
|
|
|
|
co_return;
|
|
}
|
|
|
|
BodyViralPostingInvoker<void> Body::finalizeCReq()
|
|
{
|
|
auto self = sscl::ComponentThread::getSelf();
|
|
if (self->id != SmoThreadId::BODY)
|
|
{
|
|
throw std::runtime_error(std::string(__func__)
|
|
+ ": Must be executed on Body thread");
|
|
}
|
|
|
|
// Upcast to Mind to access Mind-specific members
|
|
Mind &mind = static_cast<Mind&>(parent);
|
|
if (!mind.bodyComponentInitialized)
|
|
{
|
|
std::cout << "Mrntt: Body component not initialized. "
|
|
<< "Skipping finalization." << "\n";
|
|
co_return;
|
|
}
|
|
|
|
std::cout << "Mrntt: About to detach all sense devices." << "\n";
|
|
co_await device::DeviceManager::getInstance()
|
|
.detachAllAttachedDeviceRolesCReq();
|
|
|
|
std::cout << "Mrntt: About to finalize all stim buff api libs." << "\n";
|
|
co_await stim_buff::StimBuffApiManager::getInstance()
|
|
.finalizeAllStimBuffApiLibsCReq();
|
|
|
|
std::cout << "Mrntt: About to unload all stim buff api libs." << "\n";
|
|
stim_buff::StimBuffApiManager::getInstance().unloadAllStimBuffApiLibs();
|
|
|
|
std::cout << "Mrntt: About to unload all comparator libs." << "\n";
|
|
comparator_lib::ComparatorApiManager::getInstance()
|
|
.unloadAllComparatorLibs();
|
|
|
|
co_return;
|
|
}
|
|
|
|
} // namespace body
|
|
} // namespace smo
|