]> sigrok.org Git - libsigrok.git/blobdiff - bindings/cxx/classes.cpp
C++: Preserve original channel ordering.
[libsigrok.git] / bindings / cxx / classes.cpp
index 525e046ddcc168fad28e599345bef3c9e7d53ac7..76d3e8ecfed5c9a32d22967016e0adde7901ac63 100644 (file)
@@ -248,6 +248,7 @@ shared_ptr<Input> Context::open_stream(string header)
 
 Driver::Driver(struct sr_dev_driver *structure) :
        ParentOwned(structure),
+       Configurable(structure, NULL, NULL),
        initialized(false)
 {
 }
@@ -357,6 +358,56 @@ Glib::VariantContainerBase Configurable::config_list(const ConfigKey *key)
        return Glib::VariantContainerBase(data);
 }
 
+vector<const ConfigKey *> Configurable::config_keys(const ConfigKey *key)
+{
+       GVariant *gvar_opts;
+       gsize num_opts;
+       const int32_t *opts;
+       vector<const ConfigKey *> result;
+
+       check(sr_config_list(
+               config_driver, config_sdi, config_channel_group,
+               key->get_id(), &gvar_opts));
+
+       opts = (const int32_t *) g_variant_get_fixed_array(
+               gvar_opts, &num_opts, sizeof(int32_t));
+
+       for (gsize i = 0; i < num_opts; i++)
+               result.push_back(ConfigKey::get(opts[i]));
+
+       g_variant_unref(gvar_opts);
+
+       return result;
+}
+
+bool Configurable::config_check(const ConfigKey *key,
+       const ConfigKey *index_key)
+{
+       GVariant *gvar_opts;
+       gsize num_opts;
+       const int32_t *opts;
+
+       if (sr_config_list(config_driver, config_sdi, config_channel_group,
+                       index_key->get_id(), &gvar_opts) != SR_OK)
+               return false;
+
+       opts = (const int32_t *) g_variant_get_fixed_array(
+               gvar_opts, &num_opts, sizeof(int32_t));
+
+       for (gsize i = 0; i < num_opts; i++)
+       {
+               if (opts[i] == key->get_id())
+               {
+                       g_variant_unref(gvar_opts);
+                       return true;
+               }
+       }
+
+       g_variant_unref(gvar_opts);
+
+       return false;
+}
+
 Device::Device(struct sr_dev_inst *structure) :
        Configurable(structure->driver, structure, NULL),
        structure(structure)
@@ -414,8 +465,10 @@ string Device::get_version()
 vector<shared_ptr<Channel>> Device::get_channels()
 {
        vector<shared_ptr<Channel>> result;
-       for (auto entry : channels)
-               result.push_back(entry.second->get_shared_pointer(get_shared_from_this()));
+       for (auto channel = structure->channels; channel; channel = channel->next)
+               result.push_back(
+                       channels[(struct sr_channel *) channel->data]->get_shared_pointer(
+                               get_shared_from_this()));
        return result;
 }
 
@@ -1011,7 +1064,8 @@ Header::~Header()
 
 shared_ptr<PacketPayload> Header::get_shared_pointer(Packet *parent)
 {
-       return static_pointer_cast<PacketPayload>(get_shared_pointer(parent));
+       return static_pointer_cast<PacketPayload>(
+               ParentOwned::get_shared_pointer(parent));
 }
 
 int Header::get_feed_version()
@@ -1038,7 +1092,8 @@ Meta::~Meta()
 
 shared_ptr<PacketPayload> Meta::get_shared_pointer(Packet *parent)
 {
-       return static_pointer_cast<PacketPayload>(get_shared_pointer(parent));
+       return static_pointer_cast<PacketPayload>(
+               ParentOwned::get_shared_pointer(parent));
 }
 
 map<const ConfigKey *, Glib::VariantBase> Meta::get_config()
@@ -1064,7 +1119,8 @@ Logic::~Logic()
 
 shared_ptr<PacketPayload> Logic::get_shared_pointer(Packet *parent)
 {
-       return static_pointer_cast<PacketPayload>(get_shared_pointer(parent));
+       return static_pointer_cast<PacketPayload>(
+               ParentOwned::get_shared_pointer(parent));
 }
 
 void *Logic::get_data_pointer()
@@ -1094,7 +1150,8 @@ Analog::~Analog()
 
 shared_ptr<PacketPayload> Analog::get_shared_pointer(Packet *parent)
 {
-       return static_pointer_cast<PacketPayload>(get_shared_pointer(parent));
+       return static_pointer_cast<PacketPayload>(
+               ParentOwned::get_shared_pointer(parent));
 }
 
 float *Analog::get_data_pointer()