From 9dde2ab53c8e2c97647164fce89cf149260fbc8f Mon Sep 17 00:00:00 2001 From: Nikita Kostovsky Date: Sun, 12 Jan 2025 11:50:34 +0100 Subject: implement calibration --- src/dumps.cpp | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 src/dumps.cpp (limited to 'src/dumps.cpp') diff --git a/src/dumps.cpp b/src/dumps.cpp new file mode 100644 index 0000000..43a839c --- /dev/null +++ b/src/dumps.cpp @@ -0,0 +1,141 @@ +#include "dumps.h" + +#include +#include +#include +#include +#include +#include +#include + +#include + +QList openDump( + const QString &dumpPath) +{ + QString dirToRead{dumpPath}; + qDebug() << "trying to open dump path:" << dirToRead; + + if (dirToRead.isEmpty()) { + qDebug() << "dumpPath not specified. looking into" << dumpsRoot; + + QDir dumpsRootDir{dumpsRoot}; + + const auto filter = QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable; + // there is no battery in my rpi5 for now + const auto sort = QDir::Name; + const auto entries = dumpsRootDir.entryList(filter, sort); + + if (entries.isEmpty()) { + qWarning() << "dumps root" << dumpsRoot << "contains no dumps. " + << "specify existing dump path"; + + return {}; + } + + dirToRead = dumpsRoot + "/" + entries.last(); + } + + QDir dumpDir{dirToRead}; + + // const QStringList nameFilters{"*.bin"}; + const QStringList nameFilters{}; + const auto filter = QDir::Files; + const auto sort = QDir::Name; + + auto filenames = dumpDir.entryList(nameFilters, filter, sort); + + if (filenames.isEmpty()) { + qDebug() << "no filenames found in" << dumpDir.path(); + return {}; + } + + qDebug() << "create results array" << filenames.size(); + auto resultOptionals = QScopedPointer( + new QList>(filenames.size())); + + QElapsedTimer t; + t.start(); + qDebug() << "open real files"; + std::cout << "here" << std::endl; + + std::transform( + std::execution::par_unseq, + filenames.begin(), + filenames.end(), + resultOptionals->begin(), + [dirToRead](const auto &filename) { + // std::cout << '.'; + // auto rawProfile = openRawProfile(dirToRead + "/" + filename); + auto rawProfile = Pixels::load(dirToRead + "/" + filename); + + return rawProfile; + }); + + filenames.clear(); + filenames.squeeze(); + + qDebug() << Q_FUNC_INFO << "open raw profiles: elapsed (ms)" << t.elapsed(); + // std::cout << std::endl; + + std::remove_if(std::execution::par, + resultOptionals->begin(), + resultOptionals->end(), + [](auto &a) { return !a.has_value(); }); + + QList result(resultOptionals->size()); + + std::transform(std::execution::par, + std::make_move_iterator(resultOptionals->begin()), + std::make_move_iterator(resultOptionals->end()), + result.begin(), + [](auto &p) { return p.value(); }); + + qDebug() << Q_FUNC_INFO << "elapsed (ms)" << t.elapsed(); + + return result; +} + +std::optional openRawProfile( + const QString &filePath) +{ + QFile f{filePath}; + + if (!f.open(QFile::ReadOnly)) { + qWarning() << "cannot open file for reading:" << f.fileName(); + qWarning() << "error string:" << f.errorString(); + + return {}; + } + + // TODO: rewrite to remove manual serialization/deserialization + const auto json = QJsonDocument::fromJson(f.readAll()).object(); + const auto jsonCounters = json["counters"].toObject(); + + Pixels result; + result.counters.timestampUs = jsonCounters["timestampUs"].toInteger(); + result.counters.measurementCounter = jsonCounters["measurementCounter"] + .toInteger(); + result.counters.encoderPosition = jsonCounters["encoderPosition"].toInteger(); + + const auto jsonPixels = json["pixels"].toArray(); + // TODO: check json pixels count +#ifdef FIRST_COLUMN_ONLY + result.pixels[0] = jsonPixels.at(0).toDouble(); +#else + std::transform( + // std::execution::par_unseq, + jsonPixels.constBegin(), + jsonPixels.constEnd(), + result.pixels.begin(), + [](const auto &jsonPixel) { return jsonPixel.toDouble(); }); + +// for (size_t i = 0; i < jsonPixels.count() && i < result.pixels.size(); +// ++i) +// { +// result.pixels[i] = jsonPixels[i].toDouble(); +// } +#endif + + return result; +} -- cgit v1.2.3-70-g09d2