File: decoder.hpp

package info (click to toggle)
pulseview 0.4.2-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,064 kB
  • sloc: cpp: 25,958; xml: 215; java: 42; makefile: 2
file content (138 lines) | stat: -rw-r--r-- 3,172 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 * This file is part of the PulseView project.
 *
 * Copyright (C) 2013 Joel Holdsworth <joel@airwebreathe.org.uk>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef PULSEVIEW_PV_DATA_DECODE_DECODER_HPP
#define PULSEVIEW_PV_DATA_DECODE_DECODER_HPP

#include <map>
#include <memory>
#include <set>
#include <vector>

#include <glib.h>

#include <pv/data/signalbase.hpp>
#include <pv/data/decode/row.hpp>

using std::map;
using std::string;
using std::vector;

struct srd_decoder;
struct srd_decoder_inst;
struct srd_channel;
struct srd_session;

namespace pv {

namespace data {

class Logic;
class SignalBase;

namespace decode {

class Decoder;

struct AnnotationClass
{
	size_t id;
	char* name;
	char* description;
	Row* row;
	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;
	const QString name, desc;
	int initial_pin_state;
	const shared_ptr<Decoder> decoder_;
	const srd_channel *pdch_;
};

struct DecodeBinaryClassInfo
{
	uint32_t bin_class_id;
	char* name;
	char* description;
};


class Decoder
{
public:
	Decoder(const srd_decoder *const dec);

	virtual ~Decoder();

	const srd_decoder* get_srd_decoder() const;

	const char* name() const;

	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();

	bool have_required_channels() const;

	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;

private:
	const srd_decoder* const srd_decoder_;

	bool visible_;

	vector<DecodeChannel*> channels_;
	vector<Row> rows_;
	vector<AnnotationClass> ann_classes_;
	vector<DecodeBinaryClassInfo> bin_classes_;
	map<string, GVariant*> options_;
	srd_decoder_inst *decoder_inst_;
};

} // namespace decode
} // namespace data
} // namespace pv

#endif // PULSEVIEW_PV_DATA_DECODE_DECODER_HPP