#include <QSettings>
#include <QTextStream>
+#include "config.h"
+
#ifdef ENABLE_SIGNALS
#include "signalhandler.hpp"
#endif
#include "android/loghandler.hpp"
#endif
-#include "config.h"
-
#ifdef _WIN32
#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
vector<string> open_files;
bool restore_sessions = true;
bool do_scan = true;
+ bool show_version = false;
Application a(argc, argv);
return 0;
case 'V':
- // Print version info
- fprintf(stdout, "%s %s\n", PV_TITLE, PV_VERSION_STRING);
- return 0;
+ show_version = true;
+ break;
case 'l':
{
// Create the device manager, initialise the drivers
pv::DeviceManager device_manager(context, driver, do_scan);
- // Initialise the main window
- pv::MainWindow w(device_manager);
- w.show();
+ a.collect_version_info(context);
+ if (show_version) {
+ a.print_version_info();
+ } else {
+ // Initialise the main window
+ pv::MainWindow w(device_manager);
+ w.show();
- if (restore_sessions)
- w.restore_sessions();
+ if (restore_sessions)
+ w.restore_sessions();
- if (open_files.empty())
- w.add_default_session();
- else
- for (string open_file : open_files)
- w.add_session_with_file(open_file, open_file_format);
+ if (open_files.empty())
+ w.add_default_session();
+ else
+ for (string open_file : open_files)
+ w.add_session_with_file(open_file, open_file_format);
#ifdef ENABLE_SIGNALS
- if (SignalHandler::prepare_signals()) {
- SignalHandler *const handler = new SignalHandler(&w);
- QObject::connect(handler, SIGNAL(int_received()),
- &w, SLOT(close()));
- QObject::connect(handler, SIGNAL(term_received()),
- &w, SLOT(close()));
- } else
- qWarning() << "Could not prepare signal handler.";
+ if (SignalHandler::prepare_signals()) {
+ SignalHandler *const handler = new SignalHandler(&w);
+ QObject::connect(handler, SIGNAL(int_received()),
+ &w, SLOT(close()));
+ QObject::connect(handler, SIGNAL(term_received()),
+ &w, SLOT(close()));
+ } else
+ qWarning() << "Could not prepare signal handler.";
#endif
- // Run the application
- ret = a.exec();
+ // Run the application
+ ret = a.exec();
+ }
#ifndef ENABLE_STACKTRACE
} catch (exception& e) {
#include "application.hpp"
#include "config.h"
+#include <iostream>
#include <typeinfo>
#include <QDebug>
+#include <boost/version.hpp>
+
#ifdef ENABLE_STACKTRACE
#include <boost/stacktrace.hpp>
#endif
+#ifdef ENABLE_DECODE
+#include <libsigrokdecode/libsigrokdecode.h>
+#endif
+
+using std::cout;
+using std::endl;
using std::exception;
+using std::shared_ptr;
+
+#ifdef ENABLE_DECODE
+static gint sort_pds(gconstpointer a, gconstpointer b)
+{
+ const struct srd_decoder *sda, *sdb;
+
+ sda = (const struct srd_decoder *)a;
+ sdb = (const struct srd_decoder *)b;
+ return strcmp(sda->id, sdb->id);
+}
+#endif
Application::Application(int &argc, char* argv[]) :
QApplication(argc, argv)
setOrganizationDomain("sigrok.org");
}
+void Application::collect_version_info(shared_ptr<sigrok::Context> context)
+{
+ // Library versions and features
+ version_info_.emplace_back(applicationName(), applicationVersion());
+ version_info_.emplace_back("Qt", qVersion());
+ version_info_.emplace_back("glibmm", PV_GLIBMM_VERSION);
+ version_info_.emplace_back("Boost", BOOST_LIB_VERSION);
+
+ version_info_.emplace_back("libsigrok", QString("%1/%2 (rt: %3/%4)")
+ .arg(SR_PACKAGE_VERSION_STRING, SR_LIB_VERSION_STRING,
+ sr_package_version_string_get(), sr_lib_version_string_get()));
+
+ GSList *l_orig = sr_buildinfo_libs_get();
+ for (GSList *l = l_orig; l; l = l->next) {
+ GSList *m = (GSList *)l->data;
+ const char *lib = (const char *)m->data;
+ const char *version = (const char *)m->next->data;
+ version_info_.emplace_back(QString(" - %1").arg(QString(lib)), QString(version));
+ g_slist_free_full(m, g_free);
+ }
+ g_slist_free(l_orig);
+
+ char *host = sr_buildinfo_host_get();
+ version_info_.emplace_back(" - Host", QString(host));
+ g_free(host);
+
+ char *scpi_backends = sr_buildinfo_scpi_backends_get();
+ version_info_.emplace_back(" - SCPI backends", QString(scpi_backends));
+ g_free(scpi_backends);
+
+#ifdef ENABLE_DECODE
+ struct srd_decoder *dec;
+
+ version_info_.emplace_back("libsigrokdecode", QString("%1/%2 (rt: %3/%4)")
+ .arg(SRD_PACKAGE_VERSION_STRING, SRD_LIB_VERSION_STRING,
+ srd_package_version_string_get(), srd_lib_version_string_get()));
+
+ l_orig = srd_buildinfo_libs_get();
+ for (GSList *l = l_orig; l; l = l->next) {
+ GSList *m = (GSList *)l->data;
+ const char *lib = (const char *)m->data;
+ const char *version = (const char *)m->next->data;
+ version_info_.emplace_back(QString(" - %1").arg(QString(lib)), QString(version));
+ g_slist_free_full(m, g_free);
+ }
+ g_slist_free(l_orig);
+
+ host = srd_buildinfo_host_get();
+ version_info_.emplace_back(" - Host", QString(host));
+ g_free(host);
+#endif
+
+ // Firmware paths
+ l_orig = sr_resourcepaths_get(SR_RESOURCE_FIRMWARE);
+ for (GSList *l = l_orig; l; l = l->next)
+ fw_path_list_.push_back(QString((char*)l->data));
+ g_slist_free_full(l_orig, g_free);
+
+ // PD paths
+#ifdef ENABLE_DECODE
+ l_orig = srd_searchpaths_get();
+ for (GSList *l = l_orig; l; l = l->next)
+ pd_path_list_.push_back(QString((char*)l->data));
+ g_slist_free_full(l_orig, g_free);
+#endif
+
+ // Device drivers
+ for (auto entry : context->drivers())
+ driver_list_.emplace_back(QString::fromUtf8(entry.first.c_str()),
+ QString::fromUtf8(entry.second->long_name().c_str()));
+
+ // Input formats
+ for (auto entry : context->input_formats())
+ input_format_list_.emplace_back(QString::fromUtf8(entry.first.c_str()),
+ QString::fromUtf8(entry.second->description().c_str()));
+
+ // Output formats
+ for (auto entry : context->output_formats())
+ output_format_list_.emplace_back(QString::fromUtf8(entry.first.c_str()),
+ QString::fromUtf8(entry.second->description().c_str()));
+
+ // Protocol decoders
+#ifdef ENABLE_DECODE
+ GSList *sl = g_slist_copy((GSList *)srd_decoder_list());
+ sl = g_slist_sort(sl, sort_pds);
+ for (const GSList *l = sl; l; l = l->next) {
+ dec = (struct srd_decoder *)l->data;
+ pd_list_.emplace_back(QString::fromUtf8(dec->id),
+ QString::fromUtf8(dec->longname));
+ }
+ g_slist_free(sl);
+#endif
+}
+
+void Application::print_version_info()
+{
+ cout << PV_TITLE << PV_VERSION_STRING << endl;
+
+ cout << endl << "Libraries and features:" << endl;
+ for (pair<QString, QString> &entry : version_info_)
+ cout << " " << entry.first.toStdString() << " " << entry.second.toStdString() << endl;
+
+ cout << endl << "Firmware search paths:" << endl;
+ for (QString &entry : fw_path_list_)
+ cout << " " << entry.toStdString() << endl;
+
+ cout << endl << "Protocol decoder search paths:" << endl;
+ for (QString &entry : pd_path_list_)
+ cout << " " << entry.toStdString() << endl;
+
+ cout << endl << "Supported hardware drivers:" << endl;
+ for (pair<QString, QString> &entry : driver_list_)
+ cout << " " << entry.first.leftJustified(21, ' ').toStdString() <<
+ entry.second.toStdString() << endl;
+
+ cout << endl << "Supported input formats:" << endl;
+ for (pair<QString, QString> &entry : input_format_list_)
+ cout << " " << entry.first.leftJustified(21, ' ').toStdString() <<
+ entry.second.toStdString() << endl;
+
+ cout << endl << "Supported output formats:" << endl;
+ for (pair<QString, QString> &entry : output_format_list_)
+ cout << " " << entry.first.leftJustified(21, ' ').toStdString() <<
+ entry.second.toStdString() << endl;
+
+#ifdef ENABLE_DECODE
+ cout << endl << "Supported protocol decoders:" << endl;
+ for (pair<QString, QString> &entry : pd_list_)
+ cout << " " << entry.first.leftJustified(21, ' ').toStdString() <<
+ entry.second.toStdString() << endl;
+#endif
+
+ cout << endl;
+}
+
+vector< pair<QString, QString> > Application::get_version_info() const
+{
+ return version_info_;
+}
+
+vector<QString> Application::get_fw_path_list() const
+{
+ return fw_path_list_;
+}
+
+vector<QString> Application::get_pd_path_list() const
+{
+ return pd_path_list_;
+}
+
+vector< pair<QString, QString> > Application::get_driver_list() const
+{
+ return driver_list_;
+}
+
+vector< pair<QString, QString> > Application::get_input_format_list() const
+{
+ return input_format_list_;
+}
+
+vector< pair<QString, QString> > Application::get_output_format_list() const
+{
+ return output_format_list_;
+}
+
+vector< pair<QString, QString> > Application::get_pd_list() const
+{
+ return pd_list_;
+}
+
bool Application::notify(QObject *receiver, QEvent *event)
{
try {
#ifndef PULSEVIEW_PV_APPLICATION_HPP
#define PULSEVIEW_PV_APPLICATION_HPP
+#include <vector>
+
#include <QApplication>
+#include <libsigrokcxx/libsigrokcxx.hpp>
+
+using std::shared_ptr;
+using std::pair;
+using std::vector;
+
class Application : public QApplication
{
+ Q_OBJECT
+
public:
Application(int &argc, char* argv[]);
+
+ void collect_version_info(shared_ptr<sigrok::Context> context);
+ void print_version_info();
+
+ vector< pair<QString, QString> > get_version_info() const;
+ vector<QString> get_fw_path_list() const;
+ vector<QString> get_pd_path_list() const;
+ vector< pair<QString, QString> > get_driver_list() const;
+ vector< pair<QString, QString> > get_input_format_list() const;
+ vector< pair<QString, QString> > get_output_format_list() const;
+ vector< pair<QString, QString> > get_pd_list() const;
+
private:
bool notify(QObject *receiver, QEvent *event);
+
+ vector< pair<QString, QString> > version_info_;
+ vector<QString> fw_path_list_;
+ vector<QString> pd_path_list_;
+ vector< pair<QString, QString> > driver_list_;
+ vector< pair<QString, QString> > input_format_list_;
+ vector< pair<QString, QString> > output_format_list_;
+ vector< pair<QString, QString> > pd_list_;
};
#endif // PULSEVIEW_PV_APPLICATION_HPP
#include "config.h"
#include <glib.h>
-#include <boost/version.hpp>
#include <QApplication>
#include <QComboBox>
#include "settings.hpp"
+#include "pv/application.hpp"
#include "pv/devicemanager.hpp"
#include "pv/globalsettings.hpp"
#include "pv/logging.hpp"
#endif
}
-#ifdef ENABLE_DECODE
-static gint sort_pds(gconstpointer a, gconstpointer b)
-{
- const struct srd_decoder *sda, *sdb;
-
- sda = (const struct srd_decoder *)a;
- sdb = (const struct srd_decoder *)b;
- return strcmp(sda->id, sdb->id);
-}
-#endif
-
QWidget *Settings::get_about_page(QWidget *parent) const
{
-#ifdef ENABLE_DECODE
- struct srd_decoder *dec;
-#endif
+ Application* a = qobject_cast<Application*>(QApplication::instance());
QLabel *icon = new QLabel();
icon->setPixmap(QPixmap(QString::fromUtf8(":/icons/pulseview.svg")));
- /* Setup the license field, with the project homepage link. */
+ // Setup the license field with the project homepage link
QLabel *gpl_home_info = new QLabel();
gpl_home_info->setText(tr("%1<br /><a href=\"http://%2\">%2</a>").arg(
tr("GNU GPL, version 3 or later"),
QApplication::organizationDomain()));
gpl_home_info->setOpenExternalLinks(true);
- shared_ptr<sigrok::Context> context = device_manager_.context();
-
QString s;
s.append("<style type=\"text/css\"> tr .id { white-space: pre; padding-right: 5px; } </style>");
s.append("<table>");
- /* Version, library, and feature info */
s.append("<tr><td colspan=\"2\"><b>" +
tr("Versions, libraries and features:") + "</b></td></tr>");
-
- s.append(QString("<tr><td><i>%1</i></td><td>%2</td></tr>")
- .arg(QApplication::applicationName(),
- QApplication::applicationVersion()));
- s.append(QString("<tr><td><i>%1</i></td><td>%2</td></tr>")
- .arg(QString("Qt"), qVersion()));
- s.append(QString("<tr><td><i>%1</i></td><td>%2</td></tr>")
- .arg(QString("glibmm"), PV_GLIBMM_VERSION));
- s.append(QString("<tr><td><i>%1</i></td><td>%2</td></tr>")
- .arg(QString("Boost"), BOOST_LIB_VERSION));
-
- s.append(QString("<tr><td><i>%1</i></td><td>%2/%3 (rt: %4/%5)</td></tr>")
- .arg(QString("libsigrok"), SR_PACKAGE_VERSION_STRING,
- SR_LIB_VERSION_STRING, sr_package_version_string_get(),
- sr_lib_version_string_get()));
-
- GSList *l_orig = sr_buildinfo_libs_get();
- for (GSList *l = l_orig; l; l = l->next) {
- GSList *m = (GSList *)l->data;
- const char *lib = (const char *)m->data;
- const char *version = (const char *)m->next->data;
- s.append(QString("<tr><td><i>- %1</i></td><td>%2</td></tr>")
- .arg(QString(lib), QString(version)));
- g_slist_free_full(m, g_free);
- }
- g_slist_free(l_orig);
-
- char *host = sr_buildinfo_host_get();
- s.append(QString("<tr><td><i>- Host</i></td><td>%1</td></tr>")
- .arg(QString(host)));
- g_free(host);
-
- char *scpi_backends = sr_buildinfo_scpi_backends_get();
- s.append(QString("<tr><td><i>- SCPI backends</i></td><td>%1</td></tr>")
- .arg(QString(scpi_backends)));
- g_free(scpi_backends);
-
-#ifdef ENABLE_DECODE
- s.append(QString("<tr><td><i>%1</i></td><td>%2/%3 (rt: %4/%5)</td></tr>")
- .arg(QString("libsigrokdecode"), SRD_PACKAGE_VERSION_STRING,
- SRD_LIB_VERSION_STRING, srd_package_version_string_get(),
- srd_lib_version_string_get()));
-
- l_orig = srd_buildinfo_libs_get();
- for (GSList *l = l_orig; l; l = l->next) {
- GSList *m = (GSList *)l->data;
- const char *lib = (const char *)m->data;
- const char *version = (const char *)m->next->data;
- s.append(QString("<tr><td><i>- %1</i></td><td>%2</td></tr>")
- .arg(QString(lib), QString(version)));
- g_slist_free_full(m, g_free);
- }
- g_slist_free(l_orig);
-
- host = srd_buildinfo_host_get();
- s.append(QString("<tr><td><i>- Host</i></td><td>%1</td></tr>")
- .arg(QString(host)));
- g_free(host);
-#endif
+ for (pair<QString, QString> &entry : a->get_version_info())
+ s.append(QString("<tr><td><i>%1</i></td><td>%2</td></tr>")
+ .arg(entry.first, entry.second));
s.append("<tr><td colspan=\"2\"></td></tr>");
s.append("<tr><td colspan=\"2\"><b>" +
tr("Firmware search paths:") + "</b></td></tr>");
-
- l_orig = sr_resourcepaths_get(SR_RESOURCE_FIRMWARE);
- for (GSList *l = l_orig; l; l = l->next)
- s.append(QString("<tr><td colspan=\"2\">%1</td></tr>").arg(
- QString((char*)l->data)));
- g_slist_free_full(l_orig, g_free);
+ for (QString &entry : a->get_fw_path_list())
+ s.append(QString("<tr><td colspan=\"2\">%1</td></tr>").arg(entry));
#ifdef ENABLE_DECODE
s.append("<tr><td colspan=\"2\"></td></tr>");
s.append("<tr><td colspan=\"2\"><b>" +
tr("Protocol decoder search paths:") + "</b></td></tr>");
-
- l_orig = srd_searchpaths_get();
- for (GSList *l = l_orig; l; l = l->next)
- s.append(QString("<tr><td colspan=\"2\">%1</td></tr>").arg(
- QString((char*)l->data)));
- g_slist_free_full(l_orig, g_free);
+ for (QString &entry : a->get_pd_path_list())
+ s.append(QString("<tr><td colspan=\"2\">%1</td></tr>").arg(entry));
#endif
- /* Set up the supported field */
s.append("<tr><td colspan=\"2\"></td></tr>");
s.append("<tr><td colspan=\"2\"><b>" +
tr("Supported hardware drivers:") + "</b></td></tr>");
- for (auto entry : context->drivers()) {
+ for (pair<QString, QString> &entry : a->get_driver_list())
s.append(QString("<tr><td class=\"id\"><i>%1</i></td><td>%2</td></tr>")
- .arg(QString::fromUtf8(entry.first.c_str()),
- QString::fromUtf8(entry.second->long_name().c_str())));
- }
+ .arg(entry.first, entry.second));
s.append("<tr><td colspan=\"2\"></td></tr>");
s.append("<tr><td colspan=\"2\"><b>" +
tr("Supported input formats:") + "</b></td></tr>");
- for (auto entry : context->input_formats()) {
+ for (pair<QString, QString> &entry : a->get_input_format_list())
s.append(QString("<tr><td class=\"id\"><i>%1</i></td><td>%2</td></tr>")
- .arg(QString::fromUtf8(entry.first.c_str()),
- QString::fromUtf8(entry.second->description().c_str())));
- }
+ .arg(entry.first, entry.second));
s.append("<tr><td colspan=\"2\"></td></tr>");
s.append("<tr><td colspan=\"2\"><b>" +
tr("Supported output formats:") + "</b></td></tr>");
- for (auto entry : context->output_formats()) {
+ for (pair<QString, QString> &entry : a->get_output_format_list())
s.append(QString("<tr><td class=\"id\"><i>%1</i></td><td>%2</td></tr>")
- .arg(QString::fromUtf8(entry.first.c_str()),
- QString::fromUtf8(entry.second->description().c_str())));
- }
+ .arg(entry.first, entry.second));
#ifdef ENABLE_DECODE
s.append("<tr><td colspan=\"2\"></td></tr>");
s.append("<tr><td colspan=\"2\"><b>" +
tr("Supported protocol decoders:") + "</b></td></tr>");
- GSList *sl = g_slist_copy((GSList *)srd_decoder_list());
- sl = g_slist_sort(sl, sort_pds);
- for (const GSList *l = sl; l; l = l->next) {
- dec = (struct srd_decoder *)l->data;
+ for (pair<QString, QString> &entry : a->get_pd_list())
s.append(QString("<tr><td class=\"id\"><i>%1</i></td><td>%2</td></tr>")
- .arg(QString::fromUtf8(dec->id),
- QString::fromUtf8(dec->longname)));
- }
- g_slist_free(sl);
+ .arg(entry.first, entry.second));
#endif
s.append("</table>");