X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Fclasses.cpp;h=357c9d6f3cbccac46f24a7d1c74025c525b40324;hb=81b3ce374c3b6d48e5ed321ac7a871ce4248a0bb;hp=bed6bed8529edb170c1cfe5c8a22fd6a2d2a1816;hpb=9fa5b426ec7c0a77eb9401f3dd10ad463a8d1ac7;p=libsigrok.git diff --git a/bindings/cxx/classes.cpp b/bindings/cxx/classes.cpp index bed6bed8..357c9d6f 100644 --- a/bindings/cxx/classes.cpp +++ b/bindings/cxx/classes.cpp @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -#include "libsigrok/libsigrok.hpp" +#include "libsigrokcxx/libsigrokcxx.hpp" #include #include @@ -77,7 +77,7 @@ Context::Context() : { check(sr_init(&_structure)); - struct sr_dev_driver **driver_list = sr_driver_list(); + struct sr_dev_driver **driver_list = sr_driver_list(_structure); if (driver_list) for (int i = 0; driver_list[i]; i++) _drivers[driver_list[i]->name] = @@ -221,6 +221,70 @@ shared_ptr Context::create_user_device( new UserDevice(vendor, model, version), UserDevice::Deleter()); } +shared_ptr Context::create_header_packet(Glib::TimeVal start_time) +{ + auto header = g_new(struct sr_datafeed_header, 1); + header->feed_version = 1; + header->starttime.tv_sec = start_time.tv_sec; + header->starttime.tv_usec = start_time.tv_usec; + auto packet = g_new(struct sr_datafeed_packet, 1); + packet->type = SR_DF_HEADER; + packet->payload = header; + return shared_ptr(new Packet(nullptr, packet), Packet::Deleter()); +} + +shared_ptr Context::create_meta_packet( + map config) +{ + auto meta = g_new0(struct sr_datafeed_meta, 1); + for (auto input : config) + { + auto key = input.first; + auto value = input.second; + auto output = g_new(struct sr_config, 1); + output->key = key->id(); + output->data = value.gobj(); + g_variant_ref(output->data); + meta->config = g_slist_append(meta->config, output); + } + auto packet = g_new(struct sr_datafeed_packet, 1); + packet->type = SR_DF_META; + packet->payload = meta; + return shared_ptr(new Packet(nullptr, packet), Packet::Deleter()); +} + +shared_ptr Context::create_logic_packet( + void *data_pointer, size_t data_length, unsigned int unit_size) +{ + auto logic = g_new(struct sr_datafeed_logic, 1); + logic->length = data_length; + logic->unitsize = unit_size; + logic->data = data_pointer; + auto packet = g_new(struct sr_datafeed_packet, 1); + packet->type = SR_DF_LOGIC; + packet->payload = logic; + return shared_ptr(new Packet(nullptr, packet), Packet::Deleter()); +} + +shared_ptr Context::create_analog_packet( + vector > channels, + float *data_pointer, unsigned int num_samples, const Quantity *mq, + const Unit *unit, vector mqflags) +{ + auto analog = g_new0(struct sr_datafeed_analog, 1); + for (auto channel : channels) + analog->channels = g_slist_append(analog->channels, channel->_structure); + analog->num_samples = num_samples; + analog->mq = mq->id(); + analog->unit = unit->id(); + analog->mqflags = QuantityFlag::mask_from_flags(mqflags); + analog->data = data_pointer; + auto packet = g_new(struct sr_datafeed_packet, 1); + packet->type = SR_DF_ANALOG; + packet->payload = analog; + return shared_ptr(new Packet(nullptr, packet), Packet::Deleter()); +} + shared_ptr Context::load_session(string filename) { return shared_ptr( @@ -254,6 +318,20 @@ shared_ptr Context::open_stream(string header) new Input(shared_from_this(), input), Input::Deleter()); } +map Context::serials(shared_ptr driver) +{ + GSList *serial_list = sr_serial_list(driver ? driver->_structure : NULL); + map serials; + + for (GSList *serial = serial_list; serial; serial = serial->next) { + struct sr_serial_port *port = (sr_serial_port *) serial->data; + serials[string(port->name)] = string(port->description); + } + + g_slist_free_full(serial_list, (GDestroyNotify)sr_serial_free); + return serials; +} + Driver::Driver(struct sr_dev_driver *structure) : ParentOwned(structure), Configurable(structure, NULL, NULL), @@ -574,8 +652,7 @@ string Channel::name() void Channel::set_name(string name) { - check(sr_dev_channel_name_set(_parent->_structure, - _structure->index, name.c_str())); + check(sr_dev_channel_name_set(_structure, name.c_str())); } const ChannelType *Channel::type() @@ -590,7 +667,7 @@ bool Channel::enabled() void Channel::set_enabled(bool value) { - check(sr_dev_channel_enable(_parent->_structure, _structure->index, value)); + check(sr_dev_channel_enable(_structure, value)); } unsigned int Channel::index() @@ -811,7 +888,7 @@ Session::Session(shared_ptr context) : _context(context), _saving(false) { - check(sr_session_new(&_structure)); + check(sr_session_new(context->_structure, &_structure)); _context->_session = this; } @@ -821,7 +898,7 @@ Session::Session(shared_ptr context, string filename) : _filename(filename), _saving(false) { - check(sr_session_load(filename.c_str(), &_structure)); + check(sr_session_load(context->_structure, filename.c_str(), &_structure)); GSList *dev_list; check(sr_session_dev_list(_structure, &dev_list)); for (GSList *dev = dev_list; dev; dev = dev->next) @@ -1074,7 +1151,11 @@ shared_ptr Session::trigger() void Session::set_trigger(shared_ptr trigger) { - check(sr_session_trigger_set(_structure, trigger->_structure)); + if (!trigger) + // Set NULL trigger, i.e. remove any trigger from the session. + check(sr_session_trigger_set(_structure, NULL)); + else + check(sr_session_trigger_set(_structure, trigger->_structure)); _trigger = trigger; } @@ -1083,6 +1164,11 @@ string Session::filename() return _filename; } +shared_ptr Session::context() +{ + return _context; +} + Packet::Packet(shared_ptr device, const struct sr_datafeed_packet *structure) : UserOwned(structure), @@ -1298,15 +1384,27 @@ string InputFormat::description() return valid_string(sr_input_description_get(_structure)); } +vector InputFormat::extensions() +{ + vector exts; + for (const char *const *e = sr_input_extensions_get(_structure); + e && *e; e++) + exts.push_back(*e); + return exts; +} + map> InputFormat::options() { 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