#include <QApplication>
#include <QCheckBox>
#include <QComboBox>
+#include <QDebug>
#include <QFormLayout>
#include <QGridLayout>
#include <QLabel>
using std::make_pair;
using std::min;
using std::numeric_limits;
+using std::out_of_range;
using std::pair;
using std::placeholders::_1;
using std::shared_ptr;
connect(analog_data, SIGNAL(min_max_changed(float, float)),
this, SLOT(on_min_max_changed(float, float)));
- GlobalSettings::register_change_handler(GlobalSettings::Key_View_ConversionThresholdDispMode,
- bind(&AnalogSignal::on_settingViewConversionThresholdDispMode_changed, this, _1));
+ GlobalSettings::add_change_handler(this);
GlobalSettings gs;
conversion_threshold_disp_mode_ =
update_scale();
}
+AnalogSignal::~AnalogSignal()
+{
+ GlobalSettings::remove_change_handler(this);
+}
+
shared_ptr<pv::data::SignalData> AnalogSignal::data() const
{
return base_->analog_data();
update_scale();
}
+void AnalogSignal::on_setting_changed(const QString &key, const QVariant &value)
+{
+ if (key == GlobalSettings::Key_View_ConversionThresholdDispMode)
+ on_settingViewConversionThresholdDispMode_changed(value);
+}
+
void AnalogSignal::paint_back(QPainter &p, ViewItemPaintParams &pp)
{
if (!base_->enabled())
// Draw high/neutral/low areas
if (thresholds.size() == 2) {
- const double thr_lo = visual_y - thresholds[0] * scale_;
- const double thr_hi = visual_y - thresholds[1] * scale_;
+ int thr_lo = visual_y - thresholds[0] * scale_;
+ int thr_hi = visual_y - thresholds[1] * scale_;
+ thr_lo = min(max(thr_lo, top), btm);
+ thr_hi = min(max(thr_hi, top), btm);
p.fillRect(QRectF(pp.left(), top, pp.width(), thr_hi - top),
QBrush(ThresholdColorHi));
p.fillRect(QRectF(pp.left(), thr_lo, pp.width(), btm - thr_lo),
QBrush(ThresholdColorLo));
} else {
- const double thr = visual_y - thresholds[0] * scale_;
+ int thr = visual_y - thresholds[0] * scale_;
+ thr = min(max(thr, top), btm);
p.fillRect(QRectF(pp.left(), top, pp.width(), thr - top),
QBrush(ThresholdColorHi));
if ((display_type_ == DisplayAnalog) || (display_type_ == DisplayBoth)) {
paint_grid(p, y, pp.left(), pp.right());
- const deque< shared_ptr<pv::data::AnalogSegment> > &segments =
- base_->analog_data()->analog_segments();
- if (segments.empty())
+ shared_ptr<pv::data::AnalogSegment> segment = get_analog_segment_to_paint();
+ if (!segment)
return;
- const shared_ptr<pv::data::AnalogSegment> &segment =
- segments.front();
-
const double pixels_offset = pp.pixels_offset();
const double samplerate = max(1.0, segment->samplerate());
const pv::util::Timestamp& start_time = segment->start_time();
const float high_offset = y - ph + signal_margin + 0.5f;
const float low_offset = y + nh - signal_margin - 0.5f;
- const deque< shared_ptr<pv::data::LogicSegment> > &segments =
- base_->logic_data()->logic_segments();
-
- if (segments.empty())
+ shared_ptr<pv::data::LogicSegment> segment = get_logic_segment_to_paint();
+ if (!segment)
return;
- const shared_ptr<pv::data::LogicSegment> &segment =
- segments.front();
-
double samplerate = segment->samplerate();
// Show sample rate as 1Hz when it is unknown
p.drawLines(lines, line - lines);
}
+shared_ptr<pv::data::AnalogSegment> AnalogSignal::get_analog_segment_to_paint() const
+{
+ shared_ptr<pv::data::AnalogSegment> segment;
+
+ const deque< shared_ptr<pv::data::AnalogSegment> > &segments =
+ base_->analog_data()->analog_segments();
+
+ if (!segments.empty()) {
+ if (segment_display_mode_ == ShowLastSegmentOnly)
+ segment = segments.back();
+
+ if ((segment_display_mode_ == ShowSingleSegmentOnly) ||
+ (segment_display_mode_ == ShowLastCompleteSegmentOnly)) {
+ try {
+ segment = segments.at(current_segment_);
+ } catch (out_of_range) {
+ qDebug() << "Current analog segment out of range for signal" << base_->name() << ":" << current_segment_;
+ }
+ }
+ }
+
+ return segment;
+}
+
+shared_ptr<pv::data::LogicSegment> AnalogSignal::get_logic_segment_to_paint() const
+{
+ shared_ptr<pv::data::LogicSegment> segment;
+
+ const deque< shared_ptr<pv::data::LogicSegment> > &segments =
+ base_->logic_data()->logic_segments();
+
+ if (!segments.empty()) {
+ if (segment_display_mode_ == ShowLastSegmentOnly)
+ segment = segments.back();
+
+ if ((segment_display_mode_ == ShowSingleSegmentOnly) ||
+ (segment_display_mode_ == ShowLastCompleteSegmentOnly)) {
+ try {
+ segment = segments.at(current_segment_);
+ } catch (out_of_range) {
+ qDebug() << "Current logic segment out of range for signal" << base_->name() << ":" << current_segment_;
+ }
+ }
+ }
+
+ return segment;
+}
+
float AnalogSignal::get_resolution(int scale_index)
{
const float seq[] = {1.0f, 2.0f, 5.0f};