4 Commits

Author SHA1 Message Date
4cac35d25c Update copyright
All checks were successful
Build ptprnt / build (push) Successful in 3m58s
2025-10-13 21:17:45 +02:00
8d85e77a6d Cleanup of strange includes, moving files around
Some checks failed
Build ptprnt / build (push) Has been cancelled
2025-10-13 21:15:10 +02:00
f8a008a105 Reorganize folders, interface for both cli parser and core module
Some checks failed
Build ptprnt / build (push) Failing after 41s
2025-10-13 21:00:16 +02:00
81b0f25f32 Fix multiple lines and printer selection 2025-10-13 20:35:58 +02:00
29 changed files with 308 additions and 170 deletions

View File

@@ -23,18 +23,23 @@
#include <spdlog/sinks/stdout_color_sinks.h> #include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include "PrinterDriverFactory.hpp"
#include "cli/CliParser.hpp" #include "cli/CliParser.hpp"
#include "cli/interface/ICliParser.hpp"
#include "constants.hpp" #include "constants.hpp"
#include "core/PrinterDriverFactory.hpp"
#include "core/PrinterService.hpp" #include "core/PrinterService.hpp"
#include "core/interface/IPrinterService.hpp"
#include "graphics/LabelBuilder.hpp" #include "graphics/LabelBuilder.hpp"
namespace ptprnt { namespace ptprnt {
PtouchPrint::PtouchPrint(const char* versionString) PtouchPrint::PtouchPrint(const char* versionString)
: mVersionString(versionString), : PtouchPrint(versionString, std::make_unique<cli::CliParser>(ptprnt::APP_DESC, versionString),
mCliParser(std::make_unique<cli::CliParser>(ptprnt::APP_DESC, versionString)), std::make_unique<core::PrinterService>()) {}
mPrinterService(std::make_unique<core::PrinterService>()) {}
PtouchPrint::PtouchPrint(const char* versionString, std::unique_ptr<cli::ICliParser> cliParser,
std::unique_ptr<core::IPrinterService> printerService)
: mVersionString(versionString), mCliParser(std::move(cliParser)), mPrinterService(std::move(printerService)) {}
PtouchPrint::~PtouchPrint() = default; PtouchPrint::~PtouchPrint() = default;
@@ -133,7 +138,7 @@ bool PtouchPrint::handlePrinting() {
for (const auto& [cmdType, value] : options.commands) { for (const auto& [cmdType, value] : options.commands) {
switch (cmdType) { switch (cmdType) {
case cli::CommandType::Text: case cli::CommandType::Text:
labelBuilder.addText(value + "\n"); labelBuilder.addText(value);
break; break;
case cli::CommandType::Font: case cli::CommandType::Font:
spdlog::debug("Setting font to {}", value); spdlog::debug("Setting font to {}", value);

View File

@@ -23,11 +23,11 @@
#include <string> #include <string>
namespace ptprnt::cli { namespace ptprnt::cli {
class CliParser; class ICliParser;
} }
namespace ptprnt::core { namespace ptprnt::core {
class PrinterService; class IPrinterService;
} }
namespace ptprnt { namespace ptprnt {
@@ -37,14 +37,27 @@ namespace ptprnt {
* *
* Acts as a thin glue layer coordinating CLI parsing and core printer functionality. * Acts as a thin glue layer coordinating CLI parsing and core printer functionality.
* Separates CLI frontend concerns from the core library. * Separates CLI frontend concerns from the core library.
*
* Uses interfaces (ICliParser, IPrinterService) to enable dependency injection
* and facilitate unit testing with mocks.
*/ */
class PtouchPrint { class PtouchPrint {
public: public:
/** /**
* @brief Construct the application * @brief Construct the application with default implementations
* @param versionString Version string to display * @param versionString Version string to display
*/ */
PtouchPrint(const char* versionString); PtouchPrint(const char* versionString);
/**
* @brief Construct with custom implementations (for testing)
* @param versionString Version string to display
* @param cliParser Custom CLI parser implementation
* @param printerService Custom printer service implementation
*/
PtouchPrint(const char* versionString, std::unique_ptr<cli::ICliParser> cliParser,
std::unique_ptr<core::IPrinterService> printerService);
~PtouchPrint(); // Must be defined in .cpp where complete types are visible ~PtouchPrint(); // Must be defined in .cpp where complete types are visible
// This is basically a singleton application class, no need to copy or move // This is basically a singleton application class, no need to copy or move
@@ -73,8 +86,8 @@ class PtouchPrint {
bool handlePrinting(); bool handlePrinting();
std::string mVersionString; std::string mVersionString;
std::unique_ptr<cli::CliParser> mCliParser; std::unique_ptr<cli::ICliParser> mCliParser;
std::unique_ptr<core::PrinterService> mPrinterService; std::unique_ptr<core::IPrinterService> mPrinterService;
}; };
} // namespace ptprnt } // namespace ptprnt

View File

@@ -23,8 +23,8 @@
namespace ptprnt::cli { namespace ptprnt::cli {
CliParser::CliParser(const std::string& appDescription, std::string versionString) CliParser::CliParser(std::string appDescription, std::string versionString)
: mApp(appDescription), mVersionString(std::move(versionString)) { : mApp(std::move(appDescription)), mVersionString(std::move(versionString)) {
setupParser(); setupParser();
} }
@@ -67,7 +67,8 @@ void CliParser::setupParser() {
// Text printing options // Text printing options
// Note: CLI11 options are processed in order when using ->each() with callbacks // Note: CLI11 options are processed in order when using ->each() with callbacks
mApp.add_option("-t,--text", mApp.add_option(
"-t,--text",
"Text to print (can be used multiple times, use formatting options before to influence text layout)") "Text to print (can be used multiple times, use formatting options before to influence text layout)")
->multi_option_policy(CLI::MultiOptionPolicy::TakeAll) ->multi_option_policy(CLI::MultiOptionPolicy::TakeAll)
->each([this](const std::string& text) { mOptions.commands.emplace_back(CommandType::Text, text); }); ->each([this](const std::string& text) { mOptions.commands.emplace_back(CommandType::Text, text); });

View File

@@ -22,47 +22,28 @@
#include <CLI/CLI.hpp> #include <CLI/CLI.hpp>
#include <string> #include <string>
#include <vector>
#include "interface/ICliParser.hpp"
namespace ptprnt::cli { namespace ptprnt::cli {
/**
* @brief Types of CLI commands that can be issued
*/
enum class CommandType { None = 0, Text = 1, FontSize = 2, Font = 3, VAlign = 4, HAlign = 5 };
/**
* @brief A command with its type and value
*/
using Command = std::pair<CommandType, std::string>;
/**
* @brief Parsed CLI options and commands
*/
struct CliOptions {
bool verbose{false};
bool trace{false};
bool listDrivers{false};
std::string printerSelection{"auto"};
std::vector<Command> commands{};
};
/** /**
* @brief CLI argument parser for ptprnt * @brief CLI argument parser for ptprnt
* *
* Handles all command-line argument parsing using CLI11. * Concrete implementation of ICliParser using CLI11.
* Handles all command-line argument parsing.
* Separates CLI concerns from core library functionality. * Separates CLI concerns from core library functionality.
*/ */
class CliParser { class CliParser : public ICliParser {
public: public:
/** /**
* @brief Construct a CLI parser * @brief Construct a CLI parser
* @param appDescription Application description for help text * @param appDescription Application description for help text
* @param versionString Version string to display * @param versionString Version string to display
*/ */
CliParser(const std::string& appDescription, std::string versionString); CliParser(std::string appDescription, std::string versionString);
~CliParser() = default; ~CliParser() override = default;
CliParser(const CliParser&) = delete; CliParser(const CliParser&) = delete;
CliParser& operator=(const CliParser&) = delete; CliParser& operator=(const CliParser&) = delete;
@@ -75,13 +56,13 @@ class CliParser {
* @param argv Argument values * @param argv Argument values
* @return 0 on success, positive value if should exit immediately (help/version), negative on error * @return 0 on success, positive value if should exit immediately (help/version), negative on error
*/ */
int parse(int argc, char** argv); int parse(int argc, char** argv) override;
/** /**
* @brief Get the parsed options * @brief Get the parsed options
* @return Reference to parsed options * @return Reference to parsed options
*/ */
[[nodiscard]] const CliOptions& getOptions() const { return mOptions; } [[nodiscard]] const CliOptions& getOptions() const override { return mOptions; }
private: private:
void setupParser(); void setupParser();

View File

@@ -0,0 +1,73 @@
/*
ptrnt - print labels on linux
Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <string>
#include <vector>
namespace ptprnt::cli {
/**
* @brief Types of CLI commands that can be issued
*/
enum class CommandType { None = 0, Text = 1, FontSize = 2, Font = 3, VAlign = 4, HAlign = 5 };
/**
* @brief A command with its type and value
*/
using Command = std::pair<CommandType, std::string>;
/**
* @brief Parsed CLI options and commands
*/
struct CliOptions {
bool verbose{false};
bool trace{false};
bool listDrivers{false};
std::string printerSelection{"auto"};
std::vector<Command> commands{};
};
/**
* @brief Interface for CLI argument parsing
*
* This interface allows for mocking CLI parsing in unit tests
* and provides a clear contract for CLI parser implementations.
*/
class ICliParser {
public:
virtual ~ICliParser() = default;
/**
* @brief Parse command line arguments
* @param argc Argument count
* @param argv Argument values
* @return 0 on success, positive value if should exit immediately (help/version), negative on error
*/
virtual int parse(int argc, char** argv) = 0;
/**
* @brief Get the parsed options
* @return Reference to parsed options
*/
[[nodiscard]] virtual const CliOptions& getOptions() const = 0;
};
} // namespace ptprnt::cli

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2024-2025 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2024-2025 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "interface/IPrinterDriver.hpp" #include "printers/interface/IPrinterDriver.hpp"
#include "libusbwrap/LibUsbTypes.hpp" #include "libusbwrap/LibUsbTypes.hpp"
namespace ptprnt { namespace ptprnt {

View File

@@ -21,7 +21,7 @@
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include "PrinterDriverFactory.hpp" #include "core/PrinterDriverFactory.hpp"
namespace ptprnt::core { namespace ptprnt::core {
@@ -54,6 +54,20 @@ std::vector<std::shared_ptr<IPrinterDriver>> PrinterService::detectPrinters() {
} }
std::shared_ptr<IPrinterDriver> PrinterService::selectPrinter(const std::string& printerName) { std::shared_ptr<IPrinterDriver> PrinterService::selectPrinter(const std::string& printerName) {
// If a specific printer is requested by name (not "auto"), try to create it directly
if (printerName != "auto") {
auto driverFactory = std::make_unique<PrinterDriverFactory>();
auto printer = driverFactory->createByName(printerName);
if (printer) {
mCurrentPrinter = printer;
spdlog::info("Using explicitly selected printer: {}", printerName);
return mCurrentPrinter;
}
spdlog::error("Printer driver '{}' not found", printerName);
return nullptr;
}
// Auto mode: detect USB printers
if (mDetectedPrinters.empty()) { if (mDetectedPrinters.empty()) {
detectPrinters(); detectPrinters();
} }
@@ -63,24 +77,10 @@ std::shared_ptr<IPrinterDriver> PrinterService::selectPrinter(const std::string&
return nullptr; return nullptr;
} }
// Auto-select first printer // Auto-select first detected printer
if (printerName == "auto") {
mCurrentPrinter = mDetectedPrinters.front(); mCurrentPrinter = mDetectedPrinters.front();
spdlog::info("Auto-selected printer: {}", mCurrentPrinter->getName()); spdlog::info("Auto-selected printer: {}", mCurrentPrinter->getName());
return mCurrentPrinter; return mCurrentPrinter;
}
// Select printer by name
for (auto& printer : mDetectedPrinters) {
if (printer->getDriverName() == printerName) {
mCurrentPrinter = printer;
spdlog::info("Using explicitly selected printer: {}", printerName);
return mCurrentPrinter;
}
}
spdlog::error("Printer '{}' not found", printerName);
return nullptr;
} }
bool PrinterService::printLabel(std::unique_ptr<graphics::ILabel> label) { bool PrinterService::printLabel(std::unique_ptr<graphics::ILabel> label) {

View File

@@ -23,23 +23,25 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "interface/IPrinterDriver.hpp" #include "interface/IPrinterService.hpp"
#include "libusbwrap/UsbDeviceFactory.hpp" #include "libusbwrap/UsbDeviceFactory.hpp"
#include "printers/interface/IPrinterDriver.hpp"
namespace ptprnt::core { namespace ptprnt::core {
/** /**
* @brief Core service for printer operations * @brief Core service for printer operations
* *
* Concrete implementation of IPrinterService.
* Provides the core library functionality for: * Provides the core library functionality for:
* - Detecting printers * - Detecting printers
* - Selecting printers * - Selecting printers
* - Building and printing labels * - Building and printing labels
*/ */
class PrinterService { class PrinterService : public IPrinterService {
public: public:
PrinterService(); PrinterService();
~PrinterService() = default; ~PrinterService() override = default;
PrinterService(const PrinterService&) = delete; PrinterService(const PrinterService&) = delete;
PrinterService& operator=(const PrinterService&) = delete; PrinterService& operator=(const PrinterService&) = delete;
@@ -50,33 +52,33 @@ class PrinterService {
* @brief Initialize USB device factory * @brief Initialize USB device factory
* @return true on success, false on failure * @return true on success, false on failure
*/ */
bool initialize(); bool initialize() override;
/** /**
* @brief Detect all compatible printers * @brief Detect all compatible printers
* @return Vector of detected printers * @return Vector of detected printers
*/ */
std::vector<std::shared_ptr<IPrinterDriver>> detectPrinters(); std::vector<std::shared_ptr<IPrinterDriver>> detectPrinters() override;
/** /**
* @brief Select a printer by name or auto-detect * @brief Select a printer by name or auto-detect
* @param printerName Printer driver name, or "auto" for first detected * @param printerName Printer driver name, or "auto" for first detected
* @return Printer driver, or nullptr if not found * @return Printer driver, or nullptr if not found
*/ */
std::shared_ptr<IPrinterDriver> selectPrinter(const std::string& printerName); std::shared_ptr<IPrinterDriver> selectPrinter(const std::string& printerName) override;
/** /**
* @brief Get the currently selected printer * @brief Get the currently selected printer
* @return Current printer, or nullptr if none selected * @return Current printer, or nullptr if none selected
*/ */
[[nodiscard]] std::shared_ptr<IPrinterDriver> getCurrentPrinter() const { return mCurrentPrinter; } [[nodiscard]] std::shared_ptr<IPrinterDriver> getCurrentPrinter() const override { return mCurrentPrinter; }
/** /**
* @brief Print a label * @brief Print a label
* @param label The label to print * @param label The label to print
* @return true on success, false on failure * @return true on success, false on failure
*/ */
bool printLabel(std::unique_ptr<graphics::ILabel> label); bool printLabel(std::unique_ptr<graphics::ILabel> label) override;
private: private:
libusbwrap::UsbDeviceFactory mUsbDeviceFactory; libusbwrap::UsbDeviceFactory mUsbDeviceFactory;

View File

@@ -0,0 +1,74 @@
/*
ptrnt - print labels on linux
Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#pragma once
#include <memory>
#include <string>
#include <vector>
#include "graphics/interface/ILabel.hpp"
#include "printers/interface/IPrinterDriver.hpp"
namespace ptprnt::core {
/**
* @brief Interface for core printer service operations
*
* This interface allows for mocking printer operations in unit tests
* and provides a clear contract for printer service implementations.
*/
class IPrinterService {
public:
virtual ~IPrinterService() = default;
/**
* @brief Initialize the printer service
* @return true on success, false on failure
*/
virtual bool initialize() = 0;
/**
* @brief Detect all compatible printers
* @return Vector of detected printers
*/
virtual std::vector<std::shared_ptr<IPrinterDriver>> detectPrinters() = 0;
/**
* @brief Select a printer by name or auto-detect
* @param printerName Printer driver name, or "auto" for first detected
* @return Printer driver, or nullptr if not found
*/
virtual std::shared_ptr<IPrinterDriver> selectPrinter(const std::string& printerName) = 0;
/**
* @brief Get the currently selected printer
* @return Current printer, or nullptr if none selected
*/
[[nodiscard]] virtual std::shared_ptr<IPrinterDriver> getCurrentPrinter() const = 0;
/**
* @brief Print a label
* @param label The label to print
* @return true on success, false on failure
*/
virtual bool printLabel(std::unique_ptr<graphics::ILabel> label) = 0;
};
} // namespace ptprnt::core

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2025 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2025 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2024-2025 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2024 Moritz Martinius Copyright (C) 2023-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2024 Moritz Martinius Copyright (C) 2023-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2024 Moritz Martinius Copyright (C) 2023-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023 Moritz Martinius Copyright (C) 2023-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2024 Moritz Martinius Copyright (C) 2023-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -22,7 +22,6 @@
#include <sys/types.h> #include <sys/types.h>
#include <cstdint> #include <cstdint>
#include <optional>
#include <string> #include <string>
#include <vector> #include <vector>
@@ -44,6 +43,7 @@ enum class Speed {
class IUsbDevice { class IUsbDevice {
public: public:
virtual ~IUsbDevice() = default; virtual ~IUsbDevice() = default;
virtual bool open() = 0; virtual bool open() = 0;
virtual void close() = 0; virtual void close() = 0;

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023 Moritz Martinius Copyright (C) 2023-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2022-2023 Moritz Martinius Copyright (C) 2022-2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@@ -1,34 +1,34 @@
ptprnt_hpps = files ( ptprnt_hpps = files(
'libusbwrap/interface/IUsbDeviceFactory.hpp', 'cli/CliParser.hpp',
'libusbwrap/interface/IUsbDevice.hpp', 'core/PrinterDriverFactory.hpp',
'libusbwrap/UsbDeviceFactory.hpp', 'core/PrinterService.hpp',
'libusbwrap/LibUsbTypes.hpp',
'libusbwrap/UsbDevice.hpp',
'interface/IPrinterDriver.hpp',
'interface/IPrinterTypes.hpp',
'printers/P700Printer.hpp',
'printers/FakePrinter.hpp',
'PtouchPrint.hpp',
'PrinterDriverFactory.hpp',
'graphics/Bitmap.hpp', 'graphics/Bitmap.hpp',
'graphics/Label.hpp', 'graphics/Label.hpp',
'graphics/LabelBuilder.hpp', 'graphics/LabelBuilder.hpp',
'graphics/Monochrome.hpp', 'graphics/Monochrome.hpp',
'cli/CliParser.hpp', 'libusbwrap/LibUsbTypes.hpp',
'core/PrinterService.hpp' 'libusbwrap/UsbDevice.hpp',
'libusbwrap/UsbDeviceFactory.hpp',
'libusbwrap/interface/IUsbDevice.hpp',
'libusbwrap/interface/IUsbDeviceFactory.hpp',
'printers/FakePrinter.hpp',
'printers/P700Printer.hpp',
'printers/interface/IPrinterDriver.hpp',
'printers/interface/IPrinterTypes.hpp',
'PtouchPrint.hpp',
) )
ptprnt_srcs = files ( ptprnt_srcs = files(
'PtouchPrint.cpp', 'cli/CliParser.cpp',
'PrinterDriverFactory.cpp', 'core/PrinterDriverFactory.cpp',
'printers/P700Printer.cpp', 'core/PrinterService.cpp',
'printers/FakePrinter.cpp', 'graphics/Bitmap.cpp',
'graphics/Label.cpp', 'graphics/Label.cpp',
'graphics/LabelBuilder.cpp', 'graphics/LabelBuilder.cpp',
'graphics/Bitmap.cpp',
'graphics/Monochrome.cpp', 'graphics/Monochrome.cpp',
'libusbwrap/UsbDeviceFactory.cpp',
'libusbwrap/UsbDevice.cpp', 'libusbwrap/UsbDevice.cpp',
'cli/CliParser.cpp', 'libusbwrap/UsbDeviceFactory.cpp',
'core/PrinterService.cpp' 'printers/FakePrinter.cpp',
'printers/P700Printer.cpp',
'PtouchPrint.cpp',
) )

View File

@@ -19,27 +19,25 @@
#include "FakePrinter.hpp" #include "FakePrinter.hpp"
#include <spdlog/spdlog.h>
#include <cairo.h> #include <cairo.h>
#include <spdlog/spdlog.h>
#include <cstdint>
#include <stdexcept>
#include <vector>
#include <chrono> #include <chrono>
#include <cstdint>
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>
#include <stdexcept>
#include <vector>
#include "../graphics/Monochrome.hpp" #include "graphics/Monochrome.hpp"
namespace ptprnt::printer { namespace ptprnt::printer {
const PrinterInfo FakePrinter::mInfo = { const PrinterInfo FakePrinter::mInfo = {.driverName = "FakePrinter",
.driverName = "FakePrinter",
.name = "Virtual Test Printer", .name = "Virtual Test Printer",
.version = "v1.0", .version = "v1.0",
.usbId{0x0000, 0x0000}, // No USB ID - virtual printer created explicitly .usbId{0x0000, 0x0000}, // No USB ID - virtual printer created explicitly
.pixelLines = 128 .pixelLines = 128};
};
const std::string_view FakePrinter::getDriverName() { const std::string_view FakePrinter::getDriverName() {
return mInfo.driverName; return mInfo.driverName;
@@ -94,8 +92,8 @@ bool FakePrinter::printMonochromeData(const graphics::MonochromeData& data) {
auto printed = simulatePrinting(data); auto printed = simulatePrinting(data);
mLastPrint = std::make_unique<graphics::Bitmap<graphics::ALPHA8>>(std::move(printed)); mLastPrint = std::make_unique<graphics::Bitmap<graphics::ALPHA8>>(std::move(printed));
spdlog::info("FakePrinter: Successfully 'printed' label ({}x{} pixels)", spdlog::info("FakePrinter: Successfully 'printed' label ({}x{} pixels)", mLastPrint->getWidth(),
mLastPrint->getWidth(), mLastPrint->getHeight()); mLastPrint->getHeight());
// Save to timestamped PNG file // Save to timestamped PNG file
std::string filename = generateTimestampedFilename(); std::string filename = generateTimestampedFilename();
@@ -120,7 +118,8 @@ bool FakePrinter::printLabel(const std::unique_ptr<graphics::ILabel> label) {
// Transform to portrait orientation for printing // Transform to portrait orientation for printing
monoData.transformTo(graphics::Orientation::PORTRAIT); monoData.transformTo(graphics::Orientation::PORTRAIT);
spdlog::debug("FakePrinter: Label surface is {}x{}, transformed to portrait", label->getWidth(), label->getHeight()); spdlog::debug("FakePrinter: Label surface is {}x{}, transformed to portrait", label->getWidth(),
label->getHeight());
return printMonochromeData(monoData); return printMonochromeData(monoData);
} }
@@ -177,8 +176,8 @@ graphics::Bitmap<graphics::ALPHA8> FakePrinter::simulatePrinting(const graphics:
// Set the pixels in the result bitmap // Set the pixels in the result bitmap
result.setPixels(pixels); result.setPixels(pixels);
spdlog::debug("FakePrinter: Simulation complete, reconstructed {}x{} bitmap", spdlog::debug("FakePrinter: Simulation complete, reconstructed {}x{} bitmap", result.getWidth(),
result.getWidth(), result.getHeight()); result.getHeight());
return result; return result;
} }
@@ -218,13 +217,8 @@ bool FakePrinter::saveBitmapToPng(const graphics::Bitmap<graphics::ALPHA8>& bitm
// Create Cairo surface // Create Cairo surface
int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
cairo_surface_t* surface = cairo_image_surface_create_for_data( cairo_surface_t* surface = cairo_image_surface_create_for_data(reinterpret_cast<unsigned char*>(argbPixels.data()),
reinterpret_cast<unsigned char*>(argbPixels.data()), CAIRO_FORMAT_ARGB32, width, height, stride);
CAIRO_FORMAT_ARGB32,
width,
height,
stride
);
if (cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) { if (cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
spdlog::error("FakePrinter: Failed to create Cairo surface: {}", spdlog::error("FakePrinter: Failed to create Cairo surface: {}",
@@ -253,9 +247,7 @@ std::string FakePrinter::generateTimestampedFilename() const {
// Format: fakelabel_YYYYMMDD_HHMMSS.png // Format: fakelabel_YYYYMMDD_HHMMSS.png
std::stringstream ss; std::stringstream ss;
ss << "fakelabel_" ss << "fakelabel_" << std::put_time(std::localtime(&time), "%Y%m%d_%H%M%S") << ".png";
<< std::put_time(std::localtime(&time), "%Y%m%d_%H%M%S")
<< ".png";
return ss.str(); return ss.str();
} }

View File

@@ -19,15 +19,15 @@
#pragma once #pragma once
#include <cstdint>
#include <memory> #include <memory>
#include <vector> #include <vector>
#include <cstdint>
#include "../interface/IPrinterDriver.hpp" #include "graphics/Bitmap.hpp"
#include "../interface/IPrinterTypes.hpp" #include "interface/IPrinterDriver.hpp"
#include "../libusbwrap/LibUsbTypes.hpp" #include "interface/IPrinterTypes.hpp"
#include "../libusbwrap/interface/IUsbDevice.hpp" #include "libusbwrap/LibUsbTypes.hpp"
#include "../graphics/Bitmap.hpp" #include "libusbwrap/interface/IUsbDevice.hpp"
namespace ptprnt::printer { namespace ptprnt::printer {

View File

@@ -28,9 +28,9 @@
#include <thread> #include <thread>
#include <vector> #include <vector>
#include "../graphics/Bitmap.hpp" #include "graphics/Bitmap.hpp"
#include "../graphics/Monochrome.hpp" #include "graphics/Monochrome.hpp"
#include "../libusbwrap/LibUsbTypes.hpp" #include "libusbwrap/LibUsbTypes.hpp"
#include "spdlog/fmt/bin_to_hex.h" #include "spdlog/fmt/bin_to_hex.h"
namespace ptprnt::printer { namespace ptprnt::printer {

View File

@@ -17,6 +17,8 @@
*/ */
#pragma once
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include <sys/types.h> #include <sys/types.h>
@@ -28,8 +30,6 @@
#include "libusbwrap/LibUsbTypes.hpp" #include "libusbwrap/LibUsbTypes.hpp"
#include "libusbwrap/interface/IUsbDevice.hpp" #include "libusbwrap/interface/IUsbDevice.hpp"
#pragma once
namespace ptprnt::printer { namespace ptprnt::printer {
namespace p700::commands { namespace p700::commands {
const cmd_T INITIALIZE{0x1b, 0x40}; // ESC @ - Initialize const cmd_T INITIALIZE{0x1b, 0x40}; // ESC @ - Initialize

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2025 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -22,10 +22,10 @@
#include <memory> #include <memory>
#include <string_view> #include <string_view>
#include "IPrinterTypes.hpp"
#include "graphics/Bitmap.hpp" #include "graphics/Bitmap.hpp"
#include "graphics/Monochrome.hpp" #include "graphics/Monochrome.hpp"
#include "graphics/interface/ILabel.hpp" #include "graphics/interface/ILabel.hpp"
#include "interface/IPrinterTypes.hpp"
#include "libusbwrap/interface/IUsbDevice.hpp" #include "libusbwrap/interface/IUsbDevice.hpp"
namespace ptprnt { namespace ptprnt {

View File

@@ -1,6 +1,6 @@
/* /*
ptrnt - print labels on linux ptrnt - print labels on linux
Copyright (C) 2023-2024 Moritz Martinius Copyright (C) 2025 Moritz Martinius
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@@ -20,7 +20,6 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <string>
#include <string_view> #include <string_view>
#include <vector> #include <vector>

View File

View File

@@ -36,5 +36,3 @@ foreach test : tests
), ),
) )
endforeach endforeach