#include "printerclient.h" #include #include #include #include #include #include #include #include #include "macro.h" QString getFirstTtyUSB() { auto ports = QSerialPortInfo::availablePorts(); std::remove_if(ports.begin(), ports.end(), [](const auto& port) { return !port.portName().contains("ttyUSB"); }); return ports.isEmpty() ? "" : ports.first().portName(); } PrinterClient::PrinterClient(QObject* parent) : QObject{parent} // , m_serialPort{new QSerialPort{"/dev/ttyUSB0", this}} , m_serialPort{new QSerialPort{getFirstTtyUSB(), this}} { if (!m_serialPort->setBaudRate(QSerialPort::Baud115200)) { throw std::runtime_error( "serial port: cannot set baud rate: " + m_serialPort->errorString().toStdString()); return; } if (!m_serialPort->open(QFile::ReadWrite)) { throw std::runtime_error( "cannot open serial port: " + m_serialPort->errorString().toStdString()); return; } qDebug() << "serial port baud rate:" << m_serialPort->baudRate(); qDebug() << "serial port data bits:" << m_serialPort->dataBits(); qDebug() << "serial port parity:" << m_serialPort->parity(); qDebug() << "serial port stop bits:" << m_serialPort->stopBits(); QObject::connect(m_serialPort, &QSerialPort::readyRead, this, &PrinterClient::onReadyRead); QObject::connect(m_serialPort, &QSerialPort::errorOccurred, this, &PrinterClient::onErrorOccured); // m_serialPort->write(QByteArray { "G91\n" }); // m_serialPort->flush(); // m_serialPort->write(QByteArray { "G1 Z10\n" }); // m_serialPort->flush(); sendCommand("G91"); // sendCommand("G1 Z10"); // sendCommand("G1 Z-10"); onErrorOccured(QSerialPort::SerialPortError::PermissionError); } void PrinterClient::sendCommand(const QString command) { const auto written = m_serialPort->write(command.toUtf8() + "\n"); qDebug() << QString("serialPort: send '%1': (written %2 bytes)") .arg(command).arg(written); m_serialPort->flush(); } void PrinterClient::onReadyRead() { const auto data = m_serialPort->readAll(); qDebug() << "serialPort: " << data; // emit newData(data); } void PrinterClient::onErrorOccured(QSerialPort::SerialPortError error) { qWarning() << "serial port error:" << m_serialPort->errorString() << "-" << error; } Esp32Stand::Esp32Stand(const QHostAddress &address, const uint32_t port, const uint32_t stepsPerMm) : m_apiRoot{QStringLiteral("http://") + address.toString() + ':' + QString::number(port)} , INIT_FIELD(stepsPerMm) , m_manager{new QNetworkAccessManager{this}} {} bool Esp32Stand::moveMm(const double mm) { return moveSteps(mm * m_stepsPerMm); } bool Esp32Stand::moveSteps(const int steps) { qDebug() << __func__ << "move" << steps << "steps"; QElapsedTimer t; t.start(); QUrlQuery query; query.addQueryItem(QStringLiteral("steps"), QString::number(steps)); QUrl url{m_apiRoot + QStringLiteral("/move")}; url.setQuery(query); std::mutex mtx; const auto reply = m_manager->get(QNetworkRequest{url}); mtx.lock(); connect(reply, &QNetworkReply::finished, this, [reply, &mtx]() { qDebug() << reply->readAll(); mtx.unlock(); }); while (!reply->isFinished()) { reply->waitForReadyRead(100); qApp->processEvents(); } // TODO: fix this shit, EPS should reply when finished // QThread::msleep(500); std::lock_guard g{mtx}; qDebug() << __func__ << "moved" << steps << "steps" << t.elapsed(); return true; }