]> sigrok.org Git - pulseview.git/blobdiff - main.cpp
Update to new session API.
[pulseview.git] / main.cpp
index e98506fcc0ea19d2d0dc2572252d3ab85748eca4..23f3f62306c6a492b84d5e853c414f198248bde4 100644 (file)
--- a/main.cpp
+++ b/main.cpp
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
-extern "C" {
-#include <sigrokdecode.h> /* First, so we avoid a _POSIX_C_SOURCE warning. */
-#include <signal.h>
+#ifdef ENABLE_DECODE
+#include <libsigrokdecode/libsigrokdecode.h> /* First, so we avoid a _POSIX_C_SOURCE warning. */
+#endif
+
 #include <stdint.h>
 #include <libsigrok/libsigrok.h>
-}
 
 #include <getopt.h>
 
-#include <QtGui/QApplication>
+#include <QApplication>
 #include <QDebug>
 
+#ifdef ENABLE_SIGNALS
+#include "signalhandler.h"
+#endif
+
+#include "pv/devicemanager.h"
 #include "pv/mainwindow.h"
 
 #include "config.h"
 
-// Global pointer to our QApplication
-QApplication *g_app = NULL;
+#ifdef _WIN32
+// The static qsvg lib is required for SVG graphics/icons (on Windows).
+#include <QtPlugin>
+Q_IMPORT_PLUGIN(qsvg)
+#endif
 
 void usage()
 {
        fprintf(stdout,
                "Usage:\n"
-               "  %s — %s\n"
+               "  %s [OPTION…] [FILE] — %s\n"
                "\n"
                "Help Options:\n"
+               "  -l, --loglevel                  Set libsigrok/libsigrokdecode loglevel\n"
                "  -V, --version                   Show release version\n"
                "  -h, -?, --help                  Show help option\n"
                "\n", PV_BIN_NAME, PV_DESCRIPTION);
 }
 
-/*
- * SIGINT handler (likely received Ctrl-C from terminal)
- */
-void sigint_handler(int param)
-{
-       (void)param;
-
-       qDebug("Received SIGINT.");
-
-       if (g_app)
-               g_app->quit();
-}
-
 int main(int argc, char *argv[])
 {
        int ret = 0;
        struct sr_context *sr_ctx = NULL;
-
-       // Register a SIGINT handler
-       signal(SIGINT, sigint_handler);
+       const char *open_file = NULL;
 
        QApplication a(argc, argv);
-       // Now we have an application to populate our global pointer
-       g_app = &a;
 
        // Set some application metadata
        QApplication::setApplicationVersion(PV_VERSION_STRING);
        QApplication::setApplicationName("PulseView");
-       QApplication::setOrganizationDomain("http://www.sigrok.org");
+       QApplication::setOrganizationDomain("sigrok.org");
 
        // Parse arguments
        while (1) {
                static const struct option long_options[] = {
+                       {"loglevel", required_argument, 0, 'l'},
                        {"version", no_argument, 0, 'V'},
                        {"help", no_argument, 0, 'h'},
                        {0, 0, 0, 0}
                };
 
-               const char c = getopt_long(argc, argv,
-                       "Vh?", long_options, NULL);
+               const int c = getopt_long(argc, argv,
+                       "l:Vh?", long_options, NULL);
                if (c == -1)
                        break;
 
                switch (c) {
+               case 'l':
+               {
+                       const int loglevel = atoi(optarg);
+                       sr_log_loglevel_set(loglevel);
+
+#ifdef ENABLE_DECODE
+                       srd_log_loglevel_set(loglevel);
+#endif
+
+                       break;
+               }
+
                case 'V':
                        // Print version info
                        fprintf(stdout, "%s %s\n", PV_TITLE, PV_VERSION_STRING);
@@ -105,45 +110,70 @@ int main(int argc, char *argv[])
                }
        }
 
+       if (argc - optind > 1) {
+               fprintf(stderr, "Only one file can be openened.\n");
+               return 1;
+       } else if (argc - optind == 1)
+               open_file = argv[argc - 1];
+
        // Initialise libsigrok
        if (sr_init(&sr_ctx) != SR_OK) {
                qDebug() << "ERROR: libsigrok init failed.";
                return 1;
        }
 
-       // Initialise libsigrokdecode
-       if (srd_init(NULL) == SRD_OK) {
+       do {
+
+#ifdef ENABLE_DECODE
+               // Initialise libsigrokdecode
+               if (srd_init(NULL) != SRD_OK) {
+                       qDebug() << "ERROR: libsigrokdecode init failed.";
+                       break;
+               }
 
                // Load the protocol decoders
                srd_decoder_load_all();
+#endif
 
-               // Initialize all libsigrok drivers
-               sr_dev_driver **const drivers = sr_driver_list();
-               for (sr_dev_driver **driver = drivers; *driver; driver++) {
-                       if (sr_driver_init(sr_ctx, *driver) != SR_OK) {
-                               qDebug("Failed to initialize driver %s",
-                                       (*driver)->name);
-                               ret = 1;
-                               break;
-                       }
-               }
+               try {
+                       // Create the device manager, initialise the drivers
+                       pv::DeviceManager device_manager(sr_ctx);
 
-               if (ret == 0) {
                        // Initialise the main window
-                       pv::MainWindow w;
+                       pv::MainWindow w(device_manager, open_file);
                        w.show();
 
+#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.";
+                       }
+#endif
+
                        // Run the application
                        ret = a.exec();
+
+               } catch(std::exception e) {
+                       qDebug() << e.what();
                }
 
-               // Destroy libsigrokdecode and libsigrok
+#ifdef ENABLE_DECODE
+               // Destroy libsigrokdecode
                srd_exit();
+#endif
 
-       } else {
-               qDebug() << "ERROR: libsigrokdecode init failed.";
-       }
+       } while (0);
 
+       // Destroy libsigrok
        if (sr_ctx)
                sr_exit(sr_ctx);