178 lines
5.6 KiB
C++
178 lines
5.6 KiB
C++
#ifndef BELTTEARINGTCPPROTOCOLTEST_MAINWINDOW_H
|
|
#define BELTTEARINGTCPPROTOCOLTEST_MAINWINDOW_H
|
|
|
|
#include <QMainWindow>
|
|
#include <QAbstractSocket>
|
|
#include <QByteArray>
|
|
#include <QCloseEvent>
|
|
#include <QImage>
|
|
#include <QJsonObject>
|
|
#include <QHash>
|
|
#include <QVector>
|
|
#include <QtGlobal>
|
|
|
|
class QCheckBox;
|
|
class QDoubleSpinBox;
|
|
class QLineEdit;
|
|
class QLabel;
|
|
class QPlainTextEdit;
|
|
class QPushButton;
|
|
class QSpinBox;
|
|
class QTableWidget;
|
|
class QTcpSocket;
|
|
class QResizeEvent;
|
|
class PointCloudGLWidget;
|
|
|
|
struct PointCloudSummary
|
|
{
|
|
quint64 frameIndex = 0;
|
|
quint64 timestamp = 0;
|
|
quint32 originalCount = 0;
|
|
quint32 sampledCount = 0;
|
|
quint32 lineStep = 0;
|
|
quint32 pointStep = 0;
|
|
double xMin = 0.0;
|
|
double xMax = 0.0;
|
|
double yMin = 0.0;
|
|
double yMax = 0.0;
|
|
double zMin = 0.0;
|
|
double zMax = 0.0;
|
|
};
|
|
|
|
struct PointCloudPoint
|
|
{
|
|
qint32 index = 0;
|
|
double x = 0.0;
|
|
double y = 0.0;
|
|
double z = 0.0;
|
|
};
|
|
|
|
class MainWindow final : public QMainWindow
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
explicit MainWindow(QWidget* parent = nullptr);
|
|
~MainWindow() override;
|
|
|
|
private slots:
|
|
void connectToServer();
|
|
void disconnectFromServer();
|
|
void readConfig();
|
|
void setConfig();
|
|
void setRealtime();
|
|
void resetAlarm();
|
|
void restDetect();
|
|
void chooseOutputDir();
|
|
void onConnected();
|
|
void onDisconnected();
|
|
void onReadyRead();
|
|
void onSocketError(QAbstractSocket::SocketError error);
|
|
|
|
protected:
|
|
void closeEvent(QCloseEvent* event) override;
|
|
void resizeEvent(QResizeEvent* event) override;
|
|
|
|
private:
|
|
void setupUi();
|
|
void updateConnectionControls(bool connected);
|
|
void sendFrame(quint8 dataType, const QByteArray& payload = QByteArray());
|
|
void sendJsonMessage(const QJsonObject& message);
|
|
void processFrames();
|
|
void processJsonFrames();
|
|
void processPointCloudFrames();
|
|
void handleFrame(quint8 dataType, const QByteArray& payload, int frameSize);
|
|
void handleJsonPayload(quint8 dataType, const QByteArray& payload);
|
|
void handleNewJsonPayload(const QByteArray& payload);
|
|
void updateConfigControls(const QJsonObject& config);
|
|
void requestProtocolInfo();
|
|
bool parsePointCloud(const QByteArray& payload, PointCloudSummary& summary,
|
|
QVector<PointCloudPoint>& points, QString& error) const;
|
|
void appendPoints(const PointCloudSummary& summary, const QVector<PointCloudPoint>& points);
|
|
void saveImage(const QByteArray& payload);
|
|
void saveCloudUtilsFrame(const PointCloudSummary& summary,
|
|
const QVector<PointCloudPoint>& points);
|
|
QString ensureOutputDir();
|
|
void logMessage(const QString& message);
|
|
void logResultMessage(const QString& resultType, const QString& message,
|
|
const QString& repeatKey);
|
|
void recordError(const QString& message);
|
|
void updatePointCloudStats(const PointCloudSummary& summary);
|
|
void trimDisplayedPointClouds();
|
|
void updateRealtimeResult(const QJsonObject& object);
|
|
void updateRealtimeImageDisplay();
|
|
|
|
QTcpSocket* m_socket = nullptr;
|
|
QByteArray m_receiveBuffer;
|
|
|
|
QLineEdit* m_hostEdit = nullptr;
|
|
QSpinBox* m_portSpin = nullptr;
|
|
QPushButton* m_connectButton = nullptr;
|
|
QPushButton* m_disconnectButton = nullptr;
|
|
QLabel* m_connectionLabel = nullptr;
|
|
|
|
QDoubleSpinBox* m_scanXScaleSpin = nullptr;
|
|
QDoubleSpinBox* m_scanYScaleSpin = nullptr;
|
|
QDoubleSpinBox* m_differenceBinThresholdSpin = nullptr;
|
|
QDoubleSpinBox* m_tearingMinLengthSpin = nullptr;
|
|
QDoubleSpinBox* m_tearingMinWidthSpin = nullptr;
|
|
QDoubleSpinBox* m_tearingMinDepthSpin = nullptr;
|
|
QDoubleSpinBox* m_tearingMinGapSpin = nullptr;
|
|
QDoubleSpinBox* m_sameGapThresholdSpin = nullptr;
|
|
QSpinBox* m_gapCheckWindowSpin = nullptr;
|
|
QLineEdit* m_cameraIpEdit = nullptr;
|
|
QSpinBox* m_maxQueueSizeSpin = nullptr;
|
|
QSpinBox* m_generationIntervalSpin = nullptr;
|
|
QSpinBox* m_imageLineCountSpin = nullptr;
|
|
QCheckBox* m_enabledCheck = nullptr;
|
|
QSpinBox* m_lineStepSpin = nullptr;
|
|
QSpinBox* m_pointStepSpin = nullptr;
|
|
QPushButton* m_readConfigButton = nullptr;
|
|
QPushButton* m_setConfigButton = nullptr;
|
|
|
|
QCheckBox* m_realtimeCheck = nullptr;
|
|
QPushButton* m_resetAlarmButton = nullptr;
|
|
QPushButton* m_restDetectButton = nullptr;
|
|
|
|
QPushButton* m_pointCloudClearButton = nullptr;
|
|
QSpinBox* m_displayLineCountSpin = nullptr;
|
|
QCheckBox* m_saveCloudUtilsCheck = nullptr;
|
|
PointCloudGLWidget* m_cloudView = nullptr;
|
|
|
|
QCheckBox* m_savePointsCheck = nullptr;
|
|
QCheckBox* m_saveImagesCheck = nullptr;
|
|
QLineEdit* m_outputDirEdit = nullptr;
|
|
|
|
QLabel* m_linesValue = nullptr;
|
|
QLabel* m_bytesValue = nullptr;
|
|
QLabel* m_errorsValue = nullptr;
|
|
QLabel* m_frameValue = nullptr;
|
|
QLabel* m_countValue = nullptr;
|
|
QLabel* m_stepsValue = nullptr;
|
|
QLabel* m_xRangeValue = nullptr;
|
|
QLabel* m_yRangeValue = nullptr;
|
|
QLabel* m_zRangeValue = nullptr;
|
|
QLabel* m_realtimeSummaryLabel = nullptr;
|
|
QTableWidget* m_realtimeTearTable = nullptr;
|
|
QLabel* m_realtimeImageLabel = nullptr;
|
|
QImage m_realtimeImage;
|
|
QPlainTextEdit* m_logEdit = nullptr;
|
|
QString m_lastLogKey;
|
|
QString m_lastLogTime;
|
|
QString m_lastLogMessage;
|
|
int m_lastLogRepeatCount = 0;
|
|
QHash<QString, QString> m_resultLogKeys;
|
|
QHash<QString, QString> m_resultLogMessages;
|
|
QHash<QString, QString> m_resultLogTimes;
|
|
QHash<QString, int> m_resultLogBlocks;
|
|
QHash<QString, int> m_resultLogRepeatCounts;
|
|
|
|
qint64 m_receivedBytes = 0;
|
|
int m_errorCount = 0;
|
|
int m_pointLineCount = 0;
|
|
int m_imageCount = 0;
|
|
int m_pointCloudFrameCount = 0;
|
|
};
|
|
|
|
#endif // BELTTEARINGTCPPROTOCOLTEST_MAINWINDOW_H
|