diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index dfaf9318..db6823ec 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -3140,1656 +3140,4 @@ void HuagaoDs::saveGscanCapSetting() std::string savepath = TCHAR2STRING(szIniFile); js.SaveGscancapJson(*m_scanparam, savepath); //js.WriteJsonArrayToFile(vc, savepath); -} - m_query[CapType::FeederLoaded] = msgSupportGetAll; - m_caps[CapType::FeederLoaded] = [this](Msg msg, Capability& data) -> Result { - CapabilityPrintf(msg, enum2str(CapType::FeederLoaded)); - return CapSupGetAll(msg, data, Bool(scanner->Get_Scanner_PaperOn()), Bool(scanner->Get_Scanner_PaperOn())); - }; - - m_query[CapType::Indicators] = msgSupportGetAllSetReset; - m_caps[CapType::Indicators] = [this](Msg msg, Capability& data) -> Result { - CapabilityPrintf(msg, enum2str(CapType::Indicators), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto show = data.currentItem(); - m_bIndicator = show; - return success(); - } - return CapSupGetAllReset(msg, data, { FALSE,TRUE }, m_bIndicator, TRUE, m_bIndicator ? 1 : 0, 1); - }; - - m_query[CapType::CustomDsData] = msgSupportGetAll; - m_caps[CapType::CustomDsData] = [this](Msg msg, Capability& data) -> Result { - return CapSupGetAllEx(msg, data, Bool(true), Bool(true)); - }; - - m_query[CapType::EnableDsUiOnly] = msgSupportGetAll; - m_caps[CapType::EnableDsUiOnly] = std::bind(enmGet, _1, _2, Bool(true)); - - m_query[CapType::PaperDetectable] = msgSupportGetAll; - 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 { - CapabilityPrintf(msg, enum2str(CapType::FeederEnabled), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_bFeederEnabled = mech; - return success(); - } - return CapSupGetAllReset(msg, data, m_bFeederEnabled, Bool(true)); - }; - - m_query[CapType::Duplex] = msgSupportGetAll; - m_caps[CapType::Duplex] = std::bind(oneValGet, _1, _2, Duplex::OnePass); - - m_query[CapType::DuplexEnabled] = msgSupportGetAllSetReset; - m_caps[CapType::DuplexEnabled] = [this](Msg msg, Capability& data) -> Result { - CapabilityPrintf(msg, enum2str(CapType::DuplexEnabled), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - bool mech = data.currentItem(); - m_scanparam->is_duplex = mech; - if (!mech){ - m_scanparam->is_backrotate180 = 0;//单面背面旋转180°不可用 - m_scanparam->is_switchfrontback = 0; - m_scanparam->is_autodiscradblank_normal = m_scanparam->is_autodiscradblank_vince = m_scanparam->en_fold = 0; - } - return success(); - } - return CapSupGetAllReset(msg, data, m_scanparam->is_duplex, Bool(true)); - }; - - m_query[CapType::AutoFeed] = msgSupportGetAllSetReset; - m_caps[CapType::AutoFeed] = [this](Msg msg, Capability& data) -> Result { - CapabilityPrintf(msg, enum2str(CapType::AutoFeed), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_bAutoFeed = mech; - return success(); - } - 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 { - CapabilityPrintf(msg, enum2str(CapType::IImageFileFormat), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech == ImageFileFormat::Bmp || - mech == ImageFileFormat::Tiff || - mech == ImageFileFormat::Jfif) { - m_capImageFileFormat = mech; - return success(); - } - else - return badValue(); - } - return CapSupGetAllReset < ImageFileFormat, ImageFileFormat, CapType::IImageFileFormat>(msg, data, { ImageFileFormat::Bmp, ImageFileFormat::Tiff,ImageFileFormat::Jfif }, - m_capImageFileFormat, ImageFileFormat::Bmp, m_capImageFileFormat == ImageFileFormat::Bmp ? 0 : (m_capImageFileFormat == ImageFileFormat::Tiff ? 1 : 2), 0); - }; - - //custom define - m_query[CapType::IAutomaticDeskew] = msgSupportGetAllSetReset; - m_caps[CapType::IAutomaticDeskew] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IAutomaticDeskew), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto atuodsw = data.currentItem(); - m_scanparam->autodescrew = (bool)atuodsw; - return success(); - } - return CapSupGetAllReset(msg, data, m_scanparam->autodescrew, true); - }; - - m_query[(CapType)(CapTypeEx::TwEx_SwitchFrontBack)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_SwitchFrontBack)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_SwitchFrontBack), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if ((!m_scanparam->is_duplex) && mech == TRUE) - return badValue(); - m_scanparam->is_switchfrontback = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->is_switchfrontback, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->is_switchfrontback, (Bool)false, m_scanparam->is_switchfrontback ? 1 : 0, 0); - }; - - m_query[CapType::IAutomaticRotate] = msgSupportGetAllSetReset; - m_caps[CapType::IAutomaticRotate] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IAutomaticRotate), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->is_autotext = (bool)mech; - if (mech) - m_scanparam->imageRotateDegree = 0.0f; - return success(); - } - return CapSupGetAllReset(msg, data, m_scanparam->is_autotext, false); - }; - - m_query[CapType::IAutomaticCropUsesFrame] = msgSupportGetAll; - m_caps[CapType::IAutomaticCropUsesFrame] = [this](Msg msg, Capability& data)->Result { - return CapSupGetAll(msg, data, m_scanparam->is_autocrop, false); - }; - - m_query[CapType::AutoScan] = msgSupportGetAllSetReset; - m_caps[CapType::AutoScan] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::AutoScan), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto autoscan = data.currentItem(); - m_autoscan = autoscan; - return success(); - } - //return CapSupGetAllReset(msg, data, { FALSE,TRUE }, m_autoscan, Bool(true), m_autoscan ? 1 : 0, 0); - return CapSupGetAllReset(msg, data, m_autoscan, TRUE); - }; - - m_query[CapType(CapTypeEx::TwEx_IHighImageQuality)] = msgSupportGetAllSetReset; - m_caps[CapType(CapTypeEx::TwEx_IHighImageQuality)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IHighImageQuality), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto tmp = data.currentItem(); - m_scanparam->is_high_imagequality = tmp; - return success(); - } - //return CapSupGetAllReset(msg, data, { FALSE,TRUE }, m_autoscan, Bool(true), m_autoscan ? 1 : 0, 0); - return CapSupGetAllResetEx(msg, data, m_scanparam->is_high_imagequality, false); - }; - - m_query[CapType::IAutoSize] = msgSupportGetAllSetReset; - m_caps[CapType::IAutoSize] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IAutoSize), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto autosize = data.currentItem(); - if (autosize == AutoSize::Auto) { - if (m_scanparam->papertype == (BYTE)PaperSize::UsStatement) { - m_scanparam->is_autocrop = 0; - m_autoboarderdetcet = false; - } - else { - m_scanparam->is_autocrop = 1; - m_scanparam->papertype = (BYTE)Twpp::PaperSize::None; - m_scanparam->paperAlign = PaperAlign::Rot0; - m_autoboarderdetcet = true; - } - } - else { - m_autoboarderdetcet = false; - m_scanparam->is_autocrop = 0; - } - m_autosize = (UInt16)autosize; - return success(); - } - return CapSupGetAllReset(msg, data, { AutoSize::None, AutoSize::Auto }, m_autosize, AutoSize::None, (m_autosize == (UInt16)AutoSize::Auto) ? 1 : 0, 0); - }; - - m_query[CapType::IAutomaticBorderDetection] = msgSupportGetAllSetReset; - m_caps[CapType::IAutomaticBorderDetection] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IAutomaticBorderDetection), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto autodetectborder = data.currentItem(); - if (autodetectborder) { - if (m_scanparam->papertype != (BYTE)PaperSize::UsStatement) { - m_scanparam->is_autocrop = true; - m_scanparam->papertype = (BYTE)Twpp::PaperSize::None; - m_scanparam->paperAlign = PaperAlign::Rot0; - m_autosize = (UInt16)AutoSize::Auto; - } - } - else { - m_autosize = (UInt16)AutoSize::None; - } - m_autoboarderdetcet = autodetectborder; - return success(); - } - return CapSupGetAllReset(msg, data, { false,true }, m_autoboarderdetcet, false, m_autoboarderdetcet ? 1 : 0, 0); - }; - - //m_query[CapType::IImageMerge] = msgSupportGetAllSetReset; - //m_caps[CapType::IImageMerge] = [this](Msg msg, Capability& data)->Result { - // if (Msg::Set == msg) { - // auto autocrop = data.currentItem(); - // m_scanparam->en_fold = (BYTE)autocrop; - // if ((UInt16)autocrop != 0){ - // m_scanparam->is_duplex = 1; - // m_scanparam->autodescrew = 1;//合并可用时 默认自动纠偏 - // m_scanparam->is_autodiscradblank_normal = m_scanparam->is_autodiscradblank_vince = 0; - // } - // return success(); - // } - // return CapSupGetAllResetEx(msg, data, m_scanparam->en_fold, 0); - //}; - - m_query[CapType(CapTypeEx::TwEx_EnFold)] = msgSupportGetAllSetReset; - m_caps[CapType(CapTypeEx::TwEx_EnFold)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_EnFold), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto autocrop = data.currentItem(); - m_scanparam->en_fold = (Int32)autocrop; - if ((UInt16)autocrop != 0) { - m_scanparam->is_duplex = 1; - m_scanparam->autodescrew = 1;//合并可用时 默认自动纠偏 - m_scanparam->is_autodiscradblank_normal = m_scanparam->is_autodiscradblank_vince = 0; - } - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->en_fold, 0); - //return CapSupGetAllResetEx(msg, data, { 0,1 }, m_scanparam->en_fold, 0, m_scanparam->en_fold ? 1 : 0, 0); - }; - - m_query[CapType::IAutoDiscardBlankPages] = msgSupportGetAllSetReset; - m_caps[CapType::IAutoDiscardBlankPages] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IAutoDiscardBlankPages), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if ((mech == DiscardBlankPages::Auto) || (mech == DiscardBlankPages::Disabled)||((int)mech == 65535)) - { - if ((int)mech == 65535 || mech == DiscardBlankPages::Auto) - { - m_scanparam->is_autodiscradblank_normal = 1; - m_scanparam->is_duplex = 1; - m_scanparam->en_fold = 0; - m_scanparam->is_autodiscradblank_vince = 0; - } - else - { - m_scanparam->is_autodiscradblank_normal = 0; - } - return success(); - } - return badValue(); - } - DiscardBlankPages autodiscradblank; - if (Msg::GetDefault == msg || (Msg::Reset == msg)) { - m_scanparam->is_autodiscradblank_normal = false; - } - m_scanparam->is_autodiscradblank_normal ? (autodiscradblank = DiscardBlankPages::Auto) : (autodiscradblank = DiscardBlankPages::Disabled); - return CapSupGetAllReset(msg, data, autodiscradblank, DiscardBlankPages::Disabled); - }; - - /*costom caps*/ - //跳过空白页发票 - m_query[(CapType)(CapTypeEx::TwEx_IAutoDiscardBlankVince)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IAutoDiscardBlankVince)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IAutoDiscardBlankVince), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->is_autodiscradblank_vince = mech; - if (mech) { - m_scanparam->is_duplex = 1; - m_scanparam->en_fold = 0; - m_scanparam->is_autodiscradblank_normal = 0; - } - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->is_autodiscradblank_vince, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->is_autodiscradblank_vince, Bool(false), m_scanparam->is_autodiscradblank_vince ? 1 : 0, 0); - - }; - - m_query[(CapType)(CapTypeEx::TwEx_IBackRotate180)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IBackRotate180)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IBackRotate180), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech) - { - if (!m_scanparam->is_duplex) - { - return badValue(); - } - } - m_scanparam->is_backrotate180 = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->is_backrotate180, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->is_backrotate180, Bool(false), m_scanparam->is_backrotate180 ? 1 : 0, 0); - }; - - //填黑框 - m_query[(CapType)(CapTypeEx::TwEx_IFillBackground)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IFillBackground)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFillBackground), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->fillbackground = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->fillbackground, true); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->fillbackground, Bool(true), m_scanparam->fillbackground ? 1 : 0, 1); - }; - - //裁剪纠偏轮廓缩进像素 - m_query[(CapType)(CapTypeEx::TwEx_CroporDesaskewIndent)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_CroporDesaskewIndent)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CroporDesaskewIndent), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if ((mech > 30 || mech < 5) && ((bool)m_scanparam->is_autocrop == true)) - return badValue(); - m_scanparam->indent = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->indent, 5); - }; - - //自动裁剪降噪像素 - m_query[(CapType)(CapTypeEx::TwEx_CropNoise)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_CropNoise)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CropNoise), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if ((mech > 20 || mech < 0) && ((bool)m_scanparam->is_autocrop == true)) - return badValue(); - m_scanparam->noise = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->noise, 8); - }; - //自动裁切和纠偏的二值化阀值 - m_query[(CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CroporDesaskewThreshold), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech > 50 || mech < 30) - return badValue(); - m_scanparam->AutoCrop_threshold = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->AutoCrop_threshold, 40); - }; - //黑框填充方式 - m_query[(CapType)(CapTypeEx::TwEx_FillBackgroundMode)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_FillBackgroundMode)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_FillBackgroundMode), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->is_convex = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->is_convex, Bool(true)); - }; - //填穿孔 - m_query[(CapType)(CapTypeEx::TwEx_IFillHole)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IFillHole)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFillHole), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->fillhole.is_fillhole = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->fillhole.is_fillhole, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->fillhole.is_fillhole, Bool(false), m_scanparam->fillhole.is_fillhole ? 1 : 0, 0); - }; - - m_query[(CapType)(CapTypeEx::TwEx_IFillHoleRatio)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IFillHoleRatio)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFillHoleRatio), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech > 0 && mech < 50) { - m_scanparam->fillhole.fillholeratio = (int)mech; - m_scanparam->fillholeratio_up = m_scanparam->fillholeratio_down = m_scanparam->fillholeratio_left = m_scanparam->fillholeratio_right = int(mech); - return success(); - } - return badValue(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->fillhole.fillholeratio, 10); - }; - //噪点优化 - m_query[(CapType)(CapTypeEx::TwEx_IDetachNoise)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IDetachNoise)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IDetachNoise), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech) { - if (m_scanparam->pixtype != 0) - return badValue(); - } - m_scanparam->detachnoise.is_detachnoise = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->detachnoise.is_detachnoise, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->detachnoise.is_detachnoise, FALSE, m_scanparam->detachnoise.is_detachnoise ? 1 : 0, 0); - }; - - m_query[(CapType)(CapTypeEx::TwEx_IDetachNoiseValue)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IDetachNoiseValue)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IDetachNoiseValue), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech > 9 && mech < 51) { - m_scanparam->detachnoise.detachnoise = (int)mech; - return success(); - } - return badValue(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->detachnoise.detachnoise, 10); - }; - //背景移除 - m_query[(CapType)(CapTypeEx::TwEx_IFadeBack)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IFadeBack)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFadeBack), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech) - { - if (m_scanparam->pixtype != 2) - return badValue(); - } - m_scanparam->fadeback = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->fadeback, false); - }; - - m_query[(CapType)(CapTypeEx::TwEx_IFadeBackValue)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IFadeBackValue)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFadeBackValue), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech > 0 && mech < 129) { - m_scanparam->fadeback_range = (int)mech; - return success(); - } - return badValue(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->fadeback_range, 40); - }; - //多流除红 - m_query[(CapType)(CapTypeEx::TwEx_IMultiOutputRed)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IMultiOutputRed)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IMultiOutputRed), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->pixtype == (BYTE)PixelType::Rgb &&(!m_scanparam->en_multi_output)) - m_scanparam->multi_output_red = mech; - else - return badValue(); - //m_scanparam->multi_output_red = 0;//非彩色 不能使用多流除红 - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->multi_output_red, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->multi_output_red, FALSE, m_scanparam->multi_output_red ? 1 : 0, 0); - }; - //多流输出使能 - m_query[(CapType)(CapTypeEx::TwEx_IEnMultiOutPut)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IEnMultiOutPut)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IEnMultiOutPut), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->pixtype == (BYTE)PixelType::Rgb && (!m_scanparam->multi_output_red)) - m_scanparam->en_multi_output = mech; - else - return badValue(); - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->en_multi_output, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->en_multi_output, FALSE, m_scanparam->en_multi_output ? 1 : 0, 0); - }; - - //多流输出类型 - m_query[(CapType)(CapTypeEx::TwEx_IEnMultiOutPutType)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IEnMultiOutPutType)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IEnMultiOutPutType), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->pixtype == (BYTE)PixelType::Rgb && (!m_scanparam->multi_output_red) && m_scanparam->en_multi_output) - m_scanparam->multioutput = mech; - else - return badValue(); - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->multioutput, 0); - }; - - //答题卡除红 - m_query[(CapType)(CapTypeEx::TwEx_HsvCorrect)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_HsvCorrect)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_HsvCorrect), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech){ - if (m_scanparam->pixtype != (int)PixelType::Rgb) - return badValue(); - } - - m_scanparam->hsvcorrect = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->hsvcorrect, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->hsvcorrect, FALSE, m_scanparam->hsvcorrect ? 1 : 0, 0); - }; - - m_query[CapType::IFilter] = msgSupportGetAllSetReset; - m_caps[CapType::IFilter] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IFilter), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech == Filter::None || mech == Filter::Red || mech == Filter::Green || mech == Filter::Blue) { - if (((Filter)mech != Filter::None) && (m_scanparam->pixtype == (int)PixelType::Rgb)) - return badValue(); - m_scanparam->filter = (BYTE)mech; - if (mech != Filter::None) { - m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_None; - } - return success(); - } - return badValue(); - } - return CapSupGetAllReset(msg, data, { Filter::Red,Filter::Green,Filter::Blue,Filter::None }, m_scanparam->filter, Filter::None, m_scanparam->filter, 3); - }; - - //颜色增强 - m_query[(CapType)(CapTypeEx::TwEx_IEnhanceColor)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IEnhanceColor)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IEnhanceColor), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->pixtype == (int)PixelType::Rgb) - { - m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_None; - m_scanparam->filter = (BYTE)Filter::None; - return badValue(); - } - else - { - if (mech == Enchace_Color::Enhance_None || mech == Enchace_Color::Enhance_Red || mech == Enchace_Color::Enhance_Green || mech == Enchace_Color::Enhance_Blue) - { - m_scanparam->enhance_color = (BYTE)mech; - if (mech != (BYTE)Enchace_Color::Enhance_None) - m_scanparam->filter = (BYTE)Filter::None; - return success(); - } - } - } - return CapSupGetAllResetEx(msg, data, m_scanparam->enhance_color, (Enchace_Color)0); - //return CapSupGetAllResetEx(msg, data, { Enchace_Color::Enhance_None,Enchace_Color::Enhance_Red,Enchace_Color::Enhance_Green,Enchace_Color::Enhance_Blue }, m_scanparam->enhance_color, Enchace_Color::Enhance_None, m_scanparam->enhance_color, 0); - }; - - m_query[(CapType)(CapTypeEx::TwEx_Sharpen)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_Sharpen)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_Sharpen), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->pixtype == (int)PixelType::BlackWhite) - return badValue(); - m_scanparam->sharpen = (BYTE)mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->sharpen, SharpenBlur::Sharpen_None); - //return CapSupGetAllResetEx(msg, data, { SharpenBlur::Sharpen_None,SharpenBlur::Sharpen_Normal,SharpenBlur::Sharpen_More,SharpenBlur::Sharpen_Blur,SharpenBlur::Sharpen_Blur_More }, m_scanparam->sharpen, SharpenBlur::Sharpen_None, m_scanparam->sharpen, 0); - }; - - /*亮度 对比度 gamma range类型 Range 类型*/ - m_query[CapType::IBrightness] = msgSupportGetAllSetReset; - m_caps[CapType::IBrightness] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IBrightness), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - switch (msg) { - case Msg::Get: - data = Capability::createRange(Fix32(-1000.0f), Fix32(1000.0f), Fix32(333.3f), Fix32(m_scanparam->brightness), Fix32(0.0)); - return success(); - case Msg::GetCurrent: - data = Capability::createOneValue(Fix32(m_scanparam->brightness)); - return success(); - case Msg::GetDefault: - case Msg::Reset: - m_scanparam->brightness = 0.0f; - data = Capability::createOneValue(Fix32(0.0f)); - return success(); - case Msg::Set: { - auto mech = data.currentItem(); - if (mech > 1000.0f || mech < -1000.0f) - return badValue(); - m_scanparam->brightness = (float)mech; - return success(); - } - default: - return capBadOperation(); - } - }; - - m_query[CapType::IContrast] = msgSupportGetAllSetReset; - m_caps[CapType::IContrast] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IContrast), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - switch (msg) { - case Msg::Get: - data = Capability::createRange(Fix32(-1000.0f), Fix32(1000.0f), Fix32(333.3f), Fix32(m_scanparam->contrast), Fix32(0.0)); - return success(); - case Msg::GetCurrent: - data = Capability::createOneValue(Fix32(m_scanparam->contrast)); - return success(); - case Msg::GetDefault: - case Msg::Reset: - m_scanparam->contrast = 0.0f; - data = Capability::createOneValue(Fix32(0.0f)); - return success(); - case Msg::Set: { - auto mech = data.currentItem(); - if (mech > 1000.0f || mech < -1000.0f) - return badValue(); - m_scanparam->contrast = (float)mech; - return success(); - } - default: - return capBadOperation(); - } - }; - - m_query[CapType::IGamma] = msgSupportGetAllSetReset; - m_caps[CapType::IGamma] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::IGamma), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - switch (msg) { - case Msg::Get: - data = Capability::createRange(Fix32(0.0f), Fix32(5.0f), Fix32(1.0f), Fix32(m_scanparam->gamma), Fix32(1.0)); - return success(); - case Msg::GetCurrent: - data = Capability::createOneValue(Fix32(m_scanparam->gamma)); - return success(); - case Msg::GetDefault: - case Msg::Reset: - m_scanparam->gamma = 1.0f; - data = Capability::createOneValue(Fix32(0.0f)); - return success(); - case Msg::Set: { - auto mech = data.currentItem(); - if (mech > 5.0f || mech < 0.0f) - return badValue(); - m_scanparam->gamma = (float)mech; - return success(); - } - default: - return capBadOperation(); - } - }; - - /*以下为硬件协议*/ - m_query[(CapType)(CapTypeEx::TwEx_ScrewDetectEnable)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_ScrewDetectEnable)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_ScrewDetectEnable), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.en_skrewdetect = mech; - return success(); - } - Bool en = m_scanparam->hardwarecaps.en_skrewdetect == 0 ? Bool(false) : Bool(true); - return CapSupGetAllResetEx(msg, data,(Bool)m_scanparam->hardwarecaps.en_skrewdetect , Bool(true)); - //return CapSupGetAllResetEx(msg, data, { FALSE ,TRUE }, m_scanparam->hardwarecaps.en_skrewdetect, TRUE, m_scanparam->hardwarecaps.en_skrewdetect ? 1 : 0, 1); - }; - - m_query[(CapType)(CapTypeEx::TwEx_ScrewLevel)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_ScrewLevel)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_ScrewLevel), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech >= 1 && mech <= 5) { - m_scanparam->hardwarecaps.skrewdetectlevel = mech; - return success(); - } - return badValue(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.skrewdetectlevel, (UInt32)3); - //return oneValGetSet(msg,data,m_scanparam->hardwarecaps.skrewdetectlevel,3); - }; - //装订检测 - m_query[(CapType)(CapTypeEx::TwEx_StableDetectEnable)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_StableDetectEnable)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_StableDetectEnable), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.en_stapledetect = mech; - - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.en_stapledetect, false); - //return CapSupGetAllResetEx(msg, data, { FALSE,TRUE }, m_scanparam->hardwarecaps.en_stapledetect, FALSE, m_scanparam->hardwarecaps.en_stapledetect==0 ? 0 : 1, 0); - }; - //折角检测 - m_query[(CapType)(CapTypeEx::TwEx_DogEarDelection)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_DogEarDelection)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_DogEarDelection), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->is_dogeardetection = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->is_dogeardetection, FALSE); - }; - //折角检测理论顶点到实际轮廓的最小距离 - m_query[(CapType)(CapTypeEx::TwEx_DogEarDistance)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_DogEarDistance)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_DogEarDistance), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (mech >= 10 && mech <= 300) - m_scanparam->dogeardistance = mech; - else - return badValue(); - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->dogeardistance, 70); - }; - - //双张检测 与官方标准定义有所差异 此协议修改为bool型 爱云校使用bool类型,其余使用标准twain协议 - m_query[CapType::DoubleFeedDetection] = msgSupportGetAllSetReset; - m_caps[CapType::DoubleFeedDetection] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapType::DoubleFeedDetection), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - switch (msg) { - case Msg::Get: - data = Capability::createEnumeration(CapType::DoubleFeedDetection, { 0 ,1}, m_scanparam->hardwarecaps.en_doublefeed ? 0 : 1, 0); - return { ReturnCode::Success, ConditionCode::Success }; - case Msg::GetCurrent: - data = Capability::createOneValue(CapType::DoubleFeedDetection, (UInt16)m_scanparam->hardwarecaps.en_doublefeed ? 0 : 1); - return { ReturnCode::Success, ConditionCode::Success }; - case Msg::Reset: - case Msg::GetDefault: - m_scanparam->hardwarecaps.en_doublefeed = 1; - data = Capability::createOneValue(CapType::DoubleFeedDetection, 0); - return { ReturnCode::Success, ConditionCode::Success }; - case Msg::Set: { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.en_doublefeed = mech ? 0 : 1; - return success(); - } - - default: - return { ReturnCode::Failure, ConditionCode::CapBadOperation }; - } - //if (Msg::Set == msg) { - // auto mech = data.currentItem(); - // m_scanparam->hardwarecaps.en_doublefeed = mech ? 1 : 0; - // return success(); - //} - //return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.en_doublefeed, TRUE); - }; - -#ifdef G200 - //低功耗模式 - m_query[(CapType)(CapTypeEx::TwEx_LowPowerMode)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_LowPowerMode)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_LowPowerMode), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.lowpowermode = (LowPowerMode)mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.lowpowermode, LowPowerMode::Min_30); - //return CapSupGetAllResetEx(msg, data, - // { LowPowerMode::Min_None,LowPowerMode::Min_5,LowPowerMode::Min_10,LowPowerMode::Min_20, LowPowerMode::Min_30, LowPowerMode::Min_60, LowPowerMode::Min_120, LowPowerMode::Min_240 }, - // m_scanparam->hardwarecaps.lowpowermode, LowPowerMode::Min_30, (BYTE)m_scanparam->hardwarecaps.lowpowermode, 4); - }; - //待纸扫描 - m_query[(CapType)(CapTypeEx::TwEx_IToBeScan)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IToBeScan)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IToBeScan), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.is_autopaper = mech; - if (mech) - m_scanparam->scannum = -1; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->hardwarecaps.is_autopaper, FALSE); - }; - -#endif // LANXUM - - m_query[(CapType)(CapTypeEx::TwEx_CropModel)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_CropModel)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CropModel), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->fillbackground || - m_scanparam->autodescrew || - m_scanparam->is_autocrop || - m_scanparam->en_fold) - { - return badValue(); - } - m_scanparam->normalCrop = (bool)mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->normalCrop, false); - }; - //图像拆分 - m_query[(CapType)(CapTypeEx::TwEx_ImageSplit)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_ImageSplit)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CropModel), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - m_scanparam->is_split = mech; - return success(); - } - return CapSupGetAllResetEx(msg, data, m_scanparam->is_split, false); - }; - - m_query[(CapType)(CapTypeEx::TwEx_IHsvFilter)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_IHsvFilter)] = [this](Msg msg, Capability& data)->Result { - //CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_CropModel), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - if (Msg::Set == msg) { - auto mech = data.currentItem(); - if (m_scanparam->pixtype != 2)//color - return badValue(); - - m_scanparam->hsvFilter = mech?1:0; - return success(); - } - bool hsv_v=(bool)(m_scanparam->hsvFilter); - return CapSupGetAllResetEx(msg, data, hsv_v, false); - }; -#ifdef UV - m_query[(CapType)(CapTypeEx::TwEx_UVModel)] = msgSupportGetAllSetReset; - m_caps[(CapType)(CapTypeEx::TwEx_UVModel)] = [this](Msg msg, Capability& data)->Result { - CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_UVModel), msg == Msg::Set ? to_string((float)data.currentItem()) : ""); - switch (msg) { - case Msg::Get:{ - data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_UVModel), Bool(m_scanparam->hardwarecaps.en_uv)); - //data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_UVModel), { Bool(),Bool(true) }, Bool(m_scanparam->hardwarecaps.en_uv), 0); - return success(); - } - case Msg::Reset: - m_scanparam->hardwarecaps.en_uv = false; - case Msg::GetCurrent: - data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_UVModel), m_scanparam->hardwarecaps.en_uv); - return success(); - case Msg::GetDefault: - data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_UVModel), Bool(false)); - return success(); - case Msg::Set: { - auto mech = data.currentItem(); - m_scanparam->hardwarecaps.en_uv = mech?1:0; - return success(); - } - default: - return capBadOperation(); - } - }; -#endif - - return success(); -} - -Result HuagaoDs::identityCloseDs(const Identity&) { - // no need to explicitly release any resources if using RAII - // TWPP will free the whole source on its own after this method - if (guiIndicator->GetSafeHwnd()) - guiIndicator->DestroyWindow(); - - if (guiTwain.get()) - guiTwain.reset(); - - if (guiBridge.get()) - guiBridge.reset(); - - scanner.reset(); - bmpData.reset(); - if (hMutex) - { - ReleaseMutex(hMutex); - CloseHandle(hMutex); - } - //saveGscanCapSetting(); - return success(); -} - -Result HuagaoDs::pendingXfersGet(const Identity&, PendingXfers& data) { - data.setCount(m_pendingXfers); - return success(); -} - -Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { - //!< end xfer if set count 0 - if (bmpData->size() > 0) - { - bmpData.reset(new std::vector); - } - - int ret = scanner->aquire_bmpdata(*bmpData.get()); - - if (ret != 0) { - scanner->Set_ErrorCode(0); - if (guiIndicator->GetSafeHwnd()) - guiIndicator->ShowWindow(SW_HIDE); - if (ret != -1) { - int index = scanner->geterrorindex(); - if (ret == 82 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) - showmsg("提示", "在第" + to_string(index) + "页检测到折角,停止扫描!", ret); - else if (ret == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) - showmsg("提示", "在第" + to_string(index) + "页检测到尺寸不符,停止扫描!", ret); - else if (ret == 81 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) - showmsg("提示", "设备处于休眠模式!请手动唤醒设备。", ret); - else - showmsg("提示", msgs[(UsbSupported)ret], ret); - FileTools::writelog(log_ERROR, msgs[(UsbSupported)ret]); -#ifndef G200 - scanner->clear_hwerror(); -#endif // G200 - } - else - { - if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) - { - int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1) * (m_scanparam->is_split ? 2 : 1) - * (m_scanparam->en_multi_output ? (m_scanparam->multioutput < 0 ? 1 : (m_scanparam->multioutput == 0 ? 3 : 2)) : 1); - if ((num - scanner->get_imgTransfered()) != 0) - { - showmsg("提示", msgs[LOSE_IMAGE]); - FileTools::writelog(log_ERROR, msgs[LOSE_IMAGE]); - } - - } - } - m_pendingXfers = 0; - if (guiTwain.get()) { - ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); - //setState(DsState::Enabled); - } - else { - //setState(DsState::Open); - } - } - else { - m_pendingXfers = 1; - //setState( DsState::XferReady ); - } - data.setCount(m_pendingXfers); - return success(); -} - -Result HuagaoDs::pendingXfersReset(const Identity&, PendingXfers& data) { - data.setCount(0); - if (scanner.get()) - { - scanner->Stop_scan(); - //scanner->reset(); - scanner->ResetScanner(); - } - //guiIndicator.reset(); - if (guiIndicator->GetSafeHwnd()) - guiIndicator->DestroyWindow(); - if (guiTwain.get()) { - ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); - } - return success(); -} - -Result HuagaoDs::setupMemXferGet(const Identity&, SetupMemXfer& data) { - auto bpl = bytesPerLine(); - auto max = bpl * static_cast(header()->biHeight); - - data.setMinSize(bpl); - data.setPreferredSize(max); - data.setMaxSize(max); - return success(); -} - -Result HuagaoDs::userInterfaceDisable(const Identity&, UserInterface& ui) { - if (guiTwain.get()) - guiTwain.reset(); - -#if TWPP_DETAIL_OS_WIN - if (guiBridge.get()) - guiBridge.reset(); -#endif - - return success(); -} - -Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { - m_pendingXfers = 1; - m_memXferYOff = 0; - - 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 - - - if (!scanner->IsConnected()) - scanner->open(vid, pid); - if (!scanner->IsConnected()) - { - MessageBox(NULL, L"USB连接异常,请连接USB后重新打开扫描软件", L"提示", MB_OK | MB_SYSTEMMODAL); - return seqError(); - } -#ifndef G200 - if (typeid(*scanner.get()) != typeid(GScanO1003399)) { - while (!scanner->Get_Scanner_PaperOn()) - { - if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO) - return seqError(); - } - } -#endif // !G200 - this_thread::sleep_for(chrono::milliseconds(100)); //扫描前增加延迟 防止usb缓存中的消息未读取清空 误报扫描错误 - auto ret = startScan(); - //if (ret.status().condition() == Twpp::CC::NoMedia) - // return ret; - if (ret == success()) { - m_pendingXfers = 1; - } - else { - m_pendingXfers = 0; - return seqError(); - } - return success(); - } - return showTwainUI(ui); -} - -Result HuagaoDs::userInterfaceEnableUiOnly(const Identity&, UserInterface& ui) { - // as a minimal source, we do not support GUI that just saves settings - return showTwainUI(ui, true); -} - -Result HuagaoDs::imageInfoGet(const Identity&, ImageInfo& data) { - // our image does not change - //if (m_pendingXfers == 0 || bmpData->size() == 0) - if(bmpData->size() == 0) - return success(); - auto dib = header(); - data.setBitsPerPixel(static_cast(dib->biBitCount)); - data.setHeight(dib->biHeight); - data.setPixelType(dib->biClrUsed == 2 ? PixelType::BlackWhite : (dib->biClrUsed == 256 ? PixelType::Gray : PixelType::Rgb)); - data.setPlanar(false); - data.setWidth(dib->biWidth); - data.setXResolution(m_scanparam->resolution_dst); - data.setYResolution(m_scanparam->resolution_dst); - data.compression(m_compression); - switch (dib->biClrUsed) - { - case 2: - case 256: - data.setSamplesPerPixel(1); - data.bitsPerSample()[0] = 8; - break; - case 0: - data.setSamplesPerPixel(3); - data.bitsPerSample()[0] = 8; - data.bitsPerSample()[1] = 8; - data.bitsPerSample()[2] = 8; - default: - break; - } - return success(); -} - -Result HuagaoDs::imageLayoutGet(const Identity&, ImageLayout& data) { - // our image does not change - auto dib = header(); - - data.setDocumentNumber(1); - data.setFrameNumber(1); - data.setPageNumber(1); - data.setFrame(Frame(0, 0, static_cast(dib->biWidth) / m_scanparam->resolution_dst, static_cast(dib->biHeight) / m_scanparam->resolution_dst)); - return success(); -} - -Result HuagaoDs::imageLayoutGetDefault(const Identity& origin, ImageLayout& data) { - return imageLayoutGet(origin, data); -} - -Result HuagaoDs::imageLayoutSet(const Identity& origin, ImageLayout& lay) { - // we dont support setting image frame - - ImageLayout def; - imageLayoutGetDefault(origin, def); - - return lay.frame() == def.frame() ? success() : badValue(); -} - -Result HuagaoDs::imageLayoutReset(const Identity& origin, ImageLayout& data) { - return imageLayoutGet(origin, data); -} - -Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data) { - if (!m_pendingXfers) { - return seqError(); - } - - // we can call our TWPP methods, but be careful about states - SetupMemXfer setup; - setupMemXferGet(origin, setup); - - // just a simple stored BMP image - auto dib = header(); - auto bpl = bytesPerLine(); - auto memSize = data.memory().size(); - if (memSize > setup.maxSize() || memSize < setup.minSize()) { - return badValue(); - } - - auto maxRows = memSize / bpl; - auto rows = std::min(maxRows, static_cast(dib->biHeight) - m_memXferYOff); - if (rows == 0) { - return seqError(); // image already transfered in this session - } - cv::Mat mat; - vector cmpdata; - if (m_compression == Compression::Group4) - { - mat = cv::imdecode(*bmpData.get(), cv::IMREAD_GRAYSCALE); - G4Tiff gt(mat, G4Tiff::Mode::MemoryMode, "", 120, m_scanparam->resolution_dst); - gt.GetCompressedData(cmpdata); - } - - data.setBytesPerRow(bpl); - data.setColumns(static_cast(dib->biWidth)); - data.setRows(rows); - data.setBytesWritten(m_compression == Compression::None ? bpl * rows : cmpdata.size()); - data.setXOffset(0); - data.setYOffset(m_memXferYOff); - data.setCompression(m_compression); - - auto lock = data.memory().data(); - char* out = lock.data(); - - auto bmpsize = bmpData->size(); - // bottom-up BMP -> top-down memory transfer - if (m_compression == Compression::None) - { - auto begin = bmpEnd() - (bpl * (m_memXferYOff + 1)); - for (UInt32 i = 0; i < rows; i++) { - // copy bytes - std::copy(begin, begin + bpl, out); - - char* line = out; - out += bpl; - begin -= bpl; - if (dib->biBitCount == 24) - { - //BGR BMP -> RGB memory transfer - for (; line + 3 < out; line += 3) { - std::swap(line[0], line[2]); - } - } - } - } - else - { - std::copy(cmpdata.data(), cmpdata.data() + cmpdata.size(), out); - } - - m_memXferYOff += rows; - - if (m_memXferYOff >= static_cast(std::abs(dib->biHeight))) { - m_pendingXfers = 0; - m_memXferYOff = 0; - //bmpData.reset(new std::vector); - return { ReturnCode::XferDone, ConditionCode::Success }; - } - - return success(); -} - -static int xtfer = 0; -Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { - if (!m_pendingXfers) { - return seqError(); - } - if (m_haveError) - return { ReturnCode::Cancel, ConditionCode::Success }; - if (data) - data.release(); - // it does not get easier than that if we already have BMP - data = ImageNativeXfer(bmpSize()); - std::copy(bmpBegin(), bmpEnd(), data.data().data()); - //bmpData.reset(new std::vector); - //FileTools::write_log("正在上传图片 ===> Twain transfered num of " + to_string(++xtfer) + " images"); - FileTools::writelog(log_INFO, "正在上传图片 ===> Twain transfered num of " + to_string(++xtfer) + " images"); - return { ReturnCode::XferDone, ConditionCode::Success }; -} - -Twpp::Result HuagaoDs::pendingXfersStopFeeder(const Identity& origin, PendingXfers& data) -{ - if (!scanner.get()) - return seqError(); - if (scanner->IsConnected()) { - scanner->Stop_scan(); - } - data.setCount(scanner->Get_IsImageQueueEmpty() ? 0 : 1); - return success(); -} - -Twpp::Result HuagaoDs::setupFileXferGet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) -{ - data.setFilePath(m_fileXfer.filePath()); - data.setFormat(m_fileXfer.format()); - return success(); -} - -Twpp::Result HuagaoDs::setupFileXferGetDefault(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) -{ - Str255 str("HGTwain.bmp"); - data.setFilePath(str); - data.setFormat(ImageFileFormat::Bmp); - return success(); -} - -Twpp::Result HuagaoDs::setupFileXferSet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) -{ - m_fileXfer.setFilePath(data.filePath()); - m_fileXfer.setFormat(data.format()); - return success(); -} - -Twpp::Result HuagaoDs::setupFileXferReset(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) -{ - m_fileXfer.setFormat(Twpp::ImageFileFormat::Bmp); - std::string templateName = "HG"; - char* tempPath = mktemp((char*)templateName.c_str()); - if (tempPath) { - Str255 str; - str.setData(tempPath, strlen(tempPath)); - m_fileXfer.setFilePath(str); - return success(); - } - return badProtocol(); -} - -static int indeximg = 0; - -Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) -{ - if (!m_pendingXfers) - return seqError(); - string filename = m_fileXfer.filePath().string(); - switch (m_fileXfer.format()) - { - case ImageFileFormat::Bmp: { - - FILE* pfile = fopen(filename.c_str(), "wb"); - if (pfile) { - if (bmpData->size() > 0) { - fwrite(bmpData->data(), 1, bmpData->size(), pfile); - bmpData.reset(new std::vector); - fclose(pfile); - return Result(ReturnCode::XferDone, ConditionCode::Success); - } - } - return Result(ReturnCode::Failure, ConditionCode::BadValue); - } - case ImageFileFormat::Tiff: - case ImageFileFormat::Jfif: { - - BITMAPINFOHEADER& bmpinfo = *((BITMAPINFOHEADER*)header()); - int decodetype; - if (bmpinfo.biBitCount == 24) - decodetype = cv::IMREAD_COLOR; - else - decodetype = cv::IMREAD_GRAYSCALE; - - - cv::Mat ims = cv::imdecode(*bmpData.get(), decodetype); - - if (m_compression == Compression::Group4 && m_fileXfer.format() == ImageFileFormat::Tiff) - { - if (!ims.empty() && ims.channels() == 3) - cvtColor(ims, ims, cv::COLOR_BGR2GRAY); - G4Tiff gsave(ims, G4Tiff::Mode::FileMode, filename, 120, m_scanparam->resolution_dst); - gsave.SaveG4Tiff(); - } - else - { - std::vector compression_params; - compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); - compression_params.push_back(m_jpegQuality); - std::vector imgdate; - cv::imencode(".jpg", ims, imgdate, compression_params); - std::ofstream out(filename,std::ios::binary | std::ios::out | std::ios::trunc); - if (out.is_open()) - out.write((const char*)imgdate.data(), imgdate.size()),out.close(); - //cv::imwrite(filename, ims, compression_params); - } - bmpData.reset(new std::vector); - ims.release(); - return Result(ReturnCode::XferDone, ConditionCode::Success); - } - default: - break; - } - return badProtocol(); -} - -Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) -{ - // as a minimal source, we do not support GUI that just saves settings - if (ui.parent()) { - guiBridge.reset(new CDialog()); - HWND appWindow = static_cast(ui.parent().raw()); - guiBridge->Create(IDD_BACK, CWnd::FromHandle(appWindow)); - HWND bridgeWindow = guiBridge->GetSafeHwnd(); - long bridgeFlags = GetWindowLong(bridgeWindow, GWL_STYLE); - SetWindowLong(bridgeWindow, GWL_STYLE, bridgeFlags | WS_CHILD); - SetParent(bridgeWindow, appWindow); - } - - //!< show ui to scan button push - auto scanFunction = [this](const GScanCap& caps) { - if (!scanner->IsConnected()) - { - scanner->open(vid, pid); - if (!scanner->IsConnected()) - return checkDeviceOnline(); - } - -#ifndef G200 - if (typeid(*scanner.get()) != typeid(GScanO1003399)) { - while (!scanner->Get_Scanner_PaperOn()) - { - if (MessageBox(NULL, L"检测到无纸,请添加纸张", L"提示", MB_YESNO | MB_SYSTEMMODAL) == IDNO) { - m_pendingXfers = 0; - return seqError(); - } - } - } -#endif // !G200 - m_pendingXfers = 1; - m_scanparam.reset(new GScanCap(caps)); - saveGscanCapSetting(); - if (!scanner->IsConnected()) - { - MessageBox(NULL, L"USB连接异常,请连接USB后重新打开扫描软件", L"提示", MB_OK | MB_SYSTEMMODAL); - return seqError(); - } - - if (startScan() == success()) { - notifyXferReady(); - } - else { - m_pendingXfers = 0; - } - }; - - //!< ui only to confirm button push - auto confirmFunction = [this](const GScanCap& caps) { - m_scanparam.reset(new GScanCap(caps)); - saveGscanCapSetting(); - notifyCloseOk(); - }; - - //!< cancel button push - auto cancelFunction = [this]() { - //if (m_modal) - //{ - // ::EnableWindow(parent, true); - //} - notifyCloseCancel(); - }; - - CWnd* parent = guiBridge.get(); - - TwGlue glue = { scanFunction, cancelFunction }; - TwGlue glueUiOnly = { confirmFunction, cancelFunction }; - std::string serialnum = scanner->GetSerialNum(); - std::string hardwareversion = scanner->GetFWVersion(); - std::string macadder = scanner->GetMacAdder(); - uint32_t mbversion = scanner->GetMotorFPGA(); - guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "确定" : "扫描", hardwareversion, serialnum,macadder,mbversion)); - 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_TOP, newRect.left + 20, newRect.top + 100, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOACTIVATE); - //SetWindowPos(guiTwain->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE); - guiTwain->ShowWindow(SW_SHOWNORMAL); - return success(); -} - -void HuagaoDs::DeviceEvent_callback(int eventID, void* usrdata) -{ - HuagaoDs* This = (HuagaoDs*)usrdata; - This->onDeviceEvent(eventID); -} - -void HuagaoDs::CapabilityPrintf(Twpp::Msg msg, std::string capability, std::string value) -{ - if (!is_printfcapability) - return; - switch (msg) - { - case Msg::Reset: - FileTools::writelog(log_INFO, (std::string)enum2str(Msg::Reset) + "\t" + capability); - break; - case Msg::Get: - FileTools::writelog(log_INFO, (std::string)enum2str(Msg::Get) + "\t" + capability); - break; - case Msg::GetCurrent: - FileTools::writelog(log_INFO, (std::string)enum2str(Msg::GetCurrent) + "\t" + capability); - break; - case Msg::GetDefault: - FileTools::writelog(log_INFO, (std::string)enum2str(Msg::GetDefault) + "\t" + capability); - break; - case Msg::Set: - FileTools::writelog(log_INFO, (std::string)enum2str(Msg::Set) + "\t" + capability+"\t value = "+value); - break; - default: - break; - } -} - -void HuagaoDs::onDeviceEvent(int eventID) -{ - //if (mapDeviceEvent.count(eventID)) - //{ - // DeviceEvent::Type dev_type = mapDeviceEvent[eventID]; - // auto evt = DeviceEvent::simple((DeviceEvent::Type)dev_type, "HuaGo Device Event"); - // devEvent.push(evt); - // notifyDeviceEvent(); - //} -} - -const BITMAPINFOHEADER* HuagaoDs::header() const noexcept { - return reinterpret_cast(bmpData->data() + sizeof(BITMAPFILEHEADER)); -} - -UInt32 HuagaoDs::bytesPerLine() const noexcept { - auto dib = header(); - return static_cast(dib->biWidth * dib->biBitCount + 31) / 32 * 4; -} - -UInt32 HuagaoDs::bmpSize() const noexcept { - return static_cast(bmpData->size()) - sizeof(BITMAPFILEHEADER); -} - -const char* HuagaoDs::bmpBegin() const noexcept { - return (const char*)bmpData->cbegin()._Ptr + sizeof(BITMAPFILEHEADER); -} - -const char* HuagaoDs::bmpEnd() const noexcept { - return (const char*)bmpData->cend()._Ptr; -} - -void HuagaoDs::updataGscanCap() -{ - GscanJsonConfig js; - GScanCap cfs = js.ReadGscanCap(); - cfs.resolution_native = 200.0f; - cfs.threshold = 128; - if (cfs.is_autocrop) - { - m_autoboarderdetcet = true; - m_autosize = (UInt16)AutoSize::Auto; - } - - m_scanparam.reset(new GScanCap(cfs)); -} - -Twpp::Result HuagaoDs::startScan() -{ - xtfer = 0; - //if (!scanner->IsConnected()) - //{ - // scanner->open(vid, pid); - // if (!scanner->IsConnected()) - // return checkDeviceOnline(); - //} - bmpData.reset(new std::vector()); - scanner->ResetScanner(); - scanner->reset(); - FileTools::writelog(log_INFO, "start scan"); - -#ifdef G200 - scanner->clear_hwerror(); -#else -#ifndef ANDROIDSERIAL - if (scanner->notifyscan() < 1) - return seqError(); -#endif // !ANDROIDSERIAL -#endif // - -#ifdef G200 - if (scanner->Get_Roller_num() > 450000) -#elif defined G300 - if (scanner->Get_Roller_num() > 150000) -#else - if (scanner->Get_Roller_num() > 200000) -#endif // G200 - { - Twain_config config; - if (config.getrollermsgdate() < chrono::duration_cast>>(chrono::system_clock::now().time_since_epoch()).count()){ - hgmsg(_T("纸轮搓纸次数已超过设计使用范围,扫描过程中搓纸失败、歪斜、搓多张等异常频次可能会明显增多,请注意及时清洁、并联系设备供应商购买替换纸轮!")); - config.setrollermsgdata(chrono::duration_cast>>(chrono::system_clock::now().time_since_epoch()).count()); - } - } - //m_scanparam->brightness =300; // 楚雄一中 500 - 142 - //m_scanparam->contrast = 0; // 小闲专用 - scanner->config_params(*m_scanparam); - std::string info = "papertype= " + to_string(m_scanparam->papertype) + - "\nAutoCrop_threshold= " + to_string(m_scanparam->AutoCrop_threshold) + - "\nautodescrew = " + to_string(m_scanparam->autodescrew) + - "\nautomaticcolor= " + to_string(m_scanparam->automaticcolor) + - "\nbrightness = " + to_string(m_scanparam->brightness) + - "\ncontrast = " + to_string(m_scanparam->contrast) + - "\nis_detachnoise = " + to_string(m_scanparam->detachnoise.is_detachnoise) + - "\ndetachnoise = " + to_string(m_scanparam->detachnoise.detachnoise) + - "\nen_fold = " + to_string(m_scanparam->en_fold) + - "\nen_sizecheck = " + to_string(m_scanparam->en_sizecheck) + - "\nenhance_color = " + to_string(m_scanparam->enhance_color) + - "\nfillbackground = " + to_string(m_scanparam->fillbackground) + - "\nfilter = " + to_string(m_scanparam->filter) + - "\nis_fillhole = " + to_string(m_scanparam->fillhole.is_fillhole) + - "\ngamma = " + to_string(m_scanparam->gamma) + - "\ncapturepixtype = " + to_string(m_scanparam->hardwarecaps.capturepixtype) + - "\nen_doublefeed = " + to_string(m_scanparam->hardwarecaps.en_doublefeed) + - "\nhsvcorrect = " + to_string(m_scanparam->hsvcorrect) + - "\nimageRotateDegree = " + to_string(m_scanparam->imageRotateDegree) + - "\nindent = " + to_string(m_scanparam->indent) + - "\nis_autocontrast = " + to_string(m_scanparam->is_autocontrast) + - "\nis_autocrop = " + to_string(m_scanparam->is_autocrop) + - "\nis_autocontrast = " + to_string(m_scanparam->is_autocontrast) + - "\nis_autodiscradblank_normal = " + to_string(m_scanparam->is_autodiscradblank_normal) + - "\nis_autodiscradblank_vince = " + to_string(m_scanparam->is_autodiscradblank_vince) + - "\nis_autotext = " + to_string(m_scanparam->is_autotext) + - "\nis_convex = " + to_string(m_scanparam->is_convex) + - "\nis_duplex = " + to_string(m_scanparam->is_duplex) + - "\nis_switchfrontback = " + to_string(m_scanparam->is_switchfrontback) + - "\nis_dogeardetection = " + to_string(m_scanparam->is_dogeardetection) + - "\nmulti_output_red = " + to_string(m_scanparam->multi_output_red) + - "\nen_multi_output = " + to_string(m_scanparam->en_multi_output) + - "\nmultioutput = " + to_string(m_scanparam->multioutput) + - "\nnoise = " + to_string(m_scanparam->noise) + - "\npaperAlign = " + to_string(m_scanparam->paperAlign) + - "\npixtype = " + to_string(m_scanparam->pixtype) + - "\nresolution_dst = " + to_string(m_scanparam->resolution_dst) + - "\nscannum = " + to_string(m_scanparam->scannum) + - "\nsharpen = " + to_string(m_scanparam->sharpen); - FileTools::writelog(log_TRACE,info); - - scanner->UpdateScanInfo(0, 0); - scanner->Scanner_StartScan(m_scanparam->scannum); - if (bmpData->size() > 0) - { - bmpData.reset(new std::vector); - } - if (guiTwain.get()) { - ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(false); - } - int retCode = scanner->aquire_bmpdata(*bmpData.get()); - if (retCode == 0) - { - if (m_bIndicator) { - //!< cancel button push - auto stopFunc = [this]() { - if (scanner.get()) - scanner->Stop_scan(); - //guiIndicator.reset();//取消扫描 关闭进度指示器 - if (guiTwain.get()) { - ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); - } - onDeviceEvent(USER_STOP); - }; - guiIndicator = new CIndicatorDlg(stopFunc); - scanner->regist_indicatortext_callback([this](int aquire, int updata) - { if (guiIndicator->GetSafeHwnd()) - guiIndicator->setindicatortext(aquire, updata); - }); - guiIndicator->Create(IDD_INDICATOR, guiTwain.get() ? guiTwain.get() : guiBridge.get());//guiTwain ? guiTwain.get() : guiBridge.get() - guiIndicator->ShowWindow(SW_SHOWNORMAL); - } - } - if (retCode != 0) { - scanner->Set_ErrorCode(0); - if (guiIndicator->GetSafeHwnd()) - guiIndicator->DestroyWindow(); - - //if(guiIndicator.get()) - // guiIndicator.reset(); - if (retCode != -1) { - CString str; - str.Format(_T("%d"), retCode); - m_pendingXfers = 0; - m_memXferYOff = 0; - m_haveError = true; - //ShellExecute(guiTwain ? guiTwain->m_hWnd : NULL, TEXT("open"), GetHidedlgPath(), str, NULL, SW_HIDE); - int index = scanner->geterrorindex(); - if (retCode == 82 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) - showmsg("提示", "在第" + to_string(index) + "页检测到折角,停止扫描!", retCode); - else if (retCode == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) - showmsg("提示", "在第" + to_string(index) + "页检测到尺寸不符,停止扫描!", retCode); - else if (retCode == 81 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) - showmsg("提示", "设备处于休眠模式!请手动唤醒设备。", retCode); - else - showmsg("提示", msgs[(UsbSupported)retCode], retCode); - FileTools::writelog(log_ERROR, msgs[(UsbSupported)retCode]); -#ifndef G200 - scanner->clear_hwerror(); -#endif // - } - - if (guiTwain.get()) { - ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); - } - if (retCode == 2) - return { ReturnCode::Failure, ConditionCode::NoMedia };//无纸 - - return seqError(); - } - - if (bmpData->size() > 0) { - m_haveError = false; - return success(); - } - else { - if (guiTwain.get()) { - ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true); - } - return seqError(); - } -} - -void HuagaoDs::saveGscanCapSetting() -{ - 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); - GscanJsonConfig js; - //vector vc; - //vc.push_back(*m_scanparam); - std::string savepath = TCHAR2STRING(szIniFile); - js.SaveGscancapJson(*m_scanparam, savepath); - //js.WriteJsonArrayToFile(vc, savepath); -} +} \ No newline at end of file