]> sigrok.org Git - pulseview.git/commitdiff
View: Allow ScaleUnits[0] to actually be used
authorSoeren Apel <redacted>
Sat, 15 Aug 2015 21:11:52 +0000 (23:11 +0200)
committerUwe Hermann <redacted>
Sun, 16 Aug 2015 16:54:18 +0000 (18:54 +0200)
Without this patch, no major tick on the ruler will ever
begin with a '1' but only with '2' or '5'. This behavior
can also be observed with current sigrok git head, so it
is independent of my util/view/ruler patch set.

pv/view/view.cpp

index e6be30e0680b48670a885fb0630d25209b9953b7..f146470d314f72443c9b90063f20e42da9575abd 100644 (file)
@@ -493,8 +493,8 @@ void View::set_zoom(double scale, int offset)
 
 void View::calculate_tick_spacing()
 {
-       const double SpacingIncrement = 32.0f;
-       const double MinValueSpacing = 32.0f;
+       const double SpacingIncrement = 10.0f;
+       const double MinValueSpacing = 25.0f;
 
        // Figure out the highest numeric value visible on a label
        const QSize areaSize = viewport_->size();
@@ -512,13 +512,19 @@ void View::calculate_tick_spacing()
                const int order = (int)floorf(log10f(min_period));
                const double order_decimal = pow(10.0, order);
 
+               // Allow for a margin of error so that a scale unit of 1 can be used.
+               // Otherwise, for a SU of 1 the tick period will almost always be below
+               // the min_period by a small amount - and thus skipped in favor of 2.
+               // Note: margin assumes that SU[0] and SU[1] contain the smallest values
+               double tp_margin = (ScaleUnits[0] + ScaleUnits[1]) / 2.0;
+               double tp_with_margin;
                unsigned int unit = 0;
 
                do {
-                       tick_period_ = order_decimal * ScaleUnits[unit++];
-               } while (tick_period_ < min_period &&
-                       unit < countof(ScaleUnits));
+                       tp_with_margin = order_decimal * (ScaleUnits[unit++] + tp_margin);
+               } while (tp_with_margin < min_period && unit < countof(ScaleUnits));
 
+               tick_period_ = order_decimal * ScaleUnits[unit - 1];
                tick_prefix_ = (order - pv::util::FirstSIPrefixPower) / 3;
 
                // Precision is the number of fractional digits required, not