2020-03-11 01:58:06 +00:00
# include "stdafx.h"
# ifdef max
# undef max
# endif
# ifdef min
# undef min
# endif
# include <memory>
# include "huagaods.hpp"
# include "twglue.hpp"
# include "resource.h"
# include "CTwainUI.h"
# include "CIndicatorDlg.h"
2021-06-28 03:58:54 +00:00
//#include "Cmsgbox.h"
2020-03-11 01:58:06 +00:00
# include "Device/PublicFunc.h"
# include "Device/GScanO200.h"
2021-01-22 07:37:46 +00:00
# include "Device/GScanO400.h"
2021-11-20 03:09:04 +00:00
# include "Device/GScanO400Android.h"
2021-07-11 08:19:57 +00:00
# include "Device/GScanO1003399.h"
2022-08-10 03:10:20 +00:00
# include "Device/GScan439Android.h"
2020-03-11 01:58:06 +00:00
# include "Device/filetools.h"
# include "Device/GScanVirtual.h"
# include <list>
# include <map>
2020-06-20 03:01:35 +00:00
# include "GscanJsonConfig.h"
2020-08-31 07:44:24 +00:00
# include "G4Tiff.h"
2021-01-22 07:37:46 +00:00
# include "Device/UsbScanEx.h"
# ifdef WIN32
# include <Psapi.h>
2022-05-24 12:05:47 +00:00
# include <minidumpapiset.h>
# pragma comment (lib,"Dbghelp.lib")
2021-01-22 07:37:46 +00:00
# endif // WIN32
2021-04-13 09:30:05 +00:00
using namespace std ;
2020-08-31 07:44:24 +00:00
2020-03-11 01:58:06 +00:00
//custom define caps enum
enum class CapTypeEx : unsigned short {
2020-06-20 03:01:35 +00:00
Base = 0x8000 , //custom caps enum value must bigger than CapTypeEx::Base value,otherwise might make conflict
TwEx_IMultiOutputRed = 0x8026 ,
TwEx_IFillHole = 0x8018 ,
TwEx_IFillHoleRatio = 0x8092 ,
TwEx_IFillBackground = 0x8004 ,
TwEx_IBackRotate180 = 0x8005 ,
TwEx_IAutoDiscardBlankVince = 0x8091 ,
TwEx_IEnhanceColor = 0x8007 ,
TwEx_HardwareVersion = 0x8025 ,
TwEx_ScrewDetectEnable = 0x8006 ,
TwEx_ScrewLevel = 0x8021 ,
TwEx_Sharpen = 0x8022 ,
2021-06-28 03:58:54 +00:00
TwEx_EnFold = 0x8037 ,
2020-06-20 03:01:35 +00:00
TwEx_StableDetectEnable = 0x8090 ,
TwEx_UVModel = 0x8093 ,
2020-06-23 09:31:43 +00:00
TwEx_SwitchFrontBack = 0x8094 ,
2020-11-16 10:05:04 +00:00
TwEx_HsvCorrect = 0x8095 ,
2020-12-09 08:02:51 +00:00
TwEx_DogEarDelection = 0x8096 ,
2021-04-06 01:31:21 +00:00
TwEx_FillBackgroundMode = 0x8097 ,
2020-12-09 08:02:51 +00:00
TwEx_CroporDesaskewIndent = 0x8098 ,
2021-06-28 03:58:54 +00:00
TwEx_CropNoise = 0x8099 ,
TwEx_CroporDesaskewThreshold = 0x8100 ,
2020-12-09 08:02:51 +00:00
TwEx_IDetachNoise = 0x8101 ,
TwEx_IDetachNoiseValue = 0x8102 ,
2021-06-28 03:58:54 +00:00
TwEx_SizeDetect = 0x8103 ,
TwEx_LowPowerMode = 0x8104 ,
TwEx_ENCODE = 0x8105 ,
2021-07-19 10:36:34 +00:00
TwEx_CropModel = 0x8106 ,
2021-11-20 03:09:04 +00:00
TwEx_DogEarDistance = 0x8107 ,
2021-12-16 08:21:35 +00:00
TwEx_ImageSplit = 0x8108 ,
2022-02-14 02:30:19 +00:00
TwEx_IFadeBack = 0x8109 ,
TwEx_IFadeBackValue = 0x8110 ,
2022-05-24 12:05:47 +00:00
TwEx_IToBeScan = 0x8111 ,
TwEx_IEnMultiOutPut = 0x8112 ,
TwEx_IEnMultiOutPutType = 0x8113 ,
TwEx_IFixedPaper = 0x8114 ,
TwEx_IHighImageQuality = 0x8115 ,
2022-11-02 10:46:24 +00:00
TwEx_SETTOKEN = 0x8116 ,
2023-01-04 06:30:50 +00:00
TwEx_IHsvFilter = 0x8117 ,
TwEx_ColorCast = 0x8118 ,
2023-03-13 08:53:10 +00:00
TwEx_IToBeScanTimeOut = 0x8119 ,
2020-03-11 01:58:06 +00:00
} ;
2021-04-06 01:31:21 +00:00
enum class PaperSizeEx : unsigned short {
K8 = 0x81 ,
K16 = 0x82 ,
2021-05-19 10:58:07 +00:00
Trigeminy = 0x83 ,
2021-04-06 01:31:21 +00:00
} ;
2020-03-11 01:58:06 +00:00
using namespace Twpp ;
using namespace std : : placeholders ;
# define TWPP_ENTRY_MFC(SourceClass)\
extern " C " TWPP_DETAIL_EXPORT Twpp : : ReturnCode TWPP_DETAIL_CALLSTYLE \
DS_Entry ( Twpp : : Identity * origin , Twpp : : DataGroup dg , Twpp : : Dat dat , Twpp : : Msg msg , void * data ) { \
AFX_MANAGE_STATE ( AfxGetStaticModuleState ( ) ) ; \
static_assert ( \
std : : is_base_of < Twpp : : SourceFromThis < SourceClass , false > , SourceClass > : : value | | \
std : : is_base_of < Twpp : : SourceFromThis < SourceClass , true > , SourceClass > : : value , \
" Class " # SourceClass " is not derived from SourceFromThis. " \
) ; \
return SourceClass : : entry ( origin , dg , dat , msg , data ) ; \
}
TWPP_ENTRY_MFC ( HuagaoDs )
static constexpr const Identity srcIdent (
2022-08-10 03:10:20 +00:00
Version ( 3 , 3 , Language : : English , Country : : China , " v3.3.5.9 " ) ,
2020-06-20 03:01:35 +00:00
DataGroup : : Image ,
2020-07-20 02:29:10 +00:00
# ifdef MAKEHUAGAO
2020-06-20 03:01:35 +00:00
" HUAGO " ,
2021-09-23 01:19:47 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
" Hanvon " ,
2021-11-20 03:09:04 +00:00
# elif defined AUGE
" AUGE " ,
2020-11-16 10:05:04 +00:00
# elif defined LANXUM
" LANXUM " ,
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZHUOYUYUN " ,
2022-06-29 12:24:24 +00:00
# elif defined CUMTENN
" CUMTENN " ,
2022-02-14 02:30:19 +00:00
# elif defined MAKERIGHTWAY
" RIGHTWAY " ,
2022-05-24 12:05:47 +00:00
# elif defined NOLOGO
" SCAN " ,
2020-07-20 02:29:10 +00:00
# else // MAKEHUAGAO
" ZHIBEN " ,
2020-06-20 03:01:35 +00:00
# endif
2020-07-20 02:29:10 +00:00
# ifdef G200
2021-09-23 01:19:47 +00:00
# ifdef ISG100
# ifdef LANXUM
" G62S Series " ,
2021-12-16 08:21:35 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
" HW-8000 " ,
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZY-2100S " ,
2021-09-23 01:19:47 +00:00
# else // ISG100
" G100 Series " ,
# endif
# else // ISG100
# ifdef LANXUM
" G73S Series " ,
# elif defined HANVON
2022-05-24 12:05:47 +00:00
" HW-9000 " ,
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZY-2100S " ,
2022-06-29 12:24:24 +00:00
# elif defined CUMTENN
" CTS A3 " ,
2021-09-23 01:19:47 +00:00
# else // ISG100
" G200 Series " ,
# endif
# endif
2020-06-20 03:01:35 +00:00
# elif defined(G300) // G200
2021-09-23 01:19:47 +00:00
# ifdef LANXUM
" G42S Series " ,
2022-06-29 12:24:24 +00:00
# elif defined CUMTENN
" CTS A4 " ,
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZY-2100S " ,
2022-05-24 12:05:47 +00:00
# elif defined HANVON
# ifdef ANDROIDSERIAL
" HW-1000 " ,
# else
" HW-1000NS " ,
# endif // ANDROIDSERIAL
2021-09-23 01:19:47 +00:00
# else // ISG100
2021-12-16 08:21:35 +00:00
" G300 Series " , //<2F> <> <EFBFBD> ݾɼ<DDBE> <C9BC> <EFBFBD> pm changed <20> <> G300 Series
2021-09-23 01:19:47 +00:00
# endif
2020-11-16 10:05:04 +00:00
2020-06-20 03:01:35 +00:00
# elif defined(G400) // G200
2021-09-23 01:19:47 +00:00
# ifdef LANXUM
" G52S Series " ,
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZY-2100S " ,
2021-09-23 01:19:47 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
# ifdef ANDROIDSERIAL
" HW-7000 " ,
# else
" HW-7000NS " ,
# endif // ANDROIDSERIAL
2021-09-23 01:19:47 +00:00
# else // ISG100
" G400 Series " ,
# endif
2020-12-09 08:02:51 +00:00
2020-06-20 03:01:35 +00:00
# endif
# ifdef G200
2021-09-23 01:19:47 +00:00
# ifdef ISG100
# ifdef MAKEHUAGAO
" HUAGOSCAN G100 TWAIN "
2022-05-24 12:05:47 +00:00
# elif defined NOLOGO
" Scan G100 TWAIN "
2021-11-20 03:09:04 +00:00
# elif defined AUGE
" AUGESCAN G100 TWAIN "
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZHUOYUYUNSCAN G100 TWAIN "
2021-12-16 08:21:35 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
" Hanvon HW-8000 TAWIN "
2021-09-23 01:19:47 +00:00
# elif defined LANXUM //!LANXUM
" LANXUMSCAN G62S TWAIN "
# else // !MAKEHUAGAO
" ZhibenScan G100 TWAIN "
# endif
# else // ISG100
# ifdef MAKEHUAGAO
" HUAGOSCAN G200 TWAIN "
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZHUOYUYUNSCAN G200 TWAIN "
2022-05-24 12:05:47 +00:00
# elif defined NOLOGO
" Scan G200 TWAIN "
2022-06-29 12:24:24 +00:00
# elif defined CUMTENN
" CUMTENN CTS A3 TWAIN "
2021-09-23 01:19:47 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
" Hanvon HW-9000 TAWIN "
2021-09-23 01:19:47 +00:00
# elif defined LANXUM //!LANXUM
" LANXUMSCAN G73S TWAIN "
# else // !MAKEHUAGAO
" ZhibenScan G200 TWAIN "
# endif
2020-06-20 03:01:35 +00:00
# endif
2020-11-16 10:05:04 +00:00
# elif defined G300 // G200
2021-06-28 03:58:54 +00:00
# ifdef MAKEHUAGAO
2021-07-02 03:29:24 +00:00
# ifdef UV
" HUAGOSCAN G300UV TWAIN "
2022-08-10 03:10:20 +00:00
# elif defined ANDROIDSERIAL
" HUAGOSCAN G300 Android TWAIN " // <20> <> <EFBFBD> ݾɼ<DDBE> <C9BC> <EFBFBD> pm changed "HUAGOSCAN G300 TWAIN"
2021-07-02 03:29:24 +00:00
# else
2022-08-10 03:10:20 +00:00
" HUAGOSCAN G300 Linux TWAIN "
2021-07-02 03:29:24 +00:00
# endif
2022-02-14 02:30:19 +00:00
# elif defined UV && defined MAKERIGHTWAY
" RIGHTWAYSCAN G300 TWAIN "
2021-09-23 01:19:47 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
# ifdef ANDROIDSERIAL
" Hanvon HW-1000 TAWIN "
# else
" Hanvon HW-1000NS TAWIN "
# endif // ANDROIDSERIES
# elif defined NOLOGO
" Scan G300 TWAIN "
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZHUOYUYUNSCAN G300 TWAIN "
2022-06-29 12:24:24 +00:00
# elif defined CUMTENN
" CUMTENN CTS A4 TWAIN "
2021-06-28 03:58:54 +00:00
# elif defined LANXUM //!LANXUM
" LANXUMSCAN G42S TWAIN "
# else // !MAKEHUAGAO
" ZhibenScan G300 TWAIN "
# endif
2020-06-20 03:01:35 +00:00
# elif defined(G400) // G200
2021-09-23 01:19:47 +00:00
# ifdef MAKEHUAGAO
2022-08-10 03:10:20 +00:00
# ifdef ANDROIDSERIAL
" HUAGOSCAN G400 Android TWAIN "
# else
" HUAGOSCAN G400 Linux TWAIN "
# endif // ANDROIDSERIES
2021-09-23 01:19:47 +00:00
# elif defined HANVON
2022-05-24 12:05:47 +00:00
# ifdef ANDROIDSERIAL
" Hanvon HW-7000 TAWIN "
# else
" Hanvon HW-7000NS TAWIN "
# endif // ANDROIDSERIES
2021-09-23 01:19:47 +00:00
# elif defined LANXUM //!LANXUM
" LANXUMSCAN G52S TWAIN "
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
" ZHUOYUYUNSCAN G400 TWAIN "
2022-05-24 12:05:47 +00:00
# elif defined NOLOGO
" Scan G400 TWAIN "
2021-09-23 01:19:47 +00:00
# else // !MAKEHUAGAO
" ZhibenScan G400 TWAIN "
# endif
2020-06-20 03:01:35 +00:00
# endif
2020-07-20 02:29:10 +00:00
2020-03-11 01:58:06 +00:00
# if defined(_MSC_VER)
2020-06-20 03:01:35 +00:00
" "
2020-03-11 01:58:06 +00:00
# elif defined(__GNUC__)
2020-06-20 03:01:35 +00:00
" GCC "
2020-03-11 01:58:06 +00:00
# elif defined(__clang__)
2020-06-20 03:01:35 +00:00
" CLang "
2020-03-11 01:58:06 +00:00
# endif
2020-06-20 03:01:35 +00:00
) ;
2020-03-11 01:58:06 +00:00
// lets just simulate uniform resolution for both axes
static constexpr UInt32 RESOLUTIONX = 85 ;
2020-08-15 08:42:43 +00:00
//static std::unique_ptr<CWinApp> application(new CWinApp());
2020-03-11 01:58:06 +00:00
2020-12-09 08:02:51 +00:00
# ifdef LANXUM
static list < float > resList = { 100.0 , 150.0 , 200.0 , 240.0 , 300.0 } ;
# else
2020-11-16 10:05:04 +00:00
static list < float > resList = { 100.0 , 150.0 , 200.0 , 240.0 , 300.0 , 600.0 } ;
2020-12-09 08:02:51 +00:00
# endif // LANXUM
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> G200 G300<30> <30> G400ֽ<30> ŷ<EFBFBD> <C5B7> <EFBFBD>
2020-11-16 10:05:04 +00:00
# ifdef G200
2020-03-11 01:58:06 +00:00
static list < UInt16 > paperSizeList = { ( UInt16 ) PaperSize : : A3 , ( UInt16 ) PaperSize : : A4 , ( UInt16 ) PaperSize : : A5 , ( UInt16 ) PaperSize : : A6 ,
2020-06-20 03:01:35 +00:00
( UInt16 ) PaperSize : : IsoB4 , ( UInt16 ) PaperSize : : IsoB5 , ( UInt16 ) PaperSize : : IsoB6 ,
( UInt16 ) PaperSize : : UsLetter , ( UInt16 ) PaperSize : : UsLegal , ( UInt16 ) PaperSize : : UsLedger ,
2021-05-19 10:58:07 +00:00
( UInt16 ) PaperSize : : MaxSize , ( UInt16 ) PaperSize : : None , ( UInt16 ) PaperSize : : UsStatement ,
( UInt16 ) PaperSizeEx : : K8 , ( UInt16 ) PaperSizeEx : : K16 , ( UInt16 ) PaperSizeEx : : Trigeminy } ;
2020-03-11 01:58:06 +00:00
2020-11-16 10:05:04 +00:00
# elif defined G300
static list < UInt16 > paperSizeList = { ( UInt16 ) PaperSize : : A4 , ( UInt16 ) PaperSize : : A5 , ( UInt16 ) PaperSize : : A6 , ( UInt16 ) PaperSize : : IsoB5 , ( UInt16 ) PaperSize : : IsoB6 ,
2021-05-19 10:58:07 +00:00
( UInt16 ) PaperSize : : UsLetter , ( UInt16 ) PaperSize : : UsLegal , ( UInt16 ) PaperSize : : None , ( UInt16 ) PaperSizeEx : : K16 } ;
2020-11-16 10:05:04 +00:00
# elif defined G400
static list < UInt16 > paperSizeList = { ( UInt16 ) PaperSize : : A3 , ( UInt16 ) PaperSize : : A4 , ( UInt16 ) PaperSize : : A5 , ( UInt16 ) PaperSize : : A6 ,
( UInt16 ) PaperSize : : IsoB4 , ( UInt16 ) PaperSize : : IsoB5 , ( UInt16 ) PaperSize : : IsoB6 ,
( UInt16 ) PaperSize : : UsLetter , ( UInt16 ) PaperSize : : UsLegal , ( UInt16 ) PaperSize : : UsLedger ,
2021-05-19 10:58:07 +00:00
( UInt16 ) PaperSize : : MaxSize , ( UInt16 ) PaperSize : : None , ( UInt16 ) PaperSize : : UsStatement ,
( UInt16 ) PaperSizeEx : : K8 , ( UInt16 ) PaperSizeEx : : K16 , ( UInt16 ) PaperSizeEx : : Trigeminy } ;
2020-11-16 10:05:04 +00:00
# endif // G200
2020-05-16 01:59:44 +00:00
static list < float > imageRotateList = { 0.0 , 90.0 , 180.0 , 270.0 } ;
2020-03-11 01:58:06 +00:00
2020-08-31 07:44:24 +00:00
enum class DeviceEventType : UInt16
{
CustomEvents = 0x8000 ,
Dev_OPENCOVER ,
Dev_NOFEED ,
Dev_FEEDERROR ,
Dev_STABLE ,
Dev_SKREW ,
Dev_COUNTMOE ,
Dev_HARDWAREERROR ,
Dev_FPGAERROR ,
2020-11-16 10:05:04 +00:00
Dev_UserStop ,
Dev_DogEar
2020-08-31 07:44:24 +00:00
} ;
static map < unsigned int , DeviceEvent : : Type > mapDeviceEvent = {
{ OPEN_COVER , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_OPENCOVER ) } ,
{ NO_FEED , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_NOFEED ) } ,
{ FEED_IN_ERROR , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_FEEDERROR ) } ,
{ PAPER_JAM , DeviceEvent : : Type : : PaperJam } ,
{ DETECT_DOUBLE_FEED , DeviceEvent : : Type : : PaperDoubleFeed } ,
{ DETECT_STAPLE , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_STABLE ) } ,
{ PAPER_SKEW , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_SKREW ) } ,
{ COUNT_MODE , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_COUNTMOE ) } ,
{ HARDWARE_ERROR , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_HARDWAREERROR ) } ,
{ FPGA_ERROR , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_FPGAERROR ) } ,
{ USB_DISCONNECTED , DeviceEvent : : Type : : CheckDeviceOnline } ,
2020-11-16 10:05:04 +00:00
{ USER_STOP , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_UserStop ) } ,
{ DOG_EAR , ( DeviceEvent : : Type ) ( DeviceEventType : : Dev_DogEar ) }
2020-08-31 07:44:24 +00:00
} ;
2020-03-11 01:58:06 +00:00
2021-07-29 11:34:42 +00:00
struct Vid_pid
{
WORD vid ;
WORD pid ;
} ;
2021-05-13 10:13:08 +00:00
# ifdef LANXUM
2021-07-29 11:34:42 +00:00
static std : : vector < Vid_pid > DeviceID {
2021-05-13 10:13:08 +00:00
{ 0x31c9 , 0x8200 } ,
# ifdef G200
# ifdef ISG100
2021-11-20 03:09:04 +00:00
{ 0x31c9 , 0x8629 } ,
2021-05-13 10:13:08 +00:00
{ 0x31c9 , 0x8620 } ,
# else
2021-11-20 03:09:04 +00:00
{ 0x31c9 , 0x8739 } ,
2021-05-13 10:13:08 +00:00
{ 0x31c9 , 0x8730 } ,
# endif // ISG100
# elif defined G300
{ 0x31c9 , 0x8420 } ,
2022-08-10 03:10:20 +00:00
{ 0x31c9 , 0x8429 } ,
2021-05-13 10:13:08 +00:00
# elif defined G400
{ 0x31c9 , 0x8520 } ,
2022-06-29 12:24:24 +00:00
{ 0x31c9 , 0x8529 } ,
2021-05-13 10:13:08 +00:00
# endif // ISG100
} ;
2021-11-20 03:09:04 +00:00
2023-04-27 07:01:07 +00:00
# elif defined ZHUOYUYUN
2023-04-24 11:30:39 +00:00
static std : : vector < Vid_pid > DeviceID {
{ 0x3072 , 0x2100 } ,
} ;
2021-11-20 03:09:04 +00:00
# elif defined AUGE
2021-09-23 01:19:47 +00:00
static std : : vector < Vid_pid > DeviceID {
2021-11-20 03:09:04 +00:00
{ 0x3072 , 0x0130 } ,
} ;
2021-05-13 10:13:08 +00:00
2021-11-20 03:09:04 +00:00
# elif defined HANVON
static std : : vector < Vid_pid > DeviceID {
2021-12-16 08:21:35 +00:00
# ifdef G200
# ifdef ISG100
{ 0x2903 , 0x8000 } ,
# else
{ 0x2903 , 0x9000 } ,
# endif // ISG100
# elif defined G400
2021-09-23 01:19:47 +00:00
{ 0x2903 , 0x7000 } ,
2022-06-29 12:24:24 +00:00
# ifdef ANDROIDSERIAL
{ 0x2903 , 0x7002 } ,
# else
{ 0x2903 , 0x7039 } ,
# endif // ANDROIDSERIAL
2022-05-24 12:05:47 +00:00
# elif defined G300
{ 0x2903 , 0x1000 } ,
2022-06-29 12:24:24 +00:00
# ifdef ANDROIDSERIAL
{ 0x2903 , 0x1002 } ,
# endif // ANDROIDSERIAL
2021-12-16 08:21:35 +00:00
# endif // G200
2021-09-23 01:19:47 +00:00
} ;
2021-11-20 03:09:04 +00:00
2022-06-29 12:24:24 +00:00
# elif defined CUMTENN
static std : : vector < Vid_pid > DeviceID {
# ifdef G200
# ifdef ISG100
{ 0x3072 , 0x138 } ,
# else
{ 0x3072 , 0x238 } ,
# endif // ISG100
# elif defined G300
{ 0x3072 , 0x0303 } ,
# elif defined G400
{ 0x3072 , 0x0403 } ,
# endif
} ;
2021-05-13 10:13:08 +00:00
# else
2021-07-29 11:34:42 +00:00
static std : : vector < Vid_pid > DeviceID {
2021-04-06 01:31:21 +00:00
{ 0x64B , 0x7823 } ,
# ifdef G200
# ifdef ISG100
{ 0x3072 , 0x100 } ,
2021-07-29 11:34:42 +00:00
{ 0x3072 , 0x139 } ,
2021-04-06 01:31:21 +00:00
# else
2021-07-29 11:34:42 +00:00
{ 0x3072 , 0x239 } ,
2021-04-06 01:31:21 +00:00
{ 0x3072 , 0x200 } ,
# endif // ISG100
# elif defined G300
2022-02-14 02:30:19 +00:00
{ 0x3072 , 0x0300 } ,
2022-08-10 03:10:20 +00:00
# ifdef ANDROIDSERIAL
{ 0x3072 , 0x0302 } ,
# else
{ 0x3072 , 0x0339 } ,
# endif // ANDROIDSERIAL
2021-04-06 01:31:21 +00:00
# elif defined G400
2022-05-24 12:05:47 +00:00
{ 0x3072 , 0x0400 } ,
2022-08-10 03:10:20 +00:00
# ifdef ANDROIDSERIAL
{ 0x3072 , 0x0402 } ,
# else
{ 0x3072 , 0x0439 } ,
# endif // ANDROIDSERIAL
2021-04-06 01:31:21 +00:00
# endif // ISG100
} ;
2021-07-29 11:34:42 +00:00
2021-05-13 10:13:08 +00:00
# endif
2021-04-06 01:31:21 +00:00
2020-03-11 01:58:06 +00:00
static void DeleteWnd ( CDialog * pWnd ) {
2020-06-20 03:01:35 +00:00
if ( pWnd & & pWnd - > GetSafeHwnd ( ) ) {
2021-06-28 03:58:54 +00:00
if ( pWnd - > m_hWnd )
2020-08-31 07:44:24 +00:00
DestroyWindow ( pWnd - > m_hWnd ) ;
2020-06-20 03:01:35 +00:00
}
2020-03-11 01:58:06 +00:00
}
2020-08-31 07:44:24 +00:00
static std : : unique_ptr < CTwainUI , void ( * ) ( CDialog * ) > guiTwain ( nullptr , DeleteWnd ) ;
2020-03-11 01:58:06 +00:00
2021-06-28 03:58:54 +00:00
//static std::unique_ptr<Cmsgbox> msgbox;
2021-05-13 10:13:08 +00:00
2020-03-11 01:58:06 +00:00
# if TWPP_DETAIL_OS_WIN
static std : : unique_ptr < CDialog , void ( * ) ( CDialog * ) > guiBridge ( nullptr , DeleteWnd ) ;
2020-08-31 07:44:24 +00:00
2020-03-11 01:58:06 +00:00
# endif
2020-08-31 07:44:24 +00:00
//static std::unique_ptr<CIndicatorDlg, void(*)(CDialog*)> guiIndicator(nullptr, DeleteWnd);
2021-06-28 03:58:54 +00:00
static CIndicatorDlg * guiIndicator = NULL ;
2020-07-11 10:43:17 +00:00
//#define HG_VIRTUAL
2020-03-11 01:58:06 +00:00
# ifndef HG_VIRTUAL
2020-08-31 07:44:24 +00:00
static std : : unique_ptr < IScanner > scanner ; //(new GScanO200());
2020-03-11 01:58:06 +00:00
# else
2020-06-20 03:01:35 +00:00
static std : : unique_ptr < IScanner > scanner ( new GScanVirtual ( ) ) ;
2020-03-11 01:58:06 +00:00
# endif
2021-01-22 07:37:46 +00:00
2022-05-24 12:05:47 +00:00
long __stdcall callback ( EXCEPTION_POINTERS * ex )
{
2022-06-29 12:24:24 +00:00
if ( scanner . get ( ) )
{
if ( scanner - > IsConnected ( ) )
scanner - > Stop_scan ( ) ;
}
2022-05-24 12:05:47 +00:00
HANDLE handle = CreateFile ( ( FileTools : : get_errorlog_path_w ( ) + L " error.dmp " ) . c_str ( ) , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL ) ;
if ( ! handle )
return EXCEPTION_EXECUTE_HANDLER ;
MINIDUMP_EXCEPTION_INFORMATION dump ;
dump . ExceptionPointers = ex ;
dump . ThreadId = GetCurrentThreadId ( ) ;
dump . ClientPointers = TRUE ;
MiniDumpWriteDump ( GetCurrentProcess ( ) , GetCurrentProcessId ( ) , handle , MiniDumpWithFullMemory , & dump , NULL , NULL ) ;
FatalAppExit ( - 1 , L " TWAIN Error Exit " ) ;
return EXCEPTION_EXECUTE_HANDLER ;
}
2021-05-13 10:13:08 +00:00
static std : : once_flag oc ;
2020-03-11 01:58:06 +00:00
HuagaoDs : : HuagaoDs ( )
2020-06-20 03:01:35 +00:00
: m_scanparam ( new GScanCap )
2021-06-28 03:58:54 +00:00
, bmpData ( new std : : vector < unsigned char > )
2020-06-20 03:01:35 +00:00
, hMutex ( NULL )
2020-03-11 01:58:06 +00:00
{
2022-05-24 12:05:47 +00:00
std : : call_once ( oc , [ & ] ( ) {
log4cplus : : Initializer ( ) ;
SetUnhandledExceptionFilter ( callback ) ;
//void* addr = (void*)GetProcAddress(LoadLibrary(L"kernel32.dll"), "SetUnhandledExceptionFilter"); //<2F> <> д<EFBFBD> <D0B4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> SetUnhandledExceptionFilter<65> <72> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ַ<EFBFBD> <D6B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ô˺<C3B4> <CBBA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʧЧ
//if (addr)
//{
// uchar code[16];
// memset(code, 0, 16);
// int size = 0;
// code[size++] = 0x33;
// code[size++] = 0xc0;
// code[size++] = 0xc2;
// code[size++] = 0x04;
// code[size++] = 0x00;
// DWORD dwoldflag, dwtempflag;
// VirtualProtect(addr, size, PAGE_READWRITE, &dwoldflag);
// WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
// VirtualProtect(addr, size, dwoldflag, &dwtempflag);
//}
} ) ;
2021-05-13 10:13:08 +00:00
//log4cplus::Initializer();
//log4cplus::deinitialize();
2020-06-20 03:01:35 +00:00
/*string ss1= getOSInfo();
string ss2 = getManufactureID ( ) ;
string ss3 = getCpuType ( ) ;
string ss4 = getMemoryInfo ( ) ;
DWORD dwNum ;
CString aas [ 10 ] ;
GetDiskInfo ( dwNum , aas ) ; */
2021-01-22 07:37:46 +00:00
//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;
2021-11-20 06:24:33 +00:00
// MessageBox(NULL, L"<22> ڴ治<DAB4> <E6B2BB> ", L"<22> <> ʾ ", MB_OK| MB_SYSTEMMODAL);
2021-01-22 07:37:46 +00:00
//}));
2020-03-11 01:58:06 +00:00
}
2021-06-21 11:38:36 +00:00
void HuagaoDs : : showmsg ( std : : string caption , std : : string text , int retcode )
2021-05-13 10:13:08 +00:00
{
if ( scanner . get ( ) ) {
2021-12-16 08:21:35 +00:00
2022-05-24 12:05:47 +00:00
int num = scanner - > get_imgnReaded ( ) * ( 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 ) ;
2021-11-20 03:09:04 +00:00
int imgread = scanner - > get_imgnReaded ( ) ;
IScanner * ptr = scanner . get ( ) ;
if ( typeid ( * ptr ) = = typeid ( GScanO1003399 ) )
{
//readnum = readnum / 2 * (m_scanparam->en_fold ? 2 : 1);
2022-05-24 12:05:47 +00:00
num = scanner - > get_imgnReaded ( ) * ( m_scanparam - > multi_output_red ? 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 ) ;
2021-12-16 08:21:35 +00:00
if ( ! m_scanparam - > en_fold )
2021-11-20 03:09:04 +00:00
imgread / = 2 ;
}
2022-02-14 02:30:19 +00:00
if ( retcode = = 200 )
{
if ( ! ( m_scanparam - > is_autodiscradblank_normal | | m_scanparam - > is_autodiscradblank_vince ) )
{
text + = " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʵ<EFBFBD> ʹ <EFBFBD> ֽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> \n ɨ<EFBFBD> <EFBFBD> ͳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ<EFBFBD> <EFBFBD> \n <EFBFBD> <EFBFBD> ֽ<EFBFBD> <EFBFBD> <EFBFBD> ţ<EFBFBD> --\n ɨ<EFBFBD> 裨<EFBFBD> ţ<EFBFBD> " + to_string ( imgread ) + " \n ɨ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ţ<EFBFBD> -- \n <EFBFBD> ϴ<EFBFBD> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <EFBFBD> "
+ to_string ( scanner - > get_imgTransfered ( ) ) + " \n <EFBFBD> ϴ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <EFBFBD> " + to_string ( num - scanner - > get_imgTransfered ( ) ) ;
scanner - > set_lose_image_num ( 0 ) ;
}
}
else
2021-06-28 03:58:54 +00:00
{
2022-02-14 02:30:19 +00:00
if ( ! ( m_scanparam - > is_autodiscradblank_normal | | m_scanparam - > is_autodiscradblank_vince ) )
{
text + = " \n ɨ<EFBFBD> <EFBFBD> ͳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϣ<EFBFBD> <EFBFBD> \n <EFBFBD> <EFBFBD> ֽ<EFBFBD> <EFBFBD> <EFBFBD> ţ<EFBFBD> " + to_string ( scanner - > get_scannum ( ) ) +
" \n ɨ<EFBFBD> 裨<EFBFBD> ţ<EFBFBD> " + to_string ( imgread ) + " \n ɨ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ţ<EFBFBD> " + to_string ( scanner - > get_scannum ( ) - imgread ) +
" \n <EFBFBD> ϴ<EFBFBD> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <EFBFBD> " + to_string ( scanner - > get_imgTransfered ( ) ) + " \n <EFBFBD> ϴ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ҳ<EFBFBD> <EFBFBD> " + to_string ( num - scanner - > get_imgTransfered ( ) ) ;
scanner - > set_lose_image_num ( 0 ) ;
}
}
2021-05-13 10:13:08 +00:00
}
2022-05-24 12:05:47 +00:00
FileTools : : kill_process ( L " hidedlg.exe " ) ;
//system("taskkill /f /im hidedlg.exe");
2021-06-28 03:58:54 +00:00
ShellExecute ( NULL , TEXT ( " open " ) , GetHidedlgPath ( ) , CString ( ( text + " " + caption ) . c_str ( ) ) , NULL , SW_HIDE ) ;
2021-05-13 10:13:08 +00:00
}
2021-01-22 07:37:46 +00:00
2021-11-20 03:09:04 +00:00
void HuagaoDs : : hgmsg ( CString str )
{
ShellExecute ( NULL , TEXT ( " open " ) , GetHidedlgPath ( ) , str , NULL , SW_HIDE ) ;
}
2020-03-11 01:58:06 +00:00
HuagaoDs : : ~ HuagaoDs ( )
{
2021-06-28 03:58:54 +00:00
if ( memoryinfo . get ( ) ) {
2021-01-22 07:37:46 +00:00
m_memoryfalg = false ;
if ( memoryinfo - > joinable ( ) )
memoryinfo - > join ( ) ;
}
2021-06-28 03:58:54 +00:00
if ( scanner . get ( ) )
2020-07-20 02:29:10 +00:00
scanner . reset ( ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
const Identity & HuagaoDs : : defaultIdentity ( ) noexcept {
2020-06-20 03:01:35 +00:00
// remember, we return a reference, therefore the identity must not be placed on the stack of this method
return srcIdent ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : call ( const Identity & origin , DataGroup dg , Dat dat , Msg msg , void * data ) {
2020-06-20 03:01:35 +00:00
try {
// we can override almost anything from SourceFromThis, even the top-most source instance call
2020-12-09 08:02:51 +00:00
//FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg)));
2020-06-20 03:01:35 +00:00
return Base : : call ( origin , dg , dat , msg , data ) ;
}
2021-05-13 10:13:08 +00:00
catch ( const CapabilityException & e ) {
2021-06-28 03:58:54 +00:00
FileTools : : writelog ( log_ERROR , e . what ( ) ) ;
2020-06-20 03:01:35 +00:00
return badValue ( ) ;
}
2020-03-11 01:58:06 +00:00
}
2020-07-26 09:07:40 +00:00
Result HuagaoDs : : customDataGet ( const Twpp : : Identity & origin , Twpp : : CustomData & data )
{
2021-11-20 06:24:33 +00:00
//<2F> ӱ<EFBFBD> <D3B1> <EFBFBD> Ĭ<EFBFBD> <C4AC> <EFBFBD> <EFBFBD> <EFBFBD> õ<EFBFBD> <C3B5> ļ<EFBFBD> ·<EFBFBD> <C2B7> <EFBFBD> <EFBFBD> ȡ<EFBFBD> ֽ<EFBFBD> <D6BD> <EFBFBD> <EFBFBD> ϴ<EFBFBD>
2020-07-26 09:07:40 +00:00
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 < unsigned char > ( ) ;
memcpy ( pdata . data ( ) , buf . c_str ( ) , t ) ;
return success ( ) ;
}
Result HuagaoDs : : customDataSet ( const Twpp : : Identity & origin , Twpp : : CustomData & data )
{
GScanCap sc ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> ֽ<EFBFBD> <D6BD> <EFBFBD> תGscanCaps
2020-07-26 09:07:40 +00:00
GscanJsonConfig js ;
std : : string str ;
str . resize ( data . size ( ) ) ;
auto pdata = data . lock < unsigned char > ( ) ;
memcpy ( ( void * ) str . c_str ( ) , pdata , data . size ( ) ) ;
2021-01-22 07:37:46 +00:00
//vector<GScanCap> vc = js.parseJsonFromString(str);
//m_scanparam.reset(new GScanCap(vc[0]));
2021-05-19 10:58:07 +00:00
//std::unique_ptr<GScanCap> cap(new GScanCap(js.JsonToGscancap(json::parse(str))));
m_scanparam . reset ( new GScanCap ( js . JsonToGscancap ( json : : parse ( str ) ) ) ) ;
2020-07-26 09:07:40 +00:00
return success ( ) ;
}
2020-03-11 01:58:06 +00:00
// some helper functions to handle capability stuff
template < typename T >
2020-05-16 01:59:44 +00:00
static Result oneValGet ( Msg msg , Capability & data , const T & value ) {
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
case Msg : : GetDefault :
data = Capability : : createOneValue ( data . type ( ) , value ) ;
return { } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
2020-03-11 01:58:06 +00:00
}
static Result oneValGetString ( Msg msg , Capability & data , std : : string value ) {
2020-06-20 03:01:35 +00:00
Str255 str ;
str . setData ( value . c_str ( ) , value . size ( ) ) ;
return oneValGet ( msg , data , str ) ;
2020-03-11 01:58:06 +00:00
}
template < typename T >
2020-05-16 01:59:44 +00:00
static Result enmGet ( Msg msg , Capability & data , const T & value ) {
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
data = Capability : : createEnumeration ( data . type ( ) , { value } ) ;
return { } ;
case Msg : : GetCurrent :
case Msg : : GetDefault :
data = Capability : : createOneValue ( data . type ( ) , value ) ;
return { } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
2020-03-11 01:58:06 +00:00
}
template < typename T >
2020-05-16 01:59:44 +00:00
static Result oneValGetSet ( Msg msg , Capability & data , T & value , const T & def ) {
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Reset :
value = def ;
// fallthrough
case Msg : : Get :
case Msg : : GetCurrent :
data = Capability : : createOneValue ( data . type ( ) , value ) ;
return { } ;
case Msg : : GetDefault :
data = Capability : : createOneValue ( data . type ( ) , def ) ;
return { } ;
case Msg : : Set :
value = data . currentItem < T > ( ) ;
return { } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
2020-03-11 01:58:06 +00:00
}
template < typename T >
2020-05-16 01:59:44 +00:00
static Result oneValGetSetConst ( Msg msg , Capability & data , const T & def ) {
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
case Msg : : GetDefault :
case Msg : : Reset :
data = Capability : : createOneValue ( data . type ( ) , def ) ;
return { } ;
case Msg : : Set :
return data . currentItem < T > ( ) = = def ?
Result ( ) : Result ( ReturnCode : : Failure , ConditionCode : : BadValue ) ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
2020-03-11 01:58:06 +00:00
}
template < typename T >
2020-05-16 01:59:44 +00:00
static Result enmGetSetConst ( Msg msg , Capability & data , const T & def ) {
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
data = Capability : : createEnumeration ( data . type ( ) , { def } ) ;
return { } ;
case Msg : : GetCurrent :
case Msg : : GetDefault :
case Msg : : Reset :
data = Capability : : createOneValue ( data . type ( ) , def ) ;
return { } ;
case Msg : : Set :
return data . currentItem < T > ( ) = = def ?
Result ( ) : Result ( ReturnCode : : Failure , ConditionCode : : BadValue ) ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
2020-03-11 01:58:06 +00:00
}
/// Shortcut for Result(RC::Failure, CC::CheckDeviceOnline).
static constexpr Result checkDeviceOnline ( ) noexcept {
2020-06-20 03:01:35 +00:00
return { ReturnCode : : Failure , ConditionCode : : CheckDeviceOnline } ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capCommon ( const Identity & , Msg msg , Capability & data ) {
2020-06-20 03:01:35 +00:00
auto it = m_caps . find ( data . type ( ) ) ;
if ( it ! = m_caps . end ( ) ) {
return ( it - > second ) ( msg , data ) ;
}
2020-03-11 01:58:06 +00:00
2020-06-20 03:01:35 +00:00
return capUnsupported ( ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilityGet ( const Identity & origin , Capability & data ) {
2020-06-20 03:01:35 +00:00
return capCommon ( origin , Msg : : Get , data ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilityGetCurrent ( const Identity & origin , Capability & data ) {
2020-06-20 03:01:35 +00:00
return capCommon ( origin , Msg : : GetCurrent , data ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilityGetDefault ( const Identity & origin , Capability & data ) {
2020-06-20 03:01:35 +00:00
return capCommon ( origin , Msg : : GetDefault , data ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilityQuerySupport ( const Identity & , Capability & data ) {
2020-06-20 03:01:35 +00:00
auto it = m_query . find ( data . type ( ) ) ;
MsgSupport sup = it ! = m_query . end ( ) ? it - > second : msgSupportEmpty ;
data = Capability : : createOneValue ( data . type ( ) , sup ) ;
return success ( ) ;
2020-03-11 01:58:06 +00:00
}
2020-12-25 10:37:13 +00:00
template < typename T , Twpp : : CapType cap >
Result CapSupGetAll ( Msg msg , Capability & data , std : : initializer_list < T > values , T & currvalue , T defaultvalue , UInt32 currindex , UInt32 defaultindex ) {
switch ( msg ) {
case Msg : : Get :
data = Capability : : createEnumeration < cap > ( ( T2 ) values , currindex , defaultindex ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
2021-06-28 03:58:54 +00:00
case Msg : : GetCurrent :
case Msg : : GetDefault :
2020-12-25 10:37:13 +00:00
data = Capability : : createOneValue ( values [ defaultindex ] ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
template < typename T1 , typename T2 , Twpp : : CapType cap >
Result CapSupGetAll ( Msg msg , Capability & data , T1 & currvalue , T2 defaultvalue ) {
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
case Msg : : GetDefault :
data = Capability : : createOneValue < cap > ( ( T2 ) defaultvalue ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
template < typename T , Twpp : : CapType cap >
Result CapSupGetAllEx ( Msg msg , Capability & data , T & currvalue , T defaultvalue ) {
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
case Msg : : GetDefault :
data = Capability : : createOneValue < T > ( cap , defaultvalue ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
template < typename T1 , typename T2 , Twpp : : CapType cap >
Result CapSupGetAllReset ( Msg msg , Capability & data , std : : initializer_list < T2 > values , T1 & currvalue , T2 defaultvalue , UInt32 currindex , UInt32 defaultindex ) {
switch ( msg ) {
case Msg : : Get :
data = Capability : : createEnumeration < cap > ( values , currindex , defaultindex ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : GetCurrent :
data = Capability : : createOneValue < cap > ( ( T2 ) currvalue ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : Reset :
case Msg : : GetDefault :
currvalue = ( T1 ) defaultvalue ;
data = Capability : : createOneValue < cap > ( defaultvalue ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
2021-06-28 03:58:54 +00:00
template < typename T1 , typename T2 , Twpp : : CapType cap >
2020-12-25 10:37:13 +00:00
Result CapSupGetAllReset ( Msg msg , Capability & data , T1 & currvalue , T2 defaultvalue ) {
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
data = Capability : : createOneValue < cap > ( ( T2 ) currvalue ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : Reset :
case Msg : : GetDefault :
currvalue = ( T1 ) defaultvalue ;
data = Capability : : createOneValue < cap > ( defaultvalue ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
template < typename T1 , typename T2 , Twpp : : CapType cap >
Result CapSupGetAllResetEx ( Msg msg , Capability & data , std : : initializer_list < T2 > values , T1 & currvalue , T2 defaultvalue , UInt32 currindex , UInt32 defaultindex ) {
switch ( msg ) {
case Msg : : Get :
data = Capability : : createEnumeration < T2 > ( cap , values , currindex , defaultindex ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : GetCurrent :
2021-06-28 03:58:54 +00:00
data = Capability : : createOneValue < T2 > ( cap , ( T2 ) currvalue ) ;
2020-12-25 10:37:13 +00:00
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : Reset :
case Msg : : GetDefault :
currvalue = ( T1 ) defaultvalue ;
2021-06-28 03:58:54 +00:00
data = Capability : : createOneValue < T2 > ( cap , defaultvalue ) ;
2020-12-25 10:37:13 +00:00
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
template < typename T1 , typename T2 , Twpp : : CapType cap >
Result CapSupGetAllResetEx ( Msg msg , Capability & data , T1 & currvalue , T2 defaultvalue ) {
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
2021-06-28 03:58:54 +00:00
data = Capability : : createOneValue < T2 > ( cap , ( T2 ) currvalue ) ;
2020-12-25 10:37:13 +00:00
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : Reset :
case Msg : : GetDefault :
currvalue = ( T1 ) defaultvalue ;
2021-06-28 03:58:54 +00:00
data = Capability : : createOneValue < T2 > ( cap , defaultvalue ) ;
2020-12-25 10:37:13 +00:00
return { ReturnCode : : Success , ConditionCode : : Success } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilityReset ( const Identity & origin , Capability & data ) {
2020-06-20 03:01:35 +00:00
return capCommon ( origin , Msg : : Reset , data ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilityResetAll ( const Identity & origin ) {
2020-06-20 03:01:35 +00:00
for ( auto & pair : m_query ) {
if ( ( pair . second & MsgSupport : : Reset ) ! = msgSupportEmpty ) {
Capability dummyCap ( pair . first ) ;
capCommon ( origin , Msg : : Reset , dummyCap ) ;
}
}
return success ( ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : capabilitySet ( const Identity & origin , Capability & data ) {
2020-06-20 03:01:35 +00:00
return capCommon ( origin , Msg : : Set , data ) ;
2020-03-11 01:58:06 +00:00
}
2020-05-16 01:59:44 +00:00
Result HuagaoDs : : eventProcess ( const Identity & , Event & event ) {
2020-06-20 03:01:35 +00:00
// Qt needs to process its events, otherwise the GUI will appear frozen
// this is Windows-only method, Linux and macOS behave differently
2022-08-10 03:10:20 +00:00
//FileTools::writelog(log_ERROR, "eventProcess " + to_string((int)event.message()));
2020-06-20 03:01:35 +00:00
if ( guiTwain ) {
// // QApplication::processEvents(); - TODO: needs more investigation; results in freeze when attempting to scan using old DSM
// QApplication::sendPostedEvents();
2020-12-09 08:02:51 +00:00
//guiTwain->PostMessageW((UINT)(event.message()));
2020-06-20 03:01:35 +00:00
guiTwain - > SendMessage ( ( UINT ) ( event . message ( ) ) ) ;
}
2020-12-09 08:02:51 +00:00
//if (inState(DsState::XferReady))
// event.setMessage(Msg::XferReady);
//else
2021-06-28 03:58:54 +00:00
event . setMessage ( Msg : : Null ) ;
2020-06-20 03:01:35 +00:00
return { ReturnCode : : NotDsEvent , ConditionCode : : Success } ;
2020-05-16 01:59:44 +00:00
}
2020-08-15 08:42:43 +00:00
2020-08-31 07:44:24 +00:00
Twpp : : Result HuagaoDs : : deviceEventGet ( const Twpp : : Identity & origin , Twpp : : DeviceEvent & data )
{
if ( devEvent . size ( ) > 0 )
{
data = devEvent . front ( ) ;
devEvent . pop ( ) ;
return success ( ) ;
}
return seqError ( ) ;
}
2021-11-20 06:24:33 +00:00
//add------------------<2D> <> <EFBFBD> <EFBFBD> jpgͼ<67> <CDBC> dpi---------------------------
2020-05-16 01:59:44 +00:00
void HuagaoDs : : SetResoluton ( const char * path , int resolution )
{
2020-06-20 03:01:35 +00:00
FILE * file = fopen ( path , " rb+ " ) ;
if ( ! file )
return ;
2021-11-20 06:24:33 +00:00
//<2F> <> ȡ<EFBFBD> ļ<EFBFBD> <C4BC> <EFBFBD> С
2020-06-20 03:01:35 +00:00
int len = _filelength ( _fileno ( file ) ) ;
char * buf = new char [ len ] ;
fread ( buf , sizeof ( char ) , len , file ) ;
char * pResolution = ( char * ) & resolution ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> ʹ <EFBFBD> <CAB9> ͼƬ<CDBC> ܶȵ<DCB6> λ
2020-06-20 03:01:35 +00:00
buf [ 0x0D ] = 1 ;
2021-11-20 06:24:33 +00:00
//ˮƽ <CBAE> ܶȣ <DCB6> ˮƽ <CBAE> ֱ<EFBFBD> <D6B1> <EFBFBD>
2020-06-20 03:01:35 +00:00
buf [ 0x0E ] = pResolution [ 1 ] ;
buf [ 0x0F ] = pResolution [ 0 ] ;
2021-11-20 06:24:33 +00:00
//<2F> <> ֱ<EFBFBD> ܶȣ <DCB6> <C8A3> <EFBFBD> ֱ<EFBFBD> ֱ<EFBFBD> <D6B1> <EFBFBD>
2020-06-20 03:01:35 +00:00
buf [ 0x10 ] = pResolution [ 1 ] ;
buf [ 0x11 ] = pResolution [ 0 ] ;
fseek ( file , 0 , SEEK_SET ) ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> <D0B4> <EFBFBD> ļ<EFBFBD> <C4BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ԭʼ <D4AD> <CABC> <EFBFBD> ݣ<EFBFBD> <DDA3> <EFBFBD> <EFBFBD> <EFBFBD> <DEB8> <EFBFBD> Ч
2020-06-20 03:01:35 +00:00
fwrite ( buf , sizeof ( char ) , len , file ) ;
fclose ( file ) ;
2021-05-19 10:58:07 +00:00
delete [ ] buf ;
2020-03-11 01:58:06 +00:00
}
2021-07-19 10:36:34 +00:00
void HuagaoDs : : dogear_callback ( int indexpaper )
{
CString text ;
text . Format ( _T ( " 74 %d " ) , indexpaper ) ;
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), text, NULL, SW_HIDE);
2021-11-20 06:24:33 +00:00
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> <EFBFBD> " + to_string ( indexpaper ) + " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۽ǣ<EFBFBD> " ) ;
2021-07-19 10:36:34 +00:00
scanner - > Stop_scan ( ) ;
//scanner->reset();
scanner - > ResetScanner ( ) ;
onDeviceEvent ( DOG_EAR ) ;
}
2023-04-24 11:30:39 +00:00
Result HuagaoDs : : identityOpenDs ( const Identity & origin ) {
2022-05-24 12:05:47 +00:00
# ifdef G400
hMutex = CreateMutex ( NULL , FALSE , _T ( " LookitApp_4 " ) ) ;
# elif defined G300
hMutex = CreateMutex ( NULL , FALSE , _T ( " LookitApp_3 " ) ) ;
# elif defined ISG100
hMutex = CreateMutex ( NULL , FALSE , _T ( " LookitApp_1 " ) ) ;
# else
hMutex = CreateMutex ( NULL , FALSE , _T ( " LookitApp_2 " ) ) ;
# endif // G400
if ( GetLastError ( ) = = ERROR_ALREADY_EXISTS ) { //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> Ѿ<EFBFBD> <D1BE> <EFBFBD> <EFBFBD> <EFBFBD> ͬ<EFBFBD> <CDAC> <EFBFBD> <EFBFBD> Mutex<65> <78> <EFBFBD> õ<EFBFBD> <C3B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .
2021-04-06 01:31:21 +00:00
CloseHandle ( hMutex ) ;
hMutex = NULL ;
2021-05-13 10:13:08 +00:00
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("202"), NULL, SW_HIDE);
2021-11-20 06:24:33 +00:00
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , msgs [ ( UsbSupported ) 202 ] ) ;
2021-04-06 01:31:21 +00:00
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
2021-11-20 03:09:04 +00:00
Twain_config ( ) . GetOrSetPintfCapability ( is_printfcapability , true ) ;
2023-04-24 11:30:39 +00:00
2021-06-28 03:58:54 +00:00
auto usblist = UsbScan_List : : find_all_usb ( ) ;
2021-01-22 07:37:46 +00:00
if ( ! usblist . empty ( ) )
{
2021-04-06 01:31:21 +00:00
for each ( auto & usb in usblist )
2021-01-22 07:37:46 +00:00
{
2021-07-29 11:34:42 +00:00
for ( int x = 0 ; x < DeviceID . size ( ) ; x + + )
2021-04-06 01:31:21 +00:00
{
2021-07-29 11:34:42 +00:00
if ( DeviceID [ x ] . vid = = usb . vid & & DeviceID [ x ] . pid = = usb . pid )
{
vid = usb . vid ;
pid = usb . pid ;
if ( ! scanner . get ( ) ) {
2021-01-22 07:37:46 +00:00
# ifdef G200
2022-06-29 12:24:24 +00:00
if ( pid = = 0x139 | | pid = = 0x239 | | pid = = 0x8739 | | pid = = 0x8629 | | pid = = 0x130 | | pid = = 0x8000 | | pid = = 0x9000 | |
2023-04-24 11:30:39 +00:00
pid = = 0x138 | | pid = = 0x238 | | pid = = 0x2100 )
2021-07-29 11:34:42 +00:00
scanner . reset ( new GScanO1003399 ( ) ) ;
else
scanner . reset ( new GScanO200 ( ) ) ;
2021-11-20 03:09:04 +00:00
# else
2022-06-29 12:24:24 +00:00
2022-08-10 03:10:20 +00:00
if ( pid = = 0x339 | | pid = = 0x439 | | pid = = 0x7039 | | pid = = 0x8529 | | pid = = 0x8429 )
2022-05-24 12:05:47 +00:00
scanner . reset ( new GScanO1003399 ( ) ) ;
2022-08-10 03:10:20 +00:00
else {
2021-11-20 03:09:04 +00:00
# ifdef ANDROIDSERIAL
2022-11-28 07:43:46 +00:00
if ( pid = = 0x402 | | pid = = 0x302 | | pid = = 0x7002 )
2022-08-10 03:10:20 +00:00
scanner . reset ( new GScan439Android ( ) ) ;
else
scanner . reset ( new GScanO400Android ( ) ) ;
2021-04-06 01:31:21 +00:00
# else
2022-08-10 03:10:20 +00:00
scanner . reset ( new GScanO400 ( ) ) ;
2021-11-20 03:09:04 +00:00
# endif
2022-08-10 03:10:20 +00:00
}
2021-01-22 07:37:46 +00:00
# endif // G400
2021-07-29 11:34:42 +00:00
break ;
}
2021-01-22 07:37:46 +00:00
}
2021-07-29 11:34:42 +00:00
}
2021-01-22 07:37:46 +00:00
}
}
2021-07-11 08:19:57 +00:00
FileTools : : writelog ( log_INFO , " open ds find device vid= " + to_string ( vid ) + " \t pid= " + to_string ( pid ) ) ;
2021-02-03 10:21:45 +00:00
if ( vid = = 0 | | pid = = 0 )
{
2021-05-13 10:13:08 +00:00
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("201"), NULL, SW_HIDE);
2021-11-20 06:24:33 +00:00
//showmsg("<22> <> ʾ ", msgs[(UsbSupported)201]);
ShellExecute ( NULL , TEXT ( " open " ) , GetHidedlgPath ( ) , CString ( " δ<EFBFBD> ҵ<EFBFBD> ɨ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> !<21> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Դ<EFBFBD> <D4B4> <EFBFBD> <EFBFBD> USB<53> <42> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƿ<EFBFBD> <C7B7> <EFBFBD> ͨ! <20> <> ʾ " ) , NULL , SW_HIDE ) ;
2021-04-06 01:31:21 +00:00
if ( hMutex ) {
CloseHandle ( hMutex ) ;
hMutex = NULL ;
}
return checkDeviceOnline ( ) ;
2021-02-03 10:21:45 +00:00
}
2021-01-22 07:37:46 +00:00
scanner - > open ( vid , pid ) ;
2021-09-23 01:19:47 +00:00
if ( scanner - > get_ErrorCode ( ) = = SLEEPING ) {
if ( hMutex ) {
ReleaseMutex ( hMutex ) ;
CloseHandle ( hMutex ) ;
hMutex = NULL ;
}
return seqError ( ) ;
}
2020-06-20 03:01:35 +00:00
if ( ! scanner - > IsConnected ( ) ) {
2021-05-13 10:13:08 +00:00
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("201"), NULL, SW_HIDE);
2021-11-20 06:24:33 +00:00
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , msgs [ ( UsbSupported ) 201 ] ) ;
2021-04-06 01:31:21 +00:00
if ( hMutex ) {
CloseHandle ( hMutex ) ;
hMutex = NULL ;
}
2020-06-20 03:01:35 +00:00
return checkDeviceOnline ( ) ;
}
2020-08-31 07:44:24 +00:00
else
{
scanner - > regist_deviceevent_callback ( DeviceEvent_callback , this ) ;
2021-07-02 03:29:24 +00:00
auto dgcall = [ & ] ( int pagenum )
{
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), text, NULL, SW_HIDE);
2021-11-20 06:24:33 +00:00
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> <EFBFBD> " + to_string ( pagenum ) + " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۽ǣ<EFBFBD> " ) ;
2021-07-02 03:29:24 +00:00
scanner - > Stop_scan ( ) ;
//scanner->reset();
scanner - > ResetScanner ( ) ;
onDeviceEvent ( DOG_EAR ) ;
} ;
scanner - > DogEar_callback ( dgcall ) ;
2020-08-31 07:44:24 +00:00
}
2021-07-11 08:19:57 +00:00
m_haveError = false ;
updataGscanCap ( ) ;
bmpData - > resize ( sizeof ( BITMAPFILEHEADER ) + sizeof ( BITMAPINFOHEADER ) ) ;
BITMAPINFOHEADER & bmInfo = * ( ( BITMAPINFOHEADER * ) header ( ) ) ;
bmInfo . biHeight = 2000 ;
bmInfo . biWidth = 2000 ;
bmInfo . biBitCount = m_scanparam - > pixtype = = 2 ? 24 : ( m_scanparam - > pixtype = = 1 ? 8 : 1 ) ;
m_iBitdepth = m_scanparam - > pixtype = = 2 ? 24 : ( m_scanparam - > pixtype = = 1 ? 8 : 1 ) ;
2021-01-22 07:37:46 +00:00
//MessageBox(NULL, L"2", L"", 0);
2020-06-20 03:01:35 +00:00
// init caps
// there are caps a minimal source must support
// query -> says which operations a cap supports
// caps -> has handler for each specific cap
m_query [ CapType : : SupportedCaps ] = msgSupportGetAll ;
m_caps [ CapType : : SupportedCaps ] = [ this ] ( Msg msg , Capability & data ) {
2021-06-28 03:58:54 +00:00
if ( ( msg = = Msg : : Get ) | | ( Msg : : GetCurrent = = msg ) | | ( Msg : : GetDefault = = msg ) ) {
2020-06-20 03:01:35 +00:00
data = Capability : : createArray < CapType : : SupportedCaps > ( m_caps . size ( ) ) ;
auto arr = data . array < CapType : : SupportedCaps > ( ) ;
UInt32 i = 0 ;
for ( const auto & kv : m_caps ) {
arr [ i ] = kv . first ;
i + + ;
}
return success ( ) ;
}
2020-12-25 10:37:13 +00:00
else
2020-06-20 03:01:35 +00:00
return capBadOperation ( ) ;
} ;
m_query [ CapType : : UiControllable ] = msgSupportGetAll ;
2021-01-22 07:37:46 +00:00
m_caps [ CapType : : UiControllable ] = std : : bind ( oneValGet < Bool > , _1 , _2 , Bool ( true ) ) ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : DeviceOnline ] = msgSupportGetAll ;
2021-05-20 10:17:37 +00:00
//m_caps[CapType::DeviceOnline] = std::bind(enmGet<Bool>, _1, _2, Bool(scanner->IsConnected()));
m_caps [ CapType : : DeviceOnline ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : DeviceOnline ) ) ;
2021-05-20 10:17:37 +00:00
switch ( msg ) {
case Msg : : Get :
case Msg : : GetCurrent :
case Msg : : GetDefault :
data = Capability : : createOneValue < CapType : : DeviceOnline > ( ( Twpp : : Bool ) scanner - > IsConnected ( ) ) ;
return { } ;
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
} ;
2021-01-22 07:37:46 +00:00
2020-06-20 03:01:35 +00:00
m_query [ CapType : : XferCount ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : XferCount ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : XferCount ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Int16 > ( ) ) : " " ) ;
2020-06-20 03:01:35 +00:00
if ( msg = = Msg : : Set ) {
auto item = data . currentItem < Int16 > ( ) ;
2021-06-28 03:58:54 +00:00
if ( item > 65535 | | item < - 1 | | item = = 0 ) {
2020-06-20 03:01:35 +00:00
return badValue ( ) ;
}
2020-08-15 08:42:43 +00:00
m_scanparam - > scannum = item ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2020-08-15 08:42:43 +00:00
Int16 tmp_count = m_scanparam - > scannum ;
auto ret = oneValGetSet < Int16 > ( msg , data , tmp_count , - 1 ) ;
if ( ! Twpp : : success ( ret ) & & m_scanparam - > scannum = = 0 ) {
m_scanparam - > scannum = - 1 ;
2020-06-20 03:01:35 +00:00
return { ReturnCode : : CheckStatus , ConditionCode : : BadValue } ;
}
return ret ;
} ;
m_query [ CapType : : ICompression ] = msgSupportGetAllSetReset ;
2020-08-31 07:44:24 +00:00
//m_caps[CapType::ICompression] = std::bind(enmGetSetConst<Compression>, _1, _2, Compression::None);
2021-11-20 03:09:04 +00:00
m_caps [ CapType : : ICompression ] = [ this ] ( Msg msg , Capability & data ) - > Result {
CapabilityPrintf ( msg , enum2str ( CapType : : ICompression ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : ICompression > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : ICompression > ( ) ;
if ( Compression : : None = = mech | | mech = = Compression : : Group4 ) {
2022-05-24 12:05:47 +00:00
if ( mech = = Compression : : Group4 )
{
if ( m_scanparam - > pixtype ! = 0 )
return badValue ( ) ;
}
2020-06-20 03:01:35 +00:00
m_compression = mech ;
return success ( ) ;
}
2021-06-28 03:58:54 +00:00
else
2020-06-20 03:01:35 +00:00
return badValue ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < Compression , Compression , CapType : : ICompression > ( msg , data , { Compression : : None , Compression : : Group4 } , m_compression , Compression : : None , m_compression = = Compression : : None ? 0 : 1 , 0 ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IBitDepth ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IBitDepth ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IBitDepth ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IBitDepth > ( ) ) : " " ) ;
2021-06-28 03:58:54 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IBitDepth > ( ) ;
2021-06-28 03:58:54 +00:00
if ( ( ( mech = = 1 ) & & ( m_scanparam - > pixtype = = 0 ) ) | | ( ( mech = = 8 ) & & ( m_scanparam - > pixtype = = 1 ) ) | | ( ( mech = = 24 ) & & ( m_scanparam - > pixtype = = 2 ) ) ) {
2020-06-20 03:01:35 +00:00
m_iBitdepth = ( UINT16 ) mech ;
return success ( ) ;
2021-06-28 03:58:54 +00:00
}
2020-06-20 03:01:35 +00:00
return badValue ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < UINT16 , UINT16 , CapType : : IBitDepth > ( msg , data , m_iBitdepth , 24 ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IBitOrder ] = msgSupportGetAllSetReset ;
2021-01-22 07:37:46 +00:00
m_caps [ CapType : : IBitOrder ] = std : : bind ( oneValGetSetConst < BitOrder > , _1 , _2 , BitOrder : : MsbFirst ) ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IPlanarChunky ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IPlanarChunky ] = std : : bind ( enmGetSetConst < PlanarChunky > , _1 , _2 , PlanarChunky : : Chunky ) ;
m_query [ CapType : : IPhysicalWidth ] = msgSupportGetAll ;
2020-08-15 08:42:43 +00:00
m_caps [ CapType : : IPhysicalWidth ] = std : : bind ( oneValGet < Fix32 > , _1 , _2 , Fix32 ( static_cast < float > ( header ( ) - > biWidth ) / m_scanparam - > resolution_dst ) ) ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IPhysicalHeight ] = msgSupportGetAll ;
2020-08-15 08:42:43 +00:00
m_caps [ CapType : : IPhysicalHeight ] = std : : bind ( oneValGet < Fix32 > , _1 , _2 , Fix32 ( static_cast < float > ( header ( ) - > biHeight ) / m_scanparam - > resolution_dst ) ) ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IPixelFlavor ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IPixelFlavor ] = std : : bind ( enmGetSetConst < PixelFlavor > , _1 , _2 , PixelFlavor : : Chocolate ) ;
m_query [ CapType : : IPixelType ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IPixelType ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IPixelType ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IPixelType > ( ) ) : " " ) ;
2021-07-19 10:36:34 +00:00
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < CapType : : IPixelType > ( ) ;
if ( mech = = PixelType : : Rgb | | mech = = PixelType : : Gray | | mech = = PixelType : : BlackWhite )
{
2021-11-20 03:09:04 +00:00
m_scanparam - > automaticcolor = FALSE ;
2021-07-19 10:36:34 +00:00
m_scanparam - > pixtype = ( int ) mech ;
if ( m_scanparam - > pixtype = = ( int ) PixelType : : Rgb ) {
m_scanparam - > filter = ( BYTE ) Filter : : None ;
2021-11-20 03:09:04 +00:00
m_scanparam - > enhance_color = ( BYTE ) Enchace_Color : : Enhance_None ;
2020-12-25 10:37:13 +00:00
}
2021-07-19 10:36:34 +00:00
else {
2021-11-20 06:24:33 +00:00
m_scanparam - > multi_output_red = 0 ; //<2F> Dz<EFBFBD> ɫģʽ <C4A3> ¶<EFBFBD> <C2B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2022-02-14 02:30:19 +00:00
m_scanparam - > detachnoise . is_detachnoise = false ;
m_scanparam - > fadeback = false ;
2022-11-15 03:55:44 +00:00
m_scanparam - > hsvFilter = 0 ;
m_scanparam - > hsvcorrect = 0 ;
2022-05-24 12:05:47 +00:00
//if (mech == PixelType::BlackWhite)
//{
// if (m_scanparam->filter == (uint8)Filter::None && m_scanparam->enhance_color == Enchace_Color::Enhance_None)
// {
// m_scanparam->enhance_color = 1;
// }
//}
2021-07-19 10:36:34 +00:00
}
m_iBitdepth = mech = = PixelType : : Rgb ? 24 : ( mech = = PixelType : : Gray ? 8 : 1 ) ;
return success ( ) ;
}
return badValue ( ) ;
2020-06-20 03:01:35 +00:00
}
2021-06-28 03:58:54 +00:00
return CapSupGetAllReset < int , PixelType , CapType : : IPixelType > ( msg , data , { PixelType : : BlackWhite , PixelType : : Gray , PixelType : : Rgb } , m_scanparam - > pixtype , PixelType : : Rgb ,
m_scanparam - > pixtype = = ( int ) PixelType : : Rgb ? 2 : ( m_scanparam - > pixtype = = ( int ) PixelType : : Gray ? 1 : 0 ) , 2 ) ;
2020-06-20 03:01:35 +00:00
} ;
2020-12-17 09:02:33 +00:00
m_query [ CapType : : IAutomaticColorEnabled ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IAutomaticColorEnabled ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutomaticColorEnabled ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutomaticColorEnabled > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-12-17 09:02:33 +00:00
auto mech = data . currentItem < CapType : : IAutomaticColorEnabled > ( ) ;
2021-06-28 03:58:54 +00:00
if ( mech ) {
2020-12-17 09:02:33 +00:00
m_scanparam - > automaticcolor = TRUE ;
2021-04-13 09:30:05 +00:00
m_scanparam - > filter = ( BYTE ) Filter : : None ;
m_scanparam - > enhance_color = ( BYTE ) Enchace_Color : : Enhance_None ;
2020-12-17 09:02:33 +00:00
m_scanparam - > pixtype = ( int ) PixelType : : Rgb ;
}
else
m_scanparam - > automaticcolor = FALSE ;
2020-12-25 10:37:13 +00:00
m_iBitdepth = m_scanparam - > pixtype = = int ( PixelType : : Rgb ) ? 24 : ( m_scanparam - > pixtype = = int ( PixelType : : Gray ) ? 8 : 1 ) ;
2020-12-17 09:02:33 +00:00
return success ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < int , Bool , CapType : : IAutomaticColorEnabled > ( msg , data , { FALSE , TRUE } , m_scanparam - > automaticcolor , false , m_scanparam - > automaticcolor ? 1 : 0 , 0 ) ;
2020-12-17 09:02:33 +00:00
} ;
m_query [ CapType : : IAutomaticColorNonColorPixelType ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IAutomaticColorNonColorPixelType ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutomaticColorNonColorPixelType ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutomaticColorNonColorPixelType > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( msg = = Msg : : Set ) {
2020-12-17 09:02:33 +00:00
auto mech = data . currentItem < CapType : : IAutomaticColorNonColorPixelType > ( ) ;
2021-06-28 03:58:54 +00:00
if ( m_scanparam - > automaticcolor = = TRUE ) {
if ( ( UInt16 ) mech = = 0 | | ( UInt16 ) mech = = 1 ) {
2020-12-17 09:02:33 +00:00
m_scanparam - > automaticcolortype = ( UInt16 ) mech ;
return success ( ) ;
}
2021-06-28 03:58:54 +00:00
}
2020-12-17 09:02:33 +00:00
return seqError ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < int , PixelType , CapType : : IAutomaticColorNonColorPixelType > ( msg , data , { PixelType : : BlackWhite , PixelType : : Gray } , m_scanparam - > automaticcolortype , PixelType : : Gray , m_scanparam - > automaticcolortype , 1 ) ;
2020-12-17 09:02:33 +00:00
} ;
2021-11-20 06:24:33 +00:00
//add------------------jpeg<65> <67> <EFBFBD> <EFBFBD> <EFBFBD> ȼ<EFBFBD> ---------------------
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IJpegQuality ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IJpegQuality ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IJpegQuality ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IJpegQuality > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IJpegQuality > ( ) ;
2022-05-24 12:05:47 +00:00
if ( ( int ) mech < 0 | | ( int ) mech > 100 )
2020-08-31 07:44:24 +00:00
return badValue ( ) ;
2020-06-20 03:01:35 +00:00
m_jpegQuality = ( int ) mech ;
return success ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllResetEx < unsigned short , UInt16 , CapType : : IJpegQuality > ( msg , data , m_jpegQuality , 80 ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IUnits ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IUnits ] = std : : bind ( enmGetSetConst < Unit > , _1 , _2 , Unit : : Inches ) ;
m_query [ CapType : : IXferMech ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IXferMech ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IXferMech ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IXferMech > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IXferMech > ( ) ;
if ( mech = = XferMech : : Native | | mech = = XferMech : : Memory | | mech = = XferMech : : File ) {
m_capXferMech = mech ;
return success ( ) ;
}
else {
return badValue ( ) ;
}
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < XferMech , XferMech , CapType : : IXferMech > ( msg , data , { XferMech : : Native , XferMech : : File , XferMech : : Memory } , m_capXferMech , XferMech : : Native , ( int ) m_capXferMech , 0 ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IXResolution ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IXResolution ] = [ this ] ( Msg msg , Capability & data ) {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IXResolution ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < CapType : : IXResolution > ( ) ) : " " ) ;
2021-02-03 10:21:45 +00:00
switch ( msg ) {
case Msg : : Get :
2021-09-23 01:19:47 +00:00
data = Capability : : createRange < CapType : : IXResolution > ( Fix32 ( 100.0f ) , Fix32 ( 600.0f ) , Fix32 ( 1.0f ) , Fix32 ( m_scanparam - > resolution_dst ) , Fix32 ( 200.0 ) ) ;
2021-02-03 10:21:45 +00:00
return success ( ) ;
case Msg : : GetCurrent :
data = Capability : : createOneValue < CapType : : IXResolution > ( Fix32 ( m_scanparam - > resolution_dst ) ) ;
return success ( ) ;
case Msg : : GetDefault :
case Msg : : Reset :
m_scanparam - > resolution_dst = 200.0f ;
data = Capability : : createOneValue < CapType : : IXResolution > ( Fix32 ( 200.0f ) ) ;
return success ( ) ;
case Msg : : Set : {
auto mech = data . currentItem < CapType : : IXResolution > ( ) ;
2021-09-23 01:19:47 +00:00
if ( mech < 100.0f | | mech > 600.0f )
2020-12-25 10:37:13 +00:00
return badValue ( ) ;
2021-02-03 10:21:45 +00:00
m_scanparam - > resolution_dst = ( float ) mech ;
return success ( ) ;
}
default :
return capBadOperation ( ) ;
2020-06-20 03:01:35 +00:00
}
} ;
m_query [ CapType : : IYResolution ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IYResolution ] = m_caps [ CapType : : IXResolution ] ;
m_query [ CapType : : IXNativeResolution ] = msgSupportGetAll ;
m_caps [ CapType : : IXNativeResolution ] = std : : bind ( enmGet < Fix32 > , _1 , _2 , Fix32 ( 200.0 ) ) ;
m_query [ CapType : : IYNativeResolution ] = msgSupportGetAll ;
m_caps [ CapType : : IYNativeResolution ] = m_caps [ CapType : : IXNativeResolution ] ;
m_query [ CapType : : ISupportedSizes ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : ISupportedSizes ] = [ this ] ( Msg msg , Capability & data ) {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : ISupportedSizes ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < UInt16 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-11-20 03:09:04 +00:00
//if (m_scanparam->is_autocrop)
// return success();
2020-07-11 10:43:17 +00:00
auto paper = data . currentItem < UInt16 > ( ) ;
2020-12-25 10:37:13 +00:00
if ( std : : distance ( paperSizeList . begin ( ) , std : : find ( paperSizeList . begin ( ) , paperSizeList . end ( ) , paper ) ) = = paperSizeList . size ( ) )
return badValue ( ) ;
else {
2021-04-13 09:30:05 +00:00
m_scanparam - > papertype = ( BYTE ) paper ;
2021-06-28 03:58:54 +00:00
if ( paper = = ( BYTE ) PaperSize : : None | | paper = = ( BYTE ) PaperSize : : UsStatement ) {
2020-07-07 01:54:19 +00:00
m_scanparam - > paperAlign = PaperAlign : : Rot0 ;
2020-12-10 02:01:22 +00:00
m_scanparam - > en_sizecheck = 0 ;
2022-05-24 12:05:47 +00:00
m_scanparam - > en_fixedpaper = 0 ;
2020-12-10 02:01:22 +00:00
}
2021-06-28 03:58:54 +00:00
if ( paper = = ( BYTE ) PaperSize : : UsStatement ) {
2020-11-12 11:42:16 +00:00
m_autosize = ( UInt16 ) AutoSize : : None ;
m_autoboarderdetcet = false ;
m_scanparam - > is_autocrop = 0 ;
}
2021-06-28 03:58:54 +00:00
else {
2021-04-13 09:30:05 +00:00
m_autosize = ( paper = = ( BYTE ) PaperSize : : None ) ? ( UInt16 ) AutoSize : : Auto : ( UInt16 ) AutoSize : : None ;
m_autoboarderdetcet = paper = = ( BYTE ) PaperSize : : None ;
m_scanparam - > is_autocrop = paper = = ( BYTE ) PaperSize : : None ? 1 : 0 ;
2020-11-12 11:42:16 +00:00
}
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
}
2021-04-13 09:30:05 +00:00
return CapSupGetAllReset < BYTE , PaperSize , CapType : : ISupportedSizes > ( msg , data , { PaperSize : : A4 , PaperSize : : A5 , PaperSize : : A6 ,
2020-12-25 10:37:13 +00:00
PaperSize : : IsoB5 , PaperSize : : IsoB6 , PaperSize : : UsLetter ,
2021-04-06 01:31:21 +00:00
PaperSize : : UsLegal , PaperSize : : None , ( PaperSize ) PaperSizeEx : : K16
2020-12-25 10:37:13 +00:00
# ifndef G300
# if defined G200
, PaperSize : : A3 , PaperSize : : UsLedger , PaperSize : : IsoB4 ,
2021-05-19 10:58:07 +00:00
PaperSize : : MaxSize , PaperSize : : UsStatement , ( PaperSize ) PaperSizeEx : : K8 , ( PaperSize ) PaperSizeEx : : K16 , ( PaperSize ) PaperSizeEx : : Trigeminy
2020-12-25 10:37:13 +00:00
# elif defined G400
2021-04-06 01:31:21 +00:00
, PaperSize : : A3 , PaperSize : : UsLedger , PaperSize : : IsoB4 , PaperSize : : MaxSize , PaperSize : : UsStatement ,
2021-05-19 10:58:07 +00:00
( PaperSize ) PaperSizeEx : : K8 , ( PaperSize ) PaperSizeEx : : K16 , ( PaperSize ) PaperSizeEx : : Trigeminy
2020-12-25 10:37:13 +00:00
# endif
# endif //
2021-06-28 03:58:54 +00:00
} , m_scanparam - > papertype , PaperSize : : None ,
2021-01-22 07:37:46 +00:00
std : : distance ( paperSizeList . begin ( ) , std : : find ( paperSizeList . begin ( ) , paperSizeList . end ( ) , m_scanparam - > papertype ) ) = = paperSizeList . size ( ) ? 0 : std : : distance ( paperSizeList . begin ( ) ,
2021-06-28 03:58:54 +00:00
std : : find ( paperSizeList . begin ( ) , paperSizeList . end ( ) , m_scanparam - > papertype ) ) ,
2021-04-06 01:31:21 +00:00
std : : distance ( paperSizeList . begin ( ) , std : : find ( paperSizeList . begin ( ) , paperSizeList . end ( ) , 0 ) ) ) ;
2020-06-20 03:01:35 +00:00
} ;
2020-12-10 02:01:22 +00:00
# ifdef G200
m_query [ ( CapType ) ( CapTypeEx : : TwEx_SizeDetect ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_SizeDetect ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_SizeDetect ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2021-06-28 03:58:54 +00:00
if ( Msg : : Set = = msg ) {
2020-12-10 02:01:22 +00:00
auto mech = data . currentItem < Bool > ( ) ;
2022-05-24 12:05:47 +00:00
if ( mech ) {
if ( m_scanparam - > papertype = = ( uint8_t ) PaperSize : : None | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : MaxSize | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : UsStatement | |
m_scanparam - > papertype = = ( uint8_t ) PaperSizeEx : : Trigeminy )
return badValue ( ) ;
}
2020-12-10 02:01:22 +00:00
m_scanparam - > en_sizecheck = mech ;
return success ( ) ;
}
2021-06-28 03:58:54 +00:00
return CapSupGetAllResetEx < BYTE , Bool , CapType ( CapTypeEx : : TwEx_SizeDetect ) > ( msg , data , { FALSE , TRUE } , m_scanparam - > en_sizecheck , false , m_scanparam - > en_sizecheck , 0 ) ;
2020-12-10 02:01:22 +00:00
} ;
2022-05-24 12:05:47 +00:00
//<2F> <> <EFBFBD> <EFBFBD> cis<69> ̼<EFBFBD> <CCBC> <EFBFBD> <EFBFBD> <EFBFBD> ɨ<EFBFBD> <C9A8>
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IFixedPaper ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IFixedPaper ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IFixedPaper ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Bool > ( ) ;
if ( mech ) {
if ( m_scanparam - > papertype = = ( uint8_t ) PaperSize : : None | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : MaxSize | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : UsStatement | |
m_scanparam - > papertype = = ( uint8_t ) PaperSizeEx : : Trigeminy )
return badValue ( ) ;
}
m_scanparam - > en_fixedpaper = mech ;
return success ( ) ;
}
return CapSupGetAllResetEx < bool , Bool , CapType ( CapTypeEx : : TwEx_IFixedPaper ) > ( msg , data , { false , true } , m_scanparam - > en_fixedpaper , false , m_scanparam - > en_fixedpaper , 0 ) ;
} ;
# endif // G200
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IOrientation ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IOrientation ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : IOrientation ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IOrientation > ( ) ) : " " ) ;
2021-06-28 03:58:54 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IOrientation > ( ) ;
2021-11-20 03:09:04 +00:00
if ( ( mech = = Orientation : : Landscape ) & & ( m_scanparam - > papertype = = ( uint8_t ) PaperSize : : None | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : MaxSize | |
m_scanparam - > papertype = = ( uint8_t ) PaperSize : : UsStatement | | m_scanparam - > papertype = = ( uint8_t ) PaperSizeEx : : Trigeminy | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : A3 | |
m_scanparam - > papertype = = ( uint8_t ) PaperSize : : IsoB4 | | m_scanparam - > papertype = = ( uint8_t ) PaperSizeEx : : K8 | | m_scanparam - > papertype = = ( uint8_t ) PaperSize : : UsLedger ) )
return badValue ( ) ;
2020-06-20 03:01:35 +00:00
if ( mech = = Orientation : : Landscape | | mech = = Orientation : : Portrait ) {
m_scanparam - > paperAlign = ( PaperAlign ) mech ;
return success ( ) ;
}
return badValue ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < PaperAlign , Orientation , CapType : : IOrientation > ( msg , data , { Orientation : : Portrait , Orientation : : Landscape } , m_scanparam - > paperAlign , Orientation : : Portrait , m_scanparam - > paperAlign = = 0 ? 0 : 1 , 0 ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IRotation ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IRotation ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : IRotation ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Fix32 > ( ) ) : " " ) ;
2021-06-28 03:58:54 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto res = data . currentItem < Fix32 > ( ) ;
2020-12-25 10:37:13 +00:00
if ( std : : distance ( imageRotateList . begin ( ) , std : : find ( imageRotateList . begin ( ) , imageRotateList . end ( ) , res ) ) = = imageRotateList . size ( ) )
return badValue ( ) ;
2021-06-28 03:58:54 +00:00
else {
2020-06-20 03:01:35 +00:00
m_scanparam - > imageRotateDegree = ( float ) res ;
if ( res ! = 0.0f )
m_scanparam - > is_autotext = 0 ;
return success ( ) ;
}
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < float , Fix32 , CapType : : IRotation > ( msg , data , { Fix32 ( 0.0f ) , Fix32 ( 90.0f ) , Fix32 ( 180.0f ) , Fix32 ( 270.0f ) } , m_scanparam - > imageRotateDegree , Fix32 ( 0.0 ) ,
2021-06-28 03:58:54 +00:00
std : : distance ( imageRotateList . begin ( ) , std : : find ( imageRotateList . begin ( ) , imageRotateList . end ( ) , m_scanparam - > imageRotateDegree ) ) , 0 ) ;
2020-06-20 03:01:35 +00:00
} ;
2020-03-11 01:58:06 +00:00
2020-06-20 03:01:35 +00:00
# ifndef G200
2021-11-20 06:24:33 +00:00
scanner - > Get_Scanner_PaperOn ( ) ; //<2F> <> <EFBFBD> <EFBFBD> G300 G400 USBͨ<42> ŵ<EFBFBD> һ <EFBFBD> <D2BB> <EFBFBD> <EFBFBD> read_bulk <20> <EFBFBD> <F0B5BDBC> <EFBFBD> USB<53> <42> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2020-06-20 03:01:35 +00:00
# endif // !G200
m_query [ CapType : : SerialNumber ] = msgSupportGetAll ;
2020-09-21 01:25:46 +00:00
//m_caps[CapType::SerialNumber] = std::bind(oneValGetString, _1, _2, scanner->GetSerialNum());
m_caps [ CapType : : SerialNumber ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2020-12-25 10:37:13 +00:00
Str255 str ;
str . setData ( scanner - > GetSerialNum ( ) . c_str ( ) , scanner - > GetSerialNum ( ) . size ( ) ) ;
return CapSupGetAll < Str255 , Str255 , CapType : : SerialNumber > ( msg , data , str , str ) ;
2020-09-21 01:25:46 +00:00
} ;
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_HardwareVersion ) ] = msgSupportGetAll ;
2020-09-21 01:25:46 +00:00
//m_caps[(CapType)(CapTypeEx::TwEx_HardwareVersion)] = std::bind(oneValGetString, _1, _2, scanner->GetFWVersion());
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_HardwareVersion ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2020-12-25 10:37:13 +00:00
Str255 str ;
str . setData ( scanner - > GetFWVersion ( ) . c_str ( ) , scanner - > GetFWVersion ( ) . size ( ) ) ;
return CapSupGetAllEx < Str255 , ( CapType ) CapTypeEx : : TwEx_HardwareVersion > ( msg , data , str , str ) ;
2020-09-21 01:25:46 +00:00
} ;
2022-05-24 12:05:47 +00:00
2021-04-06 01:31:21 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_ENCODE ) ] = msgSupportGetAll ;
//m_caps[(CapType)(CapTypeEx::TwEx_HardwareVersion)] = std::bind(oneValGetString, _1, _2, scanner->GetFWVersion());
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_ENCODE ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
Str255 str ;
2021-06-28 03:58:54 +00:00
str . setData ( scanner - > get_scannercode ( ) . c_str ( ) , 32 ) ;
2021-04-06 01:31:21 +00:00
return CapSupGetAllEx < Str255 , ( CapType ) CapTypeEx : : TwEx_ENCODE > ( msg , data , str , str ) ;
} ;
2022-05-24 12:05:47 +00:00
2022-11-02 10:46:24 +00:00
m_query [ CapType ( CapTypeEx : : TwEx_SETTOKEN ) ] = MsgSupport : : Set ;
m_caps [ CapType ( CapTypeEx : : TwEx_SETTOKEN ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : SETTOKEN ) ) ;
2022-11-09 09:29:51 +00:00
if ( msg ! = Msg : : Set )
{
Str32 str ;
str . setData ( " This operation is not supported " , 32 ) ;
data = Capability : : createOneValue < Str32 > ( CapType ( CapTypeEx : : TwEx_SETTOKEN ) , str ) ;
return success ( ) ;
}
2022-11-02 10:46:24 +00:00
auto str = data . currentItem < Str32 > ( ) ;
if ( str . size ( ) ! = 32 )
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
2022-11-09 09:29:51 +00:00
//MessageBox(NULL, L"<22> ڴ治<DAB4> <E6B2BB> ", L"", MB_OK | MB_SYSTEMMODAL);
2022-11-02 10:46:24 +00:00
scanner - > set_token ( std : : string ( str . data ( ) ) ) ;
return success ( ) ;
//return CapSupGetAll<Bool, Bool, CapType::FeederLoaded>(msg, data, Bool(scanner->Get_Scanner_PaperOn()), Bool(scanner->Get_Scanner_PaperOn()));
} ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : FeederLoaded ] = msgSupportGetAll ;
2020-08-31 07:44:24 +00:00
m_caps [ CapType : : FeederLoaded ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : FeederLoaded ) ) ;
2020-12-25 10:37:13 +00:00
return CapSupGetAll < Bool , Bool , CapType : : FeederLoaded > ( msg , data , Bool ( scanner - > Get_Scanner_PaperOn ( ) ) , Bool ( scanner - > Get_Scanner_PaperOn ( ) ) ) ;
2020-08-31 07:44:24 +00:00
} ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : Indicators ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : Indicators ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : Indicators ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : Indicators > ( ) ) : " " ) ;
2021-06-28 03:58:54 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto show = data . currentItem < CapType : : Indicators > ( ) ;
m_bIndicator = show ;
return success ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < bool , Bool , CapType : : Indicators > ( msg , data , { FALSE , TRUE } , m_bIndicator , TRUE , m_bIndicator ? 1 : 0 , 1 ) ;
2020-07-26 09:07:40 +00:00
} ;
2020-06-20 03:01:35 +00:00
2020-07-26 09:07:40 +00:00
m_query [ CapType : : CustomDsData ] = msgSupportGetAll ;
m_caps [ CapType : : CustomDsData ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2020-12-25 10:37:13 +00:00
return CapSupGetAllEx < Bool , CapType : : CustomDsData > ( msg , data , Bool ( true ) , Bool ( true ) ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : EnableDsUiOnly ] = msgSupportGetAll ;
m_caps [ CapType : : EnableDsUiOnly ] = std : : bind ( enmGet < Bool > , _1 , _2 , Bool ( true ) ) ;
m_query [ CapType : : PaperDetectable ] = msgSupportGetAll ;
2021-01-22 07:37:46 +00:00
m_caps [ CapType : : PaperDetectable ] = std : : bind ( oneValGet < Bool > , _1 , _2 , Bool ( true ) ) ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : FeederEnabled ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : FeederEnabled ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : FeederEnabled ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : FeederEnabled > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : FeederEnabled > ( ) ;
m_bFeederEnabled = mech ;
return success ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < bool , Bool , CapType : : PaperDetectable > ( msg , data , m_bFeederEnabled , Bool ( true ) ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : Duplex ] = msgSupportGetAll ;
m_caps [ CapType : : Duplex ] = std : : bind ( oneValGet < Duplex > , _1 , _2 , Duplex : : OnePass ) ;
m_query [ CapType : : DuplexEnabled ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : DuplexEnabled ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : DuplexEnabled ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : DuplexEnabled > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-11-20 03:09:04 +00:00
bool mech = data . currentItem < CapType : : DuplexEnabled > ( ) ;
2020-06-20 03:01:35 +00:00
m_scanparam - > is_duplex = mech ;
2021-11-20 03:09:04 +00:00
if ( ! mech ) {
2021-11-20 06:24:33 +00:00
m_scanparam - > is_backrotate180 = 0 ; //<2F> <> <EFBFBD> 汳<EFBFBD> <E6B1B3> <EFBFBD> <EFBFBD> ת180<38> 㲻<EFBFBD> <E3B2BB> <EFBFBD> <EFBFBD>
2021-11-20 03:09:04 +00:00
m_scanparam - > is_switchfrontback = 0 ;
2021-02-03 10:21:45 +00:00
m_scanparam - > is_autodiscradblank_normal = m_scanparam - > is_autodiscradblank_vince = m_scanparam - > en_fold = 0 ;
2021-11-20 03:09:04 +00:00
}
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2021-04-13 09:30:05 +00:00
return CapSupGetAllReset < BYTE , Bool , CapType : : DuplexEnabled > ( msg , data , m_scanparam - > is_duplex , Bool ( true ) ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : AutoFeed ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : AutoFeed ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : AutoFeed ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : AutoFeed > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : AutoFeed > ( ) ;
m_bAutoFeed = mech ;
return success ( ) ;
}
2021-01-22 07:37:46 +00:00
return CapSupGetAllReset < bool , Bool , CapType : : AutoFeed > ( msg , data , { false , true } , m_bAutoFeed , true , m_bAutoFeed ? 1 : 0 , 1 ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IImageFileFormat ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IImageFileFormat ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IImageFileFormat ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IImageFileFormat > ( ) ) : " " ) ;
2021-06-28 03:58:54 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IImageFileFormat > ( ) ;
if ( mech = = ImageFileFormat : : Bmp | |
mech = = ImageFileFormat : : Tiff | |
mech = = ImageFileFormat : : Jfif ) {
m_capImageFileFormat = mech ;
return success ( ) ;
}
else
return badValue ( ) ;
}
2021-06-28 03:58:54 +00:00
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 ) ;
2020-06-20 03:01:35 +00:00
} ;
//custom define
m_query [ CapType : : IAutomaticDeskew ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IAutomaticDeskew ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutomaticDeskew ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutomaticDeskew > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto atuodsw = data . currentItem < CapType : : IAutomaticDeskew > ( ) ;
m_scanparam - > autodescrew = ( bool ) atuodsw ;
return success ( ) ;
}
2021-06-28 03:58:54 +00:00
return CapSupGetAllReset < BYTE , bool , CapType : : IAutomaticDeskew > ( msg , data , m_scanparam - > autodescrew , true ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ ( CapType ) ( CapTypeEx : : TwEx_SwitchFrontBack ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_SwitchFrontBack ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_SwitchFrontBack ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
2021-11-20 03:09:04 +00:00
if ( ( ! m_scanparam - > is_duplex ) & & mech = = TRUE )
return badValue ( ) ;
2020-06-20 03:01:35 +00:00
m_scanparam - > is_switchfrontback = mech ;
2021-11-20 03:09:04 +00:00
return success ( ) ;
2020-06-20 03:01:35 +00:00
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_SwitchFrontBack > ( msg , data , m_scanparam - > is_switchfrontback , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_SwitchFrontBack>(msg, data, { FALSE,TRUE }, m_scanparam->is_switchfrontback, (Bool)false, m_scanparam->is_switchfrontback ? 1 : 0, 0);
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IAutomaticRotate ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IAutomaticRotate ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutomaticRotate ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutomaticRotate > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IAutomaticRotate > ( ) ;
m_scanparam - > is_autotext = ( bool ) mech ;
if ( mech )
m_scanparam - > imageRotateDegree = 0.0f ;
return success ( ) ;
}
2021-04-13 09:30:05 +00:00
return CapSupGetAllReset < BYTE , bool , CapType : : IAutomaticRotate > ( msg , data , m_scanparam - > is_autotext , false ) ;
2020-06-20 03:01:35 +00:00
} ;
2020-07-07 01:54:19 +00:00
m_query [ CapType : : IAutomaticCropUsesFrame ] = msgSupportGetAll ;
2020-06-20 03:01:35 +00:00
m_caps [ CapType : : IAutomaticCropUsesFrame ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-04-13 09:30:05 +00:00
return CapSupGetAll < BYTE , bool , CapType : : IAutomaticCropUsesFrame > ( msg , data , m_scanparam - > is_autocrop , false ) ;
2020-07-07 01:54:19 +00:00
} ;
m_query [ CapType : : AutoScan ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : AutoScan ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : AutoScan ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : AutoScan > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-07-07 01:54:19 +00:00
auto autoscan = data . currentItem < CapType : : AutoScan > ( ) ;
m_autoscan = autoscan ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2021-04-06 01:31:21 +00:00
//return CapSupGetAllReset<Bool, Bool, CapType::AutoScan>(msg, data, { FALSE,TRUE }, m_autoscan, Bool(true), m_autoscan ? 1 : 0, 0);
2022-05-24 12:05:47 +00:00
return CapSupGetAllReset < Bool , Bool , CapType : : AutoScan > ( 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 < BOOL > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto tmp = data . currentItem < BOOL > ( ) ;
m_scanparam - > is_high_imagequality = tmp ;
return success ( ) ;
}
//return CapSupGetAllReset<Bool, Bool, CapType::AutoScan>(msg, data, { FALSE,TRUE }, m_autoscan, Bool(true), m_autoscan ? 1 : 0, 0);
return CapSupGetAllResetEx < bool , Bool , ( CapType ) CapTypeEx : : TwEx_IHighImageQuality > ( msg , data , m_scanparam - > is_high_imagequality , false ) ;
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IAutoSize ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IAutoSize ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutoSize ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutoSize > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto autosize = data . currentItem < CapType : : IAutoSize > ( ) ;
2021-06-28 03:58:54 +00:00
if ( autosize = = AutoSize : : Auto ) {
if ( m_scanparam - > papertype = = ( BYTE ) PaperSize : : UsStatement ) {
2020-11-12 11:42:16 +00:00
m_scanparam - > is_autocrop = 0 ;
m_autoboarderdetcet = false ;
}
2021-06-28 03:58:54 +00:00
else {
2020-11-12 11:42:16 +00:00
m_scanparam - > is_autocrop = 1 ;
2021-04-13 09:30:05 +00:00
m_scanparam - > papertype = ( BYTE ) Twpp : : PaperSize : : None ;
2020-11-12 11:42:16 +00:00
m_scanparam - > paperAlign = PaperAlign : : Rot0 ;
m_autoboarderdetcet = true ;
}
2020-07-11 10:43:17 +00:00
}
2021-06-28 03:58:54 +00:00
else {
2020-07-11 10:43:17 +00:00
m_autoboarderdetcet = false ;
m_scanparam - > is_autocrop = 0 ;
2020-07-07 01:54:19 +00:00
}
2020-12-25 10:37:13 +00:00
m_autosize = ( UInt16 ) autosize ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllReset < UInt16 , AutoSize , CapType : : IAutoSize > ( msg , data , { AutoSize : : None , AutoSize : : Auto } , m_autosize , AutoSize : : None , ( m_autosize = = ( UInt16 ) AutoSize : : Auto ) ? 1 : 0 , 0 ) ;
2020-06-20 03:01:35 +00:00
} ;
2020-07-07 01:54:19 +00:00
m_query [ CapType : : IAutomaticBorderDetection ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IAutomaticBorderDetection ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutomaticBorderDetection ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutomaticBorderDetection > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-07-07 01:54:19 +00:00
auto autodetectborder = data . currentItem < CapType : : IAutomaticBorderDetection > ( ) ;
2021-06-28 03:58:54 +00:00
if ( autodetectborder ) {
if ( m_scanparam - > papertype ! = ( BYTE ) PaperSize : : UsStatement ) {
2020-11-12 11:42:16 +00:00
m_scanparam - > is_autocrop = true ;
2021-04-13 09:30:05 +00:00
m_scanparam - > papertype = ( BYTE ) Twpp : : PaperSize : : None ;
2020-11-12 11:42:16 +00:00
m_scanparam - > paperAlign = PaperAlign : : Rot0 ;
m_autosize = ( UInt16 ) AutoSize : : Auto ;
}
2020-07-11 10:43:17 +00:00
}
2021-06-28 03:58:54 +00:00
else {
2020-07-11 10:43:17 +00:00
m_autosize = ( UInt16 ) AutoSize : : None ;
2020-07-07 01:54:19 +00:00
}
m_autoboarderdetcet = autodetectborder ;
return success ( ) ;
}
2021-01-22 07:37:46 +00:00
return CapSupGetAllReset < Bool , Bool , CapType : : IAutomaticBorderDetection > ( msg , data , { false , true } , m_autoboarderdetcet , false , m_autoboarderdetcet ? 1 : 0 , 0 ) ;
2020-07-07 01:54:19 +00:00
} ;
2021-02-08 03:11:06 +00:00
//m_query[CapType::IImageMerge] = msgSupportGetAllSetReset;
//m_caps[CapType::IImageMerge] = [this](Msg msg, Capability& data)->Result {
// if (Msg::Set == msg) {
// auto autocrop = data.currentItem<CapType::IImageMerge>();
2021-04-13 09:30:05 +00:00
// m_scanparam->en_fold = (BYTE)autocrop;
2021-02-08 03:11:06 +00:00
// if ((UInt16)autocrop != 0){
// m_scanparam->is_duplex = 1;
2021-11-20 06:24:33 +00:00
// m_scanparam->autodescrew = 1;//<2F> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> ʱ Ĭ<> <C4AC> <EFBFBD> Զ<EFBFBD> <D4B6> <EFBFBD> ƫ
2021-02-08 03:11:06 +00:00
// m_scanparam->is_autodiscradblank_normal = m_scanparam->is_autodiscradblank_vince = 0;
// }
// return success();
// }
2021-04-13 09:30:05 +00:00
// return CapSupGetAllResetEx<BYTE, UInt16, CapType::IImageMerge>(msg, data, m_scanparam->en_fold, 0);
2021-02-08 03:11:06 +00:00
//};
m_query [ CapType ( CapTypeEx : : TwEx_EnFold ) ] = msgSupportGetAllSetReset ;
m_caps [ CapType ( CapTypeEx : : TwEx_EnFold ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_EnFold ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Int32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-02-08 03:11:06 +00:00
auto autocrop = data . currentItem < Int32 > ( ) ;
m_scanparam - > en_fold = ( Int32 ) autocrop ;
2021-06-28 03:58:54 +00:00
if ( ( UInt16 ) autocrop ! = 0 ) {
2020-06-20 03:01:35 +00:00
m_scanparam - > is_duplex = 1 ;
2021-11-20 06:24:33 +00:00
m_scanparam - > autodescrew = 1 ; //<2F> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> ʱ Ĭ<> <C4AC> <EFBFBD> Զ<EFBFBD> <D4B6> <EFBFBD> ƫ
2020-08-15 08:42:43 +00:00
m_scanparam - > is_autodiscradblank_normal = m_scanparam - > is_autodiscradblank_vince = 0 ;
2020-06-20 03:01:35 +00:00
}
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Int32 , ( CapType ) CapTypeEx : : TwEx_EnFold > ( msg , data , m_scanparam - > en_fold , 0 ) ;
//return CapSupGetAllResetEx<BYTE, Int32, (CapType)CapTypeEx::TwEx_EnFold>(msg, data, { 0,1 }, m_scanparam->en_fold, 0, m_scanparam->en_fold ? 1 : 0, 0);
2020-06-20 03:01:35 +00:00
} ;
m_query [ CapType : : IAutoDiscardBlankPages ] = msgSupportGetAllSetReset ;
2021-06-28 03:58:54 +00:00
m_caps [ CapType : : IAutoDiscardBlankPages ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IAutoDiscardBlankPages ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IAutoDiscardBlankPages > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IAutoDiscardBlankPages > ( ) ;
2021-06-29 03:10:22 +00:00
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 ( ) ;
2021-02-03 10:21:45 +00:00
}
2021-06-29 03:10:22 +00:00
return badValue ( ) ;
2020-06-20 03:01:35 +00:00
}
2020-12-25 10:37:13 +00:00
DiscardBlankPages autodiscradblank ;
if ( Msg : : GetDefault = = msg | | ( Msg : : Reset = = msg ) ) {
m_scanparam - > is_autodiscradblank_normal = false ;
2020-06-20 03:01:35 +00:00
}
2020-12-25 10:37:13 +00:00
m_scanparam - > is_autodiscradblank_normal ? ( autodiscradblank = DiscardBlankPages : : Auto ) : ( autodiscradblank = DiscardBlankPages : : Disabled ) ;
return CapSupGetAllReset < DiscardBlankPages , DiscardBlankPages , CapType : : IAutoDiscardBlankPages > ( msg , data , autodiscradblank , DiscardBlankPages : : Disabled ) ;
2020-06-20 03:01:35 +00:00
} ;
/*costom caps*/
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> հ <EFBFBD> ҳ<EFBFBD> <D2B3> Ʊ
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IAutoDiscardBlankVince ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IAutoDiscardBlankVince ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IAutoDiscardBlankVince ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > is_autodiscradblank_vince = mech ;
2021-02-03 10:21:45 +00:00
if ( mech ) {
m_scanparam - > is_duplex = 1 ;
m_scanparam - > en_fold = 0 ;
2020-06-20 03:01:35 +00:00
m_scanparam - > is_autodiscradblank_normal = 0 ;
2021-11-20 03:09:04 +00:00
}
2020-12-25 10:37:13 +00:00
return success ( ) ;
2020-06-20 03:01:35 +00:00
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_IAutoDiscardBlankVince > ( msg , data , m_scanparam - > is_autodiscradblank_vince , false ) ;
2021-06-29 03:10:22 +00:00
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IAutoDiscardBlankVince>(msg, data, { FALSE,TRUE }, m_scanparam->is_autodiscradblank_vince, Bool(false), m_scanparam->is_autodiscradblank_vince ? 1 : 0, 0);
2021-07-02 03:29:24 +00:00
2020-06-20 03:01:35 +00:00
} ;
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IBackRotate180 ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IBackRotate180 ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IBackRotate180 ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
2022-05-24 12:05:47 +00:00
if ( mech )
{
if ( ! m_scanparam - > is_duplex )
{
return badValue ( ) ;
}
}
m_scanparam - > is_backrotate180 = mech ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_IBackRotate180 > ( msg , data , m_scanparam - > is_backrotate180 , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IBackRotate180>(msg, data, { FALSE,TRUE }, m_scanparam->is_backrotate180, Bool(false), m_scanparam->is_backrotate180 ? 1 : 0, 0);
2020-06-20 03:01:35 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> ڿ<EFBFBD>
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IFillBackground ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IFillBackground ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IFillBackground ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > fillbackground = mech ;
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_IFillBackground > ( msg , data , m_scanparam - > fillbackground , true ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IFillBackground>(msg, data, { FALSE,TRUE }, m_scanparam->fillbackground, Bool(true), m_scanparam->fillbackground ? 1 : 0, 1);
2020-06-20 03:01:35 +00:00
} ;
2021-07-02 03:29:24 +00:00
2021-11-20 06:24:33 +00:00
//<2F> ü<EFBFBD> <C3BC> <EFBFBD> ƫ<EFBFBD> <C6AB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2020-12-09 08:02:51 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_CroporDesaskewIndent ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_CroporDesaskewIndent ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_CroporDesaskewIndent ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < UInt32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-06-29 03:10:22 +00:00
auto mech = data . currentItem < UInt32 > ( ) ;
2020-12-25 10:37:13 +00:00
if ( ( mech > 30 | | mech < 5 ) & & ( ( bool ) m_scanparam - > is_autocrop = = true ) )
2020-12-09 08:02:51 +00:00
return badValue ( ) ;
2021-06-28 03:58:54 +00:00
m_scanparam - > indent = mech ;
2020-12-09 08:02:51 +00:00
return success ( ) ;
}
2021-06-29 03:10:22 +00:00
return CapSupGetAllResetEx < int , UInt32 , ( CapType ) CapTypeEx : : TwEx_CroporDesaskewIndent > ( msg , data , m_scanparam - > indent , 5 ) ;
2020-12-09 08:02:51 +00:00
} ;
2021-07-02 03:29:24 +00:00
2021-11-20 06:24:33 +00:00
//<2F> Զ<EFBFBD> <D4B6> ü<EFBFBD> <C3BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2020-12-09 08:02:51 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_CropNoise ) ] = msgSupportGetAllSetReset ;
2021-06-28 03:58:54 +00:00
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_CropNoise ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_CropNoise ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < UInt32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-06-29 03:10:22 +00:00
auto mech = data . currentItem < UInt32 > ( ) ;
2023-04-24 11:30:39 +00:00
if ( ( mech > 20 | | mech < 1 ) & & ( ( bool ) m_scanparam - > is_autocrop = = true ) )
2020-12-09 08:02:51 +00:00
return badValue ( ) ;
m_scanparam - > noise = mech ;
return success ( ) ;
}
2021-06-29 03:10:22 +00:00
return CapSupGetAllResetEx < int , UInt32 , ( CapType ) CapTypeEx : : TwEx_CropNoise > ( msg , data , m_scanparam - > noise , 8 ) ;
2020-12-09 08:02:51 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> Զ<EFBFBD> <D4B6> <EFBFBD> <EFBFBD> к; <D0BA> ƫ<EFBFBD> Ķ<EFBFBD> ֵ<EFBFBD> <D6B5> <EFBFBD> <EFBFBD> ֵ
2020-12-09 08:02:51 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_CroporDesaskewThreshold ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_CroporDesaskewThreshold ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_CroporDesaskewThreshold ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < UInt32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-06-29 03:10:22 +00:00
auto mech = data . currentItem < UInt32 > ( ) ;
2021-11-20 03:09:04 +00:00
if ( mech > 50 | | mech < 30 )
2020-12-09 08:02:51 +00:00
return badValue ( ) ;
m_scanparam - > AutoCrop_threshold = mech ;
return success ( ) ;
}
2021-06-29 03:10:22 +00:00
return CapSupGetAllResetEx < int , UInt32 , ( CapType ) CapTypeEx : : TwEx_CroporDesaskewThreshold > ( msg , data , m_scanparam - > AutoCrop_threshold , 40 ) ;
2020-12-09 08:02:51 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> ڿ<EFBFBD> <DABF> <EFBFBD> <EFBFBD> ䷽ʽ
2021-04-06 01:31:21 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_FillBackgroundMode ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_FillBackgroundMode ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_FillBackgroundMode ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-12-09 08:02:51 +00:00
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > is_convex = mech ;
return success ( ) ;
}
2021-04-06 01:31:21 +00:00
return CapSupGetAllResetEx < bool , Bool , ( CapType ) CapTypeEx : : TwEx_FillBackgroundMode > ( msg , data , m_scanparam - > is_convex , Bool ( true ) ) ;
2020-12-09 08:02:51 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> <EFBFBD> <EEB4A9>
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IFillHole ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IFillHole ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IFillHole ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > fillhole . is_fillhole = mech ;
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_IFillHole > ( msg , data , m_scanparam - > fillhole . is_fillhole , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IFillHole>(msg, data, { FALSE,TRUE }, m_scanparam->fillhole.is_fillhole, Bool(false), m_scanparam->fillhole.is_fillhole ? 1 : 0, 0);
2020-06-20 03:01:35 +00:00
} ;
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IFillHoleRatio ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IFillHoleRatio ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IFillHoleRatio ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Int32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Int32 > ( ) ;
if ( mech > 0 & & mech < 50 ) {
m_scanparam - > fillhole . fillholeratio = ( int ) mech ;
2022-09-20 01:08:11 +00:00
m_scanparam - > fillholeratio_up = m_scanparam - > fillholeratio_down = m_scanparam - > fillholeratio_left = m_scanparam - > fillholeratio_right = int ( mech ) ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
return badValue ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllResetEx < int , Int32 , ( CapType ) CapTypeEx : : TwEx_IFillHoleRatio > ( msg , data , m_scanparam - > fillhole . fillholeratio , 10 ) ;
2020-06-20 03:01:35 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> Ż<EFBFBD>
2020-12-09 08:02:51 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IDetachNoise ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IDetachNoise ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IDetachNoise ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-12-09 08:02:51 +00:00
auto mech = data . currentItem < Bool > ( ) ;
2022-05-24 12:05:47 +00:00
if ( mech ) {
if ( m_scanparam - > pixtype ! = 0 )
return badValue ( ) ;
}
2020-12-09 08:02:51 +00:00
m_scanparam - > detachnoise . is_detachnoise = mech ;
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_IDetachNoise > ( msg , data , m_scanparam - > detachnoise . is_detachnoise , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IDetachNoise>(msg, data, { FALSE,TRUE }, m_scanparam->detachnoise.is_detachnoise, FALSE, m_scanparam->detachnoise.is_detachnoise ? 1 : 0, 0);
2020-12-09 08:02:51 +00:00
} ;
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IDetachNoiseValue ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IDetachNoiseValue ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IDetachNoiseValue ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Int32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Int32 > ( ) ;
if ( mech > 9 & & mech < 51 ) {
m_scanparam - > detachnoise . detachnoise = ( int ) mech ;
return success ( ) ;
2020-12-09 08:02:51 +00:00
}
return badValue ( ) ;
}
2020-12-25 10:37:13 +00:00
return CapSupGetAllResetEx < int , Int32 , ( CapType ) CapTypeEx : : TwEx_IDetachNoiseValue > ( msg , data , m_scanparam - > detachnoise . detachnoise , 10 ) ;
2020-12-09 08:02:51 +00:00
} ;
2022-02-14 02:30:19 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> Ƴ<EFBFBD>
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 < Bool > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Bool > ( ) ;
2022-05-24 12:05:47 +00:00
if ( mech )
{
if ( m_scanparam - > pixtype ! = 2 )
return badValue ( ) ;
}
2022-02-14 02:30:19 +00:00
m_scanparam - > fadeback = mech ;
return success ( ) ;
}
return CapSupGetAllResetEx < bool , Bool , ( CapType ) CapTypeEx : : TwEx_IFadeBack > ( 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 < Int32 > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Int32 > ( ) ;
if ( mech > 0 & & mech < 129 ) {
m_scanparam - > fadeback_range = ( int ) mech ;
return success ( ) ;
}
return badValue ( ) ;
}
return CapSupGetAllResetEx < int , Int32 , ( CapType ) CapTypeEx : : TwEx_IFadeBackValue > ( msg , data , m_scanparam - > fadeback_range , 40 ) ;
} ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IMultiOutputRed ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IMultiOutputRed ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IMultiOutputRed ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
2022-05-24 12:05:47 +00:00
if ( m_scanparam - > pixtype = = ( BYTE ) PixelType : : Rgb & & ( ! m_scanparam - > en_multi_output ) )
2020-06-20 03:01:35 +00:00
m_scanparam - > multi_output_red = mech ;
else
2021-11-20 03:09:04 +00:00
return badValue ( ) ;
2021-11-20 06:24:33 +00:00
//m_scanparam->multi_output_red = 0;//<2F> Dz<EFBFBD> ɫ <20> <> <EFBFBD> <EFBFBD> ʹ <EFBFBD> ö<EFBFBD> <C3B6> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_IMultiOutputRed > ( msg , data , m_scanparam - > multi_output_red , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IMultiOutputRed>(msg, data, { FALSE,TRUE }, m_scanparam->multi_output_red, FALSE, m_scanparam->multi_output_red ? 1 : 0, 0);
2020-06-20 03:01:35 +00:00
} ;
2022-05-24 12:05:47 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʹ <EFBFBD> <CAB9>
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 < Bool > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Bool > ( ) ;
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 < bool , Bool , ( CapType ) CapTypeEx : : TwEx_IEnMultiOutPut > ( msg , data , m_scanparam - > en_multi_output , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_IEnMultiOutPut>(msg, data, { FALSE,TRUE }, m_scanparam->en_multi_output, FALSE, m_scanparam->en_multi_output ? 1 : 0, 0);
} ;
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
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 < Int32 > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Int32 > ( ) ;
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 < int8_t , Int32 , ( CapType ) CapTypeEx : : TwEx_IEnMultiOutPutType > ( msg , data , m_scanparam - > multioutput , 0 ) ;
} ;
2021-11-20 06:24:33 +00:00
//<2F> <> <EFBFBD> <EFBFBD> <E2BFA8> <EFBFBD> <EFBFBD>
2020-06-23 09:31:43 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_HsvCorrect ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_HsvCorrect ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_HsvCorrect ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-23 09:31:43 +00:00
auto mech = data . currentItem < Bool > ( ) ;
2022-05-24 12:05:47 +00:00
if ( mech ) {
if ( m_scanparam - > pixtype ! = ( int ) PixelType : : Rgb )
return badValue ( ) ;
}
2020-06-23 09:31:43 +00:00
m_scanparam - > hsvcorrect = mech ;
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_HsvCorrect > ( msg , data , m_scanparam - > hsvcorrect , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_HsvCorrect>(msg, data, { FALSE,TRUE }, m_scanparam->hsvcorrect, FALSE, m_scanparam->hsvcorrect ? 1 : 0, 0);
2020-06-23 09:31:43 +00:00
} ;
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IFilter ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IFilter ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IFilter ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < CapType : : IFilter > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < CapType : : IFilter > ( ) ;
if ( mech = = Filter : : None | | mech = = Filter : : Red | | mech = = Filter : : Green | | mech = = Filter : : Blue ) {
2021-11-20 03:09:04 +00:00
if ( ( ( Filter ) mech ! = Filter : : None ) & & ( m_scanparam - > pixtype = = ( int ) PixelType : : Rgb ) )
return badValue ( ) ;
2021-04-13 09:30:05 +00:00
m_scanparam - > filter = ( BYTE ) mech ;
2021-06-28 03:58:54 +00:00
if ( mech ! = Filter : : None ) {
2021-04-13 09:30:05 +00:00
m_scanparam - > enhance_color = ( BYTE ) Enchace_Color : : Enhance_None ;
2020-06-20 03:01:35 +00:00
}
return success ( ) ;
}
return badValue ( ) ;
}
2021-04-13 09:30:05 +00:00
return CapSupGetAllReset < BYTE , Filter , CapType : : IFilter > ( msg , data , { Filter : : Red , Filter : : Green , Filter : : Blue , Filter : : None } , m_scanparam - > filter , Filter : : None , m_scanparam - > filter , 3 ) ;
2020-06-20 03:01:35 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> <> ɫ<EFBFBD> <C9AB> ǿ
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IEnhanceColor ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IEnhanceColor ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IEnhanceColor ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Int16 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Int16 > ( ) ;
2021-06-28 03:58:54 +00:00
if ( m_scanparam - > pixtype = = ( int ) PixelType : : Rgb )
{
2021-04-13 09:30:05 +00:00
m_scanparam - > enhance_color = ( BYTE ) Enchace_Color : : Enhance_None ;
2021-06-28 03:58:54 +00:00
m_scanparam - > filter = ( BYTE ) Filter : : None ;
2021-06-29 03:10:22 +00:00
return badValue ( ) ;
2020-06-20 03:01:35 +00:00
}
2021-06-28 03:58:54 +00:00
else
{
2020-06-20 03:01:35 +00:00
if ( mech = = Enchace_Color : : Enhance_None | | mech = = Enchace_Color : : Enhance_Red | | mech = = Enchace_Color : : Enhance_Green | | mech = = Enchace_Color : : Enhance_Blue )
{
2021-04-13 09:30:05 +00:00
m_scanparam - > enhance_color = ( BYTE ) mech ;
if ( mech ! = ( BYTE ) Enchace_Color : : Enhance_None )
m_scanparam - > filter = ( BYTE ) Filter : : None ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
}
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Enchace_Color , ( CapType ) CapTypeEx : : TwEx_IEnhanceColor > ( msg , data , m_scanparam - > enhance_color , ( Enchace_Color ) 0 ) ;
//return CapSupGetAllResetEx<BYTE, Enchace_Color, (CapType)CapTypeEx::TwEx_IEnhanceColor>(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);
2020-06-20 03:01:35 +00:00
} ;
m_query [ ( CapType ) ( CapTypeEx : : TwEx_Sharpen ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_Sharpen ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_Sharpen ) , msg = = Msg : : Set ? to_string ( ( int ) data . currentItem < Int16 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Int16 > ( ) ;
if ( m_scanparam - > pixtype = = ( int ) PixelType : : BlackWhite )
return badValue ( ) ;
2021-04-13 09:30:05 +00:00
m_scanparam - > sharpen = ( BYTE ) mech ;
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2022-05-24 12:05:47 +00:00
return CapSupGetAllResetEx < BYTE , SharpenBlur , ( CapType ) CapTypeEx : : TwEx_Sharpen > ( msg , data , m_scanparam - > sharpen , SharpenBlur : : Sharpen_None ) ;
2021-07-02 03:29:24 +00:00
//return CapSupGetAllResetEx<BYTE, SharpenBlur, (CapType)CapTypeEx::TwEx_Sharpen>(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);
2020-06-20 03:01:35 +00:00
} ;
2021-11-20 06:24:33 +00:00
/*<2A> <> <EFBFBD> <EFBFBD> <20> Աȶ<D4B1> gamma range<67> <65> <EFBFBD> <EFBFBD> Range <20> <> <EFBFBD> <EFBFBD> */
2020-06-20 03:01:35 +00:00
m_query [ CapType : : IBrightness ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : IBrightness ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IBrightness ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < CapType : : IBrightness > ( ) ) : " " ) ;
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
data = Capability : : createRange < CapType : : IBrightness > ( Fix32 ( - 1000.0f ) , Fix32 ( 1000.0f ) , Fix32 ( 333.3f ) , Fix32 ( m_scanparam - > brightness ) , Fix32 ( 0.0 ) ) ;
return success ( ) ;
case Msg : : GetCurrent :
data = Capability : : createOneValue < CapType : : IBrightness > ( Fix32 ( m_scanparam - > brightness ) ) ;
return success ( ) ;
case Msg : : GetDefault :
2020-07-11 10:43:17 +00:00
case Msg : : Reset :
m_scanparam - > brightness = 0.0f ;
2020-06-20 03:01:35 +00:00
data = Capability : : createOneValue < CapType : : IBrightness > ( Fix32 ( 0.0f ) ) ;
return success ( ) ;
case Msg : : Set : {
auto mech = data . currentItem < CapType : : IBrightness > ( ) ;
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 {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IContrast ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < CapType : : IContrast > ( ) ) : " " ) ;
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
data = Capability : : createRange < CapType : : IContrast > ( Fix32 ( - 1000.0f ) , Fix32 ( 1000.0f ) , Fix32 ( 333.3f ) , Fix32 ( m_scanparam - > contrast ) , Fix32 ( 0.0 ) ) ;
return success ( ) ;
case Msg : : GetCurrent :
data = Capability : : createOneValue < CapType : : IContrast > ( Fix32 ( m_scanparam - > contrast ) ) ;
return success ( ) ;
case Msg : : GetDefault :
2020-07-11 10:43:17 +00:00
case Msg : : Reset :
m_scanparam - > contrast = 0.0f ;
2020-06-20 03:01:35 +00:00
data = Capability : : createOneValue < CapType : : IContrast > ( Fix32 ( 0.0f ) ) ;
return success ( ) ;
case Msg : : Set : {
auto mech = data . currentItem < CapType : : IContrast > ( ) ;
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 {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : IGamma ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < CapType : : IGamma > ( ) ) : " " ) ;
2020-06-20 03:01:35 +00:00
switch ( msg ) {
case Msg : : Get :
data = Capability : : createRange < CapType : : IGamma > ( Fix32 ( 0.0f ) , Fix32 ( 5.0f ) , Fix32 ( 1.0f ) , Fix32 ( m_scanparam - > gamma ) , Fix32 ( 1.0 ) ) ;
return success ( ) ;
case Msg : : GetCurrent :
data = Capability : : createOneValue < CapType : : IGamma > ( Fix32 ( m_scanparam - > gamma ) ) ;
return success ( ) ;
case Msg : : GetDefault :
2020-07-11 10:43:17 +00:00
case Msg : : Reset :
m_scanparam - > gamma = 1.0f ;
2020-06-20 03:01:35 +00:00
data = Capability : : createOneValue < CapType : : IGamma > ( Fix32 ( 0.0f ) ) ;
return success ( ) ;
case Msg : : Set : {
auto mech = data . currentItem < CapType : : IGamma > ( ) ;
if ( mech > 5.0f | | mech < 0.0f )
return badValue ( ) ;
m_scanparam - > gamma = ( float ) mech ;
return success ( ) ;
}
default :
return capBadOperation ( ) ;
}
} ;
2021-11-20 06:24:33 +00:00
/*<2A> <> <EFBFBD> <EFBFBD> ΪӲ<CEAA> <D3B2> Э<EFBFBD> <D0AD> */
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_ScrewDetectEnable ) ] = msgSupportGetAllSetReset ;
2021-06-28 03:58:54 +00:00
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_ScrewDetectEnable ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_ScrewDetectEnable ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > hardwarecaps . en_skrewdetect = mech ;
return success ( ) ;
}
2021-06-29 03:10:22 +00:00
Bool en = m_scanparam - > hardwarecaps . en_skrewdetect = = 0 ? Bool ( false ) : Bool ( true ) ;
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < Bool , Bool , ( CapType ) ( CapTypeEx : : TwEx_ScrewDetectEnable ) > ( msg , data , ( Bool ) m_scanparam - > hardwarecaps . en_skrewdetect , Bool ( true ) ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_ScrewDetectEnable>(msg, data, { FALSE ,TRUE }, m_scanparam->hardwarecaps.en_skrewdetect, TRUE, m_scanparam->hardwarecaps.en_skrewdetect ? 1 : 0, 1);
2020-06-20 03:01:35 +00:00
} ;
m_query [ ( CapType ) ( CapTypeEx : : TwEx_ScrewLevel ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_ScrewLevel ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_ScrewLevel ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < UInt32 > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2021-06-29 03:10:22 +00:00
auto mech = data . currentItem < UInt32 > ( ) ;
2020-06-20 03:01:35 +00:00
if ( mech > = 1 & & mech < = 5 ) {
m_scanparam - > hardwarecaps . skrewdetectlevel = mech ;
return success ( ) ;
}
return badValue ( ) ;
}
2021-06-29 03:10:22 +00:00
return CapSupGetAllResetEx < BYTE , UInt32 , ( CapType ) CapTypeEx : : TwEx_ScrewLevel > ( msg , data , m_scanparam - > hardwarecaps . skrewdetectlevel , ( UInt32 ) 3 ) ;
//return oneValGetSet<UInt8>(msg,data,m_scanparam->hardwarecaps.skrewdetectlevel,3);
2020-06-20 03:01:35 +00:00
} ;
2021-11-20 06:24:33 +00:00
//װ<> <D7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
2020-06-20 03:01:35 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_StableDetectEnable ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_StableDetectEnable ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_StableDetectEnable ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
2020-06-20 03:01:35 +00:00
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > hardwarecaps . en_stapledetect = mech ;
2021-06-29 03:10:22 +00:00
2020-06-20 03:01:35 +00:00
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_StableDetectEnable > ( msg , data , m_scanparam - > hardwarecaps . en_stapledetect , false ) ;
//return CapSupGetAllResetEx<BYTE, Bool, (CapType)CapTypeEx::TwEx_StableDetectEnable>(msg, data, { FALSE,TRUE }, m_scanparam->hardwarecaps.en_stapledetect, FALSE, m_scanparam->hardwarecaps.en_stapledetect==0 ? 0 : 1, 0);
2020-06-20 03:01:35 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> ۽Ǽ<DBBD> <C7BC> <EFBFBD>
2020-11-16 10:05:04 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_DogEarDelection ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_DogEarDelection ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_DogEarDelection ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Bool > ( ) ) : " " ) ;
2020-12-25 10:37:13 +00:00
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Bool > ( ) ;
2021-06-28 03:58:54 +00:00
m_scanparam - > is_dogeardetection = mech ;
2020-12-25 10:37:13 +00:00
return success ( ) ;
2020-11-16 10:05:04 +00:00
}
2021-04-13 09:30:05 +00:00
return CapSupGetAllResetEx < BYTE , Bool , ( CapType ) CapTypeEx : : TwEx_DogEarDelection > ( msg , data , m_scanparam - > is_dogeardetection , FALSE ) ;
2020-11-16 10:05:04 +00:00
} ;
2021-11-20 06:24:33 +00:00
//<2F> ۽Ǽ<DBBD> <C7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۶<EFBFBD> <DBB6> 㵽ʵ<E3B5BD> <CAB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> С <EFBFBD> <D0A1> <EFBFBD> <EFBFBD>
2021-11-20 03:09:04 +00:00
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 < UInt32 > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < UInt32 > ( ) ;
if ( mech > = 10 & & mech < = 300 )
m_scanparam - > dogeardistance = mech ;
else
return badValue ( ) ;
return success ( ) ;
}
2022-05-24 12:05:47 +00:00
return CapSupGetAllResetEx < UInt32 , UInt32 , ( CapType ) CapTypeEx : : TwEx_DogEarDistance > ( msg , data , m_scanparam - > dogeardistance , 70 ) ;
2021-11-20 03:09:04 +00:00
} ;
2021-11-20 06:24:33 +00:00
//˫<> ż<EFBFBD> <C5BC> <EFBFBD> <20> <> <EFBFBD> ٷ<EFBFBD> <D9B7> <EFBFBD> <EFBFBD> <D7BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> Э<EFBFBD> <D0AD> <EFBFBD> <EFBFBD> Ϊbool<6F> <6C> <20> <> <EFBFBD> <EFBFBD> У ʹ <D0A3> <CAB9> bool<6F> <6C> <EFBFBD> ͣ<EFBFBD> <CDA3> <EFBFBD> <EFBFBD> <EFBFBD> ʹ <EFBFBD> ñ<EFBFBD> twainЭ<6E> <D0AD>
2020-06-20 03:01:35 +00:00
m_query [ CapType : : DoubleFeedDetection ] = msgSupportGetAllSetReset ;
m_caps [ CapType : : DoubleFeedDetection ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapType : : DoubleFeedDetection ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < UInt16 > ( ) ) : " " ) ;
2023-04-24 11:30:39 +00:00
std : : vector < std : : string > names ;
Twain_config ( ) . GetOrSetDoubleNames ( names , true ) ;
FileTools : : writelog ( log_INFO , " DoubleFeedDetection " + FileTools : : GetProcessName ( ) ) ;
if ( std : : find ( names . begin ( ) , names . end ( ) , FileTools : : to_web_utf ( FileTools : : String2Wstring ( FileTools : : GetProcessName ( ) ) ) ) = = names . end ( ) ) {
FileTools : : writelog ( log_INFO , " DoubleFeedDetection 11111 " ) ;
switch ( msg ) {
case Msg : : Get :
data = Capability : : createEnumeration < UInt16 > ( CapType : : DoubleFeedDetection , { 0 , 1 } , m_scanparam - > hardwarecaps . en_doublefeed ? 0 : 1 , 0 ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : GetCurrent :
data = Capability : : createOneValue < UInt16 > ( 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 < UInt16 > ( CapType : : DoubleFeedDetection , 0 ) ;
return { ReturnCode : : Success , ConditionCode : : Success } ;
case Msg : : Set : {
auto mech = data . currentItem < UInt16 > ( ) ;
m_scanparam - > hardwarecaps . en_doublefeed = mech ? 0 : 1 ;
return success ( ) ;
}
2021-06-21 11:38:36 +00:00
2023-04-24 11:30:39 +00:00
default :
return { ReturnCode : : Failure , ConditionCode : : CapBadOperation } ;
}
}
else {
FileTools : : writelog ( log_INFO , " DoubleFeedDetection 22222 " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < UInt16 > ( ) ;
m_scanparam - > hardwarecaps . en_doublefeed = mech ? 1 : 0 ;
return success ( ) ;
}
return CapSupGetAllResetEx < BYTE , UInt16 , CapType : : DoubleFeedDetection > ( msg , data , m_scanparam - > hardwarecaps . en_doublefeed , TRUE ) ;
2021-06-21 11:38:36 +00:00
}
2021-06-28 03:58:54 +00:00
} ;
2021-02-03 10:21:45 +00:00
# ifdef G200
2021-11-20 06:24:33 +00:00
//<2F> <EFBFBD> <CDB9> <EFBFBD> ģʽ
2021-02-03 10:21:45 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_LowPowerMode ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_LowPowerMode ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_LowPowerMode ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < UInt32 > ( ) ) : " " ) ;
2021-02-03 10:21:45 +00:00
if ( Msg : : Set = = msg ) {
2021-06-29 03:10:22 +00:00
auto mech = data . currentItem < UInt32 > ( ) ;
2021-02-03 10:21:45 +00:00
m_scanparam - > hardwarecaps . lowpowermode = ( LowPowerMode ) mech ;
return success ( ) ;
}
2021-07-02 03:29:24 +00:00
return CapSupGetAllResetEx < LowPowerMode , UInt32 , ( CapType ) CapTypeEx : : TwEx_LowPowerMode > ( msg , data , m_scanparam - > hardwarecaps . lowpowermode , LowPowerMode : : Min_30 ) ;
//return CapSupGetAllResetEx<LowPowerMode, UInt32, (CapType)CapTypeEx::TwEx_LowPowerMode>(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);
2021-02-03 10:21:45 +00:00
} ;
2023-03-13 08:53:10 +00:00
# endif // LANXUM
# if defined G200 || defined G300
# ifndef ANDROIDSERIAL
2022-05-24 12:05:47 +00:00
//<2F> <> ֽɨ<D6BD> <C9A8>
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 < BOOL > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < BOOL > ( ) ;
m_scanparam - > hardwarecaps . is_autopaper = mech ;
2023-03-13 08:53:10 +00:00
m_scanparam - > autopaper_timeout = 15 ;
2022-05-24 12:05:47 +00:00
if ( mech )
m_scanparam - > scannum = - 1 ;
return success ( ) ;
}
return CapSupGetAllResetEx < uint8_t , BOOL , ( CapType ) CapTypeEx : : TwEx_IToBeScan > ( msg , data , m_scanparam - > hardwarecaps . is_autopaper , FALSE ) ;
} ;
2023-03-13 08:53:10 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IToBeScanTimeOut ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IToBeScanTimeOut ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IToBeScanTimeOut ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < UInt32 > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < UInt32 > ( ) ;
if ( mech > 60 | | mech < 15 )
return badValue ( ) ;
m_scanparam - > autopaper_timeout = mech ;
return success ( ) ;
}
return CapSupGetAllResetEx < int , int , ( CapType ) CapTypeEx : : TwEx_IToBeScanTimeOut > ( msg , data , m_scanparam - > autopaper_timeout , 15 ) ;
} ;
# endif
# endif
2021-06-30 13:58:13 +00:00
2021-07-19 10:36:34 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_CropModel ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_CropModel ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2021-11-20 03:09:04 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_CropModel ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < UInt32 > ( ) ) : " " ) ;
2021-07-19 10:36:34 +00:00
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < UInt32 > ( ) ;
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 < bool , UInt32 , ( CapType ) CapTypeEx : : TwEx_CropModel > ( msg , data , m_scanparam - > normalCrop , false ) ;
} ;
2021-12-16 08:21:35 +00:00
//ͼ<> <CDBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
m_query [ ( CapType ) ( CapTypeEx : : TwEx_ImageSplit ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_ImageSplit ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2023-01-04 06:30:50 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_ImageSplit ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Bool > ( ) ) : " " ) ;
2021-12-16 08:21:35 +00:00
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > is_split = mech ;
return success ( ) ;
}
return CapSupGetAllResetEx < bool , Bool , ( CapType ) CapTypeEx : : TwEx_ImageSplit > ( msg , data , m_scanparam - > is_split , false ) ;
} ;
2023-01-04 06:30:50 +00:00
//ɫƫУ <C6AB> <D0A3>
m_query [ ( CapType ) ( CapTypeEx : : TwEx_ColorCast ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_ColorCast ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_ColorCast ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Bool > ( ) ) : " " ) ;
if ( Msg : : Set = = msg ) {
if ( m_scanparam - > pixtype ! = 2 )
return badValue ( ) ;
auto mech = data . currentItem < Bool > ( ) ;
m_scanparam - > is_colorcast = mech ;
return success ( ) ;
}
return CapSupGetAllResetEx < bool , Bool , ( CapType ) CapTypeEx : : TwEx_ColorCast > ( msg , data , m_scanparam - > is_colorcast , false ) ;
} ;
2022-11-15 07:11:30 +00:00
m_query [ ( CapType ) ( CapTypeEx : : TwEx_IHsvFilter ) ] = msgSupportGetAllSetReset ;
m_caps [ ( CapType ) ( CapTypeEx : : TwEx_IHsvFilter ) ] = [ this ] ( Msg msg , Capability & data ) - > Result {
2023-01-04 06:30:50 +00:00
CapabilityPrintf ( msg , enum2str ( CapTypeEx : : TwEx_IHsvFilter ) , msg = = Msg : : Set ? to_string ( ( float ) data . currentItem < Bool > ( ) ) : " " ) ;
2022-11-15 07:11:30 +00:00
if ( Msg : : Set = = msg ) {
auto mech = data . currentItem < Bool > ( ) ;
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 < bool , Bool , ( CapType ) CapTypeEx : : TwEx_IHsvFilter > ( 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 < Bool > ( ) ) : " " ) ;
switch ( msg ) {
case Msg : : Get : {
data = Capability : : createOneValue < Bool > ( ( CapType ) ( CapTypeEx : : TwEx_UVModel ) , Bool ( m_scanparam - > hardwarecaps . en_uv ) ) ;
//data = Capability::createEnumeration<Bool>((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 < Bool > ( ( CapType ) ( CapTypeEx : : TwEx_UVModel ) , m_scanparam - > hardwarecaps . en_uv ) ;
return success ( ) ;
case Msg : : GetDefault :
data = Capability : : createOneValue < Bool > ( ( CapType ) ( CapTypeEx : : TwEx_UVModel ) , Bool ( false ) ) ;
return success ( ) ;
case Msg : : Set : {
auto mech = data . currentItem < Bool > ( ) ;
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 < unsigned char > ) ;
}
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 ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> ڵ<EFBFBD> " + to_string ( index ) + " ҳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۽ǣ<EFBFBD> ֹͣɨ<EFBFBD> 裡 " , ret ) ;
else if ( ret = = 75 & & ( ( typeid ( * scanner . get ( ) ) = = typeid ( GScanO1003399 ) ) ) )
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> ڵ<EFBFBD> " + to_string ( index ) + " ҳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ߴ 粻<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֹͣɨ<EFBFBD> 裡 " , ret ) ;
else if ( ret = = 81 & & ( ( typeid ( * scanner . get ( ) ) = = typeid ( GScanO1003399 ) ) ) )
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> 豸<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֶ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <EFBFBD> " , ret ) ;
else
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , 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 ( " <EFBFBD> <EFBFBD> ʾ " , 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 < UInt32 > ( 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<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 쳣,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> USB<53> <42> <EFBFBD> <EFBFBD> <EFBFBD> ´ <EFBFBD> <C2B4> <EFBFBD> ɨ<EFBFBD> <C9A8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " , L " <EFBFBD> <EFBFBD> ʾ " , MB_OK | MB_SYSTEMMODAL ) ;
return seqError ( ) ;
}
# ifndef G200
if ( typeid ( * scanner . get ( ) ) ! = typeid ( GScanO1003399 ) ) {
while ( ! scanner - > Get_Scanner_PaperOn ( ) )
{
if ( MessageBox ( NULL , L " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֽ<EFBFBD> <EFBFBD> " , L " <EFBFBD> <EFBFBD> ʾ " , MB_YESNO | MB_SYSTEMMODAL ) = = IDNO )
return seqError ( ) ;
}
}
# endif // !G200
this_thread : : sleep_for ( chrono : : milliseconds ( 100 ) ) ; //ɨ<> <C9A8> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> ӳ<EFBFBD> <20> <> ֹusb<73> <62> <EFBFBD> <EFBFBD> <EFBFBD> е <EFBFBD> <D0B5> <EFBFBD> Ϣδ<CFA2> <CEB4> ȡ<EFBFBD> <C8A1> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ɨ<EFBFBD> <C9A8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
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 < Int16 > ( 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 < float > ( dib - > biWidth ) / m_scanparam - > resolution_dst , static_cast < float > ( 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 ) ;
}
2023-03-08 01:41:45 +00:00
static int xtfer = 0 ;
2022-11-15 07:11:30 +00:00
Result HuagaoDs : : imageMemXferGet ( const Identity & origin , ImageMemXfer & data ) {
if ( ! m_pendingXfers ) {
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain imageNativeXferGet m_pendingXfers " ) ;
2022-11-15 07:11:30 +00:00
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 ( ) ;
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain imageNativeXferGet size error setup.maxsize = " + to_string ( setup . maxSize ( ) ) + " setup.minsize " + to_string ( setup . minSize ( ) ) ) ;
2022-11-15 07:11:30 +00:00
if ( memSize > setup . maxSize ( ) | | memSize < setup . minSize ( ) ) {
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain imageNativeXferGet size error data.size = " + to_string ( memSize ) ) ;
2022-11-15 07:11:30 +00:00
return badValue ( ) ;
}
auto maxRows = memSize / bpl ;
auto rows = std : : min < UInt32 > ( maxRows , static_cast < UInt32 > ( dib - > biHeight ) - m_memXferYOff ) ;
if ( rows = = 0 ) {
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain imageNativeXferGet rows == 0" ) ;
2022-11-15 07:11:30 +00:00
return seqError ( ) ; // image already transfered in this session
}
cv : : Mat mat ;
vector < uchar > 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 < UInt32 > ( 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 < UInt32 > ( std : : abs ( dib - > biHeight ) ) ) {
m_pendingXfers = 0 ;
m_memXferYOff = 0 ;
//bmpData.reset(new std::vector<unsigned char>);
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain imageNativeXferGet m_memXferYOff transfered num of " + to_string ( + + xtfer ) + " images " ) ;
2022-11-15 07:11:30 +00:00
return { ReturnCode : : XferDone , ConditionCode : : Success } ;
}
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain imageNativeXferGet transfered num of " + to_string ( + + xtfer ) + " images " ) ;
2022-11-15 07:11:30 +00:00
return success ( ) ;
}
2023-03-08 01:41:45 +00:00
2022-11-15 07:11:30 +00:00
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 < char > ( ) . data ( ) ) ;
//bmpData.reset(new std::vector<unsigned char>);
//FileTools::write_log("<22> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain transfered num of " + to_string(++xtfer) + " images");
2023-03-08 01:41:45 +00:00
FileTools : : writelog ( log_INFO , " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> ͼƬ ===> Twain transfered num of " + to_string ( + + xtfer ) + " images " ) ;
2022-11-15 07:11:30 +00:00
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 < unsigned char > ) ;
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 < int > compression_params ;
compression_params . push_back ( CV_IMWRITE_JPEG_QUALITY ) ;
compression_params . push_back ( m_jpegQuality ) ;
std : : vector < uchar > 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 < unsigned char > ) ;
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 < HWND > ( 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 " <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֽ<EFBFBD> <EFBFBD> " , L " <EFBFBD> <EFBFBD> ʾ " , 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<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 쳣,<2C> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> USB<53> <42> <EFBFBD> <EFBFBD> <EFBFBD> ´ <EFBFBD> <C2B4> <EFBFBD> ɨ<EFBFBD> <C9A8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> " , L " <EFBFBD> <EFBFBD> ʾ " , 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 ? " ȷ<EFBFBD> <EFBFBD> " : " ɨ<EFBFBD> <EFBFBD> " , hardwareversion , serialnum , macadder , mbversion ) ) ;
guiTwain - > Create ( IDD_TWAINUI , parent ) ;
CRect newRect ;
: : GetWindowRect ( static_cast < HWND > ( 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 < const BITMAPINFOHEADER * > ( bmpData - > data ( ) + sizeof ( BITMAPFILEHEADER ) ) ;
}
UInt32 HuagaoDs : : bytesPerLine ( ) const noexcept {
auto dib = header ( ) ;
return static_cast < UInt32 > ( dib - > biWidth * dib - > biBitCount + 31 ) / 32 * 4 ;
}
UInt32 HuagaoDs : : bmpSize ( ) const noexcept {
return static_cast < UInt32 > ( 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 < unsigned char > ( ) ) ;
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 : : duration < int , ratio < 24 * 60 * 60 > > > ( chrono : : system_clock : : now ( ) . time_since_epoch ( ) ) . count ( ) ) {
hgmsg ( _T ( " ֽ<EFBFBD> ִ<EFBFBD> ֽ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ѳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʹ <EFBFBD> ÷<EFBFBD> Χ <EFBFBD> <EFBFBD> ɨ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> д<EFBFBD> ֽʧ<EFBFBD> ܡ<EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ŵ<EFBFBD> <EFBFBD> 쳣Ƶ<EFBFBD> ο <EFBFBD> <EFBFBD> ܻ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ࣬<EFBFBD> <EFBFBD> ע<EFBFBD> ⼰ʱ<EFBFBD> <EFBFBD> <EFBFBD> ࡢ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ϵ<EFBFBD> 豸<EFBFBD> <EFBFBD> Ӧ<EFBFBD> ̹<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 滻ֽ<EFBFBD> ֣<EFBFBD> " ) ) ;
config . setrollermsgdata ( chrono : : duration_cast < chrono : : duration < int , ratio < 24 * 60 * 60 > > > ( chrono : : system_clock : : now ( ) . time_since_epoch ( ) ) . count ( ) ) ;
}
}
//m_scanparam->brightness =300; // <20> <> <EFBFBD> <EFBFBD> һ <EFBFBD> <D2BB> 500 - 142
//m_scanparam->contrast = 0; // С <> <D0A1> ר<EFBFBD> <D7A8>
scanner - > config_params ( * m_scanparam ) ;
std : : string info = " papertype= " + to_string ( m_scanparam - > papertype ) +
" \n AutoCrop_threshold= " + to_string ( m_scanparam - > AutoCrop_threshold ) +
" \n autodescrew = " + to_string ( m_scanparam - > autodescrew ) +
" \n automaticcolor= " + to_string ( m_scanparam - > automaticcolor ) +
" \n brightness = " + to_string ( m_scanparam - > brightness ) +
" \n contrast = " + to_string ( m_scanparam - > contrast ) +
" \n is_detachnoise = " + to_string ( m_scanparam - > detachnoise . is_detachnoise ) +
" \n detachnoise = " + to_string ( m_scanparam - > detachnoise . detachnoise ) +
" \n en_fold = " + to_string ( m_scanparam - > en_fold ) +
" \n en_sizecheck = " + to_string ( m_scanparam - > en_sizecheck ) +
" \n enhance_color = " + to_string ( m_scanparam - > enhance_color ) +
" \n fillbackground = " + to_string ( m_scanparam - > fillbackground ) +
" \n filter = " + to_string ( m_scanparam - > filter ) +
" \n is_fillhole = " + to_string ( m_scanparam - > fillhole . is_fillhole ) +
" \n gamma = " + to_string ( m_scanparam - > gamma ) +
" \n capturepixtype = " + to_string ( m_scanparam - > hardwarecaps . capturepixtype ) +
" \n en_doublefeed = " + to_string ( m_scanparam - > hardwarecaps . en_doublefeed ) +
" \n hsvcorrect = " + to_string ( m_scanparam - > hsvcorrect ) +
" \n imageRotateDegree = " + to_string ( m_scanparam - > imageRotateDegree ) +
" \n indent = " + to_string ( m_scanparam - > indent ) +
" \n is_autocontrast = " + to_string ( m_scanparam - > is_autocontrast ) +
" \n is_autocrop = " + to_string ( m_scanparam - > is_autocrop ) +
" \n is_autocontrast = " + to_string ( m_scanparam - > is_autocontrast ) +
" \n is_autodiscradblank_normal = " + to_string ( m_scanparam - > is_autodiscradblank_normal ) +
" \n is_autodiscradblank_vince = " + to_string ( m_scanparam - > is_autodiscradblank_vince ) +
" \n is_autotext = " + to_string ( m_scanparam - > is_autotext ) +
" \n is_convex = " + to_string ( m_scanparam - > is_convex ) +
" \n is_duplex = " + to_string ( m_scanparam - > is_duplex ) +
" \n is_switchfrontback = " + to_string ( m_scanparam - > is_switchfrontback ) +
" \n is_dogeardetection = " + to_string ( m_scanparam - > is_dogeardetection ) +
" \n multi_output_red = " + to_string ( m_scanparam - > multi_output_red ) +
" \n en_multi_output = " + to_string ( m_scanparam - > en_multi_output ) +
" \n multioutput = " + to_string ( m_scanparam - > multioutput ) +
" \n noise = " + to_string ( m_scanparam - > noise ) +
" \n paperAlign = " + to_string ( m_scanparam - > paperAlign ) +
" \n pixtype = " + to_string ( m_scanparam - > pixtype ) +
" \n resolution_dst = " + to_string ( m_scanparam - > resolution_dst ) +
" \n scannum = " + to_string ( m_scanparam - > scannum ) +
" \n sharpen = " + 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 < unsigned char > ) ;
}
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();//ȡ<> <C8A1> ɨ<EFBFBD> <C9A8> <20> رս <D8B1> <D5BD> <EFBFBD> ָʾ <D6B8> <CABE>
2023-03-13 08:53:10 +00:00
//if (guiTwain.get()) {
// ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(true);
//}
2022-11-15 07:11:30 +00:00
onDeviceEvent ( USER_STOP ) ;
} ;
guiIndicator = new CIndicatorDlg ( stopFunc ) ;
scanner - > regist_indicatortext_callback ( [ this ] ( int aquire , int updata )
{ if ( guiIndicator - > GetSafeHwnd ( ) )
guiIndicator - > setindicatortext ( aquire , updata ) ;
2023-03-13 08:53:10 +00:00
} ,
[ this ] ( CString str )
{ if ( guiIndicator - > GetSafeHwnd ( ) )
guiIndicator - > setindicatortext ( str ) ;
2022-11-15 07:11:30 +00:00
} ) ;
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 ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> ڵ<EFBFBD> " + to_string ( index ) + " ҳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ۽ǣ<EFBFBD> ֹͣɨ<EFBFBD> 裡 " , retCode ) ;
else if ( retCode = = 75 & & ( ( typeid ( * scanner . get ( ) ) = = typeid ( GScanO1003399 ) ) ) )
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> ڵ<EFBFBD> " + to_string ( index ) + " ҳ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ߴ 粻<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֹͣɨ<EFBFBD> 裡 " , retCode ) ;
else if ( retCode = = 81 & & ( ( typeid ( * scanner . get ( ) ) = = typeid ( GScanO1003399 ) ) ) )
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , " <EFBFBD> 豸<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ģʽ <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ֶ<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 豸<EFBFBD> <EFBFBD> " , retCode ) ;
else
showmsg ( " <EFBFBD> <EFBFBD> ʾ " , 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 } ; //<2F> <> ֽ
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<GScanCap> vc;
//vc.push_back(*m_scanparam);
std : : string savepath = TCHAR2STRING ( szIniFile ) ;
js . SaveGscancapJson ( * m_scanparam , savepath ) ;
//js.WriteJsonArrayToFile(vc, savepath);
2022-11-15 07:32:11 +00:00
}