X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=b43e5bb07f4db8e92c9c797aeb6daa1efc16ce55;hp=09e4400e20a9d1584ca88dc6caa7d8974ddd3bb4;hb=5e95d3d980490ce37d3ae404998b8c89089391e3;hpb=27a3f09baf61c7f9b8c07630d34df75ddfdd476b;ds=sidebyside diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index 09e4400e..b43e5bb0 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -181,10 +181,18 @@ void SignalBase::set_conversion_type(ConversionType t) // Discard converted data converted_data_.reset(); + samples_cleared(); } conversion_type_ = t; + // Re-create an empty container + // so that the signal is recognized as providing logic data + // and thus can be assigned to a decoder + if (conversion_is_a2l()) + if (!converted_data_) + converted_data_ = make_shared(1); // Contains only one channel + start_conversion(); conversion_type_changed(t); @@ -213,20 +221,11 @@ void SignalBase::restore_settings(QSettings &settings) set_conversion_type((ConversionType)settings.value("conversion_type").toInt()); } -uint8_t SignalBase::convert_a2l_threshold(float threshold, float value) -{ - return (value >= threshold) ? 1 : 0; -} - -uint8_t SignalBase::convert_a2l_schmitt_trigger(float lo_thr, float hi_thr, - float value, uint8_t &state) +bool SignalBase::conversion_is_a2l() const { - if (value < lo_thr) - state = 0; - else if (value > hi_thr) - state = 1; - - return state; + return ((channel_type_ == AnalogChannel) && + ((conversion_type_ == A2LConversionByTreshold) || + (conversion_type_ == A2LConversionBySchmittTrigger))); } void SignalBase::conversion_thread_proc(QObject* segment) @@ -237,19 +236,11 @@ void SignalBase::conversion_thread_proc(QObject* segment) start_sample = end_sample = 0; do { - if ((channel_type_ == AnalogChannel) && - ((conversion_type_ == A2LConversionByTreshold) || - (conversion_type_ == A2LConversionBySchmittTrigger))) { + if (conversion_is_a2l()) { AnalogSegment *asegment = qobject_cast(segment); - // Create the logic data container if needed - shared_ptr logic_data; - if (!converted_data_) { - logic_data = make_shared(1); // Contains only one channel - converted_data_ = logic_data; - } else - logic_data = dynamic_pointer_cast(converted_data_); + const shared_ptr logic_data = dynamic_pointer_cast(converted_data_); // Create the initial logic data segment if needed if (logic_data->segments().size() == 0) { @@ -267,9 +258,25 @@ void SignalBase::conversion_thread_proc(QObject* segment) float min_v, max_v; tie(min_v, max_v) = asegment->get_min_max(); - vector lsamples; - lsamples.reserve(ConversionBlockSize); + // Create sigrok::Analog instance + float *asamples = new float[ConversionBlockSize]; + uint8_t *lsamples = new uint8_t[ConversionBlockSize]; + vector > channels; + channels.push_back(channel_); + + vector mq_flags; + const sigrok::Quantity * const mq = sigrok::Quantity::VOLTAGE; + const sigrok::Unit * const unit = sigrok::Unit::VOLT; + + shared_ptr packet = + Session::sr_context->create_analog_packet(channels, + asamples, ConversionBlockSize, mq, unit, mq_flags); + + shared_ptr analog = + dynamic_pointer_cast(packet->payload()); + + // Convert uint64_t i = start_sample; if (conversion_type_ == A2LConversionByTreshold) { @@ -277,54 +284,70 @@ void SignalBase::conversion_thread_proc(QObject* segment) // Convert as many sample blocks as we can while ((end_sample - i) > ConversionBlockSize) { - const float* asamples = asegment->get_samples(i, i + ConversionBlockSize); - for (uint32_t j = 0; j < ConversionBlockSize; j++) - lsamples.push_back(convert_a2l_threshold(threshold, asamples[j])); - lsegment->append_payload(lsamples.data(), lsamples.size()); + asegment->get_samples(i, i + ConversionBlockSize, asamples); + + shared_ptr logic = + analog->get_logic_via_threshold(threshold, lsamples); + + lsegment->append_payload(logic->data_pointer(), logic->data_length()); + samples_added(lsegment, i, i + ConversionBlockSize); i += ConversionBlockSize; - lsamples.clear(); - delete[] asamples; } - // Convert remaining samples - const float* asamples = asegment->get_samples(i, end_sample); - for (uint32_t j = 0; j < (end_sample - i); j++) - lsamples.push_back(convert_a2l_threshold(threshold, asamples[j])); - lsegment->append_payload(lsamples.data(), lsamples.size()); + // Re-create sigrok::Analog and convert remaining samples + packet = Session::sr_context->create_analog_packet(channels, + asamples, end_sample - i, mq, unit, mq_flags); + + analog = dynamic_pointer_cast(packet->payload()); + + asegment->get_samples(i, end_sample, asamples); + shared_ptr logic = + analog->get_logic_via_threshold(threshold, lsamples); + lsegment->append_payload(logic->data_pointer(), logic->data_length()); samples_added(lsegment, i, end_sample); - delete[] asamples; } if (conversion_type_ == A2LConversionBySchmittTrigger) { const float amplitude = max_v - min_v; - const float lo_thr = min_v + (amplitude * 0.1); // 10% above min - const float hi_thr = max_v - (amplitude * 0.1); // 10% below max + const float center = min_v + (amplitude / 2); + const float lo_thr = center - (amplitude * 0.15); // 15% margin + const float hi_thr = center + (amplitude * 0.15); // 15% margin uint8_t state = 0; // TODO Use value of logic sample n-1 instead of 0 // Convert as many sample blocks as we can while ((end_sample - i) > ConversionBlockSize) { - const float* asamples = asegment->get_samples(i, i + ConversionBlockSize); - for (uint32_t j = 0; j < ConversionBlockSize; j++) - lsamples.push_back(convert_a2l_schmitt_trigger(lo_thr, hi_thr, asamples[j], state)); - lsegment->append_payload(lsamples.data(), lsamples.size()); + asegment->get_samples(i, i + ConversionBlockSize, asamples); + + shared_ptr logic = + analog->get_logic_via_schmitt_trigger(lo_thr, hi_thr, + &state, lsamples); + + lsegment->append_payload(logic->data_pointer(), logic->data_length()); + samples_added(lsegment, i, i + ConversionBlockSize); i += ConversionBlockSize; - lsamples.clear(); - delete[] asamples; } - // Convert remaining samples - const float* asamples = asegment->get_samples(i, end_sample); - for (uint32_t j = 0; j < (end_sample - i); j++) - lsamples.push_back(convert_a2l_schmitt_trigger(lo_thr, hi_thr, asamples[j], state)); - lsegment->append_payload(lsamples.data(), lsamples.size()); + // Re-create sigrok::Analog and convert remaining samples + packet = Session::sr_context->create_analog_packet(channels, + asamples, end_sample - i, mq, unit, mq_flags); + + analog = dynamic_pointer_cast(packet->payload()); + + asegment->get_samples(i, end_sample, asamples); + shared_ptr logic = + analog->get_logic_via_schmitt_trigger(lo_thr, hi_thr, + &state, lsamples); + lsegment->append_payload(logic->data_pointer(), logic->data_length()); samples_added(lsegment, i, end_sample); - delete[] asamples; } // If acquisition is ongoing, start-/endsample may have changed end_sample = asegment->get_sample_count(); + + delete[] lsamples; + delete[] asamples; } } @@ -339,10 +362,7 @@ void SignalBase::start_conversion() { stop_conversion(); - if ((channel_type_ == AnalogChannel) && - ((conversion_type_ == A2LConversionByTreshold) || - (conversion_type_ == A2LConversionBySchmittTrigger))) { - + if (conversion_is_a2l()) { shared_ptr analog_data = dynamic_pointer_cast(data_); if (analog_data->analog_segments().size() > 0) {