]> sigrok.org Git - pulseview.git/blame - pv/views/trace/signal.cpp
Implement MathSignal
[pulseview.git] / pv / views / trace / signal.cpp
CommitLineData
28a4c9c5 1/*
b3f22de0 2 * This file is part of the PulseView project.
28a4c9c5
JH
3 *
4 * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
efdec55a 17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
28a4c9c5
JH
18 */
19
cef18fc6 20#include <extdef.h>
28a4c9c5 21
eb8269e3 22#include <cassert>
d9e71737 23#include <cmath>
b47d951e 24
e3374498 25#include <QApplication>
b213ef09 26#include <QFormLayout>
3c100123 27#include <QKeyEvent>
b9b7854e 28#include <QLineEdit>
b213ef09 29#include <QMenu>
e3374498 30
fe3a1c21 31#include <libsigrokcxx/libsigrokcxx.hpp>
8d3e0764 32
bf0edd2b
SA
33#include "pv/data/signalbase.hpp"
34
2acdb232
JH
35#include "signal.hpp"
36#include "view.hpp"
3e46726a 37
f9abf97e 38using std::shared_ptr;
8d3e0764 39
51e77110 40namespace pv {
f4e57597 41namespace views {
1573bf16 42namespace trace {
51e77110 43
6ac6242b 44const char *const ChannelNames[] = {
9e40e83d
JH
45 "CLK",
46 "DATA",
7d5a9c3e 47 "EN",
9e40e83d
JH
48 "IN",
49 "OUT",
50 "RST",
fae4a2e6
UH
51 "TX",
52 "RX",
7d5a9c3e
SA
53 "SDA",
54 "SCL"
9e40e83d
JH
55 "SCLK",
56 "MOSI",
57 "MISO",
7d5a9c3e
SA
58 "/CS",
59 "nCS",
9e40e83d 60 "/SS",
7d5a9c3e
SA
61 "nSS",
62 "/RST",
63 "nRST",
9e40e83d
JH
64};
65
2b81ae46 66Signal::Signal(pv::Session &session,
4640a84e
SA
67 shared_ptr<data::SignalBase> signal) :
68 Trace(signal),
8dbbc7f0 69 session_(session),
2749b858 70 name_widget_(nullptr)
28a4c9c5 71{
73a25a6e 72 assert(base_);
a45b9b9e
SA
73
74 connect(base_.get(), SIGNAL(enabled_changed(bool)),
75 this, SLOT(on_enabled_changed(bool)));
ef8311a4
JH
76}
77
49f8ff3f
JH
78void Signal::set_name(QString name)
79{
0acf629d 80 base_->set_name(name);
fcb97d77
SA
81
82 if (name != name_widget_->currentText())
83 name_widget_->setEditText(name);
49f8ff3f
JH
84}
85
931f20b0 86bool Signal::enabled() const
2e575351 87{
73a25a6e 88 return base_->enabled();
a29bb7fb
JH
89}
90
73a25a6e 91shared_ptr<data::SignalBase> Signal::base() const
632ba77e 92{
73a25a6e 93 return base_;
632ba77e
JH
94}
95
3a21afa6
SA
96void Signal::save_settings(QSettings &settings) const
97{
0a952555
SA
98 std::map<QString, QVariant> settings_map = save_settings();
99
100 for (auto& entry : settings_map)
101 settings.setValue(entry.first, entry.second);
102}
103
104std::map<QString, QVariant> Signal::save_settings() const
105{
106 return std::map<QString, QVariant>();
3a21afa6
SA
107}
108
109void Signal::restore_settings(QSettings &settings)
0a952555
SA
110{
111 std::map<QString, QVariant> settings_map;
112
113 QStringList keys = settings.allKeys();
114 for (int i = 0; i < keys.size(); i++)
115 settings_map[keys.at(i)] = settings.value(keys.at(i));
116
117 restore_settings(settings_map);
118}
119
120void Signal::restore_settings(std::map<QString, QVariant> settings)
3a21afa6
SA
121{
122 (void)settings;
123}
124
0a952555 125
60938e04 126void Signal::paint_back(QPainter &p, ViewItemPaintParams &pp)
99af6802 127{
73a25a6e 128 if (base_->enabled())
99af6802
SA
129 Trace::paint_back(p, pp);
130}
131
0c0218fd
JH
132void Signal::populate_popup_form(QWidget *parent, QFormLayout *form)
133{
8dbbc7f0
JH
134 name_widget_ = new QComboBox(parent);
135 name_widget_->setEditable(true);
f74015db 136 name_widget_->setCompleter(nullptr);
0c0218fd 137
f3290553 138 for (unsigned int i = 0; i < countof(ChannelNames); i++)
8dbbc7f0 139 name_widget_->insertItem(i, ChannelNames[i]);
3c100123 140
73a25a6e 141 const int index = name_widget_->findText(base_->name(), Qt::MatchExactly);
3c100123
SA
142
143 if (index == -1) {
73a25a6e 144 name_widget_->insertItem(0, base_->name());
8dbbc7f0 145 name_widget_->setCurrentIndex(0);
3c100123 146 } else {
8dbbc7f0 147 name_widget_->setCurrentIndex(index);
3c100123
SA
148 }
149
8dbbc7f0 150 connect(name_widget_, SIGNAL(editTextChanged(const QString&)),
bf0edd2b 151 this, SLOT(on_nameedit_changed(const QString&)));
0c0218fd 152
8dbbc7f0 153 form->addRow(tr("Name"), name_widget_);
91e8bf08 154
641574bc 155 add_color_option(parent, form);
0c0218fd
JH
156}
157
9e773fec 158QMenu* Signal::create_header_context_menu(QWidget *parent)
86e823ca 159{
9e773fec 160 QMenu *const menu = Trace::create_header_context_menu(parent);
86e823ca
JH
161
162 menu->addSeparator();
163
4640a84e
SA
164 QString caption;
165
166 if (base_->is_generated())
167 caption = tr("Remove");
168 else
169 caption = tr("Disable");
170
171 QAction *const a = new QAction(caption, this);
172 a->setShortcuts(QKeySequence::Delete);
173 connect(a, SIGNAL(triggered()), this, SLOT(on_disable()));
174 menu->addAction(a);
86e823ca
JH
175
176 return menu;
177}
178
5ed1adf5
JH
179void Signal::delete_pressed()
180{
181 on_disable();
182}
183
bf0edd2b
SA
184void Signal::on_name_changed(const QString &text)
185{
aecae05c
SA
186 // On startup, this event is fired when a session restores signal
187 // names. However, the name widget hasn't yet been created.
188 if (!name_widget_)
189 return;
190
bf0edd2b
SA
191 if (text != name_widget_->currentText())
192 name_widget_->setEditText(text);
193
194 Trace::on_name_changed(text);
195}
196
86e823ca
JH
197void Signal::on_disable()
198{
4640a84e
SA
199 if (base_->is_generated())
200 session_.remove_generated_signal(base_);
201 else
202 base_->set_enabled(false);
a45b9b9e
SA
203}
204
205void Signal::on_enabled_changed(bool enabled)
206{
207 (void)enabled;
208
209 if (owner_)
210 owner_->extents_changed(true, true);
86e823ca
JH
211}
212
1573bf16 213} // namespace trace
f4e57597 214} // namespace views
51e77110 215} // namespace pv