]> sigrok.org Git - libsigrok.git/commitdiff
bindings: Add UserDevice wrapping.
authorMartin Ling <redacted>
Wed, 12 Nov 2014 02:23:02 +0000 (02:23 +0000)
committerUwe Hermann <redacted>
Thu, 13 Nov 2014 17:37:57 +0000 (18:37 +0100)
bindings/cxx/classes.cpp
bindings/cxx/include/libsigrok/libsigrok.hpp
bindings/swig/classes.i

index 3e8acc0abb41d1a4558b117d0dc932f59e67eb95..bed6bed8529edb170c1cfe5c8a22fd6a2d2a1816 100644 (file)
@@ -214,6 +214,13 @@ shared_ptr<Session> Context::create_session()
                new Session(shared_from_this()), Session::Deleter());
 }
 
+shared_ptr<UserDevice> Context::create_user_device(
+               string vendor, string model, string version)
+{
+       return shared_ptr<UserDevice>(
+               new UserDevice(vendor, model, version), UserDevice::Deleter());
+}
+
 shared_ptr<Session> Context::load_session(string filename)
 {
        return shared_ptr<Session>(
@@ -522,6 +529,34 @@ shared_ptr<Driver> HardwareDevice::driver()
        return _driver;
 }
 
+UserDevice::UserDevice(string vendor, string model, string version) :
+       UserOwned(sr_dev_inst_user_new(
+               vendor.c_str(), model.c_str(), version.c_str())),
+       Device(UserOwned::_structure)
+{
+}
+
+UserDevice::~UserDevice()
+{
+}
+
+shared_ptr<Device> UserDevice::get_shared_from_this()
+{
+       return static_pointer_cast<Device>(shared_from_this());
+}
+
+shared_ptr<Channel> UserDevice::add_channel(unsigned int index,
+       const ChannelType *type, string name)
+{
+       check(sr_dev_inst_channel_add(Device::_structure,
+               index, type->id(), name.c_str()));
+       struct sr_channel *structure = (struct sr_channel *)
+                       g_slist_last(sr_dev_inst_channels_get(Device::_structure))->data;
+       Channel *channel = new Channel(structure);
+       _channels[structure] = channel;
+       return get_channel(structure);
+}
+
 Channel::Channel(struct sr_channel *structure) :
        ParentOwned(structure),
        _type(ChannelType::get(_structure->type))
index 3582646fee28954fb772e41986cd7adebe378a9c..6b4fbfc175fb364c57b87c437f0ab00ba9ef51e1 100644 (file)
@@ -114,6 +114,7 @@ class SR_API InputDevice;
 class SR_API Output;
 class SR_API DataType;
 class SR_API Option;
+class SR_API UserDevice;
 
 /** Exception thrown when an error code is returned by any libsigrok call. */
 class SR_API Error: public exception
@@ -263,6 +264,9 @@ public:
        void set_log_callback_default();
        /** Create a new session. */
        shared_ptr<Session> create_session();
+       /** Create a new user device. */
+       shared_ptr<UserDevice> create_user_device(
+               string vendor, string model, string version);
        /** Load a saved session.
         * @param filename File name string. */
        shared_ptr<Session> load_session(string filename);
@@ -416,6 +420,28 @@ protected:
        friend class ChannelGroup;
 };
 
+/** A virtual device, created by the user */
+class SR_API UserDevice :
+       public UserOwned<UserDevice, struct sr_dev_inst>,
+       public Device
+{
+public:
+       /** Add a new channel to this device. */
+       shared_ptr<Channel> add_channel(unsigned int index, const ChannelType *type, string name);
+protected:
+       UserDevice(string vendor, string model, string version);
+       ~UserDevice();
+       shared_ptr<Device> get_shared_from_this();
+       /** Deleter needed to allow shared_ptr use with protected destructor. */
+       class Deleter
+       {
+       public:
+               void operator()(UserDevice *device) { delete device; }
+       };
+       friend class Context;
+       friend class Deleter;
+};
+
 /** A channel on a device */
 class SR_API Channel :
        public ParentOwned<Channel, Device, struct sr_channel>
@@ -440,6 +466,7 @@ protected:
        ~Channel();
        const ChannelType * const _type;
        friend class Device;
+       friend class UserDevice;
        friend class ChannelGroup;
        friend class Session;
        friend class TriggerStage;
index 2212d9b3e7dceca6e04817e6eead97b40b32eacd..92aa3871682c7df72ac19a36d0983e765049d480 100644 (file)
@@ -84,6 +84,7 @@ template< class T > class enable_shared_from_this;
 %shared_ptr(sigrok::Trigger);
 %shared_ptr(sigrok::TriggerStage);
 %shared_ptr(sigrok::TriggerMatch);
+%shared_ptr(sigrok::UserDevice);
 
 %template(StringMap) std::map<std::string, std::string>;