+void DecodeSignal::disconnect_input_notifiers()
+{
+ // Disconnect the notification slot from the previous set of signals
+ for (decode::DecodeChannel& ch : channels_) {
+ if (!ch.assigned_signal)
+ continue;
+ const data::SignalBase *signal = ch.assigned_signal.get();
+ disconnect(signal, nullptr, this, SLOT(on_data_cleared()));
+ disconnect(signal, nullptr, this, SLOT(on_data_received()));
+ }
+}
+
+void DecodeSignal::connect_input_segment_notifiers(uint32_t segment_id)
+{
+ for (decode::DecodeChannel& ch : channels_)
+ if (ch.assigned_signal) {
+ const shared_ptr<Logic> logic_data = ch.assigned_signal->logic_data();
+
+ shared_ptr<const LogicSegment> segment;
+ if (segment_id < logic_data->logic_segments().size()) {
+ segment = logic_data->logic_segments().at(segment_id)->get_shared_ptr();
+ } else {
+ qWarning() << "Signal" << name() << ":" << ch.assigned_signal->name() \
+ << "has no logic segment, can't connect notifier" << segment_id;
+ continue;
+ }
+
+ if (!segment) {
+ qWarning() << "Signal" << name() << ":" << ch.assigned_signal->name() \
+ << "has no logic segment, can't connect notifier" << segment_id;
+ continue;
+ }
+
+ connect(segment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed()));
+ }
+}
+
+void DecodeSignal::disconnect_input_segment_notifiers(uint32_t segment_id)
+{
+ for (decode::DecodeChannel& ch : channels_)
+ if (ch.assigned_signal) {
+ const shared_ptr<Logic> logic_data = ch.assigned_signal->logic_data();
+
+ shared_ptr<const LogicSegment> segment;
+ if (segment_id < logic_data->logic_segments().size())
+ segment = logic_data->logic_segments().at(segment_id)->get_shared_ptr();
+ else
+ continue;
+
+ if (!segment)
+ continue;
+
+ disconnect(segment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed()));
+ }
+}
+