Improve adapter monitor and skipp all virtual devices

This commit is contained in:
Simon Stürz 2020-11-18 18:54:31 +01:00
parent 467d2cc715
commit 28878adb73
2 changed files with 69 additions and 50 deletions

View File

@ -663,5 +663,5 @@ QDebug operator<<(QDebug debug, ZigbeeNetwork *network)
<< "Channel: " << network->channel() << ", " << "Channel: " << network->channel() << ", "
<< network->state() << network->state()
<< ") "; << ") ";
return debug; return debug.space();
} }

View File

@ -42,57 +42,69 @@ ZigbeeUartAdapterMonitor::ZigbeeUartAdapterMonitor(QObject *parent) : QObject(pa
return; return;
} }
foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
addAdapterInternally(serialPortInfo.systemLocation());
}
// Read initially all tty devices // Read initially all tty devices
struct udev_enumerate *enumerate = udev_enumerate_new(m_udev); // struct udev_enumerate *enumerate = udev_enumerate_new(m_udev);
if (!enumerate) { // if (!enumerate) {
qCWarning(dcZigbeeAdapterMonitor()) << "Could not create udev enumerate for initial device reading for the adapter monitor."; // qCWarning(dcZigbeeAdapterMonitor()) << "Could not create udev enumerate for initial device reading for the adapter monitor.";
udev_unref(m_udev); // udev_unref(m_udev);
m_udev = nullptr; // m_udev = nullptr;
return; // return;
} // }
udev_enumerate_add_match_subsystem(enumerate, "tty"); // udev_enumerate_add_match_subsystem(enumerate, "tty");
if (udev_enumerate_scan_devices(enumerate) < 0) { // if (udev_enumerate_scan_devices(enumerate) < 0) {
qCWarning(dcZigbeeAdapterMonitor()) << "Failed to scan devices from udev enumerate."; // qCWarning(dcZigbeeAdapterMonitor()) << "Failed to scan devices from udev enumerate.";
udev_enumerate_unref(enumerate); // udev_enumerate_unref(enumerate);
enumerate = nullptr; // enumerate = nullptr;
udev_unref(m_udev); // udev_unref(m_udev);
m_udev = nullptr; // m_udev = nullptr;
return; // return;
} // }
qCDebug(dcZigbeeAdapterMonitor()) << "Load initial list of available serial ports..."; // qCDebug(dcZigbeeAdapterMonitor()) << "Load initial list of available serial ports...";
struct udev_list_entry *devices = nullptr; // struct udev_list_entry *devices = nullptr;
devices = udev_enumerate_get_list_entry(enumerate); // devices = udev_enumerate_get_list_entry(enumerate);
struct udev_list_entry *dev_list_entry = nullptr; // struct udev_list_entry *dev_list_entry = nullptr;
udev_list_entry_foreach(dev_list_entry, devices) { // udev_list_entry_foreach(dev_list_entry, devices) {
struct udev_device *device = nullptr; // struct udev_device *device = nullptr;
const char *path; // const char *path;
path = udev_list_entry_get_name(dev_list_entry); // path = udev_list_entry_get_name(dev_list_entry);
device = udev_device_new_from_syspath(m_udev, path); // device = udev_device_new_from_syspath(m_udev, path);
// Print properties // // Filter out virtual devices
struct udev_list_entry *properties = udev_device_get_properties_list_entry(device); // QString devicePath = QString::fromLatin1(udev_device_get_property_value(device,"DEVPATH"));
struct udev_list_entry *property_list_entry = nullptr; // QString systemPath = QString::fromLatin1(udev_device_get_property_value(device,"DEVNAME"));
udev_list_entry_foreach(property_list_entry, properties) {
qCDebug(dcZigbeeAdapterMonitor()) << " - Property" << udev_list_entry_get_name(property_list_entry) << udev_list_entry_get_value(property_list_entry);
}
QString devicePath = QString::fromLatin1(udev_device_get_property_value(device,"DEVNAME")); // if (!devicePath.contains("/virtual/tty/")) {
QString manufacturerString = QString::fromLatin1(udev_device_get_property_value(device,"ID_VENDOR_ENC")); // // Print properties
QString descriptionString = QString::fromLatin1(udev_device_get_property_value(device,"ID_MODEL_ENC")); // struct udev_list_entry *properties = udev_device_get_properties_list_entry(device);
QString serialNumberString = QString::fromLatin1(udev_device_get_property_value(device, "ID_SERIAL_SHORT")); // struct udev_list_entry *property_list_entry = nullptr;
// udev_list_entry_foreach(property_list_entry, properties) {
// qCDebug(dcZigbeeAdapterMonitor()) << " - Property" << udev_list_entry_get_name(property_list_entry) << udev_list_entry_get_value(property_list_entry);
// }
// Clean up this device since we have all information // QString manufacturerString = QString::fromLatin1(udev_device_get_property_value(device,"ID_VENDOR_ENC"));
udev_device_unref(device); // QString descriptionString = QString::fromLatin1(udev_device_get_property_value(device,"ID_MODEL_ENC"));
// QString serialNumberString = QString::fromLatin1(udev_device_get_property_value(device, "ID_SERIAL_SHORT"));
qCDebug(dcZigbeeAdapterMonitor()) << "[+]" << devicePath << manufacturerString << descriptionString << serialNumberString; // qCDebug(dcZigbeeAdapterMonitor()) << "[+]" << systemPath << manufacturerString << descriptionString << serialNumberString;
addAdapterInternally(devicePath); // addAdapterInternally(systemPath);
} // } else {
// qCDebug(dcZigbeeAdapterMonitor()) << "Skipping virtual tty device" << systemPath << "-->" << devicePath;
// }
udev_enumerate_unref(enumerate); // // Clean up this device since we have all information
enumerate = nullptr; // udev_device_unref(device);
// }
// udev_enumerate_unref(enumerate);
// enumerate = nullptr;
// Create udev monitor // Create udev monitor
m_monitor = udev_monitor_new_from_netlink(m_udev, "udev"); m_monitor = udev_monitor_new_from_netlink(m_udev, "udev");
@ -140,8 +152,15 @@ ZigbeeUartAdapterMonitor::ZigbeeUartAdapterMonitor(QObject *parent) : QObject(pa
return; return;
} }
QString systemPath = QString::fromLatin1(udev_device_get_property_value(device,"DEVNAME"));
QString devicePath = QString::fromLatin1(udev_device_get_property_value(device,"DEVPATH"));
if (devicePath.contains("/virtual/tty/")) {
qCDebug(dcZigbeeAdapterMonitor()) << "Skipping virtual tty device" << systemPath << "-->" << devicePath;
return;
}
QString actionString = QString::fromLatin1(udev_device_get_action(device)); QString actionString = QString::fromLatin1(udev_device_get_action(device));
QString devicePath = QString::fromLatin1(udev_device_get_property_value(device,"DEVNAME"));
QString manufacturerString = QString::fromLatin1(udev_device_get_property_value(device,"ID_VENDOR_ENC")); QString manufacturerString = QString::fromLatin1(udev_device_get_property_value(device,"ID_VENDOR_ENC"));
QString descriptionString = QString::fromLatin1(udev_device_get_property_value(device,"ID_MODEL_ENC")); QString descriptionString = QString::fromLatin1(udev_device_get_property_value(device,"ID_MODEL_ENC"));
QString serialNumberString = QString::fromLatin1(udev_device_get_property_value(device, "ID_SERIAL_SHORT")); QString serialNumberString = QString::fromLatin1(udev_device_get_property_value(device, "ID_SERIAL_SHORT"));
@ -154,16 +173,16 @@ ZigbeeUartAdapterMonitor::ZigbeeUartAdapterMonitor(QObject *parent) : QObject(pa
return; return;
if (actionString == "add") { if (actionString == "add") {
qCDebug(dcZigbeeAdapterMonitor()) << "[+]" << devicePath << serialNumberString; qCDebug(dcZigbeeAdapterMonitor()) << "[+]" << systemPath << serialNumberString;
if (!m_availableAdapters.contains(devicePath)) { if (!m_availableAdapters.contains(systemPath)) {
addAdapterInternally(devicePath); addAdapterInternally(systemPath);
} }
} }
if (actionString == "remove") { if (actionString == "remove") {
qCDebug(dcZigbeeAdapterMonitor()) << "[-]" << devicePath << serialNumberString; qCDebug(dcZigbeeAdapterMonitor()) << "[-]" << systemPath << serialNumberString;
if (m_availableAdapters.contains(devicePath)) { if (m_availableAdapters.contains(systemPath)) {
ZigbeeUartAdapter adapter = m_availableAdapters.take(devicePath); ZigbeeUartAdapter adapter = m_availableAdapters.take(systemPath);
qCDebug(dcZigbeeAdapterMonitor()) << "Removed" << adapter; qCDebug(dcZigbeeAdapterMonitor()) << "Removed" << adapter;
emit adapterRemoved(adapter); emit adapterRemoved(adapter);
} }