kopia lustrzana https://gitlab.com/sane-project/backends
- change umax_pp backend to use the configuration framework
- allow for 'umax_pp' default device namemerge-requests/1/head
rodzic
47772db938
commit
8fb94ddcd9
|
@ -1,3 +1,7 @@
|
||||||
|
2008-08-04 Stéphane Voltz <stef.dev@free.fr>
|
||||||
|
* backend/umax_pp.c backend/umaxp_pp.h backend/umax_pp.conf.in:
|
||||||
|
use configuration framework
|
||||||
|
|
||||||
2008-08-02 m. allan noah <kitno455 a t gmail d o t com>
|
2008-08-02 m. allan noah <kitno455 a t gmail d o t com>
|
||||||
* backend/fujitsu.c, backend/fujitsu-scsi.h: backend v74
|
* backend/fujitsu.c, backend/fujitsu-scsi.h: backend v74
|
||||||
- replace global scsi blocks with local ones in each function
|
- replace global scsi blocks with local ones in each function
|
||||||
|
|
|
@ -106,8 +106,8 @@
|
||||||
* see Changelog
|
* see Changelog
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define UMAX_PP_BUILD 610
|
#define UMAX_PP_BUILD 700
|
||||||
#define UMAX_PP_STATE "stable"
|
#define UMAX_PP_STATE "testing"
|
||||||
|
|
||||||
static int num_devices = 0;
|
static int num_devices = 0;
|
||||||
static Umax_PP_Descriptor *devlist = NULL;
|
static Umax_PP_Descriptor *devlist = NULL;
|
||||||
|
@ -117,19 +117,19 @@ static Umax_PP_Device *first_dev = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* 2 Meg scan buffer */
|
/* 2 Meg scan buffer */
|
||||||
static long int buf_size = 2048 * 1024;
|
static SANE_Word buf_size = 2048 * 1024;
|
||||||
|
|
||||||
|
|
||||||
static int red_gain = 0;
|
|
||||||
static int green_gain = 0;
|
|
||||||
static int blue_gain = 0;
|
|
||||||
|
|
||||||
static int red_offset = 0;
|
|
||||||
static int green_offset = 0;
|
|
||||||
static int blue_offset = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
static SANE_Word red_gain = 0;
|
||||||
|
static SANE_Word green_gain = 0;
|
||||||
|
static SANE_Word blue_gain = 0;
|
||||||
|
|
||||||
|
static SANE_Word red_offset = 0;
|
||||||
|
static SANE_Word green_offset = 0;
|
||||||
|
static SANE_Word blue_offset = 0;
|
||||||
|
static SANE_Char scanner_vendor[128]="";
|
||||||
|
static SANE_Char scanner_name[128]="";
|
||||||
|
static SANE_Char scanner_model[128]="";
|
||||||
|
static SANE_Char astra[128];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -149,6 +149,24 @@ static const SANE_Range u8_range = {
|
||||||
0 /* quantization */
|
0 /* quantization */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* range for int value in [0-15] */
|
||||||
|
static const SANE_Range value16_range = {
|
||||||
|
0, /* minimum */
|
||||||
|
15, /* maximum */
|
||||||
|
1 /* quantization */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* range for buffer size */
|
||||||
|
static const SANE_Range buffer_range = {
|
||||||
|
2048, /* minimum */
|
||||||
|
4096 * 4096, /* maximum */
|
||||||
|
1 /* quantization */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* list of astra models */
|
||||||
|
static const SANE_String_Const astra_models[] =
|
||||||
|
{ "610", "1220", "1600", "2000", NULL };
|
||||||
|
|
||||||
|
|
||||||
#define UMAX_PP_CHANNEL_RED 0
|
#define UMAX_PP_CHANNEL_RED 0
|
||||||
#define UMAX_PP_CHANNEL_GREEN 1
|
#define UMAX_PP_CHANNEL_GREEN 1
|
||||||
|
@ -171,10 +189,6 @@ static const SANE_Range u8_range = {
|
||||||
|
|
||||||
#define UMAX_PP_RESERVE 259200
|
#define UMAX_PP_RESERVE 259200
|
||||||
|
|
||||||
static int
|
|
||||||
parse_int_option (const char *string, char *name, long int *value,
|
|
||||||
long int fallback);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* devname may be either an hardware address for direct I/O (0x378 for instance)
|
* devname may be either an hardware address for direct I/O (0x378 for instance)
|
||||||
* or the device name used by ppdev on linux systems (/dev/parport0 )
|
* or the device name used by ppdev on linux systems (/dev/parport0 )
|
||||||
|
@ -182,7 +196,7 @@ parse_int_option (const char *string, char *name, long int *value,
|
||||||
|
|
||||||
|
|
||||||
static SANE_Status
|
static SANE_Status
|
||||||
attach (const char *devname)
|
umax_pp_attach (SANEI_Config * config, const char *devname)
|
||||||
{
|
{
|
||||||
Umax_PP_Descriptor *dev;
|
Umax_PP_Descriptor *dev;
|
||||||
int i;
|
int i;
|
||||||
|
@ -190,12 +204,15 @@ attach (const char *devname)
|
||||||
int ret, prt = 0, mdl;
|
int ret, prt = 0, mdl;
|
||||||
char model[32];
|
char model[32];
|
||||||
char name[64];
|
char name[64];
|
||||||
|
char *val;
|
||||||
|
|
||||||
memset (name, 0, 64);
|
memset (name, 0, 64);
|
||||||
|
|
||||||
if ((strlen (devname) < 3))
|
if ((strlen (devname) < 3))
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
|
|
||||||
|
sanei_umax_pp_setastra (atoi((SANE_Char *) config->values[CFG_ASTRA]));
|
||||||
|
|
||||||
/* if the name begins with a slash, it's a device, else it's an addr */
|
/* if the name begins with a slash, it's a device, else it's an addr */
|
||||||
if (devname != NULL)
|
if (devname != NULL)
|
||||||
{
|
{
|
||||||
|
@ -238,18 +255,19 @@ attach (const char *devname)
|
||||||
status = SANE_STATUS_DEVICE_BUSY;
|
status = SANE_STATUS_DEVICE_BUSY;
|
||||||
break;
|
break;
|
||||||
case UMAX1220P_TRANSPORT_FAILED:
|
case UMAX1220P_TRANSPORT_FAILED:
|
||||||
DBG (1, "attach: failed to init transport layer on %s\n", devname);
|
DBG (1, "umax_pp_attach: failed to init transport layer on %s\n",
|
||||||
|
devname);
|
||||||
status = SANE_STATUS_IO_ERROR;
|
status = SANE_STATUS_IO_ERROR;
|
||||||
break;
|
break;
|
||||||
case UMAX1220P_PROBE_FAILED:
|
case UMAX1220P_PROBE_FAILED:
|
||||||
DBG (1, "attach: failed to probe scanner on %s\n", devname);
|
DBG (1, "umax_pp_attach: failed to probe scanner on %s\n", devname);
|
||||||
status = SANE_STATUS_IO_ERROR;
|
status = SANE_STATUS_IO_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (2, "attach: couldn't attach to `%s' (%s)\n", devname,
|
DBG (2, "umax_pp_attach: couldn't attach to `%s' (%s)\n", devname,
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
DEBUG ();
|
DEBUG ();
|
||||||
return status;
|
return status;
|
||||||
|
@ -262,14 +280,16 @@ attach (const char *devname)
|
||||||
ret = sanei_umax_pp_model (prt, &mdl);
|
ret = sanei_umax_pp_model (prt, &mdl);
|
||||||
if (ret != UMAX1220P_OK)
|
if (ret != UMAX1220P_OK)
|
||||||
{
|
{
|
||||||
DBG (1, "attach: waiting for busy scanner on %s\n", devname);
|
DBG (1, "umax_pp_attach: waiting for busy scanner on %s\n",
|
||||||
|
devname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (ret == UMAX1220P_BUSY);
|
while (ret == UMAX1220P_BUSY);
|
||||||
|
|
||||||
if (ret != UMAX1220P_OK)
|
if (ret != UMAX1220P_OK)
|
||||||
{
|
{
|
||||||
DBG (1, "attach: failed to recognize scanner model on %s\n", devname);
|
DBG (1, "umax_pp_attach: failed to recognize scanner model on %s\n",
|
||||||
|
devname);
|
||||||
return SANE_STATUS_IO_ERROR;
|
return SANE_STATUS_IO_ERROR;
|
||||||
}
|
}
|
||||||
sprintf (model, "Astra %dP", mdl);
|
sprintf (model, "Astra %dP", mdl);
|
||||||
|
@ -279,7 +299,7 @@ attach (const char *devname)
|
||||||
|
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
{
|
{
|
||||||
DBG (2, "attach: not enough memory for device descriptor\n");
|
DBG (2, "umax_pp_attach: not enough memory for device descriptor\n");
|
||||||
DEBUG ();
|
DEBUG ();
|
||||||
return SANE_STATUS_NO_MEM;
|
return SANE_STATUS_NO_MEM;
|
||||||
}
|
}
|
||||||
|
@ -295,8 +315,17 @@ attach (const char *devname)
|
||||||
devlist = dev;
|
devlist = dev;
|
||||||
num_devices++;
|
num_devices++;
|
||||||
|
|
||||||
dev->sane.name = strdup (devname);
|
/* if there are user provided values, use them */
|
||||||
dev->sane.vendor = strdup ("UMAX");
|
val=(SANE_Char *) config->values[CFG_NAME];
|
||||||
|
if(strlen(val)==0)
|
||||||
|
dev->sane.name = strdup (devname);
|
||||||
|
else
|
||||||
|
dev->sane.name = strdup (val);
|
||||||
|
val=(SANE_Char *) config->values[CFG_VENDOR];
|
||||||
|
if(strlen(val)==0)
|
||||||
|
dev->sane.vendor = strdup ("UMAX");
|
||||||
|
else
|
||||||
|
dev->sane.vendor = strdup (val);
|
||||||
dev->sane.type = "flatbed scanner";
|
dev->sane.type = "flatbed scanner";
|
||||||
|
|
||||||
if (devname[0] == '/')
|
if (devname[0] == '/')
|
||||||
|
@ -319,10 +348,14 @@ attach (const char *devname)
|
||||||
dev->max_h_size = 2550;
|
dev->max_h_size = 2550;
|
||||||
dev->max_v_size = 3500;
|
dev->max_v_size = 3500;
|
||||||
}
|
}
|
||||||
|
val=(SANE_Char *) config->values[CFG_MODEL];
|
||||||
|
if(strlen(val)==0)
|
||||||
dev->sane.model = strdup (model);
|
dev->sane.model = strdup (model);
|
||||||
|
else
|
||||||
|
dev->sane.model = strdup (val);
|
||||||
|
|
||||||
|
|
||||||
DBG (3, "attach: device %s attached\n", devname);
|
DBG (3, "umax_pp_attach: device %s attached\n", devname);
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
@ -332,7 +365,7 @@ attach (const char *devname)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static SANE_Int
|
static SANE_Int
|
||||||
umax_pp_try_ports (char **ports)
|
umax_pp_try_ports (SANEI_Config * config, char **ports)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int rc = SANE_STATUS_INVAL;
|
int rc = SANE_STATUS_INVAL;
|
||||||
|
@ -346,11 +379,14 @@ umax_pp_try_ports (char **ports)
|
||||||
if (rc != SANE_STATUS_GOOD)
|
if (rc != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
DBG (3, "umax_pp_try_ports: trying port `%s'\n", ports[i]);
|
DBG (3, "umax_pp_try_ports: trying port `%s'\n", ports[i]);
|
||||||
rc = attach (ports[i]);
|
rc = umax_pp_attach (config, ports[i]);
|
||||||
if (rc != SANE_STATUS_GOOD)
|
if (rc != SANE_STATUS_GOOD)
|
||||||
DBG (3, "init: couldn't attach to port `%s'\n", ports[i]);
|
DBG (3, "umax_pp_try_ports: couldn't attach to port `%s'\n",
|
||||||
|
ports[i]);
|
||||||
else
|
else
|
||||||
DBG (3, "init: attach to port `%s' successfull\n", ports[i]);
|
DBG (3,
|
||||||
|
"umax_pp_try_ports: attach to port `%s' successfull\n",
|
||||||
|
ports[i]);
|
||||||
}
|
}
|
||||||
free (ports[i]);
|
free (ports[i]);
|
||||||
i++;
|
i++;
|
||||||
|
@ -363,10 +399,10 @@ umax_pp_try_ports (char **ports)
|
||||||
/*
|
/*
|
||||||
* attempt to auto detect right parallel port
|
* attempt to auto detect right parallel port
|
||||||
* if safe set to SANE_TRUE, no direct hardware access
|
* if safe set to SANE_TRUE, no direct hardware access
|
||||||
*
|
* is tried
|
||||||
*/
|
*/
|
||||||
static SANE_Int
|
static SANE_Int
|
||||||
umax_pp_auto_attach (SANE_Int safe)
|
umax_pp_auto_attach (SANEI_Config * config, SANE_Int safe)
|
||||||
{
|
{
|
||||||
char **ports;
|
char **ports;
|
||||||
int rc = SANE_STATUS_INVAL;
|
int rc = SANE_STATUS_INVAL;
|
||||||
|
@ -374,18 +410,58 @@ umax_pp_auto_attach (SANE_Int safe)
|
||||||
/* safe tests: user parallel port devices */
|
/* safe tests: user parallel port devices */
|
||||||
ports = sanei_parport_find_device ();
|
ports = sanei_parport_find_device ();
|
||||||
if (ports != NULL)
|
if (ports != NULL)
|
||||||
rc = umax_pp_try_ports (ports);
|
rc = umax_pp_try_ports (config, ports);
|
||||||
|
|
||||||
/* try for direct hardware access */
|
/* try for direct hardware access */
|
||||||
if ((safe != SANE_TRUE) && (rc != SANE_STATUS_GOOD))
|
if ((safe != SANE_TRUE) && (rc != SANE_STATUS_GOOD))
|
||||||
{
|
{
|
||||||
ports = sanei_parport_find_port ();
|
ports = sanei_parport_find_port ();
|
||||||
if (ports != NULL)
|
if (ports != NULL)
|
||||||
rc = umax_pp_try_ports (ports);
|
rc = umax_pp_try_ports (config, ports);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** callback use by sanei_configure_attach, it is called with the
|
||||||
|
* device name to use for attach try.
|
||||||
|
*/
|
||||||
|
static SANE_Status
|
||||||
|
umax_pp_configure_attach (SANEI_Config * config, const char *devname)
|
||||||
|
{
|
||||||
|
const char *lp;
|
||||||
|
SANE_Char *token;
|
||||||
|
SANE_Status status = SANE_STATUS_INVAL;
|
||||||
|
|
||||||
|
/* check for mandatory 'port' token */
|
||||||
|
lp = sanei_config_get_string (devname, &token);
|
||||||
|
if (strncmp (token, "port", 4) != 0)
|
||||||
|
{
|
||||||
|
DBG (3, "umax_pp_configure_attach: invalid port line `%s'\n", devname);
|
||||||
|
free (token);
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
|
free (token);
|
||||||
|
|
||||||
|
/* get argument */
|
||||||
|
lp = sanei_config_get_string (lp, &token);
|
||||||
|
|
||||||
|
/* if "safe-auto" or "auto" devname, use umax_pp_attach_auto */
|
||||||
|
if (strncmp (token, "safe-auto", 9) == 0)
|
||||||
|
{
|
||||||
|
status = umax_pp_auto_attach (config, SANE_TRUE);
|
||||||
|
}
|
||||||
|
else if (strncmp (token, "auto", 4) == 0)
|
||||||
|
{
|
||||||
|
status = umax_pp_auto_attach (config, SANE_FALSE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = umax_pp_attach (config, token);
|
||||||
|
}
|
||||||
|
free (token);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static SANE_Int
|
static SANE_Int
|
||||||
umax_pp_get_sync (SANE_Int dpi)
|
umax_pp_get_sync (SANE_Int dpi)
|
||||||
{
|
{
|
||||||
|
@ -747,50 +823,21 @@ init_options (Umax_PP_Device * dev)
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
parse_int_option (const char *string, char *name, long int *value,
|
|
||||||
long int fallback)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char *end;
|
|
||||||
|
|
||||||
len = strlen (name);
|
|
||||||
if ((strncmp (string, name, len) == 0) && isspace (string[len]))
|
|
||||||
{
|
|
||||||
|
|
||||||
string += len + 1;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
*value = strtol (string, &end, 0);
|
|
||||||
|
|
||||||
if (end == string || errno)
|
|
||||||
{
|
|
||||||
DBG (2, "init: invalid value `%s`, using fallback '%ld'\n", string,
|
|
||||||
fallback);
|
|
||||||
*value = fallback;
|
|
||||||
}
|
|
||||||
DBG (3, "init: option %s %ld\n", name, *value);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SANE_Status
|
SANE_Status
|
||||||
sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
||||||
{
|
{
|
||||||
char dev_name[512];
|
SANE_Status status;
|
||||||
const char *cp;
|
SANEI_Config config;
|
||||||
size_t len;
|
SANE_Option_Descriptor *options[NUM_CFG_OPTIONS];
|
||||||
FILE *fp;
|
void *values[NUM_CFG_OPTIONS];
|
||||||
SANE_Status ret;
|
int i = 0;
|
||||||
int portdone = 0;
|
|
||||||
long int val = 0;
|
|
||||||
|
|
||||||
DBG_INIT ();
|
DBG_INIT ();
|
||||||
|
|
||||||
if (authorize != NULL)
|
if (authorize != NULL)
|
||||||
{
|
{
|
||||||
DBG (2, "init: SANE_Auth_Callback not supported (yet) ...\n");
|
DBG (2, "init: SANE_Auth_Callback not supported ...\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version_code != NULL)
|
if (version_code != NULL)
|
||||||
|
@ -799,234 +846,137 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
|
||||||
DBG (3, "init: SANE v%s, backend v%d.%d.%d-%s\n", VERSION, V_MAJOR, V_MINOR,
|
DBG (3, "init: SANE v%s, backend v%d.%d.%d-%s\n", VERSION, V_MAJOR, V_MINOR,
|
||||||
UMAX_PP_BUILD, UMAX_PP_STATE);
|
UMAX_PP_BUILD, UMAX_PP_STATE);
|
||||||
|
|
||||||
fp = sanei_config_open (UMAX_PP_CONFIG_FILE);
|
/* set up configuration options to parse */
|
||||||
|
options[CFG_BUFFER] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_BUFFER]->name = "buffer";
|
||||||
|
options[CFG_BUFFER]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_BUFFER]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_BUFFER]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_BUFFER]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_BUFFER]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_BUFFER]->constraint.range = &buffer_range;
|
||||||
|
values[CFG_BUFFER] = &buf_size;
|
||||||
|
|
||||||
|
options[CFG_RED_GAIN] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_RED_GAIN]->name = "red-gain";
|
||||||
|
options[CFG_RED_GAIN]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_RED_GAIN]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_RED_GAIN]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_RED_GAIN]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_RED_GAIN]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_RED_GAIN]->constraint.range = &value16_range;
|
||||||
|
values[CFG_RED_GAIN] = &red_gain;
|
||||||
|
|
||||||
if (fp == NULL)
|
options[CFG_GREEN_GAIN] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_GREEN_GAIN]->name = "green-gain";
|
||||||
|
options[CFG_GREEN_GAIN]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_GREEN_GAIN]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_GREEN_GAIN]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_GREEN_GAIN]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_GREEN_GAIN]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_GREEN_GAIN]->constraint.range = &value16_range;
|
||||||
|
values[CFG_GREEN_GAIN] = &green_gain;
|
||||||
|
|
||||||
|
options[CFG_BLUE_GAIN] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_BLUE_GAIN]->name = "blue-gain";
|
||||||
|
options[CFG_BLUE_GAIN]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_BLUE_GAIN]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_BLUE_GAIN]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_BLUE_GAIN]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_BLUE_GAIN]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_BLUE_GAIN]->constraint.range = &value16_range;
|
||||||
|
values[CFG_BLUE_GAIN] = &blue_gain;
|
||||||
|
|
||||||
|
options[CFG_RED_OFFSET] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_RED_OFFSET]->name = "red-offset";
|
||||||
|
options[CFG_RED_OFFSET]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_RED_OFFSET]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_RED_OFFSET]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_RED_OFFSET]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_RED_OFFSET]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_RED_OFFSET]->constraint.range = &value16_range;
|
||||||
|
values[CFG_RED_OFFSET] = &red_offset;
|
||||||
|
|
||||||
|
options[CFG_GREEN_OFFSET] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_GREEN_OFFSET]->name = "green-offset";
|
||||||
|
options[CFG_GREEN_OFFSET]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_GREEN_OFFSET]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_GREEN_OFFSET]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_GREEN_OFFSET]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_GREEN_OFFSET]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_GREEN_OFFSET]->constraint.range = &value16_range;
|
||||||
|
values[CFG_GREEN_OFFSET] = &green_offset;
|
||||||
|
|
||||||
|
options[CFG_BLUE_OFFSET] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_BLUE_OFFSET]->name = "blue-offset";
|
||||||
|
options[CFG_BLUE_OFFSET]->type = SANE_TYPE_INT;
|
||||||
|
options[CFG_BLUE_OFFSET]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_BLUE_OFFSET]->size = sizeof (SANE_Word);
|
||||||
|
options[CFG_BLUE_OFFSET]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_BLUE_OFFSET]->constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
options[CFG_BLUE_OFFSET]->constraint.range = &value16_range;
|
||||||
|
values[CFG_BLUE_OFFSET] = &blue_offset;
|
||||||
|
|
||||||
|
options[CFG_VENDOR] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_VENDOR]->name = "vendor";
|
||||||
|
options[CFG_VENDOR]->type = SANE_TYPE_STRING;
|
||||||
|
options[CFG_VENDOR]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_VENDOR]->size = 128;
|
||||||
|
options[CFG_VENDOR]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
values[CFG_VENDOR] = scanner_vendor;
|
||||||
|
|
||||||
|
options[CFG_NAME] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_NAME]->name = "name";
|
||||||
|
options[CFG_NAME]->type = SANE_TYPE_STRING;
|
||||||
|
options[CFG_NAME]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_NAME]->size = 128;
|
||||||
|
options[CFG_NAME]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
values[CFG_NAME] = scanner_name;
|
||||||
|
|
||||||
|
options[CFG_MODEL] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_MODEL]->name = "model";
|
||||||
|
options[CFG_MODEL]->type = SANE_TYPE_STRING;
|
||||||
|
options[CFG_MODEL]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_MODEL]->size = 128;
|
||||||
|
options[CFG_MODEL]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
values[CFG_MODEL] = scanner_model;
|
||||||
|
|
||||||
|
options[CFG_ASTRA] =
|
||||||
|
(SANE_Option_Descriptor *) malloc (sizeof (SANE_Option_Descriptor));
|
||||||
|
options[CFG_ASTRA]->name = "astra";
|
||||||
|
options[CFG_ASTRA]->type = SANE_TYPE_STRING;
|
||||||
|
options[CFG_ASTRA]->unit = SANE_UNIT_NONE;
|
||||||
|
options[CFG_ASTRA]->size = 128;
|
||||||
|
options[CFG_ASTRA]->cap = SANE_CAP_SOFT_SELECT;
|
||||||
|
options[CFG_ASTRA]->constraint_type = SANE_CONSTRAINT_STRING_LIST;
|
||||||
|
options[CFG_ASTRA]->constraint.string_list = astra_models;
|
||||||
|
values[CFG_ASTRA] = astra;
|
||||||
|
|
||||||
|
config.descriptors = options;
|
||||||
|
config.values = values;
|
||||||
|
config.count = NUM_CFG_OPTIONS;
|
||||||
|
|
||||||
|
/* generic configure and attach function */
|
||||||
|
status = sanei_configure_attach (UMAX_PP_CONFIG_FILE, &config,
|
||||||
|
umax_pp_configure_attach);
|
||||||
|
|
||||||
|
/* free option descriptors */
|
||||||
|
for (i = 0; i < NUM_CFG_OPTIONS; i++)
|
||||||
{
|
{
|
||||||
DBG (2, "init: no configuration file, using default `port %s'\n",
|
free (options[i]);
|
||||||
UMAX_PP_DEFAULT_PORT);
|
|
||||||
|
|
||||||
ret = attach (UMAX_PP_DEFAULT_PORT);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (sanei_config_read (dev_name, sizeof (dev_name), fp))
|
return status;
|
||||||
{
|
|
||||||
cp = sanei_config_skip_whitespace (dev_name);
|
|
||||||
if (!*cp || *cp == '#') /* ignore line comments & empty lines */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
len = strlen (cp);
|
|
||||||
|
|
||||||
if (!len)
|
|
||||||
continue; /* ignore empty lines */
|
|
||||||
|
|
||||||
|
|
||||||
if (strncmp (cp, "option", 6) == 0 && isspace (cp[6]))
|
|
||||||
{
|
|
||||||
|
|
||||||
DBG (3, "init: evaluating option <%s>\n", cp);
|
|
||||||
cp += 7;
|
|
||||||
cp = sanei_config_skip_whitespace (cp);
|
|
||||||
|
|
||||||
if (parse_int_option (cp, "buffer", &val, buf_size))
|
|
||||||
{
|
|
||||||
if (val < 8192)
|
|
||||||
{
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, buf_size);
|
|
||||||
val = buf_size; /* safe fallback */
|
|
||||||
}
|
|
||||||
DBG (3, "init: option buffer %ld\n", val);
|
|
||||||
|
|
||||||
if (num_devices == 0)
|
|
||||||
{
|
|
||||||
DBG (3, "init: setting global option buffer to %ld\n", val);
|
|
||||||
buf_size = val;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG (3, "init: setting buffer to %ld for device %s\n",
|
|
||||||
val, devlist[0].sane.name);
|
|
||||||
devlist[0].buf_size = val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "astra", &val, 0))
|
|
||||||
{
|
|
||||||
if ((val != 610) && (val != 1200) && (val != 1600)
|
|
||||||
&& (val != 2000))
|
|
||||||
{
|
|
||||||
val = 0;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option astra to %ld\n", val);
|
|
||||||
sanei_umax_pp_setastra (val);
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "red-gain", &val, 12))
|
|
||||||
{
|
|
||||||
if ((val < 0) || (val > 15))
|
|
||||||
{
|
|
||||||
val = 12;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option red-gain to %ld\n", val);
|
|
||||||
red_gain = val;
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "green-gain", &val, 6))
|
|
||||||
{
|
|
||||||
if ((val < 0) || (val > 15))
|
|
||||||
{
|
|
||||||
val = 6;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option green-gain to %ld\n", val);
|
|
||||||
green_gain = val;
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "blue-gain", &val, 12))
|
|
||||||
{
|
|
||||||
if ((val < 0) || (val > 15))
|
|
||||||
{
|
|
||||||
val = 12;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option blue-gain to %ld\n", val);
|
|
||||||
blue_gain = val;
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "red-offset", &val, 10))
|
|
||||||
{
|
|
||||||
if ((val < 0) || (val > 15))
|
|
||||||
{
|
|
||||||
val = 10;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option red-offset to %ld\n", val);
|
|
||||||
red_offset = val;
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "green-offset", &val, 10))
|
|
||||||
{
|
|
||||||
if ((val < 0) || (val > 15))
|
|
||||||
{
|
|
||||||
val = 10;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option green-offset to %ld\n",
|
|
||||||
val);
|
|
||||||
green_offset = val;
|
|
||||||
}
|
|
||||||
else if (parse_int_option (cp, "blue-offset", &val, 10))
|
|
||||||
{
|
|
||||||
if ((val < 0) || (val > 15))
|
|
||||||
{
|
|
||||||
val = 10;
|
|
||||||
DBG (2, "init: invalid value `%s`, falling back to %ld\n",
|
|
||||||
cp, val);
|
|
||||||
}
|
|
||||||
DBG (3, "init: setting global option red-offset to %ld\n", val);
|
|
||||||
blue_offset = val;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DBG (2, "init: don't know what to do with option `%s'\n", cp);
|
|
||||||
}
|
|
||||||
else if ((strncmp (cp, "port", 4) == 0) && isspace (cp[4]))
|
|
||||||
{
|
|
||||||
/* protect ourself from buggy configuration tool such as
|
|
||||||
* mandrake's 9.2 control panel */
|
|
||||||
if (portdone)
|
|
||||||
{
|
|
||||||
DBG (2,
|
|
||||||
"'port' option given more than once, check your umax_pp.conf file!!\n");
|
|
||||||
return SANE_STATUS_INVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
cp += 5;
|
|
||||||
cp = sanei_config_skip_whitespace (cp);
|
|
||||||
portdone = 1;
|
|
||||||
|
|
||||||
if (*cp)
|
|
||||||
{
|
|
||||||
/* here, the argument maybe a device, an address, or special
|
|
||||||
* keywords 'auto' and 'safe-auto'
|
|
||||||
*/
|
|
||||||
if (strcmp (cp, "safe-auto") == 0)
|
|
||||||
{
|
|
||||||
/* try every device we can find */
|
|
||||||
if (umax_pp_auto_attach (SANE_TRUE) != SANE_STATUS_GOOD)
|
|
||||||
DBG (2, "init: safe-auto attach failed !");
|
|
||||||
}
|
|
||||||
else if (strcmp (cp, "auto") == 0)
|
|
||||||
{
|
|
||||||
/* try every port/device we can find */
|
|
||||||
if (umax_pp_auto_attach (SANE_FALSE) != SANE_STATUS_GOOD)
|
|
||||||
{
|
|
||||||
DBG (2, "init: auto attach failed !");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG (3, "init: trying port `%s'\n", cp);
|
|
||||||
|
|
||||||
DBG (3, "attach(%s)\n", cp);
|
|
||||||
if (attach (cp) != SANE_STATUS_GOOD)
|
|
||||||
DBG (2, "init: couldn't attach to port `%s'\n", cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((strncmp (cp, "name", 4) == 0) && isspace (cp[4]))
|
|
||||||
{
|
|
||||||
cp += 5;
|
|
||||||
cp = sanei_config_skip_whitespace (cp);
|
|
||||||
|
|
||||||
if (num_devices == 0)
|
|
||||||
DBG (2, "init: 'name' only allowed after 'port'\n");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG (3, "init: naming device %s '%s'\n", devlist[0].port, cp);
|
|
||||||
free (devlist[0].sane.name);
|
|
||||||
devlist[0].sane.name = strdup (cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((strncmp (cp, "model", 5) == 0) && isspace (cp[5]))
|
|
||||||
{
|
|
||||||
cp += 6;
|
|
||||||
cp = sanei_config_skip_whitespace (cp);
|
|
||||||
|
|
||||||
if (num_devices == 0)
|
|
||||||
DBG (2, "init: 'model' only allowed after 'port'\n");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG (3, "init: device %s is a '%s'\n", devlist[0].port, cp);
|
|
||||||
free (devlist[0].sane.model);
|
|
||||||
devlist[0].sane.model = strdup (cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((strncmp (cp, "vendor", 6) == 0) && isspace (cp[6]))
|
|
||||||
{
|
|
||||||
cp += 7;
|
|
||||||
cp = sanei_config_skip_whitespace (cp);
|
|
||||||
|
|
||||||
if (num_devices == 0)
|
|
||||||
DBG (2, "init: 'vendor' only allowed after 'port'\n");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DBG (3, "init: device %s is from '%s'\n", devlist[0].port, cp);
|
|
||||||
free (devlist[0].sane.vendor);
|
|
||||||
devlist[0].sane.vendor = strdup (cp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DBG (2, "init: don't know what to do with `%s'\n", cp);
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose (fp);
|
|
||||||
|
|
||||||
return SANE_STATUS_GOOD;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1122,7 +1072,35 @@ sane_open (SANE_String_Const devicename, SANE_Handle * handle)
|
||||||
|
|
||||||
DBG (3, "open: device `%s'\n", devicename);
|
DBG (3, "open: device `%s'\n", devicename);
|
||||||
|
|
||||||
if (devicename[0])
|
/* if no device given or 'umax_pp' default value given */
|
||||||
|
if (devicename == NULL || devicename[0] == 0
|
||||||
|
|| strncmp (devicename, "umax_pp", 7) == 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (num_devices == 0)
|
||||||
|
{
|
||||||
|
DBG (1, "open: no devices present\n");
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG (3, "open: trying default device %s, port=%s,ppdev=%s\n",
|
||||||
|
devlist[0].sane.name, devlist[0].port, devlist[0].ppdevice);
|
||||||
|
if (devlist[0].port != NULL)
|
||||||
|
{
|
||||||
|
if ((devlist[0].port[0] == '0')
|
||||||
|
&& ((devlist[0].port[1] == 'x') || (devlist[0].port[1] == 'X')))
|
||||||
|
prt = strtol (devlist[0].port + 2, NULL, 16);
|
||||||
|
else
|
||||||
|
prt = atoi (devlist[0].port);
|
||||||
|
rc = sanei_umax_pp_open (prt, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rc = sanei_umax_pp_open (0, devlist[0].ppdevice);
|
||||||
|
}
|
||||||
|
desc = &devlist[0];
|
||||||
|
}
|
||||||
|
else /* specific value */
|
||||||
{
|
{
|
||||||
for (i = 0; i < num_devices; i++)
|
for (i = 0; i < num_devices; i++)
|
||||||
if (strcmp (devlist[i].sane.name, devicename) == 0)
|
if (strcmp (devlist[i].sane.name, devicename) == 0)
|
||||||
|
@ -1161,32 +1139,8 @@ sane_open (SANE_String_Const devicename, SANE_Handle * handle)
|
||||||
}
|
}
|
||||||
rc = sanei_umax_pp_open (prt, name);
|
rc = sanei_umax_pp_open (prt, name);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
if (num_devices == 0)
|
/* treat return code from open */
|
||||||
{
|
|
||||||
DBG (1, "open: no devices present\n");
|
|
||||||
return SANE_STATUS_INVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG (3, "open: trying default device %s, port=%s,ppdev=%s\n",
|
|
||||||
devlist[0].sane.name, devlist[0].port, devlist[0].ppdevice);
|
|
||||||
if (devlist[0].port != NULL)
|
|
||||||
{
|
|
||||||
if ((devlist[0].port[0] == '0')
|
|
||||||
&& ((devlist[0].port[1] == 'x') || (devlist[0].port[1] == 'X')))
|
|
||||||
prt = strtol (devlist[0].port + 2, NULL, 16);
|
|
||||||
else
|
|
||||||
prt = atoi (devlist[0].port);
|
|
||||||
rc = sanei_umax_pp_open (prt, NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rc = sanei_umax_pp_open (0, devlist[0].ppdevice);
|
|
||||||
}
|
|
||||||
desc = &devlist[0];
|
|
||||||
}
|
|
||||||
switch (rc)
|
switch (rc)
|
||||||
{
|
{
|
||||||
case UMAX1220P_TRANSPORT_FAILED:
|
case UMAX1220P_TRANSPORT_FAILED:
|
||||||
|
@ -1388,7 +1342,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
SANE_Status status;
|
SANE_Status status;
|
||||||
SANE_Word w, cap, tmpw;
|
SANE_Word w, cap, tmpw;
|
||||||
int dpi, rc;
|
int dpi, rc;
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
DBG (6, "control_option: option %d, action %d\n", option, action);
|
DBG (6, "control_option: option %d, action %d\n", option, action);
|
||||||
|
|
||||||
|
@ -1398,14 +1351,12 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
if (dev->state == UMAX_PP_STATE_SCANNING)
|
if (dev->state == UMAX_PP_STATE_SCANNING)
|
||||||
{
|
{
|
||||||
DBG (2, "control_option: device is scanning\n");
|
DBG (2, "control_option: device is scanning\n");
|
||||||
DEBUG ();
|
|
||||||
return SANE_STATUS_DEVICE_BUSY;
|
return SANE_STATUS_DEVICE_BUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((unsigned int) option >= NUM_OPTIONS)
|
if ((unsigned int) option >= NUM_OPTIONS)
|
||||||
{
|
{
|
||||||
DBG (2, "control_option: option doesn't exist\n");
|
DBG (2, "control_option: option doesn't exist\n");
|
||||||
DEBUG ();
|
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1415,7 +1366,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
if (!SANE_OPTION_IS_ACTIVE (cap))
|
if (!SANE_OPTION_IS_ACTIVE (cap))
|
||||||
{
|
{
|
||||||
DBG (2, "control_option: option isn't active\n");
|
DBG (2, "control_option: option isn't active\n");
|
||||||
DEBUG ();
|
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1475,7 +1425,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
if (!SANE_OPTION_IS_SETTABLE (cap))
|
if (!SANE_OPTION_IS_SETTABLE (cap))
|
||||||
{
|
{
|
||||||
DBG (2, "control_option: option can't be set\n");
|
DBG (2, "control_option: option can't be set\n");
|
||||||
DEBUG ();
|
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1485,7 +1434,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
{
|
{
|
||||||
DBG (2, "control_option: constrain_value failed (%s)\n",
|
DBG (2, "control_option: constrain_value failed (%s)\n",
|
||||||
sane_strstatus (status));
|
sane_strstatus (status));
|
||||||
DEBUG ();
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1886,7 +1834,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
|
|
||||||
|
|
||||||
DBG (2, "control_option: unknown action %d \n", action);
|
DBG (2, "control_option: unknown action %d \n", action);
|
||||||
DEBUG ();
|
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,25 +6,6 @@
|
||||||
option buffer 2097152
|
option buffer 2097152
|
||||||
|
|
||||||
|
|
||||||
# DEVICES #
|
|
||||||
|
|
||||||
# specify the port your scanner is connected to.
|
|
||||||
#
|
|
||||||
# the value 'auto' will make the backend find the correct value
|
|
||||||
# by itself, it will scan ppdev, ppi device, then hardware address
|
|
||||||
# 'safe-auto' will do the same but won't do direct hardware access
|
|
||||||
# on linux systems, you may provide the device name of the ppdev character
|
|
||||||
# device : /dev/parport0, /dev/parport1, ......
|
|
||||||
#
|
|
||||||
# on *BSD, you may provide the device name of the ppi device: /dev/ppi0,
|
|
||||||
# /dev/ppi1, ...
|
|
||||||
#
|
|
||||||
# Possible hardware addresses are 0x378 (lp0)
|
|
||||||
# 0x278 (lp2) and 0x3c8 (lp1)
|
|
||||||
#
|
|
||||||
|
|
||||||
port safe-auto
|
|
||||||
|
|
||||||
# the following options are local to this scanner
|
# the following options are local to this scanner
|
||||||
# gain for red channel, if not given, will be automatically computed
|
# gain for red channel, if not given, will be automatically computed
|
||||||
# must be between 0 and 15
|
# must be between 0 and 15
|
||||||
|
@ -62,3 +43,22 @@ port safe-auto
|
||||||
# you may override detection by providing the
|
# you may override detection by providing the
|
||||||
# model number
|
# model number
|
||||||
#option astra 1220
|
#option astra 1220
|
||||||
|
|
||||||
|
# DEVICES #
|
||||||
|
|
||||||
|
# specify the port your scanner is connected to.
|
||||||
|
#
|
||||||
|
# the value 'auto' will make the backend find the correct value
|
||||||
|
# by itself, it will scan ppdev, ppi device, then hardware address
|
||||||
|
# 'safe-auto' will do the same but won't do direct hardware access
|
||||||
|
# on linux systems, you may provide the device name of the ppdev character
|
||||||
|
# device : /dev/parport0, /dev/parport1, ......
|
||||||
|
#
|
||||||
|
# on *BSD, you may provide the device name of the ppi device: /dev/ppi0,
|
||||||
|
# /dev/ppi1, ...
|
||||||
|
#
|
||||||
|
# Possible hardware addresses are 0x378 (lp0)
|
||||||
|
# 0x278 (lp2) and 0x3c8 (lp1)
|
||||||
|
#
|
||||||
|
|
||||||
|
port safe-auto
|
||||||
|
|
|
@ -174,6 +174,25 @@ typedef struct Umax_PP_Device
|
||||||
Umax_PP_Device;
|
Umax_PP_Device;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* enumeration of configuration options
|
||||||
|
*/
|
||||||
|
enum Umax_PP_Configure_Option
|
||||||
|
{
|
||||||
|
CFG_BUFFER = 0,
|
||||||
|
CFG_RED_GAIN,
|
||||||
|
CFG_GREEN_GAIN,
|
||||||
|
CFG_BLUE_GAIN,
|
||||||
|
CFG_RED_OFFSET,
|
||||||
|
CFG_GREEN_OFFSET,
|
||||||
|
CFG_BLUE_OFFSET,
|
||||||
|
CFG_VENDOR,
|
||||||
|
CFG_NAME,
|
||||||
|
CFG_MODEL,
|
||||||
|
CFG_ASTRA,
|
||||||
|
NUM_CFG_OPTIONS
|
||||||
|
};
|
||||||
|
|
||||||
#if (!defined __GNUC__ || __GNUC__ < 2 || \
|
#if (!defined __GNUC__ || __GNUC__ < 2 || \
|
||||||
__GNUC_MINOR__ < (defined __cplusplus ? 6 : 4))
|
__GNUC_MINOR__ < (defined __cplusplus ? 6 : 4))
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue