diff --git a/.vscode/launch.json b/.vscode/launch.json index 9f29407..5ccd544 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/builddir/ptprnt", - "args": ["--verbose"], + "args": ["-t Hello"], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], diff --git a/src/PtouchPrint.cpp b/src/PtouchPrint.cpp index feecc42..a9a43bc 100644 --- a/src/PtouchPrint.cpp +++ b/src/PtouchPrint.cpp @@ -23,33 +23,42 @@ #include #include +#include + +#include "CLI/Option.hpp" #include "P700Printer.hpp" #include "graphics/Bitmap.hpp" #include "libusbwrap/UsbDeviceFactory.hpp" +namespace ptprnt { + PtouchPrint::PtouchPrint(const char* versionString) : mVersionString{versionString} {} int PtouchPrint::init(int argc, char** argv) { setupCliParser(); - if (mVerboseFlag) { - setupLogger(spdlog::level::debug); - } else { - setupLogger(spdlog::level::critical); - } try { mApp.parse(argc, argv); } catch (const CLI::ParseError& e) { - return mApp.exit(e); + mApp.exit(e); + return -1; } - mUsbDeviceFactory.init(); + if (mVerboseFlag) { + setupLogger(spdlog::level::trace); + } else { + setupLogger(spdlog::level::critical); + } + + if (!mUsbDeviceFactory.init()) { + spdlog::error("Could not initialize libusb"); + return -1; + } mCompatiblePrinters = {std::make_shared()}; return 0; } int PtouchPrint::run() { - auto numFoundPrinters = getCompatiblePrinters(); if (numFoundPrinters == 0) { spdlog::error( @@ -71,9 +80,13 @@ int PtouchPrint::run() { auto status = printer->getPrinterStatus(); spdlog::info("Detected tape width is {}mm", status.tapeWidthMm); auto bm = ptprnt::graphics::Bitmap(512, 128); - printer->printBitmap(bm); + //printer->printBitmap(bm); //printer->printText("wurst", 1); + for (auto& cmd : mCommands) { + std::cout << cmd.second << std::endl; + } + return 0; } @@ -105,5 +118,39 @@ void PtouchPrint::setupLogger(spdlog::level::level_enum lvl) { } void PtouchPrint::setupCliParser() { - mApp.add_option("-v,--verbose", mVerboseFlag, "Enable verbose output"); -} \ No newline at end of file + auto printVersion = [this](std::size_t) { + std::cout << "ptprnt version: " << mVersionString << std::endl; + }; + + mApp.add_flag("-v,--verbose", mVerboseFlag, "Enable verbose output"); + mApp.add_flag("-V,--version", printVersion, "Prints the ptprnt's version"); + mApp.add_option("-t,--text", + "Text to print (can be used multple times, use formatting options before to " + "influence text layout)") + ->group("Printing") + ->multi_option_policy(CLI::MultiOptionPolicy::TakeAll) + ->trigger_on_parse() + ->each([this](std::string text) { mCommands.emplace_back(CliCmdType::Text, text); }); + mApp.add_option("-f,--font", "Font used for the following text occurences") + ->group("Printing") + ->multi_option_policy(CLI::MultiOptionPolicy::TakeAll) + ->trigger_on_parse() + ->each([this](std::string font) { mCommands.emplace_back(CliCmdType::Font, font); }); + mApp.add_option("-s,--fontsize", "Font size of the following text occurences") + ->group("Printing") + ->multi_option_policy(CLI::MultiOptionPolicy::TakeAll) + ->trigger_on_parse() + ->each([this](std::string size) { mCommands.emplace_back(CliCmdType::FontSize, size); }); + mApp.add_option("--valign", "Vertical alignment of the following text occurences") + ->group("Printing") + ->multi_option_policy(CLI::MultiOptionPolicy::TakeAll) + ->trigger_on_parse() + ->each([this](std::string valign) { mCommands.emplace_back(CliCmdType::VAlign, valign); }); + mApp.add_option("--halign", "Vertical alignment of the following text occurences") + ->group("Printing") + ->multi_option_policy(CLI::MultiOptionPolicy::TakeAll) + ->trigger_on_parse() + ->each([this](std::string halign) { mCommands.emplace_back(CliCmdType::HAlign, halign); }); +} + +} // namespace ptprnt \ No newline at end of file diff --git a/src/PtouchPrint.hpp b/src/PtouchPrint.hpp index 9643c84..303d78c 100644 --- a/src/PtouchPrint.hpp +++ b/src/PtouchPrint.hpp @@ -27,11 +27,21 @@ #include "interface/IPrinterDriver.hpp" #include "libusbwrap/UsbDeviceFactory.hpp" +namespace ptprnt { +enum class CliCmdType { None = 0, Text = 1, FontSize = 2, Font = 3, VAlign = 4, HAlign = 5 }; +using CliCmd = std::pair; + class PtouchPrint { public: PtouchPrint(const char* versionString); ~PtouchPrint() = default; + // This is basically a singelton application class, no need to copy or move + PtouchPrint(const PtouchPrint&) = delete; + PtouchPrint& operator=(const PtouchPrint&) = delete; + PtouchPrint(PtouchPrint&&) = delete; + PtouchPrint& operator=(PtouchPrint&&) = delete; + int init(int argc, char** argv); int run(); @@ -43,11 +53,13 @@ class PtouchPrint { // member variables CLI::App mApp{ptprnt::APP_DESC}; - libusbwrap::UsbDeviceFactory mUsbDeviceFactory; - std::vector> mCompatiblePrinters; - std::vector> mDetectedPrinters; + libusbwrap::UsbDeviceFactory mUsbDeviceFactory{}; + std::vector> mCompatiblePrinters{}; + std::vector> mDetectedPrinters{}; + std::vector mCommands{}; std::string mVersionString = ""; // CLI flags bool mVerboseFlag = false; -}; \ No newline at end of file +}; +} // namespace ptprnt \ No newline at end of file diff --git a/src/libusbwrap/UsbDeviceFactory.cpp b/src/libusbwrap/UsbDeviceFactory.cpp index dfc8c8a..7ad09e9 100644 --- a/src/libusbwrap/UsbDeviceFactory.cpp +++ b/src/libusbwrap/UsbDeviceFactory.cpp @@ -29,11 +29,11 @@ #include "libusbwrap/interface/IUsbDevice.hpp" namespace libusbwrap { -UsbDeviceFactory::UsbDeviceFactory() {} UsbDeviceFactory::~UsbDeviceFactory() { - // ToDo: SEGV here - libusb_free_device_list(mLibusbDeviceList, 0); + if (mDeviceListInitialized) { + libusb_free_device_list(mLibusbDeviceList, 1); + } } std::vector> UsbDeviceFactory::findAllDevices() { @@ -53,7 +53,7 @@ int UsbDeviceFactory::refreshDeviceList() { } else if (ret == 0) { spdlog::warn("No USB devices found"); } - + mDeviceListInitialized = true; return ret; } diff --git a/src/libusbwrap/UsbDeviceFactory.hpp b/src/libusbwrap/UsbDeviceFactory.hpp index db4c3fa..e2f4d70 100644 --- a/src/libusbwrap/UsbDeviceFactory.hpp +++ b/src/libusbwrap/UsbDeviceFactory.hpp @@ -24,12 +24,14 @@ namespace libusbwrap { class UsbDeviceFactory : public IUsbDeviceFactory { public: - UsbDeviceFactory(); - ~UsbDeviceFactory(); + UsbDeviceFactory() = default; + virtual ~UsbDeviceFactory(); // delete copy ctor and assignment - UsbDeviceFactory(const UsbDeviceFactory&) = delete; - UsbDeviceFactory& operator=(UsbDeviceFactory&) = delete; + UsbDeviceFactory(const UsbDeviceFactory&) = delete; + UsbDeviceFactory& operator=(UsbDeviceFactory&) = delete; + UsbDeviceFactory(UsbDeviceFactory&&) = delete; + UsbDeviceFactory& operator=(UsbDeviceFactory&&) = delete; bool init(); /** @@ -56,6 +58,7 @@ class UsbDeviceFactory : public IUsbDeviceFactory { uint16_t pid); // members libusb_context* mLibusbCtx{nullptr}; - libusb_device** mLibusbDeviceList; + libusb_device** mLibusbDeviceList{}; + bool mDeviceListInitialized = false; }; } // namespace libusbwrap \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e57eb15..ddc6b74 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,7 +23,7 @@ #include "PtouchPrint.hpp" int main(int argc, char** argv) { - PtouchPrint ptouchprnt(PROJ_VERSION); + ptprnt::PtouchPrint ptouchprnt(PROJ_VERSION); int ret = ptouchprnt.init(argc, argv); if (ret != 0) { return ret;