From 73f38a9c34db6ff111b597ba2375d2edb7d2f6eb Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Thu, 10 Nov 2022 17:23:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=9B=BA=E4=BB=B6=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/fwupgrade/dialog_upgradefirmware.cpp | 168 ++++++++ app/fwupgrade/dialog_upgradefirmware.h | 50 +++ app/fwupgrade/dialog_upgradefirmware.ui | 127 ++++++ app/fwupgrade/logindialog.cpp | 44 ++ app/fwupgrade/logindialog.h | 32 ++ app/fwupgrade/logindialog.ui | 148 +++++++ app/fwupgrade/main.cpp | 20 +- app/fwupgrade/mainwindow.cpp | 382 +++++++++++++++++ app/fwupgrade/mainwindow.h | 44 ++ app/fwupgrade/mainwindow.ui | 387 +++++++++++++++++- .../HGSolution/HGFWUpgrade/HGFWUpgrade.pro | 7 + test/scannerlib/cumtenn/CMakeLists.txt | 12 + .../c#/WindowsFormsApp1/Form1.Designer.cs | 62 +++ .../cumtenn/c#/WindowsFormsApp1/Form1.cs | 281 +++++++++++++ .../cumtenn/c#/WindowsFormsApp1/Form1.resx | 120 ++++++ .../c#/WindowsFormsApp1/HGScannerLib.cs | 158 +++++++ .../cumtenn/c#/WindowsFormsApp1/Program.cs | 21 + .../Properties/AssemblyInfo.cs | 36 ++ .../Properties/Resources.Designer.cs | 70 ++++ .../Properties/Resources.resx | 117 ++++++ .../Properties/Settings.Designer.cs | 29 ++ .../Properties/Settings.settings | 7 + .../WindowsFormsApp1/WindowsFormsApp1.csproj | 81 ++++ .../c#/WindowsFormsApp1/WindowsFormsApp1.sln | 25 ++ test/scannerlib/cumtenn/main.cpp | 176 ++++++++ test/scannerlib/cumtenn/test.py | 234 +++++++++++ 26 files changed, 2824 insertions(+), 14 deletions(-) create mode 100644 app/fwupgrade/dialog_upgradefirmware.cpp create mode 100644 app/fwupgrade/dialog_upgradefirmware.h create mode 100644 app/fwupgrade/dialog_upgradefirmware.ui create mode 100644 app/fwupgrade/logindialog.cpp create mode 100644 app/fwupgrade/logindialog.h create mode 100644 app/fwupgrade/logindialog.ui create mode 100644 test/scannerlib/cumtenn/CMakeLists.txt create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.Designer.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.resx create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/HGScannerLib.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Program.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/AssemblyInfo.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.Designer.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.resx create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.Designer.cs create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.settings create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.csproj create mode 100644 test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.sln create mode 100644 test/scannerlib/cumtenn/main.cpp create mode 100644 test/scannerlib/cumtenn/test.py diff --git a/app/fwupgrade/dialog_upgradefirmware.cpp b/app/fwupgrade/dialog_upgradefirmware.cpp new file mode 100644 index 00000000..316065e9 --- /dev/null +++ b/app/fwupgrade/dialog_upgradefirmware.cpp @@ -0,0 +1,168 @@ +#include "dialog_upgradefirmware.h" +#include "ui_dialog_upgradefirmware.h" +#include +#include +#include +#include "base/HGBase.h" + +Dialog_upgradeFirmware::Dialog_upgradeFirmware(HGVersionMgr versionMgr, SANE_Handle handle, const std::string &url, const std::string &version, + const std::string& md5, QWidget *parent) : + QDialog(parent) + , m_versionMgr(versionMgr) + , m_handle(handle) + , m_url(url) + , m_version(version) + , m_md5(md5) + , m_filePath("") + , m_result(-1) + , ui(new Ui::Dialog_upgradeFirmware) +{ + ui->setupUi(this); + + setWindowTitle(tr("upgrade")); + setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + + ui->label_text->setText(tr("firmware upgrade in progress, please wait...")); + + QMovie *movie = new QMovie(":images/image_rsc/logo/waiting.gif"); + ui->label_gif->setMovie(movie); + movie->setCacheMode(QMovie::CacheAll); + movie->setScaledSize(QSize(ui->label_gif->width(), ui->label_gif->height())); + movie->start(); + ui->label_gif->show(); + + connect(this, SIGNAL(finish()), this, SLOT(on_finish()), Qt::QueuedConnection); + + HGBase_OpenThread(ThreadFunc, this, &m_thread); +} + +Dialog_upgradeFirmware::Dialog_upgradeFirmware(SANE_Handle handle, const std::string &filePath, QWidget *parent) + : QDialog(parent) + , m_versionMgr(nullptr) + , m_handle(handle) + , m_url("") + , m_version("") + , m_md5("") + , m_filePath(filePath) + , m_result(-1) + , ui(new Ui::Dialog_upgradeFirmware) +{ + ui->setupUi(this); + + setWindowTitle(tr("upgrade")); + setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + + ui->label_text->setText(tr("firmware upgrade in progress, please wait...")); + + QMovie *movie = new QMovie(":images/image_rsc/logo/waiting.gif"); + ui->label_gif->setMovie(movie); + movie->setCacheMode(QMovie::CacheAll); + movie->setScaledSize(QSize(ui->label_gif->width(), ui->label_gif->height())); + movie->start(); + ui->label_gif->show(); + + connect(this, SIGNAL(finish()), this, SLOT(on_finish()), Qt::QueuedConnection); + + HGBase_OpenThread(ThreadFunc, this, &m_thread); +} + +Dialog_upgradeFirmware::~Dialog_upgradeFirmware() +{ + if (nullptr != m_thread) + { + HGBase_CloseThread(m_thread); + m_thread = nullptr; + } + + delete ui; +} + +void HGAPI Dialog_upgradeFirmware::ThreadFunc(HGThread thread, HGPointer param) +{ + (void)thread; + Dialog_upgradeFirmware *p = (Dialog_upgradeFirmware *)param; + + if (nullptr != p->m_versionMgr) + { + HGChar suffix[64]; + HGBase_GetFileSuffix(p->m_url.c_str(), suffix, 64); + + HGChar savePath[512]; + HGBase_GetConfigPath(savePath, 512); + HGBase_CreateDir(savePath); + HGChar fileName[128]; + sprintf(fileName, "%s.%s", p->m_version.c_str(), suffix); + strcat(savePath, fileName); + + QFile saveFile(savePath); + saveFile.open(QFile::ReadOnly); + QByteArray fileMsg = saveFile.readAll(); + saveFile.close(); + QString md5_2 = QCryptographicHash::hash(fileMsg, QCryptographicHash::Md5).toHex(); + + QFile f(savePath); + if (!f.exists() || QString(p->m_md5.c_str()) != md5_2) + { + HGResult ret = HGVersion_HttpDownload(p->m_versionMgr, p->m_url.c_str(), savePath, nullptr, nullptr); + if (HGBASE_ERR_OK == ret) + { + QFile saveFile(savePath); + saveFile.open(QFile::ReadOnly); + QByteArray fileMsg = saveFile.readAll(); + saveFile.close(); + QString md5_2 = QCryptographicHash::hash(fileMsg, QCryptographicHash::Md5).toHex(); + + if (QString(p->m_md5.c_str()) == md5_2) + { + if (SANE_STATUS_GOOD == sane_io_control(p->m_handle, IO_CTRL_CODE_SET_FIRMWARE_UPGRADE, (void*)savePath, nullptr)) + { + p->m_result = 0; + } + else + { + p->m_result = 2; + } + } + } + else + { + p->m_result = 1; + } + } + else + { + if (SANE_STATUS_GOOD == sane_io_control(p->m_handle, IO_CTRL_CODE_SET_FIRMWARE_UPGRADE, (void*)savePath, nullptr)) + { + p->m_result = 0; + } + else + { + p->m_result = 2; + } + } + } + else + { + if (SANE_STATUS_GOOD == sane_io_control(p->m_handle, IO_CTRL_CODE_SET_FIRMWARE_UPGRADE, (void*)p->m_filePath.c_str(), nullptr)) + { + p->m_result = 0; + } + else + { + p->m_result = 2; + } + } + + emit p->finish(); +} + +int Dialog_upgradeFirmware::getUpgradeStatus() +{ + return m_result; +} + +void Dialog_upgradeFirmware::on_finish() +{ + accept(); +} + diff --git a/app/fwupgrade/dialog_upgradefirmware.h b/app/fwupgrade/dialog_upgradefirmware.h new file mode 100644 index 00000000..1a0b81f7 --- /dev/null +++ b/app/fwupgrade/dialog_upgradefirmware.h @@ -0,0 +1,50 @@ +#ifndef DIALOG_UPGRADEFIRMWARE_H +#define DIALOG_UPGRADEFIRMWARE_H + +#include +#include "base/HGThread.h" +#include "version/HGVersion.h" +#include "sane/sane_ex.h" + +namespace Ui { +class Dialog_upgradeFirmware; +} + +class Dialog_upgradeFirmware : public QDialog +{ + Q_OBJECT + +public: + Dialog_upgradeFirmware(HGVersionMgr versionMgr, SANE_Handle handle, const std::string &url, const std::string &version, + const std::string& md5, QWidget *parent = nullptr); + Dialog_upgradeFirmware(SANE_Handle handle, const std::string &filePath, QWidget *parent = nullptr); + ~Dialog_upgradeFirmware(); + +private: + static void HGAPI ThreadFunc(HGThread thread, HGPointer param); + +public: + int getUpgradeStatus(); + +signals: + void finish(); + +private slots: + void on_finish(); + +private: + HGVersionMgr m_versionMgr; + SANE_Handle m_handle; + std::string m_url; + std::string m_version; + std::string m_md5; + std::string m_filePath; + int m_result; // 0-成功 1-下载失败 2-升级失败 + + HGThread m_thread; + +private: + Ui::Dialog_upgradeFirmware *ui; +}; + +#endif // DIALOG_UPGRADEFIRMWARE_H diff --git a/app/fwupgrade/dialog_upgradefirmware.ui b/app/fwupgrade/dialog_upgradefirmware.ui new file mode 100644 index 00000000..df195eaa --- /dev/null +++ b/app/fwupgrade/dialog_upgradefirmware.ui @@ -0,0 +1,127 @@ + + + Dialog_upgradeFirmware + + + + 0 + 0 + 435 + 125 + + + + Dialog + + + + + + Qt::Vertical + + + + 20 + 19 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 40 + 60 + + + + gif + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + text + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + + diff --git a/app/fwupgrade/logindialog.cpp b/app/fwupgrade/logindialog.cpp new file mode 100644 index 00000000..7f07b723 --- /dev/null +++ b/app/fwupgrade/logindialog.cpp @@ -0,0 +1,44 @@ +#include "logindialog.h" +#include "ui_logindialog.h" +#include +#include "base/HGBase.h" + +LoginDialog::LoginDialog(const QString &account, const QString &password, QWidget *parent) : + QDialog(parent), + m_account(account), + m_password(password), + ui(new Ui::LoginDialog) +{ + ui->setupUi(this); + + ui->editAccount->setText(m_account); + ui->editPassword->setEchoMode(QLineEdit::EchoMode::Password); +} + +LoginDialog::~LoginDialog() +{ + delete ui; +} + +void LoginDialog::on_btnLogin_clicked() +{ + if (ui->editAccount->text() != m_account || ui->editPassword->text() != m_password) + { + QMessageBox msg(QMessageBox::Information, tr("tips"), tr("wrong account or password"), QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); + return; + } + + accept(); +} + +void LoginDialog::on_btnHelp_clicked() +{ + +} + +void LoginDialog::on_btnExit_clicked() +{ + reject(); +} diff --git a/app/fwupgrade/logindialog.h b/app/fwupgrade/logindialog.h new file mode 100644 index 00000000..f221558f --- /dev/null +++ b/app/fwupgrade/logindialog.h @@ -0,0 +1,32 @@ +#ifndef LOGINDIALOG_H +#define LOGINDIALOG_H + +#include + +namespace Ui { +class LoginDialog; +} + +class LoginDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LoginDialog(const QString &account, const QString &password, QWidget *parent = nullptr); + ~LoginDialog(); + +private slots: + void on_btnLogin_clicked(); + + void on_btnHelp_clicked(); + + void on_btnExit_clicked(); + +private: + Ui::LoginDialog *ui; + + QString m_account; + QString m_password; +}; + +#endif // LOGINDIALOG_H diff --git a/app/fwupgrade/logindialog.ui b/app/fwupgrade/logindialog.ui new file mode 100644 index 00000000..a8b436c7 --- /dev/null +++ b/app/fwupgrade/logindialog.ui @@ -0,0 +1,148 @@ + + + LoginDialog + + + + 0 + 0 + 498 + 328 + + + + Login + + + + + 40 + 50 + 401 + 51 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + account + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 39 + 120 + 401 + 51 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + password + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 40 + 210 + 401 + 61 + + + + + + + login + + + + + + + help + + + + + + + exit + + + + + + + + + diff --git a/app/fwupgrade/main.cpp b/app/fwupgrade/main.cpp index c1233512..fd5f779a 100644 --- a/app/fwupgrade/main.cpp +++ b/app/fwupgrade/main.cpp @@ -1,3 +1,4 @@ +#include "logindialog.h" #include "mainwindow.h" #include @@ -5,6 +6,7 @@ #include #include #include +#include "base/HGBase.h" int main(int argc, char *argv[]) { @@ -17,6 +19,20 @@ int main(int argc, char *argv[]) MainWindow w; QScreen *screen = QGuiApplication::primaryScreen(); w.move((screen->size().width() - w.width()) / 2, (screen->size().height() - w.height()) / 2); - w.show(); - return a.exec(); + + HGChar cfgPath[256]= {0}; + HGBase_GetConfigPath(cfgPath, 256); + strcat(cfgPath, "config.ini"); + HGChar str[256] = {0}; + HGBase_GetProfileString(cfgPath, "login", "password", "", str, 256); + QString password = (0 == *str) ? "123456" : MainWindow::passwordDecrypt(str); + + LoginDialog login("admin", password, &w); + if (login.exec()) + { + w.show(); + a.exec(); + } + + return 0; } diff --git a/app/fwupgrade/mainwindow.cpp b/app/fwupgrade/mainwindow.cpp index f89f78e5..74d4cb43 100644 --- a/app/fwupgrade/mainwindow.cpp +++ b/app/fwupgrade/mainwindow.cpp @@ -3,16 +3,398 @@ #include #include #include +#include +#include "dialog_upgradefirmware.h" +#include "base/HGBase.h" + +#define PASSWORD_KEY 4 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); + + m_curDevName.clear(); + m_curDevHandle = nullptr; + m_curFwVersion.clear(); + + ui->editFilePath->setEnabled(false); + ui->editOldPassword->setEchoMode(QLineEdit::EchoMode::Password); + ui->editNewPassword->setEchoMode(QLineEdit::EchoMode::Password); + ui->editNewPassword_2->setEchoMode(QLineEdit::EchoMode::Password); + + ui->btnGetVersionList->setEnabled(false); + ui->btnDownloadUpgrade->setEnabled(false); + ui->btnOpenFilePath->setEnabled(false); + ui->btnUpgrade->setEnabled(false); + ui->btnClearRollCount->setEnabled(false); + + connect(this, SIGNAL(sane_dev_arrive(QString, bool)), this, SLOT(on_sane_dev_arrive(QString, bool)), Qt::QueuedConnection); + connect(this, SIGNAL(sane_dev_remove(QString)), this, SLOT(on_sane_dev_remove(QString)), Qt::QueuedConnection); + + m_versionMgr = nullptr; + HGVersion_CreateMgr(&m_versionMgr); + m_versionInfo = nullptr; + m_versionCount = 0; + + SANE_Int v = 0; + sane_init_ex(&v, sane_ex_callback, this); } MainWindow::~MainWindow() { + if (nullptr != m_curDevHandle) + { + sane_close(m_curDevHandle); + m_curDevHandle = nullptr; + } + m_curFwVersion.clear(); + m_curDevName.clear(); + + sane_exit(); + + HGVersion_ReleaseVersionList(m_versionInfo, m_versionCount); + m_versionInfo = nullptr; + m_versionCount = 0; + HGVersion_DestroyMgr(m_versionMgr); + m_versionMgr = nullptr; + delete ui; } +QString MainWindow::passwordEncrypt(const QString& password) +{ + QString p = password; + int num = PASSWORD_KEY - p.length() % PASSWORD_KEY; + for (int i = 0; i < num; i++) + p.append("+"); + int rows = p.length() / 4; + QString transcode; + for (int i = 0; i < PASSWORD_KEY; i++) + for (int j = 0; j < rows; j++) + transcode.append(p[i + j * PASSWORD_KEY]); + + return transcode; +} + +QString MainWindow::passwordDecrypt(const QString& transcode) +{ + QString t = transcode; + int cols = t.length() / 4; + QString password; + for (int i = 0; i < cols; i++) + for (int j = 0; j < PASSWORD_KEY; j++) + password.append(t[i + j * cols]); + password.remove("+"); + return password; +} + +void MainWindow::on_sane_dev_arrive(QString devName, bool opened) +{ + int idx = -1; + int count = ui->comboDevList->count(); + for (int i = 0; i < count; ++i) + { + QString name = ui->comboDevList->itemText(i); + if (name == devName) + { + idx = i; + break; + } + } + + if (-1 == idx) + { + ui->comboDevList->addItem(devName); + ui->comboDevList2->addItem(devName); + } +} + +void MainWindow::on_sane_dev_remove(QString devName) +{ + int idx = -1; + int count = ui->comboDevList->count(); + for (int i = 0; i < count; ++i) + { + QString name = ui->comboDevList->itemText(i); + if (name == devName) + { + idx = i; + break; + } + } + + if (-1 != idx) + { + ui->comboDevList->removeItem(idx); + ui->comboDevList2->removeItem(idx); + } +} + +void MainWindow::on_btnExit_clicked() +{ + close(); +} + +int MainWindow::sane_ex_callback(SANE_Handle hdev, int code, void *data, unsigned int* len, void *param) +{ + (void)hdev; + (void)len; + MainWindow *p = (MainWindow *)param; + switch (code) + { + case SANE_EVENT_DEVICE_ARRIVED: + { + SANE_Device_Ex* sane_dev = (SANE_Device_Ex*)data; + emit p->sane_dev_arrive(sane_dev->name, sane_dev->openned == SANE_TRUE); + } + break; + case SANE_EVENT_DEVICE_LEFT: + { + SANE_Device* sane_dev = (SANE_Device*)data; + emit p->sane_dev_remove(sane_dev->name); + } + break; + } + + return 0; +} + +void MainWindow::on_comboDevList_currentIndexChanged(int index) +{ + ui->comboDevList2->setCurrentIndex(index); + + HGVersion_ReleaseVersionList(m_versionInfo, m_versionCount); + m_versionInfo = nullptr; + m_versionCount = 0; + ui->comboVersionList->clear(); + + ui->editFilePath->clear(); + ui->labelRollCount->setText("0"); + ui->labelScanCount->setText("0"); + + if (nullptr != m_curDevHandle) + { + sane_close(m_curDevHandle); + m_curDevHandle = nullptr; + } + m_curFwVersion.clear(); + m_curDevName.clear(); + + ui->btnGetVersionList->setEnabled(false); + ui->btnDownloadUpgrade->setEnabled(false); + ui->btnOpenFilePath->setEnabled(false); + ui->btnUpgrade->setEnabled(false); + ui->btnClearRollCount->setEnabled(false); + + if (-1 != index) + { + QString name = ui->comboDevList->itemText(index); + if (SANE_STATUS_GOOD == sane_open(name.toStdString().c_str(), &m_curDevHandle)) + { + m_curDevName = name; + + std::string versionNum; + unsigned int versionNumLen = 0; + if(SANE_STATUS_NO_MEM == sane_io_control(m_curDevHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, nullptr, &versionNumLen) + && versionNumLen) + { + versionNum.resize(versionNumLen); + sane_io_control(m_curDevHandle, IO_CTRL_CODE_GET_HARDWARE_VERSION, &versionNum[0], &versionNumLen); + } + + m_curFwVersion = QString::fromStdString(versionNum.c_str()); + ui->labelDevInfo->setText(QString("open device: %1, firmware version: %2").arg(name).arg(m_curFwVersion)); + + ui->labelRollCount->setText("do not support"); + ui->labelScanCount->setText("do not support"); + + ui->btnGetVersionList->setEnabled(true); + ui->btnOpenFilePath->setEnabled(true); + ui->btnClearRollCount->setEnabled(true); + } + else + { + ui->labelDevInfo->setText(QString("open device error: %1").arg(name)); + } + } + else + { + ui->labelDevInfo->setText("no device opened"); + } +} + +void MainWindow::on_btnGetVersionList_clicked() +{ + HGVersion_ReleaseVersionList(m_versionInfo, m_versionCount); + m_versionInfo = nullptr; + m_versionCount = 0; + ui->comboVersionList->clear(); + + std::string devType; + if (m_curFwVersion.left(2) == "G1") + devType = "G100"; + else if (m_curFwVersion.left(2) == "G2") + devType = "G200"; + else if (m_curFwVersion.left(2) == "G3") + devType = "G300"; + else if (m_curFwVersion.left(2) == "G4") + devType = "G400"; + + HGVersion_GetDriverVersionList(m_versionMgr, devType.c_str(), &m_versionInfo, &m_versionCount); + if (0 != m_versionCount) + { + for (HGUInt i = 0; i < m_versionCount; ++i) + { + ui->comboVersionList->addItem(m_versionInfo[i].version); + } + } + else + { + QMessageBox msg(QMessageBox::Information, tr("tips"), tr("no version available"), QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); + } +} + +void MainWindow::on_comboVersionList_currentIndexChanged(int index) +{ + if (-1 != index) + { + ui->btnDownloadUpgrade->setEnabled(true); + } + else + { + ui->btnDownloadUpgrade->setEnabled(false); + } +} + +void MainWindow::on_editFilePath_textChanged(const QString &arg1) +{ + if (arg1.isEmpty()) + { + ui->btnUpgrade->setEnabled(false); + } + else + { + ui->btnUpgrade->setEnabled(true); + } +} + +void MainWindow::on_btnOpenFilePath_clicked() +{ + QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Zip Files(*.zip *.zip)")); + if (!filePath.isEmpty()) + { + ui->editFilePath->setText(filePath); + } +} + +void MainWindow::on_btnDownloadUpgrade_clicked() +{ + int idx = ui->comboVersionList->currentIndex(); + if (-1 != idx) + { + Dialog_upgradeFirmware dlg(m_versionMgr, m_curDevHandle, m_versionInfo[idx].url, m_versionInfo[idx].version, + m_versionInfo[idx].md5, this); + dlg.exec(); + if (0 == dlg.getUpgradeStatus()) + { + ui->labelDevInfo->setText(QString("device: %1 upgrade firmware success").arg(m_curDevName)); + } + else if (1 == dlg.getUpgradeStatus()) + { + ui->labelDevInfo->setText(QString("device: %1 upgrade firmware failed, download file fail").arg(m_curDevName)); + } + else if (2 == dlg.getUpgradeStatus()) + { + ui->labelDevInfo->setText(QString("device: %1 upgrade firmware failed, io error").arg(m_curDevName)); + } + } +} + +void MainWindow::on_btnUpgrade_clicked() +{ + std::string filePath = ui->editFilePath->text().toStdString(); + if (!filePath.empty()) + { + Dialog_upgradeFirmware dlg(m_curDevHandle, filePath, this); + dlg.exec(); + if (0 == dlg.getUpgradeStatus()) + { + ui->labelDevInfo->setText(QString("device: %1 upgrade firmware success").arg(m_curDevName)); + } + else if (2 == dlg.getUpgradeStatus()) + { + ui->labelDevInfo->setText(QString("device: %1 upgrade firmware failed, io error").arg(m_curDevName)); + } + } +} + +void MainWindow::on_comboDevList2_currentIndexChanged(int index) +{ + ui->comboDevList->setCurrentIndex(index); +} + +void MainWindow::on_btnClearRollCount_clicked() +{ + unsigned int count = 0; + int ret = sane_io_control(m_curDevHandle, IO_CTRL_CODE_CLEAR_ROLLER_COUNT, nullptr, &count); + + QString info; + if(ret == SANE_STATUS_GOOD) + info = tr("Roller scanned count has been set to 0."); + else + info = tr("Roller scanned count reset failed."); + + QMessageBox msg(QMessageBox::Information, tr("tips"), info, QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); +} + +void MainWindow::on_btnModifyPassword_clicked() +{ + HGChar cfgPath[256]= {0}; + HGBase_GetConfigPath(cfgPath, 256); + strcat(cfgPath, "config.ini"); + HGChar str[256] = {0}; + HGBase_GetProfileString(cfgPath, "login", "password", "", str, 256); + QString password = (0 == *str) ? "123456" : MainWindow::passwordDecrypt(str); + + if (password != ui->editOldPassword->text()) + { + QMessageBox msg(QMessageBox::Information, tr("tips"), "old password is wrong", QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); + return; + } + + if (ui->editNewPassword->text().isEmpty()) + { + QMessageBox msg(QMessageBox::Information, tr("tips"), "new password can not be empty", QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); + return; + } + + if (ui->editNewPassword->text() != ui->editNewPassword_2->text()) + { + QMessageBox msg(QMessageBox::Information, tr("tips"), "new password is inconsistent", QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); + return; + } + + if (HGBASE_ERR_OK != HGBase_SetProfileString(cfgPath, "login", "password", passwordEncrypt(ui->editNewPassword->text()).toStdString().c_str())) + { + QMessageBox msg(QMessageBox::Information, tr("tips"), "modify password fail", QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); + return; + } + + QMessageBox msg(QMessageBox::Information, tr("tips"), "modify password success", QMessageBox::Yes, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.exec(); +} diff --git a/app/fwupgrade/mainwindow.h b/app/fwupgrade/mainwindow.h index 4643e322..9a11a168 100644 --- a/app/fwupgrade/mainwindow.h +++ b/app/fwupgrade/mainwindow.h @@ -2,6 +2,8 @@ #define MAINWINDOW_H #include +#include "version/HGVersion.h" +#include "sane/sane_ex.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } @@ -15,7 +17,49 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); + static QString passwordEncrypt(const QString& password); + static QString passwordDecrypt(const QString& transcode); + +signals: + void sane_dev_arrive(QString devName, bool opened); + void sane_dev_remove(QString devName); + +private slots: + void on_sane_dev_arrive(QString devName, bool opened); + void on_sane_dev_remove(QString devName); + void on_btnExit_clicked(); + + void on_comboDevList_currentIndexChanged(int index); + + void on_btnGetVersionList_clicked(); + + void on_comboVersionList_currentIndexChanged(int index); + + void on_editFilePath_textChanged(const QString &arg1); + + void on_btnOpenFilePath_clicked(); + + void on_btnDownloadUpgrade_clicked(); + + void on_btnUpgrade_clicked(); + + void on_comboDevList2_currentIndexChanged(int index); + + void on_btnClearRollCount_clicked(); + + void on_btnModifyPassword_clicked(); + +private: + static int sane_ex_callback(SANE_Handle hdev, int code, void *data, unsigned int* len, void *param); + private: Ui::MainWindow *ui; + HGVersionMgr m_versionMgr; + HGVersionInfo* m_versionInfo; + HGUInt m_versionCount; + + QString m_curDevName; + SANE_Handle m_curDevHandle; + QString m_curFwVersion; }; #endif // MAINWINDOW_H diff --git a/app/fwupgrade/mainwindow.ui b/app/fwupgrade/mainwindow.ui index 79ce4df9..7ae482f6 100644 --- a/app/fwupgrade/mainwindow.ui +++ b/app/fwupgrade/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 599 - 385 + 740 + 497 @@ -16,17 +16,380 @@ - - - - - - - - + + + 0 + + + + update firmware + + + + + 103 + 40 + 81 + 20 + + + + device list + + + + + + 180 + 80 + 401 + 20 + + + + + + + + + + 190 + 40 + 391 + 22 + + + + + + + 90 + 110 + 501 + 111 + + + + online upgrade + + + + + 110 + 30 + 271 + 22 + + + + + + + 400 + 30 + 91 + 23 + + + + get version list + + + + + + 400 + 70 + 91 + 23 + + + + download and upgrade + + + + + + 10 + 30 + 91 + 20 + + + + version list + + + + + + + 90 + 250 + 501 + 111 + + + + local upgrade + + + + + 10 + 30 + 91 + 20 + + + + file path + + + + + + 110 + 30 + 271 + 20 + + + + + + + 394 + 30 + 101 + 23 + + + + open file path + + + + + + 394 + 70 + 101 + 23 + + + + upgrade + + + + + + + manager tools + + + + + 103 + 50 + 81 + 20 + + + + device list + + + + + + 200 + 50 + 361 + 22 + + + + + + + 110 + 120 + 81 + 20 + + + + roll count: + + + + + + 200 + 120 + 81 + 21 + + + + 0 + + + + + + 200 + 150 + 81 + 21 + + + + 0 + + + + + + 110 + 150 + 81 + 20 + + + + scan count: + + + + + + 200 + 200 + 111 + 31 + + + + clear roll count + + + + + + password change + + + + + 180 + 90 + 91 + 21 + + + + old password + + + + + + 180 + 140 + 91 + 21 + + + + new password + + + + + + 290 + 90 + 191 + 20 + + + + + + + 290 + 140 + 191 + 20 + + + + + + + 350 + 250 + 131 + 31 + + + + modify password + + + + + + 290 + 190 + 191 + 20 + + + + + + + 180 + 190 + 91 + 21 + + + + confirm new password + + + + - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + exit + + + + @@ -35,7 +398,7 @@ 0 0 - 599 + 740 22 diff --git a/build-qt/HGSolution/HGFWUpgrade/HGFWUpgrade.pro b/build-qt/HGSolution/HGFWUpgrade/HGFWUpgrade.pro index f6c7a7be..aeb22424 100644 --- a/build-qt/HGSolution/HGFWUpgrade/HGFWUpgrade.pro +++ b/build-qt/HGSolution/HGFWUpgrade/HGFWUpgrade.pro @@ -141,15 +141,22 @@ unix { INCLUDEPATH += $$PWD/../../../app/fwupgrade/ INCLUDEPATH += $$PWD/../../../modules/ +INCLUDEPATH += $$PWD/../../../../sdk/include/ SOURCES += \ + ../../../app/fwupgrade/dialog_upgradefirmware.cpp \ + ../../../app/fwupgrade/logindialog.cpp \ ../../../app/fwupgrade/main.cpp \ ../../../app/fwupgrade/mainwindow.cpp \ HEADERS += \ + ../../../app/fwupgrade/dialog_upgradefirmware.h \ + ../../../app/fwupgrade/logindialog.h \ ../../../app/fwupgrade/mainwindow.h \ FORMS += \ + ../../../app/fwupgrade/dialog_upgradefirmware.ui \ + ../../../app/fwupgrade/logindialog.ui \ ../../../app/fwupgrade/mainwindow.ui RESOURCES += \ diff --git a/test/scannerlib/cumtenn/CMakeLists.txt b/test/scannerlib/cumtenn/CMakeLists.txt new file mode 100644 index 00000000..120cd353 --- /dev/null +++ b/test/scannerlib/cumtenn/CMakeLists.txt @@ -0,0 +1,12 @@ +project(testdemo) + +FILE(GLOB SRC "*.cpp" "*.h" "*.c") +include_directories(${PROJECT_SOURCE_DIR}/) + +add_executable(${PROJECT_NAME} ${SRC}) + +target_link_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/) + +target_link_libraries(${PROJECT_NAME} HGBase hgdriver HGImgFmt HGImgProc HGScannerLib mupdf pdf sane-hgsane) + +set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/) \ No newline at end of file diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.Designer.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.Designer.cs new file mode 100644 index 00000000..76ecc4fb --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.Designer.cs @@ -0,0 +1,62 @@ + +namespace WindowsFormsApp1 +{ + partial class Form1 + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要修改 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(301, 157); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(166, 65); + this.button1.TabIndex = 0; + this.button1.Text = "扫描"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.button1); + this.Name = "Form1"; + this.Text = "Form1"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button button1; + } +} + diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.cs new file mode 100644 index 00000000..8b733879 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.cs @@ -0,0 +1,281 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.Globalization; +using System.Timers; +using System.Threading; + +namespace WindowsFormsApp1 +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void button1_Click(object sender, EventArgs e) + { + UIntPtr image = HGScannerLib.HGLib_LoadImage(StringToUtf8("1.jpg")); + if (UIntPtr.Zero != image) + { + HGScannerLib.HGLibSaveImageParam saveParam; + saveParam.size = (UInt32)Marshal.SizeOf(typeof(HGScannerLib.HGLibSaveImageParam)); + saveParam.jpegQuality = 80; + saveParam.tiffCompression = 4; + saveParam.tiffJpegQuality = 80; + saveParam.ocr = 0; + HGScannerLib.HGLib_SaveImage(image, StringToUtf8("2.jpg"), ref saveParam); + HGScannerLib.HGLib_ReleaseImage(image); + } + + HGScannerLib.HGLibDeviceHotPlugEventFunc fun = new HGScannerLib.HGLibDeviceHotPlugEventFunc(DeviceHotPlugEventFunc); + HGScannerLib.HGLib_InitDevice(fun, this.Handle); + Thread.Sleep(500); + + IntPtr deviceNameList = HGScannerLib.HGLib_GetDeviceNameList(); + if (IntPtr.Zero != deviceNameList) + { + // 获取设备列表 + int i = 0; + IntPtr deviceName = Marshal.ReadIntPtr(deviceNameList, 0); + while (IntPtr.Zero != deviceName) + { + String deviceNameText = Utf8ToString(deviceName); + ++i; + deviceName = Marshal.ReadIntPtr(deviceNameList, Marshal.SizeOf(typeof(IntPtr)) * i); + } + + // 打开第一个设备 + UIntPtr device = HGScannerLib.HGLib_OpenDevice(Marshal.ReadIntPtr(deviceNameList, 0)); + if (UIntPtr.Zero != device) + { + // 获取序列号 + Byte[] sn = new Byte[60]; + IntPtr snAddr = Marshal.UnsafeAddrOfPinnedArrayElement(sn, 0); + HGScannerLib.HGLib_GetDeviceSN(device, snAddr, 60); + String snText = Utf8ToString(snAddr); + + // 获取固件版本号 + Byte[] fwVer = new Byte[60]; + IntPtr fwVerAddr = Marshal.UnsafeAddrOfPinnedArrayElement(fwVer, 0); + HGScannerLib.HGLib_GetDeviceFWVersion(device, fwVerAddr, 60); + String fwVerText = Utf8ToString(fwVerAddr); + + // 设置待纸扫描 + Int32[] dzsm = new Int32[1]; + dzsm[0] = 1; + Int32 ret1 = HGScannerLib.HGLib_SetDeviceParam(device, 67, + Marshal.UnsafeAddrOfPinnedArrayElement(dzsm, 0)); + + // 设置旋转90度 + UInt32[] rotate = new UInt32[1]; + rotate[0] = 67; + Int32 ret2 = HGScannerLib.HGLib_SetDeviceParam(device, 59, + Marshal.UnsafeAddrOfPinnedArrayElement(rotate, 0)); + + // 设置伽马值 + Double[] gamma = new Double[1]; + gamma[0] = 1.0; + Int32 ret3 = HGScannerLib.HGLib_SetDeviceParam(device, 35, + Marshal.UnsafeAddrOfPinnedArrayElement(gamma, 0)); + + // 获取旋转的配置 + IntPtr rotateParam = HGScannerLib.HGLib_GetDeviceParam(device, 59); + if (IntPtr.Zero != rotateParam) + { + HGScannerLib.HGLibDeviceParam param = (HGScannerLib.HGLibDeviceParam) + Marshal.PtrToStructure(rotateParam, typeof(HGScannerLib.HGLibDeviceParam)); + + // print param + PrintParam(ref param); + + HGScannerLib.HGLib_ReleaseDeviceParam(rotateParam); + } + + // 获取所有配置 + UInt32 groupCount = 0; + IntPtr groupParamList = HGScannerLib.HGLib_GetDeviceParamGroupList(device, ref groupCount); + if (IntPtr.Zero != groupParamList) + { + for (int groupIdx = 0; groupIdx < (int)groupCount; ++groupIdx) + { + HGScannerLib.HGLibDeviceParamGroup group = (HGScannerLib.HGLibDeviceParamGroup) + Marshal.PtrToStructure(groupParamList + Marshal.SizeOf(typeof(HGScannerLib.HGLibDeviceParamGroup)) * groupIdx, + typeof(HGScannerLib.HGLibDeviceParamGroup)); + + // 组名 + UInt32 groupName = group.group; + // 组内配置的数量 + UInt32 paramCount = group.paramCount; + + for (int paramIdx = 0; paramIdx < group.paramCount; ++paramIdx) + { + HGScannerLib.HGLibDeviceParam param = (HGScannerLib.HGLibDeviceParam) + Marshal.PtrToStructure(group.param + Marshal.SizeOf(typeof(HGScannerLib.HGLibDeviceParam)) * paramIdx, + typeof(HGScannerLib.HGLibDeviceParam)); + + // print param + PrintParam(ref param); + } + } + + HGScannerLib.HGLib_ReleaseDeviceParamGroupList(groupParamList, groupCount); + } + + // 扫描 + m_break = false; + HGScannerLib.HGLibDeviceScanEventFunc eventFunc = new HGScannerLib.HGLibDeviceScanEventFunc(DeviceScanEventFunc); + HGScannerLib.HGLibDeviceScanImageFunc imageFunc = new HGScannerLib.HGLibDeviceScanImageFunc(DeviceScanImageFunc); + Int32 scanRet = HGScannerLib.HGLib_StartDeviceScan(device, eventFunc, this.Handle, imageFunc, this.Handle); + if (0 != scanRet) + { + while (!m_break) + { + Thread.Sleep(100); + } + + HGScannerLib.HGLib_StopDeviceScan(device); + } + + HGScannerLib.HGLib_CloseDevice(device); + } + + HGScannerLib.HGLib_ReleaseDeviceNameList(deviceNameList); + } + + HGScannerLib.HGLib_DeinitDevice(); + } + + public void DeviceHotPlugEventFunc(UInt32 evt, IntPtr deviceName, IntPtr param) + { + String devNameText = Utf8ToString(deviceName); + } + + public void DeviceScanEventFunc(UIntPtr device, UInt32 evt, Int32 err, IntPtr info, IntPtr param) + { + if (evt == 2) + { + m_break = true; + } + else if (3 == evt) + { + String infoText = Utf8ToString(info); + } + } + + public void DeviceScanImageFunc(UIntPtr device, UIntPtr image, IntPtr param) + { + String fileName = String.Format("Scan_{0}.jpg", m_scanCount); + ++m_scanCount; + + HGScannerLib.HGLibSaveImageParam saveParam; + saveParam.size = (UInt32)Marshal.SizeOf(typeof(HGScannerLib.HGLibSaveImageParam)); + saveParam.jpegQuality = 80; + saveParam.tiffCompression = 4; + saveParam.tiffJpegQuality = 80; + saveParam.ocr = 0; + HGScannerLib.HGLib_SaveImage(image, StringToUtf8(fileName), ref saveParam); + } + + public String Utf8ToString(IntPtr str) + { + if (IntPtr.Zero == str) + { + return ""; + } + + int len = 0; + while (0 != Marshal.ReadByte(str, len)) + { + ++len; + } + + if (0 == len) + { + return ""; + } + + Byte[] utf8 = new Byte[len]; + Marshal.Copy(str, utf8, 0, len); + return Encoding.UTF8.GetString(utf8); + } + + public IntPtr StringToUtf8(String str) + { + if (str.Length == 0) + { + return IntPtr.Zero; + } + + Byte[] src = Encoding.UTF8.GetBytes(str); + Byte[] dst = new Byte[src.Length + 1]; + for (int i = 0; i < src.Length; ++i) + dst[i] = src[i]; + dst[dst.Length - 1] = 0; + return Marshal.UnsafeAddrOfPinnedArrayElement(dst, 0); + } + + public void PrintParam(ref HGScannerLib.HGLibDeviceParam param) + { + // 配置名 + UInt32 option = param.option; + + if (1 == param.type) // 整型 + { + Int32 value = param.typeValue.intValue; + } + else if (2 == param.type) // 枚举 + { + UInt32 value = param.typeValue.enumValue; + } + else if (3 == param.type) // 双精度浮点 + { + Double value = param.typeValue.doubleValue; + } + else if (4 == param.type) // BOOL + { + Int32 value = param.typeValue.boolValue; + } + + if (param.rangeType == 1) // 整型列表 + { + Int32[] intValueList = new Int32[param.rangeTypeValue.intValueList.count]; + Marshal.Copy(param.rangeTypeValue.intValueList.value, intValueList, 0, (int)param.rangeTypeValue.intValueList.count); + } + else if (param.rangeType == 2) // 枚举列表 + { + Int32[] enumValueList = new Int32[param.rangeTypeValue.enumValueList.count]; + Marshal.Copy(param.rangeTypeValue.enumValueList.value, enumValueList, 0, (int)param.rangeTypeValue.enumValueList.count); + } + else if (param.rangeType == 3) // 双精度浮点列表 + { + Double[] doubleValueList = new Double[param.rangeTypeValue.doubleValueList.count]; + Marshal.Copy(param.rangeTypeValue.doubleValueList.value, doubleValueList, 0, (int)param.rangeTypeValue.doubleValueList.count); + } + else if (param.rangeType == 4) // 整型范围 + { + // 最小值 + Int32 minVal = param.rangeTypeValue.intValueRange.minValue; + // 最大值 + Int32 maxVal = param.rangeTypeValue.intValueRange.maxValue; + } + else if (param.rangeType == 5) // 双精度浮点范围 + { + // 最小值 + Double minVal = param.rangeTypeValue.doubleValueRange.minValue; + // 最大值 + Double maxVal = param.rangeTypeValue.doubleValueRange.maxValue; + } + } + + public UInt32 m_scanCount = 1; + public Boolean m_break = false; + } +} diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.resx b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.resx new file mode 100644 index 00000000..1af7de15 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Form1.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/HGScannerLib.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/HGScannerLib.cs new file mode 100644 index 00000000..ebb797d0 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/HGScannerLib.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; + +namespace WindowsFormsApp1 +{ + public class HGScannerLib + { + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibSaveImageParam + { + public UInt32 size; + public UInt32 jpegQuality; + public UInt32 tiffCompression; + public UInt32 tiffJpegQuality; + public Int32 ocr; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceIntValueList + { + public IntPtr value; // Int32指针 + public UInt32 count; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceEnumValueList + { + public IntPtr value; // UInt32指针 + public UInt32 count; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceDoubleValueList + { + public IntPtr value; // Double指针 + public UInt32 count; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceIntValueRange + { + public Int32 minValue; + public Int32 maxValue; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceDoubleValueRange + { + public Double minValue; + public Double maxValue; + } + + [StructLayout(LayoutKind.Explicit, Pack = 4)] + public struct HGLibDeviceParamType + { + [FieldOffset(0)] public Int32 intValue; + [FieldOffset(0)] public UInt32 enumValue; + [FieldOffset(0)] public Double doubleValue; + [FieldOffset(0)] public Int32 boolValue; + } + + [StructLayout(LayoutKind.Explicit, Pack = 4)] + public struct HGLibDeviceParamRangeType + { + [FieldOffset(0)] public HGLibDeviceIntValueList intValueList; + [FieldOffset(0)] public HGLibDeviceEnumValueList enumValueList; + [FieldOffset(0)] public HGLibDeviceDoubleValueList doubleValueList; + [FieldOffset(0)] public HGLibDeviceIntValueRange intValueRange; + [FieldOffset(0)] public HGLibDeviceDoubleValueRange doubleValueRange; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceParam + { + public UInt32 option; + public UInt32 type; + public HGLibDeviceParamType typeValue; + public UInt32 rangeType; + public HGLibDeviceParamRangeType rangeTypeValue; + } + + [StructLayout(LayoutKind.Sequential, Pack = 4)] + public struct HGLibDeviceParamGroup + { + public UInt32 group; + public IntPtr param; // HGLibDeviceParam指针 + public UInt32 paramCount; + } + + public delegate void HGLibDeviceHotPlugEventFunc(UInt32 evt, IntPtr deviceName, IntPtr param); + public delegate void HGLibDeviceScanEventFunc(UIntPtr device, UInt32 evt, Int32 err, IntPtr info, IntPtr param); + public delegate void HGLibDeviceScanImageFunc(UIntPtr device, UIntPtr image, IntPtr param); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_LoadImage")] + public static extern UIntPtr HGLib_LoadImage(IntPtr filePath); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_SaveImage")] + public static extern Int32 HGLib_SaveImage(UIntPtr image, IntPtr filePath, ref HGLibSaveImageParam saveParam); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_ReleaseImage")] + public static extern Int32 HGLib_ReleaseImage(UIntPtr image); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_InitDevice")] + public static extern Int32 HGLib_InitDevice(HGLibDeviceHotPlugEventFunc func, IntPtr param); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_DeinitDevice")] + public static extern Int32 HGLib_DeinitDevice(); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_GetDeviceNameList")] + public static extern IntPtr HGLib_GetDeviceNameList(); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_ReleaseDeviceNameList")] + public static extern Int32 HGLib_ReleaseDeviceNameList(IntPtr deviceNameList); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_OpenDevice")] + public static extern UIntPtr HGLib_OpenDevice(IntPtr deviceName); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_CloseDevice")] + public static extern Int32 HGLib_CloseDevice(UIntPtr device); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_GetDeviceSN")] + public static extern Int32 HGLib_GetDeviceSN(UIntPtr device, IntPtr sn, UInt32 maxLen); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_GetDeviceFWVersion")] + public static extern Int32 HGLib_GetDeviceFWVersion(UIntPtr device, IntPtr fwVersion, UInt32 maxLen); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_SetDeviceParam")] + public static extern Int32 HGLib_SetDeviceParam(UIntPtr device, UInt32 option, IntPtr data); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_GetDeviceParamGroupList")] + public static extern IntPtr HGLib_GetDeviceParamGroupList(UIntPtr device, ref UInt32 count); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_GetDeviceParam")] + public static extern IntPtr HGLib_GetDeviceParam(UIntPtr device, UInt32 option); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_ReleaseDeviceParamGroupList")] + public static extern Int32 HGLib_ReleaseDeviceParamGroupList(IntPtr devParamGroup, UInt32 count); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_ReleaseDeviceParam")] + public static extern Int32 HGLib_ReleaseDeviceParam(IntPtr devParam); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_ResetDeviceParam")] + public static extern Int32 HGLib_ResetDeviceParam(UIntPtr device); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_DeviceIsPaperOn")] + public static extern Int32 HGLib_DeviceIsPaperOn(UIntPtr device); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_StartDeviceScan")] + public static extern Int32 HGLib_StartDeviceScan(UIntPtr device, HGLibDeviceScanEventFunc eventFunc, IntPtr eventParam, + HGLibDeviceScanImageFunc imageFunc, IntPtr imageParam); + + [DllImport("CTSScannerLib.dll", EntryPoint = "HGLib_StopDeviceScan")] + public static extern Int32 HGLib_StopDeviceScan(UIntPtr device); + } +} diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Program.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Program.cs new file mode 100644 index 00000000..1561dc46 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace WindowsFormsApp1 +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Form1()); + } + } +} diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/AssemblyInfo.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..187bd623 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("WindowsFormsApp1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WindowsFormsApp1")] +[assembly: AssemblyCopyright("Copyright © 2022")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("e364d770-bb5c-400a-902e-213a3dadcbd5")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.Designer.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.Designer.cs new file mode 100644 index 00000000..7a2f3472 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.Designer.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本: 4.0.30319.42000 +// +// 对此文件的更改可能导致不正确的行为,如果 +// 重新生成代码,则所做更改将丢失。 +// +//------------------------------------------------------------------------------ + + +namespace WindowsFormsApp1.Properties +{ + /// + /// 强类型资源类,用于查找本地化字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// 返回此类使用的缓存 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WindowsFormsApp1.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.resx b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.Designer.cs b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.Designer.cs new file mode 100644 index 00000000..3cdaf800 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.Designer.cs @@ -0,0 +1,29 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +namespace WindowsFormsApp1.Properties +{ + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.settings b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.csproj b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.csproj new file mode 100644 index 00000000..67d99ae5 --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.csproj @@ -0,0 +1,81 @@ + + + + + Debug + AnyCPU + {E364D770-BB5C-400A-902E-213A3DADCBD5} + WinExe + WindowsFormsApp1 + WindowsFormsApp1 + v4.0 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + true + + + + + + + + + + + + + + + + Form + + + Form1.cs + + + + + + Form1.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + \ No newline at end of file diff --git a/test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.sln b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.sln new file mode 100644 index 00000000..d528cfab --- /dev/null +++ b/test/scannerlib/cumtenn/c#/WindowsFormsApp1/WindowsFormsApp1.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32228.343 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsFormsApp1", "WindowsFormsApp1.csproj", "{E364D770-BB5C-400A-902E-213A3DADCBD5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E364D770-BB5C-400A-902E-213A3DADCBD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E364D770-BB5C-400A-902E-213A3DADCBD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E364D770-BB5C-400A-902E-213A3DADCBD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E364D770-BB5C-400A-902E-213A3DADCBD5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8B1D5CE6-959A-4477-B3BE-E7DEDDE78BB6} + EndGlobalSection +EndGlobal diff --git a/test/scannerlib/cumtenn/main.cpp b/test/scannerlib/cumtenn/main.cpp new file mode 100644 index 00000000..b28bd391 --- /dev/null +++ b/test/scannerlib/cumtenn/main.cpp @@ -0,0 +1,176 @@ +#include +#include +#include +#include +#include "HGScannerLib.h" + +#define DELEAY_MS(x) std::this_thread::sleep_for(std::chrono::milliseconds((x))) +using namespace std; + +//有图事件回调 +static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPointer param) +{ + static int indeximg = 0; + string savepath = std::to_string(++indeximg) + ".jpg"; + cout << "save image : " << savepath << endl; + auto ret = HGLib_SaveImage(image, savepath.c_str(), 0); + cout << "save image : " << savepath << (ret ? " success" : " failed") << endl; +} + +//设备热拔插事件回调 +static void HGAPI DeviceHotPlugEvent(HGUInt event, const HGChar *deviceName, HGPointer param) +{ + cout << "Devices : " << deviceName << " DeviceHotPlugEvent : " << (event == HGLIB_DEVHOTPLUG_EVENT_ARRIVE ? "HGLIB_DEVHOTPLUG_EVENT_ARRIVE " : "HGLIB_DEVHOTPLUG_EVENT_LEFT") << endl; +} + +//扫描状态事件回调 +static void HGAPI DeviceScanEvent(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param) +{ + switch (event) + { + case HGLIB_DEVSCAN_EVENT_BEGIN: + cout << "DeviceScanEvent Start Scan" << endl; + break; + case HGLIB_DEVSCAN_EVENT_END: + cout << "DeviceScanEvent Scan stopped" << endl; + break; + case HGLIB_DEVSCAN_EVENT_INFO: + cout << "DeviceScanEvent info : " << info << endl; + break; + default: + cout << "Unkownun DeviceScanEvent " << event << endl; + break; + } +} + +int main(unsigned char argc, unsigned char *argv[]) +{ + std::cout << "*********Enter Scanner SDK Demo *********" << std::endl; + HGLib_InitDevice(DeviceHotPlugEvent, 0); //初始化调用模块 + DELEAY_MS(5000); + + HGChar **devNameList = HGLib_GetDeviceNameList(); //获取已连接的设备列表,已字符数组的形式返回 + if (devNameList) + { + HGLibDevice dev = HGLib_OpenDevice(devNameList[0]); //此示例代码中调用设备列表中第一个设备 + if (dev) + { + + HGUInt grpCount = 0; + HGLibDeviceParamGroup *groups = HGLib_GetDeviceParamGroupList(dev, &grpCount); + if (groups) + { + //获取sdk支持的功能项及配置项内容 + for (size_t i = 0; i < grpCount; i++) + { + cout << "group: " << groups[i].group << endl; + for (size_t j = 0; j < groups[i].paramCount; j++) + { + cout << " option: " << groups[i].param[j].option + << " type: " << groups[i].param[j].type << endl; + switch (groups[i].param[j].rangeType) + { + case HGLIB_OPTION_VALUERANGETYPE_INTLIST: + for (size_t k = 0; k < groups[i].param[j].intValueList.count; k++) + { + cout<<"support value["< 不进行多流输出类型 +Ret = HGLib_SetDeviceParam(Device, 1, byref(DevParam)) #见HGLib_SetDeviceParam 头文件接口说明 1 -> HGLIB_OPTION_NAME_DLSC 多流输出 + + +#扫描事件回调 +def HGLibDeviceScanEventFunc(device: c_void_p, event: c_uint, err: c_int, info: c_char_p, param: c_void_p): + s_info=info + global bStop + print("event code",event," event info:",s_info) + if event == 2:#HGLIB_DEVSCAN_EVENT_END 扫描停止 + bStop=True + print("bStop true") + elif event == 1: + bStop=False + print("bStop false") + return +imgindex=0 +#扫描图像事件回调 +def HGLibDeviceScanImageFunc(device: c_void_p, image: c_void_p, param: c_void_p): + global imgindex + ImageParam = HGLibSaveImageParam() + ImageParam.size = sizeof(ImageParam) + ImageParam.jpegQuality = 80 + ImageParam.tiffCompression = 4 + ImageParam.tiffJpegQuality = 80 + ImageParam.ocr = 0 + print("image call back!!") + imgindex+=1 + t_index=imgindex + imgname=str(t_index) + '_scanned.jpg' + print(imgname) + b_imagename=imgname.encode('utf-8') + pchar=c_char_p(b_imagename) + Ret = HGLib_SaveImage(image, pchar, pointer(ImageParam)) + return + +#注册扫描相关事件并启动扫描 +FuncType1 = CFUNCTYPE(None, c_void_p, c_uint, c_int, c_char_p, c_void_p) +cb1 = FuncType1(HGLibDeviceScanEventFunc) +FuncType2 = CFUNCTYPE(None, c_void_p, c_void_p, c_void_p) +cb2 = FuncType2(HGLibDeviceScanImageFunc) +HGLib_StartDeviceScan = Objdll.HGLib_StartDeviceScan +HGLib_StartDeviceScan.argtypes = [c_void_p, FuncType1, c_void_p, FuncType2, c_void_p] +HGLib_StartDeviceScan.restyped = ctypes.c_int +print("start scan") +Ret = HGLib_StartDeviceScan(Device, cb1, 0, cb2, 0) + +#模拟扫描持续应等待扫描事件回调返回扫描停止才结束本次扫描流程 +while(not bStop): + time.sleep(1) + print("scanning...") + + +print("scan done!!!") + +#关闭当前打开的设备 +HGLib_CloseDevice=Objdll.HGLib_CloseDevice +HGLib_CloseDevice.argtypes = [c_void_p] +HGLib_CloseDevice.restype = ctypes.c_int +HGLib_CloseDevice(Device) +print("Close Devices") + +#释放设备列表资源 +HGLib_ReleaseDeviceNameList=Objdll.HGLib_ReleaseDeviceNameList +HGLib_ReleaseDeviceNameList.argtypes=[POINTER(ctypes.c_char_p)] +HGLib_ReleaseDeviceNameList.restype = ctypes.c_int +HGLib_ReleaseDeviceNameList(DeviceNameList) +print("ReleaseDeviceNameList done") + +print("exit test") + +