#include <cstdint>
#include <fstream>
#include <getopt.h>
+#include <vector>
+
+#ifdef ENABLE_FLOW
+#include <gstreamermm.h>
+#include <libsigrokflow/libsigrokflow.hpp>
+#endif
#include <libsigrokcxx/libsigrokcxx.hpp>
#include <QSettings>
#include <QTextStream>
+#include "config.h"
+
#ifdef ENABLE_SIGNALS
#include "signalhandler.hpp"
#endif
#include "pv/logging.hpp"
#include "pv/mainwindow.hpp"
#include "pv/session.hpp"
+#include "pv/util.hpp"
#ifdef ANDROID
#include <libsigrokandroidutils/libsigrokandroidutils.h>
#include "android/loghandler.hpp"
#endif
-#include "config.h"
-
#ifdef _WIN32
#include <QtPlugin>
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
" -V, --version Show release version\n"
" -l, --loglevel Set libsigrok/libsigrokdecode loglevel\n"
" -d, --driver Specify the device driver to use\n"
- " -D, --no-scan Don't auto-scan for devices, use -d spec only\n"
+ " -D, --dont-scan Don't auto-scan for devices, use -d spec only\n"
" -i, --input-file Load input from file\n"
" -I, --input-format Input format\n"
" -c, --clean Don't restore previous sessions on startup\n"
- " -s, --log-to-stdout Don't use logging, output to stdout instead\n"
"\n", PV_BIN_NAME);
}
{
int ret = 0;
shared_ptr<sigrok::Context> context;
- string open_file, open_file_format, driver;
+ string open_file_format, driver;
+ vector<string> open_files;
bool restore_sessions = true;
bool do_scan = true;
- bool do_logging = true;
+ bool show_version = false;
+
+#ifdef ENABLE_FLOW
+ // Initialise gstreamermm. Must be called before any other GLib stuff.
+ Gst::init();
+
+ // Initialize libsigrokflow. Must be called after Gst::init().
+ Srf::init();
+#endif
Application a(argc, argv);
{"version", no_argument, nullptr, 'V'},
{"loglevel", required_argument, nullptr, 'l'},
{"driver", required_argument, nullptr, 'd'},
- {"no-scan", no_argument, nullptr, 'D'},
+ {"dont-scan", no_argument, nullptr, 'D'},
{"input-file", required_argument, nullptr, 'i'},
{"input-format", required_argument, nullptr, 'I'},
{"clean", no_argument, nullptr, 'c'},
};
const int c = getopt_long(argc, argv,
- "h?VDcsl:d:i:I:", long_options, nullptr);
+ "h?VDcl:d:i:I:", long_options, nullptr);
if (c == -1)
break;
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':
{
break;
case 'i':
- open_file = optarg;
+ open_files.emplace_back(optarg);
break;
case 'I':
case 'c':
restore_sessions = false;
break;
-
- case 's':
- do_logging = false;
- break;
}
}
+ argc -= optind;
+ argv += optind;
- if (argc - optind > 1) {
- fprintf(stderr, "Only one file can be opened.\n");
- return 1;
- }
+ for (int i = 0; i < argc; i++)
+ open_files.emplace_back(argv[i]);
- if (argc - optind == 1)
- open_file = argv[argc - 1];
+ qRegisterMetaType<pv::util::Timestamp>("util::Timestamp");
+ qRegisterMetaType<uint64_t>("uint64_t");
// Prepare the global settings since logging needs them early on
pv::GlobalSettings settings;
+ settings.save_internal_defaults();
settings.set_defaults_where_needed();
+ settings.apply_theme();
- if (do_logging)
- pv::logging.init();
+ pv::logging.init();
// Initialise libsigrok
context = sigrok::Context::create();
// 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_file.empty())
- w.add_session_with_file(open_file, open_file_format);
- else
- w.add_default_session();
+ 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) {