using pv::data::LogicSegment;
using pv::data::SignalBase;
using pv::util::SIPrefix;
+using pv::util::determine_value_prefix;
namespace pv {
namespace views {
const float AnalogSignal::EnvelopeThreshold = 64.0f;
const int AnalogSignal::MaximumVDivs = 10;
-const int AnalogSignal::MinScaleIndex = -6;
-const int AnalogSignal::MaxScaleIndex = 7;
+const int AnalogSignal::MinScaleIndex = -6; // 0.01 units/div
+const int AnalogSignal::MaxScaleIndex = 10; // 1000 units/div
const int AnalogSignal::InfoTextMarginRight = 20;
const int AnalogSignal::InfoTextMarginBottom = 5;
pv::Session &session,
shared_ptr<data::SignalBase> base) :
Signal(session, base),
+ value_at_hover_pos_(std::numeric_limits<float>::quiet_NaN()),
scale_index_(4), // 20 per div
pos_vdivs_(1),
neg_vdivs_(1),
resolution_(0),
display_type_(DisplayBoth),
- autoranging_(true),
- value_at_hover_pos_(std::numeric_limits<float>::quiet_NaN())
+ autoranging_(true)
{
axis_pen_ = AxisPen;
return base_->analog_data();
}
-void AnalogSignal::save_settings(QSettings &settings) const
+std::map<QString, QVariant> AnalogSignal::save_settings() const
{
- settings.setValue("pos_vdivs", pos_vdivs_);
- settings.setValue("neg_vdivs", neg_vdivs_);
- settings.setValue("scale_index", scale_index_);
- settings.setValue("display_type", display_type_);
- settings.setValue("autoranging", autoranging_);
- settings.setValue("div_height", div_height_);
+ std::map<QString, QVariant> result;
+
+ result["pos_vdivs"] = pos_vdivs_;
+ result["neg_vdivs"] = neg_vdivs_;
+ result["scale_index"] = scale_index_;
+ result["display_type"] = display_type_;
+ result["autoranging"] = pos_vdivs_;
+ result["div_height"] = div_height_;
+
+ return result;
}
-void AnalogSignal::restore_settings(QSettings &settings)
+void AnalogSignal::restore_settings(std::map<QString, QVariant> settings)
{
- if (settings.contains("pos_vdivs"))
- pos_vdivs_ = settings.value("pos_vdivs").toInt();
+ auto entry = settings.find("pos_vdivs");
+ if (entry != settings.end())
+ pos_vdivs_ = settings["pos_vdivs"].toInt();
- if (settings.contains("neg_vdivs"))
- neg_vdivs_ = settings.value("neg_vdivs").toInt();
+ entry = settings.find("neg_vdivs");
+ if (entry != settings.end())
+ neg_vdivs_ = settings["neg_vdivs"].toInt();
- if (settings.contains("scale_index")) {
- scale_index_ = settings.value("scale_index").toInt();
+ entry = settings.find("scale_index");
+ if (entry != settings.end()) {
+ scale_index_ = settings["scale_index"].toInt();
update_scale();
}
- if (settings.contains("display_type"))
- display_type_ = (DisplayType)(settings.value("display_type").toInt());
+ entry = settings.find("display_type");
+ if (entry != settings.end())
+ display_type_ = (DisplayType)(settings["display_type"].toInt());
- if (settings.contains("autoranging"))
- autoranging_ = settings.value("autoranging").toBool();
+ entry = settings.find("autoranging");
+ if (entry != settings.end())
+ autoranging_ = settings["autoranging"].toBool();
- if (settings.contains("div_height")) {
+ entry = settings.find("div_height");
+ if (entry != settings.end()) {
const int old_height = div_height_;
- div_height_ = settings.value("div_height").toInt();
+ div_height_ = settings["div_height"].toInt();
if ((div_height_ != old_height) && owner_) {
// Call order is important, otherwise the lazy event handler won't work
QString infotext;
+ SIPrefix prefix;
+ if (fabs(signal_max_) > fabs(signal_min_))
+ prefix = determine_value_prefix(fabs(signal_max_));
+ else
+ prefix = determine_value_prefix(fabs(signal_min_));
+
// Show the info section on the right side of the trace, including
// the value at the hover point when the hover marker is enabled
// and we have corresponding data available
if (show_hover_marker_ && !std::isnan(value_at_hover_pos_)) {
infotext = QString("[%1] %2 V/div")
- .arg(format_value_si(value_at_hover_pos_, SIPrefix::unspecified, 2, "V", false))
+ .arg(format_value_si(value_at_hover_pos_, prefix, 3, "V", false))
.arg(resolution_);
} else
infotext = QString("%1 V/div").arg(resolution_);
if (segments.empty())
return;
- double signal_min_ = 0, signal_max_ = 0;
double min = 0, max = 0;
for (const shared_ptr<pv::data::AnalogSegment>& segment : segments) {
if (hp.x() <= 0) {
value_at_hover_pos_ = std::numeric_limits<float>::quiet_NaN();
} else {
- try {
+ if ((size_t)hp.x() < value_at_pixel_pos_.size())
value_at_hover_pos_ = value_at_pixel_pos_.at(hp.x());
- } catch (out_of_range&) {
+ else
value_at_hover_pos_ = std::numeric_limits<float>::quiet_NaN();
- }
}
}
void AnalogSignal::on_min_max_changed(float min, float max)
{
- (void)min;
- (void)max;
-
if (autoranging_)
perform_autoranging(false, false);
+ else {
+ if (min < signal_min_) signal_min_ = min;
+ if (max > signal_max_) signal_max_ = max;
+ }
}
void AnalogSignal::on_pos_vdivs_changed(int vdivs)