]> sigrok.org Git - libsigrok.git/blame - bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp
Bindings: Provide helper method that auto-converts analog
[libsigrok.git] / bindings / cxx / include / libsigrokcxx / libsigrokcxx.hpp
CommitLineData
c23c8659
ML
1/*
2 * This file is part of the libsigrok project.
3 *
4 * Copyright (C) 2013-2014 Martin Ling <martin-sigrok@earth.li>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
07443fd2
ML
20/**
21
22@mainpage API Reference
23
24Introduction
25------------
26
52ff4f6a
UH
27The libsigrokcxx API provides an object-oriented C++ interface to the
28functionality in libsigrok, including automatic memory and resource management.
07443fd2
ML
29
30It is built on top of the public libsigrok C API, and is designed to be used as
31a standalone alternative API. Programs should not mix usage of the C and C++
32APIs; the C++ interface code needs to have full control of all C API calls for
33resources to be managed correctly.
34
35Memory management
36-----------------
37
38All runtime objects created through the C++ API are passed and accessed via
39shared pointers, using the C++11 std::shared_ptr implementation. This means
40that a reference count is kept for each object.
41
42Shared pointers can be copied and assigned in a user's program, automatically
43updating their reference count and deleting objects when they are no longer in
44use. The C++ interface code also keeps track of internal dependencies between
45libsigrok resources, and ensures that objects are not prematurely deleted when
46their resources are in use by other objects.
47
52ff4f6a
UH
48This means that management of libsigrokcxx objects and their underlying
49libsigrok resources can be treated as fully automatic. As long as all shared
50pointers to objects are deleted or reassigned when no longer in use, all
51underlying resources will be released at the right time.
07443fd2
ML
52
53Getting started
54---------------
55
56Usage of the C++ API needs to begin with a call to sigrok::Context::create().
57This will create the global libsigrok context and returns a shared pointer to
58the sigrok::Context object. Methods on this object provide access to the
59hardware drivers, input and output formats supported by the library, as well
60as means of creating other objects such as sessions and triggers.
61
62Error handling
63--------------
64
65When any libsigrok C API call returns an error, a sigrok::Error exception is
66raised, which provides access to the error code and description.
67
68*/
69
1b40fdb8
UH
70#ifndef LIBSIGROKCXX_HPP
71#define LIBSIGROKCXX_HPP
c23c8659 72
8b2a1843 73#include <libsigrok/libsigrok.h>
cea8c312
DE
74
75/* Suppress warnings due to glibmm's use of std::auto_ptr<> in a public
76 * header file. To be removed once glibmm is fixed. */
77G_GNUC_BEGIN_IGNORE_DEPRECATIONS
e0e6aecc 78#include <glibmm.h>
cea8c312 79G_GNUC_END_IGNORE_DEPRECATIONS
c23c8659
ML
80
81#include <stdexcept>
82#include <memory>
83#include <vector>
84#include <map>
4c7c4194 85#include <set>
c23c8659
ML
86
87namespace sigrok
88{
89
90using namespace std;
91
92/* Forward declarations */
93class SR_API Error;
94class SR_API Context;
95class SR_API Driver;
96class SR_API Device;
97class SR_API HardwareDevice;
98class SR_API Channel;
c23c8659
ML
99class SR_API Session;
100class SR_API ConfigKey;
12f2f640 101class SR_API Capability;
c23c8659
ML
102class SR_API InputFormat;
103class SR_API OutputFormat;
3cd4b381 104class SR_API OutputFlag;
c23c8659
ML
105class SR_API LogLevel;
106class SR_API ChannelGroup;
107class SR_API Trigger;
108class SR_API TriggerStage;
109class SR_API TriggerMatch;
110class SR_API TriggerMatchType;
111class SR_API ChannelType;
112class SR_API Packet;
113class SR_API PacketPayload;
114class SR_API PacketType;
115class SR_API Quantity;
116class SR_API Unit;
117class SR_API QuantityFlag;
0cee3a3e 118class SR_API Rational;
ca3291e3
ML
119class SR_API Input;
120class SR_API InputDevice;
c23c8659
ML
121class SR_API Output;
122class SR_API DataType;
58aa1f83 123class SR_API Option;
9fa5b426 124class SR_API UserDevice;
c23c8659
ML
125
126/** Exception thrown when an error code is returned by any libsigrok call. */
127class SR_API Error: public exception
128{
129public:
6c11b496 130 explicit Error(int result);
15914cdb 131 ~Error() noexcept;
c23c8659 132 const int result;
15914cdb 133 const char *what() const noexcept;
c23c8659
ML
134};
135
541c855e 136/* Base template for classes whose resources are owned by a parent object. */
d5d7b09e 137template <class Class, class Parent>
541c855e 138class SR_API ParentOwned
c23c8659 139{
21d1bec6
DE
140private:
141 /* Weak pointer for shared_from_this() implementation. */
142 weak_ptr<Class> _weak_this;
143
144 static void reset_parent(Class *object)
145 {
146 if (!object->_parent)
147 throw Error(SR_ERR_BUG);
148 object->_parent.reset();
149 }
150
7649683c 151protected:
07443fd2 152 /* Parent object which owns this child object's underlying structure.
c23c8659
ML
153
154 This shared pointer will be null when this child is unused, but
155 will be assigned to point to the parent before any shared pointer
156 to this child is handed out to the user.
157
158 When the reference count of this child falls to zero, this shared
159 pointer to its parent is reset by a custom deleter on the child's
160 shared pointer.
161
162 This strategy ensures that the destructors for both the child and
163 the parent are called at the correct time, i.e. only when all
164 references to both the parent and all its children are gone. */
3b161085 165 shared_ptr<Parent> _parent;
7649683c 166
d5d7b09e 167 ParentOwned() {}
0d0170ae 168
0d0170ae 169 /* Note, this implementation will create a new smart_ptr if none exists. */
bf52cc8c 170 shared_ptr<Class> shared_from_this()
0d0170ae 171 {
67b82fc9 172 shared_ptr<Class> shared = _weak_this.lock();
0d0170ae 173
67b82fc9 174 if (!shared)
0d0170ae 175 {
67b82fc9 176 shared.reset(static_cast<Class *>(this), &reset_parent);
3b161085 177 _weak_this = shared;
0d0170ae
ML
178 }
179
180 return shared;
181 }
182
b6ab954d 183 shared_ptr<Class> share_owned_by(shared_ptr<Parent> parent)
7649683c 184 {
78132e2a
ML
185 if (!parent)
186 throw Error(SR_ERR_BUG);
3b161085 187 this->_parent = parent;
0d0170ae 188 return shared_from_this();
7649683c 189 }
0d0170ae 190
67b82fc9
DE
191public:
192 /* Get parent object that owns this object. */
193 shared_ptr<Parent> parent()
7649683c 194 {
67b82fc9 195 return _parent;
7649683c 196 }
c23c8659
ML
197};
198
90e89c2a 199/* Base template for classes whose resources are owned by the user. */
d5d7b09e 200template <class Class>
90e89c2a
ML
201class SR_API UserOwned : public enable_shared_from_this<Class>
202{
90e89c2a 203protected:
d5d7b09e 204 UserOwned() {}
b4ed33a7 205
67b82fc9
DE
206 shared_ptr<Class> shared_from_this()
207 {
208 auto shared = enable_shared_from_this<Class>::shared_from_this();
209 if (!shared)
210 throw Error(SR_ERR_BUG);
211 return shared;
212 }
90e89c2a
ML
213};
214
c23c8659
ML
215/** Type of log callback */
216typedef function<void(const LogLevel *, string message)> LogCallbackFunction;
217
e2eaf858
DE
218/** Resource reader delegate. */
219class SR_API ResourceReader
220{
221public:
222 ResourceReader() {}
223 virtual ~ResourceReader();
224private:
225 /** Resource open hook. */
226 virtual void open(struct sr_resource *res, string name) = 0;
227 /** Resource close hook. */
228 virtual void close(struct sr_resource *res) = 0;
229 /** Resource read hook. */
230 virtual size_t read(const struct sr_resource *res, void *buf, size_t count) = 0;
231
232 static SR_PRIV int open_callback(struct sr_resource *res,
0ab8e5d2 233 const char *name, void *cb_data) noexcept;
e2eaf858 234 static SR_PRIV int close_callback(struct sr_resource *res,
0ab8e5d2 235 void *cb_data) noexcept;
32ba0d80 236 static SR_PRIV gssize read_callback(const struct sr_resource *res,
0ab8e5d2 237 void *buf, size_t count, void *cb_data) noexcept;
e2eaf858
DE
238 friend class Context;
239};
240
07443fd2 241/** The global libsigrok context */
d5d7b09e 242class SR_API Context : public UserOwned<Context>
c23c8659
ML
243{
244public:
245 /** Create new context */
246 static shared_ptr<Context> create();
247 /** libsigrok package version. */
a73d4926 248 static string package_version();
c23c8659 249 /** libsigrok library version. */
a73d4926 250 static string lib_version();
c23c8659 251 /** Available hardware drivers, indexed by name. */
3b161085 252 map<string, shared_ptr<Driver> > drivers();
c23c8659 253 /** Available input formats, indexed by name. */
3b161085 254 map<string, shared_ptr<InputFormat> > input_formats();
c23c8659 255 /** Available output formats, indexed by name. */
3b161085 256 map<string, shared_ptr<OutputFormat> > output_formats();
c23c8659 257 /** Current log level. */
15bebf57 258 const LogLevel *log_level() const;
b6f411ac
ML
259 /** Set the log level.
260 * @param level LogLevel to use. */
c23c8659 261 void set_log_level(const LogLevel *level);
b6f411ac
ML
262 /** Set the log callback.
263 * @param callback Callback of the form callback(LogLevel, string). */
c23c8659
ML
264 void set_log_callback(LogCallbackFunction callback);
265 /** Set the log callback to the default handler. */
266 void set_log_callback_default();
e2eaf858
DE
267 /** Install a delegate for reading resource files.
268 * @param reader The resource reader delegate, or nullptr to unset. */
269 void set_resource_reader(ResourceReader *reader);
c23c8659
ML
270 /** Create a new session. */
271 shared_ptr<Session> create_session();
9fa5b426
ML
272 /** Create a new user device. */
273 shared_ptr<UserDevice> create_user_device(
274 string vendor, string model, string version);
304be4a7
ML
275 /** Create a header packet. */
276 shared_ptr<Packet> create_header_packet(Glib::TimeVal start_time);
277 /** Create a meta packet. */
278 shared_ptr<Packet> create_meta_packet(
9e7176bd 279 map<const ConfigKey *, Glib::VariantBase> config);
304be4a7
ML
280 /** Create a logic packet. */
281 shared_ptr<Packet> create_logic_packet(
282 void *data_pointer, size_t data_length, unsigned int unit_size);
283 /** Create an analog packet. */
dd13d47a 284 shared_ptr<Packet> create_analog_packet(
9e7176bd 285 vector<shared_ptr<Channel> > channels,
304be4a7 286 float *data_pointer, unsigned int num_samples, const Quantity *mq,
9e7176bd 287 const Unit *unit, vector<const QuantityFlag *> mqflags);
b6f411ac
ML
288 /** Load a saved session.
289 * @param filename File name string. */
c23c8659 290 shared_ptr<Session> load_session(string filename);
b6f411ac
ML
291 /** Create a new trigger.
292 * @param name Name string for new trigger. */
c23c8659 293 shared_ptr<Trigger> create_trigger(string name);
ca3291e3
ML
294 /** Open an input file.
295 * @param filename File name string. */
296 shared_ptr<Input> open_file(string filename);
297 /** Open an input stream based on header data.
298 * @param header Initial data from stream. */
299 shared_ptr<Input> open_stream(string header);
15bebf57 300 map<string, string> serials(shared_ptr<Driver> driver) const;
21d1bec6 301private:
d5d7b09e 302 struct sr_context *_structure;
f17b4546
DE
303 map<string, unique_ptr<Driver> > _drivers;
304 map<string, unique_ptr<InputFormat> > _input_formats;
305 map<string, unique_ptr<OutputFormat> > _output_formats;
3b161085
ML
306 Session *_session;
307 LogCallbackFunction _log_callback;
c23c8659
ML
308 Context();
309 ~Context();
c23c8659
ML
310 friend class Session;
311 friend class Driver;
01451225 312 friend struct std::default_delete<Context>;
c23c8659
ML
313};
314
c23c8659
ML
315/** An object that can be configured. */
316class SR_API Configurable
317{
318public:
36bb818d
ML
319 /** Supported configuration keys. */
320 set<const ConfigKey *> config_keys() const;
b6f411ac
ML
321 /** Read configuration for the given key.
322 * @param key ConfigKey to read. */
15bebf57 323 Glib::VariantBase config_get(const ConfigKey *key) const;
b6f411ac
ML
324 /** Set configuration for the given key to a specified value.
325 * @param key ConfigKey to set.
326 * @param value Value to set. */
d370545d 327 void config_set(const ConfigKey *key, const Glib::VariantBase &value);
b6f411ac
ML
328 /** Enumerate available values for the given configuration key.
329 * @param key ConfigKey to enumerate values for. */
15bebf57 330 Glib::VariantContainerBase config_list(const ConfigKey *key) const;
36bb818d
ML
331 /** Enumerate configuration capabilities for the given configuration key.
332 * @param key ConfigKey to enumerate capabilities for. */
333 set<const Capability *> config_capabilities(const ConfigKey *key) const;
334 /** Check whether a configuration capability is supported for a given key.
335 * @param key ConfigKey to check.
336 * @param capability Capability to check for. */
337 bool config_check(const ConfigKey *key, const Capability *capability) const;
c23c8659
ML
338protected:
339 Configurable(
340 struct sr_dev_driver *driver,
341 struct sr_dev_inst *sdi,
342 struct sr_channel_group *channel_group);
343 virtual ~Configurable();
344 struct sr_dev_driver *config_driver;
345 struct sr_dev_inst *config_sdi;
346 struct sr_channel_group *config_channel_group;
347};
348
59b74d28 349/** A hardware driver provided by the library */
36bb818d 350class SR_API Driver : public ParentOwned<Driver, Context>, public Configurable
59b74d28
ML
351{
352public:
353 /** Name of this driver. */
15bebf57 354 string name() const;
59b74d28 355 /** Long name for this driver. */
15bebf57 356 string long_name() const;
36bb818d
ML
357 /** Scan options supported by this driver. */
358 set<const ConfigKey *> scan_options() const;
59b74d28
ML
359 /** Scan for devices and return a list of devices found.
360 * @param options Mapping of (ConfigKey, value) pairs. */
9e7176bd
DE
361 vector<shared_ptr<HardwareDevice> > scan(map<const ConfigKey *, Glib::VariantBase>
362 options = map<const ConfigKey *, Glib::VariantBase>());
21d1bec6 363private:
d5d7b09e 364 struct sr_dev_driver *_structure;
3b161085
ML
365 bool _initialized;
366 vector<HardwareDevice *> _devices;
6c11b496 367 explicit Driver(struct sr_dev_driver *structure);
59b74d28
ML
368 ~Driver();
369 friend class Context;
370 friend class HardwareDevice;
371 friend class ChannelGroup;
01451225 372 friend struct std::default_delete<Driver>;
59b74d28
ML
373};
374
07443fd2 375/** A generic device, either hardware or virtual */
d01d2314 376class SR_API Device : public Configurable
c23c8659
ML
377{
378public:
379 /** Vendor name for this device. */
15bebf57 380 string vendor() const;
c23c8659 381 /** Model name for this device. */
15bebf57 382 string model() const;
c23c8659 383 /** Version string for this device. */
15bebf57 384 string version() const;
d1075e5a 385 /** Serial number for this device. */
15bebf57 386 string serial_number() const;
d1075e5a 387 /** Connection ID for this device. */
15bebf57 388 string connection_id() const;
c23c8659 389 /** List of the channels available on this device. */
3b161085 390 vector<shared_ptr<Channel> > channels();
6be7a7f2 391 /** Channel groups available on this device, indexed by name. */
3b161085 392 map<string, shared_ptr<ChannelGroup> > channel_groups();
c23c8659
ML
393 /** Open device. */
394 void open();
395 /** Close device. */
396 void close();
397protected:
6c11b496 398 explicit Device(struct sr_dev_inst *structure);
c23c8659 399 ~Device();
d01d2314 400 virtual shared_ptr<Device> get_shared_from_this() = 0;
4178d971 401 shared_ptr<Channel> get_channel(struct sr_channel *ptr);
21d1bec6 402
3b161085 403 struct sr_dev_inst *_structure;
f17b4546 404 map<struct sr_channel *, unique_ptr<Channel> > _channels;
21d1bec6 405private:
f17b4546 406 map<string, unique_ptr<ChannelGroup> > _channel_groups;
a98729a7 407
c23c8659
ML
408 friend class Session;
409 friend class Channel;
410 friend class ChannelGroup;
411 friend class Output;
dd13d47a 412 friend class Analog;
01451225 413 friend struct std::default_delete<Device>;
c23c8659
ML
414};
415
07443fd2 416/** A real hardware device, connected via a driver */
6e5240f4 417class SR_API HardwareDevice :
d5d7b09e 418 public UserOwned<HardwareDevice>,
6e5240f4 419 public Device
c23c8659
ML
420{
421public:
422 /** Driver providing this device. */
3b161085 423 shared_ptr<Driver> driver();
21d1bec6 424private:
a4e47454 425 HardwareDevice(shared_ptr<Driver> driver, struct sr_dev_inst *structure);
c23c8659 426 ~HardwareDevice();
d01d2314 427 shared_ptr<Device> get_shared_from_this();
a4e47454 428 shared_ptr<Driver> _driver;
a98729a7 429
c23c8659
ML
430 friend class Driver;
431 friend class ChannelGroup;
01451225 432 friend struct std::default_delete<HardwareDevice>;
c23c8659
ML
433};
434
9fa5b426
ML
435/** A virtual device, created by the user */
436class SR_API UserDevice :
d5d7b09e 437 public UserOwned<UserDevice>,
9fa5b426
ML
438 public Device
439{
440public:
441 /** Add a new channel to this device. */
442 shared_ptr<Channel> add_channel(unsigned int index, const ChannelType *type, string name);
21d1bec6 443private:
9fa5b426
ML
444 UserDevice(string vendor, string model, string version);
445 ~UserDevice();
446 shared_ptr<Device> get_shared_from_this();
a98729a7 447
9fa5b426 448 friend class Context;
01451225 449 friend struct std::default_delete<UserDevice>;
9fa5b426
ML
450};
451
07443fd2 452/** A channel on a device */
bf52cc8c 453class SR_API Channel :
d5d7b09e 454 public ParentOwned<Channel, Device>
c23c8659
ML
455{
456public:
457 /** Current name of this channel. */
15bebf57 458 string name() const;
b6f411ac
ML
459 /** Set the name of this channel. *
460 * @param name Name string to set. */
c23c8659
ML
461 void set_name(string name);
462 /** Type of this channel. */
15bebf57 463 const ChannelType *type() const;
c23c8659 464 /** Enabled status of this channel. */
15bebf57 465 bool enabled() const;
b6f411ac
ML
466 /** Set the enabled status of this channel.
467 * @param value Boolean value to set. */
c23c8659 468 void set_enabled(bool value);
06bd935e 469 /** Get the index number of this channel. */
15bebf57 470 unsigned int index() const;
21d1bec6 471private:
6c11b496 472 explicit Channel(struct sr_channel *structure);
c23c8659 473 ~Channel();
d5d7b09e 474 struct sr_channel *_structure;
3b161085 475 const ChannelType * const _type;
c23c8659 476 friend class Device;
9fa5b426 477 friend class UserDevice;
c23c8659
ML
478 friend class ChannelGroup;
479 friend class Session;
480 friend class TriggerStage;
304be4a7 481 friend class Context;
01451225 482 friend struct std::default_delete<Channel>;
c23c8659
ML
483};
484
07443fd2 485/** A group of channels on a device, which share some configuration */
c23c8659 486class SR_API ChannelGroup :
d5d7b09e 487 public ParentOwned<ChannelGroup, Device>,
c23c8659
ML
488 public Configurable
489{
490public:
491 /** Name of this channel group. */
15bebf57 492 string name() const;
c23c8659 493 /** List of the channels in this group. */
3b161085 494 vector<shared_ptr<Channel> > channels();
21d1bec6 495private:
f17b4546 496 ChannelGroup(const Device *device, struct sr_channel_group *structure);
c23c8659 497 ~ChannelGroup();
3b161085 498 vector<Channel *> _channels;
6be7a7f2 499 friend class Device;
01451225 500 friend struct std::default_delete<ChannelGroup>;
c23c8659
ML
501};
502
07443fd2 503/** A trigger configuration */
d5d7b09e 504class SR_API Trigger : public UserOwned<Trigger>
c23c8659
ML
505{
506public:
b6f411ac 507 /** Name of this trigger configuration. */
15bebf57 508 string name() const;
b6f411ac 509 /** List of the stages in this trigger. */
3b161085 510 vector<shared_ptr<TriggerStage> > stages();
b6f411ac 511 /** Add a new stage to this trigger. */
c23c8659 512 shared_ptr<TriggerStage> add_stage();
21d1bec6 513private:
c23c8659
ML
514 Trigger(shared_ptr<Context> context, string name);
515 ~Trigger();
d5d7b09e 516 struct sr_trigger *_structure;
3b161085 517 shared_ptr<Context> _context;
f17b4546 518 vector<unique_ptr<TriggerStage> > _stages;
c23c8659 519 friend class Context;
6fa0eb86 520 friend class Session;
01451225 521 friend struct std::default_delete<Trigger>;
c23c8659
ML
522};
523
07443fd2 524/** A stage in a trigger configuration */
bf52cc8c 525class SR_API TriggerStage :
d5d7b09e 526 public ParentOwned<TriggerStage, Trigger>
c23c8659
ML
527{
528public:
b6f411ac 529 /** Index number of this stage. */
15bebf57 530 int number() const;
b6f411ac 531 /** List of match conditions on this stage. */
3b161085 532 vector<shared_ptr<TriggerMatch> > matches();
b6f411ac
ML
533 /** Add a new match condition to this stage.
534 * @param channel Channel to match on.
535 * @param type TriggerMatchType to apply. */
c23c8659 536 void add_match(shared_ptr<Channel> channel, const TriggerMatchType *type);
b6f411ac
ML
537 /** Add a new match condition to this stage.
538 * @param channel Channel to match on.
539 * @param type TriggerMatchType to apply.
540 * @param value Threshold value. */
c23c8659 541 void add_match(shared_ptr<Channel> channel, const TriggerMatchType *type, float value);
21d1bec6 542private:
d5d7b09e 543 struct sr_trigger_stage *_structure;
f17b4546 544 vector<unique_ptr<TriggerMatch> > _matches;
6c11b496 545 explicit TriggerStage(struct sr_trigger_stage *structure);
c23c8659
ML
546 ~TriggerStage();
547 friend class Trigger;
01451225 548 friend struct std::default_delete<TriggerStage>;
c23c8659
ML
549};
550
07443fd2 551/** A match condition in a trigger configuration */
bf52cc8c 552class SR_API TriggerMatch :
d5d7b09e 553 public ParentOwned<TriggerMatch, TriggerStage>
c23c8659
ML
554{
555public:
b6f411ac 556 /** Channel this condition matches on. */
3b161085 557 shared_ptr<Channel> channel();
b6f411ac 558 /** Type of match. */
15bebf57 559 const TriggerMatchType *type() const;
b6f411ac 560 /** Threshold value. */
15bebf57 561 float value() const;
21d1bec6 562private:
c23c8659
ML
563 TriggerMatch(struct sr_trigger_match *structure, shared_ptr<Channel> channel);
564 ~TriggerMatch();
d5d7b09e 565 struct sr_trigger_match *_structure;
3b161085 566 shared_ptr<Channel> _channel;
c23c8659 567 friend class TriggerStage;
01451225 568 friend struct std::default_delete<TriggerMatch>;
c23c8659
ML
569};
570
f91cf612
DE
571/** Type of session stopped callback */
572typedef function<void()> SessionStoppedCallback;
573
c23c8659
ML
574/** Type of datafeed callback */
575typedef function<void(shared_ptr<Device>, shared_ptr<Packet>)>
576 DatafeedCallbackFunction;
577
07443fd2 578/* Data required for C callback function to call a C++ datafeed callback */
c23c8659
ML
579class SR_PRIV DatafeedCallbackData
580{
581public:
582 void run(const struct sr_dev_inst *sdi,
583 const struct sr_datafeed_packet *pkt);
21d1bec6 584private:
3b161085 585 DatafeedCallbackFunction _callback;
c23c8659
ML
586 DatafeedCallbackData(Session *session,
587 DatafeedCallbackFunction callback);
3b161085 588 Session *_session;
c23c8659
ML
589 friend class Session;
590};
591
cac58676
ML
592/** A virtual device associated with a stored session */
593class SR_API SessionDevice :
d5d7b09e 594 public ParentOwned<SessionDevice, Session>,
cac58676
ML
595 public Device
596{
21d1bec6 597private:
6c11b496 598 explicit SessionDevice(struct sr_dev_inst *sdi);
cac58676
ML
599 ~SessionDevice();
600 shared_ptr<Device> get_shared_from_this();
a98729a7 601
cac58676 602 friend class Session;
01451225 603 friend struct std::default_delete<SessionDevice>;
cac58676
ML
604};
605
07443fd2 606/** A sigrok session */
d5d7b09e 607class SR_API Session : public UserOwned<Session>
c23c8659
ML
608{
609public:
b6f411ac
ML
610 /** Add a device to this session.
611 * @param device Device to add. */
c23c8659
ML
612 void add_device(shared_ptr<Device> device);
613 /** List devices attached to this session. */
3b161085 614 vector<shared_ptr<Device> > devices();
c23c8659
ML
615 /** Remove all devices from this session. */
616 void remove_devices();
b6f411ac
ML
617 /** Add a datafeed callback to this session.
618 * @param callback Callback of the form callback(Device, Packet). */
c23c8659
ML
619 void add_datafeed_callback(DatafeedCallbackFunction callback);
620 /** Remove all datafeed callbacks from this session. */
621 void remove_datafeed_callbacks();
c23c8659
ML
622 /** Start the session. */
623 void start();
624 /** Run the session event loop. */
625 void run();
626 /** Stop the session. */
627 void stop();
f91cf612
DE
628 /** Return whether the session is running. */
629 bool is_running() const;
630 /** Set callback to be invoked on session stop. */
631 void set_stopped_callback(SessionStoppedCallback callback);
6fa0eb86 632 /** Get current trigger setting. */
3b161085 633 shared_ptr<Trigger> trigger();
624d1610
UH
634 /** Get the context. */
635 shared_ptr<Context> context();
b6f411ac
ML
636 /** Set trigger setting.
637 * @param trigger Trigger object to use. */
6fa0eb86 638 void set_trigger(shared_ptr<Trigger> trigger);
1411f7d8 639 /** Get filename this session was loaded from. */
15bebf57 640 string filename() const;
21d1bec6 641private:
6c11b496 642 explicit Session(shared_ptr<Context> context);
c23c8659
ML
643 Session(shared_ptr<Context> context, string filename);
644 ~Session();
ca4e307a 645 shared_ptr<Device> get_device(const struct sr_dev_inst *sdi);
d5d7b09e 646 struct sr_session *_structure;
3b161085 647 const shared_ptr<Context> _context;
f17b4546 648 map<const struct sr_dev_inst *, unique_ptr<SessionDevice> > _owned_devices;
ca4e307a 649 map<const struct sr_dev_inst *, shared_ptr<Device> > _other_devices;
f17b4546 650 vector<unique_ptr<DatafeedCallbackData> > _datafeed_callbacks;
f91cf612 651 SessionStoppedCallback _stopped_callback;
98d39b91 652 string _filename;
3b161085 653 shared_ptr<Trigger> _trigger;
a98729a7 654
c23c8659
ML
655 friend class Context;
656 friend class DatafeedCallbackData;
98d39b91 657 friend class SessionDevice;
01451225 658 friend struct std::default_delete<Session>;
c23c8659
ML
659};
660
07443fd2 661/** A packet on the session datafeed */
d5d7b09e 662class SR_API Packet : public UserOwned<Packet>
c23c8659
ML
663{
664public:
90ba83f2 665 /** Type of this packet. */
15bebf57 666 const PacketType *type() const;
c23c8659 667 /** Payload of this packet. */
3b161085 668 shared_ptr<PacketPayload> payload();
21d1bec6 669private:
2928f47d
ML
670 Packet(shared_ptr<Device> device,
671 const struct sr_datafeed_packet *structure);
c23c8659 672 ~Packet();
d5d7b09e 673 const struct sr_datafeed_packet *_structure;
3b161085 674 shared_ptr<Device> _device;
f17b4546 675 unique_ptr<PacketPayload> _payload;
a98729a7 676
c23c8659
ML
677 friend class Session;
678 friend class Output;
679 friend class DatafeedCallbackData;
2928f47d
ML
680 friend class Header;
681 friend class Meta;
682 friend class Logic;
dd13d47a 683 friend class Analog;
304be4a7 684 friend class Context;
01451225 685 friend struct std::default_delete<Packet>;
c23c8659
ML
686};
687
07443fd2 688/** Abstract base class for datafeed packet payloads */
c23c8659
ML
689class SR_API PacketPayload
690{
691protected:
692 PacketPayload();
693 virtual ~PacketPayload() = 0;
67b82fc9 694private:
b6ab954d 695 virtual shared_ptr<PacketPayload> share_owned_by(shared_ptr<Packet> parent) = 0;
21d1bec6 696
c23c8659
ML
697 friend class Packet;
698 friend class Output;
01451225 699 friend struct std::default_delete<PacketPayload>;
c23c8659
ML
700};
701
2928f47d 702/** Payload of a datafeed header packet */
4cd883a7 703class SR_API Header :
d5d7b09e 704 public ParentOwned<Header, Packet>,
4cd883a7 705 public PacketPayload
2928f47d
ML
706{
707public:
b6f411ac 708 /* Feed version number. */
15bebf57 709 int feed_version() const;
b6f411ac 710 /* Start time of this session. */
15bebf57 711 Glib::TimeVal start_time() const;
21d1bec6 712private:
6c11b496 713 explicit Header(const struct sr_datafeed_header *structure);
2928f47d 714 ~Header();
b6ab954d 715 shared_ptr<PacketPayload> share_owned_by(shared_ptr<Packet> parent);
d5d7b09e
DE
716
717 const struct sr_datafeed_header *_structure;
718
2928f47d
ML
719 friend class Packet;
720};
721
722/** Payload of a datafeed metadata packet */
4cd883a7 723class SR_API Meta :
d5d7b09e 724 public ParentOwned<Meta, Packet>,
4cd883a7 725 public PacketPayload
2928f47d
ML
726{
727public:
b6f411ac 728 /* Mapping of (ConfigKey, value) pairs. */
15bebf57 729 map<const ConfigKey *, Glib::VariantBase> config() const;
21d1bec6 730private:
6c11b496 731 explicit Meta(const struct sr_datafeed_meta *structure);
2928f47d 732 ~Meta();
b6ab954d 733 shared_ptr<PacketPayload> share_owned_by(shared_ptr<Packet> parent);
d5d7b09e
DE
734
735 const struct sr_datafeed_meta *_structure;
3b161085 736 map<const ConfigKey *, Glib::VariantBase> _config;
d5d7b09e 737
2928f47d
ML
738 friend class Packet;
739};
740
07443fd2 741/** Payload of a datafeed packet with logic data */
4cd883a7 742class SR_API Logic :
d5d7b09e 743 public ParentOwned<Logic, Packet>,
4cd883a7 744 public PacketPayload
c23c8659 745{
2928f47d
ML
746public:
747 /* Pointer to data. */
3b161085 748 void *data_pointer();
2928f47d 749 /* Data length in bytes. */
15bebf57 750 size_t data_length() const;
2928f47d 751 /* Size of each sample in bytes. */
15bebf57 752 unsigned int unit_size() const;
21d1bec6 753private:
6c11b496 754 explicit Logic(const struct sr_datafeed_logic *structure);
c23c8659 755 ~Logic();
b6ab954d 756 shared_ptr<PacketPayload> share_owned_by(shared_ptr<Packet> parent);
d5d7b09e
DE
757
758 const struct sr_datafeed_logic *_structure;
759
c23c8659
ML
760 friend class Packet;
761};
762
07443fd2 763/** Payload of a datafeed packet with analog data */
dd13d47a 764class SR_API Analog :
d5d7b09e 765 public ParentOwned<Analog, Packet>,
4cd883a7 766 public PacketPayload
c23c8659
ML
767{
768public:
2928f47d 769 /** Pointer to data. */
dd13d47a 770 void *data_pointer();
c5d081f7
SA
771 /**
772 * Fills dest pointer with the analog data converted to float.
773 * The pointer must have space for num_samples() floats.
774 */
775 void get_data_as_float(float *dest);
c23c8659 776 /** Number of samples in this packet. */
15bebf57 777 unsigned int num_samples() const;
2928f47d 778 /** Channels for which this packet contains data. */
3b161085 779 vector<shared_ptr<Channel> > channels();
0cee3a3e
SA
780 /** Size of a single sample in bytes. */
781 unsigned int unitsize() const;
782 /** Samples use a signed data type. */
783 bool is_signed() const;
784 /** Samples use float. */
785 bool is_float() const;
786 /** Samples are stored in big-endian order. */
787 bool is_bigendian() const;
788 /**
789 * Number of significant digits after the decimal point if positive,
790 * or number of non-significant digits before the decimal point if negative
791 * (refers to the value we actually read on the wire).
792 */
793 int digits() const;
794 /** TBD */
795 bool is_digits_decimal() const;
796 /** TBD */
797 shared_ptr<Rational> scale();
798 /** TBD */
799 shared_ptr<Rational> offset();
c23c8659 800 /** Measured quantity of the samples in this packet. */
15bebf57 801 const Quantity *mq() const;
c23c8659 802 /** Unit of the samples in this packet. */
15bebf57 803 const Unit *unit() const;
c23c8659 804 /** Measurement flags associated with the samples in this packet. */
15bebf57 805 vector<const QuantityFlag *> mq_flags() const;
21d1bec6 806private:
6c11b496 807 explicit Analog(const struct sr_datafeed_analog *structure);
dd13d47a 808 ~Analog();
b6ab954d 809 shared_ptr<PacketPayload> share_owned_by(shared_ptr<Packet> parent);
d5d7b09e
DE
810
811 const struct sr_datafeed_analog *_structure;
812
c23c8659
ML
813 friend class Packet;
814};
815
0cee3a3e
SA
816/** Number represented by a numerator/denominator integer pair */
817class SR_API Rational :
818 public ParentOwned<Rational, Analog>
819{
820public:
821 /** Numerator, i.e. the dividend. */
822 int64_t numerator() const;
823 /** Denominator, i.e. the divider. */
824 uint64_t denominator() const;
825 /** Actual (lossy) value. */
826 float value() const;
827private:
828 explicit Rational(const struct sr_rational *structure);
829 ~Rational();
830 shared_ptr<Rational> share_owned_by(shared_ptr<Analog> parent);
831
832 const struct sr_rational *_structure;
833
834 friend class Analog;
835 friend struct std::default_delete<Rational>;
836};
837
07443fd2 838/** An input format supported by the library */
c23c8659 839class SR_API InputFormat :
d5d7b09e 840 public ParentOwned<InputFormat, Context>
c23c8659
ML
841{
842public:
843 /** Name of this input format. */
15bebf57 844 string name() const;
c23c8659 845 /** Description of this input format. */
15bebf57 846 string description() const;
c7bc82ff
JH
847 /** A list of preferred file name extensions for this file format.
848 * @note This list is a recommendation only. */
15bebf57 849 vector<string> extensions() const;
ca3291e3 850 /** Options supported by this input format. */
3b161085 851 map<string, shared_ptr<Option> > options();
ca3291e3
ML
852 /** Create an input using this input format.
853 * @param options Mapping of (option name, value) pairs. */
9e7176bd
DE
854 shared_ptr<Input> create_input(map<string, Glib::VariantBase>
855 options = map<string, Glib::VariantBase>());
21d1bec6 856private:
6c11b496 857 explicit InputFormat(const struct sr_input_module *structure);
c23c8659 858 ~InputFormat();
d5d7b09e
DE
859
860 const struct sr_input_module *_structure;
861
c23c8659 862 friend class Context;
ca3291e3 863 friend class InputDevice;
01451225 864 friend struct std::default_delete<InputFormat>;
c23c8659
ML
865};
866
ca3291e3 867/** An input instance (an input format applied to a file or stream) */
d5d7b09e 868class SR_API Input : public UserOwned<Input>
c23c8659
ML
869{
870public:
ca3291e3 871 /** Virtual device associated with this input. */
3b161085 872 shared_ptr<InputDevice> device();
ca3291e3 873 /** Send next stream data.
2b51d48b
ML
874 * @param data Next stream data.
875 * @param length Length of data. */
876 void send(void *data, size_t length);
9c51e8ec
ML
877 /** Signal end of input data. */
878 void end();
b6b4f03e 879 void reset();
21d1bec6 880private:
ca3291e3
ML
881 Input(shared_ptr<Context> context, const struct sr_input *structure);
882 ~Input();
d5d7b09e 883 const struct sr_input *_structure;
3b161085 884 shared_ptr<Context> _context;
f17b4546 885 unique_ptr<InputDevice> _device;
a98729a7 886
ca3291e3 887 friend class Context;
c23c8659 888 friend class InputFormat;
01451225 889 friend struct std::default_delete<Input>;
c23c8659
ML
890};
891
ca3291e3 892/** A virtual device associated with an input */
6e5240f4 893class SR_API InputDevice :
d5d7b09e 894 public ParentOwned<InputDevice, Input>,
6e5240f4 895 public Device
ca3291e3 896{
21d1bec6 897private:
ca3291e3
ML
898 InputDevice(shared_ptr<Input> input, struct sr_dev_inst *sdi);
899 ~InputDevice();
d01d2314 900 shared_ptr<Device> get_shared_from_this();
3b161085 901 shared_ptr<Input> _input;
ca3291e3 902 friend class Input;
01451225 903 friend struct std::default_delete<InputDevice>;
ca3291e3
ML
904};
905
58aa1f83 906/** An option used by an output format */
d5d7b09e 907class SR_API Option : public UserOwned<Option>
58aa1f83
ML
908{
909public:
910 /** Short name of this option suitable for command line usage. */
15bebf57 911 string id() const;
58aa1f83 912 /** Short name of this option suitable for GUI usage. */
15bebf57 913 string name() const;
58aa1f83 914 /** Description of this option in a sentence. */
15bebf57 915 string description() const;
58aa1f83 916 /** Default value for this option. */
15bebf57 917 Glib::VariantBase default_value() const;
58aa1f83 918 /** Possible values for this option, if a limited set. */
15bebf57 919 vector<Glib::VariantBase> values() const;
21d1bec6 920private:
58aa1f83 921 Option(const struct sr_option *structure,
70d3b20b 922 shared_ptr<const struct sr_option *> structure_array);
58aa1f83 923 ~Option();
d5d7b09e 924 const struct sr_option *_structure;
3b161085 925 shared_ptr<const struct sr_option *> _structure_array;
a98729a7 926
43942280 927 friend class InputFormat;
58aa1f83 928 friend class OutputFormat;
01451225 929 friend struct std::default_delete<Option>;
58aa1f83
ML
930};
931
07443fd2 932/** An output format supported by the library */
c23c8659 933class SR_API OutputFormat :
d5d7b09e 934 public ParentOwned<OutputFormat, Context>
c23c8659
ML
935{
936public:
937 /** Name of this output format. */
15bebf57 938 string name() const;
c23c8659 939 /** Description of this output format. */
15bebf57 940 string description() const;
8a174d23
JH
941 /** A list of preferred file name extensions for this file format.
942 * @note This list is a recommendation only. */
15bebf57 943 vector<string> extensions() const;
58aa1f83 944 /** Options supported by this output format. */
3b161085 945 map<string, shared_ptr<Option> > options();
b6f411ac
ML
946 /** Create an output using this format.
947 * @param device Device to output for.
948 * @param options Mapping of (option name, value) pairs. */
bf03d635 949 shared_ptr<Output> create_output(shared_ptr<Device> device,
9e7176bd 950 map<string, Glib::VariantBase> options = map<string, Glib::VariantBase>());
81b3ce37
SA
951 /** Create an output using this format.
952 * @param filename Name of destination file.
953 * @param device Device to output for.
954 * @param options Mapping of (option name, value) pairs. */
955 shared_ptr<Output> create_output(string filename,
956 shared_ptr<Device> device,
9e7176bd 957 map<string, Glib::VariantBase> options = map<string, Glib::VariantBase>());
3cd4b381
SA
958 /**
959 * Checks whether a given flag is set.
960 * @param flag Flag to check
961 * @return true if flag is set for this module
962 * @see sr_output_flags
963 */
15bebf57 964 bool test_flag(const OutputFlag *flag) const;
21d1bec6 965private:
6c11b496 966 explicit OutputFormat(const struct sr_output_module *structure);
c23c8659 967 ~OutputFormat();
d5d7b09e
DE
968
969 const struct sr_output_module *_structure;
970
c23c8659
ML
971 friend class Context;
972 friend class Output;
01451225 973 friend struct std::default_delete<OutputFormat>;
c23c8659
ML
974};
975
07443fd2 976/** An output instance (an output format applied to a device) */
d5d7b09e 977class SR_API Output : public UserOwned<Output>
c23c8659
ML
978{
979public:
b6f411ac
ML
980 /** Update output with data from the given packet.
981 * @param packet Packet to handle. */
c23c8659 982 string receive(shared_ptr<Packet> packet);
21d1bec6 983private:
c23c8659
ML
984 Output(shared_ptr<OutputFormat> format, shared_ptr<Device> device);
985 Output(shared_ptr<OutputFormat> format,
9e7176bd 986 shared_ptr<Device> device, map<string, Glib::VariantBase> options);
81b3ce37 987 Output(string filename, shared_ptr<OutputFormat> format,
9e7176bd 988 shared_ptr<Device> device, map<string, Glib::VariantBase> options);
c23c8659 989 ~Output();
d5d7b09e
DE
990
991 const struct sr_output *_structure;
3b161085
ML
992 const shared_ptr<OutputFormat> _format;
993 const shared_ptr<Device> _device;
994 const map<string, Glib::VariantBase> _options;
d5d7b09e 995
c23c8659 996 friend class OutputFormat;
01451225 997 friend struct std::default_delete<Output>;
c23c8659
ML
998};
999
1000/** Base class for objects which wrap an enumeration value from libsigrok */
9d229ecb 1001template <class Class, typename Enum> class SR_API EnumValue
c23c8659
ML
1002{
1003public:
9d229ecb
ML
1004 /** The integer constant associated with this value. */
1005 int id() const
1006 {
1007 return static_cast<int>(_id);
1008 }
c23c8659 1009 /** The name associated with this value. */
9d229ecb
ML
1010 string name() const
1011 {
1012 return _name;
1013 }
1014 /** Get value associated with a given integer constant. */
1015 static const Class *get(int id)
1016 {
15bebf57
DE
1017 const auto pos = _values.find(static_cast<Enum>(id));
1018 if (pos == _values.end())
9d229ecb 1019 throw Error(SR_ERR_ARG);
15bebf57 1020 return pos->second;
9d229ecb
ML
1021 }
1022 /** Get possible values. */
1023 static std::vector<const Class *> values()
1024 {
1025 std::vector<const Class *> result;
1026 for (auto entry : _values)
1027 result.push_back(entry.second);
1028 return result;
1029 }
c23c8659 1030protected:
9d229ecb
ML
1031 EnumValue(Enum id, const char name[]) : _id(id), _name(name)
1032 {
1033 }
1034 ~EnumValue()
1035 {
1036 }
21d1bec6 1037private:
9d229ecb
ML
1038 static const std::map<const Enum, const Class * const> _values;
1039 const Enum _id;
3b161085 1040 const string _name;
c23c8659
ML
1041};
1042
c23c8659
ML
1043}
1044
ace872d5
ML
1045#include <libsigrokcxx/enums.hpp>
1046
1b40fdb8 1047#endif