From 3e0841b0caf1e79cfc2278d3b8ca4387c17f1652 Mon Sep 17 00:00:00 2001 From: Nffj84 Date: Wed, 3 Jul 2024 15:59:11 +0300 Subject: [PATCH] Hard coded values to target location until real values are available. Added function for remote which AI can call. --- misc/camera/a8/remoteControl.cpp | 41 ++++++++++++++++++++++--- misc/camera/a8_remote/a8_remote.pro | 1 - misc/camera/a8_remote/defines.hpp | 5 --- misc/camera/a8_remote/remoteControl.cpp | 32 ++++++++++++++----- misc/camera/a8_remote/remoteControl.hpp | 14 ++++++++- 5 files changed, 73 insertions(+), 20 deletions(-) delete mode 100644 misc/camera/a8_remote/defines.hpp diff --git a/misc/camera/a8/remoteControl.cpp b/misc/camera/a8/remoteControl.cpp index 8673e4e..f69db1c 100644 --- a/misc/camera/a8/remoteControl.cpp +++ b/misc/camera/a8/remoteControl.cpp @@ -105,7 +105,7 @@ void RemoteControl::restoreOrientation(void) Config::getSerial()->sendCommand(serialCommandAngle); - QTimer::singleShot(1000, this, [this]() mutable { sendResponse(); }); + QTimer::singleShot(0, this, [this]() mutable { sendResponse(); }); } void RemoteControl::restoreZoom(void) @@ -123,7 +123,7 @@ void RemoteControl::restoreZoom(void) Config::getSerial()->sendCommand(serialCommandZoom); - QTimer::singleShot(3000, this, [this]() mutable { restoreOrientation(); }); + QTimer::singleShot(100, this, [this]() mutable { restoreOrientation(); }); } void RemoteControl::calculateTargetPosition(QJsonObject &commandObject) @@ -145,7 +145,7 @@ void RemoteControl::calculateTargetPosition(QJsonObject &commandObject) mResponseObject["latitude"] = gpsData.latitude; mResponseObject["longitude"] = gpsData.longitude; - QTimer::singleShot(3000, this, [this, commandObject]() mutable { zoomToTarget(commandObject); }); + QTimer::singleShot(100, this, [this, commandObject]() mutable { zoomToTarget(commandObject); }); } void RemoteControl::turnToTarget(QJsonObject &commandObject) @@ -171,7 +171,7 @@ void RemoteControl::turnToTarget(QJsonObject &commandObject) Config::getSerial()->sendCommand(serialCommandTurn); - QTimer::singleShot(3000, this, [this, commandObject]() mutable { calculateTargetPosition(commandObject); }); + QTimer::singleShot(1000, this, [this, commandObject]() mutable { calculateTargetPosition(commandObject); }); } void RemoteControl::zoomToTarget(QJsonObject &commandObject) @@ -201,7 +201,20 @@ void RemoteControl::zoomToTarget(QJsonObject &commandObject) Config::getSerial()->sendCommand(serialCommandNewZoom); - QTimer::singleShot(10000, this, [this, commandObject]() mutable { restoreZoom(); }); + QTimer::singleShot(5000, this, [this, commandObject]() mutable { restoreZoom(); }); +} + +RectangleProperties RemoteControl::calculateRectangleProperties(uint16_t top, uint16_t left, uint16_t bottom, uint16_t right) +{ + RectangleProperties properties; + + properties.width = right - left; + properties.height = bottom - top; + + properties.middleX = static_cast(left + properties.width / 2); + properties.middleY = static_cast(top + properties.height / 2); + + return properties; } void RemoteControl::run() @@ -235,6 +248,24 @@ void RemoteControl::run() exit(EXIT_SUCCESS); } + // TODO: + // Wait that these are actually available + // Without these it is impossible to calculate target location + commandObject["altitude"] = 10.5f; + commandObject["latitude"] = 55.75000000f; + commandObject["longitude"] = 37.61666670f; + commandObject["pitch"] = 0.0f; + commandObject["yaw"] = 152.5f; + commandObject["target_real_height"] = 2.5f; + commandObject["target_real_width"] = 5.0f; + + // Rectangle calculation for having proper zoom on group / target + RectangleProperties rectangle = calculateRectangleProperties(commandObject["top"].toInt(), commandObject["left"].toInt(), commandObject["bottom"].toInt(), commandObject["right"].toInt()); + commandObject["target_x"] = rectangle.middleX; + commandObject["target_y"] = rectangle.middleY; + commandObject["target_pixel_height"] = rectangle.height; + commandObject["target_pixel_width"] = rectangle.width; + mIsBusy = true; // Prepare responce object diff --git a/misc/camera/a8_remote/a8_remote.pro b/misc/camera/a8_remote/a8_remote.pro index 8b614a6..19193c1 100644 --- a/misc/camera/a8_remote/a8_remote.pro +++ b/misc/camera/a8_remote/a8_remote.pro @@ -22,6 +22,5 @@ SOURCES += \ remoteControl.cpp HEADERS += \ - defines.hpp \ remoteControl.hpp diff --git a/misc/camera/a8_remote/defines.hpp b/misc/camera/a8_remote/defines.hpp deleted file mode 100644 index 8528619..0000000 --- a/misc/camera/a8_remote/defines.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#define FIFO_WHO_AM_I "AI" -#define FIFO_TO_GIMBAL "/tmp/fifo_to_a8_gimbal" -#define FIFO_FROM_GIMBAL "/tmp/fifo_from_a8_gimbal" diff --git a/misc/camera/a8_remote/remoteControl.cpp b/misc/camera/a8_remote/remoteControl.cpp index afe5a98..7e97684 100644 --- a/misc/camera/a8_remote/remoteControl.cpp +++ b/misc/camera/a8_remote/remoteControl.cpp @@ -5,12 +5,13 @@ #include #include #include -#include "defines.hpp" #include #include -#include #include #include +#ifdef FIFO_TEST +#include +#endif RemoteControl::RemoteControl() {} @@ -75,7 +76,23 @@ void RemoteControl::createNamedPipe() } } -void RemoteControl::startCommunication() +void RemoteControl::sendData(uint16_t top, uint16_t left, uint16_t bottom, uint16_t right) +{ + qInfo().noquote().nospace() << "Enter a command (0 to exit): "; + std::string input; + std::cin >> input; + + // Send command + QJsonObject commandObject = {{"sender", FIFO_WHO_AM_I}, {"top", top}, {"left", left}, {"bottom", bottom}, {"right", right}}; + + QJsonDocument commandDocument(commandObject); + std::string command = commandDocument.toJson(QJsonDocument::Compact).toStdString(); + write(mFifoFdOut, command.c_str(), command.size()); + qDebug().noquote().nospace() << "Sent: " << command; +} + +#ifdef FIFO_TEST +void RemoteControl::startTest() { qInfo().noquote().nospace() << "Enter a command (0 to exit): "; std::string input; @@ -86,11 +103,11 @@ void RemoteControl::startCommunication() {"sender", FIFO_WHO_AM_I}, {"latitude", 63.155653611}, {"longitude", 23.827191389}, - {"altitude", randomFloatBetween(100, 500)}, + {"altitude", randomFloatBetween(10, 11)}, {"yaw", randomFloatBetween(0.0f, 360.0f)}, {"pitch", 0.0}, - {"target_x", (uint16_t) randomFloatBetween(0, 1279)}, - {"target_y", (uint16_t) randomFloatBetween(0, 719)}, + {"target_x", (uint16_t) randomFloatBetween(300, 979)}, + {"target_y", (uint16_t) randomFloatBetween(200, 519)}, {"target_pixel_width", 20}, {"target_pixel_height", 10}, {"target_real_width", 5}, @@ -139,8 +156,6 @@ void RemoteControl::startCommunication() QCoreApplication::processEvents(); QThread::msleep(100); } - - return; } float RemoteControl::randomFloatBetween(float min, float max) @@ -153,3 +168,4 @@ float RemoteControl::randomFloatBetween(float min, float max) // Generate a random float between min and max (inclusive) return dist(gen); } +#endif diff --git a/misc/camera/a8_remote/remoteControl.hpp b/misc/camera/a8_remote/remoteControl.hpp index 0959fe2..581347a 100644 --- a/misc/camera/a8_remote/remoteControl.hpp +++ b/misc/camera/a8_remote/remoteControl.hpp @@ -1,15 +1,27 @@ #pragma once +#include + +#define FIFO_WHO_AM_I "AI" +#define FIFO_TO_GIMBAL "/tmp/fifo_to_a8_gimbal" +#define FIFO_FROM_GIMBAL "/tmp/fifo_from_a8_gimbal" +//#define FIFO_TEST + class RemoteControl { public: RemoteControl(); ~RemoteControl(); void createNamedPipe(void); - void startCommunication(void); + void sendData(uint16_t top, uint16_t left, uint16_t bottom, uint16_t right); +#ifdef FIFO_TEST + void startTest(void); +#endif private: +#ifdef FIFO_TEST float randomFloatBetween(float min, float max); +#endif int mFifoFdIn; int mFifoFdOut; };