2 * This file is part of the PulseView project.
4 * Copyright (C) 2013 Joel Holdsworth <joel@airwebreathe.org.uk>
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 2 of the License, or
9 * (at your option) any later version.
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.
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/>.
22 #include <libsigrokcxx/libsigrokcxx.hpp>
23 #include <libsigrokdecode/libsigrokdecode.h>
25 #include "decoder.hpp"
27 #include <pv/data/signalbase.hpp>
31 using std::shared_ptr
;
38 Decoder::Decoder(const srd_decoder
*const dec
) :
41 initial_pins_(nullptr)
47 for (auto& option
: options_
)
48 g_variant_unref(option
.second
);
51 const srd_decoder
* Decoder::decoder() const
56 bool Decoder::shown() const
61 void Decoder::show(bool show
)
66 const map
<const srd_channel
*, shared_ptr
<data::SignalBase
> >&
67 Decoder::channels() const
72 void Decoder::set_channels(map
<const srd_channel
*,
73 shared_ptr
<data::SignalBase
> > channels
)
78 void Decoder::set_initial_pins(GArray
*initial_pins
)
81 g_array_free(initial_pins_
, TRUE
);
82 initial_pins_
= initial_pins
;
85 GArray
*Decoder::initial_pins() const
90 const map
<string
, GVariant
*>& Decoder::options() const
95 void Decoder::set_option(const char *id
, GVariant
*value
)
102 bool Decoder::have_required_channels() const
104 for (GSList
*l
= decoder_
->channels
; l
; l
= l
->next
) {
105 const srd_channel
*const pdch
= (const srd_channel
*)l
->data
;
107 if (channels_
.find(pdch
) == channels_
.end())
114 set
< shared_ptr
<pv::data::Logic
> > Decoder::get_data()
116 set
< shared_ptr
<pv::data::Logic
> > data
;
117 for (const auto& channel
: channels_
) {
118 shared_ptr
<data::SignalBase
> b(channel
.second
);
120 data
.insert(b
->logic_data());
126 srd_decoder_inst
* Decoder::create_decoder_inst(srd_session
*session
) const
128 GHashTable
*const opt_hash
= g_hash_table_new_full(g_str_hash
,
129 g_str_equal
, g_free
, (GDestroyNotify
)g_variant_unref
);
131 for (const auto& option
: options_
) {
132 GVariant
*const value
= option
.second
;
133 g_variant_ref(value
);
134 g_hash_table_replace(opt_hash
, (void*)g_strdup(
135 option
.first
.c_str()), value
);
138 srd_decoder_inst
*const decoder_inst
= srd_inst_new(
139 session
, decoder_
->id
, opt_hash
);
140 g_hash_table_destroy(opt_hash
);
145 // Setup the channels
146 GHashTable
*const channels
= g_hash_table_new_full(g_str_hash
,
147 g_str_equal
, g_free
, (GDestroyNotify
)g_variant_unref
);
149 for (const auto& channel
: channels_
) {
150 shared_ptr
<data::SignalBase
> b(channel
.second
);
151 GVariant
*const gvar
= g_variant_new_int32(b
->index());
152 g_variant_ref_sink(gvar
);
153 g_hash_table_insert(channels
, channel
.first
->id
, gvar
);
156 srd_inst_channel_set_all(decoder_inst
, channels
);
158 srd_inst_initial_pins_set_all(decoder_inst
, initial_pins_
);
163 } // namespace decode