diff options
Diffstat (limited to 'src/protocols')
| -rw-r--r-- | src/protocols/httpserver.cpp | 39 | ||||
| -rw-r--r-- | src/protocols/httpserver.h | 4 | ||||
| -rw-r--r-- | src/protocols/iprotocol.cpp | 2 | ||||
| -rw-r--r-- | src/protocols/iprotocol.h | 6 |
4 files changed, 40 insertions, 11 deletions
diff --git a/src/protocols/httpserver.cpp b/src/protocols/httpserver.cpp index 8819490..164ce54 100644 --- a/src/protocols/httpserver.cpp +++ b/src/protocols/httpserver.cpp @@ -22,8 +22,7 @@ extern uint8_t pgm_image[64 + img_width * img_height * sizeof(uint8_t)]; extern size_t pgm_image_size; extern std::mutex pgm_image_mtx; -HttpServer::HttpServer(ICamera *camera, - // QObject *parent, +HttpServer::HttpServer(std::shared_ptr<ICamera> camera, const QHostAddress &address, const uint16_t port) : IProtocol{camera} @@ -44,10 +43,34 @@ HttpServer::HttpServer(ICamera *camera, [this](const QHttpServerRequest &request) { return POST_params(request); }); + m_server->route(apiPrefix + QStringLiteral("/sensor/image"), + QHttpServerRequest::Method::Get, + [this]() { return GET_image(); }); + m_server->route(apiPrefix + QStringLiteral("/sensor/image2"), + QHttpServerRequest::Method::Get, + [this]() { return GET_image(); }); qDebug().noquote() << Q_FUNC_INFO << ": listen: " << m_server->listen(m_address, m_port); } +QHttpServerResponse HttpServer::GET_image() +{ + static Image img; + + if (!m_camera->getImage(&img)) { + qCritical() << "cannot get image"; + return QHttpServerResponse::StatusCode::ServiceUnavailable; + } + + pgm_save(&img); + std::lock_guard<std::mutex> lg(pgm_image_mtx); + + return QHttpServerResponse{QByteArray{(const char *) (pgm_image), + static_cast<qsizetype>( + pgm_image_size)}, + QHttpServerResponse::StatusCode::Ok}; +} + QHttpServerResponse HttpServer::GET_pixels() { QElapsedTimer t; @@ -69,22 +92,26 @@ QHttpServerResponse HttpServer::GET_pixels() // 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); + // auto cam = dynamic_cast<VeyeIMX287m *>(m_camera); - if (!cam) { + // if (!cam) { + if (!m_camera) { qWarning() << "NO CAM"; return QHttpServerResponse::StatusCode::ServiceUnavailable; } // yeaah // ::img = &img; - if (!cam->getImage(img)) { + // if (!cam->getImage(img)) { + if (!m_camera->getImage(&img)) { qWarning() << "cannot get image"; return QHttpServerResponse::StatusCode::ServiceUnavailable; } // ::pixels = std::move(img.pixels()); - ++cam->processedCounter; + // ++cam->processedCounter; + // FIXME: take into account + // ++m_camera->processedCounter; } // FIXME: not thread-safe, don't use this static shared_ptr at all diff --git a/src/protocols/httpserver.h b/src/protocols/httpserver.h index 64f7987..600ead4 100644 --- a/src/protocols/httpserver.h +++ b/src/protocols/httpserver.h @@ -24,14 +24,14 @@ public: static constexpr uint16_t DefaultPort{8080}; public: - explicit HttpServer(ICamera *camera, - // QObject *parent = nullptr, + explicit HttpServer(std::shared_ptr<ICamera> camera, const QHostAddress &address = DefaultAddress, const uint16_t port = DefaultPort); ~HttpServer() override = default; // TODO: methods starting with GET_/POST_ will be routed automatically public: + QHttpServerResponse GET_image(); QHttpServerResponse GET_pixels(); QHttpServerResponse POST_params(const QHttpServerRequest &request); diff --git a/src/protocols/iprotocol.cpp b/src/protocols/iprotocol.cpp index d021fb7..5422a9d 100644 --- a/src/protocols/iprotocol.cpp +++ b/src/protocols/iprotocol.cpp @@ -1,5 +1,5 @@ #include "iprotocol.h" -IProtocol::IProtocol(ICamera *camera) +IProtocol::IProtocol(std::shared_ptr<ICamera> camera) : m_camera{camera} {} diff --git a/src/protocols/iprotocol.h b/src/protocols/iprotocol.h index 1643036..2d65dac 100644 --- a/src/protocols/iprotocol.h +++ b/src/protocols/iprotocol.h @@ -1,13 +1,15 @@ #pragma once +#include <memory> + class ICamera; class IProtocol { public: - explicit IProtocol(ICamera *camera); + explicit IProtocol(std::shared_ptr<ICamera> camera); virtual ~IProtocol() = default; protected: - ICamera *m_camera{nullptr}; + std::shared_ptr<ICamera> m_camera; }; |
