From 76d6c7c06953e225bc52da2604101c2b6610de59 Mon Sep 17 00:00:00 2001 From: Martin Brodbeck Date: Sun, 5 Aug 2018 21:51:30 +0200 Subject: [PATCH] pos printer introduced --- cmake/FindLibUSB.cmake | 98 ++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 1 + src/printer/CMakeLists.txt | 9 ++++ src/printer/posprinter.cpp | 54 +++++++++++++++++++++ src/printer/posprinter.h | 22 +++++++++ 5 files changed, 184 insertions(+) create mode 100644 cmake/FindLibUSB.cmake create mode 100644 src/printer/CMakeLists.txt create mode 100644 src/printer/posprinter.cpp create mode 100644 src/printer/posprinter.h diff --git a/cmake/FindLibUSB.cmake b/cmake/FindLibUSB.cmake new file mode 100644 index 0000000..ec40055 --- /dev/null +++ b/cmake/FindLibUSB.cmake @@ -0,0 +1,98 @@ +# - Try to find libusb-1.0 +# Once done this will define +# +# LIBUSB_1_FOUND - system has libusb +# LIBUSB_1_INCLUDE_DIRS - the libusb include directory +# LIBUSB_1_LIBRARIES - Link these to use libusb +# LIBUSB_1_DEFINITIONS - Compiler switches required for using libusb +# +# Adapted from cmake-modules Google Code project +# +# Copyright (c) 2006 Andreas Schneider +# +# (Changes for libusb) Copyright (c) 2008 Kyle Machulis +# +# Redistribution and use is allowed according to the terms of the New BSD license. +# +# CMake-Modules Project New BSD License +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# * Neither the name of the CMake-Modules Project nor the names of its +# contributors may be used to endorse or promote products derived from this +# software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + + +if (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) + # in cache already + set(LIBUSB_FOUND TRUE) +else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) + find_path(LIBUSB_1_INCLUDE_DIR + NAMES + libusb.h + PATHS + /usr/include + /usr/local/include + /opt/local/include + /sw/include + PATH_SUFFIXES + libusb-1.0 + ) + + find_library(LIBUSB_1_LIBRARY + NAMES + usb-1.0 usb + PATHS + /usr/lib + /usr/local/lib + /opt/local/lib + /sw/lib + ) + + set(LIBUSB_1_INCLUDE_DIRS + ${LIBUSB_1_INCLUDE_DIR} + ) + set(LIBUSB_1_LIBRARIES + ${LIBUSB_1_LIBRARY} +) + + if (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) + set(LIBUSB_1_FOUND TRUE) + endif (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) + + if (LIBUSB_1_FOUND) + if (NOT libusb_1_FIND_QUIETLY) + message(STATUS "Found libusb-1.0:") + message(STATUS " - Includes: ${LIBUSB_1_INCLUDE_DIRS}") + message(STATUS " - Libraries: ${LIBUSB_1_LIBRARIES}") + endif (NOT libusb_1_FIND_QUIETLY) + else (LIBUSB_1_FOUND) + if (libusb_1_FIND_REQUIRED) + message(FATAL_ERROR "Could not find libusb") + endif (libusb_1_FIND_REQUIRED) + endif (LIBUSB_1_FOUND) + + # show the LIBUSB_1_INCLUDE_DIRS and LIBUSB_1_LIBRARIES variables only in the advanced view + mark_as_advanced(LIBUSB_1_INCLUDE_DIRS LIBUSB_1_LIBRARIES) + +endif (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2f3bcac..2189c72 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory("core") +add_subdirectory("printer") add_subdirectory("gui") \ No newline at end of file diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt new file mode 100644 index 0000000..26f56be --- /dev/null +++ b/src/printer/CMakeLists.txt @@ -0,0 +1,9 @@ +find_package(LibUSB REQUIRED) + +set(PRINTER_SOURCES + posprinter.cpp +) + +add_library(printer STATIC ${PRINTER_SOURCES}) +target_link_libraries(printer ${LibUSB_LIBRARY}) +target_include_directories(printer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/printer/posprinter.cpp b/src/printer/posprinter.cpp new file mode 100644 index 0000000..ff50d66 --- /dev/null +++ b/src/printer/posprinter.cpp @@ -0,0 +1,54 @@ +#include "posprinter.h" + +#include +#include +#include + +PosPrinter::PosPrinter() : PosPrinter(std::pair{0x0456, 0x0808}) {} + +PosPrinter::PosPrinter(std::pair vendorModelId) +{ + int retValue; + + retValue = libusb_init(&contextPtr_); + if (retValue < 0) { + throw std::runtime_error("Init error"); + } + + // libusb_set_debug(contextPtr_, 3); // set verbosity level to 3, as suggested in the + // documentation + + devicePtr_ = + libusb_open_device_with_vid_pid(contextPtr_, vendorModelId.first, + vendorModelId.second); // these are vendorID and productID + if (devicePtr_ == NULL) { + throw std::runtime_error("Cannot open printer device"); + } + + // ... +} + +PosPrinter::~PosPrinter() +{ + int retValue; + retValue = libusb_release_interface(devicePtr_, 0); // release the claimed interface + if (retValue != 0) { + std::cout << "Cannot Release Interface" << std::endl; + } else { + std::cout << "Released Interface" << std::endl; + } + + libusb_close(devicePtr_); // close the device we opened + libusb_exit(contextPtr_); // close the session + + delete instance_; +} + +void PosPrinter::initialize(std::pair vendorModelId) +{ + if (!instance_) { + instance_ = new PosPrinter(vendorModelId); + } +} + +PosPrinter* PosPrinter::getInstance() { return instance_; } diff --git a/src/printer/posprinter.h b/src/printer/posprinter.h new file mode 100644 index 0000000..73fd6fe --- /dev/null +++ b/src/printer/posprinter.h @@ -0,0 +1,22 @@ +#ifndef POS_PRINTER_H +#define POS_PRINTER_H + +#include + +#include + +class PosPrinter +{ + public: + static void initialize(std::pair vendorModelIds); + static PosPrinter* getInstance(); + private: + PosPrinter(); + PosPrinter(std::pair vendorModelId); + ~PosPrinter(); + static PosPrinter* instance_; + libusb_context* contextPtr_{}; + libusb_device_handle* devicePtr_{}; +}; + +#endif \ No newline at end of file