From 3fa8f19daf8b36b0703002d78a84e5bb7919849b Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Thu, 23 Jan 2025 12:08:26 +0100 Subject: add support of inno-maker ov9281 --- main.cpp | 186 +++++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 111 insertions(+), 75 deletions(-) (limited to 'main.cpp') diff --git a/main.cpp b/main.cpp index 341693e..481d6f1 100644 --- a/main.cpp +++ b/main.cpp @@ -9,6 +9,7 @@ #include "LibCamera.h" #include "calibration.h" +#include "camera/innomakerov9281.h" #include "camera/ov9281.h" #include "dumps.h" #include "fuck_intel.h" @@ -52,7 +53,7 @@ extern volatile int32_t positionSteps; requested_params_t requested_params; namespace { -Image img; +std::shared_ptr img; Pixels pixels; std::vector calibrationPixels; QMutex calibrationPixelsMutex; @@ -87,42 +88,73 @@ auto printPixels = [](const auto& pixels) { std::cout << std::endl; }; +void onNewImage( + std::shared_ptr image) +{ + if (!image) { + qDebug() << __func__ << "no image"; + return; + } + + ::img = image; +} + void onNewPixels( std::shared_ptr pixels) { + if (!pixels) { + qDebug() << __func__ << "got null pixels"; + } + if (!*pixels) { - qDebug() << "got empty pixels"; + // qDebug() << __func__ << "got empty pixels"; } ::pixels = *pixels; - - if (!::pixels) { - qDebug() << "empty pixels after copy"; - } } bool initLaser(); -int main( - int argc, char* argv[]) +int main(int argc, char* argv[]) { QCoreApplication app(argc, argv); + { + std::cout << std::boolalpha; + InnoMakerOV9281 innoMakerCam; + qDebug() << "init:" << innoMakerCam.init(); + qDebug() << "set exposure:" << innoMakerCam.setExposureTimeMs(3000); + qDebug() << "set gain:" << innoMakerCam.setGain(3000); + + Image buf; + + for (size_t i = 0; i < 1000; ++i) { + if (!innoMakerCam.getImage(buf)) { + break; + } + + buf.rotate(); + auto pixels = buf.pixels(); + } + } + qDebug() << "ok"; + exit(EXIT_SUCCESS); + // if (false) qDebug() << "size of raw profile" << sizeof(Pixels); - if (true) { + if (false) { // open binary calibration table - if (false) { + if (true) { if (!openCalibrationTable("/home/user/dumps/binz.calibration_table", ::calibrationTableZ)) { exit(EXIT_FAILURE); } - interpolate(::calibrationTableZ); + // interpolate(::calibrationTableZ); if (!openCalibrationTable("/home/user/dumps/binx.calibration_table", ::calibrationTableX)) { exit(EXIT_FAILURE); } - interpolate(::calibrationTableX); + // interpolate(::calibrationTableX); } if (false) { @@ -200,84 +232,82 @@ int main( // .save("/home/user/dumps/imageX_interpolated.png"); } - if (true) { - auto rawProfiles = openDump("/home/user/dumps/binz"); - // auto rawProfiles = openDump("/home/user/dumps/z"); - qDebug() << "raw z-profiles count is" << rawProfiles.size(); - // qDebug() << "height" << calibrationColumnHeight; + // load binary calibration dumps and calibrate + if (false) { + if (true) { + auto rawProfiles = openDump("/home/user/dumps/binz"); + // auto rawProfiles = openDump("/home/user/dumps/z"); + qDebug() << "raw z-profiles count is" << rawProfiles.size(); + // qDebug() << "height" << calibrationColumnHeight; - auto filteredRawProfiles = filter(std::move(rawProfiles)); - qDebug() << "filtered z-profiles count is" - << filteredRawProfiles.count(); + auto filteredRawProfiles = filter(std::move(rawProfiles)); + qDebug() << "filtered z-profiles count is" + << filteredRawProfiles.count(); - ::calibrationTableZ = calibrateZ(std::move(filteredRawProfiles), - requested_params.stepsPerMm); - // if (!dump( - // ::calibrationTableZ, - // "/home/user/dumps/binz.calibration_table" - // )) - // { - // qApp->exit(EXIT_FAILURE); - // } + ::calibrationTableZ = calibrateZ(std::move(filteredRawProfiles), + requested_params.stepsPerMm); - // bool ok = calibrationTableToImage(::calibrationTableZ) - // .save("/home/user/dumps/z/imageZ.png"); + // bool ok = calibrationTableToImage(::calibrationTableZ) + // .save("/home/user/dumps/z/imageZ.png"); - // if (!ok) - // { - // qDebug() << "cannot save imageZ.png"; - // exit(EXIT_FAILURE); - // } + // if (!ok) + // { + // qDebug() << "cannot save imageZ.png"; + // exit(EXIT_FAILURE); + // } - interpolate(::calibrationTableZ); + interpolate(::calibrationTableZ); - // calibrationTableToImage(::calibrationTableZ) - // .save("/home/user/dumps/z/imageZ_interpolated.png"); - // exit(EXIT_SUCCESS); - } + if (!dump(::calibrationTableZ, + "/home/user/dumps/binz.calibration_table")) { + qApp->exit(EXIT_FAILURE); + } + // calibrationTableToImage(::calibrationTableZ) + // .save("/home/user/dumps/z/imageZ_interpolated.png"); + // exit(EXIT_SUCCESS); + } - qDebug() << "--------------------------------------------------------"; + qDebug() + << "--------------------------------------------------------"; - if (true) { - auto rawProfiles = openDump("/home/user/dumps/binx"); - qDebug() << "raw x-profiles count is" << rawProfiles.size(); - // qDebug() << "height" << calibrationColumnHeight; + if (true) { + auto rawProfiles = openDump("/home/user/dumps/binx"); + qDebug() << "raw x-profiles count is" << rawProfiles.size(); + // qDebug() << "height" << calibrationColumnHeight; - auto filteredRawProfiles = filter(std::move(rawProfiles)); - qDebug() << "filtered x-profiles count is" - << filteredRawProfiles.count(); + auto filteredRawProfiles = filter(std::move(rawProfiles)); + qDebug() << "filtered x-profiles count is" + << filteredRawProfiles.count(); - ::calibrationTableX = calibrateX(std::move(filteredRawProfiles)); + ::calibrationTableX = calibrateX(std::move(filteredRawProfiles)); - // if (!dump( - // ::calibrationTableZ, - // "/home/user/dumps/binx.calibration_table" - // )) - // { - // qApp->exit(EXIT_FAILURE); - // } + // bool ok = calibrationTableToImage(::calibrationTableX) + // .save("/home/user/dumps/z/imageX.png"); - // bool ok = calibrationTableToImage(::calibrationTableX) - // .save("/home/user/dumps/z/imageX.png"); + // if (!ok) + // { + // qDebug() << "cannot save imageX.png"; + // exit(EXIT_FAILURE); + // } - // if (!ok) - // { - // qDebug() << "cannot save imageX.png"; - // exit(EXIT_FAILURE); - // } + interpolate(::calibrationTableX); - interpolate(::calibrationTableX); + if (!dump(::calibrationTableZ, + "/home/user/dumps/binx.calibration_table")) { + qApp->exit(EXIT_FAILURE); + } - // calibrationTableToImage(::calibrationTableX) - // .save("/home/user/dumps/z/imageX_interpolated.png"); + // calibrationTableToImage(::calibrationTableX) + // .save("/home/user/dumps/z/imageX_interpolated.png"); + } } } // exit(EXIT_SUCCESS); - if (!initLaser()) { - return EXIT_FAILURE; - } + // if (!initLaser()) { + // return EXIT_FAILURE; + // } // PrinterClient printerClient; @@ -310,6 +340,7 @@ int main( camera->printControls(); camera->newPixels.connect(&onNewPixels); + camera->newImage.connect(&onNewImage); if (!camera->startStream()) { cm->stop(); @@ -319,15 +350,19 @@ int main( QHttpServer qHttpServer; qHttpServer.route("/v1/sensor/image", [&]() { - std::cout << "http: image" << std::endl; + std::cout << "http: image" << std::endl << std::flush; + pgm_save(::img); std::lock_guard lg(pgm_image_mtx); - // qDebug() << "image"; + qDebug() << "mutex locked"; + qDebug() << "image saved to array"; return QByteArray((const char*) pgm_image, pgm_image_size); }); qHttpServer.route("/v1/sensor/image2", [&]() { std::cout << "http: image2" << std::endl; + pgm_save(::img); + std::lock_guard lg(pgm_image_mtx); - // qDebug() << "image"; + qDebug() << "image2"; return QByteArray((const char*) pgm_image, pgm_image_size); }); // qHttpServer.route("/v1/sensor/exposureTimeUs", [&]() { @@ -348,8 +383,9 @@ int main( QJsonObject json; json["pixels"] = pixels; json["encoderPosition"] = qint64{encoder.position()}; - json["measurementCounter"] = qint64{img.counters.measurementCounter}; - json["timestampUs"] = qint64(img.counters.timestampUs); + // FIXME: get prom pixels struct + json["measurementCounter"] = qint64{img->counters.measurementCounter}; + json["timestampUs"] = qint64(img->counters.timestampUs); const auto lines = pixelsToLines(::pixels); -- cgit v1.2.3-70-g09d2