Commit cb11dd719d02fbc456c0d3685b269b1323610a1b

Authored by Denis Dovzhenko
Committed by David Gräff
1 parent 43a1bd67

fix segfault #183, improve SW trigger stability by less aggressive samplerate selection

openhantek/src/docks/HorizontalDock.cpp
@@ -164,9 +164,16 @@ void HorizontalDock::setSamplerateLimits(double minimum, double maximum) { @@ -164,9 +164,16 @@ void HorizontalDock::setSamplerateLimits(double minimum, double maximum) {
164 } 164 }
165 165
166 void HorizontalDock::setSamplerateSteps(int mode, QList<double> steps) { 166 void HorizontalDock::setSamplerateSteps(int mode, QList<double> steps) {
167 - QSignalBlocker blocker(samplerateSiSpinBox);  
168 - this->samplerateSiSpinBox->setMode(mode);  
169 - this->samplerateSiSpinBox->setSteps(steps); 167 + // Assume that method is invoked for fixed samplerate devices only
  168 + QSignalBlocker samplerateBlocker(samplerateSiSpinBox);
  169 + samplerateSiSpinBox->setMode(mode);
  170 + samplerateSiSpinBox->setSteps(steps);
  171 + samplerateSiSpinBox->setMinimum(steps.first());
  172 + samplerateSiSpinBox->setMaximum(steps.last());
  173 + // Make reasonable adjustments to the timebase spinbox
  174 + QSignalBlocker timebaseBlocker(timebaseSiSpinBox);
  175 + timebaseSiSpinBox->setMinimum(pow(10, floor(log10(1.0 / steps.last()))));
  176 + timebaseSiSpinBox->setMaximum(pow(10, ceil(log10(8192.0 / (steps.first() * 10)))));
170 } 177 }
171 178
172 /// \brief Called when the frequencybase spinbox changes its value. 179 /// \brief Called when the frequencybase spinbox changes its value.
openhantek/src/hantekdso/hantekdsocontrol.cpp
@@ -583,9 +583,8 @@ void HantekDsoControl::restoreTargets() { @@ -583,9 +583,8 @@ void HantekDsoControl::restoreTargets() {
583 583
584 void HantekDsoControl::updateSamplerateLimits() { 584 void HantekDsoControl::updateSamplerateLimits() {
585 if (specification->isFixedSamplerateDevice) { 585 if (specification->isFixedSamplerateDevice) {
586 - // Convert to GUI presentable values (1e5 -> 1.0, 48e6 -> 480.0 etc)  
587 QList<double> sampleSteps; 586 QList<double> sampleSteps;
588 - for (auto &v : specification->fixedSampleRates) { sampleSteps << v.samplerate / 1e5; } 587 + for (auto &v : specification->fixedSampleRates) { sampleSteps << v.samplerate; }
589 emit samplerateSet(1, sampleSteps); 588 emit samplerateSet(1, sampleSteps);
590 } else { 589 } else {
591 // Works only if the minimum samplerate for normal mode is lower than for fast 590 // Works only if the minimum samplerate for normal mode is lower than for fast
@@ -691,10 +690,13 @@ Dso::ErrorCode HantekDsoControl::setRecordTime(double duration) { @@ -691,10 +690,13 @@ Dso::ErrorCode HantekDsoControl::setRecordTime(double duration) {
691 // For now - we go for the 10240 size sampling - the other seems not to be supported 690 // For now - we go for the 10240 size sampling - the other seems not to be supported
692 // Find highest samplerate using less than 10240 samples to obtain our duration. 691 // Find highest samplerate using less than 10240 samples to obtain our duration.
693 unsigned sampleCount = 10240; 692 unsigned sampleCount = 10240;
694 - if (specification->isSoftwareTriggerDevice) sampleCount -= controlsettings.swSampleMargin;  
695 - unsigned sampleId;  
696 - for (sampleId = 0; sampleId < specification->fixedSampleRates.size(); ++sampleId) {  
697 - if (specification->fixedSampleRates[sampleId].samplerate * duration < sampleCount) break; 693 + // Ensure that at least 1/2 of remaining samples are available for SW trigger algorithm
  694 + if (specification->isSoftwareTriggerDevice) {
  695 + sampleCount = (sampleCount - controlsettings.swSampleMargin) / 2;
  696 + }
  697 + unsigned sampleId = 0;
  698 + for (unsigned id = 0; id < specification->fixedSampleRates.size(); ++id) {
  699 + if (specification->fixedSampleRates[id].samplerate * duration < sampleCount) sampleId = id;
698 } 700 }
699 // Usable sample value 701 // Usable sample value
700 modifyCommand<ControlSetTimeDIV>(ControlCode::CONTROL_SETTIMEDIV) 702 modifyCommand<ControlSetTimeDIV>(ControlCode::CONTROL_SETTIMEDIV)
openhantek/src/post/ppresult.cpp
@@ -19,6 +19,7 @@ unsigned int PPresult::sampleCount() const { return (unsigned)analyzedData[0].vo @@ -19,6 +19,7 @@ unsigned int PPresult::sampleCount() const { return (unsigned)analyzedData[0].vo
19 unsigned int PPresult::channelCount() const { return (unsigned)analyzedData.size(); } 19 unsigned int PPresult::channelCount() const { return (unsigned)analyzedData.size(); }
20 20
21 double DataChannel::computeAmplitude() const { 21 double DataChannel::computeAmplitude() const {
  22 + if (voltage.sample.empty()) return 0.0;
22 double minimalVoltage, maximalVoltage; 23 double minimalVoltage, maximalVoltage;
23 minimalVoltage = maximalVoltage = voltage.sample[0]; 24 minimalVoltage = maximalVoltage = voltage.sample[0];
24 25
openhantek/src/settings.cpp
@@ -106,7 +106,8 @@ void DsoSettings::load() { @@ -106,7 +106,8 @@ void DsoSettings::load() {
106 for (ChannelID channel = 0; channel < scope.voltage.size(); ++channel) { 106 for (ChannelID channel = 0; channel < scope.voltage.size(); ++channel) {
107 store->beginGroup(QString("vertical%1").arg(channel)); 107 store->beginGroup(QString("vertical%1").arg(channel));
108 if (store->contains("gainStepIndex")) scope.voltage[channel].gainStepIndex = store->value("gainStepIndex").toUInt(); 108 if (store->contains("gainStepIndex")) scope.voltage[channel].gainStepIndex = store->value("gainStepIndex").toUInt();
109 - if (store->contains("couplingOrMathIndex")) scope.voltage[channel].couplingOrMathIndex = store->value("couplingIndex").toUInt(); 109 + if (store->contains("couplingOrMathIndex")) scope.voltage[channel].couplingOrMathIndex =
  110 + store->value("couplingOrMathIndex").toUInt();
110 if (store->contains("inverted")) scope.voltage[channel].inverted = store->value("inverted").toBool(); 111 if (store->contains("inverted")) scope.voltage[channel].inverted = store->value("inverted").toBool();
111 if (store->contains("offset")) scope.voltage[channel].offset = store->value("offset").toDouble(); 112 if (store->contains("offset")) scope.voltage[channel].offset = store->value("offset").toDouble();
112 if (store->contains("trigger")) scope.voltage[channel].trigger = store->value("trigger").toDouble(); 113 if (store->contains("trigger")) scope.voltage[channel].trigger = store->value("trigger").toDouble();
openhantek/src/widgets/sispinbox.cpp
@@ -124,7 +124,8 @@ void SiSpinBox::stepBy(int steps) { @@ -124,7 +124,8 @@ void SiSpinBox::stepBy(int steps) {
124 if (stepsId < 0) stepsId += stepsCount; 124 if (stepsId < 0) stepsId += stepsCount;
125 value = pow(stepsSpan, floor((double)this->stepId / stepsCount)) * this->steps[stepsId]; 125 value = pow(stepsSpan, floor((double)this->stepId / stepsCount)) * this->steps[stepsId];
126 } else { 126 } else {
127 - value = this->minimum() * this->steps[stepId]; 127 + stepId = std::min(std::max(stepId, 0), stepsCount);
  128 + value = this->steps[stepId];
128 } 129 }
129 if (value <= this->minimum() || value >= this->maximum()) break; 130 if (value <= this->minimum() || value >= this->maximum()) break;
130 } 131 }