bindings: Support get_channel_groups() on base Device class.

This commit is contained in:
Martin Ling 2014-07-24 12:41:49 +01:00
parent 2928f47d64
commit 6be7a7f287
3 changed files with 33 additions and 32 deletions

View File

@ -346,12 +346,20 @@ Device::Device(struct sr_dev_inst *structure) :
auto channel = (struct sr_channel *) entry->data; auto channel = (struct sr_channel *) entry->data;
channels[channel] = 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() Device::~Device()
{ {
for (auto entry : channels) for (auto entry : channels)
delete entry.second; delete entry.second;
for (auto entry : channel_groups)
delete entry.second;
} }
string Device::get_vendor() string Device::get_vendor()
@ -384,6 +392,20 @@ shared_ptr<Channel> Device::get_channel(struct sr_channel *ptr)
channels[ptr]->get_shared_pointer(this)); channels[ptr]->get_shared_pointer(this));
} }
map<string, shared_ptr<ChannelGroup>>
Device::get_channel_groups()
{
map<string, shared_ptr<ChannelGroup>> result;
for (auto entry: channel_groups)
{
auto name = entry.first;
auto channel_group = entry.second;
result[name] = static_pointer_cast<ChannelGroup>(
channel_group->get_shared_pointer(this));
}
return result;
}
void Device::open() void Device::open()
{ {
check(sr_dev_open(structure)); check(sr_dev_open(structure));
@ -398,17 +420,10 @@ HardwareDevice::HardwareDevice(Driver *driver, struct sr_dev_inst *structure) :
Device(structure), Device(structure),
driver(driver) 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() HardwareDevice::~HardwareDevice()
{ {
for (auto entry : channel_groups)
delete entry.second;
} }
shared_ptr<Driver> HardwareDevice::get_driver() shared_ptr<Driver> HardwareDevice::get_driver()
@ -416,20 +431,6 @@ shared_ptr<Driver> HardwareDevice::get_driver()
return static_pointer_cast<Driver>(driver->get_shared_pointer(parent)); return static_pointer_cast<Driver>(driver->get_shared_pointer(parent));
} }
map<string, shared_ptr<ChannelGroup>>
HardwareDevice::get_channel_groups()
{
map<string, shared_ptr<ChannelGroup>> result;
for (auto entry: channel_groups)
{
auto name = entry.first;
auto channel_group = entry.second;
result[name] = static_pointer_cast<ChannelGroup>(
channel_group->get_shared_pointer(this));
}
return result;
}
Channel::Channel(struct sr_channel *structure) : Channel::Channel(struct sr_channel *structure) :
StructureWrapper<Device, struct sr_channel>(structure), StructureWrapper<Device, struct sr_channel>(structure),
type(ChannelType::get(structure->type)) type(ChannelType::get(structure->type))
@ -465,9 +466,9 @@ void Channel::set_enabled(bool value)
check(sr_dev_channel_enable(parent->structure, structure->index, value)); check(sr_dev_channel_enable(parent->structure, structure->index, value));
} }
ChannelGroup::ChannelGroup(HardwareDevice *device, ChannelGroup::ChannelGroup(Device *device,
struct sr_channel_group *structure) : struct sr_channel_group *structure) :
StructureWrapper<HardwareDevice, struct sr_channel_group>(structure), StructureWrapper<Device, struct sr_channel_group>(structure),
Configurable(device->structure->driver, device->structure, structure) Configurable(device->structure->driver, device->structure, structure)
{ {
for (GSList *entry = structure->channels; entry; entry = entry->next) for (GSList *entry = structure->channels; entry; entry = entry->next)

View File

@ -284,6 +284,8 @@ public:
string get_version(); string get_version();
/** List of the channels available on this device. */ /** List of the channels available on this device. */
vector<shared_ptr<Channel> > get_channels(); vector<shared_ptr<Channel> > get_channels();
/** Channel groups available on this device, indexed by name. */
map<string, shared_ptr<ChannelGroup> > get_channel_groups();
/** Open device. */ /** Open device. */
void open(); void open();
/** Close device. */ /** Close device. */
@ -293,6 +295,7 @@ protected:
~Device(); ~Device();
shared_ptr<Channel> get_channel(struct sr_channel *ptr); shared_ptr<Channel> get_channel(struct sr_channel *ptr);
map<struct sr_channel *, Channel *> channels; map<struct sr_channel *, Channel *> channels;
map<string, ChannelGroup *> channel_groups;
/** Deleter needed to allow shared_ptr use with protected destructor. */ /** Deleter needed to allow shared_ptr use with protected destructor. */
class Deleter class Deleter
{ {
@ -313,13 +316,10 @@ class SR_API HardwareDevice : public Device
public: public:
/** Driver providing this device. */ /** Driver providing this device. */
shared_ptr<Driver> get_driver(); shared_ptr<Driver> get_driver();
/** Channel groups available on this device, indexed by name. */
map<string, shared_ptr<ChannelGroup> > get_channel_groups();
protected: protected:
HardwareDevice(Driver *driver, struct sr_dev_inst *structure); HardwareDevice(Driver *driver, struct sr_dev_inst *structure);
~HardwareDevice(); ~HardwareDevice();
Driver *driver; Driver *driver;
map<string, ChannelGroup *> channel_groups;
friend class Driver; friend class Driver;
friend class ChannelGroup; friend class ChannelGroup;
}; };
@ -350,7 +350,7 @@ protected:
/** A group of channels on a device, which share some configuration */ /** A group of channels on a device, which share some configuration */
class SR_API ChannelGroup : class SR_API ChannelGroup :
public StructureWrapper<HardwareDevice, struct sr_channel_group>, public StructureWrapper<Device, struct sr_channel_group>,
public Configurable public Configurable
{ {
public: public:
@ -359,10 +359,10 @@ public:
/** List of the channels in this group. */ /** List of the channels in this group. */
vector<shared_ptr<Channel> > get_channels(); vector<shared_ptr<Channel> > get_channels();
protected: protected:
ChannelGroup(HardwareDevice *device, struct sr_channel_group *structure); ChannelGroup(Device *device, struct sr_channel_group *structure);
~ChannelGroup(); ~ChannelGroup();
vector<Channel *> channels; vector<Channel *> channels;
friend class HardwareDevice; friend class Device;
}; };
/** A trigger configuration */ /** A trigger configuration */

View File

@ -188,14 +188,14 @@ typedef std::map<const sigrok::ConfigKey *, Glib::VariantBase>
std::vector<std::shared_ptr<sigrok::Channel> >, std::vector<std::shared_ptr<sigrok::Channel> >,
channels, get_channels); channels, get_channels);
%attributeval(sigrok::Device, map_string_ChannelGroup,
channel_groups, get_channel_groups);
/* Using %attributestring for shared_ptr attribute. See /* Using %attributestring for shared_ptr attribute. See
http://sourceforge.net/p/swig/mailman/message/31832070/ */ http://sourceforge.net/p/swig/mailman/message/31832070/ */
%attributestring(sigrok::HardwareDevice, %attributestring(sigrok::HardwareDevice,
std::shared_ptr<sigrok::Driver>, driver, get_driver); std::shared_ptr<sigrok::Driver>, driver, get_driver);
%attributeval(sigrok::HardwareDevice, map_string_ChannelGroup,
channel_groups, get_channel_groups);
%attributestring(sigrok::Channel, std::string, name, get_name, set_name); %attributestring(sigrok::Channel, std::string, name, get_name, set_name);
%attribute(sigrok::Channel, bool, enabled, get_enabled, set_enabled); %attribute(sigrok::Channel, bool, enabled, get_enabled, set_enabled);
%attribute(sigrok::Channel, const sigrok::ChannelType *, type, get_type); %attribute(sigrok::Channel, const sigrok::ChannelType *, type, get_type);