2917 lines
84 KiB
C++
2917 lines
84 KiB
C++
#include "formcapture.h"
|
|
#include "ui_formcapture.h"
|
|
#include "mainwindow.h"
|
|
#include "qgstreamerplayer.h"
|
|
|
|
#include <QFileInfo>
|
|
#include <QDirIterator>
|
|
#include <QCollator>
|
|
|
|
#include <QSqlDatabase>
|
|
#include <QSqlQuery>
|
|
#include <QSqlError>
|
|
|
|
extern SThreadWatchVideoLink v;
|
|
|
|
FormCapture::FormCapture(QWidget *parent) :
|
|
QWidget(parent),
|
|
ui(new Ui::FormCapture)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
m_pThreadWatchVideoLink = &v;
|
|
|
|
m_pDialogSendProgress = NULL;
|
|
|
|
m_bExecStopRTSP = false;
|
|
|
|
|
|
//MainWindow* pMainWindow = MainWindow::GetMainWindow();
|
|
//connect(this, SIGNAL(ExitCapture()), pMainWindow, SLOT(ExitCapture()));
|
|
|
|
#ifdef _SYOLOV5
|
|
#else
|
|
ui->frame_Detection->setVisible(false);
|
|
#endif
|
|
|
|
|
|
|
|
ui->verticalScrollBar->SetSlideType(SSlideBar::SLIDE_VERTICAL);
|
|
ui->verticalScrollBar->setRange(0, 299);
|
|
|
|
connect(ui->verticalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(valueChangedScrollBarVertical(int)));
|
|
//connect(this, SIGNAL(SetSlideValue(int)), ui->verticalScrollBar, SLOT(setValue(int)));
|
|
//connect(ui->verticalScrollBar, SIGNAL(actionTriggered(int)), this, SLOT(actionTriggered(int)));
|
|
connect(ui->verticalScrollBar, SIGNAL(SingleDown()), this, SLOT(SingleDown()));
|
|
connect(ui->verticalScrollBar, SIGNAL(SingleUp()), this, SLOT(SingleUp()));
|
|
|
|
|
|
ui->horizontalScrollBar->SetSlideType(SSlideBar::SLIDE_HORIZONTAL);
|
|
ui->horizontalScrollBar->setRange(0, 299);
|
|
|
|
connect(ui->horizontalScrollBar, SIGNAL(valueChanged(int)), this, SLOT(valueChangedScrollBarHorizontal(int)));
|
|
//connect(this, SIGNAL(SetSlideValue(int)), ui->horizontalScrollBar, SLOT(setValue(int)));
|
|
//connect(ui->horizontalScrollBar, SIGNAL(actionTriggered(int)), this, SLOT(actionTriggered(int)));
|
|
connect(ui->horizontalScrollBar, SIGNAL(SingleDown()), this, SLOT(SingleDown()));
|
|
connect(ui->horizontalScrollBar, SIGNAL(SingleUp()), this, SLOT(SingleUp()));
|
|
|
|
|
|
|
|
connect(&m_Timer, SIGNAL(timeout()), this, SLOT(CheckVideoDevice()));
|
|
m_Timer.setInterval(100);
|
|
|
|
connect(&m_TimerCaptureInfo, SIGNAL(timeout()), this, SLOT(CheckCaptureTimeInfo()));
|
|
m_TimerCaptureInfo.setInterval(1000);
|
|
|
|
connect(&m_TimerCaptureBeepSound, SIGNAL(timeout()), this, SLOT(FinishBeep()));
|
|
m_TimerCaptureBeepSound.setSingleShot(true);
|
|
//m_TimerCaptureBeepSound.setInterval(500);
|
|
m_TimerCaptureBeepSound.setInterval(0);
|
|
|
|
|
|
connect(&m_TimerCaptureVideo, SIGNAL(timeout()), this, SLOT(VideoStopEnable()));
|
|
m_TimerCaptureVideo.setSingleShot(true);
|
|
//m_TimerCaptureVideo.setInterval(500);
|
|
m_TimerCaptureVideo.setInterval(0);
|
|
|
|
connect(&m_TimerCaptureImage, SIGNAL(timeout()), this, SLOT(ImageCaptureEnable()));
|
|
m_TimerCaptureImage.setSingleShot(true);
|
|
//m_TimerCaptureVideo.setInterval(500);
|
|
m_TimerCaptureImage.setInterval(0);
|
|
|
|
connect(&m_TimerCaptureSingleShot, SIGNAL(timeout()), this, SLOT(CaptureSingleShot()));
|
|
m_TimerCaptureSingleShot.setInterval(10);
|
|
m_TimerCaptureSingleShot.setSingleShot(true);
|
|
|
|
|
|
int i=0;
|
|
for(i=0 ; i<3 ; i++)
|
|
{
|
|
FormCaptureImageSelect* pCaptureImageSelect = new FormCaptureImageSelect(this);
|
|
//connect(pCaptureImageSelect, SIGNAL(SingleDown()), this, SLOT(SingleDown()));
|
|
//connect(pCaptureImageSelect, SIGNAL(SingleUp()), this, SLOT(SingleUp()));
|
|
ui->verticalLayout->addWidget(pCaptureImageSelect);
|
|
|
|
m_ListFormVerticalImageSelect.push_back(pCaptureImageSelect);
|
|
}
|
|
|
|
for(i=0 ; i<5 ; i++)
|
|
{
|
|
FormCaptureImageSelect* pCaptureImageSelect = new FormCaptureImageSelect(this);
|
|
//connect(pCaptureImageSelect, SIGNAL(SingleDown()), this, SLOT(SingleDown()));
|
|
//connect(pCaptureImageSelect, SIGNAL(SingleUp()), this, SLOT(SingleUp()));
|
|
ui->horizontalLayout->addWidget(pCaptureImageSelect);
|
|
|
|
m_ListFormHorizontalImageSelect.push_back(pCaptureImageSelect);
|
|
}
|
|
|
|
m_nCurrentPos = 0;
|
|
m_nIndexCurrent = 0;
|
|
|
|
m_nHandSwitchValue = 0;
|
|
m_nPrevHandSwitchValue = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
FormCapture::~FormCapture()
|
|
{
|
|
//MainWindow* pMainWindow = MainWindow::GetMainWindow();
|
|
//disconnect(this, SIGNAL(ExitCapture()), pMainWindow, SLOT(ExitCapture()));
|
|
|
|
int i=0;
|
|
for(i=0 ; i<3 ; i++)
|
|
{
|
|
FormCaptureImageSelect* pCaptureImageSelect = m_ListFormVerticalImageSelect[i];
|
|
SAFE_DELETE(pCaptureImageSelect);
|
|
}
|
|
m_ListFormVerticalImageSelect.clear();
|
|
|
|
for(i=0 ; i<5 ; i++)
|
|
{
|
|
FormCaptureImageSelect* pCaptureImageSelect = m_ListFormHorizontalImageSelect[i];
|
|
SAFE_DELETE(pCaptureImageSelect);
|
|
}
|
|
m_ListFormHorizontalImageSelect.clear();
|
|
|
|
SAFE_DELETE(ui->widget_SelectImage);
|
|
|
|
delete ui;
|
|
}
|
|
|
|
void FormCapture::SingleDown()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
int nItem = 20;
|
|
int nIndexCurrent = m_nIndexCurrent;
|
|
|
|
//nItem = pListHistoryImage->size();
|
|
int nTotalImage = 0;
|
|
int i=0;
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[i];
|
|
if(pCaptureImage->m_bDelete==false)
|
|
{
|
|
nTotalImage++;
|
|
}
|
|
}
|
|
nItem = nTotalImage;
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
float fMaxRange = 299;
|
|
|
|
int nPageDisplay = 0;
|
|
int nPageTotal = 0;
|
|
int nItemPerPage = m_nItemPerPage;
|
|
|
|
SSlideBar* pSlideBar = NULL;
|
|
|
|
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
pSlideBar = ui->horizontalScrollBar;
|
|
}
|
|
else if(nDisplayType==SDISPLAY_1920X1080)
|
|
{
|
|
pSlideBar = ui->verticalScrollBar;
|
|
}
|
|
|
|
nIndexCurrent += nItemPerPage;
|
|
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
|
|
nPageDisplay = nIndexCurrent / nItemPerPage;
|
|
|
|
if(nPageTotal<=1)
|
|
{
|
|
pCommonData->ReleaseListCaptureImage();
|
|
return;
|
|
}
|
|
|
|
if(nPageDisplay >= nPageTotal)
|
|
{
|
|
nPageDisplay = nPageTotal - 1;
|
|
}
|
|
nIndexCurrent = nPageDisplay * nItemPerPage;
|
|
|
|
if(nIndexCurrent!=m_nIndexCurrent)
|
|
{
|
|
int nCurrentPos;
|
|
nCurrentPos = (int)( (((float)nPageDisplay / (float)(nPageTotal-1)) * fMaxRange) + 0.5f);
|
|
//qDebug() << "PageDisplay: " << nPageDisplay << " PageTotal: " << nPageTotal << " nCurrentPos: " << nCurrentPos;
|
|
|
|
pSlideBar->setValue(nCurrentPos);
|
|
}
|
|
}
|
|
|
|
void FormCapture::SingleUp()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
int nItem = 20;
|
|
int nIndexCurrent = m_nIndexCurrent;
|
|
|
|
int nTotalImage = 0;
|
|
int i=0;
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[i];
|
|
if(pCaptureImage->m_bDelete==false)
|
|
{
|
|
nTotalImage++;
|
|
}
|
|
}
|
|
nItem = nTotalImage;
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
float fMaxRange = 299;
|
|
|
|
int nPageDisplay = 0;
|
|
int nPageTotal = 0;
|
|
int nItemPerPage = m_nItemPerPage;
|
|
|
|
SSlideBar* pSlideBar = NULL;
|
|
|
|
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
pSlideBar = ui->horizontalScrollBar;
|
|
}
|
|
else if(nDisplayType==SDISPLAY_1920X1080)
|
|
{
|
|
pSlideBar = ui->verticalScrollBar;
|
|
}
|
|
|
|
nIndexCurrent -= nItemPerPage;
|
|
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
|
|
nPageDisplay = nIndexCurrent / nItemPerPage;
|
|
|
|
if(nPageTotal<=1)
|
|
{
|
|
pCommonData->ReleaseListCaptureImage();
|
|
return;
|
|
}
|
|
|
|
if(nPageDisplay < 0)
|
|
{
|
|
nPageDisplay = 0;
|
|
}
|
|
nIndexCurrent = nPageDisplay * nItemPerPage;
|
|
|
|
if(nIndexCurrent!=m_nIndexCurrent)
|
|
{
|
|
int nCurrentPos;
|
|
nCurrentPos = (int)( (((float)nPageDisplay / (float)(nPageTotal-1)) * fMaxRange) + 0.5f);
|
|
//qDebug() << "PageDisplay: " << nPageDisplay << " PageTotal: " << nPageTotal << " nCurrentPos: " << nCurrentPos;
|
|
pSlideBar->setValue(nCurrentPos);
|
|
}
|
|
}
|
|
|
|
void FormCapture::on_pushButton_EXIT_clicked()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
m_Timer.stop();
|
|
|
|
usleep(100*1000);
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
QRTSPThread* pThreadRTSP = pCommonData->GetThreadRTSP();
|
|
|
|
int nCaptureMode = 0;
|
|
|
|
nCaptureMode = pThreadRTSP->GetCaptureMode();
|
|
if(nCaptureMode==1) // Capture Video
|
|
{
|
|
if(ui->pushButton_VID->isEnabled()==true && ui->pushButton_VID->isChecked()==true)
|
|
{
|
|
VideoSaveEnd();
|
|
}
|
|
else
|
|
{
|
|
int a=0;
|
|
}
|
|
|
|
|
|
ui->pushButton_VID->setChecked(false);
|
|
ui->pushButton_VID->setEnabled(true);
|
|
ui->pushButton_VID->update();
|
|
|
|
}
|
|
|
|
pThreadRTSP->SetCaptureMode(2); // Background Streaming
|
|
|
|
pThreadRTSP->ChangeState(11);
|
|
|
|
if(pThreadRTSP->IsWorkingRTSP()==true)
|
|
{
|
|
pThreadRTSP->StopRTSP();
|
|
}
|
|
|
|
MainWindow::GetMainWindow()->ExitCapture();
|
|
}
|
|
|
|
QVideoWidget* FormCapture::GetVideoWidget()
|
|
{
|
|
return ui->widget_Video;
|
|
}
|
|
|
|
void FormCapture::on_pushButton_ACQ_clicked()
|
|
{
|
|
ui->pushButton_ACQ->setDisabled(true);
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
CAPTURE_IMAGE* pCaptureImage = NULL;
|
|
bool bIsCropMode = (bool)pCommonData->GetCropMode();
|
|
|
|
int nWidth = pCommonData->GetVideoWidth();
|
|
int nHeight = pCommonData->GetVideoHeight();
|
|
int nSaveWidth = pCommonData->GetVideoWidth();
|
|
int nSaveHeight = pCommonData->GetVideoHeight();
|
|
|
|
|
|
|
|
QVideoWidget* pVideoWidget = ui->widget_Video;
|
|
pVideoWidget->Lock();
|
|
{
|
|
uint8_t* pData = pVideoWidget->GetCaptureImage();
|
|
|
|
//SThreadImageSave* pThread = MainWindow::GetCommonData()->GetThreadCaptureImage();
|
|
//pThread->SetImageCapture(pData, 1920, 1080);
|
|
|
|
pCaptureImage = pCommonData->AddCaptureImage(pData, nWidth, nHeight, DISPLAY_IMAGE);
|
|
}
|
|
pVideoWidget->Unlock();
|
|
|
|
pCommonData->Beep(true);
|
|
m_TimerCaptureBeepSound.start(250);
|
|
m_TimerCaptureImage.start(10);
|
|
|
|
|
|
bool bCreateImageFile = false;
|
|
bCreateImageFile = pCommonData->ConvertCaptureImage(pCaptureImage, nSaveWidth, nSaveHeight);
|
|
if(bCreateImageFile==false)
|
|
{
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
|
|
vector<CAPTURE_IMAGE*>::iterator it;
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(it=pListCaptureImage->begin() ; it!=pListCaptureImage->end() ; ++it)
|
|
{
|
|
CAPTURE_IMAGE* pImageDisplay = *it;
|
|
if(pImageDisplay==pCaptureImage)
|
|
{
|
|
pListCaptureImage->erase(it);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
SAFE_DELETE(pCaptureImage);
|
|
return;
|
|
}
|
|
|
|
m_nCaptureImageCount++;
|
|
m_TimeCapture.restart();
|
|
|
|
|
|
/*
|
|
if(bIsCropMode==true)
|
|
{
|
|
*pCaptureImage->m_pImage = pCaptureImage->m_pImage->copy(QRect(242, 5, 1376, 992));
|
|
//SAFE_DELETE(pCaptureImage->m_pImageSmall);
|
|
//pCaptureImage->m_pImageSmall = new QImage;
|
|
*pCaptureImage->m_pImageSmall = pCaptureImage->m_pImage->scaled(pCaptureImage->m_pImage->width()/4, pCaptureImage->m_pImage->height()/4, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).copy();
|
|
|
|
}
|
|
*/
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
|
|
|
|
if(pCaptureImage!=NULL)
|
|
{
|
|
captureImage(pCaptureImage);
|
|
}
|
|
|
|
}
|
|
|
|
void FormCapture::captureImage(CAPTURE_IMAGE* pCaptureImage)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
ui->horizontalScrollBar->setValue(0);
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
bool bIsCropMode = (bool)pCommonData->GetCropMode();
|
|
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
int i=0;
|
|
int nIndex = 0;
|
|
|
|
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pImageDisplay = (*pListCaptureImage)[i];
|
|
if(pImageDisplay->m_nIndex==-1)
|
|
{
|
|
pImageDisplay->m_DateTime = QDateTime::currentDateTime();
|
|
|
|
if(pImageDisplay->m_strImageFilename.size()>0 && pImageDisplay->m_bSaveFile==false)
|
|
{
|
|
if(bIsCropMode==true)
|
|
{
|
|
*pImageDisplay->m_pImage = pImageDisplay->m_pImage->copy(QRect(242, 5, 1376, 992));
|
|
}
|
|
SAFE_DELETE(pImageDisplay->m_pImage);
|
|
SAFE_DELETE(pImageDisplay->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pImageDisplay->m_pImageCaptureColor);
|
|
}
|
|
}
|
|
pImageDisplay->m_nIndex = i+1;
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
UpdateViewer();
|
|
|
|
}
|
|
|
|
void FormCapture::captureVideo(CAPTURE_IMAGE* pCaptureImage)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
ui->horizontalScrollBar->setValue(0);
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
QRTSPThread* pThreadRTSP = pCommonData->GetThreadRTSP();
|
|
|
|
if(ui->pushButton_VID->isChecked()==true)
|
|
{
|
|
//Start Video Encoding
|
|
|
|
bool bStartVideoCapture = true;
|
|
|
|
if(pCommonData->IsAutoVideoCapture()==true)
|
|
{
|
|
if(m_nCaptureImageCount==1)
|
|
{
|
|
bStartVideoCapture = false;
|
|
}
|
|
}
|
|
|
|
if(bStartVideoCapture==true)
|
|
{
|
|
pCaptureImage->m_nType = DISPLAY_VIDEO;
|
|
pCommonData->SetEncodingVideo(true);
|
|
|
|
/*
|
|
pThreadRTSP->StopRTSP();
|
|
while(pThreadRTSP->IsWorkingRTSP()==true)
|
|
{
|
|
usleep(10);
|
|
}
|
|
usleep(100*1000);
|
|
*/
|
|
|
|
//pThreadRTSP->SaveFile(pCaptureImage->m_strVideoFilename);
|
|
|
|
|
|
if(pCaptureImage->m_pImage!=NULL && pCaptureImage->m_strImageFilename.size()>0)
|
|
{
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
//Stop Video Encoding
|
|
|
|
VideoSaveEnd();
|
|
}
|
|
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
int i=0;
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pImageDisplay = (*pListCaptureImage)[i];
|
|
pImageDisplay->m_nIndex = i+1;
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
|
|
UpdateViewer();
|
|
}
|
|
|
|
void FormCapture::Init()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
SThreadImageSave* pThreadImageSave = pCommonData->GetThreadCaptureImage();
|
|
//QRTSPThread* pThreadRTSP = pCommonData->GetThreadRTSP();
|
|
|
|
m_bExecStopRTSP = false;
|
|
m_bPrevConnectHDMI = false;
|
|
SetHDMICalbeConnect(m_bPrevConnectHDMI);
|
|
|
|
m_bEncodingVideo = false;
|
|
m_nCaptureImageCount = 0;
|
|
m_bSendBackground = false;
|
|
m_bAutoVideoCapture = false;
|
|
|
|
ui->horizontalSlider_Hue->hide();
|
|
ui->horizontalSlider_Saturation->hide();
|
|
|
|
ui->horizontalSlider_Hue->setRange(0, 100);
|
|
ui->horizontalSlider_Saturation->setRange(0, 100);
|
|
|
|
ui->horizontalSlider_Hue->setValue(50);
|
|
ui->horizontalSlider_Saturation->setValue(50);
|
|
|
|
m_bDisconnectCheck = false;
|
|
|
|
ui->pushButton_ACQ->setEnabled(true);
|
|
|
|
/*
|
|
if(pCommonData->IsAutoVideoCapture()==true)
|
|
{
|
|
ui->pushButton_VID->setChecked(true);
|
|
ui->pushButton_VID->setDisabled(true);
|
|
}
|
|
else
|
|
{
|
|
*/
|
|
ui->pushButton_VID->setChecked(false);
|
|
ui->pushButton_VID->setEnabled(true);
|
|
//}
|
|
|
|
|
|
|
|
int i=0;
|
|
for(i=0 ; i<3 ; i++)
|
|
{
|
|
FormCaptureImageSelect* pWidget = m_ListFormVerticalImageSelect[i];
|
|
pWidget->SetCaptureImage(NULL);
|
|
}
|
|
|
|
for(i=0 ; i<5 ; i++)
|
|
{
|
|
FormCaptureImageSelect* pWidget = m_ListFormHorizontalImageSelect[i];
|
|
pWidget->SetCaptureImage(NULL);
|
|
}
|
|
|
|
|
|
//pCommonData->ClearCaptureImage();
|
|
pThreadImageSave->ClearCaptureSaveToFile();
|
|
pThreadImageSave->ClearMissCapture();
|
|
pThreadImageSave->ChangeState(0x0);
|
|
if(pCommonData->IsActiveDetect()==true)
|
|
{
|
|
pThreadImageSave->SetExecuteDetect(true);
|
|
}
|
|
if(pCommonData->IsUseUSBBackup()==true)
|
|
{
|
|
pThreadImageSave->SetExecuteBackup(true);
|
|
}
|
|
|
|
pCommonData->SetEncodingVideo(false);
|
|
|
|
ui->frame_horizontalScrollBar->hide();
|
|
|
|
ui->frame_verticalScrollBar->hide();
|
|
|
|
ui->widget_Video->Init();
|
|
|
|
ui->label_LastCapture->hide();
|
|
|
|
ui->horizontalScrollBar->setRange(0, 299);
|
|
ui->horizontalScrollBar->setValue(0);
|
|
|
|
|
|
ui->checkBox_Detection->setChecked(false);
|
|
pCommonData->SetActiveDetect(false);
|
|
|
|
ui->widget_SelectImage->Init();
|
|
|
|
|
|
m_Timer.start();
|
|
m_TimerCaptureInfo.start();
|
|
|
|
ACQUISITION_INFO* pAcquisitionInfo = pCommonData->GetAcquisitionInfo();
|
|
SDATA_PATIENT* pInfoPatient = pAcquisitionInfo->GetPatientInfo();
|
|
|
|
if(pInfoPatient!=NULL)
|
|
{
|
|
ui->info_ID->setText(pInfoPatient->strPatientID);
|
|
ui->info_Name->setText(pInfoPatient->strPatientName);
|
|
QString strStudyInfo;
|
|
strStudyInfo = pAcquisitionInfo->GetStudyInfo()->strStudyDescription;
|
|
strStudyInfo += " ";
|
|
strStudyInfo += pAcquisitionInfo->GetPatientInfo()->strPatientAge;
|
|
strStudyInfo += " ";
|
|
strStudyInfo += pAcquisitionInfo->GetPatientInfo()->strPatientSex;
|
|
ui->label_StudyDescription->setText(strStudyInfo);
|
|
QString strPatientBirthDate = pInfoPatient->strPatientBirthDate;
|
|
if(strPatientBirthDate.size()==8)
|
|
{
|
|
strPatientBirthDate.insert(6, '/');
|
|
strPatientBirthDate.insert(4, '/');
|
|
}
|
|
ui->info_Birth->setText(strPatientBirthDate);
|
|
}
|
|
pCommonData->ReleaseAcquisitionInfo();
|
|
|
|
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
m_nItemPerPage = 5;
|
|
}
|
|
else
|
|
{
|
|
m_nItemPerPage = 3;
|
|
}
|
|
|
|
|
|
|
|
int nCountCaptureImage = 0;
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
nCountCaptureImage = pListCaptureImage->size();
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
if(nCountCaptureImage>0)
|
|
{
|
|
UpdateViewer();
|
|
}
|
|
|
|
m_nHandSwitchValue = 0;
|
|
m_nPrevHandSwitchValue = 0;
|
|
|
|
qDebug() << "271 Port Timer Start";
|
|
//m_TimeHandSwitchOn.start();
|
|
|
|
m_TimeCapture = QElapsedTimer();
|
|
|
|
|
|
|
|
m_nIndexCurrent = 0;
|
|
|
|
if(pCommonData->IsAutoCaptureSendDICOM()==true)
|
|
{
|
|
SThreadSendDICOM* pThreadSendDICOM = pCommonData->GetThreadSendDICOM();
|
|
|
|
if(pThreadSendDICOM!=NULL)
|
|
{
|
|
pThreadSendDICOM->Init();
|
|
pThreadSendDICOM->SetAutoSendImage();
|
|
m_bSendBackground = true;
|
|
}
|
|
else
|
|
{
|
|
m_bSendBackground = false;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
pThreadSendDICOM->SetAutoSendImage();
|
|
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
|
|
delete m_pDialogSendProgress;
|
|
m_pDialogSendProgress = NULL;
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
//bool bIsConnectHDMI = pCommonData->IsConnectHDMI();
|
|
//SetHDMICalbeConnect(bIsConnectHDMI);
|
|
|
|
|
|
|
|
|
|
m_pThreadWatchVideoLink->ChangeState(1);
|
|
|
|
|
|
usleep(500*1000);
|
|
m_TimerStartPipeLine.restart();
|
|
|
|
m_bDisconnectCheck = false;
|
|
m_bAutoVideoCapture = false;
|
|
m_bEncodingVideo = false;
|
|
m_bPrevConnectHDMI = false;
|
|
|
|
if(pCommonData->IsAutoVideoCapture()==true)
|
|
{
|
|
m_bEncodingVideo = true;
|
|
}
|
|
|
|
//qDebug() << "FormCapture: ChangeState(0)";
|
|
//pThreadRTSP->ChangeState(0);
|
|
qDebug() << "FormCapture: INIT Finished!";
|
|
|
|
}
|
|
|
|
void FormCapture::ExitCapture()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
|
|
m_pThreadWatchVideoLink->ChangeState(0);
|
|
|
|
MainWindow* pMainWindow = MainWindow::GetMainWindow();
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
SDatabase* pDatabase = NULL;
|
|
|
|
int i=0;
|
|
SThreadSendDICOM* pThreadSendDICOM = pCommonData->GetThreadSendDICOM();
|
|
|
|
QRTSPThread* pThreadRTSP = pCommonData->GetThreadRTSP();
|
|
|
|
if(pCommonData->IsAutoCaptureSendDICOM()==true)
|
|
{
|
|
m_bSendBackground = false;
|
|
int nTestCount = 0;
|
|
if(pThreadSendDICOM->GetCurrentState()&0x20)
|
|
{
|
|
pThreadSendDICOM->SetExitAutoSend();
|
|
}
|
|
|
|
while(pThreadSendDICOM->GetCurrentState()&0x20 && nTestCount<500)
|
|
{
|
|
usleep(1000*2);
|
|
nTestCount++;
|
|
}
|
|
|
|
if(nTestCount>=500)
|
|
{
|
|
int a=0;
|
|
}
|
|
|
|
vector<QString> listAutoSendCompleteFile = pThreadSendDICOM->GetListAutoSendCompleteFile();
|
|
if (!listAutoSendCompleteFile.empty())
|
|
{
|
|
// 1. 이 작업을 위한 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
SUTIL::SDatabase db(QString("AutoSendUpdate_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 2. 지역 인스턴스 'db'를 사용하여 트랜잭션을 관리합니다.
|
|
db.BeginTransaction();
|
|
for (const QString& strAutoSendCompleteFile : listAutoSendCompleteFile)
|
|
{
|
|
// 3. 이미 안전하게 리팩토링된 SendUpdateAcquisitionTemp 함수를 호출합니다.
|
|
db.SendUpdateAcquisitionTemp(strAutoSendCompleteFile);
|
|
}
|
|
db.Commit();
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed for auto send update.";
|
|
}
|
|
// 'db' 객체는 스코프가 끝나면 자동으로 소멸됩니다.
|
|
}
|
|
}
|
|
|
|
SThreadImageSave* pThreadImageSave = pCommonData->GetThreadCaptureImage();
|
|
if(pCommonData->IsActiveDetect()==true)
|
|
{
|
|
pThreadImageSave->SetExecuteDetect(false);
|
|
}
|
|
if(pCommonData->IsUseUSBBackup()==true)
|
|
{
|
|
pThreadImageSave->SetExecuteBackup(false);
|
|
while(pThreadImageSave->IsExecuteBackup()==true)
|
|
{
|
|
usleep(100*1000);
|
|
}
|
|
}
|
|
|
|
WriteDatabaseListCapture();
|
|
usleep(100*1000);
|
|
|
|
// 1. 이 작업을 위한 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
SUTIL::SDatabase db(QString("MergeTempData_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 2. 단일 함수 호출로 '병합'과 '정리' 작업을 모두 수행합니다.
|
|
// 리팩토링된 AddAcquisitionTempToImage 함수는 내부에 트랜잭션과
|
|
// AcquisitionTemp 테이블 정리 로직을 이미 포함하고 있습니다.
|
|
db.AddAcquisitionTempToImage();
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed for merging temp data.";
|
|
// 필요에 따라 오류 처리
|
|
}
|
|
|
|
usleep(10*1000);
|
|
//QProcess::execute("sync");
|
|
|
|
if(pCommonData->IsAutoExitCaptureSendDICOM()==true)
|
|
{
|
|
vector<QString> listFile;
|
|
ACQUISITION_INFO* pAcquisitionInfo = pCommonData->GetAcquisitionInfo();
|
|
int nStudyIndex = pAcquisitionInfo->GetSeriesInfo()->nStudyIndex;
|
|
pCommonData->ReleaseAcquisitionInfo();
|
|
|
|
|
|
if(pThreadSendDICOM!=NULL)
|
|
{
|
|
bool bExecuteSend = true;
|
|
|
|
bool bAutoRetry = true;
|
|
|
|
int nTryCount = 0;
|
|
|
|
bool bCacheWriteSuccess = false;
|
|
|
|
{
|
|
// 1. 재시도 루프에 진입하기 전에 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
// 이렇게 하면 루프 안에서 불필요하게 연결을 반복하지 않아 효율적입니다.
|
|
SUTIL::SDatabase db(QString("CacheWriteTask_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 2. 최대 3번까지, 그리고 성공하지 못했을 경우에만 루프를 실행합니다.
|
|
for (int i = 0; i < 3 && !bCacheWriteSuccess; i++)
|
|
{
|
|
// 3. 새로운 CacheWrite API를 호출합니다. 이제 bool 값을 반환합니다.
|
|
bCacheWriteSuccess = db.CacheWrite();
|
|
|
|
// 4. 실패했을 경우에만 대기 후 재시도합니다.
|
|
if (!bCacheWriteSuccess)
|
|
{
|
|
qWarning() << "CacheWrite failed. Retrying... (" << i + 1 << "/3)";
|
|
QThread::msleep(100); // 100ms 대기 후 재시도
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed for CacheWrite task.";
|
|
}
|
|
|
|
// 최종 성공 여부에 따라 후속 처리
|
|
if (bCacheWriteSuccess)
|
|
{
|
|
qDebug() << "Cache was successfully written to disk.";
|
|
}
|
|
else
|
|
{
|
|
qCritical() << "Failed to write cache to disk after 3 attempts.";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
QThread::usleep(100*1000);
|
|
|
|
{
|
|
// 1. 이 작업을 위한 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
SUTIL::SDatabase db(QString("GetSendListTask_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 2. 지역 인스턴스 'db'를 사용하여 안전하게 함수를 호출합니다.
|
|
// GetSendList 함수는 vector<QString>을 직접 반환합니다.
|
|
listFile = db.GetSendList(nStudyIndex);
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed for GetSendList task.";
|
|
// 필요에 따라 오류 처리
|
|
}
|
|
}
|
|
|
|
|
|
if(listFile.size()==0)
|
|
{
|
|
bExecuteSend = false;
|
|
}
|
|
|
|
while(bExecuteSend==true)
|
|
{
|
|
while(pThreadSendDICOM->GetCurrentState()&0x40)
|
|
{
|
|
usleep(100*1000);
|
|
}
|
|
|
|
if(nTryCount>1)
|
|
{
|
|
bAutoRetry = false;
|
|
}
|
|
|
|
int nSendCount = 0;
|
|
{
|
|
// 포인터가 아닌 값 타입의 리스트. 이 변수는 함수로부터 결과를 직접 받습니다.
|
|
QList<QStringList> listResponse;
|
|
|
|
// 1. 이 작업을 위한 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
SUTIL::SDatabase db(QString("GetExitSendListInfo_Task_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 2. 새로운 API를 호출합니다. 함수가 직접 결과 리스트 "값"을 반환합니다.
|
|
listResponse = db.GetExitSendListInfo(nStudyIndex);
|
|
|
|
// 3. count는 반환된 리스트의 .size()를 통해 얻습니다.
|
|
nSendCount = listResponse.size();
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed for GetExitSendListInfo task.";
|
|
// 필요에 따라 오류 처리
|
|
}
|
|
|
|
pThreadSendDICOM->SetSendImageList(listResponse);
|
|
}
|
|
|
|
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
delete m_pDialogSendProgress;
|
|
}
|
|
m_pDialogSendProgress = new DialogProgress(this);
|
|
|
|
m_pDialogSendProgress->Init(1);
|
|
m_pDialogSendProgress->SetAutoRetryDICOMSend(bAutoRetry);
|
|
m_pDialogSendProgress->exec();
|
|
|
|
{
|
|
vector<QString> listImageSendCompleteFile = pThreadSendDICOM->GetListImageSendCompleteFile();
|
|
|
|
if (!listImageSendCompleteFile.empty())
|
|
{
|
|
// 1. 이 작업을 위한 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
SUTIL::SDatabase db(QString("ImageSendUpdate_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 2. 새로운 이름의 트랜잭션 함수를 사용합니다.
|
|
db.BeginTransaction();
|
|
for (const QString& strImageSendCompleteFile : listImageSendCompleteFile)
|
|
{
|
|
// 3. 지역 인스턴스 'db'를 통해 안전하게 함수를 호출합니다.
|
|
db.SendUpdate(strImageSendCompleteFile);
|
|
}
|
|
db.Commit();
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed for image send update.";
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int nRet = m_pDialogSendProgress->result();
|
|
|
|
if(m_pDialogSendProgress->IsError()==false)
|
|
{
|
|
bExecuteSend = false;
|
|
}
|
|
else
|
|
{
|
|
if(nRet==QDialog::Rejected)
|
|
{
|
|
bExecuteSend = false;
|
|
}
|
|
}
|
|
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
delete m_pDialogSendProgress;
|
|
m_pDialogSendProgress = NULL;
|
|
}
|
|
|
|
//SDatabase::DeleteListReponse(listResponse);
|
|
|
|
nTryCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(pCommonData->IsUseNetworkBackupVideo()==true)
|
|
{
|
|
vector<QString>* pListExport = pCommonData->GetExportList();
|
|
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
|
|
for(i=pListCaptureImage->size()-1 ; i>=0 ; i--)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[i];
|
|
if(pCaptureImage->m_nType==DISPLAY_VIDEO)
|
|
{
|
|
QString strImageFilename = pCaptureImage->m_strImageFilename;
|
|
QFileInfo fileCheck(strImageFilename);
|
|
if(fileCheck.exists()==true)
|
|
{
|
|
QString strPath = fileCheck.path();
|
|
QString strFilename = fileCheck.fileName();
|
|
|
|
QStringList filter;
|
|
if(strFilename.size()>0)
|
|
{
|
|
strFilename = strFilename.left(strFilename.size()-4);
|
|
filter << strFilename + QString("*") + MOVIE_FILE_EXTENSION;
|
|
}
|
|
|
|
QDirIterator it(strPath, filter, QDir::AllEntries | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
|
|
QStringList listMovieFile;
|
|
while(it.hasNext()==true)
|
|
{
|
|
QString strVideoFilename = it.next();
|
|
listMovieFile << strVideoFilename;
|
|
pListExport->push_back(strVideoFilename);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
|
|
if(pListExport->size()>0)
|
|
{
|
|
/*
|
|
SambaClient* pSambaClient = MainWindow::GetCommonData()->GetSambaClient();
|
|
|
|
bool bMount = pSambaClient->IsMount();
|
|
if(bMount==true)
|
|
{
|
|
BackupNetworkShareFolder("");
|
|
}
|
|
*/
|
|
BackupNetworkShareFolder("");
|
|
|
|
pListExport->clear();
|
|
}
|
|
}
|
|
|
|
m_TimerCaptureInfo.stop();
|
|
ui->widget_Video->Exit();
|
|
|
|
m_nHandSwitchValue = 0;
|
|
m_nPrevHandSwitchValue = 0;
|
|
|
|
|
|
|
|
|
|
//QProcess::execute("sync");
|
|
|
|
//pCommonData->GetThreadCaptureImage()->ChangeState(0);
|
|
pCommonData->ClearCaptureImage();
|
|
|
|
if(pThreadRTSP->IsWorkingRTSP()==true)
|
|
{
|
|
pThreadRTSP->ChangeState(11);
|
|
pThreadRTSP->StopRTSP();
|
|
usleep(10*1000);
|
|
}
|
|
|
|
QElapsedTimer nCheckTime;
|
|
nCheckTime.restart();
|
|
while(pThreadRTSP->IsWorkingRTSP()==true)
|
|
{
|
|
usleep(100);
|
|
if(nCheckTime.elapsed() > 7*1000)
|
|
{
|
|
pMainWindow->SetDisplayError("Cannot Disconnect VideoLink!");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormCapture::on_pushButton_VID_clicked()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
QRTSPThread* pThreadRTSP = pCommonData->GetThreadRTSP();
|
|
|
|
if(pThreadRTSP->IsVideoLink()==false || pThreadRTSP->IsWorkingRTSP()==false)
|
|
{
|
|
ui->pushButton_VID->setChecked(false);
|
|
return;
|
|
}
|
|
|
|
if(pCommonData->IsEncodingVideo()==false)
|
|
{
|
|
if(pThreadRTSP->IsVideoLink()==true && pThreadRTSP->IsWorkingRTSP()==true)
|
|
{
|
|
m_nCaptureImageCount++;
|
|
QString strVideoFilename = pCommonData->GetNewFilename(DISPLAY_VIDEO);
|
|
pThreadRTSP->SetCaptureMode(1);
|
|
pThreadRTSP->SaveFile(strVideoFilename);
|
|
|
|
VideoButtonChange(true);
|
|
m_TimeCaptureVideo.restart();
|
|
m_bEncodingVideo = true;
|
|
}
|
|
else
|
|
{
|
|
ui->pushButton_VID->setChecked(false);
|
|
m_bEncodingVideo = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//m_Timer.stop();
|
|
|
|
VideoSaveEnd();
|
|
|
|
VideoButtonChange(false);
|
|
m_bEncodingVideo = false;
|
|
}
|
|
m_bDisconnectCheck = false;
|
|
|
|
|
|
}
|
|
|
|
void FormCapture::VideoSaveEnd()
|
|
{
|
|
// --- 1. 기본 준비 (기존 코드와 동일) ---
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
QRTSPThread* pThreadRTSP = pCommonData->GetThreadRTSP();
|
|
|
|
pThreadRTSP->SaveEnd();
|
|
pThreadRTSP->SetCaptureMode(0);
|
|
pCommonData->SetEncodingVideo(false);
|
|
|
|
QString strVideoFile = pThreadRTSP->GetVideoFilename(); // 예: /path/to/video_12345.mp4
|
|
|
|
// --- 2. DB 인스턴스 생성 및 트랜잭션 시작 ---
|
|
SUTIL::SDatabase db(QString("VideoSaveEnd_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") != 0) {
|
|
qWarning() << "DB open failed in VideoSaveEnd.";
|
|
return;
|
|
}
|
|
|
|
if (!db.BeginTransaction()) {
|
|
qWarning() << "Failed to begin transaction in VideoSaveEnd.";
|
|
return;
|
|
}
|
|
|
|
// --- 3. 파일 시스템에서 분할된 비디오 파일 목록 가져오기 (기존 코드와 동일) ---
|
|
QFileInfo fi(strVideoFile);
|
|
QString strPath = fi.path();
|
|
QList<QString> listFileLocation;
|
|
|
|
QString strBaseFilename = fi.fileName();
|
|
if (strBaseFilename.contains(MOVIE_FILE_EXTENSION)) {
|
|
strBaseFilename.replace(MOVIE_FILE_EXTENSION, "");
|
|
// RTSP 스레드가 저장하는 파일 이름 패턴에 맞게 와일드카드 적용
|
|
// 예: "video_12345_*"
|
|
QString strFilenamePattern = strBaseFilename + "*" + MOVIE_FILE_EXTENSION;
|
|
|
|
QDirIterator itDir(strPath, {strFilenamePattern}, QDir::Files);
|
|
while(itDir.hasNext()) {
|
|
listFileLocation.push_back(itDir.next());
|
|
}
|
|
|
|
// 파일 이름을 숫자로 인식하여 올바르게 정렬
|
|
QCollator collator;
|
|
collator.setNumericMode(true);
|
|
std::sort(listFileLocation.begin(), listFileLocation.end(), collator);
|
|
}
|
|
|
|
// --- 4. 데이터베이스 작업 ---
|
|
bool bSuccess = true;
|
|
QList<QStringList*> listResult;
|
|
|
|
// LIKE 절에 사용할 검색용 파일 경로 (확장자 제거)
|
|
QString searchFileLocation = strVideoFile;
|
|
searchFileLocation.replace(MOVIE_FILE_EXTENSION, "");
|
|
|
|
QString selectQuery = "SELECT `SeriesIndex`, `ImageNumber`, `ImageInstanceUID`, `StudyIndex`, `AcquisitionDate`, `AcquisitionTime`, "
|
|
"`ContentDate`, `ContentTime`, `AcquisitionNumber`, `InstanceNumber`, `PatientOrientation`, `ImageLaterality`, "
|
|
"`ImageComments` FROM AcquisitionTemp WHERE FileLocation LIKE ? AND FileType=1;";
|
|
|
|
db.ExecuteQuery(selectQuery, { QString("%%1%").arg(searchFileLocation) }, listResult);
|
|
|
|
if (!listResult.isEmpty())
|
|
{
|
|
// 4-1. 원본 비디오 레코드 정보 파싱
|
|
const QStringList* pListData = listResult.at(0);
|
|
QString strSeriesIndex = pListData->at(0);
|
|
QString strImageNumber = pListData->at(1);
|
|
QString strImageInstanceUID = pListData->at(2);
|
|
QString strStudyIndex = pListData->at(3);
|
|
QString strAcquisitionDate = pListData->at(4);
|
|
QString strAcquisitionTime = pListData->at(5);
|
|
QString strContentDate = pListData->at(6);
|
|
QString strContentTime = pListData->at(7);
|
|
QString strAcquisitionNumber = pListData->at(8);
|
|
QString strInstanceNumber = pListData->at(9);
|
|
QString strPatientOrientation = pListData->at(10);
|
|
QString strImageLaterality = pListData->at(11);
|
|
QString strImageComments = pListData->at(12);
|
|
|
|
QSqlDatabase qdb = QSqlDatabase::database(db.connectionName());
|
|
|
|
// 4-2. 루프 밖에서 쿼리 미리 준비 (성능 향상)
|
|
QSqlQuery updateQuery(qdb);
|
|
updateQuery.prepare("UPDATE AcquisitionTemp SET FileLocation = ? WHERE FileLocation = ?;");
|
|
|
|
QSqlQuery insertQuery(qdb);
|
|
insertQuery.prepare("INSERT INTO AcquisitionTemp(`SeriesIndex`, `ImageNumber`, `ImageInstanceUID`, `FileLocation`, `StudyIndex`, "
|
|
"`AcquisitionDate`, `AcquisitionTime`, `ContentDate`, `ContentTime`, `AcquisitionNumber`, `InstanceNumber`, "
|
|
"`PatientOrientation`, `ImageLaterality`, `ImageComments`, `FileType`) "
|
|
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1);");
|
|
|
|
// 4-3. 파일 목록을 순회하며 DB 업데이트 또는 삽입
|
|
for (int i = 0; i < listFileLocation.size(); ++i)
|
|
{
|
|
QString strTmpFileLocation = listFileLocation.at(i);
|
|
if (i == 0) {
|
|
// 첫 번째 파일은 기존 레코드의 파일 경로를 업데이트
|
|
updateQuery.addBindValue(strTmpFileLocation);
|
|
updateQuery.addBindValue(strVideoFile); // 원본 임시 파일 경로
|
|
if (!updateQuery.exec()) {
|
|
qWarning() << "VideoSaveEnd UPDATE failed:" << updateQuery.lastError().text();
|
|
bSuccess = false;
|
|
break;
|
|
}
|
|
} else {
|
|
// 두 번째 이후 파일들은 새로운 레코드로 삽입
|
|
QString strNewImageInstanceUID = QString("%1.%2").arg(strImageInstanceUID).arg(i + 1);
|
|
|
|
insertQuery.addBindValue(strSeriesIndex.toInt());
|
|
insertQuery.addBindValue(strImageNumber.toInt());
|
|
insertQuery.addBindValue(strNewImageInstanceUID);
|
|
insertQuery.addBindValue(strTmpFileLocation);
|
|
insertQuery.addBindValue(strStudyIndex.toInt());
|
|
insertQuery.addBindValue(strAcquisitionDate);
|
|
insertQuery.addBindValue(strAcquisitionTime);
|
|
insertQuery.addBindValue(strContentDate);
|
|
insertQuery.addBindValue(strContentTime);
|
|
insertQuery.addBindValue(strAcquisitionNumber.toInt());
|
|
insertQuery.addBindValue(strInstanceNumber.toInt());
|
|
insertQuery.addBindValue(strPatientOrientation);
|
|
insertQuery.addBindValue(strImageLaterality);
|
|
insertQuery.addBindValue(strImageComments);
|
|
|
|
if (!insertQuery.exec()) {
|
|
qWarning() << "VideoSaveEnd INSERT failed:" << insertQuery.lastError().text();
|
|
bSuccess = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SUTIL::SDatabase::DeleteListReponse(listResult);
|
|
|
|
// --- 5. 트랜잭션 완료 ---
|
|
if (bSuccess) {
|
|
db.Commit();
|
|
qDebug() << "VideoSaveEnd: Successfully processed" << listFileLocation.size() << "video files.";
|
|
} else {
|
|
db.Rollback();
|
|
qWarning() << "VideoSaveEnd: An error occurred. Transaction rolled back.";
|
|
}
|
|
// 이 함수의 끝에서 'db' 객체는 자동으로 소멸됩니다.
|
|
}
|
|
|
|
void FormCapture::VideoButtonChange(bool bEncodingVideo)
|
|
{
|
|
if(bEncodingVideo==true)
|
|
{
|
|
ui->pushButton_VID->setDisabled(true);
|
|
ui->pushButton_VID->setChecked(true);
|
|
ui->pushButton_VID->update();
|
|
|
|
m_TimeCapture.restart();
|
|
m_TimerStartPipeLine.restart();
|
|
|
|
m_bAutoVideoCapture = false;
|
|
|
|
m_TimerCaptureVideo.start(3000);
|
|
}
|
|
else
|
|
{
|
|
ui->pushButton_VID->setChecked(false);
|
|
ui->pushButton_VID->update();
|
|
update();
|
|
|
|
ui->pushButton_VID->setDisabled(true);
|
|
m_TimerCaptureVideo.start(3000);
|
|
|
|
//m_Timer.start();
|
|
m_TimerStartPipeLine.restart();
|
|
}
|
|
}
|
|
|
|
|
|
void FormCapture::valueChangedScrollBarVertical(int value)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM(QString::number(value));
|
|
int nTotalImage = 0;
|
|
int i=0;
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[i];
|
|
if(pCaptureImage->m_bDelete==false)
|
|
{
|
|
nTotalImage++;
|
|
}
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
|
|
int nItem = nTotalImage;
|
|
|
|
float fMaxItem = nItem;
|
|
float fMaxRange = 299;
|
|
int nItemIndex = (((float)value/fMaxRange) * fMaxItem + 0.5f);
|
|
|
|
int nPageDisplay = 0;
|
|
int nPageTotal = 0;
|
|
int nItemPerPage = m_nItemPerPage;
|
|
|
|
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
|
|
}
|
|
else if(nDisplayType==SDISPLAY_1920X1080)
|
|
{
|
|
|
|
}
|
|
|
|
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
|
|
nPageDisplay = ( ((float)value / fMaxRange) * (nPageTotal-1) + 0.5f );
|
|
|
|
if(nPageTotal<=1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(nPageDisplay >= nPageTotal)
|
|
{
|
|
nPageDisplay = nPageTotal-1;
|
|
}
|
|
|
|
nItemIndex = nPageDisplay * nItemPerPage;
|
|
|
|
m_nCurrentPos = value;
|
|
|
|
if(m_nIndexCurrent!=nItemIndex)
|
|
{
|
|
m_nIndexCurrent = nItemIndex;
|
|
UpdateViewer();
|
|
}
|
|
}
|
|
|
|
void FormCapture::valueChangedScrollBarHorizontal(int value)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM(QString::number(value));
|
|
int nTotalImage = 0;
|
|
int i=0;
|
|
//qDebug() << value;
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[i];
|
|
if(pCaptureImage->m_bDelete==false)
|
|
{
|
|
nTotalImage++;
|
|
}
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
int nItem = nTotalImage;
|
|
|
|
float fMaxItem = nItem;
|
|
float fMaxRange = 299;
|
|
int nItemIndex = (((float)value/fMaxRange) * fMaxItem + 0.5f);
|
|
|
|
int nPageDisplay = 0;
|
|
int nPageTotal = 0;
|
|
int nItemPerPage = m_nItemPerPage;
|
|
|
|
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
|
|
}
|
|
else if(nDisplayType==SDISPLAY_1920X1080)
|
|
{
|
|
|
|
}
|
|
|
|
nPageTotal = ((nItem-1) / nItemPerPage) + 1;
|
|
nPageDisplay = ( ((float)value / fMaxRange) * (nPageTotal-1) + 0.5f );
|
|
|
|
if(nPageTotal<=1)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(nPageDisplay >= nPageTotal)
|
|
{
|
|
nPageDisplay = nPageTotal-1;
|
|
}
|
|
|
|
nItemIndex = nPageDisplay * nItemPerPage;
|
|
|
|
m_nCurrentPos = value;
|
|
|
|
if(m_nIndexCurrent!=nItemIndex)
|
|
{
|
|
m_nIndexCurrent = nItemIndex;
|
|
UpdateViewer();
|
|
}
|
|
}
|
|
|
|
void FormCapture::UpdateViewer()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
int nIndex = 0;
|
|
int nDisplayNumber = m_nItemPerPage;
|
|
int i=0;
|
|
|
|
int nTotalImage = 0;
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(i=0 ; i<pListCaptureImage->size() ; i++)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[i];
|
|
if(pCaptureImage->m_bDelete==false)
|
|
{
|
|
nTotalImage++;
|
|
}
|
|
}
|
|
|
|
int nDisplayType = MainWindow::GetCommonData()->GetDisplayType();
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
for(i=0 ; i<nDisplayNumber ; i++)
|
|
{
|
|
FormCaptureImageSelect* pForm = NULL;
|
|
|
|
pForm = m_ListFormHorizontalImageSelect[nIndex];
|
|
|
|
int nDisplayIndex = (nTotalImage-1) - (m_nIndexCurrent+nIndex);
|
|
if(nDisplayIndex<pListCaptureImage->size() && nDisplayIndex>=0)
|
|
{
|
|
CAPTURE_IMAGE* pImageSelect = NULL;
|
|
if(pListCaptureImage->size() > nDisplayIndex)
|
|
{
|
|
int j=0;
|
|
int nIndexTest = 0;
|
|
for(j=0 ; j<pListCaptureImage->size() ; j++)
|
|
{
|
|
CAPTURE_IMAGE* pCaptureImage = (*pListCaptureImage)[j];
|
|
if(pCaptureImage->m_bDelete==false)
|
|
{
|
|
if(nDisplayIndex==nIndexTest)
|
|
{
|
|
pImageSelect = pCaptureImage;
|
|
pImageSelect->m_nIndex = nIndexTest + 1;
|
|
break;
|
|
}
|
|
nIndexTest++;
|
|
}
|
|
}
|
|
//pImageSelect = (*pListCaptureImage)[nDisplayIndex];
|
|
}
|
|
|
|
pForm->SetCaptureImage(pImageSelect);
|
|
}
|
|
else
|
|
{
|
|
pForm->SetCaptureImage(NULL);
|
|
}
|
|
|
|
pForm->update();
|
|
nIndex++;
|
|
}
|
|
|
|
ui->verticalLayoutWidget->show();
|
|
ui->verticalLayout->update();
|
|
if(pListCaptureImage->size()>m_nItemPerPage)
|
|
{
|
|
ui->frame_horizontalScrollBar->show();
|
|
}
|
|
else
|
|
{
|
|
ui->frame_horizontalScrollBar->hide();
|
|
}
|
|
}
|
|
else if(nDisplayType==SDISPLAY_1920X1080)
|
|
{
|
|
for(i=0 ; i<nDisplayNumber ; i++)
|
|
{
|
|
FormCaptureImageSelect* pForm = NULL;
|
|
|
|
pForm = m_ListFormVerticalImageSelect[nIndex];
|
|
|
|
int nDisplayIndex = (nTotalImage-1) - (m_nIndexCurrent+nIndex);
|
|
if(nDisplayIndex<pListCaptureImage->size() && nDisplayIndex>=0)
|
|
{
|
|
CAPTURE_IMAGE* pImageSelect = NULL;
|
|
if(pListCaptureImage->size() > nDisplayIndex)
|
|
{
|
|
pImageSelect = (*pListCaptureImage)[nDisplayIndex];
|
|
}
|
|
|
|
pForm->SetCaptureImage(pImageSelect);
|
|
}
|
|
else
|
|
{
|
|
pForm->SetCaptureImage(NULL);
|
|
}
|
|
|
|
pForm->update();
|
|
nIndex++;
|
|
}
|
|
|
|
ui->verticalLayoutWidget->show();
|
|
ui->verticalLayout->update();
|
|
if(pListCaptureImage->size()>m_nItemPerPage)
|
|
{
|
|
ui->frame_verticalScrollBar->show();
|
|
}
|
|
else
|
|
{
|
|
ui->frame_verticalScrollBar->hide();
|
|
}
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void FormCapture::wheelEvent(QWheelEvent *event)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
int nDelta = event->delta();
|
|
if(nDelta<0)
|
|
{
|
|
SingleDown();
|
|
}
|
|
else if(nDelta>0)
|
|
{
|
|
SingleUp();
|
|
}
|
|
}
|
|
|
|
void FormCapture::CheckVideoDevice()
|
|
{
|
|
QGstreamerPlayer* pPlayer = NULL;
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
QRTSPThread* pRTSPThread = pCommonData->GetThreadRTSP();
|
|
QVideoWidget* pVideoWidget = ui->widget_Video;
|
|
bool bHDMI = true;
|
|
QElapsedTimer nCheckTime;
|
|
|
|
pPlayer = pRTSPThread->GetGstreamerPlayer();
|
|
nCheckTime.start();
|
|
|
|
if(pPlayer==NULL)
|
|
{
|
|
usleep(100);
|
|
return;
|
|
}
|
|
|
|
bool bPlayerCleanQueue = false;
|
|
|
|
//Existing Thread of Video Watching Link
|
|
if(m_pThreadWatchVideoLink!=NULL)
|
|
{
|
|
bHDMI = m_pThreadWatchVideoLink->IsConnectHDMI();
|
|
|
|
if(bHDMI==false)
|
|
{
|
|
m_bDisconnectCheck = true;
|
|
if(pRTSPThread->IsVideoLink()==true)
|
|
{
|
|
//bHDMI = true;
|
|
}
|
|
}
|
|
|
|
if(bHDMI!=m_bPrevConnectHDMI)
|
|
{
|
|
SetHDMICalbeConnect(bHDMI);
|
|
|
|
if(bHDMI==true)
|
|
{
|
|
m_bExecStopRTSP = false;
|
|
}
|
|
|
|
m_bPrevConnectHDMI = bHDMI;
|
|
usleep(100);
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if(m_bEncodingVideo==true)
|
|
{
|
|
if(pRTSPThread->IsWorkingRTSP()==true && pRTSPThread->GetCaptureMode()==1)
|
|
{
|
|
qint64 nTimeEncodeVideo = m_TimeCaptureVideo.elapsed();
|
|
if(nTimeEncodeVideo < 3 * 1000)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//Video Disconnected where Encoding
|
|
if(m_bDisconnectCheck==true)
|
|
{
|
|
usleep(100);
|
|
|
|
VideoSaveEnd();
|
|
|
|
VideoButtonChange(false);
|
|
m_bDisconnectCheck = false;
|
|
m_bEncodingVideo = true;
|
|
|
|
bPlayerCleanQueue = true;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
//Save Database when Video Encoding
|
|
if(m_bAutoVideoCapture==false && pRTSPThread->GetCaptureMode()==1)
|
|
{
|
|
if(pRTSPThread->IsWorkingRTSP()==true && pRTSPThread->IsVideoLink()==true)
|
|
{
|
|
int nWidth = 1920;
|
|
int nHeight = 1080;
|
|
CAPTURE_IMAGE* pCaptureImage = NULL;
|
|
|
|
m_bAutoVideoCapture = true;
|
|
m_nCaptureImageCount++;
|
|
m_TimeCapture.restart();
|
|
|
|
pCommonData->SetEncodingVideo(true);
|
|
|
|
QString strVideoFilename = pCommonData->GetThreadRTSP()->GetVideoFilename();
|
|
|
|
uint8_t* pData = NULL;
|
|
|
|
if(pVideoWidget->Lock()==true)
|
|
{
|
|
pData = pVideoWidget->GetCaptureImage();
|
|
}
|
|
pVideoWidget->Unlock();
|
|
|
|
pCaptureImage = pCommonData->AddCaptureImage(pData, nWidth, nHeight, DISPLAY_VIDEO);
|
|
|
|
QThread::usleep(10*1000);
|
|
|
|
pCaptureImage->m_strVideoFilename = strVideoFilename;
|
|
|
|
bool bCreateImageFile = false;
|
|
bCreateImageFile = pCommonData->ConvertCaptureImage(pCaptureImage, nWidth, nHeight);
|
|
|
|
pCaptureImage->m_bSaveFile = true;
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
|
|
if(pCaptureImage!=NULL)
|
|
{
|
|
captureVideo(pCaptureImage);
|
|
}
|
|
}
|
|
}
|
|
|
|
int nVideoTime = pRTSPThread->GetVideoLinkTime();
|
|
if(pPlayer->IsPipeStart()==true)
|
|
{
|
|
if(nVideoTime>3*1000 && bHDMI==false)
|
|
//if(bHDMI==false)
|
|
{
|
|
/*
|
|
pRTSPThread->StopRTSP();
|
|
usleep(100);
|
|
|
|
bPlayerCleanQueue = true;
|
|
|
|
nCheckTime.restart();
|
|
while(pRTSPThread->IsWorkingRTSP()==true)
|
|
{
|
|
usleep(100);
|
|
if(nCheckTime.elapsed() > 100)
|
|
{
|
|
pRTSPThread->StopRTSP();
|
|
nCheckTime.restart();
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
//GStreamer PipeLine is Starting and "Video Link is loss"
|
|
if(pRTSPThread->IsVideoLink()==true)
|
|
{
|
|
if(m_bEncodingVideo==true && bHDMI==true)
|
|
{
|
|
if(pRTSPThread->IsWorkingRTSP()==true && nVideoTime>3*1000)
|
|
{
|
|
int a=0;
|
|
}
|
|
if(pRTSPThread->GetCaptureMode()==0 && nVideoTime>3*1000)
|
|
{
|
|
if(ui->pushButton_VID->isEnabled()==true && ui->pushButton_VID->isChecked()==false)
|
|
{
|
|
m_nCaptureImageCount++;
|
|
QString strVideoFilename = pCommonData->GetNewFilename(DISPLAY_VIDEO);
|
|
pRTSPThread->SetCaptureMode(1);
|
|
pRTSPThread->SaveFile(strVideoFilename);
|
|
|
|
VideoButtonChange(true);
|
|
m_TimeCaptureVideo.restart();
|
|
m_bAutoVideoCapture = false;
|
|
}
|
|
}
|
|
}
|
|
m_TimerStartPipeLine.restart();
|
|
}
|
|
}
|
|
|
|
if(pRTSPThread->IsVideoLink()==true && pRTSPThread->IsWorkingRTSP()==true)
|
|
{
|
|
m_bDisconnectCheck = false;
|
|
}
|
|
}
|
|
|
|
void FormCapture::CheckVideoDevice_old()
|
|
{
|
|
QGstreamerPlayer* pPlayer = NULL;
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
QRTSPThread* pRTSPThread = pCommonData->GetThreadRTSP();
|
|
|
|
bool bHDMI = true;
|
|
QElapsedTimer nCheckTime;
|
|
|
|
nCheckTime.start();
|
|
|
|
//Video Watching Link
|
|
if(m_pThreadWatchVideoLink!=NULL)
|
|
{
|
|
bHDMI = m_pThreadWatchVideoLink->IsConnectHDMI();
|
|
|
|
if(bHDMI==false)
|
|
{
|
|
m_bDisconnectCheck = true;
|
|
if(pRTSPThread->IsVideoLink()==true)
|
|
{
|
|
//bHDMI = true;
|
|
}
|
|
}
|
|
|
|
if(bHDMI!=m_bPrevConnectHDMI)
|
|
{
|
|
SetHDMICalbeConnect(bHDMI);
|
|
|
|
usleep(100*1000);
|
|
}
|
|
}
|
|
|
|
|
|
if(m_bEncodingVideo==true)
|
|
{
|
|
qint64 nTimeEncodeVideo = m_TimeCaptureVideo.elapsed();
|
|
if(nTimeEncodeVideo < 3 * 1000)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//Video Disconnected where Encoding
|
|
if(m_bDisconnectCheck==true)
|
|
{
|
|
//Video Encoding On
|
|
if(pRTSPThread->IsError()==false)
|
|
{
|
|
pRTSPThread->SaveEnd();
|
|
|
|
qDebug() << "StopRTSP: Start";
|
|
pRTSPThread->StopRTSP();
|
|
usleep(100*1000);
|
|
|
|
ui->widget_Video->Lock();
|
|
{
|
|
ui->widget_Video->ClearQueueData();
|
|
ui->widget_Video->SetChangeTexture(true);
|
|
ui->widget_Video->UpdateTexture();
|
|
}
|
|
ui->widget_Video->Unlock();
|
|
|
|
nCheckTime.restart();
|
|
while(pRTSPThread->IsWorkingRTSP()==true)
|
|
{
|
|
usleep(100);
|
|
if(nCheckTime.elapsed() > 7*1000)
|
|
{
|
|
break;
|
|
}
|
|
|
|
}
|
|
qDebug() << "StopRTSP: Finish";
|
|
}
|
|
else
|
|
{
|
|
//Video Encoding Off
|
|
usleep(1000*10);
|
|
}
|
|
|
|
VideoSaveEnd();
|
|
|
|
VideoButtonChange(false);
|
|
m_bDisconnectCheck = false;
|
|
m_bEncodingVideo = false;
|
|
|
|
ui->widget_Video->Lock();
|
|
{
|
|
ui->widget_Video->ClearQueueData();
|
|
ui->widget_Video->SetChangeTexture(true);
|
|
ui->widget_Video->UpdateTexture();
|
|
}
|
|
ui->widget_Video->Unlock();
|
|
}
|
|
}
|
|
|
|
//Save Database when Video Encoding
|
|
if(m_bAutoVideoCapture==false && pRTSPThread->GetCaptureMode()==1)
|
|
{
|
|
if(pRTSPThread->IsWorkingRTSP()==true)
|
|
{
|
|
if(pRTSPThread->IsVideoLink()==true)
|
|
{
|
|
m_bAutoVideoCapture = true;
|
|
m_nCaptureImageCount++;
|
|
|
|
QThread::usleep(10*1000);
|
|
m_TimeCapture.restart();
|
|
|
|
pCommonData->SetEncodingVideo(true);
|
|
|
|
QString strVideoFilename = pCommonData->GetThreadRTSP()->GetVideoFilename();
|
|
CAPTURE_IMAGE* pCaptureImage = NULL;
|
|
|
|
{
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
|
|
int nWidth = 1920;
|
|
int nHeight = 1080;
|
|
|
|
QVideoWidget* pVideoWidget = ui->widget_Video;
|
|
pVideoWidget->Lock();
|
|
{
|
|
uint8_t* pData = pVideoWidget->GetCaptureImage();
|
|
pCaptureImage = pCommonData->AddCaptureImage(pData, nWidth, nHeight, DISPLAY_VIDEO);
|
|
}
|
|
pVideoWidget->Unlock();
|
|
|
|
pCaptureImage->m_strVideoFilename = strVideoFilename;
|
|
|
|
bool bCreateImageFile = false;
|
|
bCreateImageFile = pCommonData->ConvertCaptureImage(pCaptureImage, nWidth, nHeight);
|
|
|
|
pCaptureImage->m_bSaveFile = true;
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
}
|
|
|
|
if(pCaptureImage!=NULL)
|
|
{
|
|
captureVideo(pCaptureImage);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
int a=0;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
int a=0;
|
|
}
|
|
|
|
}
|
|
|
|
bool bIsStart = false;
|
|
pPlayer = pRTSPThread->GetGstreamerPlayer();
|
|
|
|
if(bIsStart==false)
|
|
{
|
|
|
|
if(pPlayer==NULL)
|
|
{
|
|
usleep(1*1000);
|
|
}
|
|
else
|
|
{
|
|
qint64 nTime = m_TimerStartPipeLine.elapsed();
|
|
|
|
if(pPlayer->IsPipeStart()==false)
|
|
{
|
|
usleep(1*1000);
|
|
|
|
if(pRTSPThread->IsVideoLink()==false)
|
|
{
|
|
if(nTime>4*1000)
|
|
{
|
|
if(pRTSPThread->GetCaptureMode()==1)
|
|
{
|
|
pRTSPThread->SaveEnd();
|
|
|
|
QString strVideoFile = pRTSPThread->GetVideoFilename();
|
|
strVideoFile.replace(".mkv", "_00000.mkv");
|
|
QFileInfo ff(strVideoFile);
|
|
if(ff.exists()==true)
|
|
{
|
|
qint64 nLength = ff.size();
|
|
if(nLength>1*1000*1000)
|
|
{
|
|
QString strVideoFilename = pCommonData->GetNewFilename(DISPLAY_VIDEO);
|
|
pRTSPThread->SaveFile(strVideoFilename);
|
|
}
|
|
}
|
|
m_bAutoVideoCapture = false;
|
|
|
|
pRTSPThread->ChangeState(6);
|
|
|
|
}
|
|
else
|
|
{
|
|
usleep(1*1000);
|
|
|
|
ui->widget_Video->Lock();
|
|
{
|
|
ui->widget_Video->ClearQueueData();
|
|
ui->widget_Video->SetChangeTexture(true);
|
|
ui->widget_Video->UpdateTexture();
|
|
}
|
|
ui->widget_Video->Unlock();
|
|
//qDebug() << "StopRTSP";
|
|
//pRTSPThread->StopRTSP();
|
|
|
|
pRTSPThread->ChangeState(0);
|
|
qDebug() << "RTSP Thread Start";
|
|
|
|
|
|
}
|
|
|
|
usleep(100*1000);
|
|
|
|
m_TimerStartPipeLine.restart();
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
m_TimerStartPipeLine.restart();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bIsStart = true;
|
|
|
|
if(pRTSPThread->IsVideoLink()==false)
|
|
{
|
|
if(pRTSPThread->IsStartRTSP()==false && nTime>4*1000)
|
|
{
|
|
if(pRTSPThread->GetCaptureMode()==1)
|
|
{
|
|
pRTSPThread->SaveEnd();
|
|
|
|
QString strVideoFile = pRTSPThread->GetVideoFilename();
|
|
strVideoFile.replace(".mkv", "_00000.mkv");
|
|
QFileInfo ff(strVideoFile);
|
|
if(ff.exists()==true)
|
|
{
|
|
qint64 nLength = ff.size();
|
|
if(nLength>1*1000*1000)
|
|
{
|
|
QString strVideoFilename = pCommonData->GetNewFilename(DISPLAY_VIDEO);
|
|
pRTSPThread->SaveFile(strVideoFilename);
|
|
}
|
|
}
|
|
m_bAutoVideoCapture = false;
|
|
|
|
pRTSPThread->ChangeState(6);
|
|
}
|
|
else
|
|
{
|
|
pRTSPThread->StopRTSP();
|
|
usleep(100*1000);
|
|
|
|
ui->widget_Video->Lock();
|
|
{
|
|
ui->widget_Video->ClearQueueData();
|
|
ui->widget_Video->SetChangeTexture(true);
|
|
ui->widget_Video->UpdateTexture();
|
|
}
|
|
ui->widget_Video->Unlock();
|
|
|
|
|
|
|
|
nCheckTime.restart();
|
|
while(pRTSPThread->IsWorkingRTSP()==true)
|
|
{
|
|
usleep(100);
|
|
if(nCheckTime.elapsed() > 7*1000)
|
|
{
|
|
int a=0;
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
pRTSPThread->ChangeState(0);
|
|
|
|
|
|
}
|
|
|
|
usleep(100*1000);
|
|
|
|
m_TimerStartPipeLine.restart();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_TimerStartPipeLine.restart();
|
|
}
|
|
|
|
|
|
|
|
//m_Timer.stop();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if(pRTSPThread->IsVideoLink()==true)
|
|
{
|
|
//WRITE_FUNCTION_LOG_PARAM("VideoLink is OK");
|
|
//m_Timer.stop();
|
|
}
|
|
|
|
}
|
|
|
|
void FormCapture::on_horizontalSlider_Hue_valueChanged(int value)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM(QString::number(value));
|
|
int nValue = value - 50;
|
|
|
|
float fValue = (float)nValue / 50.0f;
|
|
|
|
//TestCode
|
|
|
|
QGstreamerPlayer* pPlayer = NULL;
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
|
|
|
|
bool bIsStart = false;
|
|
if(bIsStart==false)
|
|
{
|
|
pPlayer = pCommonData->GetThreadRTSP()->GetGstreamerPlayer();
|
|
if(pPlayer!=NULL)
|
|
{
|
|
pPlayer->ChangeHue(fValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormCapture::on_horizontalSlider_Saturation_valueChanged(int value)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM(QString::number(value));
|
|
int nValue = value;
|
|
|
|
float fValue = (float)nValue / 50.0f;
|
|
|
|
//TestCode
|
|
|
|
QGstreamerPlayer* pPlayer = NULL;
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
|
|
|
|
bool bIsStart = false;
|
|
if(bIsStart==false)
|
|
{
|
|
pPlayer = pCommonData->GetThreadRTSP()->GetGstreamerPlayer();
|
|
if(pPlayer!=NULL)
|
|
{
|
|
pPlayer->ChangeSaturation(fValue);
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormCapture::resizeEvent(QResizeEvent *event)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
int nDisplayType = pCommonData->GetDisplayType();
|
|
|
|
int nFontSize = 22;
|
|
int nFontSizeCaptureTitle = 30;
|
|
int nFontSizeButton = 22;
|
|
int nFontInfoLabel = 22;
|
|
int nFontInfoInfo = 22;
|
|
if(nDisplayType==SDISPLAY_1280X1024)
|
|
{
|
|
nFontSize = 16;
|
|
nFontSizeCaptureTitle = 25;
|
|
nFontSizeButton = 18;
|
|
nFontInfoLabel = 18;
|
|
nFontInfoInfo = 22;
|
|
ui->frame_Viewer_Vertical->hide();
|
|
ui->frame_Viewer_Horizontal->show();
|
|
//ui->frame_capture->setGeometry(40, 45, 1200, 1024-90);
|
|
ui->frame_capture->setGeometry(40, 45, 1200, 934);
|
|
ui->label_Capture->setGeometry(38, 24, 300, 45);
|
|
ui->label_LastCapture->setGeometry(180, 30, 300, 30);
|
|
ui->pushButton_EXIT->setGeometry(1003, 22, 140, 45);
|
|
ui->frame_Line->setGeometry(38, 69, 965+140, 27);
|
|
ui->display_line->setGeometry(0, 27/2, 965+140, 1);
|
|
ui->frame_Info->setGeometry(38, 69+27, 965+140, 59);
|
|
ui->pushButton_ACQ->setGeometry(890-38, 0, 115, 45);
|
|
ui->pushButton_VID->setGeometry(1027-38, 0, 115, 45);
|
|
ui->frame_InfoString->setGeometry(0, 0, 800, 45);
|
|
{
|
|
ui->label_ID->setGeometry(0, 0, 30, 45);
|
|
ui->info_ID->setGeometry(40, 0, 161, 45);
|
|
ui->label_Name->setGeometry(200, 0, 70, 45);
|
|
ui->info_Name->setGeometry(280, 0, 161, 45);
|
|
ui->label_Birth->setGeometry(490, 0, 70, 45);
|
|
ui->info_Birth->setGeometry(570, 0, 161, 45);
|
|
}
|
|
|
|
|
|
|
|
ui->label_StudyDescription->setGeometry(350, 24, 600, 40);
|
|
ui->frame_Detection->setGeometry(780, 24, 180, 40);
|
|
{
|
|
ui->label_Detection->setGeometry(0, 0, 120, 40);
|
|
ui->checkBox_Detection->setGeometry(120, 10, 30, 30);
|
|
}
|
|
|
|
ui->widget_Video->setGeometry(39, 155, 1103, 621);
|
|
ui->frame_connect_check->setGeometry(39, 155, 1103, 621);
|
|
{
|
|
//400, 60
|
|
ui->label_connect_check->setGeometry((1103-400)/2, (621-60)/2, 400, 60);
|
|
}
|
|
ui->pushButton_SEND->setGeometry(1026, 155+621+61-45, 115, 45);
|
|
ui->pushButton_DELETE->setGeometry(1026, 155+621+133-45, 115, 45);
|
|
|
|
{
|
|
ui->horizontalSlider_Hue->setGeometry(450, 40, 200, 16);
|
|
ui->horizontalSlider_Saturation->setGeometry(680, 40, 200, 16);
|
|
}
|
|
|
|
//ui->frame_Viewer_Horizontal->setGeometry(95, 792, 879, 87);
|
|
//ui->horizontalLayoutWidget->setGeometry(0, 0, 879, 87);
|
|
ui->frame_Viewer_Horizontal->setGeometry(39, 792, 1103, 120);
|
|
ui->horizontalLayoutWidget->setGeometry(0, 0, 1103, 120);
|
|
|
|
//ui->frame_horizontalScrollBar->setGeometry(97, 911-25, 874, 26);
|
|
//ui->horizontalScrollBar->setGeometry(0, 0, 874, 26);
|
|
ui->frame_horizontalScrollBar->setGeometry(39, 911, 1103, 26);
|
|
ui->horizontalScrollBar->setGeometry(0, 0, 1103, 26);
|
|
|
|
|
|
ui->frame_SelectBackground->setGeometry(0, 0, 1280, 1024);
|
|
ui->widget_SelectImage->setGeometry(79, 200, 1103, 779);
|
|
ui->frame_SelectBackground->hide();
|
|
|
|
//ui->pushButton_EXIT->hide();
|
|
//ui->pushButton_ACQ->hide();
|
|
//ui->pushButton_VID->hide();
|
|
|
|
ui->pushButton_SEND->hide();
|
|
ui->pushButton_DELETE->hide();
|
|
|
|
//ui->horizontalSlider_Hue->hide();
|
|
//ui->horizontalSlider_Saturation->hide();
|
|
|
|
m_nItemPerPage = 5;
|
|
}
|
|
else if(nDisplayType==SDISPLAY_1920X1080)
|
|
{
|
|
nFontSizeCaptureTitle = 30;
|
|
nFontSizeButton = 22;
|
|
nFontInfoLabel = 22;
|
|
nFontInfoInfo = 22;
|
|
ui->frame_Viewer_Vertical->show();
|
|
ui->frame_Viewer_Horizontal->hide();
|
|
ui->frame_capture->setGeometry(36, 36, 1855, 1028);
|
|
ui->label_Capture->setGeometry(55, 30, 200, 40);
|
|
ui->pushButton_EXIT->setGeometry(1580, 27, 161, 51);
|
|
ui->frame_Line->setGeometry(55, 80, 1749, 53);
|
|
ui->display_line->setGeometry(0, 53/2, 1749, 1);
|
|
ui->frame_Info->setGeometry(0, 133, 1855, 96);
|
|
ui->pushButton_ACQ->setGeometry(1399, 0, 153, 63);
|
|
ui->pushButton_VID->setGeometry(1591, 0, 153, 63);
|
|
ui->frame_InfoString->setGeometry(55, 0, 800, 63);
|
|
{
|
|
ui->label_ID->setGeometry(0, 0, 30, 63);
|
|
ui->info_ID->setGeometry(40, 0, 161, 63);
|
|
ui->label_Name->setGeometry(200, 0, 70, 63);
|
|
ui->info_Name->setGeometry(280, 0, 161, 63);
|
|
ui->label_Birth->setGeometry(490, 0, 70, 63);
|
|
ui->info_Birth->setGeometry(570, 0, 161, 63);
|
|
}
|
|
ui->widget_Video->setGeometry(55, 230, 1280, 720);
|
|
ui->pushButton_SEND->setGeometry(1398, 940, 161, 51);
|
|
ui->pushButton_DELETE->setGeometry(1582, 940, 161, 51);
|
|
|
|
{
|
|
ui->horizontalSlider_Hue->setGeometry(310, 40, 451, 16);
|
|
ui->horizontalSlider_Saturation->setGeometry(840, 40, 451, 16);
|
|
}
|
|
|
|
ui->frame_SelectBackground->setGeometry(0, 0, 1920, 1080);
|
|
ui->widget_SelectImage->setGeometry(55, 230, 1280, 720);
|
|
|
|
m_nItemPerPage = 3;
|
|
}
|
|
|
|
bool bIsConnectHDMI = pCommonData->IsConnectHDMI();
|
|
SetHDMICalbeConnect(bIsConnectHDMI);
|
|
|
|
QString strPushButton_Exit_Delete = QString(
|
|
"QPushButton \
|
|
{ \
|
|
background: #FFFFFF; \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: bold; \
|
|
border-radius: 8px; \
|
|
color: black; \
|
|
} \
|
|
QPushButton:pressed \
|
|
{ \
|
|
background: #D8D8D8; \
|
|
}").arg(nFontSizeButton);
|
|
ui->pushButton_EXIT->setStyleSheet(strPushButton_Exit_Delete);
|
|
ui->pushButton_DELETE->setStyleSheet(strPushButton_Exit_Delete);
|
|
|
|
|
|
QString strPushButton_ACQ_IMG = QString(
|
|
"QPushButton \
|
|
{ \
|
|
background: #153B44; \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: bold; \
|
|
border-radius: 8px; \
|
|
color: white; \
|
|
} \
|
|
QPushButton:pressed \
|
|
{ \
|
|
background: #1B4C54; \
|
|
}").arg(nFontSizeButton);
|
|
|
|
|
|
QString strPushButton_ACQ_VID = QString(
|
|
"QPushButton "
|
|
"{ "
|
|
" background: #153B44; "
|
|
" font-family: 'Roboto'; "
|
|
" font-size: %1px; "
|
|
" font-weight: bold; "
|
|
" border-radius: 8px; "
|
|
" color: white; "
|
|
" qproperty-checkable: true; "
|
|
" qproperty-checked: false; "
|
|
" qproperty-enabled: true; "
|
|
"} "
|
|
" "
|
|
"QPushButton:pressed "
|
|
"{ "
|
|
" background: #1B4C54; "
|
|
"} "
|
|
" "
|
|
"QPushButton:checked "
|
|
"{ "
|
|
" background: red; "
|
|
"} "
|
|
" "
|
|
"QPushButton:disabled "
|
|
"{ "
|
|
" background: blue; "
|
|
"}").arg(nFontSizeButton);
|
|
|
|
ui->pushButton_VID->setStyleSheet(strPushButton_ACQ_VID);
|
|
|
|
ui->pushButton_ACQ->setStyleSheet(strPushButton_ACQ_IMG);
|
|
|
|
ui->pushButton_SEND->setStyleSheet(strPushButton_ACQ_IMG);
|
|
|
|
|
|
QString strInfoLabel = QString(
|
|
"QLabel \
|
|
{ \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: bold; \
|
|
color: #000000; \
|
|
}").arg(nFontInfoLabel);
|
|
ui->label_ID->setStyleSheet(strInfoLabel);
|
|
ui->label_Name->setStyleSheet(strInfoLabel);
|
|
ui->label_Birth->setStyleSheet(strInfoLabel);
|
|
|
|
QString strInfoInfo = QString(
|
|
"QLabel \
|
|
{ \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: normal; \
|
|
color: #000000; \
|
|
}").arg(nFontInfoInfo);
|
|
ui->info_ID->setStyleSheet(strInfoInfo);
|
|
ui->info_Name->setStyleSheet(strInfoInfo);
|
|
ui->info_Birth->setStyleSheet(strInfoInfo);
|
|
|
|
|
|
QString strInfoStudyDescription = QString(
|
|
"QLabel \
|
|
{ \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: normal; \
|
|
qproperty-alignment: 'AlignVCenter | AlignHCenter'; \
|
|
color: #000000; \
|
|
}").arg(nFontInfoInfo);
|
|
ui->label_StudyDescription->setStyleSheet(strInfoStudyDescription);
|
|
|
|
|
|
/*
|
|
if(pCommonData->IsAutoVideoCapture()==true)
|
|
{
|
|
ui->pushButton_VID->setChecked(true);
|
|
ui->pushButton_VID->setDisabled(true);
|
|
}
|
|
else
|
|
{
|
|
*/
|
|
ui->pushButton_VID->setChecked(false);
|
|
ui->pushButton_VID->setEnabled(true);
|
|
//}
|
|
|
|
#ifdef _PC
|
|
SetHDMICalbeConnect(true);
|
|
#endif
|
|
|
|
}
|
|
|
|
void FormCapture::on_pushButton_SEND_clicked()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
|
|
}
|
|
|
|
void FormCapture::on_pushButton_DELETE_clicked()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
}
|
|
|
|
void FormCapture::keyReleaseEvent(QKeyEvent *event)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
int nKey = event->key();
|
|
|
|
if(nKey==Qt::Key_F10 || nKey==Qt::Key_F11)
|
|
{
|
|
/*
|
|
if(ui->pushButton_ACQ->isEnabled()==true)
|
|
{
|
|
ui->pushButton_ACQ->click();
|
|
}
|
|
*/
|
|
m_TimerCaptureSingleShot.start();
|
|
|
|
|
|
|
|
}
|
|
/*
|
|
else if(nKey==Qt::Key_F11)
|
|
{
|
|
if(ui->pushButton_VID->isEnabled()==true)
|
|
{
|
|
ui->pushButton_VID->click();
|
|
}
|
|
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
void FormCapture::FinishBeep()
|
|
{
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
pCommonData->Beep(false);
|
|
}
|
|
|
|
void FormCapture::CheckCaptureTimeInfo()
|
|
{
|
|
//WRITE_FUNCTION_LOG();
|
|
QString strTimeInfo;
|
|
|
|
/*
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
int nCountCaptureImage = 0;
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
nCountCaptureImage = pListCaptureImage->size();
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
*/
|
|
|
|
if(m_TimeCapture.isValid()==true && m_nCaptureImageCount>0)
|
|
{
|
|
qint64 nTime = m_TimeCapture.elapsed();
|
|
nTime = nTime/1000;
|
|
int nSecond = nTime%60;
|
|
int nMinute = (nTime/60)%60;
|
|
int nHour = ((nTime/60)/60)%60;
|
|
strTimeInfo = QString("LastCapture: %1:%2:%3").arg(nHour).arg(nMinute).arg(nSecond);
|
|
ui->label_LastCapture->setText(strTimeInfo);
|
|
ui->label_LastCapture->show();
|
|
}
|
|
else
|
|
{
|
|
ui->label_LastCapture->hide();
|
|
}
|
|
}
|
|
|
|
|
|
void FormCapture::UpdateObjectDisplay(vector<QRect>& listRectDisplay)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
ui->widget_Video->UpdateObjectDisplay(listRectDisplay);
|
|
}
|
|
|
|
|
|
void FormCapture::ThumbnailClicked(void* pData)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
m_bSendBackground = false;
|
|
ui->frame_SelectBackground->show();
|
|
ui->widget_SelectImage->SetCurrentImage((CAPTURE_IMAGE*)pData);
|
|
|
|
ui->widget_Video->hide();
|
|
|
|
ui->pushButton_EXIT->hide();
|
|
ui->pushButton_ACQ->hide();
|
|
ui->pushButton_VID->hide();
|
|
}
|
|
|
|
|
|
void FormCapture::CloseSelectForm()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
ui->frame_SelectBackground->hide();
|
|
|
|
ui->widget_Video->show();
|
|
|
|
ui->pushButton_EXIT->show();
|
|
ui->pushButton_ACQ->show();
|
|
ui->pushButton_VID->show();
|
|
|
|
m_nIndexCurrent = 0;
|
|
UpdateViewer();
|
|
ui->horizontalScrollBar->setValue(0);
|
|
|
|
//CommonData* pCommonData = MainWindow::GetCommonData();
|
|
//vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
|
|
|
|
|
|
//m_ListFormHorizontalImageSelect.size();
|
|
}
|
|
|
|
void FormCapture::UpdateMakeDICOMInfo(int nCount, int nTotalCount)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM(QString::number(nCount) + "/" + QString::number(nTotalCount));
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
m_pDialogSendProgress->DisplayInfo(nCount, nTotalCount);
|
|
|
|
QString strInfo = QString("DICOM Make: %1 / %2").arg(nCount).arg(nTotalCount);
|
|
m_pDialogSendProgress->DisplayInfo(strInfo);
|
|
}
|
|
else
|
|
{
|
|
if(m_bSendBackground==false)
|
|
{
|
|
ui->widget_SelectImage->UpdateMakeDICOMInfo(nCount, nTotalCount);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void FormCapture::UpdateSendInfo(int nCount, int nTotalCount)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM(QString::number(nCount) + "/" + QString::number(nTotalCount));
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
m_pDialogSendProgress->DisplayInfo(nCount, nTotalCount);
|
|
|
|
QString strInfo = QString("%1 / %2").arg(nCount).arg(nTotalCount);
|
|
m_pDialogSendProgress->DisplayInfo(strInfo);
|
|
}
|
|
else
|
|
{
|
|
if(m_bSendBackground==false)
|
|
{
|
|
ui->widget_SelectImage->UpdateSendInfo(nCount, nTotalCount);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void FormCapture::UpdateSendComplete()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
m_pDialogSendProgress->DisplayInfo(-1, 100);
|
|
|
|
//QString strInfo = QString("Send Complete");
|
|
//m_pDialogSendProgress->DisplayInfo(strInfo);
|
|
|
|
QThread::msleep(1000);
|
|
|
|
//m_pDialogSendProgress->SendComplete();
|
|
//m_pDialogSendProgress->accept();
|
|
}
|
|
else
|
|
{
|
|
if(m_bSendBackground==false)
|
|
{
|
|
ui->widget_SelectImage->UpdateSendComplete();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void FormCapture::UpdateSendFailed()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
if(m_pDialogSendProgress!=NULL)
|
|
{
|
|
m_pDialogSendProgress->DisplayInfo(-1, 100);
|
|
|
|
//QString strInfo = QString("Error: Check Network");
|
|
//m_pDialogSendProgress->DisplayInfo(strInfo);
|
|
m_pDialogSendProgress->DisplayInfo(-1);
|
|
|
|
|
|
|
|
//QThread::msleep(1000);
|
|
|
|
//m_pDialogSendProgress->SendComplete();
|
|
//m_pDialogSendProgress->accept();
|
|
}
|
|
else
|
|
{
|
|
if(m_bSendBackground==false)
|
|
{
|
|
ui->widget_SelectImage->UpdateSendFailed();
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
void FormCapture::VideoStopEnable()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
ui->pushButton_VID->setEnabled(true);
|
|
}
|
|
|
|
|
|
void FormCapture::ImageCaptureEnable()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
ui->pushButton_ACQ->setEnabled(true);
|
|
}
|
|
|
|
void FormCapture::CaptureSingleShot()
|
|
{
|
|
if(ui->pushButton_ACQ->isEnabled()==false)
|
|
{
|
|
m_TimerCaptureSingleShot.stop();
|
|
return;
|
|
}
|
|
ui->pushButton_ACQ->setDisabled(true);
|
|
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
CAPTURE_IMAGE* pCaptureImage = NULL;
|
|
bool bIsCropMode = (bool)pCommonData->GetCropMode();
|
|
|
|
int nWidth = pCommonData->GetVideoWidth();
|
|
int nHeight = pCommonData->GetVideoHeight();
|
|
int nSaveWidth = pCommonData->GetVideoWidth();
|
|
int nSaveHeight = pCommonData->GetVideoHeight();
|
|
|
|
m_nCaptureImageCount++;
|
|
m_TimeCapture.restart();
|
|
|
|
QVideoWidget* pVideoWidget = ui->widget_Video;
|
|
pVideoWidget->Lock();
|
|
{
|
|
uint8_t* pData = pVideoWidget->GetCaptureImage();
|
|
|
|
//SThreadImageSave* pThread = MainWindow::GetCommonData()->GetThreadCaptureImage();
|
|
//pThread->SetImageCapture(pData, 1920, 1080);
|
|
|
|
pCaptureImage = pCommonData->AddCaptureImage(pData, nWidth, nHeight, DISPLAY_IMAGE);
|
|
}
|
|
pVideoWidget->Unlock();
|
|
|
|
pCommonData->Beep(true);
|
|
m_TimerCaptureBeepSound.start(250);
|
|
m_TimerCaptureImage.start(10);
|
|
|
|
bool bCreateImageFile = false;
|
|
bCreateImageFile = pCommonData->ConvertCaptureImage(pCaptureImage, nSaveWidth, nSaveHeight);
|
|
|
|
|
|
if(bCreateImageFile==false)
|
|
{
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
|
|
vector<CAPTURE_IMAGE*>::iterator it;
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
{
|
|
for(it=pListCaptureImage->begin() ; it!=pListCaptureImage->end() ; ++it)
|
|
{
|
|
CAPTURE_IMAGE* pImageDisplay = *it;
|
|
if(pImageDisplay==pCaptureImage)
|
|
{
|
|
pListCaptureImage->erase(it);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
SAFE_DELETE(pCaptureImage);
|
|
|
|
m_TimerCaptureSingleShot.stop();
|
|
return;
|
|
}
|
|
|
|
m_nCaptureImageCount++;
|
|
m_TimeCapture.restart();
|
|
|
|
|
|
/*
|
|
if(bIsCropMode==true)
|
|
{
|
|
*pCaptureImage->m_pImage = pCaptureImage->m_pImage->copy(QRect(242, 5, 1376, 992));
|
|
//SAFE_DELETE(pCaptureImage->m_pImageSmall);
|
|
//pCaptureImage->m_pImageSmall = new QImage;
|
|
*pCaptureImage->m_pImageSmall = pCaptureImage->m_pImage->scaled(pCaptureImage->m_pImage->width()/4, pCaptureImage->m_pImage->height()/4, Qt::IgnoreAspectRatio, Qt::SmoothTransformation).copy();
|
|
|
|
}
|
|
*/
|
|
SAFE_DELETE(pCaptureImage->m_pImage);
|
|
SAFE_DELETE(pCaptureImage->m_pImageCaptureRaw);
|
|
SAFE_ARRAY_DELETE(pCaptureImage->m_pImageCaptureColor);
|
|
|
|
|
|
if(pCaptureImage!=NULL)
|
|
{
|
|
captureImage(pCaptureImage);
|
|
}
|
|
|
|
m_TimerCaptureSingleShot.stop();
|
|
|
|
|
|
/*
|
|
if(m_TimeHandSwitchOn.elapsed()<1100)
|
|
{
|
|
return;
|
|
}
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
int nValue = pCommonData->GetHandSwitchValue();
|
|
|
|
//qDebug() << nValue;
|
|
|
|
if(nValue>=0)
|
|
{
|
|
m_nHandSwitchValue = nValue;
|
|
|
|
if(m_nHandSwitchValue==1 && m_nPrevHandSwitchValue==0)
|
|
{
|
|
if(ui->pushButton_ACQ->isEnabled()==true)
|
|
{
|
|
WRITE_FUNCTION_LOG_PARAM("HandSwitch-Clicked!!");
|
|
ui->pushButton_ACQ->click();
|
|
m_TimeHandSwitchOn.start();
|
|
|
|
}
|
|
}
|
|
|
|
m_nPrevHandSwitchValue = nValue;
|
|
}
|
|
*/
|
|
|
|
}
|
|
|
|
void FormCapture::CaptureHandSwitch()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
if(this->isVisible()==false)
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_TimerCaptureSingleShot.start();
|
|
|
|
/*
|
|
if(ui->pushButton_ACQ->isEnabled()==true)
|
|
{
|
|
ui->pushButton_ACQ->click();
|
|
//m_TimeHandSwitchOn.start();
|
|
}
|
|
*/
|
|
}
|
|
|
|
void FormCapture::CaptureFootSwitch()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
if(this->isVisible()==false)
|
|
{
|
|
return;
|
|
}
|
|
|
|
m_TimerCaptureSingleShot.start();
|
|
|
|
/*
|
|
if(ui->pushButton_ACQ->isEnabled()==true)
|
|
{
|
|
ui->pushButton_ACQ->click();
|
|
//m_TimeHandSwitchOn.start();
|
|
}
|
|
*/
|
|
}
|
|
|
|
void FormCapture::on_checkBox_Detection_toggled(bool checked)
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
pCommonData->SetActiveDetect(checked);
|
|
}
|
|
|
|
void FormCapture::OnDoubleClicked()
|
|
{
|
|
WRITE_FUNCTION_LOG();
|
|
|
|
}
|
|
|
|
|
|
void FormCapture::SetHDMICalbeConnect(bool bCableConnect)
|
|
{
|
|
int nFontSizeCaptureTitle = 25;
|
|
QString strCaptureTitle = QString(
|
|
"QLabel \
|
|
{ \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: bold; \
|
|
color: #000000; \
|
|
}").arg(nFontSizeCaptureTitle);
|
|
|
|
if(bCableConnect==false)
|
|
{
|
|
strCaptureTitle = QString(
|
|
"QLabel \
|
|
{ \
|
|
font-family: 'Roboto'; \
|
|
font-size: %1px; \
|
|
font-weight: bold; \
|
|
color: #FF0000; \
|
|
}").arg(nFontSizeCaptureTitle);
|
|
ui->frame_connect_check->show();
|
|
|
|
ui->widget_Video->ClearQueueData();
|
|
|
|
//ui->pushButton_CON->setEnabled(true);
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
ui->frame_connect_check->hide();
|
|
|
|
//ui->pushButton_CON->setEnabled(false);
|
|
//ui->pushButton_CON->setEnabled(true);
|
|
|
|
}
|
|
|
|
|
|
ui->label_Capture->setStyleSheet(strCaptureTitle);
|
|
}
|
|
|
|
void FormCapture::HDMICalbeConnect(bool bCableConnect)
|
|
{
|
|
if(isVisible()==false)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(isEnabled()==false)
|
|
{
|
|
return;
|
|
}
|
|
|
|
SetHDMICalbeConnect(bCableConnect);
|
|
|
|
|
|
}
|
|
|
|
|
|
void FormCapture::WriteDatabaseListCapture()
|
|
{
|
|
CommonData* pCommonData = MainWindow::GetCommonData();
|
|
|
|
// 1. 다른 공유 데이터에 대한 Lock/Unlock 로직은 그대로 유지합니다.
|
|
ACQUISITION_INFO* pAcquisitionInfo = pCommonData->GetAcquisitionInfo();
|
|
vector<CAPTURE_IMAGE*>* pListCaptureImage = pCommonData->GetListCaptureImage();
|
|
|
|
// 포인터가 유효한지 확인하는 방어 코드 추가
|
|
if (!pAcquisitionInfo || !pListCaptureImage) {
|
|
qWarning() << "WriteDatabaseListCapture: Failed to get acquisition info or capture list.";
|
|
if (pAcquisitionInfo) pCommonData->ReleaseAcquisitionInfo();
|
|
if (pListCaptureImage) pCommonData->ReleaseListCaptureImage();
|
|
return;
|
|
}
|
|
|
|
// 2. 이 함수만을 위한 지역 DB 인스턴스를 생성하고 연결합니다.
|
|
SUTIL::SDatabase db(QString("WriteCaptureList_%1").arg(reinterpret_cast<quintptr>(this)));
|
|
if (db.OpenDatabase("/home/birdhead/test.db") == 0) // 0이 성공
|
|
{
|
|
// 3. 지역 인스턴스 'db'를 사용하여 DB 작업을 수행합니다.
|
|
// UpdateImageOnAcquistionTemp 함수는 vector를 포인터(*)가 아닌 참조(&)로 받으므로,
|
|
// *pListCaptureImage 와 같이 역참조하여 전달합니다.
|
|
db.UpdateImageOnAcquistionTemp(pAcquisitionInfo, *pListCaptureImage);
|
|
}
|
|
else
|
|
{
|
|
qWarning() << "DB open failed in WriteDatabaseListCapture.";
|
|
}
|
|
|
|
// 4. GetDatabase/ReleaseDatabase 호출은 완전히 제거됩니다.
|
|
|
|
pCommonData->ReleaseAcquisitionInfo();
|
|
pCommonData->ReleaseListCaptureImage();
|
|
|
|
// 'db' 객체는 이 함수의 스코프가 끝나면 자동으로 소멸되어 자원이 정리됩니다.
|
|
}
|