621 lines
33 KiB
C
621 lines
33 KiB
C
/* 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
|
||
|
||
|
||
#include <base/plat_types.h>
|
||
#include "sane_name.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
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 用户权限
|
||
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
|
||
};
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// 属性相关
|
||
#include "sane.h"
|
||
|
||
#define MAX_STRING_LEN 256
|
||
|
||
#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文本
|
||
SANE_ACTION_GET_ALL_VALUES, // 获取该属性所有值,see SANE_Value_Index.
|
||
|
||
// Function: 枚举对SANE协议不可见的固定ID属性(以使TWAIN可访问)
|
||
//
|
||
// Parameter: void* = FIXDCB*
|
||
SANE_ACTION_ENUM_INVISIBLE_FIX_ID = 0x0FEC7,
|
||
};
|
||
|
||
enum SANE_Value_Index // when get constrainted value list, the index of special value. DO NOT change their sequence !!!
|
||
{
|
||
SANE_VAL_IND_CURRENT = 0, // current value
|
||
SANE_VAL_IND_DEFAULT,
|
||
SANE_VAL_IND_LIST_0, // the first value of list
|
||
SANE_VAL_IND_RANGE_LOWER = SANE_VAL_IND_LIST_0, // lower value of range
|
||
SANE_VAL_IND_RANGE_UPPER,
|
||
SANE_VAL_IND_RANGE_STEP,
|
||
};
|
||
|
||
enum SANE_Frame_Ex // after SANE_Frame
|
||
{
|
||
SANE_FRAME_RAW = 100,
|
||
SANE_FRAME_MIME, // MIME descriptor
|
||
SANE_FRAME_JPEG,
|
||
SANE_FRAME_PNG,
|
||
};
|
||
|
||
// 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
|
||
|
||
#endif /* sane_ex_h */
|