Fix #1270 by replacing insignificant characters before comparing
[pulseview.git] / pv / data / decodesignal.cpp
index 05dc3428ab5ce8e9f2bcb964175b55fceb3557d2..9b40540c7032b058f988f8cb8d903d6763b3d97f 100644 (file)
@@ -151,6 +151,8 @@ void DecodeSignal::reset_decode(bool shutting_down)
                logic_mux_thread_.join();
        }
 
+       resume_decode();  // Make sure the decode thread isn't blocked by pausing
+
        class_rows_.clear();
        current_segment_id_ = 0;
        segments_.clear();
@@ -258,6 +260,25 @@ void DecodeSignal::begin_decode()
        decode_thread_ = std::thread(&DecodeSignal::decode_proc, this);
 }
 
+void DecodeSignal::pause_decode()
+{
+       decode_paused_ = true;
+}
+
+void DecodeSignal::resume_decode()
+{
+       // Manual unlocking is done before notifying, to avoid waking up the
+       // waiting thread only to block again (see notify_one for details)
+       decode_pause_mutex_.unlock();
+       decode_pause_cond_.notify_one();
+       decode_paused_ = false;
+}
+
+bool DecodeSignal::is_paused() const
+{
+       return decode_paused_;
+}
+
 QString DecodeSignal::error_message() const
 {
        lock_guard<mutex> lock(output_mutex_);
@@ -282,14 +303,16 @@ void DecodeSignal::auto_assign_signals(const shared_ptr<Decoder> dec)
                if (ch.assigned_signal)
                        continue;
 
-               const QString ch_name = ch.name.toLower();
+               QString ch_name = ch.name.toLower();
+               ch_name = ch_name.replace(QRegExp("[-_.]"), " ");
 
                shared_ptr<data::SignalBase> match;
                for (shared_ptr<data::SignalBase> s : session_.signalbases()) {
                        if (!s->enabled())
                                continue;
 
-                       const QString s_name = s->name().toLower();
+                       QString s_name = s->name().toLower();
+                       s_name = s_name.replace(QRegExp("[-_.]"), " ");
 
                        if (s->logic_data() &&
                                ((ch_name.contains(s_name)) || (s_name.contains(ch_name)))) {
@@ -981,6 +1004,11 @@ void DecodeSignal::decode_data(
                // Notify the frontend that we processed some data and
                // possibly have new annotations as well
                new_annotations();
+
+               if (decode_paused_) {
+                       unique_lock<mutex> pause_wait_lock(decode_pause_mutex_);
+                       decode_pause_cond_.wait(pause_wait_lock);
+               }
        }
 }