X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=0d306a97848b444a04751a279a48188ea77cf913;hb=06bd935e161dd273788ce9f1b455732fb91efd84;hp=af51e9079678bb3d85b7db47dc844986273c736e;hpb=c23c8659b8f8c4ca60bf59f6afd12bde7a0b2383;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index af51e907..0d306a97 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -19,14 +19,10 @@ #include "libsigrok/libsigrok.hpp" -namespace sigrok -{ +#include -/** Custom shared_ptr deleter for children owned by their parent object. */ -template void reset_parent(T *child) +namespace sigrok { - child->parent.reset(); -} /** Helper function to translate C errors to C++ exceptions. */ static void check(int result) @@ -113,8 +109,8 @@ map> Context::get_drivers() { auto name = entry.first; auto driver = entry.second; - driver->parent = static_pointer_cast(shared_from_this()); - result[name] = shared_ptr(driver, reset_parent); + result[name] = static_pointer_cast( + driver->get_shared_pointer(this)); } return result; } @@ -126,9 +122,8 @@ map> Context::get_input_formats() { auto name = entry.first; auto input_format = entry.second; - input_format->parent = static_pointer_cast(shared_from_this()); - result[name] = shared_ptr(input_format, - reset_parent); + result[name] = static_pointer_cast( + input_format->get_shared_pointer(this)); } return result; } @@ -140,9 +135,8 @@ map> Context::get_output_formats() { auto name = entry.first; auto output_format = entry.second; - output_format->parent = static_pointer_cast(shared_from_this()); - result[name] = shared_ptr(output_format, - reset_parent); + result[name] = static_pointer_cast( + output_format->get_shared_pointer(this)); } return result; } @@ -301,11 +295,8 @@ vector> Driver::scan( /* Create list of shared pointers to device instances for return. */ vector> result; for (auto device : devices) - { - device->parent = parent->shared_from_this(); - result.push_back(shared_ptr(device, - reset_parent)); - } + result.push_back(static_pointer_cast( + device->get_shared_pointer(parent))); return result; } @@ -339,13 +330,13 @@ void Configurable::config_set(const ConfigKey *key, Glib::VariantBase value) key->get_id(), value.gobj())); } -Glib::VariantBase Configurable::config_list(const ConfigKey *key) +Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) { GVariant *data; check(sr_config_list( config_driver, config_sdi, config_channel_group, key->get_id(), &data)); - return Glib::VariantBase(data); + return Glib::VariantContainerBase(data); } Device::Device(struct sr_dev_inst *structure) : @@ -355,14 +346,36 @@ Device::Device(struct sr_dev_inst *structure) : for (GSList *entry = structure->channels; entry; entry = entry->next) { auto channel = (struct sr_channel *) entry->data; - channels.push_back(new Channel(channel)); + channels[channel] = new Channel(channel); + } + + for (GSList *entry = structure->channel_groups; entry; entry = entry->next) + { + auto group = (struct sr_channel_group *) entry->data; + channel_groups[group->name] = new ChannelGroup(this, group); } } Device::~Device() { - for (auto channel : channels) - delete channel; + for (auto entry : channels) + delete entry.second; + for (auto entry : channel_groups) + delete entry.second; +} + +string Device::get_description() +{ + ostringstream s; + + vector parts = + {get_vendor(), get_model(), get_version()}; + + for (string part : parts) + if (part.length() > 0) + s << part; + + return s.str(); } string Device::get_vendor() @@ -383,10 +396,28 @@ string Device::get_version() vector> Device::get_channels() { vector> result; - for (auto channel : channels) + for (auto entry : channels) + result.push_back(static_pointer_cast( + entry.second->get_shared_pointer(this))); + return result; +} + +shared_ptr Device::get_channel(struct sr_channel *ptr) +{ + return static_pointer_cast( + channels[ptr]->get_shared_pointer(this)); +} + +map> +Device::get_channel_groups() +{ + map> result; + for (auto entry: channel_groups) { - channel->parent = static_pointer_cast(shared_from_this()); - result.push_back(shared_ptr(channel, reset_parent)); + auto name = entry.first; + auto channel_group = entry.second; + result[name] = static_pointer_cast( + channel_group->get_shared_pointer(this)); } return result; } @@ -405,38 +436,15 @@ HardwareDevice::HardwareDevice(Driver *driver, struct sr_dev_inst *structure) : Device(structure), driver(driver) { - for (GSList *entry = structure->channel_groups; entry; entry = entry->next) - { - auto group = (struct sr_channel_group *) entry->data; - channel_groups[group->name] = new ChannelGroup(this, group); - } } HardwareDevice::~HardwareDevice() { - for (auto entry : channel_groups) - delete entry.second; } shared_ptr HardwareDevice::get_driver() { - return static_pointer_cast(driver->shared_from_this()); -} - -map> -HardwareDevice::get_channel_groups() -{ - map> result; - for (auto entry: channel_groups) - { - auto name = entry.first; - auto channel_group = entry.second; - channel_group->parent = - static_pointer_cast(shared_from_this()); - result[name] = shared_ptr(channel_group, - reset_parent); - } - return result; + return static_pointer_cast(driver->get_shared_pointer(parent)); } Channel::Channel(struct sr_channel *structure) : @@ -474,18 +482,18 @@ void Channel::set_enabled(bool value) check(sr_dev_channel_enable(parent->structure, structure->index, value)); } -ChannelGroup::ChannelGroup(HardwareDevice *device, +unsigned int Channel::get_index() +{ + return structure->index; +} + +ChannelGroup::ChannelGroup(Device *device, struct sr_channel_group *structure) : - StructureWrapper(structure), + StructureWrapper(structure), Configurable(device->structure->driver, device->structure, structure) { for (GSList *entry = structure->channels; entry; entry = entry->next) - { - auto channel = (struct sr_channel *) entry->data; - for (auto device_channel : device->channels) - if (channel == device_channel->structure) - channels.push_back(device_channel); - } + channels.push_back(device->channels[(struct sr_channel *)entry->data]); } ChannelGroup::~ChannelGroup() @@ -501,10 +509,8 @@ vector> ChannelGroup::get_channels() { vector> result; for (auto channel : channels) - { - channel->parent = static_pointer_cast(parent->shared_from_this()); - result.push_back(shared_ptr(channel, reset_parent)); - } + result.push_back(static_pointer_cast( + channel->get_shared_pointer(parent))); return result; } @@ -532,10 +538,8 @@ vector> Trigger::get_stages() { vector> result; for (auto stage : stages) - { - stage->parent = static_pointer_cast(shared_from_this()); - result.push_back(shared_ptr(stage, reset_parent)); - } + result.push_back(static_pointer_cast( + stage->get_shared_pointer(this))); return result; } @@ -543,8 +547,8 @@ shared_ptr Trigger::add_stage() { auto stage = new TriggerStage(sr_trigger_stage_add(structure)); stages.push_back(stage); - stage->parent = static_pointer_cast(shared_from_this()); - return shared_ptr(stage, reset_parent); + return static_pointer_cast( + stage->get_shared_pointer(this)); } TriggerStage::TriggerStage(struct sr_trigger_stage *structure) : @@ -567,10 +571,8 @@ vector> TriggerStage::get_matches() { vector> result; for (auto match : matches) - { - match->parent = static_pointer_cast(shared_from_this()); - result.push_back(shared_ptr(match, reset_parent)); - } + result.push_back(static_pointer_cast( + match->get_shared_pointer(this))); return result; } @@ -620,7 +622,7 @@ void DatafeedCallbackData::run(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *pkt) { auto device = session->devices[sdi]; - auto packet = shared_ptr(new Packet(pkt), Packet::Deleter()); + auto packet = shared_ptr(new Packet(device, pkt), Packet::Deleter()); callback(device, packet); } @@ -748,7 +750,7 @@ void Session::begin_save(string filename) save_samplerate = 0; } -void Session::append(shared_ptr device, shared_ptr packet) +void Session::append(shared_ptr packet) { if (!saving) throw Error(SR_ERR); @@ -775,8 +777,9 @@ void Session::append(shared_ptr device, shared_ptr packet) { GVariant *samplerate; - check(sr_config_get(device->structure->driver, - device->structure, NULL, SR_CONF_SAMPLERATE, &samplerate)); + check(sr_config_get(packet->device->structure->driver, + packet->device->structure, NULL, SR_CONF_SAMPLERATE, + &samplerate)); save_samplerate = g_variant_get_uint64(samplerate); @@ -787,7 +790,7 @@ void Session::append(shared_ptr device, shared_ptr packet) { vector> save_channels; - for (auto channel : device->get_channels()) + for (auto channel : packet->device->get_channels()) if (channel->structure->enabled && channel->structure->type == SR_CHANNEL_LOGIC) save_channels.push_back(channel); @@ -820,6 +823,12 @@ void Session::append(shared_ptr device, shared_ptr packet) } } +void Session::append(void *data, size_t length, unsigned int unit_size) +{ + check(sr_session_append(structure, save_filename.c_str(), + (uint8_t *) data, unit_size, length)); +} + static void datafeed_callback(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *pkt, void *cb_data) { @@ -902,11 +911,34 @@ void Session::remove_source(shared_ptr source) source_callbacks.erase(source); } -Packet::Packet(const struct sr_datafeed_packet *structure) : - structure(structure) +shared_ptr Session::get_trigger() +{ + return trigger; +} + +void Session::set_trigger(shared_ptr trigger) +{ + check(sr_session_trigger_set(structure, trigger->structure)); + this->trigger = trigger; +} + +Packet::Packet(shared_ptr device, + const struct sr_datafeed_packet *structure) : + structure(structure), + device(device) { switch (structure->type) { + case SR_DF_HEADER: + payload = new Header( + static_cast( + structure->payload)); + break; + case SR_DF_META: + payload = new Meta( + static_cast( + structure->payload)); + break; case SR_DF_LOGIC: payload = new Logic( static_cast( @@ -917,20 +949,23 @@ Packet::Packet(const struct sr_datafeed_packet *structure) : static_cast( structure->payload)); break; - default: - payload = NULL; - break; } } Packet::~Packet() { - delete payload; + if (payload) + delete payload; } -PacketPayload *Packet::get_payload() +const PacketType *Packet::get_type() { - return payload; + return PacketType::get(structure->type); +} + +shared_ptr Packet::get_payload() +{ + return payload->get_shared_pointer(this); } PacketPayload::PacketPayload() @@ -941,28 +976,77 @@ PacketPayload::~PacketPayload() { } -Logic::Logic(const struct sr_datafeed_logic *structure) : PacketPayload(), - structure(structure), - data(static_cast(structure->data), - static_cast(structure->data) + structure->length) {} +Header::Header(const struct sr_datafeed_header *structure) : + PacketPayload(), + StructureWrapper(structure) +{ +} + +Header::~Header() +{ +} + +int Header::get_feed_version() +{ + return structure->feed_version; +} + +Glib::TimeVal Header::get_start_time() +{ + return Glib::TimeVal( + structure->starttime.tv_sec, + structure->starttime.tv_usec); +} + +Meta::Meta(const struct sr_datafeed_meta *structure) : + PacketPayload(), + StructureWrapper(structure) +{ +} + +Meta::~Meta() +{ +} + +map Meta::get_config() +{ + map result; + for (auto l = structure->config; l; l = l->next) + { + auto config = (struct sr_config *) l->data; + result[ConfigKey::get(config->key)] = Glib::VariantBase(config->data); + } + return result; +} + +Logic::Logic(const struct sr_datafeed_logic *structure) : + PacketPayload(), + StructureWrapper(structure) +{ +} Logic::~Logic() { } -void *Logic::get_data() +void *Logic::get_data_pointer() { return structure->data; } -size_t Logic::get_data_size() +size_t Logic::get_data_length() { return structure->length; } +unsigned int Logic::get_unit_size() +{ + return structure->unitsize; +} + Analog::Analog(const struct sr_datafeed_analog *structure) : PacketPayload(), - structure(structure) + StructureWrapper(structure) { } @@ -970,19 +1054,23 @@ Analog::~Analog() { } -void *Analog::get_data() +float *Analog::get_data_pointer() { return structure->data; } -size_t Analog::get_data_size() +unsigned int Analog::get_num_samples() { - return structure->num_samples * sizeof(float); + return structure->num_samples; } -unsigned int Analog::get_num_samples() +vector> Analog::get_channels() { - return structure->num_samples; + vector> result; + for (auto l = structure->channels; l; l = l->next) + result.push_back(parent->device->get_channel( + (struct sr_channel *)l->data)); + return result; } const Quantity *Analog::get_mq()