1 Commits

Author SHA1 Message Date
298cbe393b Added Usb Detection using libUsb 2022-11-12 18:29:04 +01:00
8 changed files with 171 additions and 106 deletions

View File

@@ -2,8 +2,7 @@
"clangd.arguments": [ "-log=verbose", "clangd.arguments": [ "-log=verbose",
"-pretty", "-pretty",
"--background-index", "--background-index",
"--compile-commands-dir=${workspaceFolder}/builddir", "--compile-commands-dir=${workspaceFolder}/builddir"
"-std=c++17"
], ],
"files.associations": { "files.associations": {
"cctype": "cpp", "cctype": "cpp",
@@ -82,6 +81,7 @@
"csignal": "cpp", "csignal": "cpp",
"any": "cpp", "any": "cpp",
"regex": "cpp", "regex": "cpp",
"future": "cpp" "future": "cpp",
"charconv": "cpp"
} }
} }

View File

@@ -1,6 +1,7 @@
#include "UsbTypes.hpp" #include "UsbTypes.hpp"
#include <vector> #include <vector>
#include <optional>
#pragma once #pragma once
@@ -8,9 +9,9 @@ namespace ptprnt::driver {
class IUsb { class IUsb {
public: public:
virtual ~IUsb(){}; virtual ~IUsb() = default;
virtual std::vector<UsbDevice> listDevices() = 0; virtual std::optional<std::vector<UsbDevice>> getDevices() = 0;
}; };
} // namespace ptprnt::driver } // namespace ptprnt::driver

View File

@@ -1,6 +1,9 @@
#include "IDriver.hpp" #include "IDriver.hpp"
#include <cstdint> #include <cstdint>
#include <memory>
#include "Usb.hpp"
#pragma once #pragma once
@@ -8,13 +11,19 @@ namespace ptprnt::driver {
class P700Driver : public IDriver { class P700Driver : public IDriver {
public: public:
P700Driver(uint16_t UsbDevVendor = 0x04f9, uint16_t UsbDevId = 0x2061); P700Driver(std::shared_ptr<Usb> usbDriver, uint16_t usbDevVendor = 0x04f9, uint16_t usbDevId = 0x2061);
~P700Driver() override; ~P700Driver() override;
driver::info getInfo() override; driver::info getInfo() override;
bool open() override; bool open() override;
bool close() override; bool close() override;
bool command() override; bool command() override;
private:
std::shared_ptr<Usb> mUsbDriver{0};
UsbDevice mUsbDev{0};
bool init();
}; };
} // namespace ptprnt::driver } // namespace ptprnt::driver

View File

@@ -1,4 +1,5 @@
#include "IUsb.hpp" #include "IUsb.hpp"
#include "UsbTypes.hpp"
#include <libusb-1.0/libusb.h> #include <libusb-1.0/libusb.h>
@@ -11,10 +12,10 @@ class Usb : public IUsb {
Usb(); Usb();
~Usb() override; ~Usb() override;
std::vector<UsbDevice> listDevices() override; std::optional<std::vector<UsbDevice>> getDevices() override;
private: private:
std::vector<UsbDevice> mDevices{};
}; };
} // namespace ptprnt::driver } // namespace ptprnt::driver

View File

@@ -6,6 +6,8 @@
namespace ptprnt::driver { namespace ptprnt::driver {
struct UsbDevice { struct UsbDevice {
uint16_t vendorId{0};
uint16_t productId{0};
libusb_device* dev{nullptr}; libusb_device* dev{nullptr};
libusb_device_handle* hndl{nullptr}; libusb_device_handle* hndl{nullptr};
}; };

View File

@@ -3,12 +3,26 @@
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
#include <spdlog/spdlog.h>
namespace ptprnt::driver { namespace ptprnt::driver {
P700Driver::P700Driver(uint16_t UsbDevVendor, uint16_t UsbDevId) {} P700Driver::P700Driver(std::shared_ptr<Usb> usbDriver, uint16_t usbDevVendor, uint16_t usbProductId)
: mUsbDriver{std::move(usbDriver)}
, mUsbDev{.vendorId = usbDevVendor, .productId = usbProductId}
{
spdlog::debug("P700Driver constructing");
if(!init()) {
spdlog::error("Could not find any P700 Printers.");
}
else {
spdlog::info("Found P700 Printer :-).");
}
}
P700Driver::~P700Driver() { P700Driver::~P700Driver() {
spdlog::debug("P700Driver destructing");
} }
driver::info P700Driver::getInfo() { driver::info P700Driver::getInfo() {
@@ -27,4 +41,26 @@ bool P700Driver::command() {
return false; return false;
} }
bool P700Driver::init() {
auto devs = mUsbDriver->getDevices();
if(!devs.has_value()) {
spdlog::error("No USB devices found");
return false;
}
auto devIt = std::find_if(devs.value().begin(), devs.value().end(),
[=] (auto dev) { return mUsbDev.vendorId == dev.vendorId && mUsbDev.productId == dev.productId;}
);
if(devIt == devs.value().end()) {
spdlog::error("No device with {0:04X}:{1:04X}", mUsbDev.vendorId, mUsbDev.productId);
return false;
}
mUsbDev = *devIt;
return true;
}
} // namespace ptprnt::driver } // namespace ptprnt::driver

View File

@@ -2,36 +2,45 @@
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <optional>
#include <spdlog/spdlog.h>
namespace ptprnt::driver { namespace ptprnt::driver {
Usb::Usb() { Usb::Usb() {
std::cout << "Usb starting" << std::endl; spdlog::debug("Usb constructing");
libusb_init(NULL); libusb_init(NULL);
} }
Usb::~Usb() { Usb::~Usb() {
std::cout << "Usb stopping" << std::endl; spdlog::debug("Usb destructing");
} }
std::vector<UsbDevice> Usb::listDevices() { std::optional<std::vector<UsbDevice>> Usb::getDevices() {
libusb_device ** devs; libusb_device ** devs;
libusb_device *dev; libusb_device *dev;
struct libusb_device_descriptor desc; struct libusb_device_descriptor desc;
int r,i=0; int r,i=0;
mDevices.clear();
libusb_get_device_list(NULL, &devs); libusb_get_device_list(NULL, &devs);
while ((dev=devs[i++]) != NULL) { while ((dev=devs[i++]) != NULL) {
UsbDevice newDev;
if ((r=libusb_get_device_descriptor(dev, &desc)) < 0) { if ((r=libusb_get_device_descriptor(dev, &desc)) < 0) {
std::cerr << "failed to open device" << std::endl; spdlog::error("failed to open device");
libusb_free_device_list(devs, 1); libusb_free_device_list(devs, 1);
return std::nullopt;
} }
std::cout << std::hex << std::setw(4) << desc.idVendor << ":" << desc.idProduct; newDev.vendorId = desc.idVendor;
std::cout << std::endl; newDev.productId = desc.idProduct;
mDevices.push_back(newDev);
} }
return std::vector<UsbDevice>(); return mDevices;
} }
} // namespace ptprnt::driver } // namespace ptprnt::driver

View File

@@ -10,21 +10,28 @@
using namespace ptprnt; using namespace ptprnt;
int main(int argc, char** argv) { void setupLogger() {
spdlog::set_level(spdlog::level::debug);
spdlog::info("Starting ptprnt {}", PROJ_VERSION); spdlog::info("Starting ptprnt {}", PROJ_VERSION);
auto usb = std::make_unique<driver::Usb>(); }
auto devs = usb->listDevices();
for (auto dev : devs) { int main(int argc, char** argv) {
setupLogger();
auto usb = std::make_shared<driver::Usb>();
auto maybeDevs = usb->getDevices();
if(!maybeDevs.has_value()) {
spdlog::error("No USB devices found");
return -1;
} }
/*auto driver = std::make_unique<driver::P700Driver>(); auto driver = std::make_unique<driver::P700Driver>(usb);
auto printer = std::make_unique<printer::P700Printer>(std::move(driver)); //auto printer = std::make_unique<printer::P700Printer>(std::move(driver));
printer::info info = printer->getInfo();*/ //printer::info info = printer->getInfo();
return 0; return 0;
} }