Newer
Older
PhaseMeasure / PhaseWindow.cpp
#include "PhaseWindow.h"
#include "ui_PhaseWindow.h"

#include <iostream>
#include <QTimer>
#include <QDateTime>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDesktopWidget>
#include <QThread>
#include <SetConfig.h>
#include <QPixmap>
#include <QDir>
#include <QMessageBox>
#include "common/utils/SettingConfig.h"
#include "common/utils/QLogUtil.h"

QString currentFileName = "";

PhaseWindow::PhaseWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PhaseWindow)
{
    ui->setupUi(this);

    // 无边框
    this->setWindowFlags(Qt::FramelessWindowHint);

    // 窗口大小为占满一屏
    QRect screenRect = QApplication::desktop()->screenGeometry();
    resize(screenRect.width(), screenRect.height());

    // 将窗口移动到左上角
    move(0, 0);
    ui->exitButt->move(screenRect.width() - 80, 10);
    ui->minButt->move(screenRect.width() - 140, 10);
    ui->settingButt->move(screenRect.width() - 200, 10);
    ui->endButt->move(screenRect.width() - 260, 10);
    ui->startButt->move(screenRect.width() - 320, 10);
    ui->line->setGeometry(0, 89, screenRect.width(), 1);
    ui->pointsList->setGeometry(250,30,screenRect.width()-600,40);
    ui->labelsList->setGeometry(250,60,screenRect.width()-600,30);

    // 设置主体区域的大小和位置
    ui->scrollArea->setGeometry(0, 90, screenRect.width(), screenRect.height() - 90);
    ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

    ui->tim3->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"));

    this->generateWidgetForDevice();

    device = new PhaseDevice(this);
    connect(device, &PhaseDevice::sendDataToDraw,
            this, &PhaseWindow::drawPhaseDataOnPage);
}

PhaseWindow::~PhaseWindow()
{
    delete ui;
}

void PhaseWindow::drawPhaseDataOnPage(PhaseDataDto * phaseData)
{
    ui->tim3->setText(phaseData->timestamp);
    updateChannelActive(phaseData->channelActive);

    // 更新所有通道BOX的值
    for (int i = 0; i < phaseData->channelActive.size(); i++)
    {
        // 获取对应的通道BOX
        if (phaseData->channelActive.at(i) == "1")
        {
            ChannelItem * channel = channelItemList.at(i);
            // 存
            phaseVector[i].append(phaseData->channelData.at(i));
            int size = phaseVector.at(i).size();
            double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i),phaseData->channelAllan.at(i),size);

            // 写日志
            QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0'));
            QString channelDataStr = QString("%1 [%2] %3 %4 %5")
                    .arg(phaseData->timestamp)
                    .arg(phaseData->frameId)
                    .arg(phaseData->channelDataStr.at(i))
                    .arg(QString::number(channel->getChannelDelay()))
                    .arg(QString::number(phaseValue, 'f', 15));
            std::cout << channelDataStr.toStdString() << std::endl;

            QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr);
        }
    }
}

void PhaseWindow::generateWidgetForDevice()
{
    // 获取设备数据
    int channelNum = SettingConfig::getInstance().CHANNEL_COUNT;

    QRect screenRect = QApplication::desktop()->screenGeometry();

    ui->scrollContents->setGeometry(0, 90, screenRect.width(), channelNum * 170);

    QVBoxLayout * layout = new QVBoxLayout(ui->scrollContents);
    const QFont labelFont("微软雅黑", 10);

    for (int i = 0; i < channelNum; i++)
    {
        // 通道状态图标默认显示为离线/无效状态
        QLabel* label = ui->pointsList->findChild<QLabel*>(QString("p%1").arg(i+1)); //根据子控件的名称查找子控件
        label->setPixmap(QPixmap(":/points/images/white.png"));

        QGroupBox * group = new QGroupBox(ui->scrollContents);
        group->setTitle(QString("通道 - %1").arg(i + 1));
        group->setFont(QFont("微软雅黑", 12));
        group->setGeometry(20, i * 160 + 10, screenRect.width() - 40, 160);
        this->channelGroupList.append(group);

        QHBoxLayout * vbox = new QHBoxLayout(group);
        ChannelItem * channelItem = new ChannelItem();
        channelItem->setGeometry(10, 0, screenRect.width() - 60, 160);
        channelItem->setIndex(i);
        channelItem->setChannelDelay(SettingConfig::getInstance().DELAY_ARR.at(i).toDouble());
        this->channelItemList.append(channelItem);
        vbox->addWidget(channelItem);
        group->setLayout(vbox);
        layout->addWidget(group);
    }
}

void PhaseWindow::updateChannelActive(QList<QString> channelActive)
{
    for (int i = 0; i < channelActive.size(); i++)
    {
        if (channelActive.at(i) == "1")
        {
            QLabel* label = ui->pointsList->findChild<QLabel*>(QString("p%1").arg(i+1)); //根据子控件的名称查找子控件
            label->setPixmap(QPixmap(":/points/images/green.png"));

            // 显示有效的通道
            this->channelGroupList.at(i)->show();
        } else
        {
            QLabel* label = ui->pointsList->findChild<QLabel*>(QString("p%1").arg(i+1)); //根据子控件的名称查找子控件
            label->setPixmap(QPixmap(":/points/images/white.png"));

            // 隐藏无效的通道
            this->channelGroupList.at(i)->hide();
        }
    }
}


void PhaseWindow::on_minButt_clicked()
{
    setWindowState(Qt::WindowMinimized | windowState());
}

void PhaseWindow::on_exitButt_clicked()
{
    QApplication::exit(0);
}

void PhaseWindow::on_startButt_clicked()
{
    //发送开始指令
    device->startWork();
    createFolder();
}

void PhaseWindow::createFolder()
{
    QDir *folder = new QDir;
    bool exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH);
    if(!exist)  //生成base文件夹
    {
        bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH);
    }
    //生成当前时间文件夹
    QString fileName = QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss");
    exist = folder->exists(SettingConfig::getInstance().BASE_LOG_PATH +fileName);
    if(!exist)
    {
        bool ok = folder->mkdir(SettingConfig::getInstance().BASE_LOG_PATH +fileName);
        if(ok) {
            currentFileName = fileName;
            QMessageBox::warning(this, tr("开始"), tr("开始成功"));
        }
    }

}
void PhaseWindow::on_endButt_clicked()
{
    currentFileName = "";
    //发送结束指令
    device->stopWork();
}

void PhaseWindow::on_settingButt_clicked()
{
    SetConfig *new_win = new SetConfig();
    new_win->setWindowTitle("配置");
    new_win->show();
}