#include <cassert>
+#include <QDebug>
+
#include <libsigrokcxx/libsigrokcxx.hpp>
#include <libsigrokdecode/libsigrokdecode.h>
Decoder::Decoder(const srd_decoder *const dec) :
decoder_(dec),
- shown_(true)
+ shown_(true),
+ decoder_inst_(nullptr)
{
}
assert(value);
g_variant_ref(value);
options_[id] = value;
+
+ // If we have a decoder instance, apply option value immediately
+ if (decoder_inst_) {
+ GHashTable *const opt_hash = g_hash_table_new_full(g_str_hash,
+ g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
+
+ g_variant_ref(value);
+ g_hash_table_insert(opt_hash, (void*)g_strdup(id), value);
+
+ srd_inst_option_set(decoder_inst_, opt_hash);
+ g_hash_table_destroy(opt_hash);
+ }
}
bool Decoder::have_required_channels() const
return true;
}
-srd_decoder_inst* Decoder::create_decoder_inst(srd_session *session) const
+srd_decoder_inst* Decoder::create_decoder_inst(srd_session *session)
{
GHashTable *const opt_hash = g_hash_table_new_full(g_str_hash,
g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
option.first.c_str()), value);
}
- srd_decoder_inst *const decoder_inst = srd_inst_new(
- session, decoder_->id, opt_hash);
+ if (decoder_inst_)
+ qDebug() << "WARNING: previous decoder instance" << decoder_inst_ << "exists";
+
+ decoder_inst_ = srd_inst_new(session, decoder_->id, opt_hash);
g_hash_table_destroy(opt_hash);
- if (!decoder_inst)
+ if (!decoder_inst_)
return nullptr;
// Setup the channels
- GArray *const init_pin_states = g_array_sized_new(FALSE, TRUE,
+ GArray *const init_pin_states = g_array_sized_new(false, true,
sizeof(uint8_t), channels_.size());
g_array_set_size(init_pin_states, channels_.size());
g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
for (DecodeChannel *ch : channels_) {
+ if (!ch->assigned_signal)
+ continue;
+
init_pin_states->data[ch->id] = ch->initial_pin_state;
- GVariant *const gvar = g_variant_new_int32(ch->id); // id = bit position
+ GVariant *const gvar = g_variant_new_int32(ch->bit_id); // bit_id = bit position
g_variant_ref_sink(gvar);
- // key is channel name, value is bit position in each sample
+ // key is channel name (pdch->id), value is bit position in each sample (gvar)
g_hash_table_insert(channels, ch->pdch_->id, gvar);
}
- srd_inst_channel_set_all(decoder_inst, channels);
+ srd_inst_channel_set_all(decoder_inst_, channels);
- srd_inst_initial_pins_set_all(decoder_inst, init_pin_states);
- g_array_free(init_pin_states, TRUE);
+ srd_inst_initial_pins_set_all(decoder_inst_, init_pin_states);
+ g_array_free(init_pin_states, true);
- return decoder_inst;
+ return decoder_inst_;
+}
+
+void Decoder::invalidate_decoder_inst()
+{
+ decoder_inst_ = nullptr;
}
} // namespace decode