Files
softbus_daemon/src/device_bus/manager/DeviceBusManager.cpp

216 lines
6.8 KiB
C++
Raw Normal View History

2026-03-12 14:56:53 +08:00
#include "device_bus/manager/DeviceBusManager.h"
2026-03-26 17:22:52 +08:00
#include <chrono>
2026-03-18 16:31:32 +08:00
#include <memory>
2026-03-23 17:45:32 +08:00
#include <QSet>
2026-03-20 17:19:29 +08:00
// #include <algorithm>
2026-03-12 14:56:53 +08:00
2026-03-26 17:22:52 +08:00
#include "message_bus/egress/EgressRouter.h"
#include "message_bus/ingress/DriverIngressAdapter.h"
#include "message_bus/pipeline/PipelineEngine.h"
#include "core/plugin_system/PluginManager.h"
#include "device_bus/manager/SerialDeviceManager.h"
2026-03-18 16:31:32 +08:00
#include "devices/DeviceTypes.h"
2026-03-12 14:56:53 +08:00
#include "utils/logs/logging.h"
2026-03-26 17:22:52 +08:00
DeviceBusManager::~DeviceBusManager()
{
shutdown();
}
2026-03-12 14:56:53 +08:00
2026-03-18 16:31:32 +08:00
void DeviceBusManager::setDeviceTreeModel(std::shared_ptr<DeviceTreeModel> model)
{
m_treeModel = std::move(model);
}
2026-03-20 17:19:29 +08:00
void DeviceBusManager::setRegistry(softbus::device_bus::registry::IDeviceRegistry* registry)
{
m_registry = registry;
}
2026-03-26 17:22:52 +08:00
void DeviceBusManager::setDirtyCallback(std::function<void()> cb)
{
m_dirtyCb = std::move(cb);
}
2026-03-12 14:56:53 +08:00
bool DeviceBusManager::initialize(const QJsonObject& rootConfig)
{
2026-03-30 11:11:05 +08:00
// 初始化内存池、pipeline引擎、插件管理器、ingress适配器、egress路由器
// 内存池是用来存储数据块的
// pipeline引擎是用来处理数据流的
// 插件管理器是用来管理插件的
// ingress适配器是用来将数据推送到 ingress 队列的
// egress路由器是用来将数据从 ingress 队列中取出并发送给设备的
// 内存池大小为4096每个数据块大小为4096
// pipeline引擎队列大小为4096
// 插件管理器插件数量为4096
// ingress适配器队列大小为4096
// egress路由器队列大小为4096
2026-03-26 17:22:52 +08:00
if (!m_memoryPool) {
m_memoryPool = std::make_shared<softbus::core::memory::MemoryPool>(4096, 4096);
}
if (!m_pipelineEngine) {
m_pipelineEngine = std::make_unique<softbus::message_bus::pipeline::PipelineEngine>(4096);
}
if (!m_pluginManager) {
m_pluginManager = std::make_shared<softbus::core::plugin_system::PluginManager>();
}
if (m_pipelineEngine) {
m_pipelineEngine->setPluginManager(m_pluginManager);
m_pipelineEngine->start();
}
if (!m_ingressAdapter) {
m_ingressAdapter = std::make_unique<softbus::message_bus::ingress::DriverIngressAdapter>(
m_memoryPool, m_pipelineEngine.get());
}
if (!m_egressRouter) {
m_egressRouter = std::make_unique<softbus::message_bus::egress::EgressRouter>();
}
if (!m_egressRunning.exchange(true)) {
m_egressThread = std::thread([this]() { this->processEgressLoop(); });
}
2026-03-18 16:31:32 +08:00
if (!m_treeModel) {
m_treeModel = std::make_shared<DeviceTreeModel>();
}
2026-03-12 14:56:53 +08:00
// 加载设备树
QString treeError;
2026-03-18 16:31:32 +08:00
if (!m_treeModel->loadFromDaemonConfig(rootConfig, &treeError)) {
2026-03-12 14:56:53 +08:00
LOG_ERROR() << "DeviceBusManager: failed to load device_tree:" << treeError;
return false;
}
2026-03-18 16:31:32 +08:00
const auto nodes = m_treeModel->nodes();
2026-03-12 14:56:53 +08:00
for (const auto& n : nodes) {
if (!n.enabled) continue;
2026-03-18 16:31:32 +08:00
auto kind = softbus::devices::kindFromType(n.type);
if (kind == softbus::devices::DeviceKind::Unknown) {
kind = softbus::devices::inferDeviceKindFromEndpoint(n.endpoint);
2026-03-12 14:56:53 +08:00
}
2026-03-18 16:31:32 +08:00
if (kind == softbus::devices::DeviceKind::Serial) {
initializeSerialDevice(n.endpoint, n.params);
m_deviceEndpointsMap.insert(n.endpoint, kind);
2026-03-12 14:56:53 +08:00
} else {
LOG_WARNING() << "DeviceBusManager: skip unsupported kind for endpoint=" << n.endpoint
<< "type=" << n.type;
}
}
return true;
}
2026-03-23 17:45:32 +08:00
bool DeviceBusManager::reconcileFromTreeModel()
{
if (!m_treeModel) {
return false;
}
QSet<QString> desiredSerialEndpoints;
const auto nodes = m_treeModel->nodes();
for (const auto& n : nodes) {
if (!n.enabled) continue;
if (!n.params.value(QStringLiteral("online")).toBool(true)) continue;
auto kind = softbus::devices::kindFromType(n.type);
if (kind == softbus::devices::DeviceKind::Unknown) {
kind = softbus::devices::inferDeviceKindFromEndpoint(n.endpoint);
}
if (kind == softbus::devices::DeviceKind::Serial) {
desiredSerialEndpoints.insert(n.endpoint);
2026-03-26 17:22:52 +08:00
if (!m_serialDevicesByEndpointSharedPtr.contains(n.endpoint)) {
2026-03-23 17:45:32 +08:00
initializeSerialDevice(n.endpoint, n.params);
}
m_deviceEndpointsMap.insert(n.endpoint, kind);
}
}
// Remove runtime devices that are no longer desired/offline
2026-03-26 17:22:52 +08:00
const auto currentKeys = m_serialDevicesByEndpointSharedPtr.keys();
2026-03-23 17:45:32 +08:00
for (const auto& endpoint : currentKeys) {
if (!desiredSerialEndpoints.contains(endpoint)) {
shutdownSerialDevice(endpoint);
m_deviceEndpointsMap.remove(endpoint);
}
}
return true;
}
2026-03-12 14:56:53 +08:00
void DeviceBusManager::shutdown()
{
2026-03-26 17:22:52 +08:00
m_egressRunning.store(false);
if (m_egressThread.joinable()) {
m_egressThread.join();
}
2026-03-18 16:31:32 +08:00
// 关闭并销毁所有串口设备
2026-03-26 17:22:52 +08:00
const auto keys = m_serialDevicesByEndpointSharedPtr.keys();
2026-03-12 14:56:53 +08:00
for (const auto& endpoint : keys) {
2026-03-18 16:31:32 +08:00
shutdownSerialDevice(endpoint);
2026-03-12 14:56:53 +08:00
}
2026-03-26 17:22:52 +08:00
if (m_pipelineEngine) {
m_pipelineEngine->stop();
m_pipelineEngine->drain();
}
2026-03-12 14:56:53 +08:00
}
2026-03-18 16:31:32 +08:00
void DeviceBusManager::initializeSerialDevice(const QString& endpoint, const QJsonObject& params)
2026-03-12 14:56:53 +08:00
{
2026-03-26 17:22:52 +08:00
softbus::device_bus::manager::SerialInitDeps deps;
deps.treeModel = m_treeModel.get();
deps.dirtyCb = m_dirtyCb;
deps.registry = m_registry;
deps.ingressAdapter = m_ingressAdapter.get();
deps.memoryPool = m_memoryPool;
deps.egressRouter = m_egressRouter.get();
deps.serialDevicesByEndpoint = &m_serialDevicesByEndpointSharedPtr;
(void)softbus::device_bus::manager::initializeSerialDeviceWithDeps(endpoint, params, deps);
2026-03-12 14:56:53 +08:00
}
2026-03-18 16:31:32 +08:00
void DeviceBusManager::shutdownSerialDevice(const QString& endpoint)
2026-03-12 14:56:53 +08:00
{
2026-03-26 17:22:52 +08:00
auto it = m_serialDevicesByEndpointSharedPtr.find(endpoint);
if (it == m_serialDevicesByEndpointSharedPtr.end()) {
2026-03-18 16:31:32 +08:00
return;
2026-03-12 14:56:53 +08:00
}
2026-03-18 16:31:32 +08:00
auto device = it.value();
if (device) {
auto info = device->deviceInfo();
if (m_registry && info.id >= 0) {
m_registry->unregisterDevice(info.id);
}
device->stop();
}
2026-03-26 17:22:52 +08:00
if (m_egressRouter) {
m_egressRouter->unbindSerialDevice(endpoint);
}
m_serialDevicesByEndpointSharedPtr.erase(it);
}
2026-03-18 16:31:32 +08:00
2026-03-26 17:22:52 +08:00
void DeviceBusManager::processEgressLoop()
{
while (m_egressRunning.load()) {
if (!m_pipelineEngine || !m_egressRouter) {
std::this_thread::sleep_for(std::chrono::milliseconds(2));
continue;
}
softbus::message_bus::pipeline::PipelineContext out;
if (!m_pipelineEngine->tryPopEgress(out)) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
continue;
}
const bool ok = m_egressRouter->send(out);
if (!ok) {
// LOG_WARNING() << "DeviceBusManager: egress send failed endpoint=" << out.endpoint;
}
}
2026-03-20 17:19:29 +08:00
}