log0.4
This commit is contained in:
@@ -1,35 +1,49 @@
|
||||
#include "device_bus/manager/DeviceBusManager.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include <QJsonDocument>
|
||||
#include <QSerialPort>
|
||||
#include <algorithm>
|
||||
|
||||
#include "hardware/drivers/serial/SerialQtDriver.h"
|
||||
#include "hardware/drivers/serial/SerialCapabilities.h"
|
||||
#include "core/device/DeviceTypes.h"
|
||||
#include "devices/DeviceTypes.h"
|
||||
#include "utils/logs/logging.h"
|
||||
|
||||
using softbus::hardware::drivers::serial::SerialQtDriver;
|
||||
namespace serial_cap = softbus::hardware::drivers::serial::capabilities;
|
||||
|
||||
void DeviceBusManager::setDeviceTreeModel(std::shared_ptr<DeviceTreeModel> model)
|
||||
{
|
||||
m_treeModel = std::move(model);
|
||||
}
|
||||
|
||||
bool DeviceBusManager::initialize(const QJsonObject& rootConfig)
|
||||
{
|
||||
if (!m_treeModel) {
|
||||
m_treeModel = std::make_shared<DeviceTreeModel>();
|
||||
}
|
||||
|
||||
// 加载设备树
|
||||
QString treeError;
|
||||
if (!m_treeModel.loadFromDaemonConfig(rootConfig, &treeError)) {
|
||||
if (!m_treeModel->loadFromDaemonConfig(rootConfig, &treeError)) {
|
||||
LOG_ERROR() << "DeviceBusManager: failed to load device_tree:" << treeError;
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto nodes = m_treeModel.nodes();
|
||||
const auto nodes = m_treeModel->nodes();
|
||||
for (const auto& n : nodes) {
|
||||
if (!n.enabled) continue;
|
||||
auto kind = softbus::core::device::kindFromType(n.type);
|
||||
if (kind == softbus::core::device::DeviceKind::Unknown) {
|
||||
kind = softbus::core::device::inferDeviceKindFromEndpoint(n.endpoint);
|
||||
|
||||
auto kind = softbus::devices::kindFromType(n.type);
|
||||
if (kind == softbus::devices::DeviceKind::Unknown) {
|
||||
kind = softbus::devices::inferDeviceKindFromEndpoint(n.endpoint);
|
||||
}
|
||||
|
||||
if (kind == softbus::core::device::DeviceKind::Serial) {
|
||||
initializeSerialDriver(n.endpoint, n.params);
|
||||
m_deviceEndpointsMap.insert(n.endpoint, QStringLiteral("serial"));
|
||||
if (kind == softbus::devices::DeviceKind::Serial) {
|
||||
initializeSerialDevice(n.endpoint, n.params);
|
||||
m_deviceEndpointsMap.insert(n.endpoint, kind);
|
||||
} else {
|
||||
LOG_WARNING() << "DeviceBusManager: skip unsupported kind for endpoint=" << n.endpoint
|
||||
<< "type=" << n.type;
|
||||
@@ -41,17 +55,17 @@ bool DeviceBusManager::initialize(const QJsonObject& rootConfig)
|
||||
|
||||
void DeviceBusManager::shutdown()
|
||||
{
|
||||
// 关闭并销毁所有串口驱动
|
||||
const auto keys = m_serialDriversMap.keys();
|
||||
// 关闭并销毁所有串口设备
|
||||
const auto keys = m_serialDevicesByEndpoint.keys();
|
||||
for (const auto& endpoint : keys) {
|
||||
shutdownSerialDriver(endpoint);
|
||||
shutdownSerialDevice(endpoint);
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceBusManager::initializeSerialDriver(const QString& endpoint,const QJsonObject& params)
|
||||
void DeviceBusManager::initializeSerialDevice(const QString& endpoint, const QJsonObject& params)
|
||||
{
|
||||
if (m_serialDriversMap.contains(endpoint)) {
|
||||
LOG_WARNING() << "DeviceBusManager: serial driver already exists for" << endpoint;
|
||||
if (m_serialDevicesByEndpoint.contains(endpoint)) {
|
||||
LOG_WARNING() << "DeviceBusManager: serial device already exists for" << endpoint;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -83,7 +97,7 @@ void DeviceBusManager::initializeSerialDriver(const QString& endpoint,const QJso
|
||||
LOG_INFO() << "DeviceBusManager: init serial endpoint=" << endpoint
|
||||
<< "params=" << QJsonDocument(merged).toJson(QJsonDocument::Compact);
|
||||
|
||||
auto driver = new SerialQtDriver(nullptr);
|
||||
auto driver = std::make_unique<SerialQtDriver>(nullptr);
|
||||
driver->SetBaudRate(static_cast<QSerialPort::BaudRate>(baud));
|
||||
driver->SetDataBits(static_cast<QSerialPort::DataBits>(dataBits));
|
||||
|
||||
@@ -106,19 +120,51 @@ void DeviceBusManager::initializeSerialDriver(const QString& endpoint,const QJso
|
||||
}
|
||||
driver->SetFlowControl(flow);
|
||||
|
||||
// 按你当前策略:初始化时就打开串口
|
||||
driver->Open(endpoint.toStdString());
|
||||
softbus::devices::DeviceInfo info;
|
||||
info.id = -1;
|
||||
info.endpoint = endpoint;
|
||||
info.type = QStringLiteral("serial");
|
||||
info.kind = softbus::devices::DeviceKind::Serial;
|
||||
|
||||
m_serialDriversMap.insert(endpoint, driver);
|
||||
m_serialDriversList.push_back(driver);
|
||||
softbus::devices::physical::SerialDevice::Config cfg;
|
||||
cfg.endpoint = endpoint;
|
||||
cfg.baudRate = baud;
|
||||
cfg.dataBits = dataBits;
|
||||
cfg.parity = parityStr;
|
||||
cfg.stopBits = stopBitsVal;
|
||||
cfg.flowControl = flowStr;
|
||||
|
||||
QSharedPointer<softbus::devices::physical::SerialDevice> device(
|
||||
new softbus::devices::physical::SerialDevice(std::move(driver), cfg, info));
|
||||
|
||||
if (m_registry) {
|
||||
m_registry->registerDevice(info);
|
||||
}
|
||||
|
||||
// 按当前策略:初始化时就打开串口
|
||||
if (!device->start()) {
|
||||
LOG_ERROR() << "DeviceBusManager: failed to start serial device for" << endpoint;
|
||||
return;
|
||||
}
|
||||
|
||||
m_serialDevicesByEndpoint.insert(endpoint, device);
|
||||
}
|
||||
|
||||
void DeviceBusManager::shutdownSerialDriver(const QString& endpoint)
|
||||
void DeviceBusManager::shutdownSerialDevice(const QString& endpoint)
|
||||
{
|
||||
auto driver = m_serialDriversMap.take(endpoint);
|
||||
if (driver) {
|
||||
driver->Close();
|
||||
delete driver;
|
||||
m_serialDriversList.removeAll(driver);
|
||||
auto it = m_serialDevicesByEndpoint.find(endpoint);
|
||||
if (it == m_serialDevicesByEndpoint.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto device = it.value();
|
||||
if (device) {
|
||||
auto info = device->deviceInfo();
|
||||
if (m_registry && info.id >= 0) {
|
||||
m_registry->unregisterDevice(info.id);
|
||||
}
|
||||
device->stop();
|
||||
}
|
||||
|
||||
m_serialDevicesByEndpoint.erase(it);
|
||||
}
|
||||
Reference in New Issue
Block a user