diff options
Diffstat (limited to 'tools/umax_pp.c')
-rw-r--r-- | tools/umax_pp.c | 573 |
1 files changed, 573 insertions, 0 deletions
diff --git a/tools/umax_pp.c b/tools/umax_pp.c new file mode 100644 index 0000000..134320b --- /dev/null +++ b/tools/umax_pp.c @@ -0,0 +1,573 @@ +/* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version +* 2 of the License, or (at your option) any later version. +*/ + +/* For putenv */ +#define _XOPEN_SOURCE +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <stdio.h> + +#define __MAIN__ + +#include "../backend/umax_pp_low.h" +#include "../backend/umax_pp_mid.h" + +static void +Usage (char *name) +{ + fprintf (stderr, + "%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", + name); +} + + +int +main (int argc, char **argv) +{ + char dbgstr[80]; + int probe = 0; + int port = 0; + char *name = NULL; + int scan = 0; + int lamp = -1; + int i, fd; + int found; + int recover = 0; + int trace = 0; + int maxw, maxh; + +/* scanning parameters : defaults to preview (75 dpi color, full scan area) */ + int gain = 0x0; + int offset = 0x646; + int dpi = 75; + int x = 0, y = 0; + int width = -1, height = -1; + int color = RGB_MODE; + + char **ports; + int rc; + + + /* option parsing */ + /* + -c --color : color mode: RGB, BW, BW12, RGB12 + -x : x coordinate + -y : y coordinate + -w --witdh : scan width + -h --height : scan height + -f --file : session file + -p --probe : probe scanner + -s --scan : scan + -t --trace : execution trace + -l --lamp : turn lamp on/off 1/0 + -d --dpi : set scan resolution + -g --gain : set RVB gain + -z --offset: set offset + -a --addr : io port address + -n --name : ppdev device name + -r : recover from previous failed scan + -m --model : model revision + */ + + + i = 1; + trace = 0; + sanei_umax_pp_setauto (1); + while (i < argc) + { + found = 0; + + if ((strcmp (argv[i], "-p") == 0) || (strcmp (argv[i], "--probe") == 0)) + { + probe = 1; + found = 1; + } + + if ((strcmp (argv[i], "-c") == 0) || (strcmp (argv[i], "--color") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected color mode value\n"); + return 0; + } + color = 0; + i++; + found = 1; + if (strcmp (argv[i], "RGB") == 0) + color = RGB_MODE; + if (strcmp (argv[i], "RGB12") == 0) + color = RGB12_MODE; + if (strcmp (argv[i], "BW") == 0) + color = BW_MODE; + if (strcmp (argv[i], "BW12") == 0) + color = BW12_MODE; + if (color == 0) + { + fprintf (stderr, "unexpected color mode value <%s>\n", argv[i]); + fprintf (stderr, "Must be RGB, RGB12, BW, or BW12\n"); + return 0; + } + } + + + if (strcmp (argv[i], "-x") == 0) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected x value\n"); + return 0; + } + x = atoi (argv[i + 1]); + i++; + found = 1; + } + + if (strcmp (argv[i], "-y") == 0) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected y value\n"); + return 0; + } + y = atoi (argv[i + 1]); + i++; + found = 1; + } + + if ((strcmp (argv[i], "-w") == 0) || (strcmp (argv[i], "--witdh") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected width value\n"); + return 0; + } + width = atoi (argv[i + 1]); + i++; + found = 1; + } + + if ((strcmp (argv[i], "-h") == 0) + || (strcmp (argv[i], "--height") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected height value\n"); + return 0; + } + height = atoi (argv[i + 1]); + i++; + found = 1; + } + + if ((strcmp (argv[i], "-t") == 0) || (strcmp (argv[i], "--trace") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected trace value\n"); + return 0; + } + trace = atoi (argv[i + 1]); + i++; + found = 1; + } + + + if ((strcmp (argv[i], "-r") == 0) + || (strcmp (argv[i], "--recover") == 0)) + { + recover = 1; + found = 1; + } + + if ((strcmp (argv[i], "-s") == 0) || (strcmp (argv[i], "--scan") == 0)) + { + scan = 1; + /* we have to probe again if we scan */ + probe = 1; + found = 1; + } + + if ((strcmp (argv[i], "-d") == 0) || (strcmp (argv[i], "--dpi") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected dpi value\n"); + return 0; + } + dpi = atoi (argv[i + 1]); + if ((dpi < 75) || (dpi > 1200)) + { + fprintf (stderr, "dpi value has to be between 75 and 1200\n"); + return 0; + } + if ((dpi != 75) + && (dpi != 150) + && (dpi != 300) && (dpi != 600) && (dpi != 1200)) + { + fprintf (stderr, + "dpi value has to be 75, 150, 300, 600 or 1200\n"); + return 0; + } + i++; + found = 1; + } + + if ((strcmp (argv[i], "-g") == 0) + || (strcmp (argv[i], "--gain") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected hex gain value ( ex: A59 )\n"); + return 0; + } + i++; + found = 1; + if (strlen (argv[i]) != 3) + { + Usage (argv[0]); + fprintf (stderr, "expected hex gain value ( ex: A59 )\n"); + return 0; + } + gain = strtol (argv[i], NULL, 16); + sanei_umax_pp_setauto (0); + } + + if ((strcmp (argv[i], "-z") == 0) + || (strcmp (argv[i], "--offset") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected hex offset value ( ex: A59 )\n"); + return 0; + } + i++; + found = 1; + if (strlen (argv[i]) != 3) + { + Usage (argv[0]); + fprintf (stderr, "expected hex offset value ( ex: A59 )\n"); + return 0; + } + offset = strtol (argv[i], NULL, 16); + } + + if ((strcmp (argv[i], "-n") == 0) || (strcmp (argv[i], "--name") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, + "expected device name ( ex: /dev/parport0 )\n"); + return 0; + } + i++; + found = 1; + name = argv[i]; + } + if ((strcmp (argv[i], "-a") == 0) || (strcmp (argv[i], "--addr") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected hex io port value ( ex: 3BC )\n"); + return 0; + } + i++; + found = 1; + if ((strlen (argv[i]) < 3) || (strlen (argv[i]) > 4)) + { + Usage (argv[0]); + fprintf (stderr, "expected hex io port value ( ex: 378 )\n"); + return 0; + } + port = strtol (argv[i], NULL, 16); + } + + + if ((strcmp (argv[i], "-l") == 0) || (strcmp (argv[i], "--lamp") == 0)) + { + if (i == (argc - 1)) + { + Usage (argv[0]); + fprintf (stderr, "expected lamp value\n"); + return 0; + } + lamp = atoi (argv[i + 1]); + i++; + found = 1; + } + + if (!found) + { + Usage (argv[0]); + fprintf (stderr, "unexpected argument <%s>\n", argv[i]); + return 0; + } + + /* next arg */ + i++; + } + + /* since we use DBG, we have to set env var */ + /* according to the required trace level */ + if (trace) + { + sprintf (dbgstr, "SANE_DEBUG_UMAX_PP_LOW=%d", trace); + putenv (dbgstr); + } + + /* no address or device given */ + rc = 0; + if ((name == NULL) && (port == 0)) + { + /* safe tests: user parallel port devices */ + ports = sanei_parport_find_device (); + if (ports != NULL) + { + i = 0; + rc = 0; + while ((ports[i] != NULL) && (rc != 1)) + { + rc = sanei_umax_pp_initPort (port, ports[i]); + i++; + } + } + + /* try for direct hardware access */ + if (rc != 1) + { + ports = sanei_parport_find_port (); + i = 0; + rc = 0; + while ((ports[i] != NULL) && (rc != 1)) + { + rc = sanei_umax_pp_initPort (strtol (ports[i], NULL, 16), NULL); + i++; + } + } + if (rc != 1) + { + fprintf (stderr, "failed to detect a valid device or port!\n"); + return 0; + } + } + else + { + if (sanei_umax_pp_initPort (port, name) != 1) + { + if (port) + fprintf (stderr, "failed to gain direct acces to port 0x%X!\n", + port); + else + fprintf (stderr, "failed to gain acces to device %s!\n", name); + return 0; + } + } + if (trace) + { + printf + ("UMAX 610P/1220P/2000P scanning program version 6.4 starting ...\n"); +#ifdef HAVE_LINUX_PPDEV_H + printf ("ppdev character device built-in.\n"); +#endif +#ifdef ENABLE_PARPORT_DIRECTIO + printf ("direct hardware access built-in.\n"); +#endif + } + + + /* scanning is the default behaviour */ + if ((!scan) && (lamp < 0) && (!probe)) + scan = 1; + + + /* probe scanner */ + if ((probe) || (lamp >= 0)) + { + printf ("Probing scanner ....\n"); + if (sanei_umax_pp_probeScanner (recover) != 1) + { + if (recover) + { + sanei_umax_pp_initTransport (recover); + sanei_umax_pp_endSession (); + if (sanei_umax_pp_probeScanner (recover) != 1) + { + printf ("Recover failed ....\n"); + return 0; + } + printf ("Recover done !\n"); + } + else + return 0; + } + + /* could be written better .... but it is only test */ + sanei_umax_pp_endSession (); + + /* init transport layer */ + if (sanei_umax_pp_initTransport (0) != 1) + { + printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); + return 0; + } + i = sanei_umax_pp_checkModel (); + if (i < 600) + { + sanei_umax_pp_endSession (); + printf ("checkModel() failed (%s:%d)\n", __FILE__, __LINE__); + return 0; + } + printf ("UMAX Astra %dP detected \n", i); + + /* free scanner if a scan is planned */ + if (scan) + sanei_umax_pp_endSession (); + printf ("Done ....\n"); + } + + /* lamp on/off: must come after probing (610p handling) */ + if (lamp >= 0) + { + /* init transport layer */ + if (trace) + printf ("Tryning to set lamp %s\n", lamp ? "on" : "off"); + if (sanei_umax_pp_initTransport (recover) != 1) + { + printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); + return 0; + } + else + { + if (trace) + printf ("initTransport passed...\n"); + } + if (sanei_umax_pp_setLamp (lamp) == 0) + { + fprintf (stderr, "Setting lamp state failed!\n"); + return 0; + } + else + { + if (trace) + printf ("sanei_umax_pp_setLamp passed...\n"); + } + } + + /* scan */ + if (scan) + { + printf ("Scanning ....\n"); + if (sanei_umax_pp_getastra () < 1210) + { + maxw = 2550; + maxh = 3500; + } + else + { + maxw = 5100; + maxh = 7000; + } + if (width < 0) + width = maxw; + if (height < 0) + height = maxh; + + if ((width < 1) || (width > maxw)) + { + fprintf (stderr, "width must be between 1 and %d\n", maxw); + return 0; + } + if (x + width > maxw) + { + fprintf (stderr, + "Right side of scan area exceed physical limits (x+witdh>%d)\n", + maxw); + return 0; + } + if (y < 0 || y > maxh) + { + fprintf (stderr, "y must be between 0 and %d\n", maxh - 1); + return 0; + } + if (x < 0 || x > maxw) + { + fprintf (stderr, "x must be between 0 and %d\n", maxw - 1); + return 0; + } + if ((height < 1) || (height > maxh)) + { + fprintf (stderr, "height must be between 1 and %d\n", maxh); + return 0; + } + if (y + height > maxh) + { + fprintf (stderr, + "Bottom side of scan area exceed physical limits (y+height>%d)\n", + maxh); + return 0; + } + + /* init transport layer */ + /* 0: failed + 1: success + 2: retry + */ + do + { + i = sanei_umax_pp_initTransport (recover); + } + while (i == 2); + if (i != 1) + { + printf ("initTransport() failed (%s:%d)\n", __FILE__, __LINE__); + return 0; + } + /* init scanner */ + if (sanei_umax_pp_initScanner (recover) == 0) + { + sanei_umax_pp_endSession (); + return 0; + } + + /* set x origin left to right */ + x = sanei_umax_pp_getLeft () + (maxw - x) - width; + + /* scan */ + if (sanei_umax_pp_scan + (x, y, width, height, dpi, color, gain, offset) != 1) + { + sanei_umax_pp_endSession (); + return 0; + } + + /* wait for head parking */ + sanei_umax_pp_parkWait (); + printf ("Done ....\n"); + } + sanei_umax_pp_endSession (); +#ifdef HAVE_LINUX_PPDEV_H + fd = sanei_umax_pp_getparport (); + if (fd > 0) + { + close (fd); + sanei_umax_pp_setparport (0); + } +#endif + + return 1; +} |