summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
0f5e2c7)
Also, prevent the autoranging algo from changing the div
assigment when the user is in the process of changing it.
This way, we only change the div assignment during
acquisition, which is when we actually need this feature.
#include <QFormLayout>
#include <QGridLayout>
#include <QLabel>
#include <QFormLayout>
#include <QGridLayout>
#include <QLabel>
#include <QString>
#include "analogsignal.hpp"
#include <QString>
#include "analogsignal.hpp"
owner_->row_item_appearance_changed(false, true);
}
owner_->row_item_appearance_changed(false, true);
}
-void AnalogSignal::perform_autoranging(bool force_update)
+void AnalogSignal::perform_autoranging(bool keep_divs, bool force_update)
{
const deque< shared_ptr<pv::data::AnalogSegment> > &segments =
base_->analog_data()->analog_segments();
{
const deque< shared_ptr<pv::data::AnalogSegment> > &segments =
base_->analog_data()->analog_segments();
prev_min = min;
prev_max = max;
prev_min = min;
prev_max = max;
- // Use all divs for the positive range if there are no negative values
- if ((min == 0) && (neg_vdivs_ > 0)) {
- pos_vdivs_ += neg_vdivs_;
- neg_vdivs_ = 0;
- }
+ // If we're allowed to alter the div assignment...
+ if (!keep_divs) {
+ // Use all divs for the positive range if there are no negative values
+ if ((min == 0) && (neg_vdivs_ > 0)) {
+ pos_vdivs_ += neg_vdivs_;
+ neg_vdivs_ = 0;
+ }
- // Split up the divs if there are negative values but no negative divs
- if ((min < 0) && (neg_vdivs_ == 0)) {
- neg_vdivs_ = pos_vdivs_ / 2;
- pos_vdivs_ -= neg_vdivs_;
+ // Split up the divs if there are negative values but no negative divs
+ if ((min < 0) && (neg_vdivs_ == 0)) {
+ neg_vdivs_ = pos_vdivs_ / 2;
+ pos_vdivs_ -= neg_vdivs_;
+ }
+ // If there is still no positive div when we need it, add one
+ // (this can happen when pos_vdivs==neg_vdivs==0)
+ if ((max > 0) && (pos_vdivs_ == 0))
+ pos_vdivs_ = 1;
+
+ // If there is still no negative div when we need it, add one
+ // (this can happen when pos_vdivs was 0 or 1 when trying to split)
+ if ((min < 0) && (neg_vdivs_ == 0))
+ neg_vdivs_ = 1;
+
double min_value_per_div;
if ((pos_vdivs_ > 0) && (neg_vdivs_ > 0))
min_value_per_div = std::max(max / pos_vdivs_, -min / neg_vdivs_);
double min_value_per_div;
if ((pos_vdivs_ > 0) && (neg_vdivs_ > 0))
min_value_per_div = std::max(max / pos_vdivs_, -min / neg_vdivs_);
QFormLayout *const layout = new QFormLayout;
// Add the number of vdivs
QFormLayout *const layout = new QFormLayout;
// Add the number of vdivs
- QSpinBox *pvdiv_sb = new QSpinBox(parent);
- pvdiv_sb->setRange(0, MaximumVDivs);
- pvdiv_sb->setValue(pos_vdivs_);
- connect(pvdiv_sb, SIGNAL(valueChanged(int)),
+ pvdiv_sb_ = new QSpinBox(parent);
+ pvdiv_sb_->setRange(0, MaximumVDivs);
+ pvdiv_sb_->setValue(pos_vdivs_);
+ connect(pvdiv_sb_, SIGNAL(valueChanged(int)),
this, SLOT(on_pos_vdivs_changed(int)));
this, SLOT(on_pos_vdivs_changed(int)));
- layout->addRow(tr("Number of pos vertical divs"), pvdiv_sb);
+ layout->addRow(tr("Number of pos vertical divs"), pvdiv_sb_);
- QSpinBox *nvdiv_sb = new QSpinBox(parent);
- nvdiv_sb->setRange(0, MaximumVDivs);
- nvdiv_sb->setValue(neg_vdivs_);
- connect(nvdiv_sb, SIGNAL(valueChanged(int)),
+ nvdiv_sb_ = new QSpinBox(parent);
+ nvdiv_sb_->setRange(0, MaximumVDivs);
+ nvdiv_sb_->setValue(neg_vdivs_);
+ connect(nvdiv_sb_, SIGNAL(valueChanged(int)),
this, SLOT(on_neg_vdivs_changed(int)));
this, SLOT(on_neg_vdivs_changed(int)));
- layout->addRow(tr("Number of neg vertical divs"), nvdiv_sb);
+ layout->addRow(tr("Number of neg vertical divs"), nvdiv_sb_);
// Add the vertical resolution
resolution_cb_ = new QComboBox(parent);
// Add the vertical resolution
resolution_cb_ = new QComboBox(parent);
void AnalogSignal::on_samples_added()
{
void AnalogSignal::on_samples_added()
{
+ perform_autoranging(false, false);
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
void AnalogSignal::on_pos_vdivs_changed(int vdivs)
{
void AnalogSignal::on_pos_vdivs_changed(int vdivs)
{
+ if (vdivs == pos_vdivs_)
+ return;
+
- if (autoranging_)
- perform_autoranging(true);
+ if (autoranging_) {
+ perform_autoranging(true, true);
+
+ // It could be that a positive or negative div was added, so update
+ if (pvdiv_sb_) {
+ pvdiv_sb_->setValue(pos_vdivs_);
+ nvdiv_sb_->setValue(neg_vdivs_);
+ }
+ }
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
void AnalogSignal::on_neg_vdivs_changed(int vdivs)
{
void AnalogSignal::on_neg_vdivs_changed(int vdivs)
{
+ if (vdivs == neg_vdivs_)
+ return;
+
- if (autoranging_)
- perform_autoranging(true);
+ if (autoranging_) {
+ perform_autoranging(true, true);
+
+ // It could be that a positive or negative div was added, so update
+ if (pvdiv_sb_) {
+ pvdiv_sb_->setValue(pos_vdivs_);
+ nvdiv_sb_->setValue(neg_vdivs_);
+ }
+ }
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
autoranging_ = (state == Qt::Checked);
if (autoranging_)
autoranging_ = (state == Qt::Checked);
if (autoranging_)
- perform_autoranging(true);
+ perform_autoranging(false, true);
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
if (owner_) {
// Call order is important, otherwise the lazy event handler won't work
#include <memory>
#include <QComboBox>
#include <memory>
#include <QComboBox>
using std::pair;
using std::shared_ptr;
using std::pair;
using std::shared_ptr;
void update_conversion_type();
void update_conversion_type();
- void perform_autoranging(bool force_update = false);
+ void perform_autoranging(bool keep_divs, bool force_update);
protected:
void populate_popup_form(QWidget *parent, QFormLayout *form);
protected:
void populate_popup_form(QWidget *parent, QFormLayout *form);
private:
QComboBox *resolution_cb_, *conversion_cb_, *display_type_cb_;
private:
QComboBox *resolution_cb_, *conversion_cb_, *display_type_cb_;
+ QSpinBox *pvdiv_sb_, *nvdiv_sb_;
float scale_;
int scale_index_;
float scale_;
int scale_index_;