diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index 4642445b..1de0946a 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -283,7 +283,7 @@ std::string GScanO200::GetFWVersion() std::string GScanO200::GetSerialNum() { - //return "G20018000298"; + return "G20018000298"; if (m_usb.get() && m_usb->is_connected()) { std::lock_guard lck(m_imgLocker); @@ -482,7 +482,8 @@ void GScanO200::usbhotplug(bool isleft) { if (isleft) { //std::lock_guard lck(m_Locker); - //FileTools::write_log("D:\\1.txt", "usbhotplug left"); + //FileTools:: + ("D:\\1.txt", "usbhotplug left"); devState = DEV_WRONG; Error_Code = USB_DISCONNECTED; m_pImages->setscanflags(false); diff --git a/huagao/GscanJsonConfig.h b/huagao/GscanJsonConfig.h index c89835e0..0c4a4c4d 100644 --- a/huagao/GscanJsonConfig.h +++ b/huagao/GscanJsonConfig.h @@ -12,9 +12,8 @@ public: void SaveGscanCapConfig(const GScanCap& gcap, const std::string path); void WriteJsonArrayToFile(std::vector cfgArray, const std::string filename); GScanCap ReadGscanCap(); - std::vector ReadGscanCapsVector(const std::string gcapsfilepath); - bool DeleteJsonFile(std::string path); -private: + std::vector ReadGscanCapsVector(const std::string gcapsfilepath); bool DeleteJsonFile(std::string path); + std::vector parseJsonFromString(const std::string str); }; diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index d737f737..de97df70 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -200,6 +200,48 @@ Result HuagaoDs::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, vo } } +Result HuagaoDs::customDataGet(const Twpp::Identity& origin, Twpp::CustomData& data) +{ + //从保存默认配置的文件路径读取字节流上传 + + TCHAR szIniFile[MAX_PATH] = { 0 }; + SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_LOCAL_APPDATA, TRUE); + _tcscat(szIniFile, HUAGAO_SCAN); + _tcscat(szIniFile, TWAIN_INIPATH); + _tcscat(szIniFile, TEXT("\\")); + _tcscat(szIniFile, TWAIN_JSON_NAME); + string path = TCHAR2STRING(szIniFile); + int t; + FILE* file = fopen(path.c_str(), "rb"); + fseek(file, 0, SEEK_END); + t = ftell(file); + //data = CustomData(t); + + std::string buf(t, 0); + fseek(file, 0, SEEK_SET); + fread((void*)buf.c_str(), t, 1, file); + fclose(file); + data = CustomData(t); + auto pdata = data.lock(); + memcpy(pdata.data(), buf.c_str(), t); + return success(); +} + +Result HuagaoDs::customDataSet(const Twpp::Identity& origin, Twpp::CustomData& data) +{ + GScanCap sc; + //将字节流转GscanCaps + GscanJsonConfig js; + std::string str; + str.resize(data.size()); + auto pdata = data.lock(); + memcpy((void*)str.c_str(), pdata, data.size()); + vector vc = js.parseJsonFromString(str); + m_scanparam.reset(new GScanCap(vc[0])); + return success(); + +} + // some helper functions to handle capability stuff template static Result oneValGet(Msg msg, Capability& data, const T& value) { @@ -366,6 +408,10 @@ Result HuagaoDs::eventProcess(const Identity&, Event& event) { return { ReturnCode::NotDsEvent, ConditionCode::Success }; } +//Result HuagaoDs::customDataSet(const Twpp::Identity& origin, Twpp::CustomData& data) +//{ +// return Result(); +//} //Twpp::Result HuagaoDs::deviceEventGet(const Twpp::Identity & origin, Twpp::DeviceEvent & data) //{ // data = DeviceEvent::simple(DeviceEvent::Type::PaperJam, Str255("HuaGo G200 Twain Device Error")); @@ -896,7 +942,19 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_bIndicator = show; return success(); } + default: + return capBadOperation(); + } + }; + m_query[CapType::CustomDsData] = msgSupportGetAll; + m_caps[CapType::CustomDsData] = [this](Msg msg, Capability& data) -> Result { + switch (msg) { + case Msg::Get: + case Msg::GetCurrent: + case Msg::GetDefault: + data = Capability::createOneValue(true); + return success(); default: return capBadOperation(); } @@ -1862,6 +1920,7 @@ Result HuagaoDs::identityCloseDs(const Identity&) { if (guiIndicator.get()) guiIndicator.reset(); + if (guiTwain.get()) guiTwain.reset(); @@ -1889,12 +1948,16 @@ Result HuagaoDs::pendingXfersGet(const Identity&, PendingXfers& data) { Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { //!< end xfer if set count 0 + //FileTools::write_log("D:\\1.txt", "enter pendingXfersEnd"); if (bmpData.size() > 0) bmpData.clear(); int ret = scanner->aquire_bmpdata(bmpData); + //FileTools::write_log("D:\\1.txt", "enter pendingXfersEnd1"); + if (ret != 0) { scanner->Set_ErrorCode(0); - guiIndicator.reset(); + guiIndicator->ShowWindow(SW_HIDE); + //guiIndicator.reset(); if (ret != -1) { //ShellExecute(NULL, _T("open"), _T("aa.exe"), CString("1"), _T(""), SW_HIDE); //MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[ret], _T("提示"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION);// @@ -1918,24 +1981,19 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { #endif // LOG_NORMAL data.setCount(m_pendingXfers); + //FileTools::write_log("D:\\1.txt", "exit pendingXfersEnd"+ m_pendingXfers==0?" 0":"1"); return success(); } Result HuagaoDs::pendingXfersReset(const Identity&, PendingXfers& data) { - //FileTools::write_log("D:\\1.txt", "pendingXfersReset enter"); data.setCount(0); if (scanner.get()) { - //FileTools::write_log("D:\\1.txt", "pendingXfersReset enter0"); scanner->Stop_scan(); - //FileTools::write_log("D:\\1.txt", "pendingXfersReset enter1"); scanner->reset(); - //FileTools::write_log("D:\\1.txt", "pendingXfersReset enter2"); scanner->ResetScanner(); - //FileTools::write_log("D:\\1.txt", "pendingXfersReset enter4"); } guiIndicator.reset(); - //FileTools::write_log("D:\\1.txt", "pendingXfersReset exit"); return success(); } @@ -1952,10 +2010,12 @@ Result HuagaoDs::setupMemXferGet(const Identity&, SetupMemXfer& data) { Result HuagaoDs::userInterfaceDisable(const Identity&, UserInterface& ui) { //FileTools::write_log("D:\\1.txt", "userInterfaceDisable enter"); - guiTwain.reset(); + if(guiTwain.get()) + guiTwain.reset(); #if TWPP_DETAIL_OS_WIN - guiBridge.reset(); + if(guiBridge.get()) + guiBridge.reset(); #endif //FileTools::write_log("D:\\1.txt", "userInterfaceDisable exit"); @@ -2130,7 +2190,7 @@ Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { data = ImageNativeXfer(bmpSize()); std::copy(bmpBegin(), bmpEnd(), data.data().data()); #ifdef LOG_NORMAL - //FileTools::write_log("out.txt", "imageNativeXferGet " + std::to_string(++xtfer)); + FileTools::write_log("out.txt", "imageNativeXferGet " + std::to_string(++xtfer)); #endif // LOG return { ReturnCode::XferDone, ConditionCode::Success }; @@ -2186,6 +2246,8 @@ Twpp::Result HuagaoDs::setupFileXferReset(const Twpp::Identity& origin, Twpp::Se return badProtocol(); } +static int indeximg = 0; + Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) { if (!m_pendingXfers) @@ -2208,6 +2270,7 @@ Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) break; case ImageFileFormat::Tiff: case ImageFileFormat::Jfif: { + BITMAPINFOHEADER& bmpinfo = *((BITMAPINFOHEADER*)header()); int decodetype; if (bmpinfo.biBitCount == 24) @@ -2216,6 +2279,7 @@ Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) decodetype = cv::IMREAD_GRAYSCALE; cv::Mat ims = cv::imdecode(bmpData, decodetype); + std::vector compression_params; compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); compression_params.push_back(m_jpegQuality); diff --git a/huagao/huagaods.hpp b/huagao/huagaods.hpp index 457a0ba1..c5475528 100644 --- a/huagao/huagaods.hpp +++ b/huagao/huagaods.hpp @@ -63,6 +63,19 @@ protected: virtual Twpp::Result setupFileXferSet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result setupFileXferReset(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result call(const Twpp::Identity& origin, Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Msg msg, void* data) override; + /// Get custom data TWAIN call. +/// Always called in correct state. +/// Default implementation does nothing. +/// \param origin Identity of the caller. +/// \param data Custom data. + virtual Twpp::Result customDataGet(const Twpp::Identity& origin, Twpp::CustomData& data) override; + + /// Set custom data TWAIN call. + /// Always called in correct state. + /// Default implementation does nothing. + /// \param origin Identity of the caller. + /// \param data Custom data. + virtual Twpp::Result customDataSet(const Twpp::Identity& origin, Twpp::CustomData& data) override; void SetResoluton(const char* path, int resolution); private: Twpp::Result showTwainUI(Twpp::UserInterface& data, bool bUiOnly = false); @@ -92,6 +105,7 @@ private: unsigned short m_jpegQuality = 80; Twpp::Compression m_compression= Twpp::Compression::None; bool m_bIndicator = true; + bool m_bCustomDsData = true; bool m_bFeederEnabled = true; bool m_bAutoFeed = true; UINT16 m_iBitdepth; diff --git a/huagao/stdafx.h b/huagao/stdafx.h index 03b9d75b..b893f27d 100644 Binary files a/huagao/stdafx.h and b/huagao/stdafx.h differ