diff --git a/huagao/CBasicPage.cpp b/huagao/CBasicPage.cpp index e852ffc1..7a83f40d 100644 --- a/huagao/CBasicPage.cpp +++ b/huagao/CBasicPage.cpp @@ -137,6 +137,7 @@ BOOL CBasicPage::OnInitDialog() ((CButton*)GetDlgItem(IDC_CKBSIZEDETECT))->ShowWindow(SW_HIDE); #endif // ISG100 + m_cmBoxColorMode = (CComboBox*)GetDlgItem(IDC_CMBCOLORTYPE); m_cmBoxSS = (CComboBox*)GetDlgItem(IDC_CMBSS); m_cmBoxResultion = (CComboBox*)GetDlgItem(IDC_CMBRESLUTION); @@ -271,16 +272,14 @@ void CBasicPage::updateCmbDuplex(BOOL insert) } #ifdef G200 #ifndef ISG100 - if (tmp_paperindex == 16 || tmp_paperindex == 17) - { + if (tmp_paperindex == 16 || tmp_paperindex == 17){ (((CButton*)GetDlgItem(IDC_CKBSIZEDETECT)))->SetCheck(false); GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(false); } - else - { + else{ GetDlgItem(IDC_CKBSIZEDETECT)->EnableWindow(true); } -#endif +#endif // !ISG100 #endif // G200 } diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 1b86a559..43b9cf9f 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -185,6 +185,7 @@ void CTwainUI::UpdateUI() m_pageImageProc->m_edit_hole.EnableWindow(settings->fillhole.is_fillhole == TRUE ? TRUE : FALSE); m_pageImageProc->m_ckbDetachNoise = settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE;//黑白降噪是否启用 ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(m_pageImageProc->m_ckbDetachNoise); + ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(settings->pixtype != 2); m_pageImageProc->m_edit_detachnoise.SetValue(settings->detachnoise.detachnoise); m_pageImageProc->m_slider_detachnoise.EnableWindow(settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE); if (settings->pixtype == 2) diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index e87e9743..f47a8f45 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -5,6 +5,8 @@ #include #include "Device/CJsonObject.hpp" + + GscanJsonConfig::GscanJsonConfig() { } @@ -45,7 +47,7 @@ GScanCap GscanJsonConfig::GetDefaultGscancapValue() gcap.autodescrew = TRUE;//Զƫ gcap.enhance_color = EnchaceColor::Enhance_None;//Ĭϲɫǿ gcap.en_fold = FALSE;//Ĭϲ - gcap.fillbackground = TRUE;//Ĭϲڿ + gcap.fillbackground = true;//Ĭϲڿ gcap.fillhole.is_fillhole = FALSE; gcap.fillhole.fillholeratio = 10; gcap.detachnoise.detachnoise = 30; @@ -266,27 +268,34 @@ GScanCap GscanJsonConfig::ReadGscanCap() _tcscat(szIniFile, TWAIN_INIPATH); _tcscat(szIniFile, TEXT("\\")); std::string dirpath = TCHAR2STRING(szIniFile); - bool is_exist = isFolderExist((char*)dirpath.c_str()); - if (!is_exist) { - createDirectory((char*)dirpath.c_str()); - - _tcscat(szIniFile, TWAIN_JSON_NAME); - std::string dstpath = TCHAR2STRING(szIniFile); - vector vc; - vc.push_back(GetDefaultGscancapValue()); - WriteJsonArrayToFile(vc, dstpath); - return vc[0]; + bool is_exist = isFileExist(dirpath+ TCHAR2STRING(TWAIN_JSON_NAME)); + if (is_exist) + return JsonToGscancap(Readjson(dirpath + TCHAR2STRING(TWAIN_JSON_NAME))); + else{ + createDirectory((char*)dirpath.c_str()); + SaveGscancapJson(JsonToGscancap(GetDefaultJson()), dirpath + TCHAR2STRING(TWAIN_JSON_NAME)); + return JsonToGscancap(Readjson(dirpath + TCHAR2STRING(TWAIN_JSON_NAME))); } - _tcscat(szIniFile, TWAIN_JSON_NAME); - std::string s_default = TCHAR2STRING(szIniFile); + //if (!is_exist) { + // createDirectory((char*)dirpath.c_str()); - vector vc; - vc = ReadGscanCapsVector(s_default.c_str()); - if (vc.size() != 0) - { - return vc[0]; - } - return GetDefaultGscancapValue(); + // _tcscat(szIniFile, TWAIN_JSON_NAME); + // std::string dstpath = TCHAR2STRING(szIniFile); + // vector vc; + // vc.push_back(GetDefaultGscancapValue()); + // WriteJsonArrayToFile(vc, dstpath); + // return vc[0]; + //} + //_tcscat(szIniFile, TWAIN_JSON_NAME); + //std::string s_default = TCHAR2STRING(szIniFile); + + //vector vc; + //vc = ReadGscanCapsVector(s_default.c_str()); + //if (vc.size() != 0) + //{ + // return vc[0]; + //} + //return GetDefaultGscancapValue(); } std::vector GscanJsonConfig::ReadGscanCapsVector(const std::string gcapsfilepath) @@ -657,3 +666,190 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str } return vcConfig; } + + + +void GscanJsonConfig::SaveGscancapJson(GScanCap cap, std::string path) +{ + json js = GscancapToJson(cap); + std::ofstream of; + try { + of.open(path, std::ios::out); + of.write(js.dump().c_str(), js.dump().size()); + of.close(); + } + catch (...) { + if (of.is_open()) + of.close(); + } +} + +json GscanJsonConfig::GscancapToJson(GScanCap& cap) +{ + auto js = GetDefaultJson(); + js[CONFIG][PIXTYPE] = cap.pixtype; + js[CONFIG][AUTOMATICCOLOR] = cap.automaticcolor; + js[CONFIG][AUTOMATICCOLORTYPR] = cap.automaticcolortype; + js[CONFIG][PAPARSIZE] = cap.papertype; + js[CONFIG][PAPERALIGN] = cap.paperAlign; + js[CONFIG][ENSIZECHECK] = cap.en_sizecheck; + js[CONFIG][AUTOCROP] = cap.is_autocrop; + js[CONFIG][RESOLUTION] = cap.resolution_dst; + js[CONFIG][DUPLEX] = cap.is_duplex; + js[CONFIG][DISCARBLANK] = cap.is_autodiscradblank_normal; + js[CONFIG][DISCARBLANKVINCE] = cap.is_autodiscradblank_vince; + js[CONFIG][DISCARBLANK_VALUE] = cap.discardblank_percent; + js[CONFIG][FLOD] = cap.en_fold; + js[CONFIG][SWITCHFRONTBACK] = cap.is_switchfrontback; + js[CONFIG][DETACHNOISE] = cap.detachnoise.is_detachnoise; + js[CONFIG][DETACHNOISEVALUE] = cap.detachnoise.detachnoise; + js[CONFIG][BRIGHTNESS] = cap.brightness; + js[CONFIG][AUTOCONTRAST] = cap.is_autocontrast; + js[CONFIG][CONTRAST] = cap.contrast; + js[CONFIG][GAMMA_] = cap.gamma; + + js[CONFIG][FILTERTYPE] = cap.filter; + js[CONFIG][ENHANCECOLOR] = cap.enhance_color; + js[CONFIG][SHARPENTYPE] = cap.sharpen; + js[CONFIG][AUTODESCREW] = cap.autodescrew; + js[CONFIG][FILLBLACK] = cap.fillbackground; + js[CONFIG][MULTIOUTPUT] = cap.multi_output_red; + js[CONFIG][OUTHOLE] = cap.fillhole.is_fillhole; + js[CONFIG][OUTHOLERATIO] = cap.fillhole.fillholeratio; + js[CONFIG][HSVCORRECT] = cap.hsvcorrect; + js[CONFIG][ULTRADETECT] = cap.hardwarecaps.en_doublefeed; + js[CONFIG][BINDINGDETECT] = cap.hardwarecaps.en_stapledetect; + js[CONFIG][SCANCOUNT] = cap.scannum; + js[CONFIG][DOCORIENTATION] = cap.imageRotateDegree; + js[CONFIG][AUTO_TEXT] = cap.is_autotext; + js[CONFIG][BACKROTATE180] = cap.is_backrotate180; + js[CONFIG][DOGEAR_DETECTION] = cap.is_dogeardetection; + js[CONFIG][SCREWDETECT] = cap.hardwarecaps.en_skrewdetect; + js[CONFIG][SCREWLEVEL] = cap.hardwarecaps.skrewdetectlevel; + js[CONFIG][NOISE] = cap.noise; + js[CONFIG][INDENT] = cap.indent; + js[CONFIG][AUTOCROP_THRESHOLD] = cap.indent; + js[CONFIG][ISCONVEX] = cap.is_convex; + js[CONFIG][ITEMCAPTION] = cap.Caption; + js[CONFIG][SAVEPATH] = cap.SavePath; + return js; +} + +GScanCap GscanJsonConfig::JsonToGscancap(json& js) +{ + if (!js.is_object()) + js = GetDefaultJson(); + GScanCap cap{ 0 }; + cap.pixtype = json_cast(js[CONFIG][PIXTYPE]).to_int(); + cap.automaticcolor = json_cast(js[CONFIG][AUTOMATICCOLOR]).to_int(); + cap.automaticcolortype = json_cast(js[CONFIG][AUTOMATICCOLORTYPR]).to_int(); + cap.papertype = json_cast(js[CONFIG][PAPARSIZE]).to_int(); + cap.paperAlign = static_cast(json_cast(js[CONFIG][PAPERALIGN]).to_uint8()); + cap.en_sizecheck = json_cast(js[CONFIG][ENSIZECHECK]).to_int(); + cap.is_autocrop = json_cast(js[CONFIG][AUTOCROP]).to_int(); + cap.resolution_dst = json_cast(js[CONFIG][RESOLUTION]).to_float(); + cap.is_duplex = json_cast(js[CONFIG][DUPLEX]).to_int(); + cap.is_autodiscradblank_normal = json_cast(js[CONFIG][DISCARBLANK]).to_int(); + cap.is_autodiscradblank_vince = json_cast(js[CONFIG][DISCARBLANKVINCE]).to_int(); + cap.discardblank_percent = json_cast(js[CONFIG][DISCARBLANK_VALUE]).to_int(); + cap.en_fold = json_cast(js[CONFIG][FLOD]).to_int(); + cap.is_switchfrontback = json_cast(js[CONFIG][SWITCHFRONTBACK]).to_int(); + cap.detachnoise.is_detachnoise = json_cast(js[CONFIG][DETACHNOISE]).to_int(); + cap.detachnoise.detachnoise = json_cast(js[CONFIG][DETACHNOISEVALUE]).to_int(); + cap.brightness = json_cast(js[CONFIG][BRIGHTNESS]).to_float(); + cap.is_autocontrast = json_cast(js[CONFIG][AUTOCONTRAST]).to_int(); + cap.contrast = json_cast(js[CONFIG][CONTRAST]).to_float(); + cap.gamma = json_cast(js[CONFIG][GAMMA_]).to_float(); + cap.filter = json_cast(js[CONFIG][FILTERTYPE]).to_int(); + cap.enhance_color = json_cast(js[CONFIG][ENHANCECOLOR]).to_int(); + cap.sharpen = json_cast(js[CONFIG][SHARPENTYPE]).to_int(); + cap.autodescrew = json_cast(js[CONFIG][AUTODESCREW]).to_int(); + cap.fillbackground = json_cast(js[CONFIG][FILLBLACK]).to_int(); + cap.multi_output_red = json_cast(js[CONFIG][MULTIOUTPUT]).to_int(); + cap.fillhole.is_fillhole = json_cast(js[CONFIG][OUTHOLE]).to_int(); + cap.fillhole.fillholeratio = json_cast(js[CONFIG][OUTHOLERATIO]).to_int(); + cap.hsvcorrect = json_cast(js[CONFIG][HSVCORRECT]).to_int(); + cap.hardwarecaps.en_doublefeed = json_cast(js[CONFIG][ULTRADETECT]).to_int(); + cap.hardwarecaps.en_stapledetect = json_cast(js[CONFIG][BINDINGDETECT]).to_int(); + cap.scannum = json_cast(js[CONFIG][SCANCOUNT]).to_int(); + cap.imageRotateDegree = json_cast(js[CONFIG][DOCORIENTATION]).to_int(); + cap.is_autotext = json_cast(js[CONFIG][AUTO_TEXT]).to_int(); + cap.is_backrotate180 = json_cast(js[CONFIG][BACKROTATE180]).to_int(); + cap.is_dogeardetection = json_cast(js[CONFIG][DOGEAR_DETECTION]).to_int(); + cap.hardwarecaps.en_skrewdetect = json_cast(js[CONFIG][SCREWDETECT]).to_int(); + cap.hardwarecaps.skrewdetectlevel = json_cast(js[CONFIG][SCREWLEVEL]).to_int(); + cap.noise = json_cast(js[CONFIG][NOISE]).to_int(); + cap.indent = json_cast(js[CONFIG][INDENT]).to_int(); + cap.AutoCrop_threshold = json_cast(js[CONFIG][AUTOCROP_THRESHOLD]).to_int(); + cap.is_convex = json_cast(js[CONFIG][ISCONVEX]).to_int(); + cap.Caption = json_cast(js[CONFIG][ITEMCAPTION]).to_string(); + cap.SavePath = json_cast(js[CONFIG][SAVEPATH]).to_string(); + return cap; +} +json GscanJsonConfig::GetDefaultJson() +{ + return json::parse(R"({ + "Config": { + "iPixType": 2 , + "iautomaticcolor": false , + "iautomaticcolortype": 1 , + "iPaparSize": 0 , + "iPaperAlign": 0 , + "iEnSizeCheck": false , + "bAuotCrop": true , + "iResolution": 200 , + "iDuplex": true , + "bDiscardBlank": false , + "bDiscardBlankVince": false , + "discardblank_percent": 20 , + "bFlod": false , + "bSwitchFrontBack": false , + "detachnoise": false , + "detachnoisevalue": 30 , + "iBrightness": 0 , + "bAutoContrast": false , + "iContrast": 0 , + "dGamma": 1 , + "iFilter": 3 , + "iEnhance": 0 , + "iSharpen": 0 , + "bAutoDescrew": true , + "bFillBlcak": true , + "iMultiOutPut": false , + "bOutHole": false , + "iOutHoleRatio": 10 , + "bHsvCorrect": false , + "bUltrasonicDetect": true , + "bBindingDetect": false , + "ScanCount": 65535 , + "bOrientation": 0 , + "bAutoText": false , + "iBackRotate180": false , + "dogeardetection": false , + "bScrewDetect": true , + "iScrewLevel": 3 , + "Noise": 40 , + "Indent": 5 , + "AutoCrop_Threshold": 40 , + "isConvex": true , + "Caption": "" , + "SavePath": "" + } + })"); +} + +json GscanJsonConfig::Readjson(std::string path) +{ + std::ifstream f; + f.open(path, std::ios::in); + json js; + try { + f.is_open() ? (js = json::parse(std::string((std::ostringstream()< +#include +using json = nlohmann::json; +struct json_cast +{ + json_cast(json s) :m_json(s) { if (s.is_null()) throw std::bad_alloc(); } + + operator std::int16_t() { + return oper(); + } + operator std::int64_t() { + return oper(); + } + operator std::int8_t() { + return oper(); + } + operator int() { + return oper(); + } + operator bool() { + if (m_json.is_boolean() or m_json.is_number() or m_json.is_number_unsigned() or m_json.is_number_float()) + if (isbool()) + return m_json.get(); + else + return (int)m_json; + else + throw std::bad_typeid(); + } + operator std::uint16_t() { + return oper(); + } + operator std::uint32_t() { + return oper(); + } + operator std::uint8_t() { + return oper(); + } + operator float() { + return oper(); + } + operator std::string() { + if (m_json.is_string()) + return m_json; + else + return m_json.dump(); + } + operator double() { + return oper(); + } + + int to_int() { return operator int(); } + std::uint32_t to_uint32() { return operator std::uint32_t(); } + std::uint16_t to_uint16() { return operator std::uint16_t(); } + std::uint8_t to_uint8() { return operator std::uint8_t(); } + std::int16_t to_int16() { return operator std::int16_t(); } + std::int32_t to_int32() { return operator std::int32_t(); } + std::int8_t to_int8() { return operator std::int8_t(); } + bool to_bool() { return operator bool(); } + float to_float() { return operator float(); } + double to_double() { return operator double(); } + std::string to_string() { return operator std::string(); } + bool isbool() { return m_json.is_boolean() ? 1 : 0; } + template + auto oper()->T { + if (m_json.is_boolean() or m_json.is_number() or m_json.is_number_unsigned() or m_json.is_number_float()) + if (isbool()) + return (T)m_json.get(); + else + return T(m_json); + else + throw std::bad_typeid(); + } +private: + json m_json; +}; class GscanJsonConfig { public: @@ -15,5 +89,12 @@ public: std::vector ReadGscanCapsVector(const std::string gcapsfilepath); bool DeleteJsonFile(std::string path); std::vector parseJsonFromString(const std::string str); + + + json GscancapToJson(GScanCap& cap); + json GetDefaultJson(); + json Readjson(std::string path); + void SaveGscancapJson(GScanCap cap, std::string path); + GScanCap JsonToGscancap(json& js); }; diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index 90ff22eb..442d6a5e 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -14,6 +14,7 @@ #include "CIndicatorDlg.h" #include "Device/PublicFunc.h" #include "Device/GScanO200.h" +#include "Device/GScanO400.h" #include "Device/filetools.h" #include "Device/GScanVirtual.h" #include @@ -21,6 +22,11 @@ #include #include "GscanJsonConfig.h" #include "G4Tiff.h" +#include "Device/UsbScanEx.h" +#ifdef WIN32 +#include +#endif // WIN32 + //custom define caps enum enum class CapTypeEx : unsigned short { @@ -225,6 +231,12 @@ static std::unique_ptr scanner; //(new GScanO200()); #else static std::unique_ptr scanner(new GScanVirtual()); #endif + +//long __stdcall callback(_EXCEPTION_POINTERS* excp) +//{ +// MessageBox(0, L"Error", L"error", MB_OK); +// return EXCEPTION_CONTINUE_SEARCH; +//} HuagaoDs::HuagaoDs() : m_scanparam(new GScanCap) ,bmpData(new std::vector) @@ -237,10 +249,36 @@ HuagaoDs::HuagaoDs() DWORD dwNum; CString aas[10]; GetDiskInfo(dwNum,aas);*/ + + //SetUnhandledExceptionFilter(callback); + + //memoryinfo.reset(new std::thread([this]() { + // PROCESS_MEMORY_COUNTERS pmc; + // GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); + // while (pmc.PeakPagefileUsage < 0x40000000&&m_memoryfalg){ + // GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)); + // std::this_thread::sleep_for(std::chrono::milliseconds(10)); + // } + // if (scanner.get()){ + // scanner->Stop_scan(); + // scanner->reset(); + // scanner->ResetScanner(); + // } + // //guiIndicator.reset(); + // if (!m_memoryfalg) + // return; + // MessageBox(NULL, L"ڴ治", L"", MB_OK| MB_SYSTEMMODAL); + //})); } + HuagaoDs::~HuagaoDs() { + if (memoryinfo.get()){ + m_memoryfalg = false; + if (memoryinfo->joinable()) + memoryinfo->join(); + } if(scanner.get()) scanner.reset(); } @@ -297,8 +335,10 @@ Result HuagaoDs::customDataSet(const Twpp::Identity& origin, Twpp::CustomData& d 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])); + //vector vc = js.parseJsonFromString(str); + //m_scanparam.reset(new GScanCap(vc[0])); + GScanCap *cap = new GScanCap(js.JsonToGscancap(json::parse(str))); + m_scanparam.reset(cap); return success(); } @@ -632,8 +672,53 @@ void HuagaoDs::dogear_callback(int indexpaper) Result HuagaoDs::identityOpenDs(const Identity&) { //writelog("identityOpenDs"); - if(!scanner.get()) - scanner.reset(new GScanO200()); + auto usblist= UsbScan_List::find_all_usb(); + int pid,vid; + if (!usblist.empty()) + { + for each (auto &usb in usblist) + { + if (usb.vid == 0x064b && usb.pid == 0x7823){ + if (!scanner.get()) { +#ifdef G100 + scanner.reset(new GScanO200()); +#endif // +#ifdef G200 + scanner.reset(new GScanO200()); +#endif // G200 +#ifdef G300 + scanner.reset(new GScanO400()); +#endif // G300 +#ifdef G400 + scanner.reset(new GScanO400()); +#endif // G400 + vid = 0x064b; pid = 0x7823; + break; + } + } +#ifdef G100 + if(usb.pid == 0x3072 && usb.vid == 0x100) +#endif // +#ifdef G200 + if (usb.pid == 0x3072 && usb.vid == 0x200) +#endif // G200 +#ifdef G300 + if (usb.pid == 0x3072 && usb.vid == 0x300) +#endif // G300 +#ifdef G400 + if (usb.pid == 0x3072 && usb.vid == 0x400) +#endif // G400 + { + pid = usb.pid; vid = usb.vid; + if(pid<=200&& (!scanner.get())) + scanner.reset(new GScanO200()); + else + scanner.reset(new GScanO400()); + break; + } + } + } + m_haveError = false; updataGscanCap(); bmpData->resize(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); @@ -645,7 +730,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { #ifdef LANXUM scanner->open(0x31c9, 0x8200); #else - scanner->open(0x064B, 0x7823); + scanner->open(vid, pid); #endif if (!scanner->IsConnected()) { @@ -663,7 +748,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("202"), NULL, SW_HIDE); return seqError(); } - + //MessageBox(NULL, L"2", L"", 0); // init caps // there are caps a minimal source must support // query -> says which operations a cap supports @@ -685,11 +770,13 @@ Result HuagaoDs::identityOpenDs(const Identity&) { }; m_query[CapType::UiControllable] = msgSupportGetAll; - m_caps[CapType::UiControllable] = std::bind(enmGet, _1, _2, Bool(true)); + m_caps[CapType::UiControllable] = std::bind(oneValGet, _1, _2, Bool(true)); m_query[CapType::DeviceOnline] = msgSupportGetAll; m_caps[CapType::DeviceOnline] = std::bind(enmGet, _1, _2, Bool(scanner->IsConnected())); + + m_query[CapType::XferCount] = msgSupportGetAllSetReset; m_caps[CapType::XferCount] = [this](Msg msg, Capability& data) -> Result { if (msg == Msg::Set) { @@ -729,18 +816,17 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_caps[CapType::IBitDepth] = [this](Msg msg, Capability& data) -> Result { if( Msg::Set==msg) { auto mech = data.currentItem(); - if (mech == 1 || mech == 8 || mech == 24){ + if (((mech == 1) && (m_scanparam->pixtype == 0))|| ((mech == 8) && (m_scanparam->pixtype == 1)) || ((mech == 24) && (m_scanparam->pixtype == 2))) { m_iBitdepth = (UINT16)mech; - m_scanparam->pixtype = m_iBitdepth == 1 ? (int)PixelType::BlackWhite : (m_iBitdepth == 8 ? (int)PixelType::Gray : (int)PixelType::Rgb); return success(); - } + } return badValue(); } return CapSupGetAllReset(msg, data, m_iBitdepth, 24); }; m_query[CapType::IBitOrder] = msgSupportGetAllSetReset; - m_caps[CapType::IBitOrder] = std::bind(enmGetSetConst, _1, _2, BitOrder::MsbFirst); + m_caps[CapType::IBitOrder] = std::bind(oneValGetSetConst, _1, _2, BitOrder::MsbFirst); m_query[CapType::IPlanarChunky] = msgSupportGetAllSetReset; m_caps[CapType::IPlanarChunky] = std::bind(enmGetSetConst, _1, _2, PlanarChunky::Chunky); @@ -912,7 +998,8 @@ Result HuagaoDs::identityOpenDs(const Identity&) { #endif #endif // },m_scanparam->papertype, PaperSize::A3, - std::distance(paperSizeList.begin(), std::find(paperSizeList.begin(), paperSizeList.end(), m_scanparam->papertype)) == paperSizeList.size() ? 0 : std::distance(paperSizeList.begin(), std::find(paperSizeList.begin(), paperSizeList.end(), m_scanparam->papertype)), + std::distance(paperSizeList.begin(), std::find(paperSizeList.begin(), paperSizeList.end(), m_scanparam->papertype)) == paperSizeList.size() ? 0 : std::distance(paperSizeList.begin(), + std::find(paperSizeList.begin(), paperSizeList.end(), m_scanparam->papertype)), std::distance(paperSizeList.begin(), std::find(paperSizeList.begin(), paperSizeList.end(), 11))); }; @@ -1005,7 +1092,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_caps[CapType::EnableDsUiOnly] = std::bind(enmGet, _1, _2, Bool(true)); m_query[CapType::PaperDetectable] = msgSupportGetAll; - m_caps[CapType::PaperDetectable] = std::bind(enmGet, _1, _2, Bool(true)); + m_caps[CapType::PaperDetectable] = std::bind(oneValGet, _1, _2, Bool(true)); m_query[CapType::FeederEnabled] = msgSupportGetAllSetReset; m_caps[CapType::FeederEnabled] = [this](Msg msg, Capability& data) -> Result { @@ -1040,7 +1127,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_bAutoFeed = mech; return success(); } - return CapSupGetAllReset(msg, data, m_bAutoFeed, true); + return CapSupGetAllReset(msg, data, { false,true }, m_bAutoFeed, true, m_bAutoFeed ? 1 : 0, 1); }; m_query[CapType::IImageFileFormat] = msgSupportGetAllSetReset; m_caps[CapType::IImageFileFormat] = [this](Msg msg, Capability& data) -> Result { @@ -1151,7 +1238,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_autoboarderdetcet = autodetectborder; return success(); } - return CapSupGetAllReset(msg, data, m_autoboarderdetcet, false); + return CapSupGetAllReset(msg, data, { false,true }, m_autoboarderdetcet, false, m_autoboarderdetcet ? 1 : 0, 0); }; m_query[CapType::IImageMerge] = msgSupportGetAllSetReset; @@ -1546,7 +1633,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_scanparam->hardwarecaps.en_skrewdetect = mech; return success(); } - return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->sharpen, FALSE, m_scanparam->hardwarecaps.en_skrewdetect ? 1 : 0, 0); + return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->sharpen, TRUE, m_scanparam->hardwarecaps.en_skrewdetect ? 1 : 0, 0); }; m_query[(CapType)(CapTypeEx::TwEx_ScrewLevel)] = msgSupportGetAllSetReset; @@ -1589,7 +1676,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { m_scanparam->hardwarecaps.en_doublefeed = mech; return success(); } - return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.en_doublefeed, FALSE); + return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE); }; return success(); } @@ -1723,11 +1810,14 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { if (!ui.showUi()) { // this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state // with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step +#ifndef G200 while (!scanner->Get_Scanner_PaperOn()) { - if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO) == IDNO) + if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) return seqError(); } +#endif // !G200 + setState(DsState::Enabled); auto ret = startScan(); //if (ret.status().condition() == Twpp::CC::NoMedia) @@ -1753,7 +1843,7 @@ Result HuagaoDs::userInterfaceEnableUiOnly(const Identity&, UserInterface& ui) { Result HuagaoDs::imageInfoGet(const Identity&, ImageInfo& data) { // our image does not change - if (m_pendingXfers == 0) + if (m_pendingXfers == 0|| bmpData->size()==0) return success(); auto dib = header(); data.setBitsPerPixel(static_cast(dib->biBitCount)); @@ -2045,13 +2135,15 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) //!< show ui to scan button push auto scanFunction = [this](const GScanCap& caps) { +#ifndef G200 while (!scanner->Get_Scanner_PaperOn()) { - if (MessageBox(guiTwain.get()->GetSafeHwnd(), L"⵽ֽֽ", L"ʾ", MB_YESNO) == IDNO){ + if (MessageBox(NULL, L"⵽ֽֽ", L"ʾ", MB_YESNO | MB_SYSTEMMODAL) == IDNO) { m_pendingXfers = 0; return; } } +#endif // !G200 m_pendingXfers = 1; m_scanparam.reset(new GScanCap(caps)); saveGscanCapSetting(); @@ -2089,6 +2181,8 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) guiTwain->Create(IDD_TWAINUI, parent); CRect newRect; ::GetWindowRect(static_cast(ui.parent().raw()), &newRect); + if (newRect.top <= 0 || newRect.left <= 0) + newRect.top = newRect.left = 20; SetWindowPos(guiTwain->m_hWnd, HWND_TOPMOST, newRect.left + 20, newRect.top + 100, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOACTIVATE); guiTwain->ShowWindow(SW_SHOWNORMAL); return success(); @@ -2292,8 +2386,9 @@ void HuagaoDs::saveGscanCapSetting() _tcscat(szIniFile, TEXT("\\")); _tcscat(szIniFile, TWAIN_JSON_NAME); GscanJsonConfig js; - vector vc; - vc.push_back(*m_scanparam); + //vector vc; + //vc.push_back(*m_scanparam); std::string savepath = TCHAR2STRING(szIniFile); - js.WriteJsonArrayToFile(vc, savepath); + js.SaveGscancapJson(*m_scanparam, savepath); + //js.WriteJsonArrayToFile(vc, savepath); } diff --git a/huagao/huagaods.hpp b/huagao/huagaods.hpp index a60b4024..3bc2bf90 100644 --- a/huagao/huagaods.hpp +++ b/huagao/huagaods.hpp @@ -122,6 +122,8 @@ private://field std::queue devEvent; std::unique_ptr < std::vector> bmpData; std::unique_ptr m_scanparam; + std::unique_ptr memoryinfo; + bool m_memoryfalg = true; HANDLE hMutex; }; diff --git a/huagao/stdafx.h b/huagao/stdafx.h index cf28c67a..a3c39314 100644 Binary files a/huagao/stdafx.h and b/huagao/stdafx.h differ