summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kostovsky <nikita@kostovsky.me>2025-11-22 20:36:27 +0100
committerNikita Kostovsky <nikita@kostovsky.me>2025-11-22 20:36:27 +0100
commit9157b253251f357b76fdfd657300d43e702f1674 (patch)
tree39b5c6324646479fadb196d276840c9e3b70fa3e
parent6aecc111a48ccc316a923e92b4b41424847be297 (diff)
introduce elapsed_logger and more garbage
-rw-r--r--src/protocols/httpserver.cpp57
-rw-r--r--src/protocols/httpserver.h7
-rw-r--r--src/utils/elapsed_logger.cpp1
-rw-r--r--src/utils/elapsed_logger.h32
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;
+};