X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=bindings%2Fcxx%2Fclasses.cpp;h=55eba8e486340e274c5b96216cb025d248e4ea24;hb=ba4eac48d4c7277d8b7cbe4036fb64610b8e6c61;hp=044e8c4565b706e997ea95a84c8f72caff9a4ec3;hpb=f36ca8893d575d42eae0b103768ac7d8a4320322;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index 044e8c45..55eba8e4 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -40,16 +40,15 @@ static const char *valid_string(const char *input) return ""; } -/** Helper function to convert between map and GHashTable */ - -static GHashTable *map_to_hash(map input) +/** Helper function to convert between map and GHashTable */ +static GHashTable *map_to_hash_variant(map input) { auto output = g_hash_table_new_full( - g_str_hash, g_str_equal, g_free, g_free); + g_str_hash, g_str_equal, g_free, (GDestroyNotify) g_variant_unref); for (auto entry : input) g_hash_table_insert(output, g_strdup(entry.first.c_str()), - g_strdup(entry.second.c_str())); + entry.second.gobj_copy()); return output; } @@ -80,15 +79,15 @@ Context::Context() : for (int i = 0; driver_list[i]; i++) drivers[driver_list[i]->name] = new Driver(driver_list[i]); - struct sr_input_format **input_list = sr_input_list(); + const struct sr_input_module **input_list = sr_input_list(); if (input_list) for (int i = 0; input_list[i]; i++) - input_formats[input_list[i]->id] = + input_formats[sr_input_id_get(input_list[i])] = new InputFormat(input_list[i]); - struct sr_output_format **output_list = sr_output_list(); + const struct sr_output_module **output_list = sr_output_list(); if (output_list) for (int i = 0; output_list[i]; i++) - output_formats[output_list[i]->id] = + output_formats[sr_output_id_get(output_list[i])] = new OutputFormat(output_list[i]); } @@ -227,8 +226,29 @@ shared_ptr Context::create_trigger(string name) new Trigger(shared_from_this(), name), Trigger::Deleter()); } +shared_ptr Context::open_file(string filename) +{ + const struct sr_input *input; + + check( sr_input_scan_file(filename.c_str(), &input)); + return shared_ptr( + new Input(shared_from_this(), input), Input::Deleter()); +} + +shared_ptr Context::open_stream(string header) +{ + const struct sr_input *input; + + auto gstr = g_string_new(header.c_str()); + auto ret = sr_input_scan_buffer(gstr, &input); + g_string_free(gstr, true); + check(ret); + return shared_ptr( + new Input(shared_from_this(), input), Input::Deleter()); +} + Driver::Driver(struct sr_dev_driver *structure) : - StructureWrapper(structure), + StructureWrapper(structure), initialized(false) { } @@ -341,7 +361,7 @@ Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) Device::Device(struct sr_dev_inst *structure) : Configurable(structure->driver, structure, NULL), - StructureWrapper(structure) + structure(structure) { for (GSList *entry = structure->channels; entry; entry = entry->next) { @@ -398,14 +418,14 @@ vector> Device::get_channels() vector> result; for (auto entry : channels) result.push_back(static_pointer_cast( - entry.second->get_shared_pointer(this))); + entry.second->get_shared_pointer(get_shared_from_this()))); return result; } shared_ptr Device::get_channel(struct sr_channel *ptr) { return static_pointer_cast( - channels[ptr]->get_shared_pointer(this)); + channels[ptr]->get_shared_pointer(get_shared_from_this())); } map> @@ -417,7 +437,7 @@ Device::get_channel_groups() auto name = entry.first; auto channel_group = entry.second; result[name] = static_pointer_cast( - channel_group->get_shared_pointer(this)); + channel_group->get_shared_pointer(get_shared_from_this())); } return result; } @@ -433,6 +453,7 @@ void Device::close() } HardwareDevice::HardwareDevice(Driver *driver, struct sr_dev_inst *structure) : + StructureWrapper(structure), Device(structure), driver(driver) { @@ -442,13 +463,19 @@ HardwareDevice::~HardwareDevice() { } +shared_ptr HardwareDevice::get_shared_from_this() +{ + return static_pointer_cast( + static_pointer_cast(shared_from_this())); +} + shared_ptr HardwareDevice::get_driver() { return static_pointer_cast(driver->get_shared_pointer(parent)); } Channel::Channel(struct sr_channel *structure) : - StructureWrapper(structure), + StructureWrapper(structure), type(ChannelType::get(structure->type)) { } @@ -482,9 +509,14 @@ void Channel::set_enabled(bool value) check(sr_dev_channel_enable(parent->structure, structure->index, value)); } +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) @@ -547,7 +579,7 @@ shared_ptr Trigger::add_stage() } TriggerStage::TriggerStage(struct sr_trigger_stage *structure) : - StructureWrapper(structure) + StructureWrapper(structure) { } @@ -584,7 +616,7 @@ void TriggerStage::add_match(shared_ptr channel, const TriggerMatchType } TriggerMatch::TriggerMatch(struct sr_trigger_match *structure, shared_ptr channel) : - StructureWrapper(structure), channel(channel) + StructureWrapper(structure), channel(channel) { } @@ -708,9 +740,6 @@ vector> Session::get_devices() for (GSList *dev = dev_list; dev; dev = dev->next) { auto sdi = (struct sr_dev_inst *) dev->data; - if (devices.count(sdi) == 0) - devices[sdi] = shared_ptr( - new Device(sdi), Device::Deleter()); result.push_back(devices[sdi]); } return result; @@ -944,6 +973,9 @@ Packet::Packet(shared_ptr device, static_cast( structure->payload)); break; + default: + payload = nullptr; + break; } } @@ -960,7 +992,10 @@ const PacketType *Packet::get_type() shared_ptr Packet::get_payload() { - return payload->get_shared_pointer(this); + if (payload) + return payload->get_shared_pointer(this); + else + throw Error(SR_ERR_NA); } PacketPayload::PacketPayload() @@ -972,8 +1007,8 @@ PacketPayload::~PacketPayload() } Header::Header(const struct sr_datafeed_header *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -981,6 +1016,13 @@ Header::~Header() { } +shared_ptr Header::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast
( + StructureWrapper::get_shared_pointer(parent))); +} + int Header::get_feed_version() { return structure->feed_version; @@ -994,8 +1036,8 @@ Glib::TimeVal Header::get_start_time() } Meta::Meta(const struct sr_datafeed_meta *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1003,6 +1045,13 @@ Meta::~Meta() { } +shared_ptr Meta::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast( + StructureWrapper::get_shared_pointer(parent))); +} + map Meta::get_config() { map result; @@ -1015,8 +1064,8 @@ map Meta::get_config() } Logic::Logic(const struct sr_datafeed_logic *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1024,6 +1073,13 @@ Logic::~Logic() { } +shared_ptr Logic::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast( + StructureWrapper::get_shared_pointer(parent))); +} + void *Logic::get_data_pointer() { return structure->data; @@ -1040,8 +1096,8 @@ unsigned int Logic::get_unit_size() } Analog::Analog(const struct sr_datafeed_analog *structure) : - PacketPayload(), - StructureWrapper(structure) + StructureWrapper(structure), + PacketPayload() { } @@ -1049,6 +1105,13 @@ Analog::~Analog() { } +shared_ptr Analog::get_shared_pointer(Packet *parent) +{ + return static_pointer_cast( + static_pointer_cast( + StructureWrapper::get_shared_pointer(parent))); +} + float *Analog::get_data_pointer() { return structure->data; @@ -1083,8 +1146,8 @@ vector Analog::get_mq_flags() return QuantityFlag::flags_from_mask(structure->mqflags); } -InputFormat::InputFormat(struct sr_input_format *structure) : - StructureWrapper(structure) +InputFormat::InputFormat(const struct sr_input_module *structure) : + StructureWrapper(structure) { } @@ -1094,56 +1157,131 @@ InputFormat::~InputFormat() string InputFormat::get_name() { - return valid_string(structure->id); + return valid_string(sr_input_id_get(structure)); } string InputFormat::get_description() { - return valid_string(structure->description); + return valid_string(sr_input_description_get(structure)); } -bool InputFormat::format_match(string filename) +map> InputFormat::get_options() { - return structure->format_match(filename.c_str()); + const struct sr_option **options = sr_input_options_get(structure); + auto option_array = shared_ptr( + options, sr_input_options_free); + map> result; + for (int i = 0; options[i]; i++) + result[options[i]->id] = shared_ptr