LiDE80 WIP : 1200 dpi color mode working

- factor exposure computing for gl841
- correct motor set up for LiDE80
merge-requests/1/head
Stphane Voltz 2013-11-26 06:20:11 +01:00
rodzic 79371ea4d9
commit 091322f1f6
4 zmienionych plików z 98 dodań i 84 usunięć

Wyświetl plik

@ -782,6 +782,7 @@ sanei_genesys_exposure_time2 (Genesys_Device * dev, float ydpi,
if (exposure < exposure_by_led && dev->model->is_cis)
exposure = exposure_by_led;
DBG (DBG_info, "%s: ydpi=%d, step=%d, endpixel=%d led=%d, power=%d => exposure=%d\n",
__FUNCTION__, (int)ydpi, step_type, endpixel, led_exposure, power_mode, exposure);
return exposure;

Wyświetl plik

@ -1294,11 +1294,13 @@ static Genesys_Motor Motor[] = {
1, /* power mode count */
{
{ /* start speed, max end speed, step number */
/* maximum speed (second field) is used to compute exposure as seen by motor */
/* exposure=max speed/ slope dpi * base dpi */
/* 5144 = max pixels at 600 dpi */
/* 1288=(5144+8)*ydpi(=300)/base_dpi(=1200) , where 5152 is exposure */
/* 6440=9660/(1932/1288) */
{ 6440, 1288, 60, 0.8 }, /* full step 9660 1932 32 values from logs */
{ 15869, 15869, 16, 0.8 }, /* half step 18750 1875 16 values from logs */
{ 6440, 1288, 64, 0.8 },
{ 15569, 15569, 16, 0.8 },
},
},},
};

Wyświetl plik

@ -2473,11 +2473,74 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
return SANE_STATUS_GOOD;
}
static int
static int
gl841_get_led_exposure(Genesys_Device * dev)
{
int d,r,g,b,m;
if (!dev->model->is_cis)
return 0;
d = dev->reg[reg_0x19].value;
r = dev->sensor.regs_0x10_0x1d[1] | (dev->sensor.regs_0x10_0x1d[0] << 8);
g = dev->sensor.regs_0x10_0x1d[3] | (dev->sensor.regs_0x10_0x1d[2] << 8);
b = dev->sensor.regs_0x10_0x1d[5] | (dev->sensor.regs_0x10_0x1d[4] << 8);
m = r;
if (m < g)
m = g;
if (m < b)
m = b;
return m + d;
}
/** @brief compute exposure time
* Compute exposure time for the device and the given scan resolution,
* also compute scan_power_mode
*/
GENESYS_STATIC int
gl841_exposure_time(Genesys_Device *dev,
float slope_dpi,
int scan_step_type,
int start,
int used_pixels,
int *scan_power_mode)
{
int exposure_time = 0;
int exposure_time2 = 0;
int led_exposure;
*scan_power_mode=0;
led_exposure=gl841_get_led_exposure(dev);
exposure_time = sanei_genesys_exposure_time2(
dev,
slope_dpi,
scan_step_type,
start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
led_exposure,
*scan_power_mode);
while(*scan_power_mode + 1 < dev->motor.power_mode_count) {
exposure_time2 = sanei_genesys_exposure_time2(
dev,
slope_dpi,
scan_step_type,
start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
led_exposure,
*scan_power_mode + 1);
if (exposure_time < exposure_time2)
break;
exposure_time = exposure_time2;
(*scan_power_mode)++;
}
return exposure_time;
}
/**@brief compute scan_step_type *
* Try to do at least 4 steps per line. if that is impossible we will have to
live with that.
*/
GENESYS_STATIC int
gl841_scan_step_type(Genesys_Device *dev, int yres)
{
int scan_step_type=0;
@ -2508,37 +2571,17 @@ int scan_step_type=0;
{
scan_step_type = 1;
}
/* driven by 'frequency' tables ? */
scan_step_type = 0;
}
return scan_step_type;
}
static int
gl841_get_led_exposure(Genesys_Device * dev)
{
int d,r,g,b,m;
if (!dev->model->is_cis)
return 0;
d = dev->reg[reg_0x19].value;
r = dev->sensor.regs_0x10_0x1d[1] | (dev->sensor.regs_0x10_0x1d[0] << 8);
g = dev->sensor.regs_0x10_0x1d[3] | (dev->sensor.regs_0x10_0x1d[2] << 8);
b = dev->sensor.regs_0x10_0x1d[5] | (dev->sensor.regs_0x10_0x1d[4] << 8);
m = r;
if (m < g)
m = g;
if (m < b)
m = b;
return m + d;
}
/* set up registers for an actual scan
*
* this function sets up the scanner to scan in normal or single line mode
*/
#ifndef UNIT_TESTING
static
#endif
GENESYS_STATIC
SANE_Status
gl841_init_scan_regs (Genesys_Device * dev,
Genesys_Register_Set * reg,
@ -2559,14 +2602,14 @@ gl841_init_scan_regs (Genesys_Device * dev,
int bytes_per_line;
int move;
unsigned int lincnt;
int exposure_time, exposure_time2, led_exposure;
int exposure_time;
int scan_power_mode;
int i;
int stagger;
int slope_dpi = 0;
int dummy = 0;
int scan_step_type = 1;
int scan_power_mode = 0;
int max_shift;
size_t requested_buffer_size, read_buffer_size;
@ -2729,35 +2772,14 @@ dummy \ scanned lines
slope_dpi = slope_dpi * (1 + dummy);
scan_step_type=gl841_scan_step_type(dev, yres);
/* exposure_time */
led_exposure = gl841_get_led_exposure(dev);
exposure_time = sanei_genesys_exposure_time2(
dev,
slope_dpi,
scan_step_type,
start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
led_exposure,
scan_power_mode);
while(scan_power_mode + 1 < dev->motor.power_mode_count) {
exposure_time2 = sanei_genesys_exposure_time2(
dev,
slope_dpi,
scan_step_type,
start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
led_exposure,
scan_power_mode + 1);
if (exposure_time < exposure_time2)
break;
exposure_time = exposure_time2;
scan_power_mode++;
}
DBG (DBG_info, "gl841_init_scan_regs : exposure_time=%d pixels\n",
exposure_time);
scan_step_type = gl841_scan_step_type(dev, yres);
exposure_time = gl841_exposure_time(dev,
slope_dpi,
scan_step_type,
start,
used_pixels,
&scan_power_mode);
DBG (DBG_info, "%s : exposure_time=%d pixels\n", __FUNCTION__, exposure_time);
/*** optical parameters ***/
/* in case of dynamic lineart, we use an internal 8 bit gray scan
@ -2933,14 +2955,14 @@ gl841_calculate_current_setup (Genesys_Device * dev)
int used_res;
int used_pixels;
unsigned int lincnt;
int exposure_time, exposure_time2, led_exposure;
int exposure_time;
int scan_power_mode;
int i;
int stagger;
int slope_dpi = 0;
int dummy = 0;
int scan_step_type = 1;
int scan_power_mode = 0;
int max_shift;
SANE_Bool half_ccd; /* false: full CCD res is used, true, half max CCD res is used */
@ -3106,31 +3128,12 @@ dummy \ scanned lines
slope_dpi = slope_dpi * (1 + dummy);
scan_step_type = gl841_scan_step_type(dev, yres);
led_exposure = gl841_get_led_exposure(dev);
/* exposure_time */
exposure_time = sanei_genesys_exposure_time2(
dev,
slope_dpi,
scan_step_type,
start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
led_exposure,
scan_power_mode);
while(scan_power_mode + 1 < dev->motor.power_mode_count) {
exposure_time2 = sanei_genesys_exposure_time2(
dev,
slope_dpi,
scan_step_type,
start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
led_exposure,
scan_power_mode + 1);
if (exposure_time < exposure_time2)
break;
exposure_time = exposure_time2;
scan_power_mode++;
}
exposure_time = gl841_exposure_time(dev,
slope_dpi,
scan_step_type,
start,
used_pixels,
&scan_power_mode);
DBG (DBG_info, "%s : exposure_time=%d pixels\n", __FUNCTION__, exposure_time);
/* scanned area must be enlarged by max color shift needed */

Wyświetl plik

@ -433,4 +433,12 @@ SANE_Status gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi);
SANE_Status gl841_led_calibration (Genesys_Device * dev);
SANE_Status gl841_send_shading_data (Genesys_Device * dev, uint8_t * data, int size);
int gl841_exposure_time(Genesys_Device *dev,
float slope_dpi,
int scan_step_type,
int start,
int used_pixels,
int *scan_power_mode);
int gl841_scan_step_type(Genesys_Device *dev, int yres);
#endif