/* sane - Scanner Access Now Easy. 对sane标准头文件的扩展 Author: Gongbing Date: 2022-01-14 Path: SANE_CONFIG_DIR This environment variable specifies the list of directories that may contain theconfiguration file. Under UNIX, the directories are separated by a colon (:'),under os/2,they are separated by a semi-colon (;'). If this variable is not set,the configuration file is searched in two default directories: first, the currentworking directory(".") and then in letc/sane.d. If the value of the environmentvariable ends with the directory separator character,then the default directoriesare searched after the explicitly specified directories. For example,setting SANE_CONFIG_DIR to" /tmp/config :" would result in directories tmp/config, ., andletclsane.d being searched (in this order). */ #ifndef sane_ex_h #define sane_ex_h #define SIZE_KB(n) ((n) * 1024) #define SIZE_MB(n) SIZE_KB(n * 1024) #define SIZE_GB(n) SIZE_MB(n * 1024) #define SEC_2_MS(s) ((s) * 1000) #define MSEC_2_US(ms) ((ms) * 1000) #define SEC_2_US(s) MSEC_2_US(SEC_2_MS(s)) #define ALIGN_TO(v, align) (((v) + (align) - 1) / (align) * (align)) #define ALIGN_INT(v) ALIGN_TO(v, sizeof(int)) #include #ifndef EXPORT_SANE_API #ifdef OEM_HANWANG #define ENTIRE_API(pre, tail) pre##_hwsane_##tail #elif defined(OEM_LISICHENG) #define ENTIRE_API(pre, tail) pre##_lscsane_##tail #elif defined(OEM_CANGTIAN) #define ENTIRE_API(pre, tail) pre##_ctssane_##tail #elif defined(OEM_ZHONGJING) #define ENTIRE_API(pre, tail) pre##_zjsane_##tail #elif defined(OEM_ZIGUANG) #define ENTIRE_API(pre, tail) pre##_zgsane_##tail #elif defined(OEM_DELI) #define ENTIRE_API(pre, tail) pre##_dlsane_##tail #elif defined(OEM_NEUTRAL) #define ENTIRE_API(pre, tail) pre##_neusane_##tail #else #define ENTIRE_API(pre, tail) pre##_hgsane_##tail #endif #define sane_init ENTIRE_API(sane, init) #define sane_init_ex ENTIRE_API(sane, init_ex) #define sane_exit ENTIRE_API(sane, exit) #define sane_get_devices ENTIRE_API(sane, get_devices) #define sane_open ENTIRE_API(sane, open) #define sane_close ENTIRE_API(sane, close) #define sane_get_option_descriptor ENTIRE_API(sane, get_option_descriptor) #define sane_control_option ENTIRE_API(sane, control_option) #define sane_get_parameters ENTIRE_API(sane, get_parameters) #define sane_start ENTIRE_API(sane, start) #define sane_read ENTIRE_API(sane, read) #define sane_cancel ENTIRE_API(sane, cancel) #define sane_set_io_mode ENTIRE_API(sane, set_io_mode) #define sane_get_select_fd ENTIRE_API(sane, get_select_fd) #define sane_strstatus ENTIRE_API(sane, strstatus) #define sane_io_control ENTIRE_API(sane, io_control) #define sane_err_desc ENTIRE_API(sane, err_desc) #define sane_get_option_descriptor_ex ENTIRE_API(get_option_descriptor_ex) #define sane_control_option_ex ENTIRE_API(control_option_ex) #define sane_read_ext_info ENTIRE_API(sane, read_ext_info) #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #define SANE_OPT_NAME(name) SANE_STD_OPT_NAME_##name #define SANE_OPT_FIXED_ID(id) SANE_OPT_ID_##id #define IS_SANE_OPT(v, sd) strcmp(v, SANE_OPT_NAME(sd)) == 0 #define MAX_OPT_NAME_LEN 64 #define JSON_SANE_TYPE_BOOL "bool" #define JSON_SANE_TYPE_INT "int" #define JSON_SANE_TYPE_FIXED "float" #define JSON_SANE_TYPE_STRING "string" #define JSON_SANE_TYPE_GROUP "group" #define JSON_SANE_TYPE_BUTTON "button" // 用户权限 enum { USER_PRIVILEGE_COMMON = 0, // 普通用户权限 USER_PRIVILEGE_LOCAL_MGR = 10, // 本地管理员权限 USER_PRIVILEGE_TECH_SUPPORTING = 20, // 技术支持权限 USER_PRIVILEGE_DEVLOPER = 100, // 开发者权限(查看所有属性) }; // 属性可见 enum opt_visible_level // "visible" field { OPT_VISIBLE_ALL = 0, // visible on ui and accessible OPT_VISIBLE_ACCESS, // accessible only OPT_VISIBLE_HIDE, // invisible and inaccessible unless user has DEVELOPE privilege OPT_VISIBLE_NOT_SUPPORT, // device does not support this option }; // sane-standard-option-name defined by third-app #define SANE_FULL_NAME(n) SANE_STD_OPT_NAME_##n // // PART I: 参数类型与华高一致,可直接通过改name字段为标准值实现 #define SANE_STD_OPT_NAME_RESTORE "restore" // OPTION_TITLE_HFMRSZ #define SANE_STD_OPT_NAME_HELP "help" // OPTION_TITLE_BZ #define SANE_STD_OPT_NAME_IS_MULTI_OUT "is-multiout" // OPTION_TITLE_DLSC #define SANE_STD_OPT_NAME_MULTI_OUT_TYPE "multiout-type" // OPTION_TITLE_DLSCLX #define SANE_STD_OPT_NAME_COLOR_MODE "mode" // OPTION_TITLE_YSMS #define SANE_STD_OPT_NAME_BINARY_THRESHOLD "binary-threshold" // OPTION_TITLE_HBTXYZ #define SANE_STD_OPT_NAME_REVERSE_01 "reverse-bw" // OPTION_TITLE_HBTXFSSC #define SANE_STD_OPT_NAME_FILTER "filter" // OPTION_TITLE_HDHHBTX_CSYZQ #define SANE_STD_OPT_NAME_RID_MULTIOUT_RED "is-rid-multiout-red" // OPTION_TITLE_24WCSTX_DLSCCH #define SANE_STD_OPT_NAME_RID_ANSWER_SHEET_RED "is-rid-answer-sheet-red" // OPTION_TITLE_24WCSTX_DTKCH #define SANE_STD_OPT_NAME_ERASE_BACKGROUND "is-erase-bkg" // OPTION_TITLE_BJYC #define SANE_STD_OPT_NAME_BKG_COLOR_RANGE "bkg-color-range" // OPTION_TITLE_BJSCFDFW #define SANE_STD_OPT_NAME_SHARPEN "sharpen" // OPTION_TITLE_RHYMH #define SANE_STD_OPT_NAME_RID_MORR "is-rid-morr" // OPTION_TITLE_QCMW #define SANE_STD_OPT_NAME_RID_GRID "is-rid-grid" // OPTION_TITLE_CWW #define SANE_STD_OPT_NAME_ERROR_EXTENSION "is-err-extension" // OPTION_TITLE_CWKS #define SANE_STD_OPT_NAME_NOISE_OPTIMIZE "is-noise-optimize" // OPTION_TITLE_HBTXZDYH #define SANE_STD_OPT_NAME_NOISE_SIZE "noise-size" // OPTION_TITLE_ZDYHCC #define SANE_STD_OPT_NAME_PAPER "paper" // OPTION_TITLE_ZZCC #define SANE_STD_OPT_NAME_PAPER_W "paper-w" // 纸张宽度 #define SANE_STD_OPT_NAME_PAPER_H "paper-h" // 纸张高度 #define SANE_STD_OPT_NAME_LATERAL "lateral" // 纸张横向标志 #define SANE_STD_OPT_NAME_CUSTOM_AREA "is-custom-area" // OPTION_TITLE_ZDYSMQY #define SANE_STD_OPT_NAME_CUSTOM_AREA_LEFT "tl-x" // OPTION_TITLE_SMQYZCmm #define SANE_STD_OPT_NAME_CUSTOM_AREA_RIGHT "br-x" // OPTION_TITLE_SMQYYCmm #define SANE_STD_OPT_NAME_CUSTOM_AREA_TOP "tl-y" // OPTION_TITLE_SMQYSCmm #define SANE_STD_OPT_NAME_CUSTOM_AREA_BOTTOM "br-y" // OPTION_TITLE_SMQYXCmm #define SANE_STD_OPT_NAME_SIZE_CHECK "is-size-check" // OPTION_TITLE_CCJC #define SANE_STD_OPT_NAME_PAGE "page" // OPTION_TITLE_SMYM #define SANE_STD_OPT_NAME_DISCARD_BLANK_SENS "blank-sensitivity" // OPTION_TITLE_TGKBYLMD #define SANE_STD_OPT_NAME_RESOLUTION "resolution" // OPTION_TITLE_FBL #define SANE_STD_OPT_NAME_TIME_TO_SLEEP "time-to-sleep" // OPTION_TITLE_XMSJ #define SANE_STD_OPT_NAME_IMAGE_QUALITY "image-quality" // OPTION_TITLE_HZ #define SANE_STD_OPT_NAME_EXCHANGE "is-exchange" // OPTION_TITLE_JHZFM #define SANE_STD_OPT_NAME_SPLIT "is-split" // OPTION_TITLE_TXCF #define SANE_STD_OPT_NAME_ANTI_SKEW "is-anti-skew" // OPTION_TITLE_ZDJP #define SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA "is-custom-gamma" // OPTION_TITLE_QYSDQX #define SANE_STD_OPT_NAME_GAMMA "gamma" // OPTION_TITLE_JMZ #define SANE_STD_OPT_NAME_CUSTOM_GAMMA "custom-gamma" // OPTION_TITLE_CUSTOM_JMZ; data - SANE_Gamma* #define SANE_STD_OPT_NAME_GRAY_GAMMA "gray-gamma-table" #define SANE_STD_OPT_NAME_COLOR_GAMMA "color-gamma-table" #define SANE_STD_OPT_NAME_RED_GAMMA "red-gamma-table" #define SANE_STD_OPT_NAME_GREEN_GAMMA "green-gamma-table" #define SANE_STD_OPT_NAME_BLUE_GAMMA "blue-gamma-table" #define SANE_STD_OPT_NAME_BRIGHTNESS "brightness" // OPTION_TITLE_LDZ #define SANE_STD_OPT_NAME_CONTRAST "contrast" // OPTION_TITLE_DBD #define SANE_STD_OPT_NAME_IS_PHOTO_MODE "is-photo-mode" // OPTION_TITLE_ZPMS #define SANE_STD_OPT_NAME_ERASE_BLACK_FRAME "is-erase-black-frame" // OPTION_TITLE_XCHK #define SANE_STD_OPT_NAME_DARK_SAMPLE "is-dark-sample" // OPTION_TITLE_SSYZ #define SANE_STD_OPT_NAME_THRESHOLD "threshold" // OPTION_TITLE_YZ #define SANE_STD_OPT_NAME_ANTI_NOISE_LEVEL "anti-noise-level" // OPTION_TITLE_BJKZDJ #define SANE_STD_OPT_NAME_MARGIN "margin" // OPTION_TITLE_BYSJ #define SANE_STD_OPT_NAME_FILL_BKG_MODE "bkg-fill-mode" // OPTION_TITLE_BJTCFS #define SANE_STD_OPT_NAME_IS_ANTI_PERMEATE "is-anti-permeate" // OPTION_TITLE_FZST #define SANE_STD_OPT_NAME_ANTI_PERMEATE_LEVEL "permeate-level" // OPTION_TITLE_FZSTDJ #define SANE_STD_OPT_NAME_RID_HOLE "is-rid-hole" // OPTION_TITLE_CKYC #define SANE_STD_OPT_NAME_HOLE_THRESHOLD "hole-threshold" // #define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE "search-hole-range" // OPTION_TITLE_CKSSFWZFMBL #define SANE_STD_OPT_NAME_RID_HOLE_L "is-rid-hole-l" // OPTION_TITLE_CKYCZC #define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_L "search-hole-range-l" // OPTION_TITLE_ZCCKSSFWZFMBL #define SANE_STD_OPT_NAME_RID_HOLE_R "is-rid-hole-r" // OPTION_TITLE_CKYCYC #define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_R "search-hole-range-r" // OPTION_TITLE_YCCKSSFWZFMBL #define SANE_STD_OPT_NAME_RID_HOLE_T "is-rid-hole-t" // OPTION_TITLE_CKYCSC #define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_T "search-hole-range-t" // OPTION_TITLE_SCCKSSFWZFMBL #define SANE_STD_OPT_NAME_RID_HOLE_B "is-rid-hole-b" // OPTION_TITLE_CKYCXC #define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_B "search-hole-range-b" // OPTION_TITLE_XCCKSSFWZFMBL #define SANE_STD_OPT_NAME_IS_FILL_COLOR "is-fill-color" // OPTION_TITLE_SCTC #define SANE_STD_OPT_NAME_IS_ULTROSONIC_CHECK "is-ultrosonic" // OPTION_TITLE_CSBJC #define SANE_STD_OPT_NAME_DOUBLE_CHECK "double-chk" #define SANE_STD_OPT_NAME_DOUBLE_FEED_HANDLE "double-feed" // OPTION_TITLE_SZTPCL #define SANE_STD_OPT_NAME_IS_CHECK_STAPLE "is-staple" // OPTION_TITLE_ZDJC #define SANE_STD_OPT_NAME_SCAN_MODE "scan-mode" // OPTION_TITLE_SMZS #define SANE_STD_OPT_NAME_SCAN_COUNT "scan-count" // OPTION_TITLE_SMSL #define SANE_STD_OPT_NAME_TEXT_DIRECTION "direction" // OPTION_TITLE_WGFX #define SANE_STD_OPT_NAME_IS_ROTATE_BKG_180 "is-rotate-bkg-180" // OPTION_TITLE_BMXZ180 #define SANE_STD_OPT_NAME_IS_CHECK_DOG_EAR "is-check-dog-ear" // OPTION_TITLE_ZJJC #define SANE_STD_OPT_NAME_DOG_EAR_SIZE "dog-ear-size" // OPTION_TITLE_ZJDX #define SANE_STD_OPT_NAME_IS_CHECK_ASKEW "is-check-askew" // OPTION_TITLE_WXJC #define SANE_STD_OPT_NAME_ASKEW_RANGE "askew-range" // OPTION_TITLE_WXRRD #define SANE_STD_OPT_NAME_FEED_STRENGTH "feed-strength" // OPTION_TITLE_FZQD #define SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH "is-auto-strength" // OPTION_TITLE_ZDFZQD #define SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE "feed-strength-value" // OPTION_TITLE_JZSBL #define SANE_STD_OPT_NAME_WAIT_TO_SCAN "is-wait-scan" // OPTION_TITLE_DZSM #define SANE_STD_OPT_NAME_FOLD_TYPE "fold-type" // OPTION_TITLE_DZMS #define SANE_STD_OPT_NAME_COLOR_CORRECTION "color-correction" // OPTION_TITLE_SPJZ #define SANE_STD_OPT_NAME_WAIT_SCAN_EXIT "wait-scan-exit" // OPTION_TITLE_DZSMTCSJ #define SANE_STD_OPT_NAME_DISCARDBLANK "discardblank" // OPTION_TITLE_TGKBY #define SANE_STD_OPT_NAME_DEVICE_NAME "dev-name" // 设备名称 #define SANE_STD_OPT_NAME_DEVICE_VID "dev-vid" // 设备VID #define SANE_STD_OPT_NAME_DEVICE_PID "dev-pid" // 设备PID #define SANE_STD_OPT_NAME_DEVICE_MODEL "dev-model" // 设备系列 #define SANE_STD_OPT_NAME_DEV_NAME SANE_STD_OPT_NAME_DEVICE_NAME #define SANE_STD_OPT_NAME_VID SANE_STD_OPT_NAME_DEVICE_VID #define SANE_STD_OPT_NAME_PID SANE_STD_OPT_NAME_DEVICE_PID #define SANE_STD_OPT_NAME_DEV_FAMILY SANE_STD_OPT_NAME_DEVICE_MODEL #define SANE_STD_OPT_NAME_DEVICE_TYPE "dev-type" // 设备型号 #define SANE_STD_OPT_NAME_DEVICE_SERIAL_NO "dev-sn" // 设备序列号 #define SANE_STD_OPT_NAME_FIRMWARE_VERSION "fmw-ver" // 固件版本 #define SANE_STD_OPT_NAME_DEVICE_IP_ADDR "ip-addr" // 设备IP地址 #define SANE_STD_OPT_NAME_DEVICE_MAC_ADDR "mac-addr" // 设备MAC地址 #define SANE_STD_OPT_NAME_ROLLER_COUNT "roll-cnt" // 滚轴张数 #define SANE_STD_OPT_NAME_TOTAL_COUNT "total-cnt" // 历史总张数 #define SANE_STD_OPT_NAME_HISTORY_COUNT SANE_STD_OPT_NAME_TOTAL_COUNT #define SANE_STD_OPT_NAME_GET_DEVS_L0G "devs-log" // 获取设备日志 #define SANE_STD_OPT_NAME_DRIVER_VERSION "drv-ver" // 设备VID #define SANE_STD_OPT_NAME_MANUFACTURER "company" // 公司名称 #define SANE_STD_OPT_NAME_COPYRIGHT "copyright" // 版权 #define SANE_STD_OPT_NAME_CO_URL "co-url" // 公司网址 #define SANE_STD_OPT_NAME_CO_TEL "co-tel" // 公司电话 #define SANE_STD_OPT_NAME_CO_ADDR "co-addr" // 公司地址 #define SANE_STD_OPT_NAME_CO_GPS "co-gps" // 公司地图定位 #define SANE_STD_OPT_NAME_USER_NAME "user-name" // 登录账号 #define SANE_STD_OPT_NAME_USER_PASSWORD "user-pwd" // 登录密码 #define SANE_STD_OPT_NAME_LOGIN "login" // 登录 #define SANE_STD_OPT_NAME_LOGOUT "logout" // 登出 #define SANE_STD_OPT_NAME_DRIVER_LOG "drv-log" // 驱动日志 #define SANE_STD_OPT_NAME_DEVICE_LOG SANE_STD_OPT_NAME_GET_DEVS_L0G #define SANE_STD_OPT_NAME_ROLLER_LIFE "roller-life" // 滚轴最大寿命(过纸张数) #define SANE_STD_OPT_NAME_LANGUAGE "language" // 语言 #define SANE_STD_OPT_NAME_MOTOR_VER "motor-ver" // 电机固件版本, data = char* #define SANE_STD_OPT_NAME_FPGA_VER "fpga-ver" // CIS控制器(FPGA)版本, data = char* #define SANE_STD_OPT_NAME_TRANSFORM_IMAGE_FORMAT "trans-img-fmt" // 图像格式转换, data - SANE_ImageFormatConvert*, dst.data 调用SANE_STD_OPT_NAME_FREE_BUFFER释放 #define SANE_STD_OPT_NAME_FREE_BUFFER "free-buf" // 释放由驱动返回的内存, data - (void**)&buf #define SANE_STD_OPT_NAME_PAPER_ON "paper-on" // check whether paper is on #define SANE_STD_OPT_NAME_INITIAL_BOOT_TIME "initial-boot-time" // 设备的初始开机时间 #define SANE_STD_OPT_NAME_DUMP_IMG "dumpimg" // 是否输出算法各阶段中间图像 #define SANE_STD_OPT_NAME_DUMP_IMG_PATH "dump-path" // 中间图像输出路径 #define SANE_STD_OPT_NAME_CIS_LENGTH "cis-len" // CIS 长度(采集图像的最大宽度) // PART II: 参数类型与华高不一致,需要通过“hgsane”组件在中间转换 #define SANE_STD_OPT_NAME_PAGE_W "page-width" // OPTION_TITLE_ZZCC #define SANE_STD_OPT_NAME_PAGE_H "page-height" // OPTION_TITLE_ZZCC #define SANE_STD_OPT_NAME_DUPLEX "duplex" // OPTION_TITLE_SMYM // END for sane-standard-option-name defined by third-app // // PART III: inner option on device #define SANE_STD_OPT_NAME_CIS_MODE "cis-mode" #define SANE_STD_OPT_NAME_CIS_DPI "cis-dpi" #define SANE_STD_OPT_NAME_CIS_BAUD "baud" #define SANE_STD_OPT_NAME_CIS_DELAY "act-after" #define SANE_STD_OPT_NAME_CIS_FRAME_H "frame-h" #define SANE_STD_OPT_NAME_CIS_SAMPLE "sample" #define SANE_STD_OPT_NAME_CIS_SP "cis-sp" #define SANE_STD_OPT_NAME_CIS_EXPO_FB "expo-fb" #define SANE_STD_OPT_NAME_CIS_EXPO_FG "expo-fg" #define SANE_STD_OPT_NAME_CIS_EXPO_FR "expo-fr" #define SANE_STD_OPT_NAME_CIS_EXPO_BB "expo-bb" #define SANE_STD_OPT_NAME_CIS_EXPO_BG "expo-bg" #define SANE_STD_OPT_NAME_CIS_EXPO_BR "expo-br" #define SANE_STD_OPT_NAME_CIS_GAIN_FRONT "gain-f" #define SANE_STD_OPT_NAME_CIS_GAIN_BACK "gain-b" #define SANE_STD_OPT_NAME_CIS_OFFSET_FRONT "off-f" #define SANE_STD_OPT_NAME_CIS_OFFSET_BACK "off-b" #define SANE_STD_OPT_NAME_CIS_STRETCH_H "stretch-h" #define SANE_STD_OPT_NAME_CIS_STRETCH_V "stretch-v" #define SANE_STD_OPT_NAME_MOTOR_SPEED "motor-speed" // // 借鉴TWAIN协议固定ID的做法,定义SANE属性的固定ID - 这里与TWAIN中的ID保持一致,以方便TWAIN的调用 enum sane_option_id { SANE_OPT_ID_BASE = 0x8800, SANE_OPT_ID_IS_MULTI_OUT = 0x8801, SANE_OPT_ID_MULTI_OUT_TYPE = 0x8802, SANE_OPT_ID_COLOR_MODE = 0x8803, SANE_OPT_ID_FILTER = 0x8804, SANE_OPT_ID_RID_MULTIOUT_RED = 0x8805, SANE_OPT_ID_RID_ANSWER_SHEET_RED = 0x8806, SANE_OPT_ID_ERASE_BACKGROUND = 0x8807, SANE_OPT_ID_BKG_COLOR_RANGE = 0x8808, SANE_OPT_ID_SHARPEN = 0x8809, SANE_OPT_ID_RID_MORR = 0x880A, SANE_OPT_ID_RID_GRID = 0x880B, SANE_OPT_ID_ERROR_EXTENSION = 0x880C, SANE_OPT_ID_NOISE_OPTIMIZE = 0x880D, SANE_OPT_ID_NOISE_SIZE = 0x880E, SANE_OPT_ID_PAPER = 0x880F, SANE_OPT_ID_CUSTOM_AREA = 0x8810, SANE_OPT_ID_CUSTOM_AREA_LEFT = 0x8811, SANE_OPT_ID_CUSTOM_AREA_RIGHT = 0x8812, SANE_OPT_ID_CUSTOM_AREA_TOP = 0x8813, SANE_OPT_ID_CUSTOM_AREA_BOTTOM = 0x8814, SANE_OPT_ID_SIZE_CHECK = 0x8815, SANE_OPT_ID_PAGE = 0x8816, SANE_OPT_ID_DISCARD_BLANK_SENS = 0x8817, SANE_OPT_ID_RESOLUTION = 0x8818, SANE_OPT_ID_IMAGE_QUALITY = 0x8819, SANE_OPT_ID_EXCHANGE = 0x881A, SANE_OPT_ID_SPLIT = 0x881B, SANE_OPT_ID_ANTI_SKEW = 0x881C, SANE_OPT_ID_IS_CUSTOM_GAMMA = 0x881D, SANE_OPT_ID_BRIGHTNESS = 0x881E, SANE_OPT_ID_CONTRAST = 0x881F, SANE_OPT_ID_GAMMA = 0x8820, SANE_OPT_ID_ERASE_BLACK_FRAME = 0x8821, SANE_OPT_ID_DARK_SAMPLE = 0x8822, SANE_OPT_ID_THRESHOLD = 0x8823, SANE_OPT_ID_ANTI_NOISE_LEVEL = 0x8824, SANE_OPT_ID_MARGIN = 0x8825, SANE_OPT_ID_FILL_BKG_MODE = 0x8826, SANE_OPT_ID_IS_ANTI_PERMEATE = 0x8827, SANE_OPT_ID_ANTI_PERMEATE_LEVEL = 0x8828, SANE_OPT_ID_RID_HOLE = 0x8829, SANE_OPT_ID_SEARCH_HOLE_RANGE = 0x882A, SANE_OPT_ID_IS_FILL_COLOR = 0x882B, SANE_OPT_ID_IS_ULTROSONIC_CHECK = 0x882C, SANE_OPT_ID_IS_CHECK_STAPLE = 0x882D, SANE_OPT_ID_SCAN_MODE = 0x882E, SANE_OPT_ID_SCAN_COUNT = 0x882F, SANE_OPT_ID_TEXT_DIRECTION = 0x8830, SANE_OPT_ID_IS_ROTATE_BKG_180 = 0x8831, SANE_OPT_ID_IS_CHECK_DOG_EAR = 0x8832, SANE_OPT_ID_DOG_EAR_SIZE = 0x8833, SANE_OPT_ID_IS_CHECK_ASKEW = 0x8834, SANE_OPT_ID_ASKEW_RANGE = 0x8835, SANE_OPT_ID_BINARY_THRESHOLD = 0x8836, SANE_OPT_ID_IS_PHOTO_MODE = 0x8837, SANE_OPT_ID_DOUBLE_FEED_HANDLE = 0x8838, SANE_OPT_ID_WAIT_TO_SCAN = 0x8839, SANE_OPT_ID_FEED_STRENGTH = 0x883A, SANE_OPT_ID_TIME_TO_SLEEP = 0x883B, SANE_OPT_ID_IS_AUTO_FEED_STRENGTH = 0x883C, SANE_OPT_ID_FEED_STRENGTH_VALUE = 0x883D, SANE_OPT_ID_REVERSE_01 = 0x883E, SANE_OPT_ID_RID_HOLE_L = 0x883F, SANE_OPT_ID_SEARCH_HOLE_RANGE_L = 0x8840, SANE_OPT_ID_RID_HOLE_R = 0x8841, SANE_OPT_ID_SEARCH_HOLE_RANGE_R = 0x8842, SANE_OPT_ID_RID_HOLE_T = 0x8843, SANE_OPT_ID_SEARCH_HOLE_RANGE_T = 0x8844, SANE_OPT_ID_RID_HOLE_B = 0x8845, SANE_OPT_ID_SEARCH_HOLE_RANGE_B = 0x8846, SANE_OPT_ID_FOLD_TYPE = 0x8847, SANE_OPT_ID_COLOR_CORRECTION = 0x8848, SANE_OPT_ID_HISTORY_COUNT = 0x8849, SANE_OPT_ID_DRIVER_VERSION = 0x884A, SANE_OPT_ID_MANUFACTURER = 0x884B, SANE_OPT_ID_COPYRIGHT = 0x884C, SANE_OPT_ID_CO_URL = 0x884D, SANE_OPT_ID_CO_TEL = 0x884E, SANE_OPT_ID_CO_ADDR = 0x884F, SANE_OPT_ID_CO_GPS = 0x8850, SANE_OPT_ID_HELP = 0x8851, SANE_OPT_ID_VID = 0x8852, SANE_OPT_ID_PID = 0x8853, SANE_OPT_ID_DEV_NAME = 0x8854, SANE_OPT_ID_DEV_FAMILY = 0x8855, SANE_OPT_ID_DEVICE_SERIAL_NO = 0x8856, SANE_OPT_ID_FIRMWARE_VERSION = 0x8857, SANE_OPT_ID_DEVICE_IP_ADDR = 0x8858, SANE_OPT_ID_DEVICE_MAC_ADDR = 0x8859, SANE_OPT_ID_CUSTOM_GAMMA = 0x885A, // data: SANE_Gamma* SANE_OPT_ID_ROLLER_LIFE = 0x885B, // data: uint32_t* SANE_OPT_ID_LANGUAGE = 0x885C, // data: char* SANE_OPT_ID_MOTOR_VER = 0x885D, // 电机固件版本, data - char* SANE_OPT_ID_TRANSFORM_IMAGE_FORMAT = 0x885E,// 图像格式转换, data - SANE_ImageFormatConvert*, dst.data 调用SANE_STD_OPT_NAME_FREE_BUFFER释放 SANE_OPT_ID_FREE_BUFFER = 0x885F, // 释放由驱动返回的内存, data - (void**)&buf SANE_OPT_ID_PAPER_ON = 0x8860, // 是否有纸张, data - SANE_Bool* SANE_OPT_ID_GRAY_GAMMA = 0x8861, // gray-gamma-table SANE_OPT_ID_COLOR_GAMMA = 0x8862, // color-gamma-table SANE_OPT_ID_RED_GAMMA = 0x8863, // red-gamma-table SANE_OPT_ID_GREEN_GAMMA = 0x8864, // green-gamma-table SANE_OPT_ID_BLUE_GAMMA = 0x8865, // blue-gamma-table SANE_OPT_ID_INITIAL_BOOT_TIME = 0x8866, SANE_OPT_ID_DISCARDBLANK = 0x8867, SANE_OPT_ID_WAIT_SCAN_EXIT = 0x8868, SANE_OPT_ID_RESTORE = 0x8869, SANE_OPT_ID_PAPER_W = 0x886A, // 纸张宽度,单位为mm SANE_OPT_ID_PAPER_H = 0x886B, // 纸张高度,单位为mm SANE_OPT_ID_LATERAL = 0x886C, // 纸张横向标志,bool SANE_OPT_ID_LOGIN = 0x9900, SANE_OPT_ID_LOGOUT = 0x9901, SANE_OPT_ID_ROLLER_COUNT = 0x9902, SANE_OPT_ID_DRIVER_LOG = 0x9903, SANE_OPT_ID_DEVICE_LOG = 0x9904, SANE_OPT_ID_USER_NAME = 0x9905, SANE_OPT_ID_USER_PASSWORD = 0x9906, }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include "sane.h" #include #define MAX_STRING_LEN 256 #define IS_DOUBLE_EQUAL(a, b) fabs((a) - (b)) < .000001 #define IS_PTR_NUMBER(ptr) (((unsigned long long)(ptr)) < 0x10000) #define CAPABILITY_ORDINARY (SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT) #define CAPABILITY_READONLY SANE_CAP_SOFT_DETECT // 设置活动状态 #define SET_CAP_ACTIVE(cap, act) \ { \ if(act) \ cap &= ~SANE_CAP_INACTIVE; \ else \ cap |= SANE_CAP_INACTIVE; \ } // 设置为只读属性 #define SET_CAP_READONLY(cap) \ { \ cap &= ~(CAPABILITY_ORDINARY | SANE_CAP_HARD_SELECT); \ cap |= CAPABILITY_READONLY; \ } #define IS_CAP_READONLY(cap) (((cap) & (CAPABILITY_ORDINARY | SANE_CAP_HARD_SELECT)) == CAPABILITY_READONLY) // 设置为软件可设置/读取 #define SET_CAP_SOFT_SETTABLE(cap) \ { \ cap &= ~(CAPABILITY_ORDINARY | SANE_CAP_HARD_SELECT); \ cap |= SANE_CAP_HARD_SELECT; \ } // 设置为由设备上的按键操作属性 #define SET_CAP_DEVICE_SETTABLE(cap, can_read) \ { \ cap &= ~(CAPABILITY_ORDINARY | SANE_CAP_HARD_SELECT); \ cap |= can_read ? SANE_CAP_SOFT_DETECT | CAPABILITY_ORDINARY : CAPABILITY_ORDINARY;\ } #ifdef __cplusplus extern "C" { #endif #pragma pack(push) #pragma pack(1) #define ZERO_STRUCT(struct_ptr) memset(struct_ptr, 0, sizeof(*(struct_ptr))) //////////////////////////////////////////////////////////////////////////////// // extension for standard SANE ... enum SANE_Action_Ex // extension for SANE_Action { SANE_ACTION_GET_DEFAULT_VALUE = 100, // 获取设置项默认值,参数同SANE_ACTION_GET_VALUE SANE_ACTION_GET_FIX_ID, // 获取属性的固定ID,void* = SANE_Int* SANE_ACTION_GET_ENTIRE_JSON, // 获取该属性JSON文本 // Function: 枚举对SANE协议不可见的固定ID属性(以使TWAIN可访问) // // Parameter: void* = FIXDCB* SANE_ACTION_ENUM_INVISIBLE_FIX_ID = 0x0FEC7, }; enum SANE_Frame_Ex // after SANE_Frame { SANE_FRAME_RAW = 5, SANE_FRAME_MIME, // MIME descriptor }; // SANE_ACTION_ENUM_INVISIBLE_FIX_ID struct _fix_id_cb { SANE_Bool (*cb)(int, void*); void* param; }; typedef struct _sane_stream { SANE_Int bytes; SANE_Byte *data; }SANE_Stream; typedef struct _sane_dev_ex { SANE_String_Const name; /* unique device name */ SANE_String_Const vendor; /* device vendor string */ SANE_String_Const model; /* device model name */ SANE_String_Const family; /* device type (e.g., "flatbed scanner") */ SANE_Bool openned; // whether openned }SANE_Device_Ex; typedef struct _sane_auth // for SANE_EVENT_NEED_AUTH { SANE_String_Const resource; SANE_Char name[MAX_STRING_LEN]; SANE_Char pwd[MAX_STRING_LEN]; SANE_Char method[MAX_STRING_LEN]; }SANEAUTH; typedef enum { SANE_TYPE_EX_BOOL = 0, SANE_TYPE_EX_INT, SANE_TYPE_EX_FIXED, // same as SANE_TYPE_FIXED SANE_TYPE_EX_STRING, // sane as SANE_TYPE_STRING SANE_TYPE_EX_POS, // position in origin image, SANE_Rect* SANE_TYPE_EX_IMAGE, // SANE_Image*, src_id is meanless }SANE_Value_Ext_Type; typedef struct { SANE_Int left; SANE_Int top; SANE_Int right; SANE_Int bottom; }SANE_Rect; typedef struct { SANE_Int src_id; // unique(in this running) image ID from SANE SANE_Int count; // length of array 'info' struct { SANE_Int ext_inf_id; // Extended information ID SANE_Value_Ext_Type type; // value type SANE_Int inf_bytes; // length of information union { SANE_Bool bval; // bool SANE_Int ival; // integer SANE_Fixed fval; // float value SANE_Char *pval; // string, byte-stream or other structure }; }info[1]; }SANE_Img_Ext_Info; // added on 2023-01-13 typedef struct { SANE_Int src_id; // unique(in this running) image ID from SANE SANE_Parameters header; struct { unsigned int statu : 4; // SANE_Image_Statu unsigned int dpi : 12; // resolution, dots per inch unsigned int reserve : 16; }flag; unsigned long bytes; unsigned char *data; }SANE_Image; typedef struct _about_info { SANE_String_Const title; // APP名称 SANE_String_Const version; // 版本号 SANE_String_Const copyright; // 版权信息 unsigned int logo_bytes; // LOGO 数据长度 void* logo; // LOGO 数据 struct { SANE_String_Const key; // 附加信息名称,该数据为NULL时,appendix数组结束 SANE_String_Const content;// 附加信息内容 SANE_String_Const url; // 附加信息链接, NULL则忽略 }appendix[1]; }SANE_About; typedef enum { SANE_COMPRESSION_FIRST = 0, SANE_COMPRESSION_NONE = 0, // default value //SANE_COMPRESSION_PACBITS, //SANE_COMPRESSION_GROUP31D, //SANE_COMPRESSION_GROUP31DEOL, //SANE_COMPRESSION_GROUP32D, SANE_COMPRESSION_GROUP4 = 5, // support now ! detail is threshold converting color to BlackWhite, e.g. (void*)128 //SANE_COMPRESSION_JPEG, //SANE_COMPRESSION_LZW, //SANE_COMPRESSION_JBIG, //SANE_COMPRESSION_PNG, //SANE_COMPRESSION_RLE4, //SANE_COMPRESSION_RLE8, //SANE_COMPRESSION_BITFIELDS, //SANE_COMPRESSION_ZIZ, //SANE_COMPRESSION_JPEG2000, SANE_COMPRESSION_LAST, SANE_COMPRESSION_DONTCARE = 0xFFFF, }SANE_CompressionType; typedef struct _img_compression { SANE_CompressionType compression; void* detail; // see SANE_CompressionType (该参数在当前版本不考虑,暂使用压缩类型的默认值) }SANE_Compression; typedef enum // 与Twpp::ImageFileFormat 保持一致 { SANE_IMAGE_TYPE_FIRST = 0, SANE_IMAGE_TYPE_TIFF = 0, SANE_IMAGE_TYPE_BMP = 2, // (BITMAPINFOHEADER*)detail SANE_IMAGE_TYPE_PNG = 7, SANE_IMAGE_TYPE_JPG = 13, SANE_IMAGE_TYPE_JFIF = 4, SANE_IMAGE_TYPE_PDF = 10, // 以下为Twpp::ImageFileFormat不存在的值 SANE_IMAGE_TYPE_GIF = 100, SANE_IMAGE_TYPE_WEBP, SANE_IMAGE_TYPE_SVG, SANE_IMAGE_TYPE_LAST, }SANE_ImageType; typedef struct _img_final_fmt { SANE_ImageType img_format; void* detail; // see SANE_ImageType (该参数在当前版本不考虑,暂使用该图像类型的默认值) SANE_Compression compress; }SANE_FinalImgFormat; typedef struct _img_format_convert { struct { SANE_FinalImgFormat fmt; // format of the data SANE_Bool is_file; // data is a 'path-file' if it was true, or else is raw file data SANE_String_Const data; // represents a local file or a memory data. call 'IO_CTRL_CODE_FREE_MEMORY' to free the dst.data memory if 'is_file' was true !!! unsigned int data_len; // bytes of 'data' }src, dst; }SANE_ImageFormatConvert; typedef struct _sane_point { SANE_Byte x; SANE_Byte y; }SANE_Gamma_Point; enum gamma_index { GAMMA_INDEX_GRAY = 0, GAMMA_INDEX_COLOR, GAMMA_INDEX_RED, GAMMA_INDEX_GREEN, GAMMA_INDEX_BLUE, }; typedef struct _user_gamma // NOTE: exceeds 4KB !!! { SANE_Int apply_to_back : 8; // SANE_TRUE: 应用到背面; SANE_FALSE: 应用到正面 SANE_Int app_data : 24; // APP 自定义数据 SANE_Byte count[8]; // 控制点个数,顺序为(gamma_index): Gray + Color + Red + Green + Blue SANE_Byte pt_gray[4]; // 灰度控制点 - 只记录横坐标,纵坐标请在table表中查得 SANE_Byte pt_color[4]; // 彩色控制点 - 只记录横坐标,纵坐标请在table表中查得 SANE_Byte pt_red[4]; // 红色控制点 - 只记录横坐标,纵坐标请在table表中查得 SANE_Byte pt_green[4]; // 绿色控制点 - 只记录横坐标,纵坐标请在table表中查得 SANE_Byte pt_blue[4]; // 蓝色控制点 - 只记录横坐标,纵坐标请在table表中查得 SANE_Byte table[5 * 256]; // gamma变换阵列,顺序为(gamma_index):Gray[256] + Color[256] + R[256] + G[256] + B[256] }SANE_Gamma; typedef struct _user_gamma_ex // from draft-2.0 { SANE_Int size : 16; // size of this structure SANE_Int ver : 8; // version SANE_Int count : 8; // 控制点(point数组中有效元素)个数 SANE_Int side : 4; // 0 - 应用到正反面;1 - 应用到正面;2 - 应用到反面 SANE_Int channel : 4; // 0 - 灰度曲线;1 - 彩色曲线;2 - Red通道曲线;3 - Green通道曲线;4 - Blue通道曲线 SANE_Int app_data : 24; // APP 自定义数据 SANE_Byte point[4]; // 控制点 - 只记录横坐标,纵坐标请在table表中查得 SANE_Byte table[256]; // 变换表 }SANE_Gamma_Ex; typedef struct CISTestResult { double w; //圆横轴 double h; //圆纵轴 double scaleXY; //圆3横纵比 SANE_Byte colorBlock1[3]; //彩色色块1RGB //余下保留 SANE_Byte colorBlock2[3]; //彩色色块2RGB SANE_Byte colorBlock3[3]; //彩色色块3RGB SANE_Byte colorBlock4[3]; //彩色色块4RGB SANE_Byte colorBlock5[3]; //彩色色块5RGB SANE_Byte colorBlock6[3]; //彩色色块6RGB SANE_Byte colorBlock7[3]; //彩色色块7RGB SANE_Byte colorBlock8[3]; //彩色色块8RGB SANE_Byte colorBlock9[3]; //彩色色块9RGB SANE_Byte grayBlock1; //灰度色块1灰度值 SANE_Byte grayBlock2; //灰度色块2灰度值 SANE_Byte grayBlock3; //灰度色块3灰度值 SANE_Byte grayBlock4; //灰度色块4灰度值 SANE_Byte grayBlock5; //灰度色块5灰度值 SANE_Byte grayBlock6; //灰度色块6灰度值 SANE_Byte grayBlock7; //灰度色块7灰度值 SANE_Byte grayBlock8; //灰度色块8灰度值 SANE_Byte grayBlock9; //灰度色块9灰度值 }SANE_DISTORTION_VAL;//获取畸变修正值 typedef enum { SANE_FUNCTION_PARAMETER_TYPE_STRING = 0, // SANE_String_List SANE_FUNCTION_PARAMETER_TYPE_STREAM, // SANE_Stream SANE_FUNCTION_PARAMETER_TYPE_USER_INPUT, // SANE_String }SANE_Function_Parameter_Type; typedef struct _sane_function_parameter { SANE_Function_Parameter_Type type; }SANE_Function_Parameter; typedef struct _sane_function { SANE_Int func_id; SANE_Int parameter_count; SANE_Function_Parameter parameter[1]; }SANE_Function; typedef struct _sane_img_kits { SANE_Int kit_id; SANE_String name; SANE_String title; SANE_String desc; SANE_Stream icon; SANE_Int function_count; SANE_Function function[1]; }SANE_Image_Kits; typedef enum { AUTO_COLOR_BLACKWHITE = 0, AUTO_COLOR_GRAY, }SANE_AutoColorType; typedef enum { LOG_FILE_DEVICE = 0, // 设备端日志文件 LOG_FILE_DRIVER, // 驱动层日志文件 }SANE_LogFileType; typedef enum // IO_CTRL_CODE_SET_POWER_LEVEL { SANE_POWER_FIRST = 0, SANE_POWER_NONE = SANE_POWER_FIRST, SANE_POWER_MINUTES_5, SANE_POWER_MINUTES_10, SANE_POWER_MINUTES_20, SANE_POWER_MINUTES_30, SANE_POWER_MINUTES_60, SANE_POWER_MINUTES_120, SANE_POWER_MINUTES_240, SANE_POWER_LAST, SANE_POWER_SHUTDOWN, // 关闭设备 239 设备重启和关闭设备不会触发热拔插,所以使用此命令时需要手动关闭设备和打开设备 1:rebootloader ,0:reboot SANE_POWER_RESTART, // 重启设备 }SANE_Power; typedef enum { SANE_EVENT_NONE = 0, // 无意义的回调, both data & len are NULL SANE_EVENT_SUPPORT_ASYNC_IO, // 是否支持异步IO,返回“0”支持,其它不支持。data and len unused SANE_EVENT_IS_MEMORY_ENOUGH, // 当前内存是否足够读取图片, data - unused;*len - needed size. return SCANNER_ERR_OK or SCANNER_ERR_INSUFFICIENT_MEM SANE_EVENT_NEED_AUTH, // data - (SANEAUTH*); len - unused; return none-zero to giveup SANE_EVENT_DEVICE_ARRIVED, // data - SANE_Device_Ex*; *len - sizeof(SANE_Device_Ex) SANE_EVENT_DEVICE_LEFT, // data - SANE_Device*; *len - sizeof(SANE_Device) SANE_EVENT_STATUS, // normal status description. data - (utf8*), len - unused, be NULL SANE_EVENT_ERROR, // error happens, should stop operations. data - (utf8*)description, *len - error code SANE_EVENT_WORKING, // 扫描仪正在扫描, data - (char*)description, len - unused SANE_EVENT_USB_DATA_RECEIVED, // 从USB读取到一个图片数据包,当前只用作纸张统计。data - NULL, *len - bytes SANE_EVENT_IMAGE_OK, // new image data is ready for UI. data - (SANE_Image*), *len - index of the image (ZERO base) SANE_EVENT_IMAGE_EXT_INFO_OK, // new image data is ready for UI. data - (SANE_Img_Ext_Info*), *len - index of the image (ZERO base) SANE_EVENT_SCAN_FINISHED, // 扫描仪完成扫描, data - (char*)description, *len - error code SANE_EVENT_ABOUT_INFORMATION, // APP关于信息, data - (SANE_About*), len - unused, be NULL SANE_EVENT_SCANNER_CLOSED, // 扫描仪已经关闭,data & len 同 SANE_EVENT_STATUS SANE_EVENT_IMG_UPLOADED, // APP取走一张图片, data - unused, len - count // SANE_EVENT_WIN_DEBUG_INFO, // writedown debug info on windows platform ... data - (utf8*), *len - HG_LOG_LEVEL, param - NULL !!! // ui event ... SANE_EVENT_UI_CLOSE_CANCEL = 0x1000, SANE_EVENT_UI_CLOSE_NORMAL, SANE_EVENT_UI_SCAN_COMMAND, // setting ui notify button 'scan' clicked SANE_EVENT_UI_CLOSE_SETTING, SANE_EVENT_TWAIN_XFER_READY, }SANE_Event; #pragma pack(pop) // 'start' and 'stop' will be blocked until image arrived or worker-threads stopped - 2023-11-01 // callback may return before these functions !!! // the calling program should pay more attention to this situation !!! typedef int(*sane_callback)( // 注册回调的对象,需要保证该回调是多线程安全的 SANE_Handle hdev // 产生事件的设备句柄 , int code // 回调事件代码 , void* data // 回调事件数据,根据事件代码有所不同,参照具体事件定义 , unsigned int* len // 数据长度(字节),或者event_data的缓冲区长度,详细请看相应的事件代码 , void* param // 用户自定义数据,与调用sane_init_ex传入时的保持一致 ); // 返回值依不同的事件代码而定,通常为“0” extern SANE_Status sane_init_ex(SANE_Int* version_code, sane_callback cb, void* param); enum io_code { IO_CTRL_CODE_BASE = 0x00C0DE111, IO_CTRL_CODE_TEST_SINGLE = IO_CTRL_CODE_BASE,// 单张测试扫描 data - NULL, len - NULL IO_CTRL_CODE_ABOUT_INFO, // 获取软件关于信息。data - (SANE_About*), 如果data为空或者由len指示的内存大小不足, // 则会在len中返回所需要的最小内存长度,并返回 SANE_STATUS_NO_MEM 错误 IO_CTRL_CODE_RESTORE_SETTINGS, // 恢复默认设置 data - NULL, len - NULL IO_CTRL_CODE_GET_DEFAULT_VALUE, // 获取设置项默认值 data - 同sane_control_option - SANE_ACTION_GET_VALUE时的定义, *len - [in] 设置项序号,同sane_control_option中option的值 IO_CTRL_CODE_GET_FINAL_IMAGE_FORMAT, // 获取图像处理最终输出(final())的图像数据格式 data - (SANE_FinalImgFormat*), len - bytes of data IO_CTRL_CODE_SET_FINAL_IMAGE_FORMAT, // 设置图像处理最终输出(final())的图像数据格式 data - (SANE_FinalImgFormat*), len - bytes of data IO_CTRL_CODE_GET_FINAL_COMPRESSION, // 获取支持的压缩格式,data - (SANE_Int*), to receive supported SANE_CompressionType, data[0]: supported counts, data[1]: default value, data[2]: current value; data[3...]: all supported values // *len - array length of data, or need length if it was too small IO_CTRL_CODE_SET_FINAL_COMPRESSION, // 设置图像数据最终输出的压缩格式,data - (SANE_Compression*), len - bytes of data IO_CTRL_CODE_SET_AUTO_COLOR_TYPE, // 设置自动匹配颜色模式, data - (SANE_AutoColorType*), *len - sizeof(data) IO_CTRL_CODE_SET_CLEAR_ROLLER_COUNT, // 清除滚轴计数 data - NULL, len - to receive current roller count, can be NULL IO_CTRL_CODE_SET_CLEAR_HISTORY_COUNT, // 清除历史计数 data - NULL, len - to receive current history count, can be NULL IO_CTRL_CODE_GET_DEVICE_CODE, // 获取设备编码, data - (char*), *len - bytes of data IO_CTRL_CODE_GET_PAPER_ON, // 获取进纸盘上是否有纸, data - (SANE_Bool*), *len - sizeof(SANE_Bool) data:false 无纸 true有纸 IO_CTRL_CODE_SET_POWER_LEVEL, // 设置功耗模式(休眠), data - (SANE_Power*), *len - sizeof(SANE_Power) (包括重启设备 关闭断电) IO_CTRL_CODE_GET_POWER_LEVEL, // 获取功耗模式(休眠), data - (SANE_Power*), *len - sizeof(SANE_Power) IO_CTRL_CODE_GET_CUSTOM_GAMMA, // 用于获取用户自定义gamma数值,data - SANE_Gamma*, *len - to receive current color mode IO_CTRL_CODE_SET_CUSTOM_GAMMA, // 用于设置用户自定义gamma数值,data - SANE_Gamma*, len - unused IO_CTRL_CODE_DISPLAY_APP_HELP, // 显示APP帮助文档 data - NULL, len - NULL IO_CTRL_CODE_GET_PAPER_SIZE, // 获取纸张尺寸(mm)。 data - (utf8*)paper name, *len - MAKELPARAM(w, h) IO_CTRL_CODE_GET_IMAGE_QUEUE_COUNT, // 获取图像队列的长度/数量, data - NULL, len - to receive the count IO_CTRL_CODE_CONVERT_IMAGE_FORMAT, // 图像格式转换(文件方式), data - SANE_ImageFormatConvert*, len - unused, be NULL IO_CTRL_CODE_FREE_MEMORY, // 释放由该模块分配的内存, data - 内存块,*len - 内存块长度 IO_CTRL_CODE_GET_LOG_FILE, // 获取日志文件,data - char[260],用于接收日志文件路径,返回空则获取失败;*len - 日志文件类型 SANE_LogFileType. // 返回的日志文件,如果不再使用,调用者负责删除。 IO_CTRL_CODE_GET_SCAN_ISLOCK, // 获取设备是否支持锁定设备功能,data - (SANE_Bool*), *len - sizeof(SANE_Bool) IO_CTRL_CODE_SET_SCAN_LOCK, // 设置设备锁定, data - (SANE_Bool), len - unused IO_CTRL_CODE_SET_SCAN_LOCK_CHECK_VAL, // 设置校验码 , data - (char*), *len - bytes of data IO_CTRL_CODE_SET_FIRMWARE_UPGRADE, // 设置固件升级, data - (char*), *len - bytes of data IO_CTRL_CODE_GET_HISTORY_SCAN_NUM, // 获取历史张数 data - (SANE_Int*), *len - sizeof(SANE_Int) IO_CTRL_CODE_GET_CLEAN_PAPER_ROAD, // 清除纸道 data - (SANE_Bool*), *len - sizeof(SANE_Bool) IO_CTRL_CODE_GET_ROLLER_NUM, // 获取滚轴张数 data - (SANE_Int*), *len - sizeof(SANE_Int) IO_CTRL_CODE_SET_FEEDMODE, // 设置分纸强度 data - (SANE_Int*) ,*len - sizeof(SANE_Int) data: 0 ,1 ,2) IO_CTRL_CODE_SET_SKEW_CHECK, // 设置歪斜检测 data - (SANE_Bool*), *len - sizeof(SANE_Bool) IO_CTRL_CODE_SET_SKEW_CHECK_VAL, // 设置歪斜检测值 data - (SANE_Int*), *len - sizeof(SANE_Int) IO_CTRL_CODE_GET_IS_MODE, // 获取是否计数模式 data - (SANE_Bool*), *len - sizeof(SANE_Bool) IO_CTRL_CODE_SET_ULTRASONIC_MODULE, // 设置超声波检测 data - (SANE_Bool*), *len - sizeof(SANE_Bool) IO_CTRL_CODE_SET_SPEED_MODE, // 设置速度模式 data - (SANE_Int*) ,*len - sizeof(SANE_Int) data = G100-G200:100,110,120 G300:40,50,60,70 G400:40,50,60,70,80 IO_CTRL_CODE_GET_SPEED_MODE, // 获取速度模式 data - (SANE_Int*) ,*len - sizeof(SANE_Int) IO_CTRL_CODE_SET_CIS_IMAGE, // 获取CIS原图 data - (SANE_Bool*), *len - sizeof(SANE_Bool) IO_CTRL_CODE_GET_IMAGE, // 批量扫描 data - NULL,*len-NULL IO_CTRL_CODE_SET_DISTORTION_IMAGE, // 设置畸变校正图 data - NULL,*len-NULL IO_CTRL_CODE_GET_PC_DISTORTION_CHECK_VAL, // 获取PC计算畸变校正值 data - (SANE_DISTORTION_VAL*) ,*len - sizeof(SANE_DISTORTION_VAL) //通过PC算法计算获取的畸变值 IO_CTRL_CODE_SET_DISTORTION_DEVS_CHECK_VAL, // 设置设备畸变值 data - (float*) ,*len - sizeof(float) IO_CTRL_CODE_GET_DISTORTION_DEVS_CHECK_VAL, // 获取设备畸变值 data - (float*) ,*len - sizeof(float) IO_CTRL_CODE_SET_DEVS_REBOOT, // 设置设备重启 data - (SANE_Int*) ,*len - sizeof(SANE_Int) data 1:loader,data 0:普通重启 IO_CTRL_CODE_SET_AUTO_FALT, // 设置自动平场校正 data - (int *),*len - sizeof(SANE_Int) // data:0(ALL) 1(200dpi、gray) 2(200dpi、color) 3(300dpi、gray) 4(300dpi、color) 5(600dpi、gray) 6(600dpi、color) IO_CTRL_CODE_SET_COLOR, // 设置颜色 data - (char*), *len - bytes of data IO_CTRL_CODE_SET_DPI, // 设置DPI data - (int *) *len - sizeof(int) ///////////////////////固定的硬件信息////////////// IO_CTRL_CODE_SET_VIDPID, // 设置VID PID, data - (int *) *len - sizeof(int) IO_CTRL_CODE_GET_VIDPID, // 获取VID PID, data - (int *) *len - sizeof(int) IO_CTRL_CODE_SET_SERIAL, // 设置设备序列号 data - (char*), *len - bytes of data IO_CTRL_CODE_GET_SERIAL, // 获取设备序列号, data - (char*), *len - bytes of data IO_CTRL_CODE_GET_HARDWARE_VERSION, // 获取硬件版本号, data - (char*), *len - bytes of data IO_CTRL_CODE_GET_IP, // 获取设备IP, data - (char*), *len - bytes of data IO_CTRL_CODE_SET_DEVS_MODEL, // 获取设备型号, data - (char*), *len - bytes of data IO_CTRL_CODE_GET_DEVS_MODEL, // 设置设备型号, data - (char*), *len - bytes of data ///////////////////////未使用//////////////暂时保留 IO_CTRL_CODE_GET_SCAN_WHEN_PAPER_ON, //获取是否带纸扫描 IO_CTRL_CODE_SET_SCAN_WHEN_PAPER_ON, //设置带纸扫描 IO_CTRL_CODE_GET_SCAN_WITH_HOLE, //获取是否穿孔移除 IO_CTRL_CODE_SET_SCAN_WITH_HOLE, //设置穿孔移除 // all control code must be less than the following value IO_CTRL_CODE_LAST = 0x10000000, }; // Function: 直接访问控制 // // Parameter: h - hg_open_scanner打开的设备句柄 // // code - 控制码 // // data - 用户分配的内存,对应于控制码的原始数据 // // len - data中数据长度。如果是获取操作时,长度小于所需要的长度,则返回需要的长度且返回 E_INSUFFICIENTMEM 的错误 // // Return: 错误码 extern SANE_Status sane_io_control(SANE_Handle h, unsigned long code, void* data, unsigned* len); // Function: 获取错误描述 // // Parameters: err - 其它SANE函数返回的错误代码 // // Return: 错误描述信息(UTF-8),调用者应立即使用,无须释放 extern const char* sane_err_desc(SANE_Status err); // Function: 读取刚刚(调用sane_get_parameters后)获取的图片的扩展信息 // // Parameter: ext_info - 用户分配的用户获取扩展信息的内存地址 // // len - [in]: ext_info 空间大小; [out] - ext_info中实际存储的字节数,或者空间不足时需要的最小字节数 // // Return: 错误码:SANE_STATUS_GOOD - 成功获取到图像扩展信息 // SANE_STATUS_NO_DOCS - 该图片没有扩展信息 // SANE_STATUS_NO_MEM - 空间不足,最小空间已经存储在参数len中 // SANE_STATUS_UNSUPPORTED - 当前版本不支持该项操作 extern SANE_Status sane_read_ext_info(SANE_Img_Ext_Info* ext_info, SANE_Int* len); // for ui interface typedef struct _sane_api { SANE_Status (*sane_get_devices_api)(const SANE_Device*** device_list, SANE_Bool local_only); SANE_Status (*sane_open_api)(SANE_String_Const devicename, SANE_Handle* handle); void (* sane_close_api)(SANE_Handle handle); const SANE_Option_Descriptor* (*sane_get_option_descriptor_api)(SANE_Handle handle, SANE_Int option); SANE_Status (*sane_control_option_api)(SANE_Handle handle, SANE_Int option, SANE_Action action, void* value, SANE_Int* info); SANE_Status (*sane_get_parameters_api)(SANE_Handle handle, SANE_Parameters* params); SANE_Status (*sane_start_api)(SANE_Handle handle); SANE_Status (*sane_read_api)(SANE_Handle handle, SANE_Byte* data, SANE_Int max_length, SANE_Int* length); void (*sane_cancel_api)(SANE_Handle handle); SANE_Status (*sane_set_io_mode_api)(SANE_Handle handle, SANE_Bool non_blocking); SANE_Status (*sane_get_select_fd_api)(SANE_Handle handle, SANE_Int* fd); SANE_String_Const (*sane_strstatus_api)(SANE_Status status); SANE_Status (*sane_io_control_api)(SANE_Handle h, unsigned long code, void* data, unsigned* len); SANE_Status (*sane_init_api)(SANE_Int* version_code, SANE_Auth_Callback authorize); void (*sane_exit_api)(void); }SANEAPI, *LPSANEAPI; #ifdef __cplusplus } #endif //#include // //template //std::string format_string(int level, const char* fmt, Args ... args) //{ // size_t size = snprintf(nullptr, 0, fmt, args ...) + 2; // std::string str(size); // // snprintf(&str[0], size, fmt, args ...); // // return std::move(str); //} #endif /* sane_ex_h */