Files
HPPA/HPPA/focusWindow.cpp
tangchao0503 0b4ee48355 1、实现了光谱仪简单的采集功能:曝光、调焦、暗电流、采集影像、保存影像;
2、设置光谱仪帧率、曝光时间、gain;
3、在页面中嵌入了rgb相机图传(通过opencv实现);
4、平台的相机位置模拟、x/y马达的分别控制、x/y马达的量程检测;
5、轨迹规划;
6、加入了张卓的自动调焦模块;
7、加入了自动电源控制;
2023-03-14 22:52:38 +08:00

297 lines
7.1 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.

#include "stdafx.h"
#include "focusWindow.h"
focusWindow::focusWindow(QWidget *parent, ResononImager * imager)
{
ui.setupUi(this);
disableBeforeConnect(true);
setAttribute(Qt::WA_DeleteOnClose);//设置关闭窗体就调用窗体的析构函数
m_Imager = imager;
m_FocusState = 0;
m_ctrlFocusMotor = nullptr;
m_AutoFocusThread = new QThread();
connect(this->ui.connectMotor_btn, SIGNAL(clicked()), this, SLOT(onConnectMotor()));
connect(this->ui.logicZero_btn, SIGNAL(clicked()), this, SLOT(onMove2MotorLogicZero()));
connect(this->ui.max_btn, SIGNAL(clicked()), this, SLOT(onMove2MotorMax()));
connect(this->ui.add_btn, SIGNAL(clicked()), this, SLOT(onAdd()));
connect(this->ui.subtract_btn, SIGNAL(clicked()), this, SLOT(onSubtract()));
connect(this->ui.ultrasound_radioButton, SIGNAL(released()), this, SLOT(onUltrasound_radioButton()));
connect(this->ui.autoFocus_btn, SIGNAL(clicked()), this, SLOT(onAutoFocus()));
connect(this->ui.manualFocus_btn, SIGNAL(clicked()), this, SLOT(onManualFocus()));
//查找可用串口,并显示
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite))
{
ui.motorPort_comboBox->addItem(serial.portName());
ui.ultrasoundPort_comboBox->addItem(serial.portName());
serial.close();
}
}
//设置自动调焦进度条
ui.autoFocusProgress_progressBar->setMinimum(0);
ui.autoFocusProgress_progressBar->setMaximum(100);
ui.autoFocusProgress_progressBar->reset();
}
focusWindow::~focusWindow()
{
printf("destroy focusWindow-------------------------\n");
delete m_ctrlFocusMotor;
//delete thread1, progressThread;
}
void focusWindow::disableBeforeConnect(bool disable)
{
ui.controlMotor_groupBox->setDisabled(disable);
ui.autoFocus_btn->setDisabled(disable);
}
bool test(void *pCaller, int *x, int *y, void **pvdata)
{
focusWindow *p = (focusWindow *)pCaller;
p->m_Imager->GetImageSize(*x, *y);
USHORT *pusData = new USHORT[(*x)*(*y)];
p->m_Imager->m_ResononImager.start();
p->m_Imager->m_ResononImager.get_frame(pusData);
p->m_Imager->m_ResononImager.stop();
BYTE *pbData = (BYTE*)pusData;
*pvdata = pbData;
return true;
}
void focusWindow::onConnectMotor()
{
if (m_ctrlFocusMotor != nullptr)
{
printf("不能重复连接-------------------------\n");
return;
}
bool isUltrasound = ui.ultrasound_radioButton->isChecked();
QString motorPortTmp = ui.motorPort_comboBox->currentText();
QString ultrasoundPortTmp = ui.ultrasoundPort_comboBox->currentText();
QRegExp rx("\\d+$");
rx.indexIn(motorPortTmp, 0);
int motorPort = rx.cap(0).toInt();
rx.indexIn(ultrasoundPortTmp, 0);
int ultrasoundPort = rx.cap(0).toInt();
int minPos = 120;
int maxPos = 1000;
if (isUltrasound)
{
PortInfo motor;
motor.iPortType = 0;
motor.indexParity = 0;
motor.iPortNumber = motorPort;
motor.indexBaudRate = 0x13;
motor.indexBytesize = 3;
motor.indexStopBits = 0;
PortInfo ultrasound;
ultrasound.iPortType = 0;
ultrasound.indexParity = 0;
ultrasound.iPortNumber = ultrasoundPort;
ultrasound.indexBaudRate = 0x0C;
ultrasound.indexBytesize = 3;
ultrasound.indexStopBits = 0;
m_ctrlFocusMotor = new CFocusMotorControl();
m_ctrlFocusMotor->SetLogicZero(minPos);
m_ctrlFocusMotor->SetLimit(minPos, maxPos);
m_iMotorMaxPos = maxPos;
m_ctrlFocusMotor->InitSystem(motor, ultrasound, test, this);
m_ctrlFocusMotor->MoveToLogicZero();
}
else
{
PortInfo motor;
motor.iPortType = 0;
motor.indexParity = 0;
motor.iPortNumber = motorPort;
motor.indexBaudRate = 0x13;
motor.indexBytesize = 3;
motor.indexStopBits = 0;
m_ctrlFocusMotor = new CFocusMotorControl();
m_ctrlFocusMotor->SetLogicZero(minPos);
m_ctrlFocusMotor->SetLimit(minPos, maxPos);
m_iMotorMaxPos = maxPos;
m_ctrlFocusMotor->InitSystem(motor, test, this);
m_ctrlFocusMotor->MoveToLogicZero();
}
disableBeforeConnect(false);
}
void focusWindow::onMove2MotorLogicZero()
{
m_ctrlFocusMotor->MoveToLogicZero();
}
void focusWindow::onMove2MotorMax()
{
m_ctrlFocusMotor->MoveToPos(m_iMotorMaxPos);
}
void focusWindow::onAdd()
{
DriverInfo di;
m_ctrlFocusMotor->GetDriverStatus(di);
int stepSize = ui.addStepSize_lineEdit->text().toInt();
m_ctrlFocusMotor->MoveToPos(di.iAbsPosition + stepSize);
m_ctrlFocusMotor->GetDriverStatus(di);
printf("马达位置:%d", di.iAbsPosition);
std::cout << "点击调焦按钮!" << std::endl;
}
void focusWindow::onSubtract()
{
DriverInfo di;
m_ctrlFocusMotor->GetDriverStatus(di);
int stepSize = ui.subtractStepSize_lineEdit->text().toInt();
m_ctrlFocusMotor->MoveToPos(di.iAbsPosition - stepSize);
m_ctrlFocusMotor->GetDriverStatus(di);
printf("马达位置:%d", di.iAbsPosition);
}
void focusWindow::onAutoFocus()
{
bool isUltrasound = ui.ultrasound_radioButton->isChecked();
WorkerThread2 *thread1 = new WorkerThread2(m_ctrlFocusMotor, isUltrasound);
connect(thread1, SIGNAL(AutoFocusFinishedSignal()), this, SLOT(onAutoFocusFinished()));
thread1->start();
this->setDisabled(true);
WorkerThread4 *progressThread = new WorkerThread4(m_ctrlFocusMotor);
connect(progressThread, SIGNAL(AutoFocusProgressSignal(int)), this, SLOT(onAutoFocusProgress(int)));
progressThread->start();
ui.autoFocusProgress_progressBar->reset();
}
void focusWindow::onManualFocus()
{
m_FocusState += 1;
std::cout << "点击调焦按钮!" << std::endl;
if (m_FocusState % 2 == 1)
{
//开始调焦
emit StartManualFocusSignal(1);
ui.manualFocus_btn->setText(QString::fromLocal8Bit("停止调焦"));
ui.manualFocus_btn->setStyleSheet("QWidget{background-color:rgb(255,0,0);}");
//std::cout << "------------------------------------------" << m_FocusState << std::endl;
}
else
{
emit StartManualFocusSignal(0);
m_Imager->setFocusControlState(false);
ui.manualFocus_btn->setText(QString::fromLocal8Bit("调焦"));
ui.manualFocus_btn->setStyleSheet("QWidget{background-color:rgb(0,255,0);}");
}
}
void focusWindow::onAutoFocusFinished()
{
this->setDisabled(false);
}
void focusWindow::onAutoFocusProgress(int progress)
{
//std::cout << "进度:" << progress << std::endl;
ui.autoFocusProgress_progressBar->setValue(progress);
}
void focusWindow::onUltrasound_radioButton()
{
bool isUltrasound = ui.ultrasound_radioButton->isChecked();
if (isUltrasound)
{
ui.ultrasoundPort_comboBox->setEnabled(true);
}
else
{
ui.ultrasoundPort_comboBox->setEnabled(false);
}
}
WorkerThread2::WorkerThread2(CFocusMotorControl * ctrlFocusMotor, bool isUltrasound)
{
m_ctrlFocusMotor = ctrlFocusMotor;
m_bIsUltrasound = isUltrasound;
}
void WorkerThread2::run()
{
if (m_bIsUltrasound)
{
m_ctrlFocusMotor->SetFitParams(0.0017, 0.3277);
m_ctrlFocusMotor->StartAutoFocus(5, 2);
}
else
{
m_ctrlFocusMotor->StartAutoFocus(820, 910, 10, 2);
}
emit AutoFocusFinishedSignal();
}
WorkerThread4::WorkerThread4(CFocusMotorControl * ctrlFocusMotor)
{
m_ctrlFocusMotor = ctrlFocusMotor;
}
void WorkerThread4::run()
{
while (true)
{
int progress = m_ctrlFocusMotor->GetProgressIndex();
//std::cout << "WorkerThread4::run----自动调焦进度:" << progress << std::endl;
emit AutoFocusProgressSignal(progress);
if (progress == 100)
{
//std::cout << "自动调焦完成!" << std::endl;
break;
}
msleep(200);
}
}