diff --git a/CMakeLists.txt b/CMakeLists.txt index c6a27c8ba..aedda32ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,7 +237,6 @@ endif() add_subdirectory(src-core) add_subdirectory(src-cli) -add_subdirectory(src-cli2) if(BUILD_GUI) message("Building the GUI") diff --git a/plugins/bitview_app/bit_container.cpp b/plugins/bitview_app/bit_container.cpp index fd2013510..b32f59a81 100644 --- a/plugins/bitview_app/bit_container.cpp +++ b/plugins/bitview_app/bit_container.cpp @@ -40,7 +40,7 @@ namespace satdump if (d_file_memory_ptr == MAP_FAILED) { close(fd); - throw satdump_exception("mmap failed!"); + throw satdump_exception("mmap failed! (" + file_path + ")"); } d_frame_mode = frames.size(); diff --git a/plugins/bitview_app/main.cpp b/plugins/bitview_app/main.cpp index b6aef57da..1c0731fd1 100644 --- a/plugins/bitview_app/main.cpp +++ b/plugins/bitview_app/main.cpp @@ -24,7 +24,11 @@ public: satdump::eventBus->register_handler(registerCliCommands); } - static void registerCliCommands(const satdump::cli::RegisterSubcommandEvent &evt) { evt.cmd_handlers.push_back(std::make_shared()); } + static void registerCliCommands(const satdump::cli::RegisterSubcommandEvent &evt) + { + if (evt.is_gui) + evt.cmd_handlers.push_back(std::make_shared()); + } static satdump::widget::MenuItemFileOpen fopen_menu; diff --git a/src-cli/CMakeLists.txt b/src-cli/CMakeLists.txt index ace8a3aef..0963ad400 100644 --- a/src-cli/CMakeLists.txt +++ b/src-cli/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.12) -file(GLOB_RECURSE SatDump_cli_CPPS *.cpp) +file(GLOB_RECURSE SatDump_cli_CPPS *.cpp old/*.cpp) add_executable(satdump ${SatDump_cli_CPPS}) target_include_directories(satdump PUBLIC src-cli src-core) diff --git a/src-cli/main.cpp b/src-cli/main.cpp index dd7c8573a..a5220cb27 100644 --- a/src-cli/main.cpp +++ b/src-cli/main.cpp @@ -1,82 +1,33 @@ +#include "core/cli/cli.h" +#include "core/plugin.h" +#include "init.h" #include "logger.h" - -#include "live.h" -#include "offline.h" -#include "record.h" -#include "autotrack/autotrack.h" - -#include "sdr_probe.h" -#include "help_general.h" - -// TODOREWORK #include "project/project.h" -#include "satdump_vars.h" +#include "old.h" +#include int main(int argc, char *argv[]) { // Init logger initLogger(); - if (argc < 2) - { - logger->error("Please specify either live/record or pipeline name!"); - logger->error("Use -h or help for information"); - return 1; - } + // Basic flags + bool verbose = satdump::cli::checkVerbose(argc, argv); - if (std::string(argv[1]) == "live") - { - int ret = main_live(argc, argv); - if (ret != 0) - return ret; - } - else if (std::string(argv[1]) == "record") - { - int ret = main_record(argc, argv); - if (ret != 0) - return ret; - } - else if (std::string(argv[1]) == "autotrack") - { - int ret = main_autotrack(argc, argv); - if (ret != 0) - return ret; - } - /*else if (std::string(argv[1]) == "project") - { - try - { - int ret = main_project(argc - 2, argv + 2); - if (ret != 0) - return ret; - } - catch (std::exception &e) - { - logger->error("Error running project! %s", e.what()); - } - }TODOREWORK*/ - else if (std::string(argv[1]) == "version" || std::string(argv[1]) == "--v") - { - logger->info("This is SatDump v" + (std::string)satdump::SATDUMP_VERSION); - return 0; - } - ////////////// - else if (std::string(argv[1]) == "sdr_probe") - { - sdr_probe(); - } - ////////////// - ////////////// - else if ((std::string(argv[1]) == "-h") || (std::string(argv[1]) == "help")) - { - help_general(); - } - ////////////// - else - { - int ret = main_offline(argc, argv); - if (ret != 0) - return ret; - } + // Init SatDump, silent or verbose as requested + if (!verbose) + logger->set_level(slog::LOG_WARN); + satdump::initSatdump(); + completeLoggerInit(); + if (!verbose) + logger->set_level(slog::LOG_TRACE); - logger->info("Done! Goodbye"); + satdump::eventBus->register_handler([](const satdump::cli::RegisterSubcommandEvent &evt) + { evt.cmd_handlers.push_back(std::make_shared()); }); + + satdump::cli::CommandHandler h; + int v = h.parse(argc, argv); + if (v != 0) + return v; + h.run(); + return 0; } diff --git a/src-cli/old.cpp b/src-cli/old.cpp new file mode 100644 index 000000000..9a933168a --- /dev/null +++ b/src-cli/old.cpp @@ -0,0 +1,22 @@ +#include "old.h" +#include "logger.h" + +int main_old(int argc, char *argv[]); + +namespace satdump +{ + void OldCmdHandler::reg(CLI::App *app) + { + CLI::App *sub = app->add_subcommand("old", "Run command "); + sub->add_option("args", args, "Old-style arguments [Will be removed sooner or later]"); + } + + void OldCmdHandler::run(CLI::App *app, CLI::App *subcom, bool is_gui) + { + std::vector vec; + for (auto &a : args) + vec.push_back((char *)a.c_str()); + + exit(main_old(vec.size(), vec.data())); + } +} // namespace satdump \ No newline at end of file diff --git a/src-cli/old.h b/src-cli/old.h new file mode 100644 index 000000000..ead72291e --- /dev/null +++ b/src-cli/old.h @@ -0,0 +1,18 @@ +#pragma once + +#include "core/cli/subcommand.h" + +namespace satdump +{ + class OldCmdHandler : public CmdHandler + { + private: + std::vector args; + + public: + OldCmdHandler() : CmdHandler("old") {} + + void reg(CLI::App *app); + void run(CLI::App *app, CLI::App *subcom, bool is_gui); + }; +} // namespace satdump \ No newline at end of file diff --git a/src-cli/autotrack/autotrack.cpp b/src-cli/old/autotrack/autotrack.cpp similarity index 100% rename from src-cli/autotrack/autotrack.cpp rename to src-cli/old/autotrack/autotrack.cpp diff --git a/src-cli/autotrack/autotrack.h b/src-cli/old/autotrack/autotrack.h similarity index 100% rename from src-cli/autotrack/autotrack.h rename to src-cli/old/autotrack/autotrack.h diff --git a/src-cli/autotrack/autotrack_dev.cpp b/src-cli/old/autotrack/autotrack_dev.cpp similarity index 100% rename from src-cli/autotrack/autotrack_dev.cpp rename to src-cli/old/autotrack/autotrack_dev.cpp diff --git a/src-cli/autotrack/autotrack_main.cpp b/src-cli/old/autotrack/autotrack_main.cpp similarity index 100% rename from src-cli/autotrack/autotrack_main.cpp rename to src-cli/old/autotrack/autotrack_main.cpp diff --git a/src-cli/autotrack/autotrack_proc.cpp b/src-cli/old/autotrack/autotrack_proc.cpp similarity index 100% rename from src-cli/autotrack/autotrack_proc.cpp rename to src-cli/old/autotrack/autotrack_proc.cpp diff --git a/src-cli/autotrack/autotrack_vfo.cpp b/src-cli/old/autotrack/autotrack_vfo.cpp similarity index 100% rename from src-cli/autotrack/autotrack_vfo.cpp rename to src-cli/old/autotrack/autotrack_vfo.cpp diff --git a/src-cli/autotrack/autotrack_web.cpp b/src-cli/old/autotrack/autotrack_web.cpp similarity index 100% rename from src-cli/autotrack/autotrack_web.cpp rename to src-cli/old/autotrack/autotrack_web.cpp diff --git a/src-cli/help_general.cpp b/src-cli/old/help_general.cpp similarity index 100% rename from src-cli/help_general.cpp rename to src-cli/old/help_general.cpp diff --git a/src-cli/help_general.h b/src-cli/old/help_general.h similarity index 100% rename from src-cli/help_general.h rename to src-cli/old/help_general.h diff --git a/src-cli/live.cpp b/src-cli/old/live.cpp similarity index 100% rename from src-cli/live.cpp rename to src-cli/old/live.cpp diff --git a/src-cli/live.h b/src-cli/old/live.h similarity index 100% rename from src-cli/live.h rename to src-cli/old/live.h diff --git a/src-cli/old/main.cpp b/src-cli/old/main.cpp new file mode 100644 index 000000000..eb5dc31ea --- /dev/null +++ b/src-cli/old/main.cpp @@ -0,0 +1,82 @@ +#include "logger.h" + +#include "live.h" +#include "offline.h" +#include "record.h" +#include "autotrack/autotrack.h" + +#include "sdr_probe.h" +#include "help_general.h" + +// TODOREWORK #include "project/project.h" +#include "satdump_vars.h" + +int main_old(int argc, char *argv[]) +{ + // Init logger + initLogger(); + + if (argc < 2) + { + logger->error("Please specify either live/record or pipeline name!"); + logger->error("Use -h or help for information"); + return 1; + } + + if (std::string(argv[1]) == "live") + { + int ret = main_live(argc, argv); + if (ret != 0) + return ret; + } + else if (std::string(argv[1]) == "record") + { + int ret = main_record(argc, argv); + if (ret != 0) + return ret; + } + else if (std::string(argv[1]) == "autotrack") + { + int ret = main_autotrack(argc, argv); + if (ret != 0) + return ret; + } + /*else if (std::string(argv[1]) == "project") + { + try + { + int ret = main_project(argc - 2, argv + 2); + if (ret != 0) + return ret; + } + catch (std::exception &e) + { + logger->error("Error running project! %s", e.what()); + } + }TODOREWORK*/ + else if (std::string(argv[1]) == "version" || std::string(argv[1]) == "--v") + { + logger->info("This is SatDump v" + (std::string)satdump::SATDUMP_VERSION); + return 0; + } + ////////////// + else if (std::string(argv[1]) == "sdr_probe") + { + sdr_probe(); + } + ////////////// + ////////////// + else if ((std::string(argv[1]) == "-h") || (std::string(argv[1]) == "help")) + { + help_general(); + } + ////////////// + else + { + int ret = main_offline(argc, argv); + if (ret != 0) + return ret; + } + + logger->info("Done! Goodbye"); +} diff --git a/src-cli/offline.cpp b/src-cli/old/offline.cpp similarity index 100% rename from src-cli/offline.cpp rename to src-cli/old/offline.cpp diff --git a/src-cli/offline.h b/src-cli/old/offline.h similarity index 100% rename from src-cli/offline.h rename to src-cli/old/offline.h diff --git a/src-cli/project/project.cpp.dis b/src-cli/old/project/project.cpp.dis similarity index 100% rename from src-cli/project/project.cpp.dis rename to src-cli/old/project/project.cpp.dis diff --git a/src-cli/project/project.h.dis b/src-cli/old/project/project.h.dis similarity index 100% rename from src-cli/project/project.h.dis rename to src-cli/old/project/project.h.dis diff --git a/src-cli/record.cpp b/src-cli/old/record.cpp similarity index 100% rename from src-cli/record.cpp rename to src-cli/old/record.cpp diff --git a/src-cli/record.h b/src-cli/old/record.h similarity index 100% rename from src-cli/record.h rename to src-cli/old/record.h diff --git a/src-cli/sdr_probe.cpp b/src-cli/old/sdr_probe.cpp similarity index 100% rename from src-cli/sdr_probe.cpp rename to src-cli/old/sdr_probe.cpp diff --git a/src-cli/sdr_probe.h b/src-cli/old/sdr_probe.h similarity index 100% rename from src-cli/sdr_probe.h rename to src-cli/old/sdr_probe.h diff --git a/src-cli/webserver.cpp b/src-cli/old/webserver.cpp similarity index 100% rename from src-cli/webserver.cpp rename to src-cli/old/webserver.cpp diff --git a/src-cli/webserver.h b/src-cli/old/webserver.h similarity index 100% rename from src-cli/webserver.h rename to src-cli/old/webserver.h diff --git a/src-cli2/CMakeLists.txt b/src-cli2/CMakeLists.txt deleted file mode 100644 index 307f8375a..000000000 --- a/src-cli2/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.12) - -file(GLOB_RECURSE SatDump2_cli_CPPS *.cpp) - -add_executable(satdump2 ${SatDump2_cli_CPPS}) -target_include_directories(satdump2 PUBLIC src-cli src-core) - -# Link against the core -target_link_libraries(satdump2 PUBLIC satdump_core) - -install(TARGETS satdump2 DESTINATION ${CMAKE_INSTALL_BINDIR}) \ No newline at end of file diff --git a/src-cli2/main.cpp b/src-cli2/main.cpp deleted file mode 100644 index 0bd2131c2..000000000 --- a/src-cli2/main.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "core/cli/cli.h" -#include "init.h" -#include "logger.h" -#include - -int main(int argc, char *argv[]) -{ - // Init logger - initLogger(); - - // Basic flags - bool verbose = satdump::cli::checkVerbose(argc, argv); - - // Init SatDump, silent or verbose as requested - if (!verbose) - logger->set_level(slog::LOG_WARN); - satdump::initSatdump(); - completeLoggerInit(); - if (!verbose) - logger->set_level(slog::LOG_TRACE); - - return satdump::cli::handleCommand(argc, argv); -} diff --git a/src-core/core/cli/cli.cpp b/src-core/core/cli/cli.cpp index a28c3c136..2245cd5bd 100644 --- a/src-core/core/cli/cli.cpp +++ b/src-core/core/cli/cli.cpp @@ -1,6 +1,7 @@ #include "cli.h" #include "core/plugin.h" #include "libs/CLI11.hpp" +#include "logger.h" #include "module.h" #include "pipeline.h" #include "probe.h" @@ -8,6 +9,7 @@ #include "run_as.h" #include "satdump_vars.h" #include "subcommand.h" +#include #include namespace satdump @@ -23,41 +25,62 @@ namespace satdump return verbose; } - int handleCommand(int argc, char *argv[], bool is_gui) + CommandHandler::CommandHandler(bool is_gui) : is_gui(is_gui), app("SatDump v" + satdump::SATDUMP_VERSION) { // Command basics - CLI::App app("SatDump v" + satdump::SATDUMP_VERSION); app.set_help_all_flag("--help-all", "Expand all help"); bool verbose = false; app.add_flag("-v,--verbose", verbose, "Make the logger more verbose"); app.require_subcommand(); - // All possible subcommands - std::vector> cmd_handlers; + // Register all possible subcommands - cmd_handlers.push_back(std::make_shared()); - cmd_handlers.push_back(std::make_shared()); - cmd_handlers.push_back(std::make_shared()); + // Everything cmd_handlers.push_back(std::make_shared()); - cmd_handlers.push_back(std::make_shared()); - eventBus->fire_event({cmd_handlers}); + if (is_gui) // GUI Only + { + } + else // Non-GUI only + { + cmd_handlers.push_back(std::make_shared()); + cmd_handlers.push_back(std::make_shared()); + cmd_handlers.push_back(std::make_shared()); + cmd_handlers.push_back(std::make_shared()); + } + + eventBus->fire_event({cmd_handlers, is_gui}); for (auto &c : cmd_handlers) c->reg(&app); + } + int CommandHandler::parse(int argc, char *argv[]) + { CLI11_PARSE(app, argc, argv); + return 0; + } + bool CommandHandler::run() + { for (auto *subcom : app.get_subcommands()) { // std::cout << "Subcommand: " << subcom->get_name() << '\n'; - for (auto &c : cmd_handlers) - if (subcom->get_name() == c->cmd) - c->run(&app, subcom, is_gui); + try + { + for (auto &c : cmd_handlers) + if (subcom->get_name() == c->cmd) + c->run(&app, subcom, is_gui); + } + catch (std::exception &e) + { + logger->error("Error running command : %s", e.what()); + return true; + } } - return 0; + return false; } } // namespace cli } // namespace satdump \ No newline at end of file diff --git a/src-core/core/cli/cli.h b/src-core/core/cli/cli.h index c13d8f913..e68e48379 100644 --- a/src-core/core/cli/cli.h +++ b/src-core/core/cli/cli.h @@ -11,10 +11,23 @@ namespace satdump struct RegisterSubcommandEvent { std::vector> &cmd_handlers; + bool is_gui; }; bool checkVerbose(int argc, char *argv[]); - int handleCommand(int argc, char *argv[], bool is_gui = false); + class CommandHandler + { + private: + const bool is_gui; + CLI::App app; + + std::vector> cmd_handlers; + + public: + CommandHandler(bool is_gui = false); + int parse(int argc, char *argv[]); + bool run(); + }; } // namespace cli } // namespace satdump \ No newline at end of file diff --git a/src-ui/main.cpp b/src-ui/main.cpp index a506b5e79..2de7d515a 100644 --- a/src-ui/main.cpp +++ b/src-ui/main.cpp @@ -229,6 +229,15 @@ int main(int argc, char *argv[]) if (!verbose) logger->set_level(slog::LOG_TRACE); + // Parse commands, if present + satdump::cli::CommandHandler cli_handler(true); + if (argc > 1) + { + int v = cli_handler.parse(argc, argv); + if (v != 0) + exit(v); + } + // Init UI satdump::initMainUI(); @@ -237,8 +246,9 @@ int main(int argc, char *argv[]) loading_screen_sink.reset(); glfwSwapInterval(1); // Enable vsync for the rest of the program - // Attempt to parse command - satdump::cli::handleCommand(argc, argv, true); + // Attempt to run command, if present + if (cli_handler.run()) + exit(1); // Set window position int x, y, xs, ys;