PulseView  unreleased development snapshot
A Qt-based sigrok GUI
decodermenu.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2013 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
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <cassert>
21 
22 #include <libsigrokdecode/libsigrokdecode.h>
23 
24 #include "decodermenu.hpp"
25 
26 namespace pv {
27 namespace widgets {
28 
29 DecoderMenu::DecoderMenu(QWidget *parent, const char* input, bool first_level_decoder) :
30  QMenu(parent),
31  mapper_(this)
32 {
33  GSList *li = g_slist_sort(g_slist_copy((GSList*)srd_decoder_list()), decoder_name_cmp);
34 
35  for (GSList *l = li; l; l = l->next) {
36  const srd_decoder *const d = (srd_decoder*)l->data;
37  assert(d);
38 
39  const bool have_channels = (d->channels || d->opt_channels) != 0;
40  if (first_level_decoder != have_channels)
41  continue;
42 
43  if (!first_level_decoder) {
44  // Dismiss all non-stacked decoders unless we're looking for first-level decoders
45  if (!d->inputs)
46  continue;
47 
48  // TODO For now we ignore that d->inputs is actually a list
49  if (strncmp((char*)(d->inputs->data), input, 1024) != 0)
50  continue;
51  }
52 
53  QAction *const action = addAction(QString::fromUtf8(d->name));
54  action->setData(QVariant::fromValue(l->data));
55  mapper_.setMapping(action, action);
56  connect(action, SIGNAL(triggered()), &mapper_, SLOT(map()));
57  }
58  g_slist_free(li);
59 
60 #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
61  connect(&mapper_, SIGNAL(mappedObject(QObject*)), this, SLOT(on_action(QObject*)));
62 #else
63  connect(&mapper_, SIGNAL(mapped(QObject*)), this, SLOT(on_action(QObject*)));
64 #endif
65 }
66 
67 int DecoderMenu::decoder_name_cmp(const void *a, const void *b)
68 {
69  return strcmp(((const srd_decoder*)a)->name, ((const srd_decoder*)b)->name);
70 }
71 
73 {
74  assert(action);
75 
76  srd_decoder *const dec = (srd_decoder*)((QAction*)action)->data().value<void*>();
77  assert(dec);
78 
79  decoder_selected(dec);
80 }
81 
82 } // namespace widgets
83 } // namespace pv
static int decoder_name_cmp(const void *a, const void *b)
Definition: decodermenu.cpp:67
DecoderMenu(QWidget *parent, const char *input, bool first_level_decoder=false)
Definition: decodermenu.cpp:29
static std::string data()
Definition: exprtk.hpp:39024
void decoder_selected(srd_decoder *decoder)
it will come up with a session that has the demo device selected That you can get to know the program even when you don t have any hardware to use it you see a list of devices PulseView has recognized If the device you want to use is you can just select it here image::device_selector_dropdown png[] If it s not you ll need to scan for it first Since most serial port and Ethernet devices can t be auto this is usually required for those To do either choose the Connect to Device option from the list or click on the button itself You will see the following you ll need to pick a driver that you want to use In order to do this
Definition: acquisition.txt:14
void on_action(QObject *action)
Definition: decodermenu.cpp:72