add clear calibration butto and need calibration sensor

- add a 'clear calibration' to clear sheetfed calibration
- add a 'needs calibration' sensor to signal that a sheetfed scanner
  needs to be calibrated
merge-requests/1/head
Stphane Voltz 2009-11-29 07:38:54 +01:00
rodzic 13641ac5b3
commit 03ac144ac8
3 zmienionych plików z 192 dodań i 90 usunięć

Wyświetl plik

@ -1765,6 +1765,15 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_CALIBRATE:
status = gt68xx_sheetfed_scanner_calibrate (s);
myinfo |= SANE_INFO_RELOAD_OPTIONS;
break;
case OPT_CLEAR_CALIBRATION:
gt68xx_clear_calibration (s);
break;
case OPT_NEED_CALIBRATION_SW:
*(SANE_Bool *) val = s->calibrated;
break;
default:

Wyświetl plik

@ -2498,7 +2498,43 @@ static char *gt68xx_calibration_file(GT68xx_Scanner * scanner)
return strdup(tmp_str);
}
static SANE_Status gt68xx_write_calibration (GT68xx_Scanner * scanner)
static SANE_Status
gt68xx_clear_calibration (GT68xx_Scanner * scanner)
{
char *fname;
int i;
if (scanner->calibrated == SANE_FALSE)
return SANE_STATUS_GOOD;
/* clear file */
fname = gt68xx_calibration_file (scanner);
unlink (fname);
free (fname);
/* free calibrators */
for (i = 0; i < MAX_RESOLUTIONS && scanner->calibrations[i].dpi > 0; i++)
{
scanner->calibrations[i].dpi = 0;
if (scanner->calibrations[i].red)
gt68xx_calibrator_free (scanner->calibrations[i].red);
if (scanner->calibrations[i].green)
gt68xx_calibrator_free (scanner->calibrations[i].green);
if (scanner->calibrations[i].blue)
gt68xx_calibrator_free (scanner->calibrations[i].blue);
if (scanner->calibrations[i].gray)
gt68xx_calibrator_free (scanner->calibrations[i].gray);
}
/* reset flags */
scanner->calibrated = SANE_FALSE;
scanner->val[OPT_QUALITY_CAL].w = SANE_FALSE;
DBG (5, "gt68xx_clear_calibration: done\n");
return SANE_STATUS_GOOD;
}
static SANE_Status
gt68xx_write_calibration (GT68xx_Scanner * scanner)
{
char *fname;
FILE *fcal;
@ -2516,49 +2552,80 @@ static SANE_Status gt68xx_write_calibration (GT68xx_Scanner * scanner)
free (fname);
if (fcal == NULL)
{
DBG(1,"gt68xx_write_calibration: failed to open calibration file for writing %s\n",strerror(errno));
DBG (1,
"gt68xx_write_calibration: failed to open calibration file for writing %s\n",
strerror (errno));
return SANE_STATUS_IO_ERROR;
}
/* TODO we save check endianness and word alignment in case of a home
* directory used trough different archs */
fwrite (&(scanner->afe_params), sizeof (GT68xx_AFE_Parameters), 1, fcal);
fwrite(&(scanner->exposure_params), sizeof(GT68xx_Exposure_Parameters), 1, fcal);
fwrite (&(scanner->exposure_params), sizeof (GT68xx_Exposure_Parameters), 1,
fcal);
for (i = 0; i < MAX_RESOLUTIONS && scanner->calibrations[i].dpi > 0; i++)
{
DBG(1,"gt68xx_write_calibration: saving %d dpi calibration\n",scanner->calibrations[i].dpi);
DBG (1, "gt68xx_write_calibration: saving %d dpi calibration\n",
scanner->calibrations[i].dpi);
fwrite (&(scanner->calibrations[i].dpi), sizeof (SANE_Int), 1, fcal);
fwrite(&(scanner->calibrations[i].pixel_x0),sizeof(SANE_Int),1,fcal);
fwrite (&(scanner->calibrations[i].pixel_x0), sizeof (SANE_Int), 1,
fcal);
fwrite(&(scanner->calibrations[i].red->width),sizeof(SANE_Int),1,fcal);
fwrite(&(scanner->calibrations[i].red->white_level),sizeof(SANE_Int),1,fcal);
fwrite(scanner->calibrations[i].red->k_white,sizeof(unsigned int),scanner->calibrations[i].red->width,fcal);
fwrite(scanner->calibrations[i].red->k_black,sizeof(unsigned int),scanner->calibrations[i].red->width,fcal);
fwrite(scanner->calibrations[i].red->white_line,sizeof(double),scanner->calibrations[i].red->width,fcal);
fwrite(scanner->calibrations[i].red->black_line,sizeof(double),scanner->calibrations[i].red->width,fcal);
fwrite (&(scanner->calibrations[i].red->width), sizeof (SANE_Int), 1,
fcal);
fwrite (&(scanner->calibrations[i].red->white_level), sizeof (SANE_Int),
1, fcal);
fwrite (scanner->calibrations[i].red->k_white, sizeof (unsigned int),
scanner->calibrations[i].red->width, fcal);
fwrite (scanner->calibrations[i].red->k_black, sizeof (unsigned int),
scanner->calibrations[i].red->width, fcal);
fwrite (scanner->calibrations[i].red->white_line, sizeof (double),
scanner->calibrations[i].red->width, fcal);
fwrite (scanner->calibrations[i].red->black_line, sizeof (double),
scanner->calibrations[i].red->width, fcal);
fwrite(&(scanner->calibrations[i].green->width),sizeof(SANE_Int),1,fcal);
fwrite(&(scanner->calibrations[i].green->white_level),sizeof(SANE_Int),1,fcal);
fwrite(scanner->calibrations[i].green->k_white,sizeof(unsigned int),scanner->calibrations[i].green->width,fcal);
fwrite(scanner->calibrations[i].green->k_black,sizeof(unsigned int),scanner->calibrations[i].green->width,fcal);
fwrite(scanner->calibrations[i].green->white_line,sizeof(double),scanner->calibrations[i].green->width,fcal);
fwrite(scanner->calibrations[i].green->black_line,sizeof(double),scanner->calibrations[i].green->width,fcal);
fwrite (&(scanner->calibrations[i].green->width), sizeof (SANE_Int), 1,
fcal);
fwrite (&(scanner->calibrations[i].green->white_level),
sizeof (SANE_Int), 1, fcal);
fwrite (scanner->calibrations[i].green->k_white, sizeof (unsigned int),
scanner->calibrations[i].green->width, fcal);
fwrite (scanner->calibrations[i].green->k_black, sizeof (unsigned int),
scanner->calibrations[i].green->width, fcal);
fwrite (scanner->calibrations[i].green->white_line, sizeof (double),
scanner->calibrations[i].green->width, fcal);
fwrite (scanner->calibrations[i].green->black_line, sizeof (double),
scanner->calibrations[i].green->width, fcal);
fwrite(&(scanner->calibrations[i].blue->width),sizeof(SANE_Int),1,fcal);
fwrite(&(scanner->calibrations[i].blue->white_level),sizeof(SANE_Int),1,fcal);
fwrite(scanner->calibrations[i].blue->k_white,sizeof(unsigned int),scanner->calibrations[i].blue->width,fcal);
fwrite(scanner->calibrations[i].blue->k_black,sizeof(unsigned int),scanner->calibrations[i].blue->width,fcal);
fwrite(scanner->calibrations[i].blue->white_line,sizeof(double),scanner->calibrations[i].blue->width,fcal);
fwrite(scanner->calibrations[i].blue->black_line,sizeof(double),scanner->calibrations[i].blue->width,fcal);
fwrite (&(scanner->calibrations[i].blue->width), sizeof (SANE_Int), 1,
fcal);
fwrite (&(scanner->calibrations[i].blue->white_level),
sizeof (SANE_Int), 1, fcal);
fwrite (scanner->calibrations[i].blue->k_white, sizeof (unsigned int),
scanner->calibrations[i].blue->width, fcal);
fwrite (scanner->calibrations[i].blue->k_black, sizeof (unsigned int),
scanner->calibrations[i].blue->width, fcal);
fwrite (scanner->calibrations[i].blue->white_line, sizeof (double),
scanner->calibrations[i].blue->width, fcal);
fwrite (scanner->calibrations[i].blue->black_line, sizeof (double),
scanner->calibrations[i].blue->width, fcal);
if (scanner->calibrations[i].gray != NULL)
{
fwrite(&(scanner->calibrations[i].gray->width),sizeof(SANE_Int),1,fcal);
fwrite(&(scanner->calibrations[i].gray->white_level),sizeof(SANE_Int),1,fcal);
fwrite(scanner->calibrations[i].gray->k_white,sizeof(unsigned int),scanner->calibrations[i].gray->width,fcal);
fwrite(scanner->calibrations[i].gray->k_black,sizeof(unsigned int),scanner->calibrations[i].gray->width,fcal);
fwrite(scanner->calibrations[i].gray->white_line,sizeof(double),scanner->calibrations[i].gray->width,fcal);
fwrite(scanner->calibrations[i].gray->black_line,sizeof(double),scanner->calibrations[i].gray->width,fcal);
fwrite (&(scanner->calibrations[i].gray->width), sizeof (SANE_Int),
1, fcal);
fwrite (&(scanner->calibrations[i].gray->white_level),
sizeof (SANE_Int), 1, fcal);
fwrite (scanner->calibrations[i].gray->k_white,
sizeof (unsigned int), scanner->calibrations[i].gray->width,
fcal);
fwrite (scanner->calibrations[i].gray->k_black,
sizeof (unsigned int), scanner->calibrations[i].gray->width,
fcal);
fwrite (scanner->calibrations[i].gray->white_line, sizeof (double),
scanner->calibrations[i].gray->width, fcal);
fwrite (scanner->calibrations[i].gray->black_line, sizeof (double),
scanner->calibrations[i].gray->width, fcal);
}
else
{
@ -2571,7 +2638,8 @@ static SANE_Status gt68xx_write_calibration (GT68xx_Scanner * scanner)
return SANE_STATUS_GOOD;
}
static SANE_Status gt68xx_read_calibration (GT68xx_Scanner * scanner)
static SANE_Status
gt68xx_read_calibration (GT68xx_Scanner * scanner)
{
char *fname;
FILE *fcal;
@ -2584,7 +2652,9 @@ static SANE_Status gt68xx_read_calibration (GT68xx_Scanner * scanner)
free (fname);
if (fcal == NULL)
{
DBG(1,"gt68xx_read_calibration: failed to open calibration file for reading %s\n",strerror(errno));
DBG (1,
"gt68xx_read_calibration: failed to open calibration file for reading %s\n",
strerror (errno));
return SANE_STATUS_IO_ERROR;
}
@ -2593,48 +2663,67 @@ static SANE_Status gt68xx_read_calibration (GT68xx_Scanner * scanner)
/* TODO check for errors */
fread (&(scanner->afe_params), sizeof (GT68xx_AFE_Parameters), 1, fcal);
fread(&(scanner->exposure_params), sizeof(GT68xx_Exposure_Parameters), 1, fcal);
fread (&(scanner->exposure_params), sizeof (GT68xx_Exposure_Parameters), 1,
fcal);
/* loop on calibrators */
i = 0;
fread (&(scanner->calibrations[i].dpi), sizeof (SANE_Int), 1, fcal);
while (!feof (fcal) && scanner->calibrations[i].dpi > 0)
{
fread(&(scanner->calibrations[i].pixel_x0),sizeof(SANE_Int),1,fcal);
fread (&(scanner->calibrations[i].pixel_x0), sizeof (SANE_Int), 1,
fcal);
fread (&width, sizeof (SANE_Int), 1, fcal);
fread (&level, sizeof (SANE_Int), 1, fcal);
gt68xx_calibrator_new (width, level, &(scanner->calibrations[i].red));
fread(scanner->calibrations[i].red->k_white,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].red->k_black,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].red->white_line,sizeof(double),width,fcal);
fread(scanner->calibrations[i].red->black_line,sizeof(double),width,fcal);
fread (scanner->calibrations[i].red->k_white, sizeof (unsigned int),
width, fcal);
fread (scanner->calibrations[i].red->k_black, sizeof (unsigned int),
width, fcal);
fread (scanner->calibrations[i].red->white_line, sizeof (double), width,
fcal);
fread (scanner->calibrations[i].red->black_line, sizeof (double), width,
fcal);
fread (&width, sizeof (SANE_Int), 1, fcal);
fread (&level, sizeof (SANE_Int), 1, fcal);
gt68xx_calibrator_new (width, level, &(scanner->calibrations[i].green));
fread(scanner->calibrations[i].green->k_white,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].green->k_black,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].green->white_line,sizeof(double),width,fcal);
fread(scanner->calibrations[i].green->black_line,sizeof(double),width,fcal);
fread (scanner->calibrations[i].green->k_white, sizeof (unsigned int),
width, fcal);
fread (scanner->calibrations[i].green->k_black, sizeof (unsigned int),
width, fcal);
fread (scanner->calibrations[i].green->white_line, sizeof (double),
width, fcal);
fread (scanner->calibrations[i].green->black_line, sizeof (double),
width, fcal);
fread (&width, sizeof (SANE_Int), 1, fcal);
fread (&level, sizeof (SANE_Int), 1, fcal);
gt68xx_calibrator_new (width, level, &(scanner->calibrations[i].blue));
fread(scanner->calibrations[i].blue->k_white,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].blue->k_black,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].blue->white_line,sizeof(double),width,fcal);
fread(scanner->calibrations[i].blue->black_line,sizeof(double),width,fcal);
fread (scanner->calibrations[i].blue->k_white, sizeof (unsigned int),
width, fcal);
fread (scanner->calibrations[i].blue->k_black, sizeof (unsigned int),
width, fcal);
fread (scanner->calibrations[i].blue->white_line, sizeof (double),
width, fcal);
fread (scanner->calibrations[i].blue->black_line, sizeof (double),
width, fcal);
fread (&width, sizeof (SANE_Int), 1, fcal);
if (width > 0)
{
fread (&level, sizeof (SANE_Int), 1, fcal);
gt68xx_calibrator_new (width, level, &(scanner->calibrations[i].gray));
fread(scanner->calibrations[i].gray->k_white,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].gray->k_black,sizeof(unsigned int),width,fcal);
fread(scanner->calibrations[i].gray->white_line,sizeof(double),width,fcal);
fread(scanner->calibrations[i].gray->black_line,sizeof(double),width,fcal);
gt68xx_calibrator_new (width, level,
&(scanner->calibrations[i].gray));
fread (scanner->calibrations[i].gray->k_white,
sizeof (unsigned int), width, fcal);
fread (scanner->calibrations[i].gray->k_black,
sizeof (unsigned int), width, fcal);
fread (scanner->calibrations[i].gray->white_line, sizeof (double),
width, fcal);
fread (scanner->calibrations[i].gray->black_line, sizeof (double),
width, fcal);
}
/* prepare for nex resolution */
i++;

Wyświetl plik

@ -230,8 +230,12 @@ enum GT68xx_Option
OPT_BR_Y, /* bottom-right y */
OPT_SENSOR_GROUP,
OPT_NEED_CALIBRATION_SW, /* signals calibration is needed */
OPT_BUTTON_GROUP,
OPT_CALIBRATE, /* button option to trigger call
to sheetfed calibration */
OPT_CLEAR_CALIBRATION, /* clear calibration */
/* must come last: */
NUM_OPTIONS