diff --git a/HPPA/FodisWindow.cpp b/HPPA/FodisWindow.cpp index 297b4d7..2547b49 100644 --- a/HPPA/FodisWindow.cpp +++ b/HPPA/FodisWindow.cpp @@ -1,4 +1,5 @@ #include "FodisWindow.h" +#include "JinspFiberImagerConfig.h" FodisWindow::FodisWindow(QWidget* parent) : QDialog(parent) @@ -6,7 +7,8 @@ FodisWindow::FodisWindow(QWidget* parent) ui.setupUi(this); m_FiberImagerThread = new QThread(); - m_JinspFiberImagerOperation = new JinspFiberImager(false, "COM9", "JINSP"); + m_JinspFiberImagerOperation = new JinspFiberImager(false, JinspFiberImagerConfig::instance().portName().toStdString(), "JINSP"); + connect(m_JinspFiberImagerOperation, &JinspFiberImager::spectalCaptured, this, &FodisWindow::spectalCaptured); m_JinspFiberImagerOperation->moveToThread(m_FiberImagerThread); m_FiberImagerThread->start(); diff --git a/HPPA/FodisWindow.h b/HPPA/FodisWindow.h index 9e3de9d..953a6c6 100644 --- a/HPPA/FodisWindow.h +++ b/HPPA/FodisWindow.h @@ -42,6 +42,8 @@ signals: void PlotSpectralSignal(); void FiberImagerClosedSignal(); + void spectalCaptured(DeviceAttribute attribute, DataFrame dataFrame); + private: Ui::FodisWindow ui; QThread* m_FiberImagerThread; diff --git a/HPPA/HPPA.cpp b/HPPA/HPPA.cpp index c2a4eb6..5b06c06 100644 --- a/HPPA/HPPA.cpp +++ b/HPPA/HPPA.cpp @@ -455,6 +455,44 @@ HPPA::HPPA(QWidget* parent) m_carousel->addWidget(sa_SingleLensReflexCamera); m_carousel->setContentsMargins(0, 0, 0, 0); + //--------------------------------------------------------------------- + QChartView * m_FiberImagerChartView = new QChartView(); + m_FiberImagerChartView->setRenderHint(QPainter::Antialiasing); + m_FiberImagerChartView->setStyleSheet(R"( + background: #0D1233; + )"); + + m_FiberImagerChart = new QChart(); + m_FiberImagerChart->setBackgroundBrush(QColor("#0D1233")); + m_FiberImagerChart->legend()->hide(); + //m_FiberImagerChart->setTitle("Simple line chart example"); + + QValueAxis* axisX_FiberImagerChart = new QValueAxis(); + QValueAxis* axisY_FiberImagerChart = new QValueAxis(); + setAxis(axisX, axisY); + m_FiberImagerChart->addAxis(axisX_FiberImagerChart, Qt::AlignBottom); + m_FiberImagerChart->addAxis(axisY_FiberImagerChart, Qt::AlignLeft); + m_FiberImagerChartView->setChart(m_FiberImagerChart); + + QScrollArea* sa_FiberImager = new QScrollArea(); + sa_FiberImager->setObjectName("sa_FiberImager"); + sa_FiberImager->setStyleSheet(R"( + border: none; + background-color: #0D1233; + )"); + QGridLayout* gridLayout_sa_FiberImager = new QGridLayout(sa_FiberImager); + gridLayout_sa_FiberImager->setSpacing(6); + gridLayout_sa_FiberImager->setObjectName(QString::fromUtf8("gridLayout_sa_FiberImager")); + gridLayout_sa_FiberImager->setVerticalSpacing(0); + gridLayout_sa_FiberImager->setContentsMargins(0, 0, 0, 0); + gridLayout_sa_FiberImager->addWidget(m_FiberImagerChartView); + + m_carousel->addWidget(sa_FiberImager); + m_carousel->setContentsMargins(0, 0, 0, 0); + + + + m_carousel->play(); gridLayout_carouselContainer->addWidget(m_carousel); @@ -1021,6 +1059,7 @@ void HPPA::initControlTabwidget() //is11 m_fodisWindow = new FodisWindow(this); + connect(m_fodisWindow, &FodisWindow::spectalCaptured, this, &HPPA::showFiberImagerSpectral); m_fodisWindow->setWindowFlags(Qt::Widget); ui.controlTabWidget->addTab(m_fodisWindow, QString::fromLocal8Bit("FODIS")); @@ -2084,6 +2123,37 @@ void HPPA::setAxis(QValueAxis* axisX, QValueAxis* axisY) } } +void HPPA::showFiberImagerSpectral(DeviceAttribute attribute, DataFrame dataFrame) +{ + try + { + QLineSeries* series = new QLineSeries(); + + const int count = qMin(attribute.iPixels, 4096); + for (int i = 0; i < count; ++i) + { + double wavelength = attribute.fWaveLengthInNM[i]; + double intensity = dataFrame.lData[i]; + series->append(wavelength, intensity); + } + + series->setPen(QPen(QColor("#FF928A"), 2)); + + m_FiberImagerChart->removeAllSeries(); + m_FiberImagerChart->addSeries(series); + m_FiberImagerChart->createDefaultAxes(); + + QValueAxis* axisX = qobject_cast(m_FiberImagerChart->axisX()); + QValueAxis* axisY = qobject_cast(m_FiberImagerChart->axisY()); + + setAxis(axisX, axisY); + } + catch (const std::exception&) + { + std::cout << "显示光谱有错误!" << std::endl; + } +} + void HPPA::timerEvent(QTimerEvent* event) { } diff --git a/HPPA/HPPA.h b/HPPA/HPPA.h index fd2eb08..059d567 100644 --- a/HPPA/HPPA.h +++ b/HPPA/HPPA.h @@ -356,6 +356,9 @@ private: void showQuickPreview(int fileNumber, const QString& filePath, const cv::Mat& rgbImage); + QChart* m_FiberImagerChart; + void showFiberImagerSpectral(DeviceAttribute attribute, DataFrame dataFrame); + public Q_SLOTS: void onPlotHyperspectralImageRgbImage(int fileNumber, int frameNumber, QString filePath); void focusPlotSpectralImg(int state); diff --git a/HPPA/HPPA.vcxproj b/HPPA/HPPA.vcxproj index 660b733..1f60ef8 100644 --- a/HPPA/HPPA.vcxproj +++ b/HPPA/HPPA.vcxproj @@ -126,6 +126,7 @@ + diff --git a/HPPA/JinspFiberImager.cpp b/HPPA/JinspFiberImager.cpp index 9ed4027..2fa20a5 100644 --- a/HPPA/JinspFiberImager.cpp +++ b/HPPA/JinspFiberImager.cpp @@ -13,6 +13,9 @@ JinspFiberImager::JinspFiberImager(bool bIsUSBMode, std::string ucPortNumber, st m_record = false; m_captureIntervalMilliseconds = 5 * 1000; + + qRegisterMetaType("DeviceAttribute"); + qRegisterMetaType("DataFrame"); } JinspFiberImager::~JinspFiberImager() @@ -162,6 +165,8 @@ void JinspFiberImager::recordTarget(int recordTimes, QString path) m_IntegratingSphereData.lData[i] = m_IntegratingSphereData.lData[i] / recordTimes; } + //将m_IntegratingSphereData通过信号发送 + emit spectalCaptured(attribute, m_IntegratingSphereData); //输出到csv QDateTime curDateTime = QDateTime::currentDateTime(); diff --git a/HPPA/JinspFiberImager.h b/HPPA/JinspFiberImager.h index f8b07cd..726d2ed 100644 --- a/HPPA/JinspFiberImager.h +++ b/HPPA/JinspFiberImager.h @@ -64,4 +64,5 @@ public slots: signals: void sendExposureTimeSignal(int exposureTime); + void spectalCaptured(DeviceAttribute attribute, DataFrame dataFrame); }; diff --git a/HPPA/JinspFiberImagerConfig.cpp b/HPPA/JinspFiberImagerConfig.cpp new file mode 100644 index 0000000..eec795c --- /dev/null +++ b/HPPA/JinspFiberImagerConfig.cpp @@ -0,0 +1,85 @@ +#include "JinspFiberImagerConfig.h" +#include +#include +#include +#include +#include +#include + +const QString JinspFiberImagerConfig::kDefaultPortName = QStringLiteral("COM9"); +const QString JinspFiberImagerConfig::kConfigFileName = QStringLiteral("jinsp_fiber_imager_config.json"); + +JinspFiberImagerConfig::JinspFiberImagerConfig() + : m_configFilePath(QCoreApplication::applicationDirPath() + "/" + kConfigFileName) + , m_portName(kDefaultPortName) +{ + loadConfig(); +} + +JinspFiberImagerConfig& JinspFiberImagerConfig::instance() +{ + static JinspFiberImagerConfig s; + return s; +} + +QString JinspFiberImagerConfig::portName() const +{ + return m_portName; +} + +void JinspFiberImagerConfig::setPortName(const QString& port) +{ + if (m_portName != port) + { + m_portName = port; + saveConfig(); + } +} + +void JinspFiberImagerConfig::loadConfig() +{ + QFile file(m_configFilePath); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + qDebug() << "JinspFiberImagerConfig: No config file found, using default port:" << kDefaultPortName; + saveConfig(); + return; + } + + QByteArray jsonData = file.readAll(); + file.close(); + + QJsonParseError parseError; + QJsonDocument doc = QJsonDocument::fromJson(jsonData, &parseError); + if (parseError.error != QJsonParseError::NoError) + { + qWarning() << "JinspFiberImagerConfig: JSON parse error:" << parseError.errorString(); + return; + } + + QJsonObject obj = doc.object(); + if (obj.contains("portName")) + { + m_portName = obj["portName"].toString(kDefaultPortName); + } +} + +void JinspFiberImagerConfig::saveConfig() +{ + QJsonObject obj; + obj["portName"] = m_portName; + + QJsonDocument doc(obj); + + QFile file(m_configFilePath); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + qWarning() << "JinspFiberImagerConfig: Failed to open config file for writing:" << m_configFilePath; + return; + } + + file.write(doc.toJson(QJsonDocument::Indented)); + file.close(); + + qDebug() << "JinspFiberImagerConfig: Config saved to" << m_configFilePath; +} diff --git a/HPPA/JinspFiberImagerConfig.h b/HPPA/JinspFiberImagerConfig.h new file mode 100644 index 0000000..af357f8 --- /dev/null +++ b/HPPA/JinspFiberImagerConfig.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +class JinspFiberImagerConfig +{ +public: + static JinspFiberImagerConfig& instance(); + + QString portName() const; + void setPortName(const QString& port); + + static const QString kDefaultPortName; + static const QString kConfigFileName; + +private: + JinspFiberImagerConfig(); + JinspFiberImagerConfig(const JinspFiberImagerConfig&) = delete; + JinspFiberImagerConfig& operator=(const JinspFiberImagerConfig&) = delete; + + QString m_configFilePath; + QString m_portName; + + void loadConfig(); + void saveConfig(); +};