X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=83f1fbf73567f9ab2a5460e3a73f2668680645de;hb=80fe524740f28f44111d9f98bbb0e44294bdf3d2;hp=986d4a73086c97d52d6a4e3a353ea14fb1572f4e;hpb=9c51e8ec56715074ca756fd54e63b360096113e2;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 986d4a73..83f1fbf7 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -352,12 +352,12 @@ Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) return Glib::VariantContainerBase(data); } -vector Configurable::config_keys(const ConfigKey *key) +map> Configurable::config_keys(const ConfigKey *key) { GVariant *gvar_opts; gsize num_opts; const uint32_t *opts; - vector result; + map> result; check(sr_config_list( config_driver, config_sdi, config_channel_group, @@ -367,7 +367,17 @@ vector Configurable::config_keys(const ConfigKey *key) gvar_opts, &num_opts, sizeof(uint32_t)); for (gsize i = 0; i < num_opts; i++) - result.push_back(ConfigKey::get(opts[i] & SR_CONF_MASK)); + { + auto key = ConfigKey::get(opts[i] & SR_CONF_MASK); + set capabilities; + if (opts[i] & SR_CONF_GET) + capabilities.insert(GET); + if (opts[i] & SR_CONF_SET) + capabilities.insert(SET); + if (opts[i] & SR_CONF_LIST) + capabilities.insert(LIST); + result[key] = capabilities; + } g_variant_unref(gvar_opts); @@ -403,16 +413,16 @@ bool Configurable::config_check(const ConfigKey *key, } Device::Device(struct sr_dev_inst *structure) : - Configurable(structure->driver, structure, NULL), + Configurable(sr_dev_inst_driver_get(structure), structure, NULL), _structure(structure) { - for (GSList *entry = structure->channels; entry; entry = entry->next) + for (GSList *entry = sr_dev_inst_channels_get(structure); entry; entry = entry->next) { auto channel = (struct sr_channel *) entry->data; _channels[channel] = new Channel(channel); } - for (GSList *entry = structure->channel_groups; entry; entry = entry->next) + for (GSList *entry = sr_dev_inst_channel_groups_get(structure); entry; entry = entry->next) { auto group = (struct sr_channel_group *) entry->data; _channel_groups[group->name] = new ChannelGroup(this, group); @@ -427,39 +437,35 @@ Device::~Device() delete entry.second; } -string Device::description() +string Device::vendor() { - ostringstream s; - - vector parts = - {vendor(), model(), version()}; - - for (string part : parts) - if (part.length() > 0) - s << part; + return valid_string(sr_dev_inst_vendor_get(_structure)); +} - return s.str(); +string Device::model() +{ + return valid_string(sr_dev_inst_model_get(_structure)); } -string Device::vendor() +string Device::version() { - return valid_string(_structure->vendor); + return valid_string(sr_dev_inst_version_get(_structure)); } -string Device::model() +string Device::serial_number() { - return valid_string(_structure->model); + return valid_string(sr_dev_inst_sernum_get(_structure)); } -string Device::version() +string Device::connection_id() { - return valid_string(_structure->version); + return valid_string(sr_dev_inst_connid_get(_structure)); } vector> Device::channels() { vector> result; - for (auto channel = _structure->channels; channel; channel = channel->next) + for (auto channel = sr_dev_inst_channels_get(_structure); channel; channel = channel->next) result.push_back( _channels[(struct sr_channel *) channel->data]->get_shared_pointer( get_shared_from_this())); @@ -560,7 +566,7 @@ unsigned int Channel::index() ChannelGroup::ChannelGroup(Device *device, struct sr_channel_group *structure) : ParentOwned(structure), - Configurable(device->_structure->driver, device->_structure, structure) + Configurable(sr_dev_inst_driver_get(device->_structure), device->_structure, structure) { for (GSList *entry = structure->channels; entry; entry = entry->next) _channels.push_back(device->_channels[(struct sr_channel *)entry->data]); @@ -696,7 +702,7 @@ DatafeedCallbackData::DatafeedCallbackData(Session *session, void DatafeedCallbackData::run(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *pkt) { - auto device = _session->_devices[sdi]; + auto device = _session->get_device(sdi); auto packet = shared_ptr(new Packet(device, pkt), Packet::Deleter()); _callback(device, packet); } @@ -777,6 +783,7 @@ Session::Session(shared_ptr context) : Session::Session(shared_ptr context, string filename) : UserOwned(_structure), _context(context), + _filename(filename), _saving(false) { check(sr_session_load(filename.c_str(), &_structure)); @@ -785,9 +792,7 @@ Session::Session(shared_ptr context, string filename) : for (GSList *dev = dev_list; dev; dev = dev->next) { auto sdi = (struct sr_dev_inst *) dev->data; - auto device = new SessionDevice(sdi); - _devices[sdi] = shared_ptr(device, - SessionDevice::Deleter()); + _owned_devices[sdi] = new SessionDevice(sdi); } _context->_session = this; } @@ -801,12 +806,26 @@ Session::~Session() for (auto entry : _source_callbacks) delete entry.second; + + for (auto entry : _owned_devices) + delete entry.second; +} + +shared_ptr Session::get_device(const struct sr_dev_inst *sdi) +{ + if (_owned_devices.count(sdi)) + return static_pointer_cast( + _owned_devices[sdi]->get_shared_pointer(this)); + else if (_other_devices.count(sdi)) + return _other_devices[sdi]; + else + throw Error(SR_ERR_BUG); } void Session::add_device(shared_ptr device) { check(sr_session_dev_add(_structure, device->_structure)); - _devices[device->_structure] = device; + _other_devices[device->_structure] = device; } vector> Session::devices() @@ -817,14 +836,14 @@ vector> Session::devices() for (GSList *dev = dev_list; dev; dev = dev->next) { auto sdi = (struct sr_dev_inst *) dev->data; - result.push_back(_devices[sdi]); + result.push_back(get_device(sdi)); } return result; } void Session::remove_devices() { - _devices.clear(); + _other_devices.clear(); check(sr_session_dev_remove_all(_structure)); } @@ -878,7 +897,7 @@ void Session::append(shared_ptr packet) { GVariant *samplerate; - check(sr_config_get(packet->_device->_structure->driver, + check(sr_config_get(sr_dev_inst_driver_get(packet->_device->_structure), packet->_device->_structure, NULL, SR_CONF_SAMPLERATE, &samplerate)); @@ -1024,6 +1043,11 @@ void Session::set_trigger(shared_ptr trigger) _trigger = trigger; } +string Session::filename() +{ + return _filename; +} + Packet::Packet(shared_ptr device, const struct sr_datafeed_packet *structure) : UserOwned(structure),