2
0
forked from Ivasoft/DSView
Files
DSView/DSView/pv/view/decodetrace.h

235 lines
6.2 KiB
C++
Executable File

/*
* This file is part of the PulseView project.
*
* Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
* Copyright (C) 2014 DreamSourceLab <support@dreamsourcelab.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef DSVIEW_PV_VIEW_DECODETRACE_H
#define DSVIEW_PV_VIEW_DECODETRACE_H
#include "trace.h"
#include <list>
#include <map>
#include <QSignalMapper>
#include <QFormLayout>
#include <boost/shared_ptr.hpp>
#include <pv/prop/binding/decoderoptions.h>
#include "../dialogs/dsdialog.h"
struct srd_channel;
struct srd_decoder;
class QComboBox;
namespace pv {
class SigSession;
namespace data {
class DecoderStack;
namespace decode {
class Annotation;
class Decoder;
class Row;
}
}
namespace widgets {
class DecoderGroupBox;
}
namespace view {
class DecodeTrace : public Trace
{
Q_OBJECT
private:
struct ProbeSelector
{
const QComboBox *_combo;
const boost::shared_ptr<pv::data::decode::Decoder> _decoder;
const srd_channel *_pdch;
};
enum DecodeSetRegions{
NONEREG = -1,
CHNLREG,
};
private:
static const QColor DecodeColours[4];
static const QColor ErrorBgColour;
static const QColor NoDecodeColour;
static const int ArrowSize;
static const double EndCapWidth;
static const int DrawPadding;
static const QColor Colours[16];
static const QColor OutlineColours[16];
static const int DefaultFontSize = 10;
static const int ControlRectWidth = 5;
static const int MaxAnnType = 100;
static const QString RegionStart;
static const QString RegionEnd;
public:
DecodeTrace(pv::SigSession &session,
boost::shared_ptr<pv::data::DecoderStack> decoder_stack,
int index);
~DecodeTrace();
bool enabled() const;
const boost::shared_ptr<pv::data::DecoderStack>& decoder() const;
void set_view(pv::view::View *view);
/**
* Paints the background layer of the trace with a QPainter
* @param p the QPainter to paint into.
* @param left the x-coordinate of the left edge of the signal.
* @param right the x-coordinate of the right edge of the signal.
**/
void paint_back(QPainter &p, int left, int right, QColor fore, QColor back);
/**
* Paints the mid-layer of the trace with a QPainter
* @param p the QPainter to paint into.
* @param left the x-coordinate of the left edge of the signal
* @param right the x-coordinate of the right edge of the signal
**/
void paint_mid(QPainter &p, int left, int right, QColor fore, QColor back);
/**
* Paints the foreground layer of the trace with a QPainter
* @param p the QPainter to paint into.
* @param left the x-coordinate of the left edge of the signal
* @param right the x-coordinate of the right edge of the signal
**/
void paint_fore(QPainter &p, int left, int right, QColor fore, QColor back);
bool create_popup();
int rows_size();
QRectF get_rect(DecodeSetRegions type, int y, int right);
/**
* decode region
**/
void frame_ended();
int get_progress() const;
protected:
void paint_type_options(QPainter &p, int right, const QPoint pt, QColor fore);
private:
void create_popup_form();
void populate_popup_form(QWidget *parent, QFormLayout *form);
void draw_annotation(const pv::data::decode::Annotation &a, QPainter &p,
QColor text_colour, int text_height, int left, int right,
double samples_per_pixel, double pixels_offset, int y,
size_t base_colour, double min_annWidth, QColor fore, QColor back) const;
void draw_nodetail(QPainter &p,
int text_height, int left, int right, int y,
size_t base_colour, QColor fore, QColor back) const;
void draw_instant(const pv::data::decode::Annotation &a, QPainter &p,
QColor fill, QColor outline, QColor text_color, int h, double x,
int y, double min_annWidth) const;
void draw_range(const pv::data::decode::Annotation &a, QPainter &p,
QColor fill, QColor outline, QColor text_color, int h, double start,
double end, int y, QColor fore, QColor back) const;
void draw_error(QPainter &p, const QString &message,
int left, int right);
void draw_unshown_row(QPainter &p, int y, int h, int left,
int right, QString info, QColor fore, QColor back);
void create_decoder_form(boost::shared_ptr<data::DecoderStack> &decoder_stack,
boost::shared_ptr<pv::data::decode::Decoder> &dec,
QWidget *parent, QFormLayout *form);
QComboBox* create_probe_selector(QWidget *parent,
const boost::shared_ptr<pv::data::decode::Decoder> &dec,
const srd_channel *const pdch);
void commit_decoder_probes(
boost::shared_ptr<data::decode::Decoder> &dec);
void commit_probes();
signals:
void decoded_progress(int progress);
private slots:
void on_new_decode_data();
void on_delete();
void on_probe_selected(int);
void on_stack_decoder(srd_decoder *decoder);
void on_del_stack(boost::shared_ptr<data::decode::Decoder> &dec);
void on_decode_done();
void on_region_set(int index);
private:
pv::SigSession &_session;
boost::shared_ptr<pv::data::DecoderStack> _decoder_stack;
uint64_t _decode_start, _decode_end;
int _start_index, _end_index;
int _start_count, _end_count;
QComboBox *_start_comboBox, *_end_comboBox;
QFormLayout *_pub_input_layer;
int _progress;
std::list< boost::shared_ptr<pv::prop::binding::DecoderOptions> >
_bindings;
std::list<ProbeSelector> _probe_selectors;
std::vector<pv::widgets::DecoderGroupBox*> _decoder_forms;
std::vector<QString> _cur_row_headings;
QFormLayout *_popup_form;
dialogs::DSDialog *_popup;
};
} // namespace view
} // namespace pv
#endif // DSVIEW_PV_VIEW_DECODETRACE_H