code_app/app/twaintest/mainwindow.cpp

189 lines
5.1 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDir>
#include "base/HGUtility.h"
#include "imgfmt/HGImgFmt.h"
#include "HGUIGlobal.h"
#include "HGString.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, m_twainDSM(nullptr)
, m_twainDS(nullptr)
, m_cacheUuid("")
{
ui->setupUi(this);
HGChar cacheUuid[256] = { 0 };
HGBase_GetUuid(cacheUuid, 256);
m_cacheUuid = cacheUuid;
QStringList capTypes = { "TWTY_INT8", "TWTY_UINT8", "TWTY_INT16", "TWTY_UINT16", "TWTY_INT32", "TWTY_UINT32", "TWTY_BOOL","TWTY_FIX32",
"TWTY_STR32", "TWTY_STR64", "TWTY_STR128", "TWTY_STR255" };
ui->comboBox_capType->addItems(capTypes);
ui->comboBox_capType->setCurrentIndex(0);
ui->comboBox_capType->setEditable(true);
ui->label_deviceStatus->setText(tr("No device connected"));
HGTwain_CreateDSM((HWND)this->winId(), &m_twainDSM);
connect(this, SIGNAL(newImage(void*)), this, SLOT(on_newImage(void*)), Qt::DirectConnection);
connect(this, SIGNAL(clearRes()), this, SLOT(on_clearRes()), Qt::QueuedConnection);
}
MainWindow::~MainWindow()
{
QString cachePath = getCachePath() + m_cacheUuid + "/";
QDir dir = QDir(cachePath);
if (dir.exists())
dir.removeRecursively();
if (m_twainDSM != nullptr)
{
HGTwain_DestroyDSM(m_twainDSM);
m_twainDSM = nullptr;
}
if (m_twainDS != nullptr)
{
HGTwain_CloseDS(m_twainDS);
HGTwain_DestroyDS(m_twainDS);
m_twainDS = nullptr;
}
delete ui;
}
void MainWindow::on_act_selectDevice_triggered()
{
ui->label_deviceStatus->setText(tr("No device connected"));
if (m_twainDS != nullptr)
{
HGTwain_CloseDS(m_twainDS);
HGTwain_DestroyDS(m_twainDS);
m_twainDS = nullptr;
}
HGResult ret = HGTwain_CreateSelectedDSEx(m_twainDSM, &m_twainDS);
if (nullptr != m_twainDS)
{
HGResult ret = HGTwain_OpenDS(m_twainDS);
if (ret == HGBASE_ERR_OK)
{
HGTwain_LoginDS(m_twainDS, "user", "huagoscan");
ui->label_deviceStatus->setText(tr("Device %1 is open").arg(getDeviceName()));
}
}
else
{
if (HGTWAIN_ERR_CANCELUI != ret)
{
QMessageBox::information(this, tr("Prompt"), tr("Device source not found!"));
}
}
}
void MainWindow::on_pushButton_SetCap_clicked()
{
QString capCode = ui->lineEdit_setCap->text();
bool ok = false;
HGUShort cap = capCode.toInt(&ok, 16);
HGCapValue value;
QString capType = ui->comboBox_capType->currentText();
if (capType == "TWTY_BOOL")
{
value.type = HGCAPVALUE_TYPE_BOOL;
value.valueBool = ui->lineEdit_setCapContent->text().toInt();
}
HGResult ret = HGTwain_SetCapbility(m_twainDS, cap, &value, ui->checkBox_resetCap->isChecked());
if (ret == HGBASE_ERR_OK)
{
QMessageBox::information(this, tr("Prompt"), tr("Set successfully"));
}
else
{
QMessageBox::information(this, tr("Prompt"), tr("Set failed"));
}
}
void MainWindow::on_pushButton_scan_clicked()
{
HGResult ret = HGTwain_EnableDS(m_twainDS, HGFALSE, (HWND)this->winId(), DSEventFunc, this, DSImageFunc, this);
}
void MainWindow::on_newImage(void *image)
{
HGImage img = nullptr;
HGBase_CloneImage((HGImage)image, 0, 0, &img);
QString scanFileName = getCacheFileName((HGImage)image);
HGImgFmtSaveInfo info;
info.jpegQuality = 100;
info.tiffCompression = HGIMGFMT_TIFFCOMP_LZW;
info.tiffJpegQuality = 0;
HGResult ret = HGImgFmt_SaveImage((HGImage)image, 0, &info, getStdString(scanFileName).c_str());
}
void MainWindow::on_clearRes()
{
HGTwain_DisableDS(m_twainDS);
}
void MainWindow::DSEventFunc(HGTwainDS ds, HGUInt event, HGPointer param)
{
MainWindow* p = (MainWindow*)param;
if (HGTWAIN_EVENT_TYPE_SCANFINISHED == event || HGTWAIN_EVENT_TYPE_CLOSEDSREQ == event)
{
emit p->clearRes();
}
}
HGUInt MainWindow::DSImageFunc(HGTwainDS ds, HGImage image, HGUInt type, HGPointer param)
{
MainWindow* p = (MainWindow*)param;
emit p->newImage(image);
return HGBASE_ERR_OK;
}
QString MainWindow::getDeviceName()
{
HGChar devName[256] = {0};
HGTwain_GetDSDeviceName(m_twainDS, devName, 256);
return QString(devName);
}
QString MainWindow::getCachePath()
{
HGChar cachePath[512];
HGBase_GetDocumentsPath(cachePath, 512);
HGChar procName[512];
HGBase_GetProcessName(procName, 512);
strcat(cachePath, procName);
strcat(cachePath, "/Cache/");
return getStdFileName(StdStringToUtf8(cachePath).c_str());
}
QString MainWindow::getCacheFileName(HGImage img)
{
assert(nullptr != img);
HGImageInfo imgInfo;
HGBase_GetImageInfo(img, &imgInfo);
QString cachePath = getCachePath() + m_cacheUuid + "/";
HGBase_CreateDir(getStdString(cachePath).c_str());
char uuid[256] = {0};
HGBase_GetUuid(uuid, 256);
QString suffix = (HGBASE_IMGTYPE_BINARY == imgInfo.type) ? ".bmp" : ".jpg";
QString fileName = getStdFileName(cachePath + uuid + suffix);
return fileName;
}