X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fsignalbase.cpp;h=b43e5bb07f4db8e92c9c797aeb6daa1efc16ce55;hp=173610d945e7b66ff5ce3e1b45e05b1c821a3b2e;hb=5e95d3d980490ce37d3ae404998b8c89089391e3;hpb=ccccb91439b9de48a7bcc76c6fa45d1dc166a297 diff --git a/pv/data/signalbase.cpp b/pv/data/signalbase.cpp index 173610d9..b43e5bb0 100644 --- a/pv/data/signalbase.cpp +++ b/pv/data/signalbase.cpp @@ -181,6 +181,7 @@ void SignalBase::set_conversion_type(ConversionType t) // Discard converted data converted_data_.reset(); + samples_cleared(); } conversion_type_ = t; @@ -220,22 +221,6 @@ 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) -{ - if (value < lo_thr) - state = 0; - else if (value > hi_thr) - state = 1; - - return state; -} - bool SignalBase::conversion_is_a2l() const { return ((channel_type_ == AnalogChannel) && @@ -273,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) { @@ -283,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; } }