diff options
| author | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-22 20:36:27 +0100 |
|---|---|---|
| committer | Nikita Kostovsky <nikita@kostovsky.me> | 2025-11-22 20:36:27 +0100 |
| commit | 9157b253251f357b76fdfd657300d43e702f1674 (patch) | |
| tree | 39b5c6324646479fadb196d276840c9e3b70fa3e | |
| parent | 6aecc111a48ccc316a923e92b4b41424847be297 (diff) | |
introduce elapsed_logger and more garbage
| -rw-r--r-- | src/protocols/httpserver.cpp | 57 | ||||
| -rw-r--r-- | src/protocols/httpserver.h | 7 | ||||
| -rw-r--r-- | src/utils/elapsed_logger.cpp | 1 | ||||
| -rw-r--r-- | src/utils/elapsed_logger.h | 32 |
4 files changed, 61 insertions, 36 deletions
diff --git a/src/protocols/httpserver.cpp b/src/protocols/httpserver.cpp index 96b87db..d11fdb0 100644 --- a/src/protocols/httpserver.cpp +++ b/src/protocols/httpserver.cpp @@ -5,6 +5,7 @@ #include <QJsonDocument> #include <QJsonObject> #include <QJsonValue> +#include <QtConcurrent/QtConcurrentRun> // orpheus #include "camera/veyeimx287m.h" @@ -12,6 +13,7 @@ #include "image.h" #include "imagealgos.h" #include "macro.h" +#include "utils/elapsed_logger.h" // rapidjson #include "rapidjson/document.h" @@ -54,9 +56,15 @@ bool HttpServer::start() m_server->route(apiPrefix + QStringLiteral("/sensor/image"), QHttpServerRequest::Method::Get, [this]() { return GET_image(); }); + // m_server->route(apiPrefix + QStringLiteral("/sensor/image"), + // QHttpServerRequest::Method::Get, + // [this]() { return GET_image_async(); }); m_server->route(apiPrefix + QStringLiteral("/sensor/image2"), QHttpServerRequest::Method::Get, [this]() { return GET_image(); }); + // m_server->route(apiPrefix + QStringLiteral("/sensor/image2"), + // QHttpServerRequest::Method::Get, + // [this]() { return GET_image_async(); }); const auto result = m_server->listen(m_address, m_port); @@ -95,53 +103,30 @@ QHttpServerResponse HttpServer::GET_image() QHttpServerResponse::StatusCode::Ok}; } -QHttpServerResponse HttpServer::GET_pixels() +QFuture<QHttpServerResponse> HttpServer::GET_image_async() { - QElapsedTimer t; - t.start(); - // std::shared_ptr<std::nullptr_t> logTime = std::make_shared<std::nullptr_t>(nullptr, [t]() { - // qDebug() << "HttpServer::GET_pixels: elapsed" << t.nsecsElapsed() / 1000 << "(us)"; - // }); - static constexpr bool logTime{false}; - if constexpr (logTime) { - const std::shared_ptr<std::nullptr_t> - timeLogger{nullptr, [t](auto unused_ptr) { - qDebug() << "HttpServer::GET_pixels: elapsed" << t.nsecsElapsed() / 1000 - << "(us)"; - }}; - } + return QtConcurrent::run(std::bind(&HttpServer::GET_image, this)); +} - // Image img; +QHttpServerResponse HttpServer::GET_pixels() +{ if (!m_camera) { qWarning() << "NO CAM"; return QHttpServerResponse::StatusCode::ServiceUnavailable; } - const auto image = m_camera->getImage(); - + std::shared_ptr<Image> image; { - // const auto sharedCam = m_camera.lock(); - // FIME: don't cast anything, use interface - // auto cam = dynamic_cast<VeyeIMX287m *>(sharedCam.get()); - // auto cam = dynamic_cast<VeyeIMX287m *>(m_camera); - - // if (!cam) { - - // yeaah - // ::img = &img; - // if (!cam->getImage(img)) { - // if (!m_camera->getImage(&img)) { - if (!image) { - qWarning() << "cannot get image"; - return QHttpServerResponse::StatusCode::ServiceUnavailable; - } + const elapsed_logger logger{__func__}; + /*const auto */ image = m_camera->getImage(); + } - // ::pixels = std::move(img.pixels()); - // ++cam->processedCounter; - // FIXME: take into account - // ++m_camera->processedCounter; + if (!image) { + qWarning() << "cannot get image"; + return QHttpServerResponse::StatusCode::ServiceUnavailable; } + // FIXME: inc m_camera->processedCounter // FIXME: not thread-safe, don't use this static shared_ptr at all const auto pixels = image->sharedPixels(); // const auto lines = pixelsToLines(::pixels); diff --git a/src/protocols/httpserver.h b/src/protocols/httpserver.h index bfc1e56..e3ca66f 100644 --- a/src/protocols/httpserver.h +++ b/src/protocols/httpserver.h @@ -1,6 +1,7 @@ #pragma once // qt +#include <QFuture> #include <QHostAddress> #include <QHttpServerResponse> // #include <QObject> @@ -37,6 +38,12 @@ public: // TODO: methods starting with GET_/POST_ will be routed automatically public: QHttpServerResponse GET_image(); + /*! + * \brief GET_image_async + * \warning may crash + * \return + */ + QFuture<QHttpServerResponse> GET_image_async(); QHttpServerResponse GET_pixels(); QHttpServerResponse POST_params(const QHttpServerRequest &request); diff --git a/src/utils/elapsed_logger.cpp b/src/utils/elapsed_logger.cpp new file mode 100644 index 0000000..c38d536 --- /dev/null +++ b/src/utils/elapsed_logger.cpp @@ -0,0 +1 @@ +#include "elapsed_logger.h" diff --git a/src/utils/elapsed_logger.h b/src/utils/elapsed_logger.h new file mode 100644 index 0000000..ea0d9e2 --- /dev/null +++ b/src/utils/elapsed_logger.h @@ -0,0 +1,32 @@ +#pragma once + +#include <chrono> +#include <iomanip> +#include <iostream> +#include <string> + +/*! + * \brief The elapsed_logger class - print `message: <own life time>` on destruction + */ +template<typename T = std::chrono::microseconds, int W = 8> +class elapsed_logger +{ + using clk = std::chrono::high_resolution_clock; + +public: + explicit elapsed_logger(const std::string &&message) + : m_start{clk::now()} + , m_message{std::move(message)} + {} + + ~elapsed_logger() + { + using namespace std::chrono; + const auto duration = duration_cast<T>(clk::now() - m_start); + std::cout << m_message << ": " << std::setw(W) << duration << std::endl; + } + +private: + const std::chrono::time_point<clk> m_start; + const std::string m_message; +}; |
