add a 10 minutes expiration time for GL646 CCD scanners' calibration cache

merge-requests/1/head
Stéphane Voltz 2009-07-08 21:19:44 +02:00 zatwierdzone przez Stphane Voltz
rodzic 4a5604412a
commit 12594427d9
2 zmienionych plików z 78 dodań i 30 usunięć

Wyświetl plik

@ -3335,6 +3335,9 @@ genesys_save_calibration (Genesys_Device * dev)
SANE_Status status = SANE_STATUS_UNSUPPORTED; SANE_Status status = SANE_STATUS_UNSUPPORTED;
Genesys_Calibration_Cache *cache = NULL; Genesys_Calibration_Cache *cache = NULL;
uint8_t *tmp; uint8_t *tmp;
#ifdef HAVE_SYS_TIME_H
struct timeval time;
#endif
DBG (DBG_proc, "genesys_save_calibration\n"); DBG (DBG_proc, "genesys_save_calibration\n");
@ -3414,6 +3417,10 @@ genesys_save_calibration (Genesys_Device * dev)
cache->average_size); cache->average_size);
memcpy (cache->white_average_data, dev->white_average_data, memcpy (cache->white_average_data, dev->white_average_data,
cache->average_size); cache->average_size);
#ifdef HAVE_SYS_TIME_H
gettimeofday(&time,NULL);
cache->last_calibration = time.tv_sec;
#endif
DBG (DBG_proc, "genesys_save_calibration: completed\n"); DBG (DBG_proc, "genesys_save_calibration: completed\n");
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;

Wyświetl plik

@ -2786,7 +2786,8 @@ gl646_search_start_position (Genesys_Device * dev)
settings.exposure_time = 0; settings.exposure_time = 0;
/* scan the desired area */ /* scan the desired area */
status = simple_scan (dev, settings, SANE_TRUE, SANE_TRUE, SANE_FALSE, &data); status =
simple_scan (dev, settings, SANE_TRUE, SANE_TRUE, SANE_FALSE, &data);
/* process data if scan is OK */ /* process data if scan is OK */
if (status == SANE_STATUS_GOOD) if (status == SANE_STATUS_GOOD)
@ -2898,7 +2899,8 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
settings.yres = dev->sensor.optical_res / half_ccd; settings.yres = dev->sensor.optical_res / half_ccd;
settings.tl_x = 0; settings.tl_x = 0;
settings.tl_y = 0; settings.tl_y = 0;
settings.pixels = (dev->sensor.sensor_pixels * settings.xres) / dev->sensor.optical_res; settings.pixels =
(dev->sensor.sensor_pixels * settings.xres) / dev->sensor.optical_res;
settings.lines = dev->model->shading_lines * (3 - half_ccd); settings.lines = dev->model->shading_lines * (3 - half_ccd);
settings.depth = 16; settings.depth = 16;
settings.color_filter = dev->settings.color_filter; settings.color_filter = dev->settings.color_filter;
@ -3383,7 +3385,9 @@ gl646_offset_calibration (Genesys_Device * dev)
dev->frontend.offset[0] = bottom; dev->frontend.offset[0] = bottom;
dev->frontend.offset[1] = bottom; dev->frontend.offset[1] = bottom;
dev->frontend.offset[2] = bottom; dev->frontend.offset[2] = bottom;
status = simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE, &first_line); status =
simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE,
&first_line);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_error, DBG (DBG_error,
@ -3409,7 +3413,9 @@ gl646_offset_calibration (Genesys_Device * dev)
dev->frontend.offset[0] = top; dev->frontend.offset[0] = top;
dev->frontend.offset[1] = top; dev->frontend.offset[1] = top;
dev->frontend.offset[2] = top; dev->frontend.offset[2] = top;
status = simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE, &second_line); status =
simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE,
&second_line);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_error, DBG (DBG_error,
@ -3440,7 +3446,8 @@ gl646_offset_calibration (Genesys_Device * dev)
/* scan with no move */ /* scan with no move */
status = status =
simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE, &second_line); simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE,
&second_line);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_error, DBG (DBG_error,
@ -3479,7 +3486,8 @@ gl646_offset_calibration (Genesys_Device * dev)
if (DBG_LEVEL >= DBG_data) if (DBG_LEVEL >= DBG_data)
{ {
status = status =
simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE, &second_line); simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE,
&second_line);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_error, DBG (DBG_error,
@ -3579,7 +3587,8 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
|| (average[2] < dev->sensor.gain_white_ref)) && (pass < 30)) || (average[2] < dev->sensor.gain_white_ref)) && (pass < 30))
{ {
/* scan with no move */ /* scan with no move */
status = simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE,&line); status =
simple_scan (dev, settings, SANE_FALSE, SANE_TRUE, SANE_FALSE, &line);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_error, DBG (DBG_error,
@ -4234,7 +4243,8 @@ simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move,
if (buffer == NULL) if (buffer == NULL)
{ {
DBG (DBG_error, DBG (DBG_error,
"simple_scan: failed to allocate %d bytes of memory\n", settings.pixels * 3); "simple_scan: failed to allocate %d bytes of memory\n",
settings.pixels * 3);
return SANE_STATUS_NO_MEM; return SANE_STATUS_NO_MEM;
} }
@ -4247,11 +4257,15 @@ simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move,
for (x = 0; x < settings.pixels; x++) for (x = 0; x < settings.pixels; x++)
{ {
buffer[x * 3] = (*data)[y * settings.pixels * 3 + x]; buffer[x * 3] = (*data)[y * settings.pixels * 3 + x];
buffer[x * 3 + 1] = (*data)[y * settings.pixels * 3 + settings.pixels + x]; buffer[x * 3 + 1] =
buffer[x * 3 + 2] = (*data)[y * settings.pixels * 3 + 2 * settings.pixels + x]; (*data)[y * settings.pixels * 3 + settings.pixels + x];
buffer[x * 3 + 2] =
(*data)[y * settings.pixels * 3 + 2 * settings.pixels +
x];
} }
/* copy line back */ /* copy line back */
memcpy ((*data) + settings.pixels * 3 * y, buffer, settings.pixels * 3); memcpy ((*data) + settings.pixels * 3 * y, buffer,
settings.pixels * 3);
} }
} }
else else
@ -4262,14 +4276,24 @@ simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move,
for (x = 0; x < settings.pixels; x++) for (x = 0; x < settings.pixels; x++)
{ {
buffer[x * 6] = (*data)[y * settings.pixels * 6 + x * 2]; buffer[x * 6] = (*data)[y * settings.pixels * 6 + x * 2];
buffer[x * 6 + 1] = (*data)[y * settings.pixels * 6 + x * 2 + 1]; buffer[x * 6 + 1] =
buffer[x * 6 + 2] = (*data)[y * settings.pixels * 6 + 2 * settings.pixels + x * 2 ]; (*data)[y * settings.pixels * 6 + x * 2 + 1];
buffer[x * 6 + 3] = (*data)[y * settings.pixels * 6 + 2 * settings.pixels + x * 2 + 1]; buffer[x * 6 + 2] =
buffer[x * 6 + 4] = (*data)[y * settings.pixels * 6 + 4 * settings.pixels + x * 2 ]; (*data)[y * settings.pixels * 6 + 2 * settings.pixels +
buffer[x * 6 + 5] = (*data)[y * settings.pixels * 6 + 4 * settings.pixels + x * 2 + 1]; x * 2];
buffer[x * 6 + 3] =
(*data)[y * settings.pixels * 6 + 2 * settings.pixels +
x * 2 + 1];
buffer[x * 6 + 4] =
(*data)[y * settings.pixels * 6 + 4 * settings.pixels +
x * 2];
buffer[x * 6 + 5] =
(*data)[y * settings.pixels * 6 + 4 * settings.pixels +
x * 2 + 1];
} }
/* copy line back */ /* copy line back */
memcpy ((*data) + settings.pixels * 6 * y, buffer, settings.pixels * 6); memcpy ((*data) + settings.pixels * 6 * y, buffer,
settings.pixels * 6);
} }
} }
free (buffer); free (buffer);
@ -4492,6 +4516,10 @@ gl646_is_compatible_calibration (Genesys_Device * dev,
Genesys_Calibration_Cache * cache, Genesys_Calibration_Cache * cache,
int for_overwrite) int for_overwrite)
{ {
#ifdef HAVE_SYS_TIME_H
struct timeval time;
#endif
DBG (DBG_proc, DBG (DBG_proc,
"gl646_is_compatible_calibration: start (for_overwrite=%d)\n", "gl646_is_compatible_calibration: start (for_overwrite=%d)\n",
for_overwrite); for_overwrite);
@ -4522,6 +4550,18 @@ gl646_is_compatible_calibration (Genesys_Device * dev,
return SANE_STATUS_UNSUPPORTED; return SANE_STATUS_UNSUPPORTED;
} }
/* a cache entry expires after 10 minutes for non CIS scanners */
#ifdef HAVE_SYS_TIME_H
gettimeofday (&time, NULL);
if ((time.tv_sec - cache->last_calibration > 10 * 60)
&& (dev->model->is_cis == SANE_FALSE))
{
DBG (DBG_proc,
"gl646_is_compatible_calibration: expired entry, non compatible cache\n");
return SANE_STATUS_UNSUPPORTED;
}
#endif
DBG (DBG_proc, DBG (DBG_proc,
"gl646_is_compatible_calibration: completed, cache compatible\n"); "gl646_is_compatible_calibration: completed, cache compatible\n");
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -4588,7 +4628,8 @@ gl646_search_strip (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black)
while (pass < 20 && !found) while (pass < 20 && !found)
{ {
/* scan a full width strip */ /* scan a full width strip */
status = simple_scan (dev, settings, SANE_TRUE, forward, SANE_FALSE, &data); status =
simple_scan (dev, settings, SANE_TRUE, forward, SANE_FALSE, &data);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG (DBG_error, "gl646_search_strip: simple_scan failed\n"); DBG (DBG_error, "gl646_search_strip: simple_scan failed\n");