]> sigrok.org Git - pulseview.git/blobdiff - pv/data/decode/decoder.hpp
Session: Fix issue #67 by improving error handling
[pulseview.git] / pv / data / decode / decoder.hpp
index 282cfe557d0740682ef17d82318ea4d9443463c8..ac1052e62c9dfcb1cc270455686bfc0b619e003f 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef PULSEVIEW_PV_DATA_DECODE_DECODER_HPP
 #define PULSEVIEW_PV_DATA_DECODE_DECODER_HPP
 
+#include <deque>
 #include <map>
 #include <memory>
 #include <set>
 
 #include <glib.h>
 
-#include <pv/data/signalbase.hpp>
+#include <QObject>
 
+#include <pv/data/decode/row.hpp>
+
+using std::deque;
 using std::map;
+using std::shared_ptr;
 using std::string;
 using std::vector;
 
@@ -49,18 +54,47 @@ namespace decode {
 
 class Decoder;
 
+class AnnotationClass: public QObject
+{
+       Q_OBJECT
+
+public:
+       AnnotationClass(size_t _id, char* _name, char* _description, Row* _row);
+
+       bool visible() const;
+       void set_visible(bool visible);
+
+Q_SIGNALS:
+       void visibility_changed();
+
+public:
+       size_t id;
+       char* name;
+       char* description;
+       Row* row;
+
+private:
+       bool visible_;
+};
+
 struct DecodeChannel
 {
        uint16_t id;     ///< Global numerical ID for the decode channels in the stack
        uint16_t bit_id; ///< Tells which bit within a sample represents this channel
        const bool is_optional;
-       const pv::data::SignalBase *assigned_signal;
+       shared_ptr<const pv::data::SignalBase> assigned_signal;
        const QString name, desc;
        int initial_pin_state;
        const shared_ptr<Decoder> decoder_;
        const srd_channel *pdch_;
 };
 
+struct DecoderLogicOutputChannel {
+       DecoderLogicOutputChannel (QString id, QString desc) :
+               id(id), desc(desc) {};
+       QString id, desc;
+};
+
 struct DecodeBinaryClassInfo
 {
        uint32_t bin_class_id;
@@ -69,25 +103,28 @@ struct DecodeBinaryClassInfo
 };
 
 
-class Decoder
+class Decoder : public QObject
 {
+       Q_OBJECT
+
 public:
-       Decoder(const srd_decoder *const dec);
+       Decoder(const srd_decoder *const dec, uint8_t stack_level);
 
        virtual ~Decoder();
 
-       const srd_decoder* decoder() const;
+       const srd_decoder* get_srd_decoder() const;
+
+       uint8_t get_stack_level() const;
 
        const char* name() const;
 
-       bool shown() const;
-       void show(bool show = true);
+       bool visible() const;
+       void set_visible(bool visible);
 
        const vector<DecodeChannel*>& channels() const;
        void set_channels(vector<DecodeChannel*> channels);
 
        const map<string, GVariant*>& options() const;
-
        void set_option(const char *id, GVariant *value);
 
        void apply_all_options();
@@ -97,15 +134,36 @@ public:
        srd_decoder_inst* create_decoder_inst(srd_session *session);
        void invalidate_decoder_inst();
 
+       vector<Row*> get_rows();
+       Row* get_row_by_id(size_t id);
+
+       vector<const AnnotationClass*> ann_classes() const;
+       vector<AnnotationClass*> ann_classes();
+       AnnotationClass* get_ann_class_by_id(size_t id);
+       const AnnotationClass* get_ann_class_by_id(size_t id) const;
+
        uint32_t get_binary_class_count() const;
        const DecodeBinaryClassInfo* get_binary_class(uint32_t id) const;
 
+       bool has_logic_output() const;
+       const vector<DecoderLogicOutputChannel> logic_output_channels() const;
+
+Q_SIGNALS:
+       void annotation_visibility_changed();
+
+private Q_SLOTS:
+       void on_row_visibility_changed();
+       void on_class_visibility_changed();
+
 private:
        const srd_decoder* const srd_decoder_;
+       uint8_t stack_level_;
 
-       bool shown_;
+       bool visible_;
 
        vector<DecodeChannel*> channels_;
+       deque<Row> rows_;
+       deque<AnnotationClass> ann_classes_;
        vector<DecodeBinaryClassInfo> bin_classes_;
        map<string, GVariant*> options_;
        srd_decoder_inst *decoder_inst_;