2
0
forked from Ivasoft/DSView

fix: On dso mode, the measure value divide by 0

This commit is contained in:
dreamsourcelabTAI
2023-03-31 15:24:07 +08:00
parent 6c0651e7a2
commit b68edecbfa

View File

@@ -55,21 +55,8 @@ const float DsoSignal::EnvelopeThreshold = 256.0f;
DsoSignal::DsoSignal(data::DsoSnapshot *data,
sr_channel *probe):
Signal(probe),
_data(data),
_scale(0),
_en_lock(false),
_show(true),
_vDialActive(false),
_mValid(false),
_level_valid(false),
_autoV(false),
_autoH(false),
_autoV_over(false),
_auto_cnt(0),
_hover_en(false),
_hover_index(0),
_hover_point(QPointF(-1, -1)),
_hover_value(0)
_data(data),
_hover_point(QPointF(-1, -1))
{
QVector<uint64_t> vValue;
QVector<QString> vUnit;
@@ -79,7 +66,23 @@ DsoSignal::DsoSignal(data::DsoSnapshot *data,
}
_signal_type = DSO_SIGNAL;
_vDial = NULL;
_period = 0;
_pcount = 0;
_scale = 0;
_en_lock = false;
_show = true;
_vDialActive = false;
_mValid = false;
_level_valid = false;
_autoV = false;
_autoH = false;
_autoV_over = false;
_auto_cnt = 0;
_hover_en = false;
_hover_index = 0;
_hover_value = 0;
GVariant *gvar_list, *gvar_list_vdivs;
@@ -544,8 +547,10 @@ QString DsoSignal::get_measure(enum DSO_MEASURE_TYPE type)
{
const QString mNone = "--";
QString mString;
if (_mValid) {
const int hw_offset = get_hw_offset();
switch(type) {
case DSO_MS_AMPT:
if (_level_valid)
@@ -577,9 +582,15 @@ QString DsoSignal::get_measure(enum DSO_MEASURE_TYPE type)
case DSO_MS_PERD:
mString = get_time(_period);
break;
case DSO_MS_FREQ:
mString = (abs(_period) > 1000000 ? QString::number(1000000000/_period, 'f', 2) + "Hz" :
abs(_period) > 1000 ? QString::number(1000000/_period, 'f', 2) + "kHz" : QString::number(1000/_period, 'f', 2) + "MHz");
case DSO_MS_FREQ:
if (_period == 0)
mString = mNone;
else if (abs(_period) > 1000000)
mString = QString::number(1000000000/_period, 'f', 2) + "Hz";
else if (abs(_period) > 1000)
mString = QString::number(1000000/_period, 'f', 2) + "kHz";
else
mString = QString::number(1000/_period, 'f', 2) + "MHz";
break;
case DSO_MS_VRMS:
mString = get_voltage(_rms, 2);
@@ -588,26 +599,26 @@ QString DsoSignal::get_measure(enum DSO_MEASURE_TYPE type)
mString = get_voltage(_mean, 2);
break;
case DSO_MS_NOVR:
if (_level_valid)
if (_level_valid && (_high - _low != 0) )
mString = QString::number((_max - _high) * 100.0 / (_high - _low), 'f', 2) + "%";
else
mString = mNone;
break;
case DSO_MS_POVR:
if (_level_valid)
if (_level_valid && (_high - _low != 0) )
mString = QString::number((_low - _min) * 100.0 / (_high - _low), 'f', 2) + "%";
else
mString = mNone;
break;
case DSO_MS_PDUT:
if (_level_valid)
mString = QString::number(_high_time/_period*100, 'f', 2)+"%";
if (_level_valid && _period != 0)
mString = QString::number(_high_time / _period * 100, 'f', 2)+"%";
else
mString = mNone;
break;
case DSO_MS_NDUT:
if (_level_valid)
mString = QString::number(100 - _high_time/_period*100, 'f', 2)+"%";
if (_level_valid && _period != 0)
mString = QString::number(100 - _high_time / _period * 100, 'f', 2)+"%";
else
mString = mNone;
break;
@@ -809,8 +820,9 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right, QColor fore, QColor
const uint16_t enabled_channels = _data->get_channel_num();
const double pixels_offset = offset;
const double samplerate = _data->samplerate();
//const double samplerate = session->get_device()->get_sample_rate();
//const double samplerate = session->cur_snap_samplerate();
assert(samplerate > 0);
const int64_t last_sample = max((int64_t)(_data->get_sample_count() - 1), (int64_t)0);
const double samples_per_pixel = samplerate * scale;
const double start = offset * samples_per_pixel - _view->trig_hoff();
@@ -851,7 +863,7 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right, QColor fore, QColor
const bool startXORend = (index == 0) ? (status.ch0_cyc_llen == 0) : (status.ch1_cyc_llen == 0);
const uint16_t total_channels = g_slist_length(session->get_device()->get_channels());
const double tfactor = (total_channels / enabled_channels) * SR_GHZ(1) * 1.0 / samplerate;
double samples = (index == 0) ? status.ch0_cyc_tlen : status.ch1_cyc_tlen;
_period = ((count == 0) ? 0 : samples / count) * tfactor;
@@ -1520,6 +1532,10 @@ QString DsoSignal::get_voltage(double v, int p, bool scaled)
assert(false);
}
if (get_view_rect().height() == 0){
assert(false);
}
if (scaled)
v = v * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height();
else