kopia lustrzana https://gitlab.com/sane-project/backends
change led calibration for gl847
rodzic
f9447a43ff
commit
f2acf37faa
|
@ -2814,10 +2814,10 @@ gl847_led_calibration (Genesys_Device * dev)
|
||||||
SANE_Status status = SANE_STATUS_GOOD;
|
SANE_Status status = SANE_STATUS_GOOD;
|
||||||
int val;
|
int val;
|
||||||
int channels, depth;
|
int channels, depth;
|
||||||
int avg[3], avga, avge;
|
int avg[3], top[3], bottom[3];
|
||||||
int turn;
|
int turn;
|
||||||
char fn[20];
|
char fn[20];
|
||||||
uint16_t expr, expg, expb;
|
uint16_t exp[3];
|
||||||
Sensor_Profile *sensor;
|
Sensor_Profile *sensor;
|
||||||
|
|
||||||
SANE_Bool acceptable = SANE_FALSE;
|
SANE_Bool acceptable = SANE_FALSE;
|
||||||
|
@ -2869,17 +2869,17 @@ gl847_led_calibration (Genesys_Device * dev)
|
||||||
if (!line)
|
if (!line)
|
||||||
return SANE_STATUS_NO_MEM;
|
return SANE_STATUS_NO_MEM;
|
||||||
|
|
||||||
/*
|
exp[0]=sensor->expr;
|
||||||
we try to get equal bright leds here:
|
exp[1]=sensor->expg;
|
||||||
|
exp[2]=sensor->expb;
|
||||||
|
|
||||||
loop:
|
bottom[0]=40000;
|
||||||
average per color
|
bottom[1]=50000;
|
||||||
adjust exposure times
|
bottom[2]=50000;
|
||||||
*/
|
|
||||||
|
|
||||||
expr=sensor->expr;
|
top[0]=45000;
|
||||||
expg=sensor->expg;
|
top[1]=55000;
|
||||||
expb=sensor->expb;
|
top[2]=55000;
|
||||||
|
|
||||||
turn = 0;
|
turn = 0;
|
||||||
|
|
||||||
|
@ -2887,9 +2887,9 @@ gl847_led_calibration (Genesys_Device * dev)
|
||||||
gl847_set_motor_power (dev->calib_reg, SANE_FALSE);
|
gl847_set_motor_power (dev->calib_reg, SANE_FALSE);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
sanei_genesys_set_double(dev->calib_reg,REG_EXPR,expr);
|
sanei_genesys_set_double(dev->calib_reg,REG_EXPR,exp[0]);
|
||||||
sanei_genesys_set_double(dev->calib_reg,REG_EXPG,expg);
|
sanei_genesys_set_double(dev->calib_reg,REG_EXPG,exp[1]);
|
||||||
sanei_genesys_set_double(dev->calib_reg,REG_EXPB,expb);
|
sanei_genesys_set_double(dev->calib_reg,REG_EXPB,exp[2]);
|
||||||
|
|
||||||
RIE (gl847_bulk_write_register
|
RIE (gl847_bulk_write_register
|
||||||
(dev, dev->calib_reg, GENESYS_GL847_MAX_REGS));
|
(dev, dev->calib_reg, GENESYS_GL847_MAX_REGS));
|
||||||
|
@ -2925,70 +2925,45 @@ gl847_led_calibration (Genesys_Device * dev)
|
||||||
|
|
||||||
avg[j] /= num_pixels;
|
avg[j] /= num_pixels;
|
||||||
}
|
}
|
||||||
avga = (avg[0] + avg[1] + avg[2]) / 3;
|
|
||||||
|
|
||||||
DBG (DBG_info, "gl847_led_calibration: average: "
|
DBG (DBG_info, "gl847_led_calibration: average: "
|
||||||
"%d,%d,%d\n", avg[0], avg[1], avg[2]);
|
"%d,%d,%d\n", avg[0], avg[1], avg[2]);
|
||||||
|
|
||||||
acceptable = SANE_TRUE;
|
acceptable = SANE_TRUE;
|
||||||
|
|
||||||
if (avg[0] < avg[1] * 0.95 || avg[1] < avg[0] * 0.95 ||
|
for(i=0;i<3;i++)
|
||||||
avg[0] < avg[2] * 0.95 || avg[2] < avg[0] * 0.95 ||
|
{
|
||||||
avg[1] < avg[2] * 0.95 || avg[2] < avg[1] * 0.95)
|
if(avg[i]<bottom[i])
|
||||||
acceptable = SANE_FALSE;
|
{
|
||||||
|
exp[i]=(exp[i]*bottom[i])/avg[i];
|
||||||
if (!acceptable)
|
acceptable = SANE_FALSE;
|
||||||
{
|
}
|
||||||
expr = (expr * avga) / avg[0];
|
if(avg[i]>top[i])
|
||||||
expg = (expg * avga) / avg[1];
|
{
|
||||||
expb = (expb * avga) / avg[2];
|
exp[i]=(exp[i]*top[i])/avg[i];
|
||||||
/*
|
acceptable = SANE_FALSE;
|
||||||
keep the resulting exposures below this value.
|
}
|
||||||
too long exposure drives the ccd into saturation.
|
}
|
||||||
we may fix this by relying on the fact that
|
|
||||||
we get a striped scan without shading, by means of
|
|
||||||
statistical calculation
|
|
||||||
*/
|
|
||||||
avge = (expr + expg + expb) / 3;
|
|
||||||
|
|
||||||
/* don't overflow max exposure */
|
|
||||||
if (avge > 3000)
|
|
||||||
{
|
|
||||||
expr = (expr * 2000) / avge;
|
|
||||||
expg = (expg * 2000) / avge;
|
|
||||||
expb = (expb * 2000) / avge;
|
|
||||||
}
|
|
||||||
if (avge < 50)
|
|
||||||
{
|
|
||||||
expr = (expr * 50) / avge;
|
|
||||||
expg = (expg * 50) / avge;
|
|
||||||
expb = (expb * 50) / avge;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
RIE (gl847_stop_action (dev));
|
RIE (gl847_stop_action (dev));
|
||||||
|
|
||||||
turn++;
|
turn++;
|
||||||
|
|
||||||
}
|
}
|
||||||
while (!acceptable && turn < 100);
|
while (!acceptable && turn < 100);
|
||||||
|
|
||||||
DBG (DBG_info, "gl847_led_calibration: acceptable exposure: %d,%d,%d\n",
|
DBG (DBG_info, "gl847_led_calibration: acceptable exposure: %d,%d,%d\n", exp[0], exp[1], exp[2]);
|
||||||
expr, expg, expb);
|
|
||||||
|
|
||||||
/* set these values as final ones for scan */
|
/* set these values as final ones for scan */
|
||||||
sanei_genesys_set_double(dev->reg,REG_EXPR,expr);
|
sanei_genesys_set_double(dev->reg,REG_EXPR,exp[0]);
|
||||||
sanei_genesys_set_double(dev->reg,REG_EXPG,expg);
|
sanei_genesys_set_double(dev->reg,REG_EXPG,exp[1]);
|
||||||
sanei_genesys_set_double(dev->reg,REG_EXPB,expb);
|
sanei_genesys_set_double(dev->reg,REG_EXPB,exp[2]);
|
||||||
|
|
||||||
/* store in this struct since it is the one used by cache calibration */
|
/* store in this struct since it is the one used by cache calibration */
|
||||||
dev->sensor.regs_0x10_0x1d[0] = (expr >> 8) & 0xff;
|
dev->sensor.regs_0x10_0x1d[0] = (exp[0] >> 8) & 0xff;
|
||||||
dev->sensor.regs_0x10_0x1d[1] = expr & 0xff;
|
dev->sensor.regs_0x10_0x1d[1] = exp[0] & 0xff;
|
||||||
dev->sensor.regs_0x10_0x1d[2] = (expg >> 8) & 0xff;
|
dev->sensor.regs_0x10_0x1d[2] = (exp[1] >> 8) & 0xff;
|
||||||
dev->sensor.regs_0x10_0x1d[3] = expg & 0xff;
|
dev->sensor.regs_0x10_0x1d[3] = exp[1] & 0xff;
|
||||||
dev->sensor.regs_0x10_0x1d[4] = (expb >> 8) & 0xff;
|
dev->sensor.regs_0x10_0x1d[4] = (exp[2] >> 8) & 0xff;
|
||||||
dev->sensor.regs_0x10_0x1d[5] = expb & 0xff;
|
dev->sensor.regs_0x10_0x1d[5] = exp[2] & 0xff;
|
||||||
|
|
||||||
/* cleanup before return */
|
/* cleanup before return */
|
||||||
free (line);
|
free (line);
|
||||||
|
|
Ładowanie…
Reference in New Issue