X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdevicemanager.cpp;h=0765cac645c87315c43ca64ab39e16ac319a6cf4;hp=4018c0470ee031ce17f3d37664c115bb79865992;hb=0bce86095e332bedff9643e3dfbe409259e2df5f;hpb=107ca6d350b51186d12dac9273f6ed130b3f5dd7 diff --git a/pv/devicemanager.cpp b/pv/devicemanager.cpp index 4018c047..0765cac6 100644 --- a/pv/devicemanager.cpp +++ b/pv/devicemanager.cpp @@ -19,9 +19,10 @@ */ #include "devicemanager.h" +#include "sigsession.h" #include -#include +#include #include #include @@ -48,6 +49,27 @@ const std::list& DeviceManager::devices() const return _devices; } +void DeviceManager::use_device(sr_dev_inst *sdi, SigSession *owner) +{ + assert(sdi); + assert(owner); + + _used_devices[sdi] = owner; + + sr_dev_open(sdi); +} + +void DeviceManager::release_device(sr_dev_inst *sdi) +{ + assert(sdi); + + // Notify the owner, and removed the device from the used device list + _used_devices[sdi]->release_device(sdi); + _used_devices.erase(sdi); + + sr_dev_close(sdi); +} + list DeviceManager::driver_scan( struct sr_dev_driver *const driver, GSList *const drvopts) { @@ -65,8 +87,8 @@ list DeviceManager::driver_scan( i++; } - // Clear all the old device instances from this driver - sr_dev_clear(driver); + // Release this driver and all it's attached devices + release_driver(driver); // Do the scan GSList *const devices = sr_driver_scan(driver, drvopts); @@ -83,6 +105,31 @@ list DeviceManager::driver_scan( return driver_devices; } +string DeviceManager::format_device_title(const sr_dev_inst *const sdi) +{ + ostringstream s; + + assert(sdi); + + if (sdi->vendor && sdi->vendor[0]) { + s << sdi->vendor; + if ((sdi->model && sdi->model[0]) || + (sdi->version && sdi->version[0])) + s << ' '; + } + + if (sdi->model && sdi->model[0]) { + s << sdi->model; + if (sdi->version && sdi->version[0]) + s << ' '; + } + + if (sdi->version && sdi->version[0]) + s << sdi->version; + + return s.str(); +} + void DeviceManager::init_drivers() { // Initialise all libsigrok drivers @@ -98,6 +145,14 @@ void DeviceManager::init_drivers() void DeviceManager::release_devices() { + // Release all the used devices + for (map::iterator i = _used_devices.begin(); + i != _used_devices.end(); i++) + release_device((*i).first); + + _used_devices.clear(); + + // Clear all the drivers sr_dev_driver **const drivers = sr_driver_list(); for (sr_dev_driver **driver = drivers; *driver; driver++) sr_dev_clear(*driver); @@ -111,25 +166,31 @@ void DeviceManager::scan_all_drivers() driver_scan(*driver); } +void DeviceManager::release_driver(struct sr_dev_driver *const driver) +{ + assert(driver); + for (map::iterator i = _used_devices.begin(); + i != _used_devices.end(); i++) + if((*i).first->driver == driver) + { + // Notify the current owner of the device + (*i).second->release_device((*i).first); + + // Remove it from the used device list + _used_devices.erase(i); + + // Close the device instance + sr_dev_close((*i).first); + } + + // Clear all the old device instances from this driver + sr_dev_clear(driver); +} + bool DeviceManager::compare_devices(const sr_dev_inst *const a, const sr_dev_inst *const b) { - assert(a); - assert(b); - - const int vendor_cmp = strcasecmp(a->vendor, b->vendor); - if(vendor_cmp < 0) - return true; - else if(vendor_cmp > 0) - return false; - - const int model_cmp = strcasecmp(a->model, b->model); - if(model_cmp < 0) - return true; - else if(model_cmp > 0) - return false; - - return strcasecmp(a->version, b->version) < 0; + return format_device_title(a).compare(format_device_title(b)) < 0; } } // namespace pv