]> sigrok.org Git - libsigrok.git/blobdiff - bindings/cxx/classes.cpp
Rename sr_driver_scan_options() to sr_driver_scan_options_list().
[libsigrok.git] / bindings / cxx / classes.cpp
index c5ce63864359eeb08fe6a956debbc001dd2f3a21..3be1d99477d45818bd94598ff7a3b5391ff5599a 100644 (file)
@@ -278,7 +278,7 @@ shared_ptr<Packet> Context::create_header_packet(Glib::TimeVal start_time)
 }
 
 shared_ptr<Packet> Context::create_meta_packet(
-       const map<const ConfigKey *, Glib::VariantBase> &config)
+       map<const ConfigKey *, Glib::VariantBase> config)
 {
        auto meta = g_new0(struct sr_datafeed_meta, 1);
        for (const auto &input : config)
@@ -311,9 +311,9 @@ shared_ptr<Packet> Context::create_logic_packet(
 }
 
 shared_ptr<Packet> Context::create_analog_packet(
-       const vector<shared_ptr<Channel> > &channels,
+       vector<shared_ptr<Channel> > channels,
        float *data_pointer, unsigned int num_samples, const Quantity *mq,
-       const Unit *unit, const vector<const QuantityFlag *> &mqflags)
+       const Unit *unit, vector<const QuantityFlag *> mqflags)
 {
        auto analog = g_new0(struct sr_datafeed_analog, 1);
        auto meaning = g_new0(struct sr_analog_meaning, 1);
@@ -325,7 +325,7 @@ shared_ptr<Packet> Context::create_analog_packet(
        analog->num_samples = num_samples;
        meaning->mq = static_cast<sr_mq>(mq->id());
        meaning->unit = static_cast<sr_unit>(unit->id());
-       meaning->mqflags = static_cast<sr_mqflag>(QuantityFlag::mask_from_flags(mqflags));
+       meaning->mqflags = static_cast<sr_mqflag>(QuantityFlag::mask_from_flags(move(mqflags)));
        analog->data = data_pointer;
        auto packet = g_new(struct sr_datafeed_packet, 1);
        packet->type = SR_DF_ANALOG;
@@ -406,8 +406,18 @@ string Driver::long_name() const
        return valid_string(_structure->longname);
 }
 
+set<const ConfigKey *> Driver::scan_options() const
+{
+       GArray *opts = sr_driver_scan_options_list(_structure);
+       set<const ConfigKey *> result;
+       for (guint i = 0; i < opts->len; i++)
+               result.insert(ConfigKey::get(g_array_index(opts, uint32_t, i)));
+       g_array_free(opts, TRUE);
+       return result;
+}
+
 vector<shared_ptr<HardwareDevice>> Driver::scan(
-       const map<const ConfigKey *, Glib::VariantBase> &options)
+       map<const ConfigKey *, Glib::VariantBase> options)
 {
        /* Initialise the driver if not yet done. */
        if (!_initialized)
@@ -466,6 +476,21 @@ Configurable::~Configurable()
 {
 }
 
+set<const ConfigKey *> Configurable::config_keys() const
+{
+       GArray *opts;
+       set<const ConfigKey *> result;
+
+       opts = sr_dev_options(config_driver, config_sdi, config_channel_group);
+
+       for (guint i = 0; i < opts->len; i++)
+               result.insert(ConfigKey::get(g_array_index(opts, uint32_t, i)));
+
+       g_array_free(opts, TRUE);
+
+       return result;
+}
+
 Glib::VariantBase Configurable::config_get(const ConfigKey *key) const
 {
        GVariant *data;
@@ -482,73 +507,36 @@ void Configurable::config_set(const ConfigKey *key, const Glib::VariantBase &val
                key->id(), const_cast<GVariant*>(value.gobj())));
 }
 
-Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) const
+set<const Capability *> Configurable::config_capabilities(const ConfigKey *key) const
 {
-       GVariant *data;
-       check(sr_config_list(
-               config_driver, config_sdi, config_channel_group,
-               key->id(), &data));
-       return Glib::VariantContainerBase(data);
-}
+       int caps = sr_dev_config_capabilities_list(config_sdi,
+                               config_channel_group, key->id());
 
-map<const ConfigKey *, set<Capability>> Configurable::config_keys(const ConfigKey *key)
-{
-       GVariant *gvar_opts;
-       gsize num_opts;
-       const uint32_t *opts;
-       map<const ConfigKey *, set<Capability>> result;
+       set<const Capability *> result;
 
-       check(sr_config_list(
-               config_driver, config_sdi, config_channel_group,
-               key->id(), &gvar_opts));
-
-       opts = static_cast<const uint32_t *>(g_variant_get_fixed_array(
-               gvar_opts, &num_opts, sizeof(uint32_t)));
-
-       for (gsize i = 0; i < num_opts; i++)
-       {
-               auto key = ConfigKey::get(opts[i] & SR_CONF_MASK);
-               set<Capability> 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);
+       for (auto cap: Capability::values())
+               if (caps & cap->id())
+                       result.insert(cap);
 
        return result;
 }
 
 bool Configurable::config_check(const ConfigKey *key,
-       const ConfigKey *index_key) const
+       const Capability *capability) const
 {
-       GVariant *gvar_opts;
-       gsize num_opts;
-       const uint32_t *opts;
-
-       if (sr_config_list(config_driver, config_sdi, config_channel_group,
-                       index_key->id(), &gvar_opts) != SR_OK)
-               return false;
-
-       opts = static_cast<const uint32_t *>(g_variant_get_fixed_array(
-               gvar_opts, &num_opts, sizeof(uint32_t)));
-
-       for (gsize i = 0; i < num_opts; i++)
-       {
-               if ((opts[i] & SR_CONF_MASK) == unsigned(key->id()))
-               {
-                       g_variant_unref(gvar_opts);
-                       return true;
-               }
-       }
+       int caps = sr_dev_config_capabilities_list(config_sdi,
+                               config_channel_group, key->id());
 
-       g_variant_unref(gvar_opts);
+       return (caps & capability->id());
+}
 
-       return false;
+Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key) const
+{
+       GVariant *data;
+       check(sr_config_list(
+               config_driver, config_sdi, config_channel_group,
+               key->id(), &data));
+       return Glib::VariantContainerBase(data);
 }
 
 Device::Device(struct sr_dev_inst *structure) :
@@ -1140,7 +1128,7 @@ map<const ConfigKey *, Glib::VariantBase> Meta::config() const
        map<const ConfigKey *, Glib::VariantBase> result;
        for (auto l = _structure->config; l; l = l->next) {
                auto *const config = static_cast<struct sr_config *>(l->data);
-               result[ConfigKey::get(config->key)] = Glib::VariantBase(config->data);
+               result[ConfigKey::get(config->key)] = Glib::VariantBase(config->data, true);
        }
        return result;
 }
@@ -1274,7 +1262,7 @@ map<string, shared_ptr<Option>> InputFormat::options()
 }
 
 shared_ptr<Input> InputFormat::create_input(
-       const map<string, Glib::VariantBase> &options)
+       map<string, Glib::VariantBase> options)
 {
        auto input = sr_input_new(_structure, map_to_hash_variant(options));
        if (!input)
@@ -1423,18 +1411,18 @@ map<string, shared_ptr<Option>> OutputFormat::options()
 }
 
 shared_ptr<Output> OutputFormat::create_output(
-       shared_ptr<Device> device, const map<string, Glib::VariantBase> &options)
+       shared_ptr<Device> device, map<string, Glib::VariantBase> options)
 {
        return shared_ptr<Output>{
-               new Output{shared_from_this(), move(device), options},
+               new Output{shared_from_this(), move(device), move(options)},
                default_delete<Output>{}};
 }
 
 shared_ptr<Output> OutputFormat::create_output(string filename,
-       shared_ptr<Device> device, const map<string, Glib::VariantBase> &options)
+       shared_ptr<Device> device, map<string, Glib::VariantBase> options)
 {
        return shared_ptr<Output>{
-               new Output{move(filename), shared_from_this(), move(device), options},
+               new Output{move(filename), shared_from_this(), move(device), move(options)},
                default_delete<Output>{}};
 }
 
@@ -1444,22 +1432,22 @@ bool OutputFormat::test_flag(const OutputFlag *flag) const
 }
 
 Output::Output(shared_ptr<OutputFormat> format,
-               shared_ptr<Device> device, const map<string, Glib::VariantBase> &options) :
+               shared_ptr<Device> device, map<string, Glib::VariantBase> options) :
        _structure(sr_output_new(format->_structure,
                map_to_hash_variant(options), device->_structure, nullptr)),
        _format(move(format)),
        _device(move(device)),
-       _options(options)
+       _options(move(options))
 {
 }
 
 Output::Output(string filename, shared_ptr<OutputFormat> format,
-               shared_ptr<Device> device, const map<string, Glib::VariantBase> &options) :
+               shared_ptr<Device> device, map<string, Glib::VariantBase> options) :
        _structure(sr_output_new(format->_structure,
                map_to_hash_variant(options), device->_structure, filename.c_str())),
        _format(move(format)),
        _device(move(device)),
-       _options(options)
+       _options(move(options))
 {
 }