From a69e97943539a8abc4d2762638c169dc19c88516 Mon Sep 17 00:00:00 2001 From: Javier Date: Sun, 7 Jun 2015 21:22:45 +0200 Subject: initial import --- smartpenmanager.cc | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 smartpenmanager.cc (limited to 'smartpenmanager.cc') diff --git a/smartpenmanager.cc b/smartpenmanager.cc new file mode 100644 index 0000000..d560b5b --- /dev/null +++ b/smartpenmanager.cc @@ -0,0 +1,69 @@ +#include +#include + +#include "smartpenmanager.h" + +SmartpenManager::SmartpenManager(QObject *parent) + : QObject(parent), _udev(udev_new()), _monitor(udev_monitor_new_from_netlink(_udev, "udev")), + _notifier(new QSocketNotifier(udev_monitor_get_fd(_monitor), QSocketNotifier::Read)) +{ + udev_monitor_filter_add_match_tag(_monitor, "livescribe-pen"); + + connect(_notifier, SIGNAL(activated(int)), SLOT(handleMonitorActivity())); + + udev_monitor_enable_receiving(_monitor); + + udev_enumerate *scan = udev_enumerate_new(_udev); + udev_enumerate_add_match_tag(scan, "livescribe-pen"); + + if (udev_enumerate_scan_devices(scan) == 0) { + udev_list_entry *l = udev_enumerate_get_list_entry(scan), *i; + udev_list_entry_foreach(i, l) { + const char *path = udev_list_entry_get_name(i); + udev_device *dev = udev_device_new_from_syspath(_udev, path); + processDevice(dev); + udev_device_unref(dev); + } + } else { + qWarning() << "Failed to scan for devices"; + } + + udev_enumerate_unref(scan); +} + +SmartpenManager::~SmartpenManager() +{ + delete _notifier; + udev_monitor_unref(_monitor); + udev_unref(_udev); +} + +void SmartpenManager::handleMonitorActivity() +{ + qDebug() << "udev activity"; + udev_device *dev = udev_monitor_receive_device(_monitor); + udev_device_unref(dev); +} + +void SmartpenManager::handleSyncerFinished() +{ + SmartpenSyncer *syncer = static_cast(sender()); + Smartpen::Address addr = syncer->penAddress(); + qDebug() << "Finished synchronization with pen with address:" << addr; + _syncers.remove(addr); + syncer->deleteLater(); +} + +void SmartpenManager::processDevice(udev_device *dev) +{ + uint busnum = atol(udev_device_get_sysattr_value(dev, "busnum")); + uint devnum = atol(udev_device_get_sysattr_value(dev, "devnum")); + + Smartpen::Address addr(busnum, devnum); + if (!_syncers.contains(addr)) { + SmartpenSyncer *syncer = new SmartpenSyncer(addr, this); + _syncers.insert(addr, syncer); + connect(syncer, SIGNAL(finished()), SLOT(handleSyncerFinished())); + syncer->start(); + } +} -- cgit v1.2.3