]> sigrok.org Git - libsigrok.git/blobdiff - bindings/cxx/classes.cpp
libsigrok.hpp: Fix incorrect glibmm.h #include.
[libsigrok.git] / bindings / cxx / classes.cpp
index 3e8acc0abb41d1a4558b117d0dc932f59e67eb95..78f484fa9dafffb8a188fd235c7cbf19d7f7e104 100644 (file)
@@ -214,6 +214,77 @@ 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<Packet> 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<Packet>(new Packet(nullptr, packet), Packet::Deleter());
+}
+
+shared_ptr<Packet> Context::create_meta_packet(
+       map<const ConfigKey *, Glib::VariantBase> 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<Packet>(new Packet(nullptr, packet), Packet::Deleter());
+}
+
+shared_ptr<Packet> 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<Packet>(new Packet(nullptr, packet), Packet::Deleter());
+}
+
+shared_ptr<Packet> Context::create_analog_packet(
+       vector<shared_ptr<Channel> > channels,
+       float *data_pointer, unsigned int num_samples, const Quantity *mq,
+       const Unit *unit, vector<const QuantityFlag *> 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<Packet>(new Packet(nullptr, packet), Packet::Deleter());
+}
+
 shared_ptr<Session> Context::load_session(string filename)
 {
        return shared_ptr<Session>(
@@ -247,6 +318,20 @@ shared_ptr<Input> Context::open_stream(string header)
                new Input(shared_from_this(), input), Input::Deleter());
 }
 
+map<string, string> Context::serials(shared_ptr<Driver> driver)
+{
+       GSList *serial_list = sr_serial_list(driver ? driver->_structure : NULL);
+       map<string, string> 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),
@@ -522,6 +607,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))
@@ -1039,7 +1152,11 @@ shared_ptr<Trigger> Session::trigger()
 
 void Session::set_trigger(shared_ptr<Trigger> 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;
 }
 
@@ -1048,6 +1165,11 @@ string Session::filename()
        return _filename;
 }
 
+shared_ptr<Context> Session::context()
+{
+       return _context;
+}
+
 Packet::Packet(shared_ptr<Device> device,
        const struct sr_datafeed_packet *structure) :
        UserOwned(structure),