summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp236
1 files changed, 162 insertions, 74 deletions
diff --git a/main.cpp b/main.cpp
index 0aff149..1a121a3 100644
--- a/main.cpp
+++ b/main.cpp
@@ -6,7 +6,10 @@
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
+#include <QSerialPort>
+#include <QTextStream>
#include <QtConcurrent/QtConcurrentRun>
+#include <QTimer>
#undef QT_NO_KEYWORDS
#include <chrono>
@@ -20,6 +23,8 @@
#include "genetic_algos.h"
#include "imagealgos.h"
#include "LibCamera.h"
+#include "pigpio.h"
+#include "rotaryencoder.h"
#define try_apply_config() \
if(!applyConfig(config)) \
@@ -34,6 +39,8 @@ if(!applyConfig(config)) \
const QString exposureTimeKey = "exposureTime";
const QString laserLevelKey = "laserLevel";
+extern volatile int64_t positionSteps;
+
struct requested_params_t {
int32_t exposureTime = { 200 };
int32_t laserLevel = { 7000 };
@@ -54,7 +61,53 @@ static void printControls();
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
- qDebug() << "Hello qt";
+
+ QElapsedTimer t;
+ t.start();
+
+ // qDebug() << "msecs before serial:" << t.elapsed();
+
+ // QSerialPort *serialPort { new QSerialPort { "/dev/ttyUSB0", qApp } };
+
+ // if (!serialPort->setBaudRate(QSerialPort::Baud115200)) {
+ // qDebug() << "serial port: cannot set baud rate:"
+ // << serialPort->errorString();
+
+ // return EXIT_FAILURE;
+ // }
+
+ // if (!serialPort->open(QFile::ReadWrite)) {
+ // qDebug() << "cannot open serial port:" << serialPort->errorString();
+
+ // return EXIT_FAILURE;
+ // }
+
+ // qDebug() << "serial port baud rate:" << serialPort->baudRate();
+
+ // qDebug() << "serial port data bits:" << serialPort->dataBits();
+ // qDebug() << "serial port parity:" << serialPort->parity();
+ // qDebug() << "serial port stop bits:" << serialPort->stopBits();
+
+ // QObject::connect(serialPort, &QSerialPort::readyRead,
+ // serialPort, [=](){
+ // qDebug() << "serialPort: " << serialPort->readAll();
+ // });
+
+ // QObject::connect(serialPort, &QSerialPort::errorOccurred,
+ // serialPort, [=](){
+ // qWarning() << "serial port error:" << serialPort->errorString();
+ // });
+
+ // qDebug() << "msecs before write and flush:" << t.elapsed();
+
+ // serialPort->write(QByteArray { "G91\n" });
+ // serialPort->flush();
+
+ qDebug() << "msecs before encoder:" << t.elapsed();
+
+ rotaryencoder encoder;
+
+ qDebug() << "msecs before camera:" << t.elapsed();
// FIXME: don't use one var for everything
int ret;
std::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();
@@ -217,16 +270,16 @@ int main(int argc, char *argv[]) {
std::make_pair(memory, plane.length);
}
- // size_t desiredFPS = 200;
+ // size_t desiredFPS = 144;
// std::int64_t lowerUS = 1 * 1000 * 1000 / desiredFPS;
// std::int64_t higherUS = lowerUS;
// std::int64_t value_pair[2] = { higherUS / 2, higherUS };
request->controls().set(libcamera::controls::AnalogueGain, 1.0);
- request->controls().set(libcamera::controls::ExposureTime, 4321 + expOffset++ * 100);
+ request->controls().set(libcamera::controls::ExposureTime, 100);
// request->controls().set(
- // libcamera::controls::FrameDurationLimits,
- // libcamera::Span<const std::int64_t, 2>(value_pair));
+ // libcamera::controls::FrameDurationLimits,
+ // libcamera::Span<const std::int64_t, 2>(value_pair));
requests.push_back(std::move(request));
}
@@ -270,10 +323,10 @@ int main(int argc, char *argv[]) {
// qDebug() << "image";
return QByteArray((const char*)pgm_image, pgm_image_size);
});
- qHttpServer.route("/v1/sensor/exposureTimeUs", [&]() {
- std::lock_guard<std::mutex> lg(pgm_image_mtx);
- return "123";
- });
+ // qHttpServer.route("/v1/sensor/exposureTimeUs", [&]() {
+ // // std::lock_guard<std::mutex> lg(pgm_image_mtx);
+ // return "123";
+ // });
qHttpServer.route("/v1/pixels", [&]() {
std::lock_guard<std::mutex> lg(pgm_image_mtx);
@@ -285,10 +338,26 @@ int main(int argc, char *argv[]) {
QJsonObject json;
json["pixels"] = pixels;
+ json["encoderPosition"] = qint64 { encoder.position() };
+ json["measurementCounter"] = qint64 { img.measurementCounter };
+ json["timestampUs"] = qint64 { img.timestampNs / 1000. } ;
return QHttpServerResponse(QJsonDocument(json).toJson());
});
+
+ qHttpServer.route("/v1/commands/resetEncoder", [&](const QHttpServerRequest &request) -> QHttpServerResponse {
+ if (request.method() != QHttpServerRequest::Method::Post) {
+ return QHttpServerResponse::StatusCode::NotFound;
+ }
+
+ qDebug() << "reset encoder";
+
+ positionSteps = 0;
+
+ return QHttpServerResponse::StatusCode::Ok;
+ });
+
qHttpServer.route("/v1/sensor/params", [&](const QHttpServerRequest &request) -> QHttpServerResponse {
switch (request.method()) {
@@ -366,6 +435,8 @@ int main(int argc, char *argv[]) {
s << value;
s >> requested_params.laserLevel;
+
+ qDebug() << "done with laser level";
}
return QHttpServerResponse(request.body());
@@ -505,6 +576,13 @@ int main(int argc, char *argv[]) {
*/
void onRequestCompleted(Request *completed_request)
{
+ static std::chrono::steady_clock::time_point fpsTimstamp = std::chrono::steady_clock::now();
+
+ QElapsedTimer t;
+ t.start();
+ static uint32_t performanceCounter { 0 };
+ static uint32_t elapsedSum { 0 };
+
bool verbose = false;
if (completed_request->status() == Request::RequestCancelled)
@@ -528,12 +606,12 @@ void onRequestCompleted(Request *completed_request)
const FrameMetadata &metadata = buffer->metadata();
- if (verbose)
- {
- std::cout << " seq: " << std::setw(6) << std::setfill('0')
- << metadata.sequence
- << " bytesused: ";
- }
+ // if (verbose)
+ // {
+ // std::cout << " seq: " << std::setw(6) << std::setfill('0')
+ // << metadata.sequence
+ // << " bytesused: ";
+ // }
for (size_t i = 0; i < buffer->planes().size(); ++i)
{
@@ -559,6 +637,8 @@ void onRequestCompleted(Request *completed_request)
img.dataSize = size;
img.stride = stride;
img.pixelFormat = pixelFormat;
+ img.measurementCounter = metadata.sequence;
+ img.timestampNs = metadata.timestamp;
// uint16_t unpacked[img.width * img.height] = { 0 };
// unpack_16bit((uint8_t*)img.data, img, (uint16_t*)&unpacked);
@@ -567,58 +647,60 @@ void onRequestCompleted(Request *completed_request)
rotate(img);
process_columns(img);
- static bool done = false;
+ // static bool done = false;
// mark pixels and max region
- for (size_t i = 0; i < img_width; ++i)
- {
- // std::cout << "\t" << img.pixels[i] << std::endl;
- // uint
- // const auto & p = img.pixels[i];
- // const auto int_p = int(p);
- // const auto fract = p - int_p;
+ // for (size_t i = 0; i < img_width; ++i)
+ // {
+ // // std::cout << "\t" << img.pixels[i] << std::endl;
+ // // uint
+ // // const auto & p = img.pixels[i];
+ // // const auto int_p = int(p);
+ // // const auto fract = p - int_p;
- // img.data[int_p][i] = 256 * 256 * fract;
- // img.data[int_p + 1][i] = 256 * 256 * (1.0 - fract);
+ // // img.data[int_p][i] = 256 * 256 * fract;
+ // // img.data[int_p + 1][i] = 256 * 256 * (1.0 - fract);
- // if (!done) {
- // std::cout << fract << " ";
- // }
+ // // if (!done) {
+ // // std::cout << fract << " ";
+ // // }
- img.data[size_t(img.pixels[i])][i] = 0;
- img.data[size_t(img.pixels[i]) - 6][i] = 0xffff;
- img.data[size_t(img.pixels[i]) + 6][i] = 0xffff;
- }
- done = true;
+ // img.data[size_t(img.pixels[i])][i] = 0;
+ // // crash is possible
+ // img.data[size_t(img.pixels[i]) - patternSize / 2][i] = 0xffff;
+ // img.data[size_t(img.pixels[i]) + patternSize / 2][i] = 0xffff;
+ // }
+ // done = true;
// // FILE * f = fopen("/tmp/R16.pgm", "w");
- FILE * f = fopen("/tmp/img.pgm", "w");
- // // FILE * f = fopen("/tmp/MONO_PISP_COMP1.pgm", "w");
+ // FILE * f = fopen("/tmp/img.pgm", "w");
+ // // // FILE * f = fopen("/tmp/MONO_PISP_COMP1.pgm", "w");
- if (f == NULL)
- {
- std::cerr << "cannot open output file: "
- << strerror(errno)
- << std::endl;
- }
- else
- {
- // pgm_save(&img, f);
- pgm_save(&img, f);
- fclose(f);
- // std::cout << "file written" << std::endl;
- }
+ // if (f == NULL)
+ // {
+ // std::cerr << "cannot open output file: "
+ // << strerror(errno)
+ // << std::endl;
+ // }
+ // else
+ // {
+ // // pgm_save(&img, f);
+ // // pgm_save(&img, f);
+ // fclose(f);
+ // // std::cout << "file written" << std::endl;
+ // }
+ pgm_save(&img, nullptr);
}
}
}
const libcamera::ControlList &metadata = completed_request->metadata();
const ControlInfoMap & control_map = camera->controls();
- const ControlIdMap & ctrlIdMap = control_map.idmap();
+ // const ControlIdMap & ctrlIdMap = control_map.idmap();
auto frameDurationCtrl = control_map.find(&controls::FrameDurationLimits);
- auto expTimeCtrl = control_map.find(&controls::ExposureTime);
+ // auto expTimeCtrl = control_map.find(&controls::ExposureTime);
double fps = frameDurationCtrl == control_map.end() ?
std::numeric_limits<double>::quiet_NaN() :
(1e6 / frameDurationCtrl->second.min().get<int64_t>());
@@ -641,10 +723,10 @@ void onRequestCompleted(Request *completed_request)
<< std::endl;
}
- for (const auto & [id, value] : metadata)
- {
+ // for (const auto & [id, value] : metadata)
+ // {
- }
+ // }
// metadata.set(controls::ExposureTime, 300);
@@ -687,39 +769,45 @@ void onRequestCompleted(Request *completed_request)
// completed_request->reuse(Request::ReuseBuffers);
// camera->queueRequest(completed_request);
+ qDebug() << "set exposureTime to" << requested_params.exposureTime;
+ completed_request->controls().set(libcamera::controls::ExposureTime,
+ requested_params.exposureTime);
+
completed_request->reuse(Request::ReuseBuffers);
completed_request->controls().set(libcamera::controls::AeEnable, false);
completed_request->controls().set(libcamera::controls::draft::NoiseReductionMode,
libcamera::controls::draft::NoiseReductionModeEnum::NoiseReductionModeHighQuality);
- // completed_request->controls().set(libcamera::controls::ExposureTime, rand() % 1000 + 100);
- static bool done0 = false;
- static bool done1 = false;
+ camera->queueRequest(completed_request);
+
+ ++performanceCounter;
+ elapsedSum += t.elapsed();
+
+ // if (performanceCounter == 20)
+ std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
- if (!done0 || !done1)
+ if ((now - fpsTimstamp) > 1000ms)
{
+ auto msPerFrame { float(elapsedSum / performanceCounter) };
- if (completed_request->sequence() % 2 == 0)
- {
- // qDebug() << "set 0" << completed_request->sequence();
- completed_request->controls().set(
- libcamera::controls::ExposureTime,
- requested_params.exposureTime);
- done0 == true;
- }
- else
- {
- // qDebug() << "set 1" << completed_request->sequence();
- completed_request->controls().set(
- libcamera::controls::ExposureTime,
- requested_params.exposureTime);
- done1 = true;
- }
+ double configFps = frameDurationCtrl == control_map.end() ?
+ std::numeric_limits<double>::quiet_NaN() :
+ (1e6 / frameDurationCtrl->second.min().get<int64_t>());
+
+ auto fps { 1000.f / msPerFrame };
+
+ qDebug() << "fps ideal/real is" << configFps << "/" << fps
+ << "; ms per frame is" << msPerFrame << "counted fps" << performanceCounter;
+
+ elapsedSum = 0;
+ performanceCounter = 0;
+ fpsTimstamp = now;
}
- camera->queueRequest(completed_request);
+ // qDebug() << "-------------------------------------------";
+
}
static bool applyConfig(const std::unique_ptr<CameraConfiguration> & config)