Newer
Older
CasicBioRecNew / CasicBioRecWin.cpp
#include "CasicBioRecWin.h"
#include "ui_CasicBioRecWin.h"

CasicBioRecWin::CasicBioRecWin(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::CasicBioRecWin)
{
    // 打开外部可执行程序
    outExe = new QProcess(this);
    outExe->start(SettingConfig::getInstance().OUT_EXE_FILE);

    ui->setupUi(this);

    // 程序启动时初始化缓存的数据
    this->initCacheData();

    // 设置窗口透明和大小、位置
    this->setWindowFlags(Qt::FramelessWindowHint);
    this->move(0, 0);
    this->resize(SettingConfig::getInstance().WINDOW_WIDTH,
                 SettingConfig::getInstance().WINDOW_HEIGHT);

    // 通过调色板的颜色来设置窗口的统一背景色
    qApp->setPalette(QPalette(QColor(SettingConfig::getInstance().WINDOW_BACKGROUND_COLOR)));

    // 初始化各个form界面并绑定切换响应函数
    initFormsPtr();

    // 初始化识别和注册的各个线程
    initFaceRegistThread(); // 人脸注册线程
    initFaceRecogThread(); // 人脸识别线程
    initIrisRegistThread(); // 虹膜注册线程
    initIrisRecogThread(); // 虹膜识别线程
    initCameraPositionThread(); // 调整相机位置

    // 初始化人脸相机控制
    ProMemory::getInstance().faceCam = new FaceCameraController(this);
    ProMemory::getInstance().faceCam->openFaceCamera(1000);
    connect(ProMemory::getInstance().faceCam, &FaceCameraController::sendImageToDraw,
            addPersonForm, &AddPersonForm::drawImageOnForm);
    connect(ProMemory::getInstance().faceCam, &FaceCameraController::sendImageToDrawForRecognize,
            recogResultForm, &RecognizeResultForm::drawImageOnHomeForm);

    // 初始化虹膜相机控制
    ProMemory::getInstance().irisCam = new IrisCameraController(this);
    ProMemory::getInstance().irisCam->initIrisCamera();
    ProMemory::getInstance().irisCam->openIrisCamera();
    connect(ProMemory::getInstance().irisCam->leftHandler, &IrisCameraCapEventHandler::sendIrisFrameToDraw,
            addPersonForm, &AddPersonForm::drawIrisImageOnFrame);
    connect(ProMemory::getInstance().irisCam->rightHandler, &IrisCameraCapEventHandler::sendIrisFrameToDraw,
            addPersonForm, &AddPersonForm::drawIrisImageOnFrame);

    // 初始化电机控制
    ProMemory::getInstance().moto = new MotoController(this);
    ProMemory::getInstance().moto->initSerialMCU();
    connect(ProMemory::getInstance().camPosCtrl, &CameraPositionController::motoControl,
            ProMemory::getInstance().moto, &MotoController::autoPosition);

    // 打印日志
    //LOG(INFO) << QString("应用程序启动成功[Application Startup Success]").toStdString();
    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE;
}

CasicBioRecWin::~CasicBioRecWin()
{
    ProMemory::getInstance().faceRegistPro->exitThread();
    ProMemory::getInstance().faceRegistPro->deleteLater();
    ProMemory::getInstance().faceRegistPro->wait();

    ProMemory::getInstance().faceRecogPro->exitThread();
    ProMemory::getInstance().faceRecogPro->deleteLater();
    ProMemory::getInstance().faceRecogPro->wait();

    ProMemory::getInstance().irisRegistPro->exitThread();
    ProMemory::getInstance().irisRegistPro->deleteLater();
    ProMemory::getInstance().irisRegistPro->wait();

    ProMemory::getInstance().irisRecogPro->exitThread();
    ProMemory::getInstance().irisRecogPro->deleteLater();
    ProMemory::getInstance().irisRecogPro->wait();

    ProMemory::getInstance().camPosCtrl->exitThread();
    ProMemory::getInstance().camPosCtrl->deleteLater();
    ProMemory::getInstance().camPosCtrl->wait();

    // 关闭自动启动的外部程序
    outExe->close();
    delete outExe;

    delete ui;
    delete ProMemory::getInstance().faceRegistPro;
    delete ProMemory::getInstance().faceRecogPro;
    delete ProMemory::getInstance().irisRegistPro;
    delete ProMemory::getInstance().irisRecogPro;
    delete ProMemory::getInstance().camPosCtrl;
}

void CasicBioRecWin::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_Escape:
        //LOG(INFO) << "" << std::endl;
        QTimer::singleShot(100, qApp, SLOT(quit()));

    default:
        QWidget::keyPressEvent(event);
    }
}

void CasicBioRecWin::backToStandByForm()
{
    ui->stacked->setCurrentWidget(startForm);
    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::MAIN_PAGE;
    ProMemory::getInstance().appState = CasicBioRecConst::ApplicationState::STATE_WAIT;
}
void CasicBioRecWin::switchToUserListForm()
{
    personListForm->findPersonList();
    ui->stacked->setCurrentWidget(personListForm);
    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::PERSON_LIST_FORM;
}
void CasicBioRecWin::switchToSettingForm()
{
    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::SETTING_FORM;
}
void CasicBioRecWin::switchToRegistForm(QString personId)
{
    // 根据传递的参数更新页面标题
    if (personId.isEmpty() == false)
    {
        addPersonForm->setPersonId(personId);
        addPersonForm->updateFormTitle("人员信息");

        // 查询人员信息
        addPersonForm->loadPersonInfo(personId);
    } else
    {
        addPersonForm->updateFormTitle("人员注册");
        addPersonForm->clearPersonInfo();
        addPersonForm->setPersonId("");
    }

    // 切换页面
    ui->stacked->setCurrentWidget(addPersonForm);
    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::ADD_PERSON_FORM;
}
void CasicBioRecWin::switchToRecognizeForm()
{
    ProMemory::getInstance().widgeFrame = CasicBioRecConst::WidgeFrameName::RECOGNIZE_RESULT_FORM;
    ui->stacked->setCurrentWidget(recogResultForm);

    recogResultForm->startWorkingRecognize();
}

void CasicBioRecWin::initFormsPtr()
{
    startForm = new StartupForm(this);
    personListForm = new PersonListForm(this);
    settingForm = new SettingForm(this);
    addPersonForm = new AddPersonForm(this);
    recogResultForm = new RecognizeResultForm(this);

    ui->stacked->addWidget(startForm);
    ui->stacked->addWidget(personListForm);
    ui->stacked->addWidget(settingForm);
    ui->stacked->addWidget(addPersonForm);
    ui->stacked->addWidget(recogResultForm);

    // 绑定按钮函数
    connect(startForm, &StartupForm::switchToUserListForm,
            this, &CasicBioRecWin::switchToUserListForm);
    connect(startForm, &StartupForm::switchToSettingForm,
            this, &CasicBioRecWin::switchToSettingForm);
    connect(startForm, &StartupForm::startRecognize,
            this, &CasicBioRecWin::switchToRecognizeForm);

    connect(personListForm, &PersonListForm::switchToRegistForm,
            this, &CasicBioRecWin::switchToRegistForm);
    connect(personListForm, &PersonListForm::backToHomePage,
            this, &CasicBioRecWin::backToStandByForm);

    connect(addPersonForm, &AddPersonForm::switchToUserListForm,
            this, &CasicBioRecWin::switchToUserListForm);
    connect(addPersonForm, &AddPersonForm::backToHomePage,
            this, &CasicBioRecWin::backToStandByForm);

    connect(recogResultForm, &RecognizeResultForm::backToHomeAndWait,
            this, &CasicBioRecWin::backToStandByForm);
}

void CasicBioRecWin::initCacheData()
{
    CacheManager::getInstance().updateDeptCache();
}

void CasicBioRecWin::initFaceRegistThread()
{
    // 人脸注册处理过程
    ProMemory::getInstance().faceRegistPro = new FaceRegistProcess(this);

    // 绑定信号与槽函数
    // 采集人脸图像失败
    connect(ProMemory::getInstance().faceRegistPro, &FaceRegistProcess::failedCaptureFace,
            addPersonForm, &AddPersonForm::onFailedCaptureFace);

    // 采集人脸图像成功
    connect(ProMemory::getInstance().faceRegistPro, &FaceRegistProcess::successCaptureFace,
            addPersonForm, &AddPersonForm::onSuccessCaptureFace);

    ProMemory::getInstance().faceRegistPro->start();
}

void CasicBioRecWin::initFaceRecogThread()
{
    // 人脸识别处理过程
    ProMemory::getInstance().faceRecogPro = new FaceRecogProcess(this);

    // 绑定信号与槽函数
    // 识别成功
    connect(ProMemory::getInstance().faceRecogPro, &FaceRecogProcess::matchSuccess,
            recogResultForm, &RecognizeResultForm::checkRecognizeResult);

    // 识别失败
    connect(ProMemory::getInstance().faceRecogPro, &FaceRecogProcess::matchFailure,
            recogResultForm, &RecognizeResultForm::showRecogFailure);

    ProMemory::getInstance().faceRecogPro->start();
}

void CasicBioRecWin::initIrisRegistThread()
{
    // 虹膜注册处理过程
    ProMemory::getInstance().irisRegistPro = new IrisRegistProcess(this);

    // 绑定信号与槽函数
    // 没有找到匹配的虹膜 采集成功
    connect(ProMemory::getInstance().irisRegistPro, &IrisRegistProcess::findNoSimIris,
            addPersonForm, &AddPersonForm::onSuccessCaptureIrisWithoutMatch);

    // 采集虹膜失败
    connect(ProMemory::getInstance().irisRegistPro, &IrisRegistProcess::captureIrisFailure,
            addPersonForm, &AddPersonForm::onFailedCaptureIris);

    // 采集虹膜图像成功 有匹配到虹膜库
    connect(ProMemory::getInstance().irisRegistPro, &IrisRegistProcess::findMatchedIris,
            addPersonForm, &AddPersonForm::onMatchedIris);

    ProMemory::getInstance().irisRegistPro->start();
}

void CasicBioRecWin::initIrisRecogThread()
{
    // 虹膜识别处理过程
    ProMemory::getInstance().irisRecogPro = new IrisRecogProcess(this);

    // 绑定信号与槽函数
    // 识别成功
    connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::findMatchedIris,
            recogResultForm, &RecognizeResultForm::checkRecognizeResult);

    // 识别失败
    connect(ProMemory::getInstance().irisRecogPro, &IrisRecogProcess::failedMatchedIris,
            recogResultForm, &RecognizeResultForm::showRecogFailure);

    ProMemory::getInstance().irisRecogPro->start();
}

void CasicBioRecWin::initCameraPositionThread()
{
    // 调整相机位置处理
    ProMemory::getInstance().camPosCtrl = new CameraPositionController(this);

    // 绑定信号与槽函数
    connect(ProMemory::getInstance().camPosCtrl, &CameraPositionController::updateTips,
            recogResultForm, &RecognizeResultForm::updateRecogTips);
    connect(ProMemory::getInstance().camPosCtrl, &CameraPositionController::updateTipsBackgroundColor,
            recogResultForm, &RecognizeResultForm::updateRecogTipsColor);

    ProMemory::getInstance().camPosCtrl->start();
}