1141cc406Sopenharmony_ci/* 2141cc406Sopenharmony_ci* This program is free software; you can redistribute it and/or 3141cc406Sopenharmony_ci* modify it under the terms of the GNU General Public License 4141cc406Sopenharmony_ci* as published by the Free Software Foundation; either version 5141cc406Sopenharmony_ci* 2 of the License, or (at your option) any later version. 6141cc406Sopenharmony_ci*/ 7141cc406Sopenharmony_ci 8141cc406Sopenharmony_ci/* For putenv */ 9141cc406Sopenharmony_ci#define _XOPEN_SOURCE 10141cc406Sopenharmony_ci#include <stdlib.h> 11141cc406Sopenharmony_ci#include <unistd.h> 12141cc406Sopenharmony_ci#include <string.h> 13141cc406Sopenharmony_ci#include <stdio.h> 14141cc406Sopenharmony_ci 15141cc406Sopenharmony_ci#define __MAIN__ 16141cc406Sopenharmony_ci 17141cc406Sopenharmony_ci#include "../backend/umax_pp_low.h" 18141cc406Sopenharmony_ci#include "../backend/umax_pp_mid.h" 19141cc406Sopenharmony_ci 20141cc406Sopenharmony_cistatic void 21141cc406Sopenharmony_ciUsage (char *name) 22141cc406Sopenharmony_ci{ 23141cc406Sopenharmony_ci fprintf (stderr, 24141cc406Sopenharmony_ci "%s [-c color_mode] [-x coord] [-y coord] [-w width] [-h height] [-g gain] [-z offset] [-d dpi] [-t level] [-s] [-p] [-l 0|1] [-a ioport_addr] [-r]\n", 25141cc406Sopenharmony_ci name); 26141cc406Sopenharmony_ci} 27141cc406Sopenharmony_ci 28141cc406Sopenharmony_ci 29141cc406Sopenharmony_ciint 30141cc406Sopenharmony_cimain (int argc, char **argv) 31141cc406Sopenharmony_ci{ 32141cc406Sopenharmony_ci char dbgstr[80]; 33141cc406Sopenharmony_ci int probe = 0; 34141cc406Sopenharmony_ci int port = 0; 35141cc406Sopenharmony_ci const char *name = NULL; 36141cc406Sopenharmony_ci int scan = 0; 37141cc406Sopenharmony_ci int lamp = -1; 38141cc406Sopenharmony_ci int i; 39141cc406Sopenharmony_ci int found; 40141cc406Sopenharmony_ci int recover = 0; 41141cc406Sopenharmony_ci int trace = 0; 42141cc406Sopenharmony_ci int maxw, maxh; 43141cc406Sopenharmony_ci 44141cc406Sopenharmony_ci#ifdef HAVE_LINUX_PPDEV_H 45141cc406Sopenharmony_ci int fd; 46141cc406Sopenharmony_ci#endif 47141cc406Sopenharmony_ci 48141cc406Sopenharmony_ci/* scanning parameters : defaults to preview (75 dpi color, full scan area) */ 49141cc406Sopenharmony_ci int gain = 0x0; 50141cc406Sopenharmony_ci int offset = 0x646; 51141cc406Sopenharmony_ci int dpi = 75; 52141cc406Sopenharmony_ci int x = 0, y = 0; 53141cc406Sopenharmony_ci int width = -1, height = -1; 54141cc406Sopenharmony_ci int color = RGB_MODE; 55141cc406Sopenharmony_ci 56141cc406Sopenharmony_ci char **ports; 57141cc406Sopenharmony_ci int rc; 58141cc406Sopenharmony_ci 59141cc406Sopenharmony_ci 60141cc406Sopenharmony_ci /* option parsing */ 61141cc406Sopenharmony_ci /* 62141cc406Sopenharmony_ci -c --color : color mode: RGB, BW, BW12, RGB12 63141cc406Sopenharmony_ci -x : x coordinate 64141cc406Sopenharmony_ci -y : y coordinate 65141cc406Sopenharmony_ci -w --witdh : scan width 66141cc406Sopenharmony_ci -h --height : scan height 67141cc406Sopenharmony_ci -f --file : session file 68141cc406Sopenharmony_ci -p --probe : probe scanner 69141cc406Sopenharmony_ci -s --scan : scan 70141cc406Sopenharmony_ci -t --trace : execution trace 71141cc406Sopenharmony_ci -l --lamp : turn lamp on/off 1/0 72141cc406Sopenharmony_ci -d --dpi : set scan resolution 73141cc406Sopenharmony_ci -g --gain : set RVB gain 74141cc406Sopenharmony_ci -z --offset: set offset 75141cc406Sopenharmony_ci -a --addr : io port address 76141cc406Sopenharmony_ci -n --name : ppdev device name 77141cc406Sopenharmony_ci -r : recover from previous failed scan 78141cc406Sopenharmony_ci -m --model : model revision 79141cc406Sopenharmony_ci */ 80141cc406Sopenharmony_ci 81141cc406Sopenharmony_ci 82141cc406Sopenharmony_ci i = 1; 83141cc406Sopenharmony_ci trace = 0; 84141cc406Sopenharmony_ci sanei_umax_pp_setauto (1); 85141cc406Sopenharmony_ci while (i < argc) 86141cc406Sopenharmony_ci { 87141cc406Sopenharmony_ci found = 0; 88141cc406Sopenharmony_ci 89141cc406Sopenharmony_ci if ((strcmp (argv[i], "-p") == 0) || (strcmp (argv[i], "--probe") == 0)) 90141cc406Sopenharmony_ci { 91141cc406Sopenharmony_ci probe = 1; 92141cc406Sopenharmony_ci found = 1; 93141cc406Sopenharmony_ci } 94141cc406Sopenharmony_ci 95141cc406Sopenharmony_ci if ((strcmp (argv[i], "-c") == 0) || (strcmp (argv[i], "--color") == 0)) 96141cc406Sopenharmony_ci { 97141cc406Sopenharmony_ci if (i == (argc - 1)) 98141cc406Sopenharmony_ci { 99141cc406Sopenharmony_ci Usage (argv[0]); 100141cc406Sopenharmony_ci fprintf (stderr, "expected color mode value\n"); 101141cc406Sopenharmony_ci return 0; 102141cc406Sopenharmony_ci } 103141cc406Sopenharmony_ci color = 0; 104141cc406Sopenharmony_ci i++; 105141cc406Sopenharmony_ci found = 1; 106141cc406Sopenharmony_ci if (strcmp (argv[i], "RGB") == 0) 107141cc406Sopenharmony_ci color = RGB_MODE; 108141cc406Sopenharmony_ci if (strcmp (argv[i], "RGB12") == 0) 109141cc406Sopenharmony_ci color = RGB12_MODE; 110141cc406Sopenharmony_ci if (strcmp (argv[i], "BW") == 0) 111141cc406Sopenharmony_ci color = BW_MODE; 112141cc406Sopenharmony_ci if (strcmp (argv[i], "BW12") == 0) 113141cc406Sopenharmony_ci color = BW12_MODE; 114141cc406Sopenharmony_ci if (color == 0) 115141cc406Sopenharmony_ci { 116141cc406Sopenharmony_ci fprintf (stderr, "unexpected color mode value <%s>\n", argv[i]); 117141cc406Sopenharmony_ci fprintf (stderr, "Must be RGB, RGB12, BW, or BW12\n"); 118141cc406Sopenharmony_ci return 0; 119141cc406Sopenharmony_ci } 120141cc406Sopenharmony_ci } 121141cc406Sopenharmony_ci 122141cc406Sopenharmony_ci 123141cc406Sopenharmony_ci if (strcmp (argv[i], "-x") == 0) 124141cc406Sopenharmony_ci { 125141cc406Sopenharmony_ci if (i == (argc - 1)) 126141cc406Sopenharmony_ci { 127141cc406Sopenharmony_ci Usage (argv[0]); 128141cc406Sopenharmony_ci fprintf (stderr, "expected x value\n"); 129141cc406Sopenharmony_ci return 0; 130141cc406Sopenharmony_ci } 131141cc406Sopenharmony_ci x = atoi (argv[i + 1]); 132141cc406Sopenharmony_ci i++; 133141cc406Sopenharmony_ci found = 1; 134141cc406Sopenharmony_ci } 135141cc406Sopenharmony_ci 136141cc406Sopenharmony_ci if (strcmp (argv[i], "-y") == 0) 137141cc406Sopenharmony_ci { 138141cc406Sopenharmony_ci if (i == (argc - 1)) 139141cc406Sopenharmony_ci { 140141cc406Sopenharmony_ci Usage (argv[0]); 141141cc406Sopenharmony_ci fprintf (stderr, "expected y value\n"); 142141cc406Sopenharmony_ci return 0; 143141cc406Sopenharmony_ci } 144141cc406Sopenharmony_ci y = atoi (argv[i + 1]); 145141cc406Sopenharmony_ci i++; 146141cc406Sopenharmony_ci found = 1; 147141cc406Sopenharmony_ci } 148141cc406Sopenharmony_ci 149141cc406Sopenharmony_ci if ((strcmp (argv[i], "-w") == 0) || (strcmp (argv[i], "--witdh") == 0)) 150141cc406Sopenharmony_ci { 151141cc406Sopenharmony_ci if (i == (argc - 1)) 152141cc406Sopenharmony_ci { 153141cc406Sopenharmony_ci Usage (argv[0]); 154141cc406Sopenharmony_ci fprintf (stderr, "expected width value\n"); 155141cc406Sopenharmony_ci return 0; 156141cc406Sopenharmony_ci } 157141cc406Sopenharmony_ci width = atoi (argv[i + 1]); 158141cc406Sopenharmony_ci i++; 159141cc406Sopenharmony_ci found = 1; 160141cc406Sopenharmony_ci } 161141cc406Sopenharmony_ci 162141cc406Sopenharmony_ci if ((strcmp (argv[i], "-h") == 0) 163141cc406Sopenharmony_ci || (strcmp (argv[i], "--height") == 0)) 164141cc406Sopenharmony_ci { 165141cc406Sopenharmony_ci if (i == (argc - 1)) 166141cc406Sopenharmony_ci { 167141cc406Sopenharmony_ci Usage (argv[0]); 168141cc406Sopenharmony_ci fprintf (stderr, "expected height value\n"); 169141cc406Sopenharmony_ci return 0; 170141cc406Sopenharmony_ci } 171141cc406Sopenharmony_ci height = atoi (argv[i + 1]); 172141cc406Sopenharmony_ci i++; 173141cc406Sopenharmony_ci found = 1; 174141cc406Sopenharmony_ci } 175141cc406Sopenharmony_ci 176141cc406Sopenharmony_ci if ((strcmp (argv[i], "-t") == 0) || (strcmp (argv[i], "--trace") == 0)) 177141cc406Sopenharmony_ci { 178141cc406Sopenharmony_ci if (i == (argc - 1)) 179141cc406Sopenharmony_ci { 180141cc406Sopenharmony_ci Usage (argv[0]); 181141cc406Sopenharmony_ci fprintf (stderr, "expected trace value\n"); 182141cc406Sopenharmony_ci return 0; 183141cc406Sopenharmony_ci } 184141cc406Sopenharmony_ci trace = atoi (argv[i + 1]); 185141cc406Sopenharmony_ci i++; 186141cc406Sopenharmony_ci found = 1; 187141cc406Sopenharmony_ci } 188141cc406Sopenharmony_ci 189141cc406Sopenharmony_ci 190141cc406Sopenharmony_ci if ((strcmp (argv[i], "-r") == 0) 191141cc406Sopenharmony_ci || (strcmp (argv[i], "--recover") == 0)) 192141cc406Sopenharmony_ci { 193141cc406Sopenharmony_ci recover = 1; 194141cc406Sopenharmony_ci found = 1; 195141cc406Sopenharmony_ci } 196141cc406Sopenharmony_ci 197141cc406Sopenharmony_ci if ((strcmp (argv[i], "-s") == 0) || (strcmp (argv[i], "--scan") == 0)) 198141cc406Sopenharmony_ci { 199141cc406Sopenharmony_ci scan = 1; 200141cc406Sopenharmony_ci /* we have to probe again if we scan */ 201141cc406Sopenharmony_ci probe = 1; 202141cc406Sopenharmony_ci found = 1; 203141cc406Sopenharmony_ci } 204141cc406Sopenharmony_ci 205141cc406Sopenharmony_ci if ((strcmp (argv[i], "-d") == 0) || (strcmp (argv[i], "--dpi") == 0)) 206141cc406Sopenharmony_ci { 207141cc406Sopenharmony_ci if (i == (argc - 1)) 208141cc406Sopenharmony_ci { 209141cc406Sopenharmony_ci Usage (argv[0]); 210141cc406Sopenharmony_ci fprintf (stderr, "expected dpi value\n"); 211141cc406Sopenharmony_ci return 0; 212141cc406Sopenharmony_ci } 213141cc406Sopenharmony_ci dpi = atoi (argv[i + 1]); 214141cc406Sopenharmony_ci if ((dpi < 75) || (dpi > 1200)) 215141cc406Sopenharmony_ci { 216141cc406Sopenharmony_ci fprintf (stderr, "dpi value has to be between 75 and 1200\n"); 217141cc406Sopenharmony_ci return 0; 218141cc406Sopenharmony_ci } 219141cc406Sopenharmony_ci if ((dpi != 75) 220141cc406Sopenharmony_ci && (dpi != 150) 221141cc406Sopenharmony_ci && (dpi != 300) && (dpi != 600) && (dpi != 1200)) 222141cc406Sopenharmony_ci { 223141cc406Sopenharmony_ci fprintf (stderr, 224141cc406Sopenharmony_ci "dpi value has to be 75, 150, 300, 600 or 1200\n"); 225141cc406Sopenharmony_ci return 0; 226141cc406Sopenharmony_ci } 227141cc406Sopenharmony_ci i++; 228141cc406Sopenharmony_ci found = 1; 229141cc406Sopenharmony_ci } 230141cc406Sopenharmony_ci 231141cc406Sopenharmony_ci if ((strcmp (argv[i], "-g") == 0) 232141cc406Sopenharmony_ci || (strcmp (argv[i], "--gain") == 0)) 233141cc406Sopenharmony_ci { 234141cc406Sopenharmony_ci if (i == (argc - 1)) 235141cc406Sopenharmony_ci { 236141cc406Sopenharmony_ci Usage (argv[0]); 237141cc406Sopenharmony_ci fprintf (stderr, "expected hex gain value ( ex: A59 )\n"); 238141cc406Sopenharmony_ci return 0; 239141cc406Sopenharmony_ci } 240141cc406Sopenharmony_ci i++; 241141cc406Sopenharmony_ci found = 1; 242141cc406Sopenharmony_ci if (strlen (argv[i]) != 3) 243141cc406Sopenharmony_ci { 244141cc406Sopenharmony_ci Usage (argv[0]); 245141cc406Sopenharmony_ci fprintf (stderr, "expected hex gain value ( ex: A59 )\n"); 246141cc406Sopenharmony_ci return 0; 247141cc406Sopenharmony_ci } 248141cc406Sopenharmony_ci gain = strtol (argv[i], NULL, 16); 249141cc406Sopenharmony_ci sanei_umax_pp_setauto (0); 250141cc406Sopenharmony_ci } 251141cc406Sopenharmony_ci 252141cc406Sopenharmony_ci if ((strcmp (argv[i], "-z") == 0) 253141cc406Sopenharmony_ci || (strcmp (argv[i], "--offset") == 0)) 254141cc406Sopenharmony_ci { 255141cc406Sopenharmony_ci if (i == (argc - 1)) 256141cc406Sopenharmony_ci { 257141cc406Sopenharmony_ci Usage (argv[0]); 258141cc406Sopenharmony_ci fprintf (stderr, "expected hex offset value ( ex: A59 )\n"); 259141cc406Sopenharmony_ci return 0; 260141cc406Sopenharmony_ci } 261141cc406Sopenharmony_ci i++; 262141cc406Sopenharmony_ci found = 1; 263141cc406Sopenharmony_ci if (strlen (argv[i]) != 3) 264141cc406Sopenharmony_ci { 265141cc406Sopenharmony_ci Usage (argv[0]); 266141cc406Sopenharmony_ci fprintf (stderr, "expected hex offset value ( ex: A59 )\n"); 267141cc406Sopenharmony_ci return 0; 268141cc406Sopenharmony_ci } 269141cc406Sopenharmony_ci offset = strtol (argv[i], NULL, 16); 270141cc406Sopenharmony_ci } 271141cc406Sopenharmony_ci 272141cc406Sopenharmony_ci if ((strcmp (argv[i], "-n") == 0) || (strcmp (argv[i], "--name") == 0)) 273141cc406Sopenharmony_ci { 274141cc406Sopenharmony_ci if (i == (argc - 1)) 275141cc406Sopenharmony_ci { 276141cc406Sopenharmony_ci Usage (argv[0]); 277141cc406Sopenharmony_ci fprintf (stderr, 278141cc406Sopenharmony_ci "expected device name ( ex: /dev/parport0 )\n"); 279141cc406Sopenharmony_ci return 0; 280141cc406Sopenharmony_ci } 281141cc406Sopenharmony_ci i++; 282141cc406Sopenharmony_ci found = 1; 283141cc406Sopenharmony_ci name = argv[i]; 284141cc406Sopenharmony_ci } 285141cc406Sopenharmony_ci if ((strcmp (argv[i], "-a") == 0) || (strcmp (argv[i], "--addr") == 0)) 286141cc406Sopenharmony_ci { 287141cc406Sopenharmony_ci if (i == (argc - 1)) 288141cc406Sopenharmony_ci { 289141cc406Sopenharmony_ci Usage (argv[0]); 290141cc406Sopenharmony_ci fprintf (stderr, "expected hex io port value ( ex: 3BC )\n"); 291141cc406Sopenharmony_ci return 0; 292141cc406Sopenharmony_ci } 293141cc406Sopenharmony_ci i++; 294141cc406Sopenharmony_ci found = 1; 295141cc406Sopenharmony_ci if ((strlen (argv[i]) < 3) || (strlen (argv[i]) > 4)) 296141cc406Sopenharmony_ci { 297141cc406Sopenharmony_ci Usage (argv[0]); 298141cc406Sopenharmony_ci fprintf (stderr, "expected hex io port value ( ex: 378 )\n"); 299141cc406Sopenharmony_ci return 0; 300141cc406Sopenharmony_ci } 301141cc406Sopenharmony_ci port = strtol (argv[i], NULL, 16); 302141cc406Sopenharmony_ci } 303141cc406Sopenharmony_ci 304141cc406Sopenharmony_ci 305141cc406Sopenharmony_ci if ((strcmp (argv[i], "-l") == 0) || (strcmp (argv[i], "--lamp") == 0)) 306141cc406Sopenharmony_ci { 307141cc406Sopenharmony_ci if (i == (argc - 1)) 308141cc406Sopenharmony_ci { 309141cc406Sopenharmony_ci Usage (argv[0]); 310141cc406Sopenharmony_ci fprintf (stderr, "expected lamp value\n"); 311141cc406Sopenharmony_ci return 0; 312141cc406Sopenharmony_ci } 313141cc406Sopenharmony_ci lamp = atoi (argv[i + 1]); 314141cc406Sopenharmony_ci i++; 315141cc406Sopenharmony_ci found = 1; 316141cc406Sopenharmony_ci } 317141cc406Sopenharmony_ci 318141cc406Sopenharmony_ci if (!found) 319141cc406Sopenharmony_ci { 320141cc406Sopenharmony_ci Usage (argv[0]); 321141cc406Sopenharmony_ci fprintf (stderr, "unexpected argument <%s>\n", argv[i]); 322141cc406Sopenharmony_ci return 0; 323141cc406Sopenharmony_ci } 324141cc406Sopenharmony_ci 325141cc406Sopenharmony_ci /* next arg */ 326141cc406Sopenharmony_ci i++; 327141cc406Sopenharmony_ci } 328141cc406Sopenharmony_ci 329141cc406Sopenharmony_ci /* since we use DBG, we have to set env var */ 330141cc406Sopenharmony_ci /* according to the required trace level */ 331141cc406Sopenharmony_ci if (trace) 332141cc406Sopenharmony_ci { 333141cc406Sopenharmony_ci sprintf (dbgstr, "SANE_DEBUG_UMAX_PP_LOW=%d", trace); 334141cc406Sopenharmony_ci putenv (dbgstr); 335141cc406Sopenharmony_ci } 336141cc406Sopenharmony_ci 337141cc406Sopenharmony_ci /* no address or device given */ 338141cc406Sopenharmony_ci rc = 0; 339141cc406Sopenharmony_ci if ((name == NULL) && (port == 0)) 340141cc406Sopenharmony_ci { 341141cc406Sopenharmony_ci /* safe tests: user parallel port devices */ 342141cc406Sopenharmony_ci ports = sanei_parport_find_device (); 343141cc406Sopenharmony_ci if (ports != NULL) 344141cc406Sopenharmony_ci { 345141cc406Sopenharmony_ci i = 0; 346141cc406Sopenharmony_ci rc = 0; 347141cc406Sopenharmony_ci while ((ports[i] != NULL) && (rc != 1)) 348141cc406Sopenharmony_ci { 349141cc406Sopenharmony_ci rc = sanei_umax_pp_initPort (port, ports[i]); 350141cc406Sopenharmony_ci i++; 351141cc406Sopenharmony_ci } 352141cc406Sopenharmony_ci } 353141cc406Sopenharmony_ci 354141cc406Sopenharmony_ci /* try for direct hardware access */ 355141cc406Sopenharmony_ci if (rc != 1) 356141cc406Sopenharmony_ci { 357141cc406Sopenharmony_ci ports = sanei_parport_find_port (); 358141cc406Sopenharmony_ci i = 0; 359141cc406Sopenharmony_ci rc = 0; 360141cc406Sopenharmony_ci while ((ports[i] != NULL) && (rc != 1)) 361141cc406Sopenharmony_ci { 362141cc406Sopenharmony_ci rc = sanei_umax_pp_initPort (strtol (ports[i], NULL, 16), NULL); 363141cc406Sopenharmony_ci i++; 364141cc406Sopenharmony_ci } 365141cc406Sopenharmony_ci } 366141cc406Sopenharmony_ci if (rc != 1) 367141cc406Sopenharmony_ci { 368141cc406Sopenharmony_ci fprintf (stderr, "failed to detect a valid device or port!\n"); 369141cc406Sopenharmony_ci return 0; 370141cc406Sopenharmony_ci } 371141cc406Sopenharmony_ci } 372141cc406Sopenharmony_ci else 373141cc406Sopenharmony_ci { 374141cc406Sopenharmony_ci if (sanei_umax_pp_initPort (port, name) != 1) 375141cc406Sopenharmony_ci { 376141cc406Sopenharmony_ci if (port) 377141cc406Sopenharmony_ci fprintf (stderr, "failed to gain direct access to port 0x%X!\n", 378141cc406Sopenharmony_ci port); 379141cc406Sopenharmony_ci else 380141cc406Sopenharmony_ci fprintf (stderr, "failed to gain access to device %s!\n", name); 381141cc406Sopenharmony_ci return 0; 382141cc406Sopenharmony_ci } 383141cc406Sopenharmony_ci } 384141cc406Sopenharmony_ci if (trace) 385141cc406Sopenharmony_ci { 386141cc406Sopenharmony_ci printf 387141cc406Sopenharmony_ci ("UMAX 610P/1220P/2000P scanning program version 6.4 starting ...\n"); 388141cc406Sopenharmony_ci#ifdef HAVE_LINUX_PPDEV_H 389141cc406Sopenharmony_ci printf ("ppdev character device built-in.\n"); 390141cc406Sopenharmony_ci#endif 391141cc406Sopenharmony_ci#ifdef ENABLE_PARPORT_DIRECTIO 392141cc406Sopenharmony_ci printf ("direct hardware access built-in.\n"); 393141cc406Sopenharmony_ci#endif 394141cc406Sopenharmony_ci } 395141cc406Sopenharmony_ci 396141cc406Sopenharmony_ci 397141cc406Sopenharmony_ci /* scanning is the default behaviour */ 398141cc406Sopenharmony_ci if ((!scan) && (lamp < 0) && (!probe)) 399141cc406Sopenharmony_ci scan = 1; 400141cc406Sopenharmony_ci 401141cc406Sopenharmony_ci 402141cc406Sopenharmony_ci /* probe scanner */ 403141cc406Sopenharmony_ci if ((probe) || (lamp >= 0)) 404141cc406Sopenharmony_ci { 405141cc406Sopenharmony_ci printf ("Probing scanner ....\n"); 406141cc406Sopenharmony_ci if (sanei_umax_pp_probeScanner (recover) != 1) 407141cc406Sopenharmony_ci { 408141cc406Sopenharmony_ci if (recover) 409141cc406Sopenharmony_ci { 410141cc406Sopenharmony_ci sanei_umax_pp_initTransport (recover); 411141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 412141cc406Sopenharmony_ci if (sanei_umax_pp_probeScanner (recover) != 1) 413141cc406Sopenharmony_ci { 414141cc406Sopenharmony_ci printf ("Recover failed ....\n"); 415141cc406Sopenharmony_ci return 0; 416141cc406Sopenharmony_ci } 417141cc406Sopenharmony_ci printf ("Recover done !\n"); 418141cc406Sopenharmony_ci } 419141cc406Sopenharmony_ci else 420141cc406Sopenharmony_ci return 0; 421141cc406Sopenharmony_ci } 422141cc406Sopenharmony_ci 423141cc406Sopenharmony_ci /* could be written better .... but it is only test */ 424141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 425141cc406Sopenharmony_ci 426141cc406Sopenharmony_ci /* init transport layer */ 427141cc406Sopenharmony_ci if (sanei_umax_pp_initTransport (0) != 1) 428141cc406Sopenharmony_ci { 429141cc406Sopenharmony_ci printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); 430141cc406Sopenharmony_ci return 0; 431141cc406Sopenharmony_ci } 432141cc406Sopenharmony_ci i = sanei_umax_pp_checkModel (); 433141cc406Sopenharmony_ci if (i < 600) 434141cc406Sopenharmony_ci { 435141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 436141cc406Sopenharmony_ci printf ("checkModel() failed (%s:%d)\n", __FILE__, __LINE__); 437141cc406Sopenharmony_ci return 0; 438141cc406Sopenharmony_ci } 439141cc406Sopenharmony_ci printf ("UMAX Astra %dP detected \n", i); 440141cc406Sopenharmony_ci 441141cc406Sopenharmony_ci /* free scanner if a scan is planned */ 442141cc406Sopenharmony_ci if (scan) 443141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 444141cc406Sopenharmony_ci printf ("Done ....\n"); 445141cc406Sopenharmony_ci } 446141cc406Sopenharmony_ci 447141cc406Sopenharmony_ci /* lamp on/off: must come after probing (610p handling) */ 448141cc406Sopenharmony_ci if (lamp >= 0) 449141cc406Sopenharmony_ci { 450141cc406Sopenharmony_ci /* init transport layer */ 451141cc406Sopenharmony_ci if (trace) 452141cc406Sopenharmony_ci printf ("Tryning to set lamp %s\n", lamp ? "on" : "off"); 453141cc406Sopenharmony_ci if (sanei_umax_pp_initTransport (recover) != 1) 454141cc406Sopenharmony_ci { 455141cc406Sopenharmony_ci printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); 456141cc406Sopenharmony_ci return 0; 457141cc406Sopenharmony_ci } 458141cc406Sopenharmony_ci else 459141cc406Sopenharmony_ci { 460141cc406Sopenharmony_ci if (trace) 461141cc406Sopenharmony_ci printf ("initTransport passed...\n"); 462141cc406Sopenharmony_ci } 463141cc406Sopenharmony_ci if (sanei_umax_pp_setLamp (lamp) == 0) 464141cc406Sopenharmony_ci { 465141cc406Sopenharmony_ci fprintf (stderr, "Setting lamp state failed!\n"); 466141cc406Sopenharmony_ci return 0; 467141cc406Sopenharmony_ci } 468141cc406Sopenharmony_ci else 469141cc406Sopenharmony_ci { 470141cc406Sopenharmony_ci if (trace) 471141cc406Sopenharmony_ci printf ("sanei_umax_pp_setLamp passed...\n"); 472141cc406Sopenharmony_ci } 473141cc406Sopenharmony_ci } 474141cc406Sopenharmony_ci 475141cc406Sopenharmony_ci /* scan */ 476141cc406Sopenharmony_ci if (scan) 477141cc406Sopenharmony_ci { 478141cc406Sopenharmony_ci printf ("Scanning ....\n"); 479141cc406Sopenharmony_ci if (sanei_umax_pp_getastra () < 1210) 480141cc406Sopenharmony_ci { 481141cc406Sopenharmony_ci maxw = 2550; 482141cc406Sopenharmony_ci maxh = 3500; 483141cc406Sopenharmony_ci } 484141cc406Sopenharmony_ci else 485141cc406Sopenharmony_ci { 486141cc406Sopenharmony_ci maxw = 5100; 487141cc406Sopenharmony_ci maxh = 7000; 488141cc406Sopenharmony_ci } 489141cc406Sopenharmony_ci if (width < 0) 490141cc406Sopenharmony_ci width = maxw; 491141cc406Sopenharmony_ci if (height < 0) 492141cc406Sopenharmony_ci height = maxh; 493141cc406Sopenharmony_ci 494141cc406Sopenharmony_ci if ((width < 1) || (width > maxw)) 495141cc406Sopenharmony_ci { 496141cc406Sopenharmony_ci fprintf (stderr, "width must be between 1 and %d\n", maxw); 497141cc406Sopenharmony_ci return 0; 498141cc406Sopenharmony_ci } 499141cc406Sopenharmony_ci if (x + width > maxw) 500141cc406Sopenharmony_ci { 501141cc406Sopenharmony_ci fprintf (stderr, 502141cc406Sopenharmony_ci "Right side of scan area exceed physical limits (x+width>%d)\n", 503141cc406Sopenharmony_ci maxw); 504141cc406Sopenharmony_ci return 0; 505141cc406Sopenharmony_ci } 506141cc406Sopenharmony_ci if (y < 0 || y > maxh) 507141cc406Sopenharmony_ci { 508141cc406Sopenharmony_ci fprintf (stderr, "y must be between 0 and %d\n", maxh - 1); 509141cc406Sopenharmony_ci return 0; 510141cc406Sopenharmony_ci } 511141cc406Sopenharmony_ci if (x < 0 || x > maxw) 512141cc406Sopenharmony_ci { 513141cc406Sopenharmony_ci fprintf (stderr, "x must be between 0 and %d\n", maxw - 1); 514141cc406Sopenharmony_ci return 0; 515141cc406Sopenharmony_ci } 516141cc406Sopenharmony_ci if ((height < 1) || (height > maxh)) 517141cc406Sopenharmony_ci { 518141cc406Sopenharmony_ci fprintf (stderr, "height must be between 1 and %d\n", maxh); 519141cc406Sopenharmony_ci return 0; 520141cc406Sopenharmony_ci } 521141cc406Sopenharmony_ci if (y + height > maxh) 522141cc406Sopenharmony_ci { 523141cc406Sopenharmony_ci fprintf (stderr, 524141cc406Sopenharmony_ci "Bottom side of scan area exceed physical limits (y+height>%d)\n", 525141cc406Sopenharmony_ci maxh); 526141cc406Sopenharmony_ci return 0; 527141cc406Sopenharmony_ci } 528141cc406Sopenharmony_ci 529141cc406Sopenharmony_ci /* init transport layer */ 530141cc406Sopenharmony_ci /* 0: failed 531141cc406Sopenharmony_ci 1: success 532141cc406Sopenharmony_ci 2: retry 533141cc406Sopenharmony_ci */ 534141cc406Sopenharmony_ci do 535141cc406Sopenharmony_ci { 536141cc406Sopenharmony_ci i = sanei_umax_pp_initTransport (recover); 537141cc406Sopenharmony_ci } 538141cc406Sopenharmony_ci while (i == 2); 539141cc406Sopenharmony_ci if (i != 1) 540141cc406Sopenharmony_ci { 541141cc406Sopenharmony_ci printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); 542141cc406Sopenharmony_ci return 0; 543141cc406Sopenharmony_ci } 544141cc406Sopenharmony_ci /* init scanner */ 545141cc406Sopenharmony_ci if (sanei_umax_pp_initScanner (recover) == 0) 546141cc406Sopenharmony_ci { 547141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 548141cc406Sopenharmony_ci return 0; 549141cc406Sopenharmony_ci } 550141cc406Sopenharmony_ci 551141cc406Sopenharmony_ci /* set x origin left to right */ 552141cc406Sopenharmony_ci x = sanei_umax_pp_getLeft () + (maxw - x) - width; 553141cc406Sopenharmony_ci 554141cc406Sopenharmony_ci /* scan */ 555141cc406Sopenharmony_ci if (sanei_umax_pp_scan 556141cc406Sopenharmony_ci (x, y, width, height, dpi, color, gain, offset) != 1) 557141cc406Sopenharmony_ci { 558141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 559141cc406Sopenharmony_ci return 0; 560141cc406Sopenharmony_ci } 561141cc406Sopenharmony_ci 562141cc406Sopenharmony_ci /* wait for head parking */ 563141cc406Sopenharmony_ci sanei_umax_pp_parkWait (); 564141cc406Sopenharmony_ci printf ("Done ....\n"); 565141cc406Sopenharmony_ci } 566141cc406Sopenharmony_ci sanei_umax_pp_endSession (); 567141cc406Sopenharmony_ci#ifdef HAVE_LINUX_PPDEV_H 568141cc406Sopenharmony_ci fd = sanei_umax_pp_getparport (); 569141cc406Sopenharmony_ci if (fd > 0) 570141cc406Sopenharmony_ci { 571141cc406Sopenharmony_ci close (fd); 572141cc406Sopenharmony_ci sanei_umax_pp_setparport (0); 573141cc406Sopenharmony_ci } 574141cc406Sopenharmony_ci#endif 575141cc406Sopenharmony_ci 576141cc406Sopenharmony_ci return 1; 577141cc406Sopenharmony_ci} 578