Files
HPPA/HPPA/focusWindow.h
2026-04-02 10:34:57 +08:00

206 lines
4.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "windows.h"
#include <cstdio>
#include <iostream>
#include <exception>
#include <stdexcept>
#include <cmath>
#include <io.h>
#include <QtWidgets/QMainWindow>
#include <QThread>
#include <QLineSeries>
#include <QChart>
#include <QChartView>
#include <QFileDialog>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDateTime>
#include <QMutex>
#include "ui_FocusDialog.h"
#include "AbstractPortMiscDefines.h"
#include "CFocusMotorControl.h"
#include "resononImager.h"
#include "hppaConfigFile.h"
#include "path_tc.h"
#include "ImagerOperationBase.h"
#include "IrisMultiMotorController.h"
#include <Eigen/Dense>
#include <cmath>
// 数据记录结构体
struct PositionData {
double targetPosition; // 目标位置
double actualPosition; // 实际马达位置
double cameraIndex; // 相机采集指数
QDateTime timestamp; // 时间戳
PositionData(double target = 0, double actual = 0.0, double index = 0.0)
: targetPosition(target), actualPosition(actual),
cameraIndex(index), timestamp(QDateTime::currentDateTime()) {}
};
// 协调控制器
class MotionCaptureCoordinator : public QObject
{
Q_OBJECT
public:
MotionCaptureCoordinator(IrisMultiMotorController* motorCtrl,
ImagerOperationBase* cameraCtrl,
QObject* parent = nullptr);
~MotionCaptureCoordinator();
QVector<PositionData> getAllPositionData() const;
bool saveToCsv(const QString& filename);
public slots:
void startStepMotion(double speed, int stepInterval = 100, double startPos = 0, double endPos = -1);//-1马达能到达的最远位置
void stopStepMotion();
signals:
void progressChanged(int progress);
void sequenceComplete();
void sequenceStopped();
void errorOccurred(const QString& error);
void moveTo(int, double, double, int);
void getFocusIndexSobel();
private slots:
void handlePositionReached(int motorID, double pos);
void handleCaptureComplete(double index);
void handleError(const QString& error);
private:
void processNextPosition();
IrisMultiMotorController* m_motorCtrl;
ImagerOperationBase* m_cameraCtrl;
QVector<PositionData> m_positionData;
mutable QMutex m_dataMutex;
double m_posInternal;
double m_currentPos;
double m_endPos;
bool m_isRunning;
double m_speed;
int m_iStepInterval;
int m_iStepIntervalRealTime;
int m_counter;
};
class focusWindow:public QDialog
{
Q_OBJECT
public:
focusWindow(QWidget *parent = Q_NULLPTR);
focusWindow(QWidget *parent, ImagerOperationBase* imager);
~focusWindow();
ImagerOperationBase* m_Imager;
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
private:
QPoint m_dragPosition;
bool m_bDrag = false;
Ui::focusDialog ui;
QThread *m_AutoFocusThread;
int m_FocusState;
int m_iMinPos, m_iMaxPos;
CFocusMotorControl* m_ctrlFocusMotor;
void disableBeforeConnect(bool disable);
QThread m_motorThread;
IrisMultiMotorController* m_multiAxisController;
double m_dSpeed;
QThread m_MotionCaptureCoordinatorThread;
MotionCaptureCoordinator* m_coordinator;
int m_iStepSize;
double m_goodPos;
bool m_isAutoFocusSuccess;
bool m_isMoveAfterAutoFocus = false;
void getGaussianInitParam(const std::vector<double>& pos, const std::vector<double>& index, double& a_init, double& mu_init, double& sigma_init, double& c_init);
void gaussian_fit(const std::vector<double>& x_data, const std::vector<double>& y_data, double& a, double& mu, double& sigma, double& c);
public Q_SLOTS:
void onConnectMotor();
void onMove2MotorLogicZero();
void onMove2MotorMax();
void onAdd();
void onSubtract();
void onAutoFocus();
void onManualFocus();
void onUpdateCurrentLocation();
void onMoveto();
void onAutoFocusFinished();
void onAutoFocusProgress(int progress);
void onUltrasound_radioButton();
void display_x_loc(std::vector<double> loc);
void onx_rangeMeasurement();
void moveAfterAutoFocus(int motorID, double location);
void onExit();
signals:
void StartManualFocusSignal(int);//1开始调焦0停止调焦
void move2LocSignal(int, double, double, int);
void move2MaxLocSignal(int, double, int);
void rmoveSignal(int, double, double, int);
void rangeMeasurementSignal(int, double, int);
void zeroStartSignal(int);
void startStepMotion(double speed, int stepInterval = 100, double startPos = 0, double endPos = -1);
void closeSignal();
};
class WorkerThread2 : public QThread
{
Q_OBJECT
private:
bool m_bIsUltrasound;
public:
WorkerThread2(CFocusMotorControl * ctrlFocusMotor,bool isUltrasound);
CFocusMotorControl *m_ctrlFocusMotor;
protected:
void run();
signals:
void AutoFocusFinishedSignal();
};
class WorkerThread4 : public QThread
{
Q_OBJECT
private:
public:
WorkerThread4(CFocusMotorControl * ctrlFocusMotor);
CFocusMotorControl *m_ctrlFocusMotor;
protected:
void run();
signals:
void AutoFocusProgressSignal(int);
};