1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy. 2141cc406Sopenharmony_ci Copyright (C) 2007 Jeremy Johnson 3141cc406Sopenharmony_ci This file is part of a SANE backend for Ricoh IS450 4141cc406Sopenharmony_ci and IS420 family of HS2P Scanners using the SCSI controller. 5141cc406Sopenharmony_ci 6141cc406Sopenharmony_ci This file is part of the SANE package. 7141cc406Sopenharmony_ci 8141cc406Sopenharmony_ci This program is free software; you can redistribute it and/or 9141cc406Sopenharmony_ci modify it under the terms of the GNU General Public License as 10141cc406Sopenharmony_ci published by the Free Software Foundation; either version 2 of the 11141cc406Sopenharmony_ci License, or (at your option) any later version. 12141cc406Sopenharmony_ci 13141cc406Sopenharmony_ci This program is distributed in the hope that it will be useful, but 14141cc406Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 15141cc406Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16141cc406Sopenharmony_ci General Public License for more details. 17141cc406Sopenharmony_ci 18141cc406Sopenharmony_ci You should have received a copy of the GNU General Public License 19141cc406Sopenharmony_ci along with this program. If not, see <https://www.gnu.org/licenses/>. 20141cc406Sopenharmony_ci 21141cc406Sopenharmony_ci As a special exception, the authors of SANE give permission for 22141cc406Sopenharmony_ci additional uses of the libraries contained in this release of SANE. 23141cc406Sopenharmony_ci 24141cc406Sopenharmony_ci The exception is that, if you link a SANE library with other files 25141cc406Sopenharmony_ci to produce an executable, this does not by itself cause the 26141cc406Sopenharmony_ci resulting executable to be covered by the GNU General Public 27141cc406Sopenharmony_ci License. Your use of that executable is in no way restricted on 28141cc406Sopenharmony_ci account of linking the SANE library code into it. 29141cc406Sopenharmony_ci 30141cc406Sopenharmony_ci This exception does not, however, invalidate any other reasons why 31141cc406Sopenharmony_ci the executable file might be covered by the GNU General Public 32141cc406Sopenharmony_ci License. 33141cc406Sopenharmony_ci 34141cc406Sopenharmony_ci If you submit changes to SANE to the maintainers to be included in 35141cc406Sopenharmony_ci a subsequent release, you agree by submitting the changes that 36141cc406Sopenharmony_ci those changes may be distributed with this exception intact. 37141cc406Sopenharmony_ci 38141cc406Sopenharmony_ci If you write modifications of your own for SANE, it is your choice 39141cc406Sopenharmony_ci whether to permit this exception to apply to your modifications. 40141cc406Sopenharmony_ci If you do not wish that, delete this exception notice. 41141cc406Sopenharmony_ci 42141cc406Sopenharmony_ci*/ 43141cc406Sopenharmony_ci/* SANE-FLOW-DIAGRAM 44141cc406Sopenharmony_ci 45141cc406Sopenharmony_ci - sane_init() : initialize backend, attach scanners 46141cc406Sopenharmony_ci . - sane_get_devices() : query list of scanner-devices 47141cc406Sopenharmony_ci . - sane_open() : open a particular scanner-device 48141cc406Sopenharmony_ci . . - attach : to the device 49141cc406Sopenharmony_ci . . . init_options : initialize SANE_OPTIONS array 50141cc406Sopenharmony_ci . . - sane_set_io_mode : set blocking-mode 51141cc406Sopenharmony_ci . . - sane_get_select_fd : get scanner-fd 52141cc406Sopenharmony_ci . . - sane_get_option_descriptor() : get option information 53141cc406Sopenharmony_ci . . - sane_control_option() : change option values 54141cc406Sopenharmony_ci . . 55141cc406Sopenharmony_ci . . - sane_start() : start image acquisition 56141cc406Sopenharmony_ci . . - sane_get_parameters() : returns actual scan-parameters 57141cc406Sopenharmony_ci . . - sane_read() : read image-data (from pipe) 58141cc406Sopenharmony_ci . . 59141cc406Sopenharmony_ci . . - sane_cancel() : cancel operation 60141cc406Sopenharmony_ci . - sane_close() : close opened scanner-device 61141cc406Sopenharmony_ci - sane_exit() : terminate use of backend 62141cc406Sopenharmony_ci*/ 63141cc406Sopenharmony_ci#define BUILD 1 64141cc406Sopenharmony_ci 65141cc406Sopenharmony_ci/* Begin includes */ 66141cc406Sopenharmony_ci#include "../include/sane/config.h" 67141cc406Sopenharmony_ci 68141cc406Sopenharmony_ci#include <limits.h> 69141cc406Sopenharmony_ci#include <stdlib.h> 70141cc406Sopenharmony_ci#include <stdarg.h> 71141cc406Sopenharmony_ci#include <string.h> 72141cc406Sopenharmony_ci#include <sys/time.h> 73141cc406Sopenharmony_ci#include <errno.h> 74141cc406Sopenharmony_ci#include <fcntl.h> 75141cc406Sopenharmony_ci#include <ctype.h> 76141cc406Sopenharmony_ci#include <stdio.h> 77141cc406Sopenharmony_ci#include <unistd.h> 78141cc406Sopenharmony_ci#include <sys/types.h> 79141cc406Sopenharmony_ci 80141cc406Sopenharmony_ci#include "../include/sane/sane.h" 81141cc406Sopenharmony_ci#include "../include/sane/saneopts.h" 82141cc406Sopenharmony_ci#include "../include/sane/sanei_scsi.h" 83141cc406Sopenharmony_ci#include "../include/sane/sanei_config.h" 84141cc406Sopenharmony_ci#include "../include/sane/sanei_thread.h" 85141cc406Sopenharmony_ci 86141cc406Sopenharmony_ci#define BACKEND_NAME hs2p 87141cc406Sopenharmony_ci#include "../include/sane/sanei_backend.h" 88141cc406Sopenharmony_ci 89141cc406Sopenharmony_ci#ifndef PATH_MAX 90141cc406Sopenharmony_ci# define PATH_MAX 1024 91141cc406Sopenharmony_ci#endif 92141cc406Sopenharmony_ci 93141cc406Sopenharmony_ci#include "hs2p-scsi.c" 94141cc406Sopenharmony_ci 95141cc406Sopenharmony_ci/* Begin macros */ 96141cc406Sopenharmony_ci#define MIN(x,y) ((x)<(y) ? (x) : (y)) 97141cc406Sopenharmony_ci#define MAX(x,y) ((x)>(y) ? (x) : (y)) 98141cc406Sopenharmony_ci 99141cc406Sopenharmony_ci/* Begin static constants */ 100141cc406Sopenharmony_cistatic int num_devices = 0; 101141cc406Sopenharmony_cistatic HS2P_Device *first_dev = NULL; 102141cc406Sopenharmony_cistatic HS2P_Scanner *first_handle = NULL; 103141cc406Sopenharmony_ci 104141cc406Sopenharmony_cistatic SANE_Char inquiry_data[255] = "HS2P scanner"; 105141cc406Sopenharmony_ci/* 106141cc406Sopenharmony_cistatic SANE_Int disable_optional_frames = 0; 107141cc406Sopenharmony_cistatic SANE_Int fake_inquiry = 0; 108141cc406Sopenharmony_ci*/ 109141cc406Sopenharmony_ci 110141cc406Sopenharmony_cistatic HS2P_HWEntry HS2P_Device_List[] = { 111141cc406Sopenharmony_ci {"RICOH", "IS450"}, 112141cc406Sopenharmony_ci {"RICOH", "IS430"}, /*untested */ 113141cc406Sopenharmony_ci {"RICOH", "IS420"}, /*untested */ 114141cc406Sopenharmony_ci {"RICOH", "IS01"}, /*untested */ 115141cc406Sopenharmony_ci {"RICOH", "IS02"}, /*untested */ 116141cc406Sopenharmony_ci {NULL, NULL} /*sentinel */ 117141cc406Sopenharmony_ci}; 118141cc406Sopenharmony_ci 119141cc406Sopenharmony_ci#if 0 120141cc406Sopenharmony_cistatic int 121141cc406Sopenharmony_ciallblank (const char *s) 122141cc406Sopenharmony_ci{ 123141cc406Sopenharmony_ci while (s && *s) 124141cc406Sopenharmony_ci if (!isspace (*s++)) 125141cc406Sopenharmony_ci return 0; 126141cc406Sopenharmony_ci 127141cc406Sopenharmony_ci return 1; 128141cc406Sopenharmony_ci} 129141cc406Sopenharmony_ci#endif 130141cc406Sopenharmony_ci 131141cc406Sopenharmony_cistatic size_t 132141cc406Sopenharmony_cimax_string_size (SANE_String_Const strings[]) 133141cc406Sopenharmony_ci{ 134141cc406Sopenharmony_ci size_t size, max_size = 0; 135141cc406Sopenharmony_ci int i; 136141cc406Sopenharmony_ci DBG (DBG_proc, ">> max_string_size\n"); 137141cc406Sopenharmony_ci 138141cc406Sopenharmony_ci for (i = 0; strings[i]; ++i) 139141cc406Sopenharmony_ci { 140141cc406Sopenharmony_ci size = strlen (strings[i]) + 1; 141141cc406Sopenharmony_ci if (size > max_size) 142141cc406Sopenharmony_ci max_size = size; 143141cc406Sopenharmony_ci } 144141cc406Sopenharmony_ci 145141cc406Sopenharmony_ci DBG (DBG_proc, "<< max_string_size\n"); 146141cc406Sopenharmony_ci return max_size; 147141cc406Sopenharmony_ci} 148141cc406Sopenharmony_ci 149141cc406Sopenharmony_cistatic void 150141cc406Sopenharmony_citrim_spaces (char *s, size_t n) 151141cc406Sopenharmony_ci{ 152141cc406Sopenharmony_ci for (s += (n - 1); n > 0; n--, s--) 153141cc406Sopenharmony_ci { 154141cc406Sopenharmony_ci if (*s && !isspace (*s)) 155141cc406Sopenharmony_ci break; 156141cc406Sopenharmony_ci *s = '\0'; 157141cc406Sopenharmony_ci } 158141cc406Sopenharmony_ci} 159141cc406Sopenharmony_cistatic SANE_Bool 160141cc406Sopenharmony_ciis_device_supported (char *device) 161141cc406Sopenharmony_ci{ 162141cc406Sopenharmony_ci HS2P_HWEntry *hw; 163141cc406Sopenharmony_ci 164141cc406Sopenharmony_ci for (hw = &HS2P_Device_List[0]; hw->mfg != NULL; hw++) 165141cc406Sopenharmony_ci if (strncmp (device, hw->model, strlen (hw->model)) == 0) 166141cc406Sopenharmony_ci break; /* found a match */ 167141cc406Sopenharmony_ci 168141cc406Sopenharmony_ci return (hw == NULL) ? SANE_FALSE : SANE_TRUE; 169141cc406Sopenharmony_ci} 170141cc406Sopenharmony_ci 171141cc406Sopenharmony_cistatic SANE_Int 172141cc406Sopenharmony_ciget_list_index (const char *list[], char *s) /* sequential search */ 173141cc406Sopenharmony_ci{ 174141cc406Sopenharmony_ci SANE_Int i; 175141cc406Sopenharmony_ci 176141cc406Sopenharmony_ci for (i = 0; list[i]; i++) 177141cc406Sopenharmony_ci if (strcmp (s, list[i]) == 0) 178141cc406Sopenharmony_ci return i; /* FOUND */ 179141cc406Sopenharmony_ci 180141cc406Sopenharmony_ci /* unknown paper_list strings are treated as 'custom' */ 181141cc406Sopenharmony_ci /* unknown compression_list strings are treated as 'none' */ 182141cc406Sopenharmony_ci /* unknown scan_source_list strings are treated as 'ADF' */ 183141cc406Sopenharmony_ci return 0; 184141cc406Sopenharmony_ci} 185141cc406Sopenharmony_ci 186141cc406Sopenharmony_cistatic SANE_Int 187141cc406Sopenharmony_ciget_val_id_strndx (struct val_id *vi, int len, SANE_Int val) 188141cc406Sopenharmony_ci{ 189141cc406Sopenharmony_ci int i; 190141cc406Sopenharmony_ci for (i = 0; i < len; i++) 191141cc406Sopenharmony_ci if (vi[i].val == val) 192141cc406Sopenharmony_ci return vi[i].id; /* FOUND */ 193141cc406Sopenharmony_ci return vi[0].id; /* NOT FOUND so let's default to first */ 194141cc406Sopenharmony_ci} 195141cc406Sopenharmony_ci 196141cc406Sopenharmony_cistatic SANE_Status 197141cc406Sopenharmony_ciinit_options (HS2P_Scanner * s) 198141cc406Sopenharmony_ci{ 199141cc406Sopenharmony_ci SANE_Int i; 200141cc406Sopenharmony_ci DBG (DBG_proc, ">> init_options\n"); 201141cc406Sopenharmony_ci 202141cc406Sopenharmony_ci memset (s->opt, 0, sizeof (s->opt)); 203141cc406Sopenharmony_ci memset (s->val, 0, sizeof (s->val)); 204141cc406Sopenharmony_ci 205141cc406Sopenharmony_ci for (i = 0; i < NUM_OPTIONS; ++i) 206141cc406Sopenharmony_ci { 207141cc406Sopenharmony_ci s->opt[i].size = sizeof (SANE_Word); 208141cc406Sopenharmony_ci s->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 209141cc406Sopenharmony_ci } 210141cc406Sopenharmony_ci 211141cc406Sopenharmony_ci s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS; 212141cc406Sopenharmony_ci s->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS; 213141cc406Sopenharmony_ci s->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT; 214141cc406Sopenharmony_ci s->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT; 215141cc406Sopenharmony_ci s->val[OPT_NUM_OPTS].w = NUM_OPTIONS; 216141cc406Sopenharmony_ci 217141cc406Sopenharmony_ci 218141cc406Sopenharmony_ci /* 219141cc406Sopenharmony_ci * "Scan Mode" GROUP: 220141cc406Sopenharmony_ci */ 221141cc406Sopenharmony_ci s->opt[OPT_MODE_GROUP].name = ""; 222141cc406Sopenharmony_ci s->opt[OPT_MODE_GROUP].title = SANE_TITLE_SCAN_MODE_GROUP; 223141cc406Sopenharmony_ci s->opt[OPT_MODE_GROUP].desc = ""; 224141cc406Sopenharmony_ci s->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP; 225141cc406Sopenharmony_ci s->opt[OPT_MODE_GROUP].cap = 0; 226141cc406Sopenharmony_ci s->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE; 227141cc406Sopenharmony_ci 228141cc406Sopenharmony_ci /* Preview: */ 229141cc406Sopenharmony_ci s->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW; 230141cc406Sopenharmony_ci s->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW; 231141cc406Sopenharmony_ci s->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW; 232141cc406Sopenharmony_ci s->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL; 233141cc406Sopenharmony_ci s->opt[OPT_PREVIEW].constraint_type = SANE_CONSTRAINT_NONE; 234141cc406Sopenharmony_ci s->val[OPT_PREVIEW].w = SANE_FALSE; 235141cc406Sopenharmony_ci 236141cc406Sopenharmony_ci /* Inquiry */ 237141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].name = SANE_NAME_INQUIRY; 238141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].title = SANE_TITLE_INQUIRY; 239141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].desc = SANE_DESC_INQUIRY; 240141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].type = SANE_TYPE_STRING; 241141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].size = sizeof (inquiry_data); 242141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].constraint_type = SANE_CONSTRAINT_NONE; 243141cc406Sopenharmony_ci s->val[OPT_INQUIRY].s = strdup (inquiry_data); 244141cc406Sopenharmony_ci s->opt[OPT_INQUIRY].cap = SANE_CAP_SOFT_DETECT; /* Display Only */ 245141cc406Sopenharmony_ci 246141cc406Sopenharmony_ci /* Scan mode */ 247141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].name = SANE_NAME_SCAN_MODE; 248141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].title = SANE_TITLE_SCAN_MODE; 249141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].desc = SANE_DESC_SCAN_MODE; 250141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].type = SANE_TYPE_STRING; 251141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 252141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].size = 253141cc406Sopenharmony_ci max_string_size ((SANE_String_Const *) scan_mode_list); 254141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST; 255141cc406Sopenharmony_ci s->opt[OPT_SCAN_MODE].constraint.string_list = 256141cc406Sopenharmony_ci (SANE_String_Const *) & scan_mode_list[0]; 257141cc406Sopenharmony_ci s->val[OPT_SCAN_MODE].s = strdup (scan_mode_list[0]); 258141cc406Sopenharmony_ci s->image_composition = LINEART; 259141cc406Sopenharmony_ci 260141cc406Sopenharmony_ci /* Standard resolutions */ 261141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].name = "std-" SANE_NAME_SCAN_RESOLUTION; 262141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].title = "Std-" SANE_TITLE_SCAN_RESOLUTION; 263141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].desc = "Std " SANE_DESC_SCAN_RESOLUTION; 264141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].type = SANE_TYPE_INT; 265141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI; 266141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST; 267141cc406Sopenharmony_ci s->opt[OPT_RESOLUTION].constraint.word_list = s->hw->info.resStdList; 268141cc406Sopenharmony_ci s->val[OPT_RESOLUTION].w = s->hw->info.default_res; 269141cc406Sopenharmony_ci 270141cc406Sopenharmony_ci /* X Resolution */ 271141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION; 272141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].title = SANE_TITLE_SCAN_X_RESOLUTION; 273141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].desc = "X " SANE_DESC_SCAN_RESOLUTION; 274141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].type = SANE_TYPE_INT; 275141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].unit = SANE_UNIT_DPI; 276141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE; 277141cc406Sopenharmony_ci s->opt[OPT_X_RESOLUTION].constraint.range = &(s->hw->info.xres_range); 278141cc406Sopenharmony_ci s->val[OPT_X_RESOLUTION].w = s->hw->info.resBasicX; 279141cc406Sopenharmony_ci 280141cc406Sopenharmony_ci /* Y Resolution */ 281141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].name = SANE_NAME_SCAN_Y_RESOLUTION; 282141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].title = SANE_TITLE_SCAN_Y_RESOLUTION; 283141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].desc = "Y " SANE_DESC_SCAN_RESOLUTION; 284141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].type = SANE_TYPE_INT; 285141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].unit = SANE_UNIT_DPI; 286141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE; 287141cc406Sopenharmony_ci s->opt[OPT_Y_RESOLUTION].constraint.range = &(s->hw->info.yres_range); 288141cc406Sopenharmony_ci s->val[OPT_Y_RESOLUTION].w = s->hw->info.resBasicY; 289141cc406Sopenharmony_ci 290141cc406Sopenharmony_ci /* Compression */ 291141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].name = SANE_NAME_COMPRESSION; 292141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].title = SANE_TITLE_COMPRESSION; 293141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].desc = SANE_DESC_COMPRESSION; 294141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].type = SANE_TYPE_STRING; 295141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 296141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].size = 297141cc406Sopenharmony_ci max_string_size ((SANE_String_Const *) compression_list); 298141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].constraint_type = SANE_CONSTRAINT_STRING_LIST; 299141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].constraint.string_list = 300141cc406Sopenharmony_ci (SANE_String_Const *) & compression_list[0]; 301141cc406Sopenharmony_ci s->val[OPT_COMPRESSION].s = strdup (compression_list[0]); 302141cc406Sopenharmony_ci if (s->hw->info.supports_MH == SANE_FALSE || /* MH G3 1-D */ 303141cc406Sopenharmony_ci s->hw->info.supports_MR == SANE_FALSE || /* MR G3 2-D */ 304141cc406Sopenharmony_ci s->hw->info.supports_MMR == SANE_FALSE || /* MMR G4 2-D */ 305141cc406Sopenharmony_ci s->hw->info.supports_MHB == SANE_FALSE) /* MH byte boundary */ 306141cc406Sopenharmony_ci { 307141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].cap |= SANE_CAP_INACTIVE; 308141cc406Sopenharmony_ci } 309141cc406Sopenharmony_ci 310141cc406Sopenharmony_ci 311141cc406Sopenharmony_ci 312141cc406Sopenharmony_ci /* 313141cc406Sopenharmony_ci * "Geometry" GROUP: 314141cc406Sopenharmony_ci */ 315141cc406Sopenharmony_ci s->opt[OPT_GEOMETRY_GROUP].name = ""; 316141cc406Sopenharmony_ci s->opt[OPT_GEOMETRY_GROUP].title = SANE_TITLE_GEOMETRY_GROUP; 317141cc406Sopenharmony_ci s->opt[OPT_GEOMETRY_GROUP].desc = ""; 318141cc406Sopenharmony_ci s->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP; 319141cc406Sopenharmony_ci s->opt[OPT_GEOMETRY_GROUP].cap = 0; 320141cc406Sopenharmony_ci s->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE; 321141cc406Sopenharmony_ci 322141cc406Sopenharmony_ci /* Auto Size Recognition available if IPU installed */ 323141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].name = SANE_NAME_AUTO_SIZE; 324141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].title = SANE_TITLE_AUTO_SIZE; 325141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].desc = SANE_DESC_AUTO_SIZE; 326141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].type = SANE_TYPE_BOOL; 327141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 328141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].constraint_type = SANE_CONSTRAINT_NONE; 329141cc406Sopenharmony_ci s->val[OPT_AUTO_SIZE].w = SANE_FALSE; 330141cc406Sopenharmony_ci if (!s->hw->info.supports_sizerecognition) 331141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].cap |= SANE_CAP_INACTIVE; 332141cc406Sopenharmony_ci 333141cc406Sopenharmony_ci /* Pad short documents to requested length with white space */ 334141cc406Sopenharmony_ci s->opt[OPT_PADDING].name = SANE_NAME_PADDING; 335141cc406Sopenharmony_ci s->opt[OPT_PADDING].title = SANE_TITLE_PADDING; 336141cc406Sopenharmony_ci s->opt[OPT_PADDING].desc = SANE_DESC_PADDING; 337141cc406Sopenharmony_ci s->opt[OPT_PADDING].type = SANE_TYPE_BOOL; 338141cc406Sopenharmony_ci s->opt[OPT_PADDING].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 339141cc406Sopenharmony_ci s->opt[OPT_PADDING].constraint_type = SANE_CONSTRAINT_NONE; 340141cc406Sopenharmony_ci s->val[OPT_PADDING].w = SANE_TRUE; 341141cc406Sopenharmony_ci /*if (!s->hw->info.hasADF) 342141cc406Sopenharmony_ci s->opt[OPT_PADDING].cap |= SANE_CAP_INACTIVE; 343141cc406Sopenharmony_ci FIXME: compare to user setting, not the existence of FB? 344141cc406Sopenharmony_ci if (!strcmp (scan_source_list, "FB")) 345141cc406Sopenharmony_ci s->opt[OPT_PADDING].cap |= SANE_CAP_INACTIVE; */ 346141cc406Sopenharmony_ci /* Permanently disable OPT_PADDING */ 347141cc406Sopenharmony_ci s->opt[OPT_PADDING].cap |= SANE_CAP_INACTIVE; 348141cc406Sopenharmony_ci 349141cc406Sopenharmony_ci /* Paper Orientation */ 350141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].name = SANE_NAME_ORIENTATION; 351141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].title = SANE_TITLE_ORIENTATION; 352141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].desc = SANE_DESC_ORIENTATION; 353141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].type = SANE_TYPE_STRING; 354141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].size = max_string_size (orientation_list); 355141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].constraint_type = SANE_CONSTRAINT_STRING_LIST; 356141cc406Sopenharmony_ci s->opt[OPT_PAGE_ORIENTATION].constraint.string_list = &orientation_list[0]; 357141cc406Sopenharmony_ci s->val[OPT_PAGE_ORIENTATION].s = strdup (orientation_list[0]); 358141cc406Sopenharmony_ci 359141cc406Sopenharmony_ci /* Paper Size */ 360141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].name = SANE_NAME_PAPER_SIZE; 361141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].title = SANE_TITLE_PAPER_SIZE; 362141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].desc = SANE_DESC_PAPER_SIZE; 363141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].type = SANE_TYPE_STRING; 364141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].size = max_string_size (paper_list); 365141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].constraint_type = SANE_CONSTRAINT_STRING_LIST; 366141cc406Sopenharmony_ci s->opt[OPT_PAPER_SIZE].constraint.string_list = &paper_list[0]; 367141cc406Sopenharmony_ci s->val[OPT_PAPER_SIZE].s = strdup (paper_list[0]); 368141cc406Sopenharmony_ci 369141cc406Sopenharmony_ci /* top-left x */ 370141cc406Sopenharmony_ci s->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X; 371141cc406Sopenharmony_ci s->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X; 372141cc406Sopenharmony_ci s->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X; 373141cc406Sopenharmony_ci s->opt[OPT_TL_X].type = SANE_TYPE_FIXED; 374141cc406Sopenharmony_ci s->opt[OPT_TL_X].unit = SANE_UNIT_MM; 375141cc406Sopenharmony_ci s->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE; 376141cc406Sopenharmony_ci s->opt[OPT_TL_X].constraint.range = &(s->hw->info.x_range); 377141cc406Sopenharmony_ci s->val[OPT_TL_X].w = SANE_FIX (0.0); 378141cc406Sopenharmony_ci 379141cc406Sopenharmony_ci /* top-left y */ 380141cc406Sopenharmony_ci s->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y; 381141cc406Sopenharmony_ci s->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y; 382141cc406Sopenharmony_ci s->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y; 383141cc406Sopenharmony_ci s->opt[OPT_TL_Y].type = SANE_TYPE_FIXED; 384141cc406Sopenharmony_ci s->opt[OPT_TL_Y].unit = SANE_UNIT_MM; 385141cc406Sopenharmony_ci s->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE; 386141cc406Sopenharmony_ci s->opt[OPT_TL_Y].constraint.range = &(s->hw->info.y_range); 387141cc406Sopenharmony_ci s->val[OPT_TL_Y].w = SANE_FIX (0.0); 388141cc406Sopenharmony_ci 389141cc406Sopenharmony_ci /* bottom-right x */ 390141cc406Sopenharmony_ci s->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X; 391141cc406Sopenharmony_ci s->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X; 392141cc406Sopenharmony_ci s->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X; 393141cc406Sopenharmony_ci s->opt[OPT_BR_X].type = SANE_TYPE_FIXED; 394141cc406Sopenharmony_ci s->opt[OPT_BR_X].unit = SANE_UNIT_MM; 395141cc406Sopenharmony_ci s->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE; 396141cc406Sopenharmony_ci s->opt[OPT_BR_X].constraint.range = &(s->hw->info.x_range); 397141cc406Sopenharmony_ci s->val[OPT_BR_X].w = s->hw->info.x_range.max; 398141cc406Sopenharmony_ci 399141cc406Sopenharmony_ci /* bottom-right y */ 400141cc406Sopenharmony_ci s->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y; 401141cc406Sopenharmony_ci s->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y; 402141cc406Sopenharmony_ci s->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y; 403141cc406Sopenharmony_ci s->opt[OPT_BR_Y].type = SANE_TYPE_FIXED; 404141cc406Sopenharmony_ci s->opt[OPT_BR_Y].unit = SANE_UNIT_MM; 405141cc406Sopenharmony_ci s->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE; 406141cc406Sopenharmony_ci s->opt[OPT_BR_Y].constraint.range = &(s->hw->info.y_range); 407141cc406Sopenharmony_ci s->val[OPT_BR_Y].w = s->hw->info.y_range.max; 408141cc406Sopenharmony_ci 409141cc406Sopenharmony_ci DBG (DBG_info, "INIT_OPTIONS: ul(x,y) = (%d,%d) br(x,y) = (%d,%d)\n", 410141cc406Sopenharmony_ci (unsigned) SANE_UNFIX (s->val[OPT_TL_X].w), 411141cc406Sopenharmony_ci (unsigned) SANE_UNFIX (s->val[OPT_TL_Y].w), 412141cc406Sopenharmony_ci (unsigned) SANE_UNFIX (s->val[OPT_BR_X].w), 413141cc406Sopenharmony_ci (unsigned) SANE_UNFIX (s->val[OPT_BR_Y].w)); 414141cc406Sopenharmony_ci /* Autoborder */ 415141cc406Sopenharmony_ci /* Rotation */ 416141cc406Sopenharmony_ci /* Deskew */ 417141cc406Sopenharmony_ci 418141cc406Sopenharmony_ci 419141cc406Sopenharmony_ci 420141cc406Sopenharmony_ci /* 421141cc406Sopenharmony_ci * "Feeder" GROUP: 422141cc406Sopenharmony_ci */ 423141cc406Sopenharmony_ci s->opt[OPT_FEEDER_GROUP].name = ""; 424141cc406Sopenharmony_ci s->opt[OPT_FEEDER_GROUP].title = SANE_TITLE_FEEDER_GROUP; 425141cc406Sopenharmony_ci s->opt[OPT_FEEDER_GROUP].desc = ""; 426141cc406Sopenharmony_ci s->opt[OPT_FEEDER_GROUP].type = SANE_TYPE_GROUP; 427141cc406Sopenharmony_ci s->opt[OPT_FEEDER_GROUP].cap = SANE_CAP_ADVANCED; 428141cc406Sopenharmony_ci s->opt[OPT_FEEDER_GROUP].constraint_type = SANE_CONSTRAINT_NONE; 429141cc406Sopenharmony_ci 430141cc406Sopenharmony_ci /* Scan Source */ 431141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].name = SANE_NAME_SCAN_SOURCE; 432141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].title = SANE_TITLE_SCAN_SOURCE; 433141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].desc = SANE_DESC_SCAN_SOURCE; 434141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].type = SANE_TYPE_STRING; 435141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 436141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].size = max_string_size (scan_source_list); 437141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST; 438141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].constraint.string_list = 439141cc406Sopenharmony_ci (SANE_String_Const *) & scan_source_list[0]; 440141cc406Sopenharmony_ci s->val[OPT_SCAN_SOURCE].s = strdup (scan_source_list[0]); 441141cc406Sopenharmony_ci if (!s->hw->info.hasADF) 442141cc406Sopenharmony_ci s->opt[OPT_SCAN_SOURCE].cap |= SANE_CAP_INACTIVE; 443141cc406Sopenharmony_ci 444141cc406Sopenharmony_ci /* Duplex: */ 445141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].name = SANE_NAME_DUPLEX; 446141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].title = SANE_TITLE_DUPLEX; 447141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].desc = SANE_DESC_DUPLEX; 448141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].type = SANE_TYPE_BOOL; 449141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 450141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].constraint_type = SANE_CONSTRAINT_NONE; 451141cc406Sopenharmony_ci s->val[OPT_DUPLEX].w = s->hw->info.default_duplex; 452141cc406Sopenharmony_ci if (!s->hw->info.hasDuplex) 453141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].cap |= SANE_CAP_INACTIVE; 454141cc406Sopenharmony_ci 455141cc406Sopenharmony_ci /* Prefeed: */ 456141cc406Sopenharmony_ci s->opt[OPT_PREFEED].name = SANE_NAME_PREFEED; 457141cc406Sopenharmony_ci s->opt[OPT_PREFEED].title = SANE_TITLE_PREFEED; 458141cc406Sopenharmony_ci s->opt[OPT_PREFEED].desc = SANE_DESC_PREFEED; 459141cc406Sopenharmony_ci s->opt[OPT_PREFEED].type = SANE_TYPE_BOOL; 460141cc406Sopenharmony_ci s->opt[OPT_PREFEED].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 461141cc406Sopenharmony_ci s->opt[OPT_PREFEED].constraint_type = SANE_CONSTRAINT_NONE; 462141cc406Sopenharmony_ci s->val[OPT_PREFEED].w = SANE_FALSE; 463141cc406Sopenharmony_ci s->opt[OPT_PREFEED].cap |= SANE_CAP_INACTIVE; 464141cc406Sopenharmony_ci 465141cc406Sopenharmony_ci /* Endorser: */ 466141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].name = SANE_NAME_ENDORSER; 467141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].title = SANE_TITLE_ENDORSER; 468141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].desc = SANE_DESC_ENDORSER; 469141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].type = SANE_TYPE_BOOL; 470141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 471141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].constraint_type = SANE_CONSTRAINT_NONE; 472141cc406Sopenharmony_ci s->val[OPT_ENDORSER].w = s->hw->info.endorser_control; 473141cc406Sopenharmony_ci if (!s->hw->info.hasEndorser) 474141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].cap |= SANE_CAP_INACTIVE; 475141cc406Sopenharmony_ci 476141cc406Sopenharmony_ci /* Endorser String: */ 477141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].name = SANE_NAME_ENDORSER_STRING; 478141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].title = SANE_TITLE_ENDORSER_STRING; 479141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].desc = SANE_DESC_ENDORSER_STRING; 480141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].type = SANE_TYPE_STRING; 481141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].cap = 482141cc406Sopenharmony_ci SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 483141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].size = sizeof (s->hw->info.endorser_string); 484141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].constraint_type = SANE_CONSTRAINT_NONE; 485141cc406Sopenharmony_ci s->val[OPT_ENDORSER_STRING].s = strdup (s->hw->info.endorser_string); 486141cc406Sopenharmony_ci if (!s->hw->info.hasEndorser) 487141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].cap |= SANE_CAP_INACTIVE; 488141cc406Sopenharmony_ci 489141cc406Sopenharmony_ci /* Batch */ 490141cc406Sopenharmony_ci /* Check ADF */ 491141cc406Sopenharmony_ci /* timeout ADF */ 492141cc406Sopenharmony_ci /* timeout Manual */ 493141cc406Sopenharmony_ci 494141cc406Sopenharmony_ci /* 495141cc406Sopenharmony_ci * "Enhancement" GROUP: 496141cc406Sopenharmony_ci */ 497141cc406Sopenharmony_ci s->opt[OPT_ENHANCEMENT_GROUP].name = ""; 498141cc406Sopenharmony_ci s->opt[OPT_ENHANCEMENT_GROUP].title = SANE_TITLE_ENHANCEMENT_GROUP; 499141cc406Sopenharmony_ci s->opt[OPT_ENHANCEMENT_GROUP].desc = ""; 500141cc406Sopenharmony_ci s->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP; 501141cc406Sopenharmony_ci s->opt[OPT_ENHANCEMENT_GROUP].cap = SANE_CAP_ADVANCED; 502141cc406Sopenharmony_ci s->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE; 503141cc406Sopenharmony_ci 504141cc406Sopenharmony_ci /* Halftone Type */ 505141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].name = SANE_NAME_HALFTONE_CODE; 506141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].title = SANE_TITLE_HALFTONE_CODE; 507141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].desc = SANE_DESC_HALFTONE_CODE; 508141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].type = SANE_TYPE_STRING; 509141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].size = max_string_size (halftone_code); 510141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 511141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].constraint_type = SANE_CONSTRAINT_STRING_LIST; 512141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].constraint.string_list = 513141cc406Sopenharmony_ci (SANE_String_Const *) & halftone_code[0]; 514141cc406Sopenharmony_ci s->val[OPT_HALFTONE_CODE].s = strdup (halftone_code[0]); 515141cc406Sopenharmony_ci if (s->image_composition == LINEART) 516141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].cap |= SANE_CAP_INACTIVE; 517141cc406Sopenharmony_ci 518141cc406Sopenharmony_ci /* Halftone patterns */ 519141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].name = SANE_NAME_HALFTONE_PATTERN; 520141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].title = SANE_TITLE_HALFTONE_PATTERN; 521141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].desc = SANE_DESC_HALFTONE_PATTERN; 522141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].type = SANE_TYPE_STRING; 523141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].size = 524141cc406Sopenharmony_ci max_string_size ((SANE_String_Const *) halftone_pattern_list); 525141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].cap = 526141cc406Sopenharmony_ci SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 527141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].constraint_type = SANE_CONSTRAINT_STRING_LIST; 528141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].constraint.string_list = 529141cc406Sopenharmony_ci (SANE_String_Const *) & halftone_pattern_list[0]; 530141cc406Sopenharmony_ci s->val[OPT_HALFTONE_PATTERN].s = strdup (halftone_pattern_list[0]); 531141cc406Sopenharmony_ci if (s->image_composition == LINEART) 532141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].cap |= SANE_CAP_INACTIVE; 533141cc406Sopenharmony_ci 534141cc406Sopenharmony_ci /* Gray Filter */ 535141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].name = SANE_NAME_GRAYFILTER; 536141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].title = SANE_TITLE_GRAYFILTER; 537141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].desc = SANE_DESC_GRAYFILTER; 538141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].type = SANE_TYPE_STRING; 539141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].size = max_string_size (grayfilter_list); 540141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 541141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].constraint_type = SANE_CONSTRAINT_STRING_LIST; 542141cc406Sopenharmony_ci s->opt[OPT_GRAYFILTER].constraint.string_list = 543141cc406Sopenharmony_ci (SANE_String_Const *) & grayfilter_list[0]; 544141cc406Sopenharmony_ci s->val[OPT_GRAYFILTER].s = strdup (grayfilter_list[0]); 545141cc406Sopenharmony_ci 546141cc406Sopenharmony_ci /* Scan Wait Mode */ 547141cc406Sopenharmony_ci s->opt[OPT_SCAN_WAIT_MODE].name = SANE_NAME_SCAN_WAIT_MODE; 548141cc406Sopenharmony_ci s->opt[OPT_SCAN_WAIT_MODE].title = SANE_TITLE_SCAN_WAIT_MODE; 549141cc406Sopenharmony_ci s->opt[OPT_SCAN_WAIT_MODE].desc = SANE_DESC_SCAN_WAIT_MODE; 550141cc406Sopenharmony_ci s->opt[OPT_SCAN_WAIT_MODE].type = SANE_TYPE_BOOL; 551141cc406Sopenharmony_ci s->opt[OPT_SCAN_WAIT_MODE].unit = SANE_UNIT_NONE; 552141cc406Sopenharmony_ci s->val[OPT_SCAN_WAIT_MODE].w = 553141cc406Sopenharmony_ci (s->hw->info.scan_wait_mode) ? SANE_TRUE : SANE_FALSE; 554141cc406Sopenharmony_ci 555141cc406Sopenharmony_ci /* Brightness */ 556141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].name = SANE_NAME_BRIGHTNESS; 557141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].title = SANE_TITLE_BRIGHTNESS; 558141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].desc = SANE_DESC_BRIGHTNESS; 559141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].type = SANE_TYPE_INT; 560141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].unit = SANE_UNIT_NONE; 561141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].cap = SANE_CAP_SOFT_DETECT; 562141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].constraint_type = SANE_CONSTRAINT_RANGE; 563141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].constraint.range = &s->hw->info.brightness_range; 564141cc406Sopenharmony_ci s->val[OPT_BRIGHTNESS].w = 128; 565141cc406Sopenharmony_ci 566141cc406Sopenharmony_ci /* Threshold */ 567141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD; 568141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD; 569141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD; 570141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].type = SANE_TYPE_INT; 571141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].unit = SANE_UNIT_NONE; 572141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE; 573141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].constraint.range = &s->hw->info.threshold_range; 574141cc406Sopenharmony_ci s->val[OPT_THRESHOLD].w = 128; 575141cc406Sopenharmony_ci 576141cc406Sopenharmony_ci /* Contrast */ 577141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].name = SANE_NAME_CONTRAST; 578141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].title = SANE_TITLE_CONTRAST; 579141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].desc = SANE_DESC_CONTRAST; 580141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].type = SANE_TYPE_INT; 581141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].unit = SANE_UNIT_NONE; 582141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].cap = SANE_CAP_SOFT_DETECT; 583141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].constraint_type = SANE_CONSTRAINT_RANGE; 584141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].constraint.range = &s->hw->info.contrast_range; 585141cc406Sopenharmony_ci s->val[OPT_CONTRAST].w = 128; 586141cc406Sopenharmony_ci 587141cc406Sopenharmony_ci /* Gamma */ 588141cc406Sopenharmony_ci s->opt[OPT_GAMMA].name = SANE_NAME_GAMMA; 589141cc406Sopenharmony_ci s->opt[OPT_GAMMA].title = SANE_TITLE_GAMMA; 590141cc406Sopenharmony_ci s->opt[OPT_GAMMA].desc = SANE_DESC_GAMMA; 591141cc406Sopenharmony_ci s->opt[OPT_GAMMA].type = SANE_TYPE_STRING; 592141cc406Sopenharmony_ci s->opt[OPT_GAMMA].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 593141cc406Sopenharmony_ci s->opt[OPT_GAMMA].size = max_string_size ((SANE_String_Const *) gamma_list); 594141cc406Sopenharmony_ci /* 595141cc406Sopenharmony_ci s->opt[OPT_GAMMA].type = SANE_TYPE_INT; 596141cc406Sopenharmony_ci s->opt[OPT_GAMMA].unit = SANE_UNIT_NONE; 597141cc406Sopenharmony_ci s->opt[OPT_GAMMA].constraint_type = SANE_CONSTRAINT_RANGE; 598141cc406Sopenharmony_ci s->opt[OPT_GAMMA].constraint.range = &u8_range; 599141cc406Sopenharmony_ci s->val[OPT_GAMMA].w = 0; 600141cc406Sopenharmony_ci */ 601141cc406Sopenharmony_ci s->opt[OPT_GAMMA].type = SANE_TYPE_STRING; 602141cc406Sopenharmony_ci s->opt[OPT_GAMMA].constraint_type = SANE_CONSTRAINT_STRING_LIST; 603141cc406Sopenharmony_ci s->opt[OPT_GAMMA].constraint.string_list = 604141cc406Sopenharmony_ci (SANE_String_Const *) & gamma_list[0]; 605141cc406Sopenharmony_ci s->val[OPT_GAMMA].s = strdup (gamma_list[0]); 606141cc406Sopenharmony_ci 607141cc406Sopenharmony_ci /* custom-gamma table */ 608141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA; 609141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA; 610141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA; 611141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL; 612141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 613141cc406Sopenharmony_ci s->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE; 614141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; 615141cc406Sopenharmony_ci 616141cc406Sopenharmony_ci /* grayscale gamma vector */ 617141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].name = SANE_NAME_GAMMA_VECTOR; 618141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].title = SANE_TITLE_GAMMA_VECTOR; 619141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].desc = SANE_DESC_GAMMA_VECTOR; 620141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].type = SANE_TYPE_INT; 621141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].cap |= 622141cc406Sopenharmony_ci SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 623141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].unit = SANE_UNIT_NONE; 624141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].size = GAMMA_LENGTH * sizeof (SANE_Word); 625141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].constraint_type = SANE_CONSTRAINT_RANGE; 626141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &u8_range; 627141cc406Sopenharmony_ci s->val[OPT_GAMMA_VECTOR_GRAY].wa = s->gamma_table; 628141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; 629141cc406Sopenharmony_ci 630141cc406Sopenharmony_ci 631141cc406Sopenharmony_ci /* Control Panel */ 632141cc406Sopenharmony_ci /* ACE Function */ 633141cc406Sopenharmony_ci /* ACE Sensitivity */ 634141cc406Sopenharmony_ci 635141cc406Sopenharmony_ci /* Binary Smoothing Filter */ 636141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].name = SANE_NAME_SMOOTHING; 637141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].title = SANE_TITLE_SMOOTHING; 638141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].desc = SANE_DESC_SMOOTHING; 639141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].type = SANE_TYPE_BOOL; 640141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 641141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].constraint_type = SANE_CONSTRAINT_NONE; 642141cc406Sopenharmony_ci s->val[OPT_SMOOTHING].w = SANE_FALSE; 643141cc406Sopenharmony_ci if (!s->hw->info.hasIPU) 644141cc406Sopenharmony_ci s->opt[OPT_SMOOTHING].cap |= SANE_CAP_INACTIVE; 645141cc406Sopenharmony_ci 646141cc406Sopenharmony_ci /* Binary Noise Removal Filter */ 647141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].name = SANE_NAME_NOISEREMOVAL; 648141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].title = SANE_TITLE_NOISEREMOVAL; 649141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].desc = SANE_DESC_NOISEREMOVAL; 650141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].type = SANE_TYPE_STRING; 651141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].size = max_string_size (noisematrix_list); 652141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 653141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].constraint.string_list = 654141cc406Sopenharmony_ci (SANE_String_Const *) & noisematrix_list[0]; 655141cc406Sopenharmony_ci s->val[OPT_NOISEREMOVAL].s = strdup (noisematrix_list[0]); 656141cc406Sopenharmony_ci if (!s->hw->info.hasIPU) 657141cc406Sopenharmony_ci s->opt[OPT_NOISEREMOVAL].cap |= SANE_CAP_INACTIVE; 658141cc406Sopenharmony_ci 659141cc406Sopenharmony_ci /* Automatic Separation */ 660141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].name = SANE_NAME_AUTOSEP; 661141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].title = SANE_TITLE_AUTOSEP; 662141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].desc = SANE_DESC_AUTOSEP; 663141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].type = SANE_TYPE_STRING; 664141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].size = max_string_size (auto_separation_list); 665141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 666141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].constraint.string_list = 667141cc406Sopenharmony_ci (SANE_String_Const *) & auto_separation_list[0]; 668141cc406Sopenharmony_ci s->val[OPT_AUTOSEP].s = strdup (auto_separation_list[0]); 669141cc406Sopenharmony_ci if (!s->hw->info.hasIPU) 670141cc406Sopenharmony_ci s->opt[OPT_AUTOSEP].cap |= SANE_CAP_INACTIVE; 671141cc406Sopenharmony_ci 672141cc406Sopenharmony_ci /* Automatic Binarization */ 673141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].name = SANE_NAME_AUTOBIN; 674141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].title = SANE_TITLE_AUTOBIN; 675141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].desc = SANE_DESC_AUTOBIN; 676141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].type = SANE_TYPE_STRING; 677141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].size = max_string_size (auto_binarization_list); 678141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 679141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].constraint.string_list = 680141cc406Sopenharmony_ci (SANE_String_Const *) & auto_binarization_list[0]; 681141cc406Sopenharmony_ci s->val[OPT_AUTOBIN].s = strdup (auto_binarization_list[0]); 682141cc406Sopenharmony_ci if (!s->hw->info.hasIPU) 683141cc406Sopenharmony_ci s->opt[OPT_AUTOBIN].cap |= SANE_CAP_INACTIVE; 684141cc406Sopenharmony_ci 685141cc406Sopenharmony_ci /* SECTION 686141cc406Sopenharmony_ci * The IS450 supports up to 4 Section; The IS420 supports up to 6 Sections 687141cc406Sopenharmony_ci * For each struct window_section[i] we need to fill in ulx,uly,width,height,etc 688141cc406Sopenharmony_ci * NOT YET IMPLEMENTED 689141cc406Sopenharmony_ci */ 690141cc406Sopenharmony_ci 691141cc406Sopenharmony_ci /* Negative */ 692141cc406Sopenharmony_ci s->opt[OPT_NEGATIVE].name = SANE_NAME_NEGATIVE; 693141cc406Sopenharmony_ci s->opt[OPT_NEGATIVE].title = SANE_TITLE_NEGATIVE; 694141cc406Sopenharmony_ci s->opt[OPT_NEGATIVE].desc = SANE_DESC_NEGATIVE; 695141cc406Sopenharmony_ci s->opt[OPT_NEGATIVE].type = SANE_TYPE_BOOL; 696141cc406Sopenharmony_ci s->opt[OPT_NEGATIVE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 697141cc406Sopenharmony_ci s->opt[OPT_NEGATIVE].constraint_type = SANE_CONSTRAINT_NONE; 698141cc406Sopenharmony_ci s->val[OPT_NEGATIVE].w = SANE_FALSE; 699141cc406Sopenharmony_ci 700141cc406Sopenharmony_ci /* White Balance */ 701141cc406Sopenharmony_ci s->opt[OPT_WHITE_BALANCE].name = SANE_NAME_WHITE_BALANCE; 702141cc406Sopenharmony_ci s->opt[OPT_WHITE_BALANCE].title = SANE_TITLE_WHITE_BALANCE; 703141cc406Sopenharmony_ci s->opt[OPT_WHITE_BALANCE].desc = SANE_DESC_WHITE_BALANCE; 704141cc406Sopenharmony_ci s->opt[OPT_WHITE_BALANCE].type = SANE_TYPE_BOOL; 705141cc406Sopenharmony_ci s->opt[OPT_WHITE_BALANCE].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; 706141cc406Sopenharmony_ci s->opt[OPT_WHITE_BALANCE].constraint_type = SANE_CONSTRAINT_NONE; 707141cc406Sopenharmony_ci s->val[OPT_WHITE_BALANCE].w = SANE_FALSE; /* F/T = Relative/Absolute White */ 708141cc406Sopenharmony_ci 709141cc406Sopenharmony_ci /* 710141cc406Sopenharmony_ci * "Miscellaneous" GROUP: 711141cc406Sopenharmony_ci */ 712141cc406Sopenharmony_ci s->opt[OPT_MISCELLANEOUS_GROUP].name = ""; 713141cc406Sopenharmony_ci s->opt[OPT_MISCELLANEOUS_GROUP].title = SANE_TITLE_MISCELLANEOUS_GROUP; 714141cc406Sopenharmony_ci s->opt[OPT_MISCELLANEOUS_GROUP].desc = ""; 715141cc406Sopenharmony_ci s->opt[OPT_MISCELLANEOUS_GROUP].type = SANE_TYPE_GROUP; 716141cc406Sopenharmony_ci s->opt[OPT_MISCELLANEOUS_GROUP].cap = SANE_CAP_ADVANCED; 717141cc406Sopenharmony_ci s->opt[OPT_MISCELLANEOUS_GROUP].constraint_type = SANE_CONSTRAINT_NONE; 718141cc406Sopenharmony_ci 719141cc406Sopenharmony_ci /* Padding Type: */ 720141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].name = SANE_NAME_PADDING_TYPE; 721141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].title = SANE_TITLE_PADDING_TYPE; 722141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].desc = SANE_DESC_PADDING_TYPE; 723141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].type = SANE_TYPE_STRING; 724141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].cap = SANE_CAP_SOFT_DETECT; /* Display only */ 725141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].size = max_string_size (paddingtype_list); 726141cc406Sopenharmony_ci /* 727141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].size = sizeof((paddingtype_list[ get_paddingtype_strndx(TRUNCATE) ])); 728141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].constraint_type = SANE_CONSTRAINT_NONE; 729141cc406Sopenharmony_ci */ 730141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].constraint_type = SANE_CONSTRAINT_STRING_LIST; 731141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].constraint.string_list = 732141cc406Sopenharmony_ci (SANE_String_Const *) & paddingtype_list[0]; 733141cc406Sopenharmony_ci s->val[OPT_PADDING_TYPE].s = 734141cc406Sopenharmony_ci strdup (paddingtype_list[get_paddingtype_strndx (TRUNCATE)]); 735141cc406Sopenharmony_ci DBG (DBG_info, "PADDINGTYPE =%s size=%d\n", s->val[OPT_PADDING_TYPE].s, 736141cc406Sopenharmony_ci s->opt[OPT_PADDING_TYPE].size); 737141cc406Sopenharmony_ci 738141cc406Sopenharmony_ci /* Bit Order 739141cc406Sopenharmony_ci s->opt[OPT_BITORDER].name = SANE_NAME_BITORDER; 740141cc406Sopenharmony_ci s->opt[OPT_BITORDER].title = SANE_TITLE_BITORDER; 741141cc406Sopenharmony_ci s->opt[OPT_BITORDER].desc = SANE_DESC_BITORDER; 742141cc406Sopenharmony_ci s->opt[OPT_BITORDER].type = SANE_TYPE_WORD; 743141cc406Sopenharmony_ci s->opt[OPT_BITORDER].cap = SANE_CAP_SOFT_DETECT; 744141cc406Sopenharmony_ci s->opt[OPT_BITORDER].constraint_type = SANE_CONSTRAINT_NONE 745141cc406Sopenharmony_ci s->val[OPT_BITORDER].w = 0x7; 746141cc406Sopenharmony_ci */ 747141cc406Sopenharmony_ci 748141cc406Sopenharmony_ci /* Self Diagnostics */ 749141cc406Sopenharmony_ci s->opt[OPT_SELF_DIAGNOSTICS].name = SANE_NAME_SELF_DIAGNOSTICS; 750141cc406Sopenharmony_ci s->opt[OPT_SELF_DIAGNOSTICS].title = SANE_TITLE_SELF_DIAGNOSTICS; 751141cc406Sopenharmony_ci s->opt[OPT_SELF_DIAGNOSTICS].desc = SANE_DESC_SELF_DIAGNOSTICS; 752141cc406Sopenharmony_ci s->opt[OPT_SELF_DIAGNOSTICS].type = SANE_TYPE_BUTTON; 753141cc406Sopenharmony_ci 754141cc406Sopenharmony_ci /* Optical Diagnostics */ 755141cc406Sopenharmony_ci s->opt[OPT_OPTICAL_ADJUSTMENT].name = SANE_NAME_OPTICAL_ADJUSTMENT; 756141cc406Sopenharmony_ci s->opt[OPT_OPTICAL_ADJUSTMENT].title = SANE_TITLE_OPTICAL_ADJUSTMENT; 757141cc406Sopenharmony_ci s->opt[OPT_OPTICAL_ADJUSTMENT].desc = SANE_DESC_OPTICAL_ADJUSTMENT; 758141cc406Sopenharmony_ci s->opt[OPT_OPTICAL_ADJUSTMENT].type = SANE_TYPE_BUTTON; 759141cc406Sopenharmony_ci 760141cc406Sopenharmony_ci /* MAINTENANCE DATA */ 761141cc406Sopenharmony_ci s->opt[OPT_DATA_GROUP].name = ""; 762141cc406Sopenharmony_ci s->opt[OPT_DATA_GROUP].title = "Maintenance Data"; 763141cc406Sopenharmony_ci s->opt[OPT_DATA_GROUP].desc = ""; 764141cc406Sopenharmony_ci s->opt[OPT_DATA_GROUP].type = SANE_TYPE_GROUP; 765141cc406Sopenharmony_ci s->opt[OPT_DATA_GROUP].cap = SANE_CAP_ADVANCED; 766141cc406Sopenharmony_ci s->opt[OPT_DATA_GROUP].constraint_type = SANE_CONSTRAINT_NONE; 767141cc406Sopenharmony_ci 768141cc406Sopenharmony_ci s->opt[OPT_UPDATE].name = "Update"; 769141cc406Sopenharmony_ci s->opt[OPT_UPDATE].title = "Update"; 770141cc406Sopenharmony_ci s->opt[OPT_UPDATE].desc = "Update scanner data"; 771141cc406Sopenharmony_ci s->opt[OPT_UPDATE].type = SANE_TYPE_BUTTON; 772141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].cap = SANE_CAP_SOFT_DETECT; 773141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].constraint_type = SANE_CONSTRAINT_NONE; 774141cc406Sopenharmony_ci 775141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].name = "# registers in main-scanning in ADF mode"; 776141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].title = "# registers in main-scanning in ADF mode"; 777141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].desc = "# registers in main-scanning in ADF mode"; 778141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].type = SANE_TYPE_INT; 779141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].unit = SANE_UNIT_NONE; 780141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].cap = SANE_CAP_SOFT_DETECT; 781141cc406Sopenharmony_ci s->opt[OPT_NREGX_ADF].constraint_type = SANE_CONSTRAINT_NONE; 782141cc406Sopenharmony_ci 783141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].name = "# registers in sub-scanning in ADF mode"; 784141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].title = "# registers in sub-scanning in ADF mode"; 785141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].desc = "# registers in sub-scanning in ADF mode"; 786141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].type = SANE_TYPE_INT; 787141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].unit = SANE_UNIT_NONE; 788141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].cap = SANE_CAP_SOFT_DETECT; 789141cc406Sopenharmony_ci s->opt[OPT_NREGY_ADF].constraint_type = SANE_CONSTRAINT_NONE; 790141cc406Sopenharmony_ci 791141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].name = "# registers in main-scanning in book mode"; 792141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].title = "# registers in main-scanning in book mode"; 793141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].desc = "# registers in main-scanning in book mode"; 794141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].type = SANE_TYPE_INT; 795141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].unit = SANE_UNIT_NONE; 796141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].cap = SANE_CAP_SOFT_DETECT; 797141cc406Sopenharmony_ci s->opt[OPT_NREGX_BOOK].constraint_type = SANE_CONSTRAINT_NONE; 798141cc406Sopenharmony_ci 799141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].name = "# registers in sub-scanning in book mode"; 800141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].title = "# registers in sub-scanning in book mode"; 801141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].desc = "# registers in sub-scanning in book mode"; 802141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].type = SANE_TYPE_INT; 803141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].unit = SANE_UNIT_NONE; 804141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].cap = SANE_CAP_SOFT_DETECT; 805141cc406Sopenharmony_ci s->opt[OPT_NREGY_BOOK].constraint_type = SANE_CONSTRAINT_NONE; 806141cc406Sopenharmony_ci 807141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].name = "# ADF Scans"; 808141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].title = "# ADF Scans"; 809141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].desc = "# ADF Scans"; 810141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].type = SANE_TYPE_INT; 811141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].unit = SANE_UNIT_NONE; 812141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].cap = SANE_CAP_SOFT_DETECT; 813141cc406Sopenharmony_ci s->opt[OPT_NSCANS_ADF].constraint_type = SANE_CONSTRAINT_NONE; 814141cc406Sopenharmony_ci 815141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].name = "# BOOK Scans"; 816141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].title = "# BOOK Scans"; 817141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].desc = "# BOOK Scans"; 818141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].type = SANE_TYPE_INT; 819141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].unit = SANE_UNIT_NONE; 820141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].cap = SANE_CAP_SOFT_DETECT; 821141cc406Sopenharmony_ci s->opt[OPT_NSCANS_BOOK].constraint_type = SANE_CONSTRAINT_NONE; 822141cc406Sopenharmony_ci 823141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].name = "LAMP TIME"; 824141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].title = "LAMP TIME"; 825141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].desc = "LAMP TIME"; 826141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].type = SANE_TYPE_INT; 827141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].unit = SANE_UNIT_NONE; 828141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].cap = SANE_CAP_SOFT_DETECT; 829141cc406Sopenharmony_ci s->opt[OPT_LAMP_TIME].constraint_type = SANE_CONSTRAINT_NONE; 830141cc406Sopenharmony_ci 831141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].name = "E/O Balance ODD"; 832141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].title = "E/O Balance ODD"; 833141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].desc = "Adj. of E/O Balance in black level ODD"; 834141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].type = SANE_TYPE_INT; 835141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].unit = SANE_UNIT_NONE; 836141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].cap = SANE_CAP_SOFT_DETECT; 837141cc406Sopenharmony_ci s->opt[OPT_EO_ODD].constraint_type = SANE_CONSTRAINT_NONE; 838141cc406Sopenharmony_ci 839141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].name = "E/O Balance EVEN"; 840141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].title = "E/O Balance EVEN"; 841141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].desc = "Adj. of E/O Balance in black level EVEN"; 842141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].type = SANE_TYPE_INT; 843141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].unit = SANE_UNIT_NONE; 844141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].cap = SANE_CAP_SOFT_DETECT; 845141cc406Sopenharmony_ci s->opt[OPT_EO_EVEN].constraint_type = SANE_CONSTRAINT_NONE; 846141cc406Sopenharmony_ci 847141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].name = "Black Level ODD"; 848141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].title = "Black Level ODD"; 849141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].desc = "Adj. data in black level (ODD)"; 850141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].type = SANE_TYPE_INT; 851141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].unit = SANE_UNIT_NONE; 852141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].cap = SANE_CAP_SOFT_DETECT; 853141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_ODD].constraint_type = SANE_CONSTRAINT_NONE; 854141cc406Sopenharmony_ci 855141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].name = "Black Level EVEN"; 856141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].title = "Black Level EVEN"; 857141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].desc = "Adj. data in black level (EVEN)"; 858141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].type = SANE_TYPE_INT; 859141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].unit = SANE_UNIT_NONE; 860141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].cap = SANE_CAP_SOFT_DETECT; 861141cc406Sopenharmony_ci s->opt[OPT_BLACK_LEVEL_EVEN].constraint_type = SANE_CONSTRAINT_NONE; 862141cc406Sopenharmony_ci 863141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].name = "White Level ODD"; 864141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].title = "White Level ODD"; 865141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].desc = "Adj. data in White level (ODD)"; 866141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].type = SANE_TYPE_INT; 867141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].unit = SANE_UNIT_NONE; 868141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].cap = SANE_CAP_SOFT_DETECT; 869141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_ODD].constraint_type = SANE_CONSTRAINT_NONE; 870141cc406Sopenharmony_ci 871141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].name = "White Level EVEN"; 872141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].title = "White Level EVEN"; 873141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].desc = "Adj. data in White level (EVEN)"; 874141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].type = SANE_TYPE_INT; 875141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].unit = SANE_UNIT_NONE; 876141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].cap = SANE_CAP_SOFT_DETECT; 877141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].constraint_type = SANE_CONSTRAINT_NONE; 878141cc406Sopenharmony_ci 879141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].name = "White Level EVEN"; 880141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].title = "White Level EVEN"; 881141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].desc = "Adj. data in White level (EVEN)"; 882141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].type = SANE_TYPE_INT; 883141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].unit = SANE_UNIT_NONE; 884141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].cap = SANE_CAP_SOFT_DETECT; 885141cc406Sopenharmony_ci s->opt[OPT_WHITE_LEVEL_EVEN].constraint_type = SANE_CONSTRAINT_NONE; 886141cc406Sopenharmony_ci 887141cc406Sopenharmony_ci s->opt[OPT_DENSITY].name = "Density Adjustment"; 888141cc406Sopenharmony_ci s->opt[OPT_DENSITY].title = "Density Adjustment"; 889141cc406Sopenharmony_ci s->opt[OPT_DENSITY].desc = "Density adjustment of std. white board"; 890141cc406Sopenharmony_ci s->opt[OPT_DENSITY].type = SANE_TYPE_INT; 891141cc406Sopenharmony_ci s->opt[OPT_DENSITY].unit = SANE_UNIT_NONE; 892141cc406Sopenharmony_ci s->opt[OPT_DENSITY].cap = SANE_CAP_SOFT_DETECT; 893141cc406Sopenharmony_ci s->opt[OPT_DENSITY].constraint_type = SANE_CONSTRAINT_NONE; 894141cc406Sopenharmony_ci 895141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].name = "1st adj. in white level (ODD)"; 896141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].title = "1st adj. in white level (ODD)"; 897141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].desc = "1st adj. in white level (ODD)"; 898141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].type = SANE_TYPE_INT; 899141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].unit = SANE_UNIT_NONE; 900141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].cap = SANE_CAP_SOFT_DETECT; 901141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_ODD].constraint_type = SANE_CONSTRAINT_NONE; 902141cc406Sopenharmony_ci 903141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].name = "1st adj. in white level (EVEN)"; 904141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].title = "1st adj. in white level (EVEN)"; 905141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].desc = "1st adj. in white level (EVEN)"; 906141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].type = SANE_TYPE_INT; 907141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].unit = SANE_UNIT_NONE; 908141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].cap = SANE_CAP_SOFT_DETECT; 909141cc406Sopenharmony_ci s->opt[OPT_FIRST_ADJ_WHITE_EVEN].constraint_type = SANE_CONSTRAINT_NONE; 910141cc406Sopenharmony_ci 911141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].name = "# registers of main-scanning of backside"; 912141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].title = 913141cc406Sopenharmony_ci "# registers of main-scanning of backside"; 914141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].desc = 915141cc406Sopenharmony_ci "# registers of main-scanning of ADF backside"; 916141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].type = SANE_TYPE_INT; 917141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].unit = SANE_UNIT_NONE; 918141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].cap = SANE_CAP_SOFT_DETECT; 919141cc406Sopenharmony_ci s->opt[OPT_NREGX_REVERSE].constraint_type = SANE_CONSTRAINT_NONE; 920141cc406Sopenharmony_ci 921141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].name = "# registers of sub-scanning of backside"; 922141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].title = "# registers of sub-scanning of backside"; 923141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].desc = 924141cc406Sopenharmony_ci "# registers of sub-scanning of ADF backside"; 925141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].type = SANE_TYPE_INT; 926141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].unit = SANE_UNIT_NONE; 927141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].cap = SANE_CAP_SOFT_DETECT; 928141cc406Sopenharmony_ci s->opt[OPT_NREGY_REVERSE].constraint_type = SANE_CONSTRAINT_NONE; 929141cc406Sopenharmony_ci 930141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].name = "# of scans of reverse side in ADF"; 931141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].title = "# of scans of reverse side in ADF"; 932141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].desc = "# of scans of reverse side in ADF"; 933141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].type = SANE_TYPE_INT; 934141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].unit = SANE_UNIT_NONE; 935141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].cap = SANE_CAP_SOFT_DETECT; 936141cc406Sopenharmony_ci s->opt[OPT_NSCANS_REVERSE_ADF].constraint_type = SANE_CONSTRAINT_NONE; 937141cc406Sopenharmony_ci 938141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].name = "LAMP TIME (reverse)"; 939141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].title = "LAMP TIME (reverse)"; 940141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].desc = "LAMP TIME (reverse)"; 941141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].type = SANE_TYPE_INT; 942141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].unit = SANE_UNIT_NONE; 943141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].cap = SANE_CAP_SOFT_DETECT; 944141cc406Sopenharmony_ci s->opt[OPT_REVERSE_TIME].constraint_type = SANE_CONSTRAINT_NONE; 945141cc406Sopenharmony_ci 946141cc406Sopenharmony_ci s->opt[OPT_NCHARS].name = "# of endorser characters"; 947141cc406Sopenharmony_ci s->opt[OPT_NCHARS].title = "# of endorser characters"; 948141cc406Sopenharmony_ci s->opt[OPT_NCHARS].desc = "# of endorser characters"; 949141cc406Sopenharmony_ci s->opt[OPT_NCHARS].type = SANE_TYPE_INT; 950141cc406Sopenharmony_ci s->opt[OPT_NCHARS].unit = SANE_UNIT_NONE; 951141cc406Sopenharmony_ci s->opt[OPT_NCHARS].cap = SANE_CAP_SOFT_DETECT; 952141cc406Sopenharmony_ci s->opt[OPT_NCHARS].constraint_type = SANE_CONSTRAINT_NONE; 953141cc406Sopenharmony_ci 954141cc406Sopenharmony_ci DBG (DBG_proc, "<< init_options\n"); 955141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 956141cc406Sopenharmony_ci} 957141cc406Sopenharmony_ci 958141cc406Sopenharmony_cistatic SANE_Status 959141cc406Sopenharmony_ciattach (SANE_String_Const devname, int __sane_unused__ connType, 960141cc406Sopenharmony_ci HS2P_Device ** devp) 961141cc406Sopenharmony_ci{ 962141cc406Sopenharmony_ci SANE_Status status; 963141cc406Sopenharmony_ci HS2P_Device *dev; 964141cc406Sopenharmony_ci struct inquiry_standard_data ibuf; 965141cc406Sopenharmony_ci struct inquiry_vpd_data vbuf; 966141cc406Sopenharmony_ci struct inquiry_jis_data jbuf; 967141cc406Sopenharmony_ci size_t buf_size; 968141cc406Sopenharmony_ci int fd = -1; 969141cc406Sopenharmony_ci double mm; 970141cc406Sopenharmony_ci 971141cc406Sopenharmony_ci char device_string[60]; 972141cc406Sopenharmony_ci 973141cc406Sopenharmony_ci unsigned int i; 974141cc406Sopenharmony_ci SANE_String *str; 975141cc406Sopenharmony_ci 976141cc406Sopenharmony_ci 977141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach:\n"); 978141cc406Sopenharmony_ci 979141cc406Sopenharmony_ci for (dev = first_dev; dev; dev = dev->next) 980141cc406Sopenharmony_ci { 981141cc406Sopenharmony_ci if (strcmp (dev->sane.name, devname) == 0) 982141cc406Sopenharmony_ci { 983141cc406Sopenharmony_ci if (devp) 984141cc406Sopenharmony_ci *devp = dev; 985141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 986141cc406Sopenharmony_ci } 987141cc406Sopenharmony_ci } 988141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach: opening \"%s\"\n", devname); 989141cc406Sopenharmony_ci 990141cc406Sopenharmony_ci /* sanei_scsi_open takes an option bufsize argument */ 991141cc406Sopenharmony_ci status = sanei_scsi_open (devname, &fd, &sense_handler, &(dev->sense_data)); 992141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 993141cc406Sopenharmony_ci { 994141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: open failed: %s\n", 995141cc406Sopenharmony_ci sane_strstatus (status)); 996141cc406Sopenharmony_ci return (status); 997141cc406Sopenharmony_ci } 998141cc406Sopenharmony_ci 999141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach: opened %s fd=%d\n", devname, fd); 1000141cc406Sopenharmony_ci 1001141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach: sending INQUIRY (standard data)\n"); 1002141cc406Sopenharmony_ci memset (&ibuf, 0, sizeof (ibuf)); 1003141cc406Sopenharmony_ci buf_size = sizeof (ibuf); 1004141cc406Sopenharmony_ci status = inquiry (fd, &ibuf, &buf_size, 0, HS2P_INQUIRY_STANDARD_PAGE_CODE); 1005141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1006141cc406Sopenharmony_ci { 1007141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: inquiry failed: %s\n", 1008141cc406Sopenharmony_ci sane_strstatus (status)); 1009141cc406Sopenharmony_ci sanei_scsi_close (fd); 1010141cc406Sopenharmony_ci return (status); 1011141cc406Sopenharmony_ci } 1012141cc406Sopenharmony_ci 1013141cc406Sopenharmony_ci DBG (DBG_info, 1014141cc406Sopenharmony_ci ">>> attach: reported devtype='%d', vendor='%.8s', product='%.16s', revision='%.4s'\n", 1015141cc406Sopenharmony_ci ibuf.devtype, ibuf.vendor, ibuf.product, ibuf.revision); 1016141cc406Sopenharmony_ci DBG (DBG_info, 1017141cc406Sopenharmony_ci ">>> attach: reported RMB=%#x Ver=%#x ResponseDataFormat=%#x Length=%#x Byte7=%#x\n", 1018141cc406Sopenharmony_ci ibuf.rmb_evpd, ibuf.version, ibuf.response_data_format, ibuf.length, 1019141cc406Sopenharmony_ci ibuf.byte7); 1020141cc406Sopenharmony_ci 1021141cc406Sopenharmony_ci if (ibuf.devtype != 6 || strncmp ((char *) ibuf.vendor, "RICOH ", 8) != 0) 1022141cc406Sopenharmony_ci { 1023141cc406Sopenharmony_ci DBG (DBG_warning, ">>> attach: device is not a RICOH scanner\n"); 1024141cc406Sopenharmony_ci sanei_scsi_close (fd); 1025141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1026141cc406Sopenharmony_ci } 1027141cc406Sopenharmony_ci else if (!is_device_supported ((char *) ibuf.product)) 1028141cc406Sopenharmony_ci { 1029141cc406Sopenharmony_ci DBG (DBG_warning, 1030141cc406Sopenharmony_ci ">>> attach: device %s is not yet a supported RICOH scanner\n", 1031141cc406Sopenharmony_ci ibuf.product); 1032141cc406Sopenharmony_ci sanei_scsi_close (fd); 1033141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1034141cc406Sopenharmony_ci } 1035141cc406Sopenharmony_ci 1036141cc406Sopenharmony_ci /* We should now have an open file descriptor to a supported hs2p scanner */ 1037141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach: sending TEST_UNIT_READY\n"); 1038141cc406Sopenharmony_ci do 1039141cc406Sopenharmony_ci { 1040141cc406Sopenharmony_ci status = test_unit_ready (fd); 1041141cc406Sopenharmony_ci } 1042141cc406Sopenharmony_ci while (status == HS2P_SK_UNIT_ATTENTION); 1043141cc406Sopenharmony_ci if (status != HS2P_SCSI_STATUS_GOOD) 1044141cc406Sopenharmony_ci { 1045141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: test unit ready failed (%s)\n", 1046141cc406Sopenharmony_ci sane_strstatus (status)); 1047141cc406Sopenharmony_ci sanei_scsi_close (fd); 1048141cc406Sopenharmony_ci return (status); 1049141cc406Sopenharmony_ci } 1050141cc406Sopenharmony_ci 1051141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach: sending INQUIRY (vpd data)\n"); 1052141cc406Sopenharmony_ci memset (&vbuf, 0, sizeof (vbuf)); 1053141cc406Sopenharmony_ci buf_size = sizeof (vbuf); 1054141cc406Sopenharmony_ci status = inquiry (fd, &vbuf, &buf_size, 1, HS2P_INQUIRY_VPD_PAGE_CODE); 1055141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1056141cc406Sopenharmony_ci { 1057141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: inquiry (vpd data) failed: %s\n", 1058141cc406Sopenharmony_ci sane_strstatus (status)); 1059141cc406Sopenharmony_ci sanei_scsi_close (fd); 1060141cc406Sopenharmony_ci return status; 1061141cc406Sopenharmony_ci } 1062141cc406Sopenharmony_ci print_vpd_info (&vbuf); 1063141cc406Sopenharmony_ci 1064141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">>> attach: sending INQUIRY (jis data)\n"); 1065141cc406Sopenharmony_ci memset (&jbuf, 0, sizeof (jbuf)); 1066141cc406Sopenharmony_ci buf_size = sizeof (jbuf); 1067141cc406Sopenharmony_ci status = inquiry (fd, &jbuf, &buf_size, 1, HS2P_INQUIRY_JIS_PAGE_CODE); 1068141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1069141cc406Sopenharmony_ci { 1070141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: inquiry (jis data) failed: %s\n", 1071141cc406Sopenharmony_ci sane_strstatus (status)); 1072141cc406Sopenharmony_ci sanei_scsi_close (fd); 1073141cc406Sopenharmony_ci return status; 1074141cc406Sopenharmony_ci } 1075141cc406Sopenharmony_ci print_jis_info (&jbuf); 1076141cc406Sopenharmony_ci 1077141cc406Sopenharmony_ci 1078141cc406Sopenharmony_ci /* Fill in HS2P_Device {sane;info} */ 1079141cc406Sopenharmony_ci dev = malloc (sizeof (*dev)); 1080141cc406Sopenharmony_ci if (!dev) 1081141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 1082141cc406Sopenharmony_ci memset (dev, 0, sizeof (*dev)); 1083141cc406Sopenharmony_ci 1084141cc406Sopenharmony_ci /* Maximum Number of Sub-Sections of Main Scanning Window */ 1085141cc406Sopenharmony_ci if (strncmp ((char *) ibuf.product, "IS450", 5) == 0) 1086141cc406Sopenharmony_ci { 1087141cc406Sopenharmony_ci dev->info.max_win_sections = 4; 1088141cc406Sopenharmony_ci } 1089141cc406Sopenharmony_ci else if (strncmp ((char *) ibuf.product, "IS420", 5) == 0) 1090141cc406Sopenharmony_ci { 1091141cc406Sopenharmony_ci dev->info.max_win_sections = 6; 1092141cc406Sopenharmony_ci } 1093141cc406Sopenharmony_ci 1094141cc406Sopenharmony_ci /* Some MODE SELECT scanner options */ 1095141cc406Sopenharmony_ci DBG (DBG_proc, ">>> attach: get_basic_measurement_unit\n"); 1096141cc406Sopenharmony_ci status = 1097141cc406Sopenharmony_ci get_basic_measurement_unit (fd, &(dev->info.bmu), &(dev->info.mud)); 1098141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1099141cc406Sopenharmony_ci { 1100141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: get_basic_measurement_unit failed (%s)\n", 1101141cc406Sopenharmony_ci sane_strstatus (status)); 1102141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: setting to defaults\n"); 1103141cc406Sopenharmony_ci status = set_basic_measurement_unit (fd, MILLIMETERS); 1104141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1105141cc406Sopenharmony_ci { 1106141cc406Sopenharmony_ci DBG (DBG_error, 1107141cc406Sopenharmony_ci ">>> attach: set_basic_measurement_unit failed (%s)\n", 1108141cc406Sopenharmony_ci sane_strstatus (status)); 1109141cc406Sopenharmony_ci } 1110141cc406Sopenharmony_ci } 1111141cc406Sopenharmony_ci if ((status = 1112141cc406Sopenharmony_ci get_connection_parameters (fd, &(dev->info.cxn))) != SANE_STATUS_GOOD) 1113141cc406Sopenharmony_ci { 1114141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: get_connection_parameters failed\n"); 1115141cc406Sopenharmony_ci } 1116141cc406Sopenharmony_ci status = get_endorser_control (fd, &dev->info.endorser_control); 1117141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD || dev->info.endorser_control != 0x01) 1118141cc406Sopenharmony_ci { 1119141cc406Sopenharmony_ci DBG (DBG_error, 1120141cc406Sopenharmony_ci ">>> attach: get_endorser_control failed: return value=%#02x\n", 1121141cc406Sopenharmony_ci dev->info.endorser_control); 1122141cc406Sopenharmony_ci dev->info.endorser_control = 0x00; 1123141cc406Sopenharmony_ci } 1124141cc406Sopenharmony_ci if ((dev->info.service_mode = get_service_mode (fd)) != 0x00 1125141cc406Sopenharmony_ci && dev->info.service_mode != 0x01) 1126141cc406Sopenharmony_ci { 1127141cc406Sopenharmony_ci DBG (DBG_error, ">>> attach: get_service_mode failed %#02x\n", 1128141cc406Sopenharmony_ci dev->info.service_mode); 1129141cc406Sopenharmony_ci dev->info.service_mode = 0x00; 1130141cc406Sopenharmony_ci } 1131141cc406Sopenharmony_ci if ((dev->info.scan_wait_mode = get_scan_wait_mode (fd)) != 0x00 1132141cc406Sopenharmony_ci && dev->info.scan_wait_mode != 0x01) 1133141cc406Sopenharmony_ci { 1134141cc406Sopenharmony_ci DBG (DBG_error, 1135141cc406Sopenharmony_ci ">>> attach: get_scan_wait_mode failed: return value=%#02x\n", 1136141cc406Sopenharmony_ci dev->info.scan_wait_mode); 1137141cc406Sopenharmony_ci dev->info.scan_wait_mode = 0x00; 1138141cc406Sopenharmony_ci } 1139141cc406Sopenharmony_ci status = get_white_balance (fd, &dev->info.white_balance); 1140141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD && dev->info.white_balance != 0x01) 1141141cc406Sopenharmony_ci { 1142141cc406Sopenharmony_ci DBG (DBG_error, 1143141cc406Sopenharmony_ci ">>> attach: get_white_balance failed: return value=%#02x\n", 1144141cc406Sopenharmony_ci dev->info.white_balance); 1145141cc406Sopenharmony_ci dev->info.white_balance = RELATIVE_WHITE; 1146141cc406Sopenharmony_ci } 1147141cc406Sopenharmony_ci 1148141cc406Sopenharmony_ci DBG (DBG_info, ">>> attach: flushing and closing fd=%d\n", fd); 1149141cc406Sopenharmony_ci sanei_scsi_req_flush_all (); 1150141cc406Sopenharmony_ci sanei_scsi_close (fd); 1151141cc406Sopenharmony_ci 1152141cc406Sopenharmony_ci dev->info.devtype = ibuf.devtype; 1153141cc406Sopenharmony_ci snprintf (dev->info.vendor, 9, "%-.5s", ibuf.vendor); /* RICOH */ 1154141cc406Sopenharmony_ci trim_spaces (dev->info.vendor, sizeof (dev->info.vendor)); 1155141cc406Sopenharmony_ci snprintf (dev->info.product, 16, "%-.16s", ibuf.product); /* IS450 */ 1156141cc406Sopenharmony_ci trim_spaces (dev->info.product, sizeof (dev->info.product)); 1157141cc406Sopenharmony_ci snprintf (dev->info.revision, 5, "%-.4s", ibuf.revision); /* 1R04 */ 1158141cc406Sopenharmony_ci trim_spaces (dev->info.revision, sizeof (dev->info.revision)); 1159141cc406Sopenharmony_ci 1160141cc406Sopenharmony_ci /* SANE_Device sane information */ 1161141cc406Sopenharmony_ci dev->sane.name = strdup (devname); 1162141cc406Sopenharmony_ci dev->sane.vendor = 1163141cc406Sopenharmony_ci (strcmp (dev->info.vendor, "RICOH") == 1164141cc406Sopenharmony_ci 0) ? strdup ("Ricoh") : strdup (dev->info.vendor); 1165141cc406Sopenharmony_ci dev->sane.model = strdup (dev->info.product); 1166141cc406Sopenharmony_ci dev->sane.type = strdup ("sheetfed scanner"); 1167141cc406Sopenharmony_ci /* 1168141cc406Sopenharmony_ci dev->sane.email_backend_author = strdup("<Jeremy Johnson> jeremy@acjlaw.net"); 1169141cc406Sopenharmony_ci dev->sane.backend_website = strdup("http://www.acjlaw.net:8080/~jeremy/Ricoh"); 1170141cc406Sopenharmony_ci */ 1171141cc406Sopenharmony_ci /* read these values from backend configuration file using parse_configuration 1172141cc406Sopenharmony_ci dev->sane.location = strdup(); 1173141cc406Sopenharmony_ci dev->sane.comment = strdup(); 1174141cc406Sopenharmony_ci dev->sane.backend_version_code = strdup(); 1175141cc406Sopenharmony_ci */ 1176141cc406Sopenharmony_ci /* NOT YET USED */ 1177141cc406Sopenharmony_ci /* dev->sane.backend_capablity_flags = 0x00; */ 1178141cc406Sopenharmony_ci 1179141cc406Sopenharmony_ci /* set capabilities from vpd */ 1180141cc406Sopenharmony_ci /* adf_id: 0=none,1=simplex,2=duplex,3=ARDF,4=reserved; should be 1 or 2 for IS450 family */ 1181141cc406Sopenharmony_ci dev->info.hasADF = vbuf.adf_id == 0 ? SANE_FALSE : SANE_TRUE; 1182141cc406Sopenharmony_ci dev->info.hasSimplex = vbuf.adf_id == 1 ? SANE_TRUE : SANE_FALSE; 1183141cc406Sopenharmony_ci dev->info.hasDuplex = vbuf.adf_id == 2 ? SANE_TRUE : SANE_FALSE; 1184141cc406Sopenharmony_ci dev->info.hasARDF = vbuf.adf_id == 3 ? SANE_TRUE : SANE_FALSE; 1185141cc406Sopenharmony_ci 1186141cc406Sopenharmony_ci /* end_id 0=none,1=Yes,2=reserved; should always be 0 or 1 */ 1187141cc406Sopenharmony_ci dev->info.hasEndorser = vbuf.end_id == 1 ? SANE_TRUE : SANE_FALSE; 1188141cc406Sopenharmony_ci for (i = 0; i < 20; i++) 1189141cc406Sopenharmony_ci dev->info.endorser_string[i] = '\0'; 1190141cc406Sopenharmony_ci 1191141cc406Sopenharmony_ci /* ipu_id: Bit0: '0'-no IPU, '1'-has IPU 1192141cc406Sopenharmony_ci * Bit1: '0'-no extended board, '1'-has extended board; 1193141cc406Sopenharmony_ci * should always be 0 1194141cc406Sopenharmony_ci */ 1195141cc406Sopenharmony_ci dev->info.hasIPU = (vbuf.ipu_id & 0x01) == 0x01 ? SANE_TRUE : SANE_FALSE; 1196141cc406Sopenharmony_ci dev->info.hasXBD = (vbuf.ipu_id & 0x02) == 0x02 ? SANE_TRUE : SANE_FALSE; 1197141cc406Sopenharmony_ci 1198141cc406Sopenharmony_ci 1199141cc406Sopenharmony_ci /* Image Composition Byte is set to 0x37 (0011 0111) */ 1200141cc406Sopenharmony_ci dev->info.supports_lineart = (vbuf.imagecomposition & 0x01) == 0x01 ? SANE_TRUE : SANE_FALSE; /* TRUE */ 1201141cc406Sopenharmony_ci dev->info.supports_dithering = (vbuf.imagecomposition & 0x02) == 0x02 ? SANE_TRUE : SANE_FALSE; /* TRUE */ 1202141cc406Sopenharmony_ci dev->info.supports_errordiffusion = (vbuf.imagecomposition & 0x04) == 0x04 ? SANE_TRUE : SANE_FALSE; /* TRUE */ 1203141cc406Sopenharmony_ci dev->info.supports_color = (vbuf.imagecomposition & 0x08) == 0x08 ? SANE_TRUE : SANE_FALSE; /* FALSE */ 1204141cc406Sopenharmony_ci dev->info.supports_4bitgray = (vbuf.imagecomposition & 0x10) == 0x10 ? SANE_TRUE : SANE_FALSE; /* TRUE */ 1205141cc406Sopenharmony_ci dev->info.supports_8bitgray = (vbuf.imagecomposition & 0x20) == 0x20 ? SANE_TRUE : SANE_FALSE; /* TRUE */ 1206141cc406Sopenharmony_ci /* vbuf.imagecomposition & 0x40; FALSE */ 1207141cc406Sopenharmony_ci /* vbuf.imagecomposition & 0x80 FALSE reserved */ 1208141cc406Sopenharmony_ci str = &scan_mode_list[0]; /* array of string pointers */ 1209141cc406Sopenharmony_ci if (dev->info.supports_lineart) 1210141cc406Sopenharmony_ci *str++ = strdup (SM_LINEART); 1211141cc406Sopenharmony_ci if (dev->info.supports_dithering || dev->info.supports_errordiffusion) 1212141cc406Sopenharmony_ci *str++ = strdup (SM_HALFTONE); 1213141cc406Sopenharmony_ci if (dev->info.supports_color) 1214141cc406Sopenharmony_ci *str++ = strdup (SM_COLOR); 1215141cc406Sopenharmony_ci if (dev->info.supports_4bitgray) 1216141cc406Sopenharmony_ci *str++ = strdup (SM_4BITGRAY); 1217141cc406Sopenharmony_ci if (dev->info.supports_8bitgray) 1218141cc406Sopenharmony_ci *str++ = strdup (SM_8BITGRAY); 1219141cc406Sopenharmony_ci *str = NULL; 1220141cc406Sopenharmony_ci 1221141cc406Sopenharmony_ci snprintf (device_string, 60, "Flatbed%s%s%s%s%s%s", 1222141cc406Sopenharmony_ci dev->info.hasADF ? "/ADF" : "", 1223141cc406Sopenharmony_ci dev->info.hasDuplex ? "/Duplex" : "", 1224141cc406Sopenharmony_ci dev->info.hasEndorser ? "/Endorser" : "", 1225141cc406Sopenharmony_ci dev->info.hasIPU ? "/IPU" : "", 1226141cc406Sopenharmony_ci dev->info.supports_color ? " Color" : " B&W", " Scanner"); 1227141cc406Sopenharmony_ci dev->sane.type = strdup (device_string); 1228141cc406Sopenharmony_ci 1229141cc406Sopenharmony_ci /* ACE Image Data Processing Binary Filters 1230141cc406Sopenharmony_ci * For IS450 this is set to 0x18 (0001 1000) if IPU installed, else 0x00 1231141cc406Sopenharmony_ci * For IS420 this is set to 0x3C (0011 1100) if IPU installed, else 0x00 1232141cc406Sopenharmony_ci */ 1233141cc406Sopenharmony_ci dev->info.supports_whiteframing = 1234141cc406Sopenharmony_ci ((vbuf.imagedataprocessing[0] & 0x01) == 0x01) ? SANE_TRUE : SANE_FALSE; 1235141cc406Sopenharmony_ci dev->info.supports_blackframing = 1236141cc406Sopenharmony_ci ((vbuf.imagedataprocessing[0] & 0x02) == 0x02) ? SANE_TRUE : SANE_FALSE; 1237141cc406Sopenharmony_ci dev->info.supports_edgeextraction = 1238141cc406Sopenharmony_ci ((vbuf.imagedataprocessing[0] & 0x04) == 0x04) ? SANE_TRUE : SANE_FALSE; 1239141cc406Sopenharmony_ci dev->info.supports_noiseremoval = 1240141cc406Sopenharmony_ci ((vbuf.imagedataprocessing[0] & 0x08) == 0x08) ? SANE_TRUE : SANE_FALSE; 1241141cc406Sopenharmony_ci dev->info.supports_smoothing = 1242141cc406Sopenharmony_ci ((vbuf.imagedataprocessing[0] & 0x10) == 0x10) ? SANE_TRUE : SANE_FALSE; 1243141cc406Sopenharmony_ci dev->info.supports_linebolding = 1244141cc406Sopenharmony_ci ((vbuf.imagedataprocessing[0] & 0x20) == 0x20) ? SANE_TRUE : SANE_FALSE; 1245141cc406Sopenharmony_ci 1246141cc406Sopenharmony_ci /* Compression Method is not supported for IS450 1247141cc406Sopenharmony_ci * is supported for IS420 */ 1248141cc406Sopenharmony_ci dev->info.supports_MH = 1249141cc406Sopenharmony_ci ((vbuf.compression & 0x01) == 0x01) ? SANE_TRUE : SANE_FALSE; 1250141cc406Sopenharmony_ci dev->info.supports_MR = 1251141cc406Sopenharmony_ci ((vbuf.compression & 0x02) == 0x02) ? SANE_TRUE : SANE_FALSE; 1252141cc406Sopenharmony_ci dev->info.supports_MMR = 1253141cc406Sopenharmony_ci ((vbuf.compression & 0x04) == 0x04) ? SANE_TRUE : SANE_FALSE; 1254141cc406Sopenharmony_ci dev->info.supports_MHB = ((vbuf.compression & 0x08) == 0x08) ? SANE_TRUE : SANE_FALSE; /* MH Byte Boundary */ 1255141cc406Sopenharmony_ci 1256141cc406Sopenharmony_ci /* compression_list[] will have variable number of elements, but the order will be fixed as follows: */ 1257141cc406Sopenharmony_ci str = &compression_list[0]; 1258141cc406Sopenharmony_ci *str++ = strdup ("none"); 1259141cc406Sopenharmony_ci if (dev->info.supports_MH) 1260141cc406Sopenharmony_ci *str++ = strdup ("G3 1-D MH"); 1261141cc406Sopenharmony_ci if (dev->info.supports_MR) 1262141cc406Sopenharmony_ci *str++ = strdup ("G3 2-D MR"); 1263141cc406Sopenharmony_ci if (dev->info.supports_MMR) 1264141cc406Sopenharmony_ci *str++ = strdup ("G4 2-D MMR"); 1265141cc406Sopenharmony_ci if (dev->info.supports_MHB) 1266141cc406Sopenharmony_ci *str++ = strdup ("MH Byte Boundary"); 1267141cc406Sopenharmony_ci *str = NULL; 1268141cc406Sopenharmony_ci 1269141cc406Sopenharmony_ci /* Marker Recognition is set to 0x00 */ 1270141cc406Sopenharmony_ci dev->info.supports_markerrecognition = 1271141cc406Sopenharmony_ci ((vbuf.markerrecognition & 0x01) == 0x01) ? SANE_TRUE : SANE_FALSE; 1272141cc406Sopenharmony_ci 1273141cc406Sopenharmony_ci /* Size Recognition 1274141cc406Sopenharmony_ci * For IS450 this is set to 0x01 when IPU installed; else 0x00 1275141cc406Sopenharmony_ci * For IS420 this is set to 0x01 1276141cc406Sopenharmony_ci */ 1277141cc406Sopenharmony_ci dev->info.supports_sizerecognition = 1278141cc406Sopenharmony_ci ((vbuf.sizerecognition & 0x01) == 0x01) ? SANE_TRUE : SANE_FALSE; 1279141cc406Sopenharmony_ci 1280141cc406Sopenharmony_ci /* X Maximum Output Pixel in main scanning direction 1281141cc406Sopenharmony_ci * For IS450 this is set to 0x1360 (4960) 1282141cc406Sopenharmony_ci * For IS420 this is set to (4880) 1283141cc406Sopenharmony_ci * [MostSignificantByte LeastSignificantByte] 1284141cc406Sopenharmony_ci */ 1285141cc406Sopenharmony_ci dev->info.xmaxoutputpixels = 1286141cc406Sopenharmony_ci (vbuf.xmaxoutputpixels[0] << 8) | vbuf.xmaxoutputpixels[1]; 1287141cc406Sopenharmony_ci 1288141cc406Sopenharmony_ci /* Set capabilities from jis VPD IDENTIFIER Page Code F0H */ 1289141cc406Sopenharmony_ci dev->info.resBasicX = _2btol (&jbuf.BasicRes.x[0]); /* set to 400 */ 1290141cc406Sopenharmony_ci dev->info.resBasicY = _2btol (&jbuf.BasicRes.y[0]); /* set to 400 */ 1291141cc406Sopenharmony_ci 1292141cc406Sopenharmony_ci dev->info.resXstep = (jbuf.resolutionstep >> 4) & 0x0F; /* set to 1 */ 1293141cc406Sopenharmony_ci dev->info.resYstep = jbuf.resolutionstep & 0x0F; /* set to 1 */ 1294141cc406Sopenharmony_ci dev->info.resMaxX = _2btol (&jbuf.MaxRes.x[0]); /* set to 800 */ 1295141cc406Sopenharmony_ci dev->info.resMaxY = _2btol (&jbuf.MaxRes.y[0]); /* set to 800 */ 1296141cc406Sopenharmony_ci dev->info.resMinX = _2btol (&jbuf.MinRes.x[0]); /* set to 100 for IS450 and 60 for IS420 */ 1297141cc406Sopenharmony_ci dev->info.resMinY = _2btol (&jbuf.MinRes.y[0]); /* set to 100 for IS450 and 60 for IS420 */ 1298141cc406Sopenharmony_ci 1299141cc406Sopenharmony_ci dev->info.xres_range.min = _2btol (&jbuf.MinRes.x[0]); /* set to 100 for IS450 and 60 for IS420 */ 1300141cc406Sopenharmony_ci dev->info.xres_range.max = _2btol (&jbuf.MaxRes.x[0]); /* set to 800 */ 1301141cc406Sopenharmony_ci dev->info.resXstep = (jbuf.resolutionstep >> 4) & 0x0F; /* set to 1 */ 1302141cc406Sopenharmony_ci dev->info.xres_range.quant = dev->info.resXstep; 1303141cc406Sopenharmony_ci 1304141cc406Sopenharmony_ci dev->info.yres_range.min = _2btol (&jbuf.MinRes.y[0]); /* set to 100 for IS450 and 60 for IS420 */ 1305141cc406Sopenharmony_ci dev->info.yres_range.max = _2btol (&jbuf.MaxRes.y[0]); /* set to 800 */ 1306141cc406Sopenharmony_ci dev->info.resYstep = jbuf.resolutionstep & 0x0F; /* set to 1 */ 1307141cc406Sopenharmony_ci dev->info.yres_range.quant = dev->info.resYstep; 1308141cc406Sopenharmony_ci 1309141cc406Sopenharmony_ci /* set the length of the list to zero first, then append standard resolutions */ 1310141cc406Sopenharmony_ci i = 0; 1311141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x80) == 0x80) 1312141cc406Sopenharmony_ci dev->info.resStdList[++i] = 60; 1313141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x40) == 0x40) 1314141cc406Sopenharmony_ci dev->info.resStdList[++i] = 75; 1315141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x20) == 0x20) 1316141cc406Sopenharmony_ci dev->info.resStdList[++i] = 100; 1317141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x10) == 0x10) 1318141cc406Sopenharmony_ci dev->info.resStdList[++i] = 120; 1319141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x08) == 0x08) 1320141cc406Sopenharmony_ci dev->info.resStdList[++i] = 150; 1321141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x04) == 0x04) 1322141cc406Sopenharmony_ci dev->info.resStdList[++i] = 160; 1323141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x02) == 0x02) 1324141cc406Sopenharmony_ci dev->info.resStdList[++i] = 180; 1325141cc406Sopenharmony_ci if ((jbuf.standardres[0] & 0x01) == 0x01) 1326141cc406Sopenharmony_ci dev->info.resStdList[++i] = 200; 1327141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x80) == 0x80) 1328141cc406Sopenharmony_ci dev->info.resStdList[++i] = 240; 1329141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x40) == 0x40) 1330141cc406Sopenharmony_ci dev->info.resStdList[++i] = 300; 1331141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x20) == 0x20) 1332141cc406Sopenharmony_ci dev->info.resStdList[++i] = 320; 1333141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x10) == 0x10) 1334141cc406Sopenharmony_ci dev->info.resStdList[++i] = 400; 1335141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x08) == 0x08) 1336141cc406Sopenharmony_ci dev->info.resStdList[++i] = 480; 1337141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x04) == 0x04) 1338141cc406Sopenharmony_ci dev->info.resStdList[++i] = 600; 1339141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x02) == 0x02) 1340141cc406Sopenharmony_ci dev->info.resStdList[++i] = 800; 1341141cc406Sopenharmony_ci if ((jbuf.standardres[1] & 0x01) == 0x01) 1342141cc406Sopenharmony_ci dev->info.resStdList[++i] = 1200; 1343141cc406Sopenharmony_ci dev->info.resStdList[0] = i; /* number of resolutions */ 1344141cc406Sopenharmony_ci if (dev->info.resStdList[0] == 0) 1345141cc406Sopenharmony_ci { /* make a default standard resolutions for 200 and 300dpi */ 1346141cc406Sopenharmony_ci DBG (DBG_warning, "attach: no standard resolutions reported\n"); 1347141cc406Sopenharmony_ci dev->info.resStdList[0] = 2; 1348141cc406Sopenharmony_ci dev->info.resStdList[1] = 200; 1349141cc406Sopenharmony_ci dev->info.resStdList[2] = 300; 1350141cc406Sopenharmony_ci dev->info.resBasicX = dev->info.resBasicY = 300; 1351141cc406Sopenharmony_ci } 1352141cc406Sopenharmony_ci DBG (DBG_info, "attach: Window(W/L) = (%lu/%lu)\n", 1353141cc406Sopenharmony_ci _4btol (&jbuf.Window.width[0]), _4btol (&jbuf.Window.length[0])); 1354141cc406Sopenharmony_ci dev->info.winWidth = _4btol (&jbuf.Window.width[0]); 1355141cc406Sopenharmony_ci dev->info.winHeight = _4btol (&jbuf.Window.length[0]); 1356141cc406Sopenharmony_ci if (dev->info.winWidth <= 0) 1357141cc406Sopenharmony_ci { 1358141cc406Sopenharmony_ci dev->info.winWidth = (SANE_Int) (dev->info.resBasicX * 8.5); 1359141cc406Sopenharmony_ci DBG (DBG_warning, "attach: invalid window width reported, using %d\n", 1360141cc406Sopenharmony_ci dev->info.winWidth); 1361141cc406Sopenharmony_ci } 1362141cc406Sopenharmony_ci if (dev->info.winHeight <= 0) 1363141cc406Sopenharmony_ci { 1364141cc406Sopenharmony_ci dev->info.winHeight = dev->info.resBasicY * 14; 1365141cc406Sopenharmony_ci DBG (DBG_warning, "attach: invalid window height reported, using %d\n", 1366141cc406Sopenharmony_ci dev->info.winHeight); 1367141cc406Sopenharmony_ci } 1368141cc406Sopenharmony_ci /* 4692 / 400 * 25.4 = 297 */ 1369141cc406Sopenharmony_ci mm = (dev->info.resBasicX > 0) ? 1370141cc406Sopenharmony_ci ((double) dev->info.winWidth / (double) dev->info.resBasicX * 1371141cc406Sopenharmony_ci MM_PER_INCH) : 0.0; 1372141cc406Sopenharmony_ci dev->info.x_range.min = SANE_FIX (0.0); 1373141cc406Sopenharmony_ci dev->info.x_range.max = SANE_FIX (mm); 1374141cc406Sopenharmony_ci dev->info.x_range.quant = SANE_FIX (0.0); 1375141cc406Sopenharmony_ci DBG (DBG_info, "attach: winWidth=%d resBasicX=%d mm/in=%f mm=%f\n", 1376141cc406Sopenharmony_ci dev->info.winWidth, dev->info.resBasicX, MM_PER_INCH, mm); 1377141cc406Sopenharmony_ci 1378141cc406Sopenharmony_ci mm = (dev->info.resBasicY > 0) ? 1379141cc406Sopenharmony_ci ((double) dev->info.winHeight / (double) dev->info.resBasicY * 1380141cc406Sopenharmony_ci MM_PER_INCH) : 0.0; 1381141cc406Sopenharmony_ci dev->info.y_range.min = SANE_FIX (0.0); 1382141cc406Sopenharmony_ci dev->info.y_range.max = SANE_FIX (mm); 1383141cc406Sopenharmony_ci dev->info.y_range.quant = SANE_FIX (0.0); 1384141cc406Sopenharmony_ci 1385141cc406Sopenharmony_ci DBG (DBG_info, "attach: RANGE x_range.max=%f, y_range.max=%f\n", 1386141cc406Sopenharmony_ci SANE_UNFIX (dev->info.x_range.max), 1387141cc406Sopenharmony_ci SANE_UNFIX (dev->info.y_range.max)); 1388141cc406Sopenharmony_ci 1389141cc406Sopenharmony_ci /* min, max, quantization light-dark 1-255, 0 means default 128 */ 1390141cc406Sopenharmony_ci dev->info.brightness_range.min = 1; 1391141cc406Sopenharmony_ci dev->info.brightness_range.max = 255; 1392141cc406Sopenharmony_ci dev->info.brightness_range.quant = 1; 1393141cc406Sopenharmony_ci /* min, max, quantization white-black 1-255, 0 means default 128 */ 1394141cc406Sopenharmony_ci dev->info.contrast_range.min = 1; 1395141cc406Sopenharmony_ci dev->info.contrast_range.max = 255; 1396141cc406Sopenharmony_ci dev->info.contrast_range.quant = 1; 1397141cc406Sopenharmony_ci /* min, max, quantization low-high 1-255, 0 means default 128 */ 1398141cc406Sopenharmony_ci dev->info.threshold_range.min = 1; 1399141cc406Sopenharmony_ci dev->info.threshold_range.max = 255; 1400141cc406Sopenharmony_ci dev->info.threshold_range.quant = 1; 1401141cc406Sopenharmony_ci 1402141cc406Sopenharmony_ci /* jbuf.functions */ 1403141cc406Sopenharmony_ci dev->info.overflow_support = 1404141cc406Sopenharmony_ci ((jbuf.functions & 0x01) == 0x01) ? SANE_TRUE : SANE_FALSE; 1405141cc406Sopenharmony_ci dev->info.lineart_support = 1406141cc406Sopenharmony_ci ((jbuf.functions & 0x02) == 0x02) ? SANE_TRUE : SANE_FALSE; 1407141cc406Sopenharmony_ci dev->info.dither_support = 1408141cc406Sopenharmony_ci ((jbuf.functions & 0x04) == 0x04) ? SANE_TRUE : SANE_FALSE; 1409141cc406Sopenharmony_ci dev->info.grayscale_support = 1410141cc406Sopenharmony_ci ((jbuf.functions & 0x08) == 0x08) ? SANE_TRUE : SANE_FALSE; 1411141cc406Sopenharmony_ci 1412141cc406Sopenharmony_ci /* set option defaults */ 1413141cc406Sopenharmony_ci dev->info.default_res = dev->info.resBasicX; 1414141cc406Sopenharmony_ci dev->info.default_xres = dev->info.resBasicX; 1415141cc406Sopenharmony_ci dev->info.default_yres = dev->info.resBasicY; 1416141cc406Sopenharmony_ci dev->info.default_imagecomposition = LINEART; 1417141cc406Sopenharmony_ci dev->info.default_media = FLATBED; 1418141cc406Sopenharmony_ci dev->info.default_duplex = SANE_FALSE; 1419141cc406Sopenharmony_ci 1420141cc406Sopenharmony_ci /* dev->info.autoborder_default = dev->info.canBorderRecog; */ 1421141cc406Sopenharmony_ci /* 1422141cc406Sopenharmony_ci dev->info.batch_default = SANE_FALSE; 1423141cc406Sopenharmony_ci dev->info.deskew_default = SANE_FALSE; 1424141cc406Sopenharmony_ci dev->info.check_adf_default = SANE_FALSE; 1425141cc406Sopenharmony_ci dev->info.timeout_adf_default = 0; 1426141cc406Sopenharmony_ci dev->info.timeout_manual_default = 0; 1427141cc406Sopenharmony_ci */ 1428141cc406Sopenharmony_ci /* dev->info.control_panel_default = dev->info.canACE; Image Data Processing */ 1429141cc406Sopenharmony_ci 1430141cc406Sopenharmony_ci ++num_devices; 1431141cc406Sopenharmony_ci dev->next = first_dev; 1432141cc406Sopenharmony_ci first_dev = dev; 1433141cc406Sopenharmony_ci 1434141cc406Sopenharmony_ci if (devp) 1435141cc406Sopenharmony_ci *devp = dev; 1436141cc406Sopenharmony_ci 1437141cc406Sopenharmony_ci DBG (DBG_sane_proc, "<<< attach:\n"); 1438141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1439141cc406Sopenharmony_ci} 1440141cc406Sopenharmony_ci 1441141cc406Sopenharmony_ci 1442141cc406Sopenharmony_ci 1443141cc406Sopenharmony_ci 1444141cc406Sopenharmony_ci/* SANE callback to attach a SCSI device */ 1445141cc406Sopenharmony_cistatic SANE_Status 1446141cc406Sopenharmony_ciattach_one_scsi (const char *devname) 1447141cc406Sopenharmony_ci{ 1448141cc406Sopenharmony_ci return attach (devname, CONNECTION_SCSI, NULL); 1449141cc406Sopenharmony_ci /* return SANE_STATUS_GOOD; */ 1450141cc406Sopenharmony_ci} 1451141cc406Sopenharmony_ci 1452141cc406Sopenharmony_cistatic void 1453141cc406Sopenharmony_ciparse_configuration_file (FILE * fp) 1454141cc406Sopenharmony_ci{ 1455141cc406Sopenharmony_ci char line[PATH_MAX], *s, *t; 1456141cc406Sopenharmony_ci int linenumber; 1457141cc406Sopenharmony_ci 1458141cc406Sopenharmony_ci DBG (DBG_proc, ">> parse_configuration_file\n"); 1459141cc406Sopenharmony_ci 1460141cc406Sopenharmony_ci if (fp == NULL) 1461141cc406Sopenharmony_ci { 1462141cc406Sopenharmony_ci DBG (DBG_proc, 1463141cc406Sopenharmony_ci ">> parse_configuration_file: No config file present!\n"); 1464141cc406Sopenharmony_ci } 1465141cc406Sopenharmony_ci else 1466141cc406Sopenharmony_ci { /*parse configuration file */ 1467141cc406Sopenharmony_ci for (linenumber = 0; sanei_config_read (line, sizeof (line), fp); 1468141cc406Sopenharmony_ci linenumber++) 1469141cc406Sopenharmony_ci { 1470141cc406Sopenharmony_ci DBG (DBG_proc, 1471141cc406Sopenharmony_ci ">> parse_configuration_file: parsing config line \"%s\"\n", 1472141cc406Sopenharmony_ci line); 1473141cc406Sopenharmony_ci if (line[0] == '#') 1474141cc406Sopenharmony_ci continue; /* ignore line comments */ 1475141cc406Sopenharmony_ci for (s = line; isspace (*s); ++s); /* skip white space: */ 1476141cc406Sopenharmony_ci for (t = s; *t != '\0'; t++); 1477141cc406Sopenharmony_ci for (--t; t > s && isspace (*t); t--); 1478141cc406Sopenharmony_ci *(++t) = '\0'; /*trim trailing space */ 1479141cc406Sopenharmony_ci if (!strlen (s)) 1480141cc406Sopenharmony_ci continue; /* ignore empty lines */ 1481141cc406Sopenharmony_ci if ((t = strstr (s, "scsi ")) != NULL) 1482141cc406Sopenharmony_ci { 1483141cc406Sopenharmony_ci /* scsi VENDOR MODEL TYPE BUS CHANNEL ID LUN */ 1484141cc406Sopenharmony_ci DBG (DBG_proc, 1485141cc406Sopenharmony_ci ">> parse_configuration_file: config file line %d: trying to attach SCSI: %s'\n", 1486141cc406Sopenharmony_ci linenumber, line); 1487141cc406Sopenharmony_ci sanei_config_attach_matching_devices (t, attach_one_scsi); 1488141cc406Sopenharmony_ci } 1489141cc406Sopenharmony_ci else if ((t = strstr (s, "/dev/")) != NULL) 1490141cc406Sopenharmony_ci { 1491141cc406Sopenharmony_ci /* /dev/scanner /dev/sg0 */ 1492141cc406Sopenharmony_ci DBG (DBG_proc, 1493141cc406Sopenharmony_ci ">> parse_configuration_file: config file line %d: trying to attach SCSI: %s'\n", 1494141cc406Sopenharmony_ci linenumber, line); 1495141cc406Sopenharmony_ci sanei_config_attach_matching_devices (t, attach_one_scsi); 1496141cc406Sopenharmony_ci } 1497141cc406Sopenharmony_ci else if ((t = strstr (s, "option")) != NULL) 1498141cc406Sopenharmony_ci { 1499141cc406Sopenharmony_ci for (t += 6; isspace (*t); t++); /* skip to flag */ 1500141cc406Sopenharmony_ci /* if(strstr(t,"FLAG_VALUE")!=NULL) FLAG_VALUE=SANE_TRUE; */ 1501141cc406Sopenharmony_ci } 1502141cc406Sopenharmony_ci else 1503141cc406Sopenharmony_ci { 1504141cc406Sopenharmony_ci DBG (DBG_proc, 1505141cc406Sopenharmony_ci ">> parse_configuration_file: config file line %d: OBSOLETE !! use the scsi keyword!\n", 1506141cc406Sopenharmony_ci linenumber); 1507141cc406Sopenharmony_ci DBG (DBG_proc, 1508141cc406Sopenharmony_ci ">> parse_configuration_file: (see man sane-avision for details): trying to attach SCSI: %s'\n", 1509141cc406Sopenharmony_ci line); 1510141cc406Sopenharmony_ci } 1511141cc406Sopenharmony_ci } 1512141cc406Sopenharmony_ci fclose (fp); 1513141cc406Sopenharmony_ci } 1514141cc406Sopenharmony_ci DBG (DBG_proc, "<< parse_configuration_file\n"); 1515141cc406Sopenharmony_ci return; 1516141cc406Sopenharmony_ci} 1517141cc406Sopenharmony_ci 1518141cc406Sopenharmony_cistatic SANE_Status 1519141cc406Sopenharmony_cido_cancel (HS2P_Scanner * s) 1520141cc406Sopenharmony_ci{ 1521141cc406Sopenharmony_ci SANE_Status status; 1522141cc406Sopenharmony_ci DBG (DBG_sane_proc, ">> do_cancel\n"); 1523141cc406Sopenharmony_ci 1524141cc406Sopenharmony_ci DBG (DBG_proc, "cancel: sending OBJECT POSITION\n"); 1525141cc406Sopenharmony_ci 1526141cc406Sopenharmony_ci s->scanning = SANE_FALSE; 1527141cc406Sopenharmony_ci s->cancelled = SANE_TRUE; 1528141cc406Sopenharmony_ci s->EOM = SANE_FALSE; 1529141cc406Sopenharmony_ci 1530141cc406Sopenharmony_ci if (s->fd >= 0) 1531141cc406Sopenharmony_ci { 1532141cc406Sopenharmony_ci if ((status = 1533141cc406Sopenharmony_ci object_position (s->fd, 1534141cc406Sopenharmony_ci OBJECT_POSITION_UNLOAD)) != SANE_STATUS_GOOD) 1535141cc406Sopenharmony_ci { 1536141cc406Sopenharmony_ci DBG (DBG_error, "cancel: OBJECT POSITION failed\n"); 1537141cc406Sopenharmony_ci } 1538141cc406Sopenharmony_ci sanei_scsi_req_flush_all (); 1539141cc406Sopenharmony_ci release_unit (s->fd); 1540141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 1541141cc406Sopenharmony_ci s->fd = -1; 1542141cc406Sopenharmony_ci } 1543141cc406Sopenharmony_ci /* 1544141cc406Sopenharmony_ci if (s->reader_pid > 0){ 1545141cc406Sopenharmony_ci int exit_status; 1546141cc406Sopenharmony_ci sanei_thread_kill (s->reader_pid); 1547141cc406Sopenharmony_ci sanei_thread_waitpid (s->reader_pid, &exit_status); 1548141cc406Sopenharmony_ci s->reader_pid = 0; 1549141cc406Sopenharmony_ci } 1550141cc406Sopenharmony_ci */ 1551141cc406Sopenharmony_ci 1552141cc406Sopenharmony_ci DBG (DBG_sane_proc, "<< do_cancel\n"); 1553141cc406Sopenharmony_ci return (SANE_STATUS_CANCELLED); 1554141cc406Sopenharmony_ci} 1555141cc406Sopenharmony_ci 1556141cc406Sopenharmony_ci 1557141cc406Sopenharmony_ciSANE_Status 1558141cc406Sopenharmony_cisane_init (SANE_Int * version_code, 1559141cc406Sopenharmony_ci SANE_Auth_Callback __sane_unused__ authorize) 1560141cc406Sopenharmony_ci{ 1561141cc406Sopenharmony_ci FILE *fp; 1562141cc406Sopenharmony_ci 1563141cc406Sopenharmony_ci DBG_INIT (); /* initialize SANE DEBUG */ 1564141cc406Sopenharmony_ci 1565141cc406Sopenharmony_ci /*DBG (DBG_sane_init, "> sane_init (authorize = %p)\n", (void *) authorize); */ 1566141cc406Sopenharmony_ci#if defined PACKAGE && defined VERSION 1567141cc406Sopenharmony_ci DBG (DBG_sane_init, "> sane_init: hs2p backend version %d.%d-%d (" 1568141cc406Sopenharmony_ci PACKAGE " " VERSION ")\n", SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); 1569141cc406Sopenharmony_ci#endif 1570141cc406Sopenharmony_ci /* 1571141cc406Sopenharmony_ci sanei_thread_init (); 1572141cc406Sopenharmony_ci */ 1573141cc406Sopenharmony_ci 1574141cc406Sopenharmony_ci if (version_code) 1575141cc406Sopenharmony_ci *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); 1576141cc406Sopenharmony_ci 1577141cc406Sopenharmony_ci 1578141cc406Sopenharmony_ci if ((fp = sanei_config_open (HS2P_CONFIG_FILE)) != NULL) 1579141cc406Sopenharmony_ci { 1580141cc406Sopenharmony_ci parse_configuration_file (fp); 1581141cc406Sopenharmony_ci } 1582141cc406Sopenharmony_ci else 1583141cc406Sopenharmony_ci { 1584141cc406Sopenharmony_ci DBG (DBG_sane_init, "> sane_init: No config file \"%s\" present!\n", 1585141cc406Sopenharmony_ci HS2P_CONFIG_FILE); 1586141cc406Sopenharmony_ci } 1587141cc406Sopenharmony_ci 1588141cc406Sopenharmony_ci#if 0 1589141cc406Sopenharmony_ci /* avision.c: search for all supported scanners on all scsi buses & channels */ 1590141cc406Sopenharmony_ci for (hw = &HS2P_Device_List[0]; hw->mfg != NULL; hw++) 1591141cc406Sopenharmony_ci { 1592141cc406Sopenharmony_ci sanei_scsi_find_devices (hw->mfg, /*vendor */ 1593141cc406Sopenharmony_ci hw->model, /*model */ 1594141cc406Sopenharmony_ci NULL, /*all types */ 1595141cc406Sopenharmony_ci -1, /*all bus */ 1596141cc406Sopenharmony_ci -1, /*all channel */ 1597141cc406Sopenharmony_ci -1, /*all id */ 1598141cc406Sopenharmony_ci -1, /*all lun */ 1599141cc406Sopenharmony_ci attach_one_scsi); /*callback */ 1600141cc406Sopenharmony_ci DBG (2, "sane_init: %s %s\n", hw->mfg, hw->model); 1601141cc406Sopenharmony_ci } 1602141cc406Sopenharmony_ci#endif 1603141cc406Sopenharmony_ci 1604141cc406Sopenharmony_ci DBG (DBG_sane_init, "< sane_init\n"); 1605141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1606141cc406Sopenharmony_ci} 1607141cc406Sopenharmony_ci 1608141cc406Sopenharmony_civoid 1609141cc406Sopenharmony_cisane_exit (void) 1610141cc406Sopenharmony_ci{ 1611141cc406Sopenharmony_ci HS2P_Device *dev, *next; 1612141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_exit\n"); 1613141cc406Sopenharmony_ci 1614141cc406Sopenharmony_ci for (dev = first_dev; dev; dev = next) 1615141cc406Sopenharmony_ci { 1616141cc406Sopenharmony_ci next = dev->next; 1617141cc406Sopenharmony_ci free ((void *) (SANE_String_Const *) dev->sane.name); 1618141cc406Sopenharmony_ci free ((SANE_String_Const *) dev->sane.model); 1619141cc406Sopenharmony_ci free (dev); 1620141cc406Sopenharmony_ci } 1621141cc406Sopenharmony_ci 1622141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_exit\n"); 1623141cc406Sopenharmony_ci} 1624141cc406Sopenharmony_ci 1625141cc406Sopenharmony_ciSANE_Status 1626141cc406Sopenharmony_cisane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) 1627141cc406Sopenharmony_ci{ 1628141cc406Sopenharmony_ci static const SANE_Device **devlist = 0; 1629141cc406Sopenharmony_ci HS2P_Device *dev; 1630141cc406Sopenharmony_ci int i; 1631141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_get_devices (local_only = %d)\n", local_only); 1632141cc406Sopenharmony_ci 1633141cc406Sopenharmony_ci if (devlist) 1634141cc406Sopenharmony_ci free (devlist); 1635141cc406Sopenharmony_ci devlist = malloc ((num_devices + 1) * sizeof (devlist[0])); 1636141cc406Sopenharmony_ci if (!devlist) 1637141cc406Sopenharmony_ci return (SANE_STATUS_NO_MEM); 1638141cc406Sopenharmony_ci 1639141cc406Sopenharmony_ci i = 0; 1640141cc406Sopenharmony_ci for (dev = first_dev; dev; dev = dev->next) 1641141cc406Sopenharmony_ci devlist[i++] = &dev->sane; 1642141cc406Sopenharmony_ci devlist[i++] = 0; 1643141cc406Sopenharmony_ci 1644141cc406Sopenharmony_ci *device_list = devlist; 1645141cc406Sopenharmony_ci 1646141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_get_devices\n"); 1647141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1648141cc406Sopenharmony_ci} 1649141cc406Sopenharmony_ci 1650141cc406Sopenharmony_ciSANE_Status 1651141cc406Sopenharmony_cisane_open (SANE_String_Const devnam, SANE_Handle * handle) 1652141cc406Sopenharmony_ci{ 1653141cc406Sopenharmony_ci SANE_Status status; 1654141cc406Sopenharmony_ci HS2P_Device *dev; 1655141cc406Sopenharmony_ci HS2P_Scanner *s; 1656141cc406Sopenharmony_ci DBG (DBG_proc, "> sane_open\n"); 1657141cc406Sopenharmony_ci 1658141cc406Sopenharmony_ci if (devnam[0] == '\0') 1659141cc406Sopenharmony_ci { 1660141cc406Sopenharmony_ci for (dev = first_dev; dev; dev = dev->next) 1661141cc406Sopenharmony_ci { 1662141cc406Sopenharmony_ci if (strcmp (dev->sane.name, devnam) == 0) 1663141cc406Sopenharmony_ci break; 1664141cc406Sopenharmony_ci } 1665141cc406Sopenharmony_ci if (!dev) 1666141cc406Sopenharmony_ci { 1667141cc406Sopenharmony_ci status = attach (devnam, CONNECTION_SCSI, &dev); 1668141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1669141cc406Sopenharmony_ci return (status); 1670141cc406Sopenharmony_ci } 1671141cc406Sopenharmony_ci } 1672141cc406Sopenharmony_ci else 1673141cc406Sopenharmony_ci { 1674141cc406Sopenharmony_ci dev = first_dev; 1675141cc406Sopenharmony_ci } 1676141cc406Sopenharmony_ci if (!dev) 1677141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 1678141cc406Sopenharmony_ci 1679141cc406Sopenharmony_ci s = malloc (sizeof (*s)); 1680141cc406Sopenharmony_ci if (!s) 1681141cc406Sopenharmony_ci return SANE_STATUS_NO_MEM; 1682141cc406Sopenharmony_ci memset (s, 0, sizeof (*s)); /* initialize */ 1683141cc406Sopenharmony_ci 1684141cc406Sopenharmony_ci s->fd = -1; 1685141cc406Sopenharmony_ci s->hw = dev; 1686141cc406Sopenharmony_ci s->hw->info.bmu = s->bmu = MILLIMETERS; /* 01H */ 1687141cc406Sopenharmony_ci s->hw->info.mud = s->mud = 1; /* If the scale is MM or POINT, mud is fixed to 1 */ 1688141cc406Sopenharmony_ci s->bpp = 1; /* supports 1,4,6,8 so we set to LINEART 1bpp */ 1689141cc406Sopenharmony_ci /* 1690141cc406Sopenharmony_ci s->scanning = SANE_FALSE; 1691141cc406Sopenharmony_ci s->cancelled = SANE_FALSE; 1692141cc406Sopenharmony_ci */ 1693141cc406Sopenharmony_ci /* 1694141cc406Sopenharmony_ci */ 1695141cc406Sopenharmony_ci 1696141cc406Sopenharmony_ci ScannerDump (s); 1697141cc406Sopenharmony_ci init_options (s); 1698141cc406Sopenharmony_ci 1699141cc406Sopenharmony_ci s->next = first_handle; /* insert newly opened handle into list of open handles: */ 1700141cc406Sopenharmony_ci first_handle = s; 1701141cc406Sopenharmony_ci 1702141cc406Sopenharmony_ci /* initialize our parameters here AND in sane_start? 1703141cc406Sopenharmony_ci get_parameters(s, 0); 1704141cc406Sopenharmony_ci */ 1705141cc406Sopenharmony_ci 1706141cc406Sopenharmony_ci *handle = s; 1707141cc406Sopenharmony_ci 1708141cc406Sopenharmony_ci DBG (DBG_proc, "< sane_open\n"); 1709141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1710141cc406Sopenharmony_ci} 1711141cc406Sopenharmony_ci 1712141cc406Sopenharmony_civoid 1713141cc406Sopenharmony_cisane_close (SANE_Handle handle) 1714141cc406Sopenharmony_ci{ 1715141cc406Sopenharmony_ci HS2P_Scanner *s = (HS2P_Scanner *) handle; 1716141cc406Sopenharmony_ci char **str; 1717141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_close\n"); 1718141cc406Sopenharmony_ci 1719141cc406Sopenharmony_ci if (s->fd != -1) 1720141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 1721141cc406Sopenharmony_ci free (s); 1722141cc406Sopenharmony_ci 1723141cc406Sopenharmony_ci for (str = &compression_list[0]; *str; str++); 1724141cc406Sopenharmony_ci free (*str); 1725141cc406Sopenharmony_ci for (str = &scan_mode_list[0]; *str; str++); 1726141cc406Sopenharmony_ci free (*str); 1727141cc406Sopenharmony_ci 1728141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_close\n"); 1729141cc406Sopenharmony_ci} 1730141cc406Sopenharmony_ci 1731141cc406Sopenharmony_ciconst SANE_Option_Descriptor * 1732141cc406Sopenharmony_cisane_get_option_descriptor (SANE_Handle handle, SANE_Int option) 1733141cc406Sopenharmony_ci{ 1734141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 1735141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_get_option_descriptor: %d name=%s\n", option, 1736141cc406Sopenharmony_ci s->opt[option].name); 1737141cc406Sopenharmony_ci 1738141cc406Sopenharmony_ci if ((unsigned) option >= NUM_OPTIONS) 1739141cc406Sopenharmony_ci return (0); 1740141cc406Sopenharmony_ci 1741141cc406Sopenharmony_ci DBG (DBG_info, "<< sane_get_option_descriptor: name=%s\n", 1742141cc406Sopenharmony_ci s->opt[option].name); 1743141cc406Sopenharmony_ci return (s->opt + option); 1744141cc406Sopenharmony_ci} 1745141cc406Sopenharmony_ci 1746141cc406Sopenharmony_ci#if 0 1747141cc406Sopenharmony_cistatic SANE_Int 1748141cc406Sopenharmony_ciget_scan_mode_id (char *s) /* sequential search */ 1749141cc406Sopenharmony_ci{ 1750141cc406Sopenharmony_ci SANE_Int i; 1751141cc406Sopenharmony_ci 1752141cc406Sopenharmony_ci for (i = 0; scan_mode_list[i]; i++) 1753141cc406Sopenharmony_ci if (strcmp (s, scan_mode_list[i]) == 0) 1754141cc406Sopenharmony_ci break; 1755141cc406Sopenharmony_ci 1756141cc406Sopenharmony_ci /* unknown strings are treated as 'lineart' */ 1757141cc406Sopenharmony_ci return scan_mode_list[i] ? i : 0; 1758141cc406Sopenharmony_ci} 1759141cc406Sopenharmony_ci#endif 1760141cc406Sopenharmony_cistatic SANE_Status 1761141cc406Sopenharmony_ciupdate_hs2p_data (HS2P_Scanner * s) 1762141cc406Sopenharmony_ci{ 1763141cc406Sopenharmony_ci 1764141cc406Sopenharmony_ci DBG (DBG_proc, ">> update_hs2p_data\n"); 1765141cc406Sopenharmony_ci /* OPT_NREGX_ADF: */ 1766141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGX_ADF\n"); 1767141cc406Sopenharmony_ci s->val[OPT_NREGX_ADF].w = (SANE_Word) s->data.maintenance.nregx_adf; 1768141cc406Sopenharmony_ci 1769141cc406Sopenharmony_ci /* OPT_NREGY_ADF: */ 1770141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGY_ADF\n"); 1771141cc406Sopenharmony_ci s->val[OPT_NREGY_ADF].w = (SANE_Word) s->data.maintenance.nregx_book; 1772141cc406Sopenharmony_ci 1773141cc406Sopenharmony_ci /* OPT_NREGX_BOOK: */ 1774141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGX_BOOK\n"); 1775141cc406Sopenharmony_ci s->val[OPT_NREGX_BOOK].w = (SANE_Word) s->data.maintenance.nregx_book; 1776141cc406Sopenharmony_ci 1777141cc406Sopenharmony_ci /* OPT_NREGY_BOOK: */ 1778141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGY_BOOK\n"); 1779141cc406Sopenharmony_ci s->val[OPT_NREGY_BOOK].w = (SANE_Word) s->data.maintenance.nregy_book; 1780141cc406Sopenharmony_ci 1781141cc406Sopenharmony_ci /* OPT_NSCANS_ADF: */ 1782141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NSCANS_ADF\n"); 1783141cc406Sopenharmony_ci s->val[OPT_NSCANS_ADF].w = 1784141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nscans_adf[0])); 1785141cc406Sopenharmony_ci 1786141cc406Sopenharmony_ci /* OPT_NSCANS_BOOK: */ 1787141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NSCANS_BOOK\n"); 1788141cc406Sopenharmony_ci s->val[OPT_NSCANS_BOOK].w = 1789141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nscans_book[0])); 1790141cc406Sopenharmony_ci 1791141cc406Sopenharmony_ci /* OPT_LAMP_TIME: */ 1792141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_LAMP_TIME\n"); 1793141cc406Sopenharmony_ci s->val[OPT_LAMP_TIME].w = 1794141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.lamp_time[0])); 1795141cc406Sopenharmony_ci 1796141cc406Sopenharmony_ci /* OPT_EO_ODD: */ 1797141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_EO_ODD\n"); 1798141cc406Sopenharmony_ci s->val[OPT_EO_ODD].w = (SANE_Word) s->data.maintenance.eo_odd; 1799141cc406Sopenharmony_ci 1800141cc406Sopenharmony_ci /* OPT_EO_EVEN: */ 1801141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_EO_EVEN\n"); 1802141cc406Sopenharmony_ci s->val[OPT_EO_EVEN].w = (SANE_Word) s->data.maintenance.eo_even; 1803141cc406Sopenharmony_ci 1804141cc406Sopenharmony_ci /* OPT_BLACK_LEVEL_ODD: */ 1805141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_BLACK_LEVEL_ODD\n"); 1806141cc406Sopenharmony_ci s->val[OPT_BLACK_LEVEL_ODD].w = 1807141cc406Sopenharmony_ci (SANE_Word) s->data.maintenance.black_level_odd; 1808141cc406Sopenharmony_ci 1809141cc406Sopenharmony_ci /* OPT_BLACK_LEVEL_EVEN: */ 1810141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_BLACK_LEVEL_EVEN\n"); 1811141cc406Sopenharmony_ci s->val[OPT_BLACK_LEVEL_EVEN].w = 1812141cc406Sopenharmony_ci (SANE_Word) s->data.maintenance.black_level_even; 1813141cc406Sopenharmony_ci 1814141cc406Sopenharmony_ci /* OPT_WHITE_LEVEL_ODD: */ 1815141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_WHITE_LEVEL_ODD\n"); 1816141cc406Sopenharmony_ci s->val[OPT_WHITE_LEVEL_ODD].w = 1817141cc406Sopenharmony_ci (SANE_Word) _2btol (&(s->data.maintenance.white_level_odd[0])); 1818141cc406Sopenharmony_ci 1819141cc406Sopenharmony_ci /* OPT_WHITE_LEVEL_EVEN: */ 1820141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_WHITE_LEVEL_EVEN\n"); 1821141cc406Sopenharmony_ci s->val[OPT_WHITE_LEVEL_EVEN].w = 1822141cc406Sopenharmony_ci (SANE_Word) _2btol (&(s->data.maintenance.white_level_even[0])); 1823141cc406Sopenharmony_ci 1824141cc406Sopenharmony_ci /* OPT_FIRST_ADJ_WHITE_ODD: */ 1825141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_FIRST_ADJ_WHITE_ODD\n"); 1826141cc406Sopenharmony_ci s->val[OPT_FIRST_ADJ_WHITE_ODD].w = 1827141cc406Sopenharmony_ci (SANE_Word) _2btol (&(s->data.maintenance.first_adj_white_odd[0])); 1828141cc406Sopenharmony_ci 1829141cc406Sopenharmony_ci /* OPT_FIRST_ADJ_WHITE_EVEN: */ 1830141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_FIRST_ADJ_WHITE_EVEN\n"); 1831141cc406Sopenharmony_ci s->val[OPT_FIRST_ADJ_WHITE_EVEN].w = 1832141cc406Sopenharmony_ci (SANE_Word) _2btol (&(s->data.maintenance.first_adj_white_even[0])); 1833141cc406Sopenharmony_ci 1834141cc406Sopenharmony_ci /* OPT_DENSITY: */ 1835141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_DENSITY\n"); 1836141cc406Sopenharmony_ci s->val[OPT_DENSITY].w = (SANE_Word) s->data.maintenance.density_adj; 1837141cc406Sopenharmony_ci 1838141cc406Sopenharmony_ci /* OPT_NREGX_REVERSE: */ 1839141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGX_REVERSE\n"); 1840141cc406Sopenharmony_ci s->val[OPT_NREGX_REVERSE].w = (SANE_Word) s->data.maintenance.nregx_reverse; 1841141cc406Sopenharmony_ci 1842141cc406Sopenharmony_ci /* OPT_NREGY_REVERSE: */ 1843141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGY_REVERSE\n"); 1844141cc406Sopenharmony_ci s->val[OPT_NREGY_REVERSE].w = (SANE_Word) s->data.maintenance.nregy_reverse; 1845141cc406Sopenharmony_ci 1846141cc406Sopenharmony_ci /* OPT_NSCANS_REVERSE_ADF: */ 1847141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NSCANS_REVERSE_ADF\n"); 1848141cc406Sopenharmony_ci s->val[OPT_NSCANS_REVERSE_ADF].w = 1849141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nscans_reverse_adf[0])); 1850141cc406Sopenharmony_ci 1851141cc406Sopenharmony_ci /* OPT_REVERSE_TIME: */ 1852141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_REVERSE_TIME\n"); 1853141cc406Sopenharmony_ci s->val[OPT_REVERSE_TIME].w = 1854141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.reverse_time[0])); 1855141cc406Sopenharmony_ci 1856141cc406Sopenharmony_ci /* OPT_NCHARS: */ 1857141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NCHARS\n"); 1858141cc406Sopenharmony_ci s->val[OPT_NCHARS].w = 1859141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nchars[0])); 1860141cc406Sopenharmony_ci 1861141cc406Sopenharmony_ci DBG (DBG_proc, "<< update_hs2p_data\n"); 1862141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1863141cc406Sopenharmony_ci} 1864141cc406Sopenharmony_ci 1865141cc406Sopenharmony_cistatic SANE_Status 1866141cc406Sopenharmony_cihs2p_open (HS2P_Scanner * s) 1867141cc406Sopenharmony_ci{ 1868141cc406Sopenharmony_ci SANE_Status status; 1869141cc406Sopenharmony_ci DBG (DBG_proc, ">> hs2p_open\n"); 1870141cc406Sopenharmony_ci DBG (DBG_info, ">> hs2p_open: trying to open: name=\"%s\" fd=%d\n", 1871141cc406Sopenharmony_ci s->hw->sane.name, s->fd); 1872141cc406Sopenharmony_ci if ((status = 1873141cc406Sopenharmony_ci sanei_scsi_open (s->hw->sane.name, &s->fd, &sense_handler, 1874141cc406Sopenharmony_ci &(s->hw->sense_data))) != SANE_STATUS_GOOD) 1875141cc406Sopenharmony_ci { 1876141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: open of %s failed: %d %s\n", 1877141cc406Sopenharmony_ci s->hw->sane.name, status, sane_strstatus (status)); 1878141cc406Sopenharmony_ci return (status); 1879141cc406Sopenharmony_ci } 1880141cc406Sopenharmony_ci DBG (DBG_info, ">>hs2p_open: OPENED \"%s\" fd=%d\n", s->hw->sane.name, 1881141cc406Sopenharmony_ci s->fd); 1882141cc406Sopenharmony_ci 1883141cc406Sopenharmony_ci if ((status = test_unit_ready (s->fd)) != SANE_STATUS_GOOD) 1884141cc406Sopenharmony_ci { 1885141cc406Sopenharmony_ci DBG (DBG_error, "hs2p_open: test_unit_ready() failed: %s\n", 1886141cc406Sopenharmony_ci sane_strstatus (status)); 1887141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 1888141cc406Sopenharmony_ci s->fd = -1; 1889141cc406Sopenharmony_ci return status; 1890141cc406Sopenharmony_ci } 1891141cc406Sopenharmony_ci DBG (DBG_proc, "<< hs2p_open\n"); 1892141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1893141cc406Sopenharmony_ci} 1894141cc406Sopenharmony_ci 1895141cc406Sopenharmony_cistatic SANE_Status 1896141cc406Sopenharmony_cihs2p_close (HS2P_Scanner * s) 1897141cc406Sopenharmony_ci{ 1898141cc406Sopenharmony_ci 1899141cc406Sopenharmony_ci DBG (DBG_proc, ">> hs2p_close\n"); 1900141cc406Sopenharmony_ci 1901141cc406Sopenharmony_ci release_unit (s->fd); 1902141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 1903141cc406Sopenharmony_ci s->fd = -1; 1904141cc406Sopenharmony_ci 1905141cc406Sopenharmony_ci DBG (DBG_proc, "<< hs2p_close\n"); 1906141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 1907141cc406Sopenharmony_ci} 1908141cc406Sopenharmony_ci 1909141cc406Sopenharmony_ci#include <stdarg.h> 1910141cc406Sopenharmony_cistatic SANE_Status 1911141cc406Sopenharmony_ciget_hs2p_data (HS2P_Scanner * s, ...) 1912141cc406Sopenharmony_ci{ 1913141cc406Sopenharmony_ci SANE_Status status; 1914141cc406Sopenharmony_ci SANE_Byte *buf; 1915141cc406Sopenharmony_ci size_t *len = &(s->data.bufsize); 1916141cc406Sopenharmony_ci int dtc, fd = s->fd; 1917141cc406Sopenharmony_ci u_long dtq = 0; /* two bytes */ 1918141cc406Sopenharmony_ci va_list ap; 1919141cc406Sopenharmony_ci 1920141cc406Sopenharmony_ci DBG (DBG_proc, ">> get_hs2p_data\n"); 1921141cc406Sopenharmony_ci if (fd < 0) 1922141cc406Sopenharmony_ci { 1923141cc406Sopenharmony_ci status = hs2p_open (s); 1924141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1925141cc406Sopenharmony_ci { 1926141cc406Sopenharmony_ci DBG (DBG_error, "get_hs2p_data: error opening scanner: %s\n", 1927141cc406Sopenharmony_ci sane_strstatus (status)); 1928141cc406Sopenharmony_ci return status; 1929141cc406Sopenharmony_ci } 1930141cc406Sopenharmony_ci } 1931141cc406Sopenharmony_ci 1932141cc406Sopenharmony_ci for (va_start (ap, s), dtc = va_arg (ap, int); dtc != DATA_TYPE_EOL; 1933141cc406Sopenharmony_ci dtc = va_arg (ap, int)) 1934141cc406Sopenharmony_ci { 1935141cc406Sopenharmony_ci DBG (DBG_proc, ">> get_hs2p_data 0x%2.2x\n", (int) dtc); 1936141cc406Sopenharmony_ci switch (dtc) 1937141cc406Sopenharmony_ci { 1938141cc406Sopenharmony_ci case DATA_TYPE_GAMMA: 1939141cc406Sopenharmony_ci buf = &(s->data.gamma[0]); 1940141cc406Sopenharmony_ci *len = sizeof (s->data.gamma); 1941141cc406Sopenharmony_ci break; 1942141cc406Sopenharmony_ci case DATA_TYPE_ENDORSER: 1943141cc406Sopenharmony_ci buf = &(s->data.endorser[0]); 1944141cc406Sopenharmony_ci *len = sizeof (s->data.endorser); 1945141cc406Sopenharmony_ci break; 1946141cc406Sopenharmony_ci case DATA_TYPE_SIZE: 1947141cc406Sopenharmony_ci buf = &(s->data.size); 1948141cc406Sopenharmony_ci *len = sizeof (s->data.size); 1949141cc406Sopenharmony_ci break; 1950141cc406Sopenharmony_ci case DATA_TYPE_PAGE_LEN: 1951141cc406Sopenharmony_ci buf = s->data.nlines; 1952141cc406Sopenharmony_ci *len = sizeof (s->data.nlines); 1953141cc406Sopenharmony_ci break; 1954141cc406Sopenharmony_ci case DATA_TYPE_MAINTENANCE: 1955141cc406Sopenharmony_ci buf = (SANE_Byte *) & (s->data.maintenance); 1956141cc406Sopenharmony_ci *len = sizeof (s->data.maintenance); 1957141cc406Sopenharmony_ci break; 1958141cc406Sopenharmony_ci case DATA_TYPE_ADF_STATUS: 1959141cc406Sopenharmony_ci buf = &(s->data.adf_status); 1960141cc406Sopenharmony_ci *len = sizeof (s->data.adf_status); 1961141cc406Sopenharmony_ci break; 1962141cc406Sopenharmony_ci case DATA_TYPE_IMAGE: 1963141cc406Sopenharmony_ci case DATA_TYPE_HALFTONE: 1964141cc406Sopenharmony_ci default: 1965141cc406Sopenharmony_ci DBG (DBG_info, "Data Type Code %2.2x not handled.\n", dtc); 1966141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 1967141cc406Sopenharmony_ci } 1968141cc406Sopenharmony_ci DBG (DBG_info, 1969141cc406Sopenharmony_ci "get_hs2p_data calling read_data for dtc=%2.2x and bufsize=%lu\n", 1970141cc406Sopenharmony_ci (int) dtc, (u_long) * len); 1971141cc406Sopenharmony_ci status = read_data (s->fd, buf, len, (SANE_Byte) dtc, dtq); 1972141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1973141cc406Sopenharmony_ci { 1974141cc406Sopenharmony_ci DBG (DBG_error, "get_scanner_data: ERROR %s\n", 1975141cc406Sopenharmony_ci sane_strstatus (status)); 1976141cc406Sopenharmony_ci } 1977141cc406Sopenharmony_ci } 1978141cc406Sopenharmony_ci va_end (ap); 1979141cc406Sopenharmony_ci 1980141cc406Sopenharmony_ci if (fd < 0) 1981141cc406Sopenharmony_ci { /* need to return fd to original state */ 1982141cc406Sopenharmony_ci status = hs2p_close (s); 1983141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 1984141cc406Sopenharmony_ci { 1985141cc406Sopenharmony_ci DBG (DBG_error, "get_hs2p_data: error closing fd: %s\n", 1986141cc406Sopenharmony_ci sane_strstatus (status)); 1987141cc406Sopenharmony_ci } 1988141cc406Sopenharmony_ci } 1989141cc406Sopenharmony_ci DBG (DBG_proc, "<< get_hs2p_data: %d\n", status); 1990141cc406Sopenharmony_ci return (status); 1991141cc406Sopenharmony_ci} 1992141cc406Sopenharmony_ci 1993141cc406Sopenharmony_cistatic SANE_Status 1994141cc406Sopenharmony_ciprint_maintenance_data (MAINTENANCE_DATA * d) 1995141cc406Sopenharmony_ci{ 1996141cc406Sopenharmony_ci DBG (DBG_proc, ">> print_maintenance_data: \n"); 1997141cc406Sopenharmony_ci 1998141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nregx_adf = %d\n", d->nregx_adf); 1999141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nregy_adf = %d\n", d->nregy_adf); 2000141cc406Sopenharmony_ci 2001141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nregx_book = %d\n", d->nregx_book); 2002141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nregy_book = %d\n", d->nregy_book); 2003141cc406Sopenharmony_ci 2004141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nscans_adf = %lu\n", _4btol (&(d->nscans_adf[0]))); 2005141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nscans_adf = %lu\n", _4btol (&(d->nscans_adf[0]))); 2006141cc406Sopenharmony_ci 2007141cc406Sopenharmony_ci DBG (DBG_LEVEL, "lamp time = %lu\n", _4btol (&(d->lamp_time[0]))); 2008141cc406Sopenharmony_ci 2009141cc406Sopenharmony_ci DBG (DBG_LEVEL, "eo_odd = %d\n", d->eo_odd); 2010141cc406Sopenharmony_ci DBG (DBG_LEVEL, "eo_even = %d\n", d->eo_even); 2011141cc406Sopenharmony_ci 2012141cc406Sopenharmony_ci DBG (DBG_LEVEL, "black_level_odd = %d\n", d->black_level_odd); 2013141cc406Sopenharmony_ci DBG (DBG_LEVEL, "black_level_even = %d\n", d->black_level_even); 2014141cc406Sopenharmony_ci 2015141cc406Sopenharmony_ci DBG (DBG_LEVEL, "white_level_odd = %lu\n", 2016141cc406Sopenharmony_ci _2btol (&(d->white_level_odd[0]))); 2017141cc406Sopenharmony_ci DBG (DBG_LEVEL, "white_level_even = %lu\n", 2018141cc406Sopenharmony_ci _2btol (&(d->white_level_even[0]))); 2019141cc406Sopenharmony_ci 2020141cc406Sopenharmony_ci DBG (DBG_LEVEL, "first_adj_white_odd = %lu\n", 2021141cc406Sopenharmony_ci _2btol (&(d->first_adj_white_odd[0]))); 2022141cc406Sopenharmony_ci DBG (DBG_LEVEL, "first_adj_white_even = %lu\n", 2023141cc406Sopenharmony_ci _2btol (&(d->first_adj_white_even[0]))); 2024141cc406Sopenharmony_ci 2025141cc406Sopenharmony_ci DBG (DBG_LEVEL, "density_adj = %d\n", d->density_adj); 2026141cc406Sopenharmony_ci 2027141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nregx_reverse = %d\n", d->nregx_reverse); 2028141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nregy_reverse = %d\n", d->nregy_reverse); 2029141cc406Sopenharmony_ci 2030141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nscans_reverse_adf = %lu\n", 2031141cc406Sopenharmony_ci _4btol (&(d->nscans_reverse_adf[0]))); 2032141cc406Sopenharmony_ci 2033141cc406Sopenharmony_ci DBG (DBG_LEVEL, "reverse_time = %lu\n", _4btol (&(d->reverse_time[0]))); 2034141cc406Sopenharmony_ci 2035141cc406Sopenharmony_ci DBG (DBG_LEVEL, "nchars = %lu\n", _4btol (&(d->nchars[0]))); 2036141cc406Sopenharmony_ci 2037141cc406Sopenharmony_ci DBG (DBG_proc, "<< print_maintenance_data: \n"); 2038141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2039141cc406Sopenharmony_ci} 2040141cc406Sopenharmony_ci 2041141cc406Sopenharmony_ciSANE_Status 2042141cc406Sopenharmony_cisane_control_option (SANE_Handle handle, SANE_Int option, 2043141cc406Sopenharmony_ci SANE_Action action, void *val, SANE_Int * info) 2044141cc406Sopenharmony_ci{ 2045141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 2046141cc406Sopenharmony_ci SANE_Status status; 2047141cc406Sopenharmony_ci SANE_Word cap; 2048141cc406Sopenharmony_ci SANE_String_Const name; 2049141cc406Sopenharmony_ci SANE_Int paper_id; 2050141cc406Sopenharmony_ci 2051141cc406Sopenharmony_ci 2052141cc406Sopenharmony_ci 2053141cc406Sopenharmony_ci name = s->opt[option].name ? s->opt[option].name : "(nil)"; 2054141cc406Sopenharmony_ci if (info) 2055141cc406Sopenharmony_ci *info = 0; 2056141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_control_option: %s option=%d name=%s\n", 2057141cc406Sopenharmony_ci action == SANE_ACTION_GET_VALUE ? "SET" : "GET", option, name); 2058141cc406Sopenharmony_ci 2059141cc406Sopenharmony_ci if (s->scanning) 2060141cc406Sopenharmony_ci return (SANE_STATUS_DEVICE_BUSY); 2061141cc406Sopenharmony_ci if (option >= NUM_OPTIONS) 2062141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2063141cc406Sopenharmony_ci 2064141cc406Sopenharmony_ci cap = s->opt[option].cap; 2065141cc406Sopenharmony_ci if (!SANE_OPTION_IS_ACTIVE (cap)) 2066141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2067141cc406Sopenharmony_ci 2068141cc406Sopenharmony_ci if (action == SANE_ACTION_GET_VALUE) 2069141cc406Sopenharmony_ci { 2070141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option get_value option=%d\n", option); 2071141cc406Sopenharmony_ci switch (option) 2072141cc406Sopenharmony_ci { 2073141cc406Sopenharmony_ci /* word options: */ 2074141cc406Sopenharmony_ci case OPT_RESOLUTION: 2075141cc406Sopenharmony_ci case OPT_X_RESOLUTION: 2076141cc406Sopenharmony_ci case OPT_Y_RESOLUTION: 2077141cc406Sopenharmony_ci case OPT_TL_X: 2078141cc406Sopenharmony_ci case OPT_TL_Y: 2079141cc406Sopenharmony_ci case OPT_BR_X: 2080141cc406Sopenharmony_ci case OPT_BR_Y: 2081141cc406Sopenharmony_ci case OPT_BRIGHTNESS: 2082141cc406Sopenharmony_ci case OPT_THRESHOLD: 2083141cc406Sopenharmony_ci case OPT_CONTRAST: 2084141cc406Sopenharmony_ci case OPT_NUM_OPTS: 2085141cc406Sopenharmony_ci *(SANE_Word *) val = s->val[option].w; 2086141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2087141cc406Sopenharmony_ci 2088141cc406Sopenharmony_ci /* bool options: */ 2089141cc406Sopenharmony_ci /*case OPT_AUTOBORDER: case OPT_DESKEW: case OPT_CHECK_ADF: case OPT_BATCH: */ 2090141cc406Sopenharmony_ci case OPT_PREVIEW: 2091141cc406Sopenharmony_ci case OPT_SCAN_WAIT_MODE: 2092141cc406Sopenharmony_ci case OPT_DUPLEX: 2093141cc406Sopenharmony_ci case OPT_AUTO_SIZE: 2094141cc406Sopenharmony_ci case OPT_NEGATIVE: 2095141cc406Sopenharmony_ci case OPT_ENDORSER: 2096141cc406Sopenharmony_ci case OPT_SMOOTHING: 2097141cc406Sopenharmony_ci case OPT_WHITE_BALANCE: 2098141cc406Sopenharmony_ci case OPT_PREFEED: 2099141cc406Sopenharmony_ci case OPT_CUSTOM_GAMMA: 2100141cc406Sopenharmony_ci case OPT_PADDING: 2101141cc406Sopenharmony_ci *(SANE_Bool *) val = s->val[option].w; 2102141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2103141cc406Sopenharmony_ci 2104141cc406Sopenharmony_ci /* string options: */ 2105141cc406Sopenharmony_ci /* case OPT_ADF: */ 2106141cc406Sopenharmony_ci /* case OPT_BITORDER: */ 2107141cc406Sopenharmony_ci /* case OPT_ROTATION */ 2108141cc406Sopenharmony_ci /* case OPT_SECTION: */ 2109141cc406Sopenharmony_ci case OPT_INQUIRY: 2110141cc406Sopenharmony_ci case OPT_SCAN_SOURCE: 2111141cc406Sopenharmony_ci case OPT_PAGE_ORIENTATION: 2112141cc406Sopenharmony_ci case OPT_PAPER_SIZE: 2113141cc406Sopenharmony_ci case OPT_SCAN_MODE: 2114141cc406Sopenharmony_ci case OPT_ENDORSER_STRING: 2115141cc406Sopenharmony_ci case OPT_COMPRESSION: 2116141cc406Sopenharmony_ci case OPT_NOISEREMOVAL: 2117141cc406Sopenharmony_ci case OPT_GRAYFILTER: 2118141cc406Sopenharmony_ci case OPT_HALFTONE_CODE: 2119141cc406Sopenharmony_ci case OPT_HALFTONE_PATTERN: 2120141cc406Sopenharmony_ci case OPT_GAMMA: 2121141cc406Sopenharmony_ci case OPT_AUTOSEP: 2122141cc406Sopenharmony_ci case OPT_AUTOBIN: 2123141cc406Sopenharmony_ci case OPT_PADDING_TYPE: 2124141cc406Sopenharmony_ci DBG (DBG_proc, "STRING=%s\n", s->val[option].s); 2125141cc406Sopenharmony_ci strcpy (val, s->val[option].s); 2126141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2127141cc406Sopenharmony_ci DBG (DBG_proc, "sizeof(val)=%lu sizeof(s)=%lu\n", 2128141cc406Sopenharmony_ci (u_long) sizeof (val), (u_long) sizeof (s->val[option].s)); 2129141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2130141cc406Sopenharmony_ci 2131141cc406Sopenharmony_ci /* gamma */ 2132141cc406Sopenharmony_ci case OPT_GAMMA_VECTOR_GRAY: 2133141cc406Sopenharmony_ci memcpy (val, s->val[option].wa, s->opt[option].size); 2134141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2135141cc406Sopenharmony_ci 2136141cc406Sopenharmony_ci /* MAINTENANCE DATA */ 2137141cc406Sopenharmony_ci case OPT_DATA_GROUP: 2138141cc406Sopenharmony_ci case OPT_UPDATE: 2139141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2140141cc406Sopenharmony_ci case OPT_NREGX_ADF: 2141141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGX_ADF\n"); 2142141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.nregx_adf; 2143141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2144141cc406Sopenharmony_ci case OPT_NREGY_ADF: 2145141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGY_ADF\n"); 2146141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.nregx_book; 2147141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2148141cc406Sopenharmony_ci case OPT_NREGX_BOOK: 2149141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGX_BOOK\n"); 2150141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.nregx_book; 2151141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2152141cc406Sopenharmony_ci case OPT_NREGY_BOOK: 2153141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGY_BOOK\n"); 2154141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.nregy_book; 2155141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2156141cc406Sopenharmony_ci case OPT_NSCANS_ADF: 2157141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NSCANS_ADF\n"); 2158141cc406Sopenharmony_ci *(SANE_Word *) val = 2159141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nscans_adf[0])); 2160141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2161141cc406Sopenharmony_ci case OPT_NSCANS_BOOK: 2162141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NSCANS_BOOK\n"); 2163141cc406Sopenharmony_ci *(SANE_Word *) val = 2164141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nscans_book[0])); 2165141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2166141cc406Sopenharmony_ci case OPT_LAMP_TIME: 2167141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_LAMP_TIME\n"); 2168141cc406Sopenharmony_ci *(SANE_Word *) val = 2169141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.lamp_time[0])); 2170141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2171141cc406Sopenharmony_ci case OPT_EO_ODD: 2172141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_EO_ODD\n"); 2173141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.eo_odd; 2174141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2175141cc406Sopenharmony_ci case OPT_EO_EVEN: 2176141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_EO_EVEN\n"); 2177141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.eo_even; 2178141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2179141cc406Sopenharmony_ci case OPT_BLACK_LEVEL_ODD: 2180141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_BLACK_LEVEL_ODD\n"); 2181141cc406Sopenharmony_ci *(SANE_Word *) val = 2182141cc406Sopenharmony_ci (SANE_Word) s->data.maintenance.black_level_odd; 2183141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2184141cc406Sopenharmony_ci case OPT_BLACK_LEVEL_EVEN: 2185141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_BLACK_LEVEL_EVEN\n"); 2186141cc406Sopenharmony_ci *(SANE_Word *) val = 2187141cc406Sopenharmony_ci (SANE_Word) s->data.maintenance.black_level_even; 2188141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2189141cc406Sopenharmony_ci case OPT_WHITE_LEVEL_ODD: 2190141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_WHITE_LEVEL_ODD\n"); 2191141cc406Sopenharmony_ci *(SANE_Word *) val = 2192141cc406Sopenharmony_ci (SANE_Word) _2btol (&(s->data.maintenance.white_level_odd[0])); 2193141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2194141cc406Sopenharmony_ci case OPT_WHITE_LEVEL_EVEN: 2195141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_WHITE_LEVEL_EVEN\n"); 2196141cc406Sopenharmony_ci *(SANE_Word *) val = 2197141cc406Sopenharmony_ci (SANE_Word) _2btol (&(s->data.maintenance.white_level_even[0])); 2198141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2199141cc406Sopenharmony_ci case OPT_FIRST_ADJ_WHITE_ODD: 2200141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_FIRST_ADJ_WHITE_ODD\n"); 2201141cc406Sopenharmony_ci *(SANE_Word *) val = 2202141cc406Sopenharmony_ci (SANE_Word) 2203141cc406Sopenharmony_ci _2btol (&(s->data.maintenance.first_adj_white_odd[0])); 2204141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2205141cc406Sopenharmony_ci case OPT_FIRST_ADJ_WHITE_EVEN: 2206141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_FIRST_ADJ_WHITE_EVEN\n"); 2207141cc406Sopenharmony_ci *(SANE_Word *) val = 2208141cc406Sopenharmony_ci (SANE_Word) 2209141cc406Sopenharmony_ci _2btol (&(s->data.maintenance.first_adj_white_even[0])); 2210141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2211141cc406Sopenharmony_ci case OPT_DENSITY: 2212141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_DENSITY\n"); 2213141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.density_adj; 2214141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2215141cc406Sopenharmony_ci case OPT_NREGX_REVERSE: 2216141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGX_REVERSE\n"); 2217141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.nregx_reverse; 2218141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2219141cc406Sopenharmony_ci case OPT_NREGY_REVERSE: 2220141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NREGY_REVERSE\n"); 2221141cc406Sopenharmony_ci *(SANE_Word *) val = (SANE_Word) s->data.maintenance.nregy_reverse; 2222141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2223141cc406Sopenharmony_ci case OPT_NSCANS_REVERSE_ADF: 2224141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NSCANS_REVERSE_ADF\n"); 2225141cc406Sopenharmony_ci *(SANE_Word *) val = 2226141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nscans_reverse_adf[0])); 2227141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2228141cc406Sopenharmony_ci case OPT_REVERSE_TIME: 2229141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_REVERSE_TIME\n"); 2230141cc406Sopenharmony_ci *(SANE_Word *) val = 2231141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.reverse_time[0])); 2232141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2233141cc406Sopenharmony_ci case OPT_NCHARS: 2234141cc406Sopenharmony_ci DBG (DBG_sane_option, "OPT_NCHARS\n"); 2235141cc406Sopenharmony_ci *(SANE_Word *) val = 2236141cc406Sopenharmony_ci (SANE_Word) _4btol (&(s->data.maintenance.nchars[0])); 2237141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2238141cc406Sopenharmony_ci 2239141cc406Sopenharmony_ci default: 2240141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option:invalid option number %d\n", 2241141cc406Sopenharmony_ci option); 2242141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 2243141cc406Sopenharmony_ci } 2244141cc406Sopenharmony_ci } 2245141cc406Sopenharmony_ci else if (action == SANE_ACTION_SET_VALUE) 2246141cc406Sopenharmony_ci { 2247141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option set_value\n"); 2248141cc406Sopenharmony_ci switch (s->opt[option].type) 2249141cc406Sopenharmony_ci { 2250141cc406Sopenharmony_ci case SANE_TYPE_BOOL: 2251141cc406Sopenharmony_ci case SANE_TYPE_INT: 2252141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option: set_value %s [#%d] to %d\n", 2253141cc406Sopenharmony_ci name, option, *(SANE_Word *) val); 2254141cc406Sopenharmony_ci break; 2255141cc406Sopenharmony_ci case SANE_TYPE_FIXED: 2256141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option: set_value %s [#%d] to %f\n", 2257141cc406Sopenharmony_ci name, option, SANE_UNFIX (*(SANE_Word *) val)); 2258141cc406Sopenharmony_ci break; 2259141cc406Sopenharmony_ci case SANE_TYPE_STRING: 2260141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option: set_value %s [#%d] to %s\n", 2261141cc406Sopenharmony_ci name, option, (char *) val); 2262141cc406Sopenharmony_ci break; 2263141cc406Sopenharmony_ci case SANE_TYPE_BUTTON: 2264141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option: set_value %s [#%d]\n", 2265141cc406Sopenharmony_ci name, option); 2266141cc406Sopenharmony_ci update_hs2p_data (s); 2267141cc406Sopenharmony_ci break; 2268141cc406Sopenharmony_ci default: 2269141cc406Sopenharmony_ci DBG (DBG_proc, "sane_control_option: set_value %s [#%d]\n", name, 2270141cc406Sopenharmony_ci option); 2271141cc406Sopenharmony_ci } 2272141cc406Sopenharmony_ci 2273141cc406Sopenharmony_ci if (!SANE_OPTION_IS_SETTABLE (cap)) 2274141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2275141cc406Sopenharmony_ci if ((status = 2276141cc406Sopenharmony_ci sanei_constrain_value (s->opt + option, val, 2277141cc406Sopenharmony_ci info)) != SANE_STATUS_GOOD) 2278141cc406Sopenharmony_ci return status; 2279141cc406Sopenharmony_ci 2280141cc406Sopenharmony_ci switch (option) 2281141cc406Sopenharmony_ci { 2282141cc406Sopenharmony_ci /* (mostly) side-effect-free word options: */ 2283141cc406Sopenharmony_ci case OPT_TL_X: 2284141cc406Sopenharmony_ci case OPT_TL_Y: 2285141cc406Sopenharmony_ci case OPT_BR_X: 2286141cc406Sopenharmony_ci case OPT_BR_Y: 2287141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].cap |= SANE_CAP_INACTIVE; /* disable auto size */ 2288141cc406Sopenharmony_ci /* make sure that paper-size is set to custom */ 2289141cc406Sopenharmony_ci if (info && s->val[option].w != *(SANE_Word *) val) 2290141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_PARAMS; 2291141cc406Sopenharmony_ci s->val[option].w = *(SANE_Word *) val; 2292141cc406Sopenharmony_ci /* resets the paper format to user defined */ 2293141cc406Sopenharmony_ci if (strcmp (s->val[OPT_PAPER_SIZE].s, paper_list[0]) != 0) /* CUSTOM PAPER SIZE */ 2294141cc406Sopenharmony_ci { 2295141cc406Sopenharmony_ci if (info) 2296141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_OPTIONS; 2297141cc406Sopenharmony_ci if (s->val[OPT_PAPER_SIZE].s) 2298141cc406Sopenharmony_ci free (s->val[OPT_PAPER_SIZE].s); 2299141cc406Sopenharmony_ci s->val[OPT_PAPER_SIZE].s = strdup (paper_list[0]); /* CUSTOM PAPER SIZE */ 2300141cc406Sopenharmony_ci } 2301141cc406Sopenharmony_ci /* fall through */ 2302141cc406Sopenharmony_ci case OPT_X_RESOLUTION: 2303141cc406Sopenharmony_ci case OPT_Y_RESOLUTION: 2304141cc406Sopenharmony_ci if (info && s->val[option].w != *(SANE_Word *) val) 2305141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_PARAMS; 2306141cc406Sopenharmony_ci 2307141cc406Sopenharmony_ci /* fall through */ 2308141cc406Sopenharmony_ci /*case OPT_ACE_FUNCTION: case OPT_ACE_SENSITIVITY: */ 2309141cc406Sopenharmony_ci case OPT_BRIGHTNESS: 2310141cc406Sopenharmony_ci case OPT_THRESHOLD: 2311141cc406Sopenharmony_ci case OPT_CONTRAST: 2312141cc406Sopenharmony_ci case OPT_NUM_OPTS: 2313141cc406Sopenharmony_ci s->val[option].w = *(SANE_Word *) val; 2314141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2315141cc406Sopenharmony_ci 2316141cc406Sopenharmony_ci /* string options */ 2317141cc406Sopenharmony_ci case OPT_NOISEREMOVAL: 2318141cc406Sopenharmony_ci case OPT_AUTOSEP: 2319141cc406Sopenharmony_ci case OPT_AUTOBIN: 2320141cc406Sopenharmony_ci case OPT_COMPRESSION: 2321141cc406Sopenharmony_ci case OPT_PADDING_TYPE: 2322141cc406Sopenharmony_ci case OPT_GRAYFILTER: 2323141cc406Sopenharmony_ci case OPT_HALFTONE_CODE: 2324141cc406Sopenharmony_ci case OPT_HALFTONE_PATTERN: 2325141cc406Sopenharmony_ci case OPT_ENDORSER_STRING: 2326141cc406Sopenharmony_ci if (s->val[option].s) 2327141cc406Sopenharmony_ci free (s->val[option].s); 2328141cc406Sopenharmony_ci s->val[option].s = strdup (val); 2329141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2330141cc406Sopenharmony_ci 2331141cc406Sopenharmony_ci /* boolean options: */ 2332141cc406Sopenharmony_ci case OPT_PREVIEW: 2333141cc406Sopenharmony_ci case OPT_DUPLEX: 2334141cc406Sopenharmony_ci case OPT_NEGATIVE: 2335141cc406Sopenharmony_ci case OPT_SCAN_WAIT_MODE: 2336141cc406Sopenharmony_ci case OPT_ENDORSER: 2337141cc406Sopenharmony_ci case OPT_SMOOTHING: 2338141cc406Sopenharmony_ci case OPT_WHITE_BALANCE: 2339141cc406Sopenharmony_ci case OPT_PREFEED: 2340141cc406Sopenharmony_ci case OPT_PADDING: 2341141cc406Sopenharmony_ci s->val[option].w = *(SANE_Word *) val; 2342141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2343141cc406Sopenharmony_ci 2344141cc406Sopenharmony_ci case OPT_GAMMA_VECTOR_GRAY: 2345141cc406Sopenharmony_ci memcpy (s->val[option].wa, val, s->opt[option].size); 2346141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2347141cc406Sopenharmony_ci 2348141cc406Sopenharmony_ci /* options with side effect */ 2349141cc406Sopenharmony_ci case OPT_GAMMA: 2350141cc406Sopenharmony_ci if (strcmp (s->val[option].s, (SANE_String) val)) 2351141cc406Sopenharmony_ci { 2352141cc406Sopenharmony_ci if (!strcmp ((SANE_String) val, "User")) 2353141cc406Sopenharmony_ci { 2354141cc406Sopenharmony_ci s->val[OPT_CUSTOM_GAMMA].b = SANE_TRUE; 2355141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE; 2356141cc406Sopenharmony_ci /* Brightness and Contrast do not work when downloading Gamma Table */ 2357141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE; 2358141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].cap |= SANE_CAP_INACTIVE; 2359141cc406Sopenharmony_ci } 2360141cc406Sopenharmony_ci else 2361141cc406Sopenharmony_ci { 2362141cc406Sopenharmony_ci s->val[OPT_CUSTOM_GAMMA].b = SANE_FALSE; 2363141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; 2364141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE; 2365141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].cap &= ~SANE_CAP_INACTIVE; 2366141cc406Sopenharmony_ci } 2367141cc406Sopenharmony_ci if (info) 2368141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_OPTIONS; 2369141cc406Sopenharmony_ci } 2370141cc406Sopenharmony_ci if (s->val[option].s) 2371141cc406Sopenharmony_ci free (s->val[option].s); 2372141cc406Sopenharmony_ci s->val[option].s = strdup (val); 2373141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2374141cc406Sopenharmony_ci 2375141cc406Sopenharmony_ci case OPT_CUSTOM_GAMMA: 2376141cc406Sopenharmony_ci s->val[OPT_CUSTOM_GAMMA].w = *(SANE_Word *) val; 2377141cc406Sopenharmony_ci if (s->val[OPT_CUSTOM_GAMMA].w) 2378141cc406Sopenharmony_ci { 2379141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE; 2380141cc406Sopenharmony_ci } 2381141cc406Sopenharmony_ci else 2382141cc406Sopenharmony_ci { 2383141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; 2384141cc406Sopenharmony_ci } 2385141cc406Sopenharmony_ci if (info) 2386141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_OPTIONS; 2387141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2388141cc406Sopenharmony_ci 2389141cc406Sopenharmony_ci case OPT_RESOLUTION: 2390141cc406Sopenharmony_ci if (info && s->val[option].w != *(SANE_Word *) val) 2391141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; 2392141cc406Sopenharmony_ci s->val[option].w = *(SANE_Word *) val; 2393141cc406Sopenharmony_ci s->val[OPT_X_RESOLUTION].w = *(SANE_Word *) val; 2394141cc406Sopenharmony_ci s->val[OPT_Y_RESOLUTION].w = *(SANE_Word *) val; 2395141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2396141cc406Sopenharmony_ci case OPT_SCAN_SOURCE: 2397141cc406Sopenharmony_ci /* a string option */ 2398141cc406Sopenharmony_ci /* Since the scanner ejects the sheet in ADF mode 2399141cc406Sopenharmony_ci * it is impossible to scan multiple sections in one document 2400141cc406Sopenharmony_ci * In ADF mode, because of mechanical limitations: 2401141cc406Sopenharmony_ci * the minimum document size is (x,y)=(69mm x 120mm) 2402141cc406Sopenharmony_ci */ 2403141cc406Sopenharmony_ci if (info && strcmp ((char *) s->val[option].s, (char *) val)) 2404141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; 2405141cc406Sopenharmony_ci if (s->val[option].s) 2406141cc406Sopenharmony_ci free (s->val[option].s); 2407141cc406Sopenharmony_ci s->val[option].s = strdup (val); 2408141cc406Sopenharmony_ci if (!strcmp ("ADF", (SANE_String) val)) 2409141cc406Sopenharmony_ci { 2410141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].cap &= ~SANE_CAP_INACTIVE; 2411141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].cap &= ~SANE_CAP_INACTIVE; 2412141cc406Sopenharmony_ci s->opt[OPT_PREFEED].cap &= ~SANE_CAP_INACTIVE; 2413141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].cap &= ~SANE_CAP_INACTIVE; 2414141cc406Sopenharmony_ci /*s->opt[OPT_PADDING].cap &= ~SANE_CAP_INACTIVE; */ 2415141cc406Sopenharmony_ci } 2416141cc406Sopenharmony_ci else 2417141cc406Sopenharmony_ci { /* Flatbed */ 2418141cc406Sopenharmony_ci s->opt[OPT_ENDORSER].cap |= SANE_CAP_INACTIVE; 2419141cc406Sopenharmony_ci s->opt[OPT_ENDORSER_STRING].cap |= SANE_CAP_INACTIVE; 2420141cc406Sopenharmony_ci s->opt[OPT_PREFEED].cap |= SANE_CAP_INACTIVE; 2421141cc406Sopenharmony_ci s->opt[OPT_DUPLEX].cap |= SANE_CAP_INACTIVE; 2422141cc406Sopenharmony_ci s->opt[OPT_PADDING].cap |= SANE_CAP_INACTIVE; 2423141cc406Sopenharmony_ci } 2424141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2425141cc406Sopenharmony_ci case OPT_SCAN_MODE: 2426141cc406Sopenharmony_ci /* a string option */ 2427141cc406Sopenharmony_ci /* scan mode != lineart disables compression, setting it to 'none' */ 2428141cc406Sopenharmony_ci if (strcmp (s->val[option].s, (SANE_String) val)) 2429141cc406Sopenharmony_ci { 2430141cc406Sopenharmony_ci if (info) 2431141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_OPTIONS; 2432141cc406Sopenharmony_ci if (!strcmp (SM_LINEART, (SANE_String) val)) 2433141cc406Sopenharmony_ci { 2434141cc406Sopenharmony_ci s->image_composition = LINEART; 2435141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].cap &= ~SANE_CAP_INACTIVE; /* enable compression control */ 2436141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE; /* enable threshold control */ 2437141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE; /* disable brightness control */ 2438141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].cap |= SANE_CAP_INACTIVE; /* disable contrast control */ 2439141cc406Sopenharmony_ci s->opt[OPT_GAMMA].cap |= SANE_CAP_INACTIVE; /* disable gamma */ 2440141cc406Sopenharmony_ci s->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; /* disable gamma */ 2441141cc406Sopenharmony_ci s->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; /* disable gamma */ 2442141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].cap |= SANE_CAP_INACTIVE; /* disable halftone code */ 2443141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE; /* disable halftone pattern */ 2444141cc406Sopenharmony_ci } 2445141cc406Sopenharmony_ci else 2446141cc406Sopenharmony_ci { 2447141cc406Sopenharmony_ci if (!strcmp (SM_HALFTONE, (SANE_String) val)) 2448141cc406Sopenharmony_ci { 2449141cc406Sopenharmony_ci s->image_composition = HALFTONE; 2450141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].cap &= ~SANE_CAP_INACTIVE; /* enable halftone code */ 2451141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].cap &= ~SANE_CAP_INACTIVE; /* enable halftone pattern */ 2452141cc406Sopenharmony_ci } 2453141cc406Sopenharmony_ci else if (!strcmp (SM_4BITGRAY, (SANE_String) val) || 2454141cc406Sopenharmony_ci !strcmp (SM_6BITGRAY, (SANE_String) val) || 2455141cc406Sopenharmony_ci !strcmp (SM_8BITGRAY, (SANE_String) val)) 2456141cc406Sopenharmony_ci { 2457141cc406Sopenharmony_ci s->image_composition = GRAYSCALE; 2458141cc406Sopenharmony_ci s->opt[OPT_GAMMA].cap &= ~SANE_CAP_INACTIVE; /* enable gamma */ 2459141cc406Sopenharmony_ci s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE; /* enable brightness */ 2460141cc406Sopenharmony_ci s->opt[OPT_CONTRAST].cap &= ~SANE_CAP_INACTIVE; /* enable contrast */ 2461141cc406Sopenharmony_ci s->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE; /* disable threshold */ 2462141cc406Sopenharmony_ci s->opt[OPT_COMPRESSION].cap |= SANE_CAP_INACTIVE; /* disable compression */ 2463141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_CODE].cap |= SANE_CAP_INACTIVE; /* disable halftone code */ 2464141cc406Sopenharmony_ci s->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE; /* disable halftone pattern */ 2465141cc406Sopenharmony_ci if (s->val[OPT_COMPRESSION].s 2466141cc406Sopenharmony_ci && get_compression_id (s->val[OPT_COMPRESSION].s) != 2467141cc406Sopenharmony_ci 0) 2468141cc406Sopenharmony_ci { 2469141cc406Sopenharmony_ci free (s->val[OPT_COMPRESSION].s); 2470141cc406Sopenharmony_ci s->val[OPT_COMPRESSION].s = 2471141cc406Sopenharmony_ci strdup (compression_list[0]); 2472141cc406Sopenharmony_ci } 2473141cc406Sopenharmony_ci } 2474141cc406Sopenharmony_ci } 2475141cc406Sopenharmony_ci free (s->val[option].s); 2476141cc406Sopenharmony_ci s->val[option].s = strdup (val); 2477141cc406Sopenharmony_ci } 2478141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2479141cc406Sopenharmony_ci 2480141cc406Sopenharmony_ci case OPT_PAGE_ORIENTATION: 2481141cc406Sopenharmony_ci if (strcmp (s->val[option].s, (SANE_String) val)) 2482141cc406Sopenharmony_ci { 2483141cc406Sopenharmony_ci free (s->val[option].s); 2484141cc406Sopenharmony_ci s->val[option].s = strdup (val); 2485141cc406Sopenharmony_ci if (info) 2486141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; 2487141cc406Sopenharmony_ci } 2488141cc406Sopenharmony_ci /* set val to current selected paper size */ 2489141cc406Sopenharmony_ci paper_id = get_paper_id ((SANE_String) s->val[OPT_PAPER_SIZE].s); 2490141cc406Sopenharmony_ci goto paper_id; 2491141cc406Sopenharmony_ci case OPT_PAPER_SIZE: 2492141cc406Sopenharmony_ci /* a string option */ 2493141cc406Sopenharmony_ci /* changes geometry options, therefore _RELOAD_PARAMS and _RELOAD_OPTIONS */ 2494141cc406Sopenharmony_ci s->opt[OPT_AUTO_SIZE].cap |= SANE_CAP_INACTIVE; /* disable auto size */ 2495141cc406Sopenharmony_ci if (strcmp (s->val[option].s, (SANE_String) val)) 2496141cc406Sopenharmony_ci { 2497141cc406Sopenharmony_ci paper_id = get_paper_id ((SANE_String) val); 2498141cc406Sopenharmony_ci 2499141cc406Sopenharmony_ci /* paper_id 0 is a special case (custom) that 2500141cc406Sopenharmony_ci * disables the paper size control of geometry 2501141cc406Sopenharmony_ci */ 2502141cc406Sopenharmony_ci paper_id: 2503141cc406Sopenharmony_ci if (paper_id != 0) 2504141cc406Sopenharmony_ci { 2505141cc406Sopenharmony_ci double x_max, y_max, x, y, temp; 2506141cc406Sopenharmony_ci 2507141cc406Sopenharmony_ci x_max = SANE_UNFIX (s->hw->info.x_range.max); 2508141cc406Sopenharmony_ci y_max = SANE_UNFIX (s->hw->info.y_range.max); 2509141cc406Sopenharmony_ci 2510141cc406Sopenharmony_ci /* a dimension of 0.0 (or less) is replaced with the max value */ 2511141cc406Sopenharmony_ci x = (paper_sizes[paper_id].width <= 0.0) ? x_max : 2512141cc406Sopenharmony_ci paper_sizes[paper_id].width; 2513141cc406Sopenharmony_ci y = (paper_sizes[paper_id].length <= 0.0) ? y_max : 2514141cc406Sopenharmony_ci paper_sizes[paper_id].length; 2515141cc406Sopenharmony_ci 2516141cc406Sopenharmony_ci if (info) 2517141cc406Sopenharmony_ci *info |= 2518141cc406Sopenharmony_ci SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; 2519141cc406Sopenharmony_ci 2520141cc406Sopenharmony_ci if (!strcmp (s->val[OPT_PAGE_ORIENTATION].s, LANDSCAPE)) /* swap */ 2521141cc406Sopenharmony_ci { 2522141cc406Sopenharmony_ci temp = y_max; 2523141cc406Sopenharmony_ci y_max = x_max; 2524141cc406Sopenharmony_ci x_max = temp; 2525141cc406Sopenharmony_ci temp = y; 2526141cc406Sopenharmony_ci y = x; 2527141cc406Sopenharmony_ci x = temp; 2528141cc406Sopenharmony_ci } 2529141cc406Sopenharmony_ci 2530141cc406Sopenharmony_ci s->val[OPT_TL_X].w = SANE_FIX (0.0); 2531141cc406Sopenharmony_ci s->val[OPT_TL_Y].w = SANE_FIX (0.0); 2532141cc406Sopenharmony_ci s->val[OPT_BR_X].w = SANE_FIX (MIN (x, x_max)); 2533141cc406Sopenharmony_ci s->val[OPT_BR_Y].w = SANE_FIX (MIN (y, y_max)); 2534141cc406Sopenharmony_ci } 2535141cc406Sopenharmony_ci free (s->val[option].s); 2536141cc406Sopenharmony_ci s->val[option].s = strdup (val); 2537141cc406Sopenharmony_ci } 2538141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2539141cc406Sopenharmony_ci case OPT_UPDATE: /* SANE_TYPE_BUTTON */ 2540141cc406Sopenharmony_ci DBG (DBG_info, 2541141cc406Sopenharmony_ci "OPT_UPDATE: ready to call get_hs2p_data: fd=%d\n", s->fd); 2542141cc406Sopenharmony_ci get_hs2p_data (s, 2543141cc406Sopenharmony_ci /* DATA_TYPE_GAMMA, */ 2544141cc406Sopenharmony_ci /* DATA_TYPE_ENDORSER, */ 2545141cc406Sopenharmony_ci /* DATA_TYPE_SIZE, */ 2546141cc406Sopenharmony_ci /* DATA_TYPE_PAGE_LEN, */ 2547141cc406Sopenharmony_ci DATA_TYPE_MAINTENANCE, 2548141cc406Sopenharmony_ci /* DATA_TYPE_ADF_STATUS, */ 2549141cc406Sopenharmony_ci /* DATA_TYPE_IMAGE, */ 2550141cc406Sopenharmony_ci /* DATA_TYPE_HALFTONE, */ 2551141cc406Sopenharmony_ci DATA_TYPE_EOL); /* va_list end */ 2552141cc406Sopenharmony_ci update_hs2p_data (s); 2553141cc406Sopenharmony_ci if (DBG_LEVEL >= DBG_info) 2554141cc406Sopenharmony_ci print_maintenance_data (&(s->data.maintenance)); 2555141cc406Sopenharmony_ci if (info) 2556141cc406Sopenharmony_ci *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS; 2557141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 2558141cc406Sopenharmony_ci } 2559141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2560141cc406Sopenharmony_ci } 2561141cc406Sopenharmony_ci 2562141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_control_option\n"); 2563141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2564141cc406Sopenharmony_ci 2565141cc406Sopenharmony_ci} 2566141cc406Sopenharmony_ci 2567141cc406Sopenharmony_ciSANE_Status 2568141cc406Sopenharmony_cisane_get_parameters (SANE_Handle handle, SANE_Parameters * params) 2569141cc406Sopenharmony_ci{ 2570141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 2571141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_get_parameters\n"); 2572141cc406Sopenharmony_ci 2573141cc406Sopenharmony_ci if (!s->scanning) 2574141cc406Sopenharmony_ci { 2575141cc406Sopenharmony_ci int width, length, xres, yres; 2576141cc406Sopenharmony_ci const char *mode; 2577141cc406Sopenharmony_ci 2578141cc406Sopenharmony_ci memset (&s->params, 0, sizeof (s->params)); /* CLEAR SANE_Parameters */ 2579141cc406Sopenharmony_ci 2580141cc406Sopenharmony_ci width = 2581141cc406Sopenharmony_ci (int) (SANE_UNFIX (s->val[OPT_BR_X].w) - 2582141cc406Sopenharmony_ci SANE_UNFIX (s->val[OPT_TL_X].w)); 2583141cc406Sopenharmony_ci length = 2584141cc406Sopenharmony_ci (int) (SANE_UNFIX (s->val[OPT_BR_Y].w) - 2585141cc406Sopenharmony_ci SANE_UNFIX (s->val[OPT_TL_Y].w)); 2586141cc406Sopenharmony_ci xres = s->val[OPT_X_RESOLUTION].w; 2587141cc406Sopenharmony_ci yres = s->val[OPT_Y_RESOLUTION].w; 2588141cc406Sopenharmony_ci DBG (DBG_proc, 2589141cc406Sopenharmony_ci ">>sane_get_parameters: (W/L)=(%d/%d) (xres/yres)=(%d/%d) mud=%d\n", 2590141cc406Sopenharmony_ci width, length, xres, yres, s->hw->info.mud); 2591141cc406Sopenharmony_ci 2592141cc406Sopenharmony_ci /* make best-effort guess at what parameters will look like once scanning starts. */ 2593141cc406Sopenharmony_ci if (xres > 0 && yres > 0 && width > 0 && length > 0) 2594141cc406Sopenharmony_ci { /* convert from mm to pixels */ 2595141cc406Sopenharmony_ci s->params.pixels_per_line = 2596141cc406Sopenharmony_ci width * xres / s->hw->info.mud / MM_PER_INCH; 2597141cc406Sopenharmony_ci s->params.lines = length * yres / s->hw->info.mud / MM_PER_INCH; 2598141cc406Sopenharmony_ci } 2599141cc406Sopenharmony_ci 2600141cc406Sopenharmony_ci mode = s->val[OPT_SCAN_MODE].s; 2601141cc406Sopenharmony_ci if ((strcmp (mode, SM_LINEART) == 0) || 2602141cc406Sopenharmony_ci (strcmp (mode, SM_HALFTONE)) == 0) 2603141cc406Sopenharmony_ci { 2604141cc406Sopenharmony_ci s->params.format = SANE_FRAME_GRAY; 2605141cc406Sopenharmony_ci s->params.bytes_per_line = s->params.pixels_per_line / 8; 2606141cc406Sopenharmony_ci /* if the scanner truncates to the byte boundary, so: chop! */ 2607141cc406Sopenharmony_ci s->params.pixels_per_line = s->params.bytes_per_line * 8; 2608141cc406Sopenharmony_ci s->params.depth = 1; 2609141cc406Sopenharmony_ci } 2610141cc406Sopenharmony_ci else /* if (strcmp (mode, SANE_VALUE_SCAN_MODE_GRAY) == 0) */ 2611141cc406Sopenharmony_ci { 2612141cc406Sopenharmony_ci s->params.format = SANE_FRAME_GRAY; 2613141cc406Sopenharmony_ci s->params.bytes_per_line = s->params.pixels_per_line; 2614141cc406Sopenharmony_ci s->params.depth = 8; 2615141cc406Sopenharmony_ci } 2616141cc406Sopenharmony_ci s->params.last_frame = SANE_TRUE; 2617141cc406Sopenharmony_ci } 2618141cc406Sopenharmony_ci else 2619141cc406Sopenharmony_ci DBG (DBG_proc, "sane_get_parameters: scanning, so can't get params\n"); 2620141cc406Sopenharmony_ci 2621141cc406Sopenharmony_ci if (params) 2622141cc406Sopenharmony_ci *params = s->params; 2623141cc406Sopenharmony_ci 2624141cc406Sopenharmony_ci DBG (DBG_proc, 2625141cc406Sopenharmony_ci "%d pixels per line, %d bytes per line, %d lines high, total %lu bytes, " 2626141cc406Sopenharmony_ci "dpi=%ld\n", s->params.pixels_per_line, s->params.bytes_per_line, 2627141cc406Sopenharmony_ci s->params.lines, (u_long) s->bytes_to_read, 2628141cc406Sopenharmony_ci (long) SANE_UNFIX (s->val[OPT_Y_RESOLUTION].w)); 2629141cc406Sopenharmony_ci 2630141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_get_parameters\n"); 2631141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2632141cc406Sopenharmony_ci} 2633141cc406Sopenharmony_ci 2634141cc406Sopenharmony_cistatic SANE_Status 2635141cc406Sopenharmony_ciset_window_data (HS2P_Scanner * s, SWD * wbuf) 2636141cc406Sopenharmony_ci{ 2637141cc406Sopenharmony_ci struct hs2p_window_data *data; 2638141cc406Sopenharmony_ci int i, nwin, id, xres, yres, xmax, ymax; 2639141cc406Sopenharmony_ci long ulx, uly, width, length, number, bytes; 2640141cc406Sopenharmony_ci double offset; 2641141cc406Sopenharmony_ci 2642141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_window_data: sizeof(*wbuf)=%lu; window len=%lu\n", 2643141cc406Sopenharmony_ci (u_long) sizeof (*wbuf), (u_long) sizeof (wbuf->data)); 2644141cc406Sopenharmony_ci 2645141cc406Sopenharmony_ci /* initialize our window buffer with zeros */ 2646141cc406Sopenharmony_ci DBG (DBG_proc, ">> set_window_data: CLEARING wbuf\n"); 2647141cc406Sopenharmony_ci memset (wbuf, 0, sizeof (*wbuf)); 2648141cc406Sopenharmony_ci 2649141cc406Sopenharmony_ci /* Header */ 2650141cc406Sopenharmony_ci DBG (DBG_proc, 2651141cc406Sopenharmony_ci ">> set_window_data: writing Window Descriptor Length =%lu\n", 2652141cc406Sopenharmony_ci (u_long) sizeof (wbuf->data)); 2653141cc406Sopenharmony_ci _lto2b (sizeof (wbuf->data), &wbuf->hdr.len[0]); 2654141cc406Sopenharmony_ci 2655141cc406Sopenharmony_ci /* X-Axis Resolution 100-800dpi in 1 dpi steps */ 2656141cc406Sopenharmony_ci xres = s->val[OPT_X_RESOLUTION].w; 2657141cc406Sopenharmony_ci if (xres < s->hw->info.resMinX || xres > s->hw->info.resMaxX) 2658141cc406Sopenharmony_ci { 2659141cc406Sopenharmony_ci DBG (DBG_error, "XRESOLUTION %d IS NOT WITHIN [%d, %d]\n", xres, 2660141cc406Sopenharmony_ci s->hw->info.resMinX, s->hw->info.resMaxX); 2661141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2662141cc406Sopenharmony_ci } 2663141cc406Sopenharmony_ci 2664141cc406Sopenharmony_ci /* Y-Axis Resolution 100-800dpi in 1 dpi steps */ 2665141cc406Sopenharmony_ci yres = s->val[OPT_Y_RESOLUTION].w; 2666141cc406Sopenharmony_ci if (yres < s->hw->info.resMinY || yres > s->hw->info.resMaxY) 2667141cc406Sopenharmony_ci { 2668141cc406Sopenharmony_ci DBG (DBG_error, "YRESOLUTION %d IS NOT WITHIN [%d, %d]\n", yres, 2669141cc406Sopenharmony_ci s->hw->info.resMinY, s->hw->info.resMaxY); 2670141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2671141cc406Sopenharmony_ci } 2672141cc406Sopenharmony_ci 2673141cc406Sopenharmony_ci ulx = (long) SANE_UNFIX (s->val[OPT_TL_X].w); 2674141cc406Sopenharmony_ci uly = (long) SANE_UNFIX (s->val[OPT_TL_Y].w); 2675141cc406Sopenharmony_ci DBG (DBG_info, "set_window_data: upperleft=(%ld,%ld)\n", ulx, uly); 2676141cc406Sopenharmony_ci 2677141cc406Sopenharmony_ci width = (long) SANE_UNFIX (s->val[OPT_BR_X].w - s->val[OPT_TL_X].w); /* Window Width */ 2678141cc406Sopenharmony_ci length = (long) SANE_UNFIX (s->val[OPT_BR_Y].w - s->val[OPT_TL_Y].w); /* Window Length */ 2679141cc406Sopenharmony_ci DBG (DBG_info, "set_window_data: WxL= %ld x %ld\n", width, length); 2680141cc406Sopenharmony_ci 2681141cc406Sopenharmony_ci /* NOTE: the width in inches converted to byte unit must be the following values or less 2682141cc406Sopenharmony_ci * Binary: 620 bytes 2683141cc406Sopenharmony_ci * 4-bits gray: 2480 bytes 2684141cc406Sopenharmony_ci * 8-bits gray: 4960 bytes 2685141cc406Sopenharmony_ci */ 2686141cc406Sopenharmony_ci if (!strcmp (s->val[OPT_SCAN_MODE].s, SM_LINEART)) 2687141cc406Sopenharmony_ci { 2688141cc406Sopenharmony_ci bytes = (width / MM_PER_INCH) * (s->val[OPT_X_RESOLUTION].w / 8.0); 2689141cc406Sopenharmony_ci if (bytes > 620) 2690141cc406Sopenharmony_ci { 2691141cc406Sopenharmony_ci DBG (DBG_error, 2692141cc406Sopenharmony_ci "width in pixels too large: width=%ld x-resolution=%d bytes=%ld\n", 2693141cc406Sopenharmony_ci width, s->val[OPT_X_RESOLUTION].w, bytes); 2694141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2695141cc406Sopenharmony_ci } 2696141cc406Sopenharmony_ci } 2697141cc406Sopenharmony_ci else if (!strcmp (s->val[OPT_SCAN_MODE].s, SM_4BITGRAY)) 2698141cc406Sopenharmony_ci { 2699141cc406Sopenharmony_ci bytes = (width / MM_PER_INCH) * (s->val[OPT_X_RESOLUTION].w / 2.0); 2700141cc406Sopenharmony_ci if (bytes > 2480) 2701141cc406Sopenharmony_ci { 2702141cc406Sopenharmony_ci DBG (DBG_error, 2703141cc406Sopenharmony_ci "width in pixels too large: width=%ld x-resolution=%d bytes=%ld\n", 2704141cc406Sopenharmony_ci width, s->val[OPT_X_RESOLUTION].w, bytes); 2705141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2706141cc406Sopenharmony_ci } 2707141cc406Sopenharmony_ci } 2708141cc406Sopenharmony_ci else if (!strcmp (s->val[OPT_SCAN_MODE].s, SM_8BITGRAY)) 2709141cc406Sopenharmony_ci { 2710141cc406Sopenharmony_ci bytes = (width / MM_PER_INCH) * (s->val[OPT_X_RESOLUTION].w); 2711141cc406Sopenharmony_ci if (bytes > 4960) 2712141cc406Sopenharmony_ci { 2713141cc406Sopenharmony_ci DBG (DBG_error, 2714141cc406Sopenharmony_ci "width in pixels too large: width=%ld x-resolution=%d bytes=%ld\n", 2715141cc406Sopenharmony_ci width, s->val[OPT_X_RESOLUTION].w, bytes); 2716141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2717141cc406Sopenharmony_ci } 2718141cc406Sopenharmony_ci } 2719141cc406Sopenharmony_ci 2720141cc406Sopenharmony_ci 2721141cc406Sopenharmony_ci if (strcmp (s->val[OPT_SCAN_SOURCE].s, scan_source_list[ADF]) == 0) 2722141cc406Sopenharmony_ci { 2723141cc406Sopenharmony_ci offset = (SANE_UNFIX (s->hw->info.x_range.max) - width) / 2.0; 2724141cc406Sopenharmony_ci DBG (DBG_info, "set_window_data: ADF origin offset=%f\n", offset); 2725141cc406Sopenharmony_ci 2726141cc406Sopenharmony_ci ulx += (long) offset; 2727141cc406Sopenharmony_ci } 2728141cc406Sopenharmony_ci 2729141cc406Sopenharmony_ci 2730141cc406Sopenharmony_ci if (strcmp (s->val[OPT_SCAN_SOURCE].s, scan_source_list[FB]) == 0) 2731141cc406Sopenharmony_ci { /* FB */ 2732141cc406Sopenharmony_ci xmax = 298; /*mm */ 2733141cc406Sopenharmony_ci ymax = 432; 2734141cc406Sopenharmony_ci } 2735141cc406Sopenharmony_ci else 2736141cc406Sopenharmony_ci { /* ADF */ 2737141cc406Sopenharmony_ci xmax = 298; 2738141cc406Sopenharmony_ci ymax = 2000; 2739141cc406Sopenharmony_ci } 2740141cc406Sopenharmony_ci 2741141cc406Sopenharmony_ci /* Boundary Conditions when BMU = MM */ 2742141cc406Sopenharmony_ci number = ulx + width; 2743141cc406Sopenharmony_ci if (number <= 0 || number > xmax) 2744141cc406Sopenharmony_ci { 2745141cc406Sopenharmony_ci DBG (DBG_error, "NOT WITHIN BOUNDS: ulx=%ld width=%ld sum=%ld\n", 2746141cc406Sopenharmony_ci ulx, width, number); 2747141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2748141cc406Sopenharmony_ci } 2749141cc406Sopenharmony_ci number = uly + length; 2750141cc406Sopenharmony_ci if (number <= 0 || number > ymax) 2751141cc406Sopenharmony_ci { 2752141cc406Sopenharmony_ci DBG (DBG_error, "NOT WITHIN BOUNDS: uly=%ld length=%ld sum=%ld\n", 2753141cc406Sopenharmony_ci uly, length, number); 2754141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 2755141cc406Sopenharmony_ci } 2756141cc406Sopenharmony_ci 2757141cc406Sopenharmony_ci 2758141cc406Sopenharmony_ci 2759141cc406Sopenharmony_ci /* For each window (up to 2 if we're duplexing) */ 2760141cc406Sopenharmony_ci nwin = (s->val[OPT_DUPLEX].w == SANE_TRUE) ? 2 : 1; 2761141cc406Sopenharmony_ci for (i = 0; i < nwin; i++) 2762141cc406Sopenharmony_ci { 2763141cc406Sopenharmony_ci data = &(wbuf->data[i]); 2764141cc406Sopenharmony_ci data->window_id = i; 2765141cc406Sopenharmony_ci data->auto_bit &= 0xFE; /* Auto bit set to 0 since auto function isn't supported */ 2766141cc406Sopenharmony_ci 2767141cc406Sopenharmony_ci _lto2b (xres, &data->xres[0]); /* Set X resolution */ 2768141cc406Sopenharmony_ci _lto2b (yres, &data->yres[0]); /* Set Y resolution */ 2769141cc406Sopenharmony_ci 2770141cc406Sopenharmony_ci _lto4b (ulx, &data->ulx[0]); /* X-Axis Upper Left */ 2771141cc406Sopenharmony_ci _lto4b (uly, &data->uly[0]); /* Y-Axis Upper Left */ 2772141cc406Sopenharmony_ci 2773141cc406Sopenharmony_ci _lto4b (width, &data->width[0]); /* Window Width */ 2774141cc406Sopenharmony_ci _lto4b (length, &data->length[0]); /* Window Length */ 2775141cc406Sopenharmony_ci 2776141cc406Sopenharmony_ci 2777141cc406Sopenharmony_ci 2778141cc406Sopenharmony_ci 2779141cc406Sopenharmony_ci 2780141cc406Sopenharmony_ci 2781141cc406Sopenharmony_ci data->brightness = s->val[OPT_BRIGHTNESS].w; /* black-white: 1-255; 0 is default 128 */ 2782141cc406Sopenharmony_ci data->threshold = s->val[OPT_THRESHOLD].w; /* light-dark: 1-255; 0 is default 128 */ 2783141cc406Sopenharmony_ci data->contrast = s->val[OPT_CONTRAST].w; /* low-high: 1-255: 0 is default 128 */ 2784141cc406Sopenharmony_ci if (data->brightness == 128) 2785141cc406Sopenharmony_ci data->brightness = 0; 2786141cc406Sopenharmony_ci if (data->threshold == 128) 2787141cc406Sopenharmony_ci data->threshold = 0; 2788141cc406Sopenharmony_ci if (data->contrast == 128) 2789141cc406Sopenharmony_ci data->contrast = 0; 2790141cc406Sopenharmony_ci 2791141cc406Sopenharmony_ci data->image_composition = s->image_composition; 2792141cc406Sopenharmony_ci data->bpp = s->bpp = s->params.depth; 2793141cc406Sopenharmony_ci 2794141cc406Sopenharmony_ci /* Byte 27, 347 Halftone Code: if HALFTONE, then either DITHER or ERROR_DIFFUSION */ 2795141cc406Sopenharmony_ci if (s->image_composition == HALFTONE) 2796141cc406Sopenharmony_ci { /* Then let's use pattern selected by user */ 2797141cc406Sopenharmony_ci data->halftone_code = 2798141cc406Sopenharmony_ci (get_halftone_code_id (s->val[OPT_HALFTONE_CODE].s) == 2799141cc406Sopenharmony_ci 0) ? DITHER : ERROR_DIFFUSION; 2800141cc406Sopenharmony_ci data->halftone_id = 2801141cc406Sopenharmony_ci get_halftone_pattern_val (s->val[OPT_HALFTONE_PATTERN].s); 2802141cc406Sopenharmony_ci } 2803141cc406Sopenharmony_ci else 2804141cc406Sopenharmony_ci { 2805141cc406Sopenharmony_ci data->halftone_code = DITHER; /* 00H reserved */ 2806141cc406Sopenharmony_ci data->halftone_id = 0x01; /* 00H reserved */ 2807141cc406Sopenharmony_ci } 2808141cc406Sopenharmony_ci 2809141cc406Sopenharmony_ci 2810141cc406Sopenharmony_ci 2811141cc406Sopenharmony_ci /* Byte 29, 349: RIF:reserved:padding type */ 2812141cc406Sopenharmony_ci if (data->image_composition == LINEART 2813141cc406Sopenharmony_ci || data->image_composition == HALFTONE) 2814141cc406Sopenharmony_ci { 2815141cc406Sopenharmony_ci if (s->val[OPT_NEGATIVE].w) 2816141cc406Sopenharmony_ci data->byte29 |= (1 << 7); /* set bit 7 */ 2817141cc406Sopenharmony_ci else 2818141cc406Sopenharmony_ci data->byte29 &= ~(1 << 7); /* unset bit 7 */ 2819141cc406Sopenharmony_ci } 2820141cc406Sopenharmony_ci /* Padding Type */ 2821141cc406Sopenharmony_ci data->byte29 |= 2822141cc406Sopenharmony_ci (paddingtype[get_paddingtype_id (s->val[OPT_PADDING_TYPE].s)]. 2823141cc406Sopenharmony_ci val & 0x07); 2824141cc406Sopenharmony_ci 2825141cc406Sopenharmony_ci /* Bit Ordering: 2826141cc406Sopenharmony_ci * Manual Says DEFAULT: [1111 1111][1111 1000] 2827141cc406Sopenharmony_ci * Bits15-8 reserved; 2828141cc406Sopenharmony_ci * Bit7: '0'-Normal '1'-Mirroring 2829141cc406Sopenharmony_ci * Bit6-4: Reserved 2830141cc406Sopenharmony_ci * Bit3: '0'-arrangement from MSB in grayscale mode 2831141cc406Sopenharmony_ci * '1'-arrangement from LSB in grayscale mode 2832141cc406Sopenharmony_ci * 2: '0'-unpacked 4-bits grayscale [DEFAULT] 2833141cc406Sopenharmony_ci * '1'-packed 4-bits grayscale 2834141cc406Sopenharmony_ci * 1: '0'-output from LSB of each word [DEFAULT] 2835141cc406Sopenharmony_ci * '1'-output from MSB of each word 2836141cc406Sopenharmony_ci * 0: '0'-output from bit 0 of each byte [DEFAULT] 2837141cc406Sopenharmony_ci * '1'-output from bit 7 of each byte 2838141cc406Sopenharmony_ci */ 2839141cc406Sopenharmony_ci _lto2b (0x007, &data->bit_ordering[0]); /* Set to Packed4bitGray, MSB, MSbit */ 2840141cc406Sopenharmony_ci 2841141cc406Sopenharmony_ci /* Compression Type and Argument NOT SUPPORTED in this scanner */ 2842141cc406Sopenharmony_ci data->compression_type = 0x00; 2843141cc406Sopenharmony_ci data->compression_arg = 0x02; 2844141cc406Sopenharmony_ci 2845141cc406Sopenharmony_ci /* Byte42: MRIF:Filtering:GammaID */ 2846141cc406Sopenharmony_ci if (data->image_composition == GRAYSCALE) 2847141cc406Sopenharmony_ci { 2848141cc406Sopenharmony_ci if (s->val[OPT_NEGATIVE].w) 2849141cc406Sopenharmony_ci data->byte42 &= ~(1 << 7); /* unset bit 7 */ 2850141cc406Sopenharmony_ci else 2851141cc406Sopenharmony_ci data->byte42 |= (1 << 7); /* set bit 7 */ 2852141cc406Sopenharmony_ci data->byte42 |= (get_grayfilter_val (s->val[OPT_GRAYFILTER].s) & (7 << 4)); /* set bits 6-4 to GRAYFILTER */ 2853141cc406Sopenharmony_ci } 2854141cc406Sopenharmony_ci else 2855141cc406Sopenharmony_ci { 2856141cc406Sopenharmony_ci data->byte42 &= ~(1 << 7); /* unset bit 7 */ 2857141cc406Sopenharmony_ci data->byte42 &= ~(7 << 4); /* unset bits 6-4 */ 2858141cc406Sopenharmony_ci } 2859141cc406Sopenharmony_ci /* Bytes 45, 365 Binary Filtering for lineart and halftone can be set when option IPU is installed */ 2860141cc406Sopenharmony_ci if ((id = get_noisematrix_id (s->val[OPT_NOISEREMOVAL].s)) != 0) 2861141cc406Sopenharmony_ci { 2862141cc406Sopenharmony_ci data->binary_filtering |= (1 << 7); /* set bit 7 */ 2863141cc406Sopenharmony_ci data->binary_filtering |= noisematrix[id].val; /* 00H, 01H, 02H; 03H:Reserved */ 2864141cc406Sopenharmony_ci } 2865141cc406Sopenharmony_ci if (s->val[OPT_SMOOTHING].w == SANE_TRUE) 2866141cc406Sopenharmony_ci data->binary_filtering |= (1 << 6); /* set bit 6 */ 2867141cc406Sopenharmony_ci 2868141cc406Sopenharmony_ci /* Automatic separation, automatic binarization, and SECTION is available if Image Processing Unit is installed */ 2869141cc406Sopenharmony_ci if (s->hw->info.hasIPU) 2870141cc406Sopenharmony_ci { 2871141cc406Sopenharmony_ci /* Byte 48: Automatic Separation */ 2872141cc406Sopenharmony_ci data->automatic_separation = 2873141cc406Sopenharmony_ci get_auto_separation_val (s->val[OPT_AUTOSEP].s); 2874141cc406Sopenharmony_ci /* Byte 50: Automatic Binarization */ 2875141cc406Sopenharmony_ci data->automatic_binarization = 2876141cc406Sopenharmony_ci get_auto_binarization_val (s->val[OPT_AUTOBIN].s); 2877141cc406Sopenharmony_ci /* fill in values for each section 2878141cc406Sopenharmony_ci for(j=0; j<NumSec; j++){ 2879141cc406Sopenharmony_ci wbuf[i].winsec[j].ulx 2880141cc406Sopenharmony_ci wbuf[i].winsec[j].uly 2881141cc406Sopenharmony_ci wbuf[i].winsec[j].width 2882141cc406Sopenharmony_ci wbuf[i].winsec[j].length 2883141cc406Sopenharmony_ci wbuf[i].winsec[j].binary_filtering 2884141cc406Sopenharmony_ci wbuf[i].winsec[j].threshold 2885141cc406Sopenharmony_ci wbuf[i].winsec[j].image_composition 2886141cc406Sopenharmony_ci wbuf[i].winsec[j].halftone_id 2887141cc406Sopenharmony_ci wbuf[i].winsec[j].halftone_arg 2888141cc406Sopenharmony_ci } 2889141cc406Sopenharmony_ci */ 2890141cc406Sopenharmony_ci } 2891141cc406Sopenharmony_ci } 2892141cc406Sopenharmony_ci DBG (DBG_proc, "<< set_window_data\n"); 2893141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2894141cc406Sopenharmony_ci} 2895141cc406Sopenharmony_ci 2896141cc406Sopenharmony_ciSANE_Status 2897141cc406Sopenharmony_cisane_start (SANE_Handle handle) /* begin scanning */ 2898141cc406Sopenharmony_ci{ 2899141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 2900141cc406Sopenharmony_ci SANE_Status status; 2901141cc406Sopenharmony_ci SWD wbuf; /* Set Window Data: hdr + data */ 2902141cc406Sopenharmony_ci GWD gbuf; /* Get Window Data: hdr + data */ 2903141cc406Sopenharmony_ci SANE_Byte mode, prefeed, mwt = 0; 2904141cc406Sopenharmony_ci 2905141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_start\n"); 2906141cc406Sopenharmony_ci s->cancelled = SANE_FALSE; 2907141cc406Sopenharmony_ci 2908141cc406Sopenharmony_ci if (s->another_side) 2909141cc406Sopenharmony_ci { 2910141cc406Sopenharmony_ci /* Number of bytes to read for one side of sheet */ 2911141cc406Sopenharmony_ci s->bytes_to_read = s->params.bytes_per_line * s->params.lines; 2912141cc406Sopenharmony_ci DBG (DBG_info, 2913141cc406Sopenharmony_ci "SIDE#2 %d pixels per line, %d bytes, %d lines high, dpi=%d\n", 2914141cc406Sopenharmony_ci s->params.pixels_per_line, s->params.bytes_per_line, 2915141cc406Sopenharmony_ci s->params.lines, (int) s->val[OPT_Y_RESOLUTION].w); 2916141cc406Sopenharmony_ci s->scanning = SANE_TRUE; 2917141cc406Sopenharmony_ci s->cancelled = SANE_FALSE; 2918141cc406Sopenharmony_ci s->another_side = SANE_FALSE; /* This is side 2, so no more sides */ 2919141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_start\n"); 2920141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 2921141cc406Sopenharmony_ci } 2922141cc406Sopenharmony_ci 2923141cc406Sopenharmony_ci if (s->scanning) 2924141cc406Sopenharmony_ci { 2925141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: device busy\n"); 2926141cc406Sopenharmony_ci return SANE_STATUS_DEVICE_BUSY; 2927141cc406Sopenharmony_ci } 2928141cc406Sopenharmony_ci 2929141cc406Sopenharmony_ci /* Let's start a new scan */ 2930141cc406Sopenharmony_ci 2931141cc406Sopenharmony_ci if ((status = sane_get_parameters (s, 0)) != SANE_STATUS_GOOD) 2932141cc406Sopenharmony_ci { /* get preliminary parameters */ 2933141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: sane_get_parameters failed: %s\n", 2934141cc406Sopenharmony_ci sane_strstatus (status)); 2935141cc406Sopenharmony_ci return (status); 2936141cc406Sopenharmony_ci } 2937141cc406Sopenharmony_ci 2938141cc406Sopenharmony_ci DBG (DBG_info, ">> sane_start: trying to open: name=\"%s\" fd=%d\n", 2939141cc406Sopenharmony_ci s->hw->sane.name, s->fd); 2940141cc406Sopenharmony_ci if ((status = 2941141cc406Sopenharmony_ci sanei_scsi_open (s->hw->sane.name, &s->fd, &sense_handler, 2942141cc406Sopenharmony_ci &(s->hw->sense_data))) != SANE_STATUS_GOOD) 2943141cc406Sopenharmony_ci { 2944141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: open of %s failed: %d %s\n", 2945141cc406Sopenharmony_ci s->hw->sane.name, status, sane_strstatus (status)); 2946141cc406Sopenharmony_ci return (status); 2947141cc406Sopenharmony_ci } 2948141cc406Sopenharmony_ci DBG (DBG_info, ">>sane_start: OPENED \"%s\" fd=%d\n", s->hw->sane.name, 2949141cc406Sopenharmony_ci s->fd); 2950141cc406Sopenharmony_ci 2951141cc406Sopenharmony_ci if ((status = test_unit_ready (s->fd)) != SANE_STATUS_GOOD) 2952141cc406Sopenharmony_ci { 2953141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: test_unit_ready() failed: %s\n", 2954141cc406Sopenharmony_ci sane_strstatus (status)); 2955141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 2956141cc406Sopenharmony_ci s->fd = -1; 2957141cc406Sopenharmony_ci return status; 2958141cc406Sopenharmony_ci } 2959141cc406Sopenharmony_ci 2960141cc406Sopenharmony_ci 2961141cc406Sopenharmony_ci if ((status = reserve_unit (s->fd)) != SANE_STATUS_GOOD) 2962141cc406Sopenharmony_ci { 2963141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: reserve_unit() failed: %s\n", 2964141cc406Sopenharmony_ci sane_strstatus (status)); 2965141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 2966141cc406Sopenharmony_ci s->fd = -1; 2967141cc406Sopenharmony_ci return (status); 2968141cc406Sopenharmony_ci } 2969141cc406Sopenharmony_ci 2970141cc406Sopenharmony_ci /* NOW SET UP SCANNER ONCE PER BATCH */ 2971141cc406Sopenharmony_ci 2972141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting basic measurement unit to mm\n"); 2973141cc406Sopenharmony_ci if ((status = set_basic_measurement_unit (s->fd, s->hw->info.bmu))) 2974141cc406Sopenharmony_ci { 2975141cc406Sopenharmony_ci DBG (DBG_error, "set_basic_measurment_unit failed: %s\n", 2976141cc406Sopenharmony_ci sane_strstatus (status)); 2977141cc406Sopenharmony_ci release_unit (s->fd); 2978141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 2979141cc406Sopenharmony_ci s->fd = -1; 2980141cc406Sopenharmony_ci return (status); 2981141cc406Sopenharmony_ci } 2982141cc406Sopenharmony_ci 2983141cc406Sopenharmony_ci if (get_scan_source_id (s->val[OPT_SCAN_SOURCE].s) == 0) 2984141cc406Sopenharmony_ci { 2985141cc406Sopenharmony_ci mode = FLATBED; 2986141cc406Sopenharmony_ci } 2987141cc406Sopenharmony_ci else 2988141cc406Sopenharmony_ci { 2989141cc406Sopenharmony_ci mode = (s->val[OPT_DUPLEX].w) ? DUPLEX : SIMPLEX; 2990141cc406Sopenharmony_ci } 2991141cc406Sopenharmony_ci 2992141cc406Sopenharmony_ci prefeed = s->val[OPT_PREFEED].w ? 0x04 : 0x00; 2993141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting scan source to %d %s\n", mode, 2994141cc406Sopenharmony_ci (SANE_String) s->val[OPT_SCAN_SOURCE].s); 2995141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting prefeed to %d\n", prefeed); 2996141cc406Sopenharmony_ci if ((status = 2997141cc406Sopenharmony_ci set_adf_control (s->fd, &mode, &prefeed, &mwt)) != SANE_STATUS_GOOD) 2998141cc406Sopenharmony_ci { 2999141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: error set_adf_control: %s\n", 3000141cc406Sopenharmony_ci sane_strstatus (status)); 3001141cc406Sopenharmony_ci release_unit (s->fd); 3002141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3003141cc406Sopenharmony_ci s->fd = -1; 3004141cc406Sopenharmony_ci return (SANE_STATUS_INVAL); 3005141cc406Sopenharmony_ci } 3006141cc406Sopenharmony_ci 3007141cc406Sopenharmony_ci 3008141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting endorser control to %d\n", 3009141cc406Sopenharmony_ci s->val[OPT_ENDORSER].w); 3010141cc406Sopenharmony_ci if ((status = 3011141cc406Sopenharmony_ci set_endorser_control (s->fd, 3012141cc406Sopenharmony_ci &s->val[OPT_ENDORSER].w)) != SANE_STATUS_GOOD) 3013141cc406Sopenharmony_ci { 3014141cc406Sopenharmony_ci DBG (DBG_error, "set_endorser_control failed: %s\n", 3015141cc406Sopenharmony_ci sane_strstatus (status)); 3016141cc406Sopenharmony_ci release_unit (s->fd); 3017141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3018141cc406Sopenharmony_ci s->fd = -1; 3019141cc406Sopenharmony_ci return (status); 3020141cc406Sopenharmony_ci } 3021141cc406Sopenharmony_ci if (s->val[OPT_ENDORSER].w) 3022141cc406Sopenharmony_ci { 3023141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting endorser string to %s\n", 3024141cc406Sopenharmony_ci s->val[OPT_ENDORSER_STRING].s); 3025141cc406Sopenharmony_ci if ((status = 3026141cc406Sopenharmony_ci set_endorser_string (s->fd, 3027141cc406Sopenharmony_ci (SANE_String) s->val[OPT_ENDORSER_STRING]. 3028141cc406Sopenharmony_ci s)) != SANE_STATUS_GOOD) 3029141cc406Sopenharmony_ci { 3030141cc406Sopenharmony_ci DBG (DBG_error, "set_endorser_string failed: %s\n", 3031141cc406Sopenharmony_ci sane_strstatus (status)); 3032141cc406Sopenharmony_ci release_unit (s->fd); 3033141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3034141cc406Sopenharmony_ci s->fd = -1; 3035141cc406Sopenharmony_ci return (status); 3036141cc406Sopenharmony_ci } 3037141cc406Sopenharmony_ci } 3038141cc406Sopenharmony_ci 3039141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting scan_wait_mode to %d\n", 3040141cc406Sopenharmony_ci s->val[OPT_SCAN_WAIT_MODE].w); 3041141cc406Sopenharmony_ci if ((status = 3042141cc406Sopenharmony_ci set_scan_wait_mode (s->fd, 3043141cc406Sopenharmony_ci s->val[OPT_SCAN_WAIT_MODE].w)) != SANE_STATUS_GOOD) 3044141cc406Sopenharmony_ci { 3045141cc406Sopenharmony_ci DBG (DBG_error, "set_scan_wait_mode failed: %s\n", 3046141cc406Sopenharmony_ci sane_strstatus (status)); 3047141cc406Sopenharmony_ci release_unit (s->fd); 3048141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3049141cc406Sopenharmony_ci s->fd = -1; 3050141cc406Sopenharmony_ci return (status); 3051141cc406Sopenharmony_ci } 3052141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting white_balance to %d\n", 3053141cc406Sopenharmony_ci s->val[OPT_WHITE_BALANCE].w); 3054141cc406Sopenharmony_ci if ((status = 3055141cc406Sopenharmony_ci set_white_balance (s->fd, 3056141cc406Sopenharmony_ci &s->val[OPT_WHITE_BALANCE].w)) != SANE_STATUS_GOOD) 3057141cc406Sopenharmony_ci { 3058141cc406Sopenharmony_ci DBG (DBG_error, "set_white_balance failed: %s\n", 3059141cc406Sopenharmony_ci sane_strstatus (status)); 3060141cc406Sopenharmony_ci release_unit (s->fd); 3061141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3062141cc406Sopenharmony_ci s->fd = -1; 3063141cc406Sopenharmony_ci return (status); 3064141cc406Sopenharmony_ci } 3065141cc406Sopenharmony_ci 3066141cc406Sopenharmony_ci if (s->val[OPT_CUSTOM_GAMMA].b) 3067141cc406Sopenharmony_ci { /* Custom Gamma needs to be sent to scanner */ 3068141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: setting custom gamma\n"); 3069141cc406Sopenharmony_ci if ((status = hs2p_send_gamma (s))) 3070141cc406Sopenharmony_ci { 3071141cc406Sopenharmony_ci DBG (DBG_error, "hs2p_send_gamma failed: %s\n", 3072141cc406Sopenharmony_ci sane_strstatus (status)); 3073141cc406Sopenharmony_ci release_unit (s->fd); 3074141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3075141cc406Sopenharmony_ci s->fd = -1; 3076141cc406Sopenharmony_ci return (status); 3077141cc406Sopenharmony_ci } 3078141cc406Sopenharmony_ci /* We succeeded, so we don't need to upload this vector again (unless user modifies gamma table) */ 3079141cc406Sopenharmony_ci s->val[OPT_CUSTOM_GAMMA].b = SANE_FALSE; 3080141cc406Sopenharmony_ci } 3081141cc406Sopenharmony_ci 3082141cc406Sopenharmony_ci 3083141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: filling in window data buffer \n"); 3084141cc406Sopenharmony_ci if ((status = set_window_data (s, &wbuf)) != SANE_STATUS_GOOD) 3085141cc406Sopenharmony_ci { 3086141cc406Sopenharmony_ci DBG (DBG_error, "set_window_data failed: %s\n", 3087141cc406Sopenharmony_ci sane_strstatus (status)); 3088141cc406Sopenharmony_ci release_unit (s->fd); 3089141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3090141cc406Sopenharmony_ci s->fd = -1; 3091141cc406Sopenharmony_ci return (status); 3092141cc406Sopenharmony_ci } 3093141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: sending SET WINDOW DATA\n"); 3094141cc406Sopenharmony_ci if ((status = set_window (s->fd, &wbuf)) != SANE_STATUS_GOOD) 3095141cc406Sopenharmony_ci { 3096141cc406Sopenharmony_ci DBG (DBG_error, "SET WINDOW DATA failed: %s\n", 3097141cc406Sopenharmony_ci sane_strstatus (status)); 3098141cc406Sopenharmony_ci print_window_data (&wbuf); 3099141cc406Sopenharmony_ci release_unit (s->fd); 3100141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3101141cc406Sopenharmony_ci s->fd = -1; 3102141cc406Sopenharmony_ci return (status); 3103141cc406Sopenharmony_ci } 3104141cc406Sopenharmony_ci DBG (DBG_info, "sane_start: sending GET WINDOW\n"); 3105141cc406Sopenharmony_ci memset (&gbuf, 0, sizeof (gbuf)); /* CLEAR wbuf */ 3106141cc406Sopenharmony_ci if ((status = get_window (s->fd, &gbuf)) != SANE_STATUS_GOOD) 3107141cc406Sopenharmony_ci { 3108141cc406Sopenharmony_ci DBG (DBG_error, "GET WINDOW failed: %s\n", sane_strstatus (status)); 3109141cc406Sopenharmony_ci release_unit (s->fd); 3110141cc406Sopenharmony_ci sanei_scsi_close (s->fd); 3111141cc406Sopenharmony_ci s->fd = -1; 3112141cc406Sopenharmony_ci return (status); 3113141cc406Sopenharmony_ci } 3114141cc406Sopenharmony_ci 3115141cc406Sopenharmony_ci /* DONE WITH SETTING UP SCANNER ONCE PER BATCH */ 3116141cc406Sopenharmony_ci 3117141cc406Sopenharmony_ci s->EOM = SANE_FALSE; 3118141cc406Sopenharmony_ci if (mode != FLATBED) 3119141cc406Sopenharmony_ci { 3120141cc406Sopenharmony_ci if ((status = 3121141cc406Sopenharmony_ci get_hs2p_data (s, DATA_TYPE_ADF_STATUS, 3122141cc406Sopenharmony_ci DATA_TYPE_EOL)) != SANE_STATUS_GOOD) 3123141cc406Sopenharmony_ci { 3124141cc406Sopenharmony_ci DBG (DBG_error, "sane_start: error reading adf_status: %s\n", 3125141cc406Sopenharmony_ci sane_strstatus (status)); 3126141cc406Sopenharmony_ci return (status); 3127141cc406Sopenharmony_ci } 3128141cc406Sopenharmony_ci if ((s->data.adf_status & 0x01) == 0x01) 3129141cc406Sopenharmony_ci { 3130141cc406Sopenharmony_ci DBG (DBG_warning, "sane_start: No document on ADF\n"); 3131141cc406Sopenharmony_ci return (SANE_STATUS_NO_DOCS); 3132141cc406Sopenharmony_ci } 3133141cc406Sopenharmony_ci else if ((s->data.adf_status & 0x02) == 0x02) 3134141cc406Sopenharmony_ci { 3135141cc406Sopenharmony_ci DBG (DBG_warning, "sane_start: ADF cover open!\n"); 3136141cc406Sopenharmony_ci return (SANE_STATUS_COVER_OPEN); 3137141cc406Sopenharmony_ci } 3138141cc406Sopenharmony_ci } 3139141cc406Sopenharmony_ci 3140141cc406Sopenharmony_ci 3141141cc406Sopenharmony_ci status = trigger_scan (s); 3142141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 3143141cc406Sopenharmony_ci { 3144141cc406Sopenharmony_ci DBG (DBG_error, "start of scan failed: %s\n", sane_strstatus (status)); 3145141cc406Sopenharmony_ci print_window_data (&wbuf); 3146141cc406Sopenharmony_ci /* this line introduced not to freeze xscanimage */ 3147141cc406Sopenharmony_ci /*do_cancel (s); */ 3148141cc406Sopenharmony_ci return status; 3149141cc406Sopenharmony_ci } 3150141cc406Sopenharmony_ci /* Wait for scanner to become ready to transmit data */ 3151141cc406Sopenharmony_ci status = hs2p_wait_ready (s); 3152141cc406Sopenharmony_ci if (status != SANE_STATUS_GOOD) 3153141cc406Sopenharmony_ci { 3154141cc406Sopenharmony_ci DBG (DBG_error, "GET DATA STATUS failed: %s\n", 3155141cc406Sopenharmony_ci sane_strstatus (status)); 3156141cc406Sopenharmony_ci return (status); 3157141cc406Sopenharmony_ci } 3158141cc406Sopenharmony_ci 3159141cc406Sopenharmony_ci s->another_side = (mode == DUPLEX) ? SANE_TRUE : SANE_FALSE; 3160141cc406Sopenharmony_ci /* Number of bytes to read for one side of sheet */ 3161141cc406Sopenharmony_ci DBG (DBG_info, "ANOTHER SIDE = %s\n", (s->another_side) ? "TRUE" : "FALSE"); 3162141cc406Sopenharmony_ci s->bytes_to_read = s->params.bytes_per_line * s->params.lines; 3163141cc406Sopenharmony_ci DBG (DBG_info, "%d pixels per line, %d bytes, %d lines high, dpi=%d\n", 3164141cc406Sopenharmony_ci s->params.pixels_per_line, s->params.bytes_per_line, 3165141cc406Sopenharmony_ci s->params.lines, (int) s->val[OPT_Y_RESOLUTION].w); 3166141cc406Sopenharmony_ci s->scanning = SANE_TRUE; 3167141cc406Sopenharmony_ci s->cancelled = SANE_FALSE; 3168141cc406Sopenharmony_ci 3169141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_start\n"); 3170141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 3171141cc406Sopenharmony_ci} 3172141cc406Sopenharmony_ci 3173141cc406Sopenharmony_ciSANE_Status 3174141cc406Sopenharmony_cisane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, 3175141cc406Sopenharmony_ci SANE_Int * len) 3176141cc406Sopenharmony_ci{ 3177141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 3178141cc406Sopenharmony_ci SANE_Status status; 3179141cc406Sopenharmony_ci size_t nread, bytes_requested, i, start; 3180141cc406Sopenharmony_ci SANE_Byte color; 3181141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_read\n"); 3182141cc406Sopenharmony_ci 3183141cc406Sopenharmony_ci *len = 0; 3184141cc406Sopenharmony_ci 3185141cc406Sopenharmony_ci DBG (DBG_info, "sane_read: bytes left to read: %ld\n", 3186141cc406Sopenharmony_ci (u_long) s->bytes_to_read); 3187141cc406Sopenharmony_ci 3188141cc406Sopenharmony_ci if (s->bytes_to_read == 0) 3189141cc406Sopenharmony_ci { /* We've reached the end of one side of sheet */ 3190141cc406Sopenharmony_ci if (!s->another_side) 3191141cc406Sopenharmony_ci { 3192141cc406Sopenharmony_ci do_cancel (s); 3193141cc406Sopenharmony_ci return (SANE_STATUS_EOF); 3194141cc406Sopenharmony_ci } 3195141cc406Sopenharmony_ci else 3196141cc406Sopenharmony_ci { 3197141cc406Sopenharmony_ci /* let frontend call sane_start again to reset bytes_to_read */ 3198141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_read: getting another side\n"); 3199141cc406Sopenharmony_ci return (SANE_STATUS_EOF); 3200141cc406Sopenharmony_ci } 3201141cc406Sopenharmony_ci } 3202141cc406Sopenharmony_ci 3203141cc406Sopenharmony_ci if (s->cancelled) 3204141cc406Sopenharmony_ci { 3205141cc406Sopenharmony_ci DBG (DBG_info, "sane_read: cancelled!\n"); 3206141cc406Sopenharmony_ci return SANE_STATUS_CANCELLED; 3207141cc406Sopenharmony_ci } 3208141cc406Sopenharmony_ci if (!s->scanning) 3209141cc406Sopenharmony_ci { 3210141cc406Sopenharmony_ci DBG (DBG_info, "sane_read: scanning is false!\n"); 3211141cc406Sopenharmony_ci return (do_cancel (s)); 3212141cc406Sopenharmony_ci } 3213141cc406Sopenharmony_ci 3214141cc406Sopenharmony_ci nread = max_len; 3215141cc406Sopenharmony_ci if (nread > s->bytes_to_read) 3216141cc406Sopenharmony_ci nread = s->bytes_to_read; 3217141cc406Sopenharmony_ci bytes_requested = nread; 3218141cc406Sopenharmony_ci start = 0; 3219141cc406Sopenharmony_ci 3220141cc406Sopenharmony_cipad: 3221141cc406Sopenharmony_ci if (s->EOM) 3222141cc406Sopenharmony_ci { 3223141cc406Sopenharmony_ci if (s->val[OPT_PADDING].w) 3224141cc406Sopenharmony_ci { 3225141cc406Sopenharmony_ci DBG (DBG_info, "sane_read s->EOM padding from %ld to %ld\n", 3226141cc406Sopenharmony_ci (u_long) start, (u_long) bytes_requested); 3227141cc406Sopenharmony_ci color = (s->val[OPT_NEGATIVE].w) ? 0 : 255; 3228141cc406Sopenharmony_ci /* pad to requested length */ 3229141cc406Sopenharmony_ci for (i = start; i < bytes_requested; i++) 3230141cc406Sopenharmony_ci buf[i] = color; 3231141cc406Sopenharmony_ci nread = bytes_requested; /* we've padded to bytes_requested */ 3232141cc406Sopenharmony_ci *len = nread; 3233141cc406Sopenharmony_ci s->bytes_to_read -= nread; 3234141cc406Sopenharmony_ci } 3235141cc406Sopenharmony_ci else /* TRUNCATE: should never reach here */ 3236141cc406Sopenharmony_ci { 3237141cc406Sopenharmony_ci *len = nread; 3238141cc406Sopenharmony_ci s->bytes_to_read = 0; /* EOM */ 3239141cc406Sopenharmony_ci } 3240141cc406Sopenharmony_ci } 3241141cc406Sopenharmony_ci else 3242141cc406Sopenharmony_ci { 3243141cc406Sopenharmony_ci DBG (DBG_info, "sane_read: trying to read %ld bytes\n", (u_long) nread); 3244141cc406Sopenharmony_ci status = read_data (s->fd, buf, &nread, DATA_TYPE_IMAGE, DTQ); 3245141cc406Sopenharmony_ci switch (status) 3246141cc406Sopenharmony_ci { 3247141cc406Sopenharmony_ci case SANE_STATUS_NO_DOCS: 3248141cc406Sopenharmony_ci DBG (DBG_error, "sane_read: End-Of-Medium detected\n"); 3249141cc406Sopenharmony_ci s->EOM = SANE_TRUE; 3250141cc406Sopenharmony_ci /* 3251141cc406Sopenharmony_ci * If status != SANE_STATUS_GOOD, then sense_handler() has already 3252141cc406Sopenharmony_ci * been called and the sanei_* functions have already gotten the 3253141cc406Sopenharmony_ci * sense data buffer (which apparently clears the error condition) 3254141cc406Sopenharmony_ci * so the following doesn't work: 3255141cc406Sopenharmony_ci get_sense_data (s->fd, &(s->hw->sense_data)); 3256141cc406Sopenharmony_ci print_sense_data (&(s->hw->sense_data)); 3257141cc406Sopenharmony_ci */ 3258141cc406Sopenharmony_ci start = (isset_ILI (s->hw->sense_data)) ? /* Invalid Length Indicator */ 3259141cc406Sopenharmony_ci bytes_requested - _4btol (s->hw->sense_data.information) : nread; 3260141cc406Sopenharmony_ci goto pad; 3261141cc406Sopenharmony_ci break; 3262141cc406Sopenharmony_ci case SANE_STATUS_GOOD: 3263141cc406Sopenharmony_ci *len = nread; 3264141cc406Sopenharmony_ci s->bytes_to_read -= nread; 3265141cc406Sopenharmony_ci break; 3266141cc406Sopenharmony_ci default: 3267141cc406Sopenharmony_ci DBG (DBG_error, "sane_read: read error\n"); 3268141cc406Sopenharmony_ci do_cancel (s); 3269141cc406Sopenharmony_ci return (SANE_STATUS_IO_ERROR); 3270141cc406Sopenharmony_ci } 3271141cc406Sopenharmony_ci } 3272141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_read\n"); 3273141cc406Sopenharmony_ci return (SANE_STATUS_GOOD); 3274141cc406Sopenharmony_ci} 3275141cc406Sopenharmony_ci 3276141cc406Sopenharmony_ci 3277141cc406Sopenharmony_civoid 3278141cc406Sopenharmony_cisane_cancel (SANE_Handle handle) 3279141cc406Sopenharmony_ci{ 3280141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 3281141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_cancel\n"); 3282141cc406Sopenharmony_ci 3283141cc406Sopenharmony_ci if (s->scanning) 3284141cc406Sopenharmony_ci { /* if batchmode is enabled, then call set_window to abort the batch 3285141cc406Sopenharmony_ci if (_OPT_VAL_WORD(s, OPT_BATCH) == SANE_TRUE) { 3286141cc406Sopenharmony_ci DBG(5, "sane_cancel: calling set_window to abort batch\n"); 3287141cc406Sopenharmony_ci set_window(s, BH_BATCH_ABORT); 3288141cc406Sopenharmony_ci } */ 3289141cc406Sopenharmony_ci do_cancel (s); 3290141cc406Sopenharmony_ci } 3291141cc406Sopenharmony_ci 3292141cc406Sopenharmony_ci 3293141cc406Sopenharmony_ci 3294141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_cancel\n"); 3295141cc406Sopenharmony_ci} 3296141cc406Sopenharmony_ci 3297141cc406Sopenharmony_ciSANE_Status 3298141cc406Sopenharmony_cisane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking) 3299141cc406Sopenharmony_ci{ 3300141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_set_io_mode (handle = %p, non_blocking = %d)\n", 3301141cc406Sopenharmony_ci handle, non_blocking); 3302141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_set_io_mode\n"); 3303141cc406Sopenharmony_ci 3304141cc406Sopenharmony_ci return SANE_STATUS_UNSUPPORTED; 3305141cc406Sopenharmony_ci} 3306141cc406Sopenharmony_ci 3307141cc406Sopenharmony_ciSANE_Status 3308141cc406Sopenharmony_cisane_get_select_fd (SANE_Handle handle, SANE_Int * fd) 3309141cc406Sopenharmony_ci{ 3310141cc406Sopenharmony_ci#ifdef NONBLOCKSUPPORTED 3311141cc406Sopenharmony_ci HS2P_Scanner *s = handle; 3312141cc406Sopenharmony_ci#endif 3313141cc406Sopenharmony_ci DBG (DBG_proc, ">> sane_get_select_fd (handle = %p, fd = %p)\n", handle, 3314141cc406Sopenharmony_ci (void *) fd); 3315141cc406Sopenharmony_ci 3316141cc406Sopenharmony_ci#ifdef NONBLOCKSUPPORTED 3317141cc406Sopenharmony_ci if (s->fd < 0) 3318141cc406Sopenharmony_ci { 3319141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_get_select_fd\n"); 3320141cc406Sopenharmony_ci return SANE_STATUS_INVAL; 3321141cc406Sopenharmony_ci } 3322141cc406Sopenharmony_ci *fd = s->fd; 3323141cc406Sopenharmony_ci return SANE_STATUS_GOOD; 3324141cc406Sopenharmony_ci#else 3325141cc406Sopenharmony_ci (void) handle; 3326141cc406Sopenharmony_ci (void) fd; /* get rid of compiler warning */ 3327141cc406Sopenharmony_ci DBG (DBG_proc, "<< sane_get_select_fd\n"); 3328141cc406Sopenharmony_ci return SANE_STATUS_UNSUPPORTED; 3329141cc406Sopenharmony_ci#endif 3330141cc406Sopenharmony_ci} 3331