#include <algorithm>
+#include <QApplication>
#include <QFormLayout>
#include <QToolBar>
#include <pv/session.hpp>
#include <pv/devicemanager.hpp>
+#include <pv/devices/device.hpp>
#include <pv/data/logic.hpp>
#include <pv/data/logicsegment.hpp>
#include <pv/view/view.hpp>
using sigrok::Channel;
using sigrok::ConfigKey;
-using sigrok::Device;
using sigrok::Error;
using sigrok::Trigger;
using sigrok::TriggerStage;
namespace view {
const int LogicSignal::SignalHeight = 30;
-const int LogicSignal::SignalMargin = 10;
const float LogicSignal::Oversampling = 2.0f;
LogicSignal::LogicSignal(
pv::Session &session,
- shared_ptr<Device> device,
+ shared_ptr<devices::Device> device,
shared_ptr<Channel> channel,
shared_ptr<data::Logic> data) :
Signal(session, channel),
device_(device),
data_(data),
- trigger_none_(NULL),
- trigger_rising_(NULL),
- trigger_high_(NULL),
- trigger_falling_(NULL),
- trigger_low_(NULL),
- trigger_change_(NULL)
+ trigger_none_(nullptr),
+ trigger_rising_(nullptr),
+ trigger_high_(nullptr),
+ trigger_falling_(nullptr),
+ trigger_low_(nullptr),
+ trigger_change_(nullptr)
{
shared_ptr<Trigger> trigger;
std::pair<int, int> LogicSignal::v_extents() const
{
- return make_pair(-SignalHeight - SignalMargin, SignalMargin);
+ const int signal_margin =
+ QFontMetrics(QApplication::font()).height() / 2;
+ return make_pair(-SignalHeight - signal_margin, signal_margin);
+}
+
+int LogicSignal::scale_handle_offset() const
+{
+ return SignalHeight;
+}
+
+void LogicSignal::scale_handle_dragged(int offset)
+{
+ (void)offset;
}
void LogicSignal::paint_back(QPainter &p, const ViewItemPaintParams &pp)
samplerate = 1.0;
const double pixels_offset = pp.pixels_offset();
- const double start_time = segment->start_time();
+ const pv::util::Timestamp& start_time = segment->start_time();
const int64_t last_sample = segment->get_sample_count() - 1;
const double samples_per_pixel = samplerate * pp.scale();
- const double start = samplerate * (pp.offset() - start_time);
- const double end = start + samples_per_pixel * pp.width();
+ const pv::util::Timestamp start = samplerate * (pp.offset() - start_time);
+ const pv::util::Timestamp end = start + samples_per_pixel * pp.width();
+
+ const int64_t start_sample = min(max(floor(start).convert_to<int64_t>(),
+ (int64_t)0), last_sample);
+ const uint64_t end_sample = min(max(ceil(end).convert_to<int64_t>(),
+ (int64_t)0), last_sample);
- segment->get_subsampled_edges(edges,
- min(max((int64_t)floor(start), (int64_t)0), last_sample),
- min(max((int64_t)ceil(end), (int64_t)0), last_sample),
+ segment->get_subsampled_edges(edges, start_sample, end_sample,
samples_per_pixel / Oversampling, channel_->index());
assert(edges.size() >= 2);
const vector<int32_t> LogicSignal::get_trigger_types() const
{
- const auto keys = device_->config_keys(ConfigKey::DEVICE_OPTIONS);
+ const auto sr_dev = device_->device();
+ const auto keys = sr_dev->config_keys(ConfigKey::DEVICE_OPTIONS);
const auto iter = keys.find(ConfigKey::TRIGGER_MATCH);
if (iter != keys.end() &&
(*iter).second.find(sigrok::LIST) != (*iter).second.end()) {
try {
const Glib::VariantContainerBase gvar =
- device_->config_list(ConfigKey::TRIGGER_MATCH);
+ sr_dev->config_list(ConfigKey::TRIGGER_MATCH);
return Glib::VariantBase::cast_dynamic<
Glib::Variant<vector<int32_t>>>(gvar).get();
} catch (Error e) {
if (trigger) {
for (auto stage : trigger->stages()) {
const auto &matches = stage->matches();
- if (std::none_of(begin(matches), end(matches),
+ if (std::none_of(matches.begin(), matches.end(),
[&](shared_ptr<TriggerMatch> match) {
return match->channel() != channel_; }))
continue;