2023-12-01 09:17:09 +00:00
/* 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 <base/plat_types.h>
# 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
2023-12-19 07:27:16 +00:00
# define SANE_FULL_NAME(n) SANE_STD_OPT_NAME_##n
2023-12-01 09:17:09 +00:00
//
// 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
2023-12-20 08:44:39 +00:00
# define SANE_STD_OPT_NAME_DOUBLE_CHECK "double-chk"
2023-12-01 09:17:09 +00:00
# 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" // 公司地图定位
2024-01-05 09:36:50 +00:00
# define SANE_STD_OPT_NAME_USER_NAME "user-name" // 登录账号
# define SANE_STD_OPT_NAME_USER_PASSWORD "user-pwd" // 登录密码
2023-12-01 09:17:09 +00:00
# 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*
2024-01-05 09:36:50 +00:00
# define SANE_STD_OPT_NAME_FPGA_VER "fpga-ver" // CIS控制器( FPGA) 版本, data = char*
2023-12-01 09:17:09 +00:00
# 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" // 设备的初始开机时间
2024-01-17 08:54:06 +00:00
# define SANE_STD_OPT_NAME_DUMP_IMG "dump-img" // 是否输出算法各阶段中间图像
2023-12-01 09:17:09 +00:00
# define SANE_STD_OPT_NAME_DUMP_IMG_PATH "dump-path" // 中间图像输出路径
2024-01-09 06:26:46 +00:00
# define SANE_STD_OPT_NAME_CIS_LENGTH "cis-len" // CIS 长度(采集图像的最大宽度)
2023-12-01 09:17:09 +00:00
// 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
//
2023-12-19 07:27:16 +00:00
// PART III: inner option on device
2024-01-16 09:51:34 +00:00
# define SANE_STD_OPT_NAME_CIS_MODE "cis-mode"
# define SANE_STD_OPT_NAME_CIS_DPI "cis-dpi"
2023-12-19 07:27:16 +00:00
# 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"
2024-01-13 09:14:12 +00:00
# define SANE_STD_OPT_NAME_CIS_SP "cis-sp"
2023-12-19 07:27:16 +00:00
# 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"
2024-01-13 09:14:12 +00:00
# define SANE_STD_OPT_NAME_CIS_STRETCH_H "stretch-h"
# define SANE_STD_OPT_NAME_CIS_STRETCH_V "stretch-v"
2023-12-20 08:44:39 +00:00
# define SANE_STD_OPT_NAME_MOTOR_SPEED "motor-speed"
2023-12-01 09:17:09 +00:00
//
// 借鉴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 ,
2024-01-05 09:36:50 +00:00
SANE_OPT_ID_USER_NAME = 0x9905 ,
SANE_OPT_ID_USER_PASSWORD = 0x9906 ,
2023-12-01 09:17:09 +00:00
} ;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# include "sane.h"
# include <math.h>
# 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 <string>
//
//template<typename ... Args>
//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 */