X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=bindings%2Fcxx%2Finclude%2Flibsigrokcxx%2Flibsigrokcxx.hpp;h=de54630ffabe74c16f06f5b481aed1b1b07f2509;hb=6ad2fbaad2722f0aa18c3600cdbdddf812784b2d;hp=a74bbfcfa5002ba665e747c17edd4f3235125710;hpb=a98729a742ebbb9df9dbb9ce8aae1cc4c3f1e00d;p=libsigrok.git diff --git a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp index a74bbfcf..de54630f 100644 --- a/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp +++ b/bindings/cxx/include/libsigrokcxx/libsigrokcxx.hpp @@ -71,7 +71,12 @@ raised, which provides access to the error code and description. #define LIBSIGROKCXX_HPP #include + +/* Suppress warnings due to glibmm's use of std::auto_ptr<> in a public + * header file. To be removed once glibmm is fixed. */ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS #include +G_GNUC_END_IGNORE_DEPRECATIONS #include #include @@ -93,6 +98,7 @@ class SR_API HardwareDevice; class SR_API Channel; class SR_API Session; class SR_API ConfigKey; +class SR_API Capability; class SR_API InputFormat; class SR_API OutputFormat; class SR_API OutputFlag; @@ -109,6 +115,7 @@ class SR_API PacketType; class SR_API Quantity; class SR_API Unit; class SR_API QuantityFlag; +class SR_API Rational; class SR_API Input; class SR_API InputDevice; class SR_API Output; @@ -226,7 +233,7 @@ private: const char *name, void *cb_data) noexcept; static SR_PRIV int close_callback(struct sr_resource *res, void *cb_data) noexcept; - static SR_PRIV ssize_t read_callback(const struct sr_resource *res, + static SR_PRIV gssize read_callback(const struct sr_resource *res, void *buf, size_t count, void *cb_data) noexcept; friend class Context; }; @@ -269,15 +276,15 @@ public: shared_ptr create_header_packet(Glib::TimeVal start_time); /** Create a meta packet. */ shared_ptr create_meta_packet( - const map &config); + map config); /** Create a logic packet. */ shared_ptr create_logic_packet( void *data_pointer, size_t data_length, unsigned int unit_size); /** Create an analog packet. */ shared_ptr create_analog_packet( - const vector > &channels, - float *data_pointer, unsigned int num_samples, const Quantity *mq, - const Unit *unit, const vector &mqflags); + vector > channels, + const float *data_pointer, unsigned int num_samples, const Quantity *mq, + const Unit *unit, vector mqflags); /** Load a saved session. * @param filename File name string. */ shared_ptr load_session(string filename); @@ -302,19 +309,15 @@ private: ~Context(); friend class Session; friend class Driver; - friend class std::default_delete; -}; - -enum Capability { - GET = SR_CONF_GET, - SET = SR_CONF_SET, - LIST = SR_CONF_LIST + friend struct std::default_delete; }; /** An object that can be configured. */ class SR_API Configurable { public: + /** Supported configuration keys. */ + set config_keys() const; /** Read configuration for the given key. * @param key ConfigKey to read. */ Glib::VariantBase config_get(const ConfigKey *key) const; @@ -325,10 +328,13 @@ public: /** Enumerate available values for the given configuration key. * @param key ConfigKey to enumerate values for. */ Glib::VariantContainerBase config_list(const ConfigKey *key) const; - /** Enumerate available keys, according to a given index key. */ - map > config_keys(const ConfigKey *key); - /** Check for a key in the list from a given index key. */ - bool config_check(const ConfigKey *key, const ConfigKey *index_key) const; + /** Enumerate configuration capabilities for the given configuration key. + * @param key ConfigKey to enumerate capabilities for. */ + set config_capabilities(const ConfigKey *key) const; + /** Check whether a configuration capability is supported for a given key. + * @param key ConfigKey to check. + * @param capability Capability to check for. */ + bool config_check(const ConfigKey *key, const Capability *capability) const; protected: Configurable( struct sr_dev_driver *driver, @@ -341,19 +347,19 @@ protected: }; /** A hardware driver provided by the library */ -class SR_API Driver : - public ParentOwned, - public Configurable +class SR_API Driver : public ParentOwned, public Configurable { public: /** Name of this driver. */ string name() const; /** Long name for this driver. */ string long_name() const; + /** Scan options supported by this driver. */ + set scan_options() const; /** Scan for devices and return a list of devices found. * @param options Mapping of (ConfigKey, value) pairs. */ - vector > scan( - const map &options = {}); + vector > scan(map + options = map()); private: struct sr_dev_driver *_structure; bool _initialized; @@ -363,7 +369,7 @@ private: friend class Context; friend class HardwareDevice; friend class ChannelGroup; - friend class std::default_delete; + friend struct std::default_delete; }; /** A generic device, either hardware or virtual */ @@ -404,7 +410,7 @@ private: friend class ChannelGroup; friend class Output; friend class Analog; - friend class std::default_delete; + friend struct std::default_delete; }; /** A real hardware device, connected via a driver */ @@ -423,7 +429,7 @@ private: friend class Driver; friend class ChannelGroup; - friend class std::default_delete; + friend struct std::default_delete; }; /** A virtual device, created by the user */ @@ -440,7 +446,7 @@ private: shared_ptr get_shared_from_this(); friend class Context; - friend class std::default_delete; + friend struct std::default_delete; }; /** A channel on a device */ @@ -473,7 +479,7 @@ private: friend class Session; friend class TriggerStage; friend class Context; - friend class std::default_delete; + friend struct std::default_delete; }; /** A group of channels on a device, which share some configuration */ @@ -491,7 +497,7 @@ private: ~ChannelGroup(); vector _channels; friend class Device; - friend class std::default_delete; + friend struct std::default_delete; }; /** A trigger configuration */ @@ -512,7 +518,7 @@ private: vector > _stages; friend class Context; friend class Session; - friend class std::default_delete; + friend struct std::default_delete; }; /** A stage in a trigger configuration */ @@ -539,7 +545,7 @@ private: explicit TriggerStage(struct sr_trigger_stage *structure); ~TriggerStage(); friend class Trigger; - friend class std::default_delete; + friend struct std::default_delete; }; /** A match condition in a trigger configuration */ @@ -559,7 +565,7 @@ private: struct sr_trigger_match *_structure; shared_ptr _channel; friend class TriggerStage; - friend class std::default_delete; + friend struct std::default_delete; }; /** Type of session stopped callback */ @@ -594,7 +600,7 @@ private: shared_ptr get_shared_from_this(); friend class Session; - friend class std::default_delete; + friend struct std::default_delete; }; /** A sigrok session */ @@ -649,7 +655,7 @@ private: friend class Context; friend class DatafeedCallbackData; friend class SessionDevice; - friend class std::default_delete; + friend struct std::default_delete; }; /** A packet on the session datafeed */ @@ -676,7 +682,7 @@ private: friend class Logic; friend class Analog; friend class Context; - friend class std::default_delete; + friend struct std::default_delete; }; /** Abstract base class for datafeed packet payloads */ @@ -690,7 +696,7 @@ private: friend class Packet; friend class Output; - friend class std::default_delete; + friend struct std::default_delete; }; /** Payload of a datafeed header packet */ @@ -752,6 +758,8 @@ private: const struct sr_datafeed_logic *_structure; friend class Packet; + friend class Analog; + friend struct std::default_delete; }; /** Payload of a datafeed packet with analog data */ @@ -762,16 +770,69 @@ class SR_API Analog : public: /** Pointer to data. */ void *data_pointer(); + /** + * Fills dest pointer with the analog data converted to float. + * The pointer must have space for num_samples() floats. + */ + void get_data_as_float(float *dest); /** Number of samples in this packet. */ unsigned int num_samples() const; /** Channels for which this packet contains data. */ vector > channels(); + /** Size of a single sample in bytes. */ + unsigned int unitsize() const; + /** Samples use a signed data type. */ + bool is_signed() const; + /** Samples use float. */ + bool is_float() const; + /** Samples are stored in big-endian order. */ + bool is_bigendian() const; + /** + * Number of significant digits after the decimal point if positive, + * or number of non-significant digits before the decimal point if negative + * (refers to the value we actually read on the wire). + */ + int digits() const; + /** TBD */ + bool is_digits_decimal() const; + /** TBD */ + shared_ptr scale(); + /** TBD */ + shared_ptr offset(); /** Measured quantity of the samples in this packet. */ const Quantity *mq() const; /** Unit of the samples in this packet. */ const Unit *unit() const; /** Measurement flags associated with the samples in this packet. */ vector mq_flags() const; + /** + * Provides a Logic packet that contains a conversion of the analog + * data using a simple threshold. + * + * @param threshold Threshold to use. + * @param data_ptr Pointer to num_samples() bytes where the logic + * samples are stored. When nullptr, memory for + * logic->data_pointer() will be allocated and must + * be freed by the caller. + */ + shared_ptr get_logic_via_threshold(float threshold, + uint8_t *data_ptr=nullptr) const; + /** + * Provides a Logic packet that contains a conversion of the analog + * data using a Schmitt-Trigger. + * + * @param lo_thr Low threshold to use (anything below this is low). + * @param hi_thr High threshold to use (anything above this is high). + * @param state Points to a byte that contains the current state of the + * converter. For best results, set to value of logic + * sample n-1. + * @param data_ptr Pointer to num_samples() bytes where the logic + * samples are stored. When nullptr, memory for + * logic->data_pointer() will be allocated and must be + * freed by the caller. + */ + shared_ptr get_logic_via_schmitt_trigger(float lo_thr, + float hi_thr, uint8_t *state, uint8_t *data_ptr=nullptr) const; private: explicit Analog(const struct sr_datafeed_analog *structure); ~Analog(); @@ -782,6 +843,28 @@ private: friend class Packet; }; +/** Number represented by a numerator/denominator integer pair */ +class SR_API Rational : + public ParentOwned +{ +public: + /** Numerator, i.e. the dividend. */ + int64_t numerator() const; + /** Denominator, i.e. the divider. */ + uint64_t denominator() const; + /** Actual (lossy) value. */ + float value() const; +private: + explicit Rational(const struct sr_rational *structure); + ~Rational(); + shared_ptr share_owned_by(shared_ptr parent); + + const struct sr_rational *_structure; + + friend class Analog; + friend struct std::default_delete; +}; + /** An input format supported by the library */ class SR_API InputFormat : public ParentOwned @@ -792,13 +875,14 @@ public: /** Description of this input format. */ string description() const; /** A list of preferred file name extensions for this file format. - * @note This list is a recommendation only. */ + * @note This list is a recommendation only. */ vector extensions() const; /** Options supported by this input format. */ map > options(); /** Create an input using this input format. * @param options Mapping of (option name, value) pairs. */ - shared_ptr create_input(const map &options = {}); + shared_ptr create_input(map + options = map()); private: explicit InputFormat(const struct sr_input_module *structure); ~InputFormat(); @@ -807,7 +891,7 @@ private: friend class Context; friend class InputDevice; - friend class std::default_delete; + friend struct std::default_delete; }; /** An input instance (an input format applied to a file or stream) */ @@ -822,6 +906,7 @@ public: void send(void *data, size_t length); /** Signal end of input data. */ void end(); + void reset(); private: Input(shared_ptr context, const struct sr_input *structure); ~Input(); @@ -831,7 +916,7 @@ private: friend class Context; friend class InputFormat; - friend class std::default_delete; + friend struct std::default_delete; }; /** A virtual device associated with an input */ @@ -845,7 +930,7 @@ private: shared_ptr get_shared_from_this(); shared_ptr _input; friend class Input; - friend class std::default_delete; + friend struct std::default_delete; }; /** An option used by an output format */ @@ -862,6 +947,8 @@ public: Glib::VariantBase default_value() const; /** Possible values for this option, if a limited set. */ vector values() const; + /** Parse a string argument into the appropriate type for this option. */ + Glib::VariantBase parse_string(string value); private: Option(const struct sr_option *structure, shared_ptr structure_array); @@ -871,7 +958,7 @@ private: friend class InputFormat; friend class OutputFormat; - friend class std::default_delete