newtx/sdk/sane/sane_ex.h

927 lines
52 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* 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 characterthen
the default directoriesare searched after the explicitly specified directories. For examplesetting 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
#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 <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, // 获取属性的固定IDvoid* = 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) datafalse 无纸 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 */