]> sigrok.org Git - pulseview.git/blobdiff - main.cpp
android: Read firmware resources from assets
[pulseview.git] / main.cpp
index d15cff89ee61ed852be33065e764be35e5253366..daec62d2af09055409677d90885bc9faac5ce4af 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. */
+#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 <libsigrokcxx/libsigrokcxx.hpp>
+
+#include <getopt.h>
 
-#include <QtGui/QApplication>
 #include <QDebug>
-#include "mainwindow.h"
+
+#ifdef ENABLE_SIGNALS
+#include "signalhandler.hpp"
+#endif
+
+#include "pv/application.hpp"
+#include "pv/devicemanager.hpp"
+#include "pv/mainwindow.hpp"
+#ifdef ANDROID
+#include <libsigrokandroidutils/libsigrokandroidutils.h>
+#include "android/assetreader.hpp"
+#include "android/loghandler.hpp"
+#endif
+
+#include "config.h"
+
+#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 [OPTION…] — %s\n"
+               "\n"
+               "Help Options:\n"
+               "  -h, -?, --help                  Show help option\n"
+               "\n"
+               "Application Options:\n"
+               "  -V, --version                   Show release version\n"
+               "  -l, --loglevel                  Set libsigrok/libsigrokdecode loglevel\n"
+               "  -i, --input-file                Load input from file\n"
+               "  -I, --input-format              Input format\n"
+               "\n", PV_BIN_NAME, PV_DESCRIPTION);
+}
 
 int main(int argc, char *argv[])
 {
-       QApplication a(argc, argv);
+       int ret = 0;
+       std::shared_ptr<sigrok::Context> context;
+       std::string open_file, open_file_format;
 
-       /* Set some application metadata. */
-       QApplication::setApplicationVersion(APP_VERSION);
-       QApplication::setApplicationName("PulseView");
-       QApplication::setOrganizationDomain("http://www.sigrok.org");
+       Application a(argc, argv);
 
-       /* Initialise libsigrok */
-       if (sr_init() != SR_OK) {
-               qDebug() << "ERROR: libsigrok init failed.";
-               return 1;
+#ifdef ANDROID
+       srau_init_environment();
+       pv::AndroidLogHandler::install_callbacks();
+       pv::AndroidAssetReader asset_reader;
+#endif
+
+       // Parse arguments
+       while (1) {
+               static const struct option long_options[] = {
+                       {"help", no_argument, 0, 'h'},
+                       {"version", no_argument, 0, 'V'},
+                       {"loglevel", required_argument, 0, 'l'},
+                       {"input-file", required_argument, 0, 'i'},
+                       {"input-format", required_argument, 0, 'I'},
+                       {0, 0, 0, 0}
+               };
+
+               const int c = getopt_long(argc, argv,
+                       "l:Vh?i:I:", long_options, nullptr);
+               if (c == -1)
+                       break;
+
+               switch (c) {
+               case 'h':
+               case '?':
+                       usage();
+                       return 0;
+
+               case 'V':
+                       // Print version info
+                       fprintf(stdout, "%s %s\n", PV_TITLE, PV_VERSION_STRING);
+                       return 0;
+
+               case 'l':
+               {
+                       const int loglevel = atoi(optarg);
+                       context->set_log_level(sigrok::LogLevel::get(loglevel));
+
+#ifdef ENABLE_DECODE
+                       srd_log_loglevel_set(loglevel);
+#endif
+
+                       break;
+               }
+
+               case 'i':
+                       open_file = optarg;
+                       break;
+
+               case 'I':
+                       open_file_format = optarg;
+                       break;
+               }
        }
 
-       /* Initialise libsigrokdecode */
-       if (srd_init(NULL) != SRD_OK) {
-               qDebug() << "ERROR: libsigrokdecode init failed.";
+       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];
        }
 
-       /* Load the protocol decoders */
-       srd_decoder_load_all();
+       // Initialise libsigrok
+       context = sigrok::Context::create();
+#ifdef ANDROID
+       context->set_resource_reader(&asset_reader);
+#endif
+       do {
 
-       /* Initialize all libsigrok drivers. */
-       sr_dev_driver **const drivers = sr_driver_list();
-       for (sr_dev_driver **driver = drivers; *driver; driver++) {
-               if (sr_driver_init(*driver) != SR_OK) {
-                       qDebug("Failed to initialize driver %s",
-                               (*driver)->name);
-                       return 1;
+#ifdef ENABLE_DECODE
+               // Initialise libsigrokdecode
+               if (srd_init(nullptr) != SRD_OK) {
+                       qDebug() << "ERROR: libsigrokdecode init failed.";
+                       break;
                }
-       }
 
-       /* Initialise the main window */
-       MainWindow w;
-       w.show();
+               // Load the protocol decoders
+               srd_decoder_load_all();
+#endif
+
+               try {
+                       // Create the device manager, initialise the drivers
+                       pv::DeviceManager device_manager(context);
+
+                       // Initialise the main window
+                       pv::MainWindow w(device_manager,
+                               open_file, open_file_format);
+                       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();
+               }
 
-       /* Run the application */
-       const int ret = a.exec();
+#ifdef ENABLE_DECODE
+               // Destroy libsigrokdecode
+               srd_exit();
+#endif
 
-       /* Destroy libsigrokdecode and libsigrok */
-       srd_exit();
-       sr_exit();
+       } while (0);
 
        return ret;
 }