kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Increase consistency of lamp warmup handling
rodzic
f8193494ad
commit
4586ae4e56
|
@ -67,8 +67,7 @@ public:
|
||||||
virtual void init(Genesys_Device* dev) const = 0;
|
virtual void init(Genesys_Device* dev) const = 0;
|
||||||
|
|
||||||
virtual void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
virtual void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const = 0;
|
||||||
int* total_size) const = 0;
|
|
||||||
|
|
||||||
virtual void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
virtual void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const = 0;
|
Genesys_Register_Set& regs) const = 0;
|
||||||
|
|
|
@ -3428,18 +3428,20 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
unsigned seconds = 0;
|
unsigned seconds = 0;
|
||||||
int pixel;
|
|
||||||
int channels, total_size;
|
|
||||||
double first_average = 0;
|
double first_average = 0;
|
||||||
double second_average = 0;
|
double second_average = 0;
|
||||||
int difference = 255;
|
int difference = 255;
|
||||||
int lines = 3;
|
|
||||||
|
|
||||||
const auto& sensor = sanei_genesys_find_sensor_any(dev);
|
const auto& sensor = sanei_genesys_find_sensor_any(dev);
|
||||||
|
|
||||||
dev->cmd_set->init_regs_for_warmup(dev, sensor, &dev->reg, &channels, &total_size);
|
dev->cmd_set->init_regs_for_warmup(dev, sensor, &dev->reg);
|
||||||
dev->interface->write_registers(dev->reg);
|
dev->interface->write_registers(dev->reg);
|
||||||
|
|
||||||
|
auto total_pixels = dev->session.output_pixels;
|
||||||
|
auto total_size = dev->session.output_line_bytes;
|
||||||
|
auto channels = dev->session.params.channels;
|
||||||
|
auto lines = dev->session.output_line_count;
|
||||||
|
|
||||||
std::vector<uint8_t> first_line(total_size);
|
std::vector<uint8_t> first_line(total_size);
|
||||||
std::vector<uint8_t> second_line(total_size);
|
std::vector<uint8_t> second_line(total_size);
|
||||||
|
|
||||||
|
@ -3476,8 +3478,7 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
|
||||||
dev->cmd_set->end_scan(dev, &dev->reg, true);
|
dev->cmd_set->end_scan(dev, &dev->reg, true);
|
||||||
|
|
||||||
/* compute difference between the two scans */
|
/* compute difference between the two scans */
|
||||||
for (pixel = 0; pixel < total_size; pixel++)
|
for (unsigned pixel = 0; pixel < total_size; pixel++) {
|
||||||
{
|
|
||||||
// 16 bit data
|
// 16 bit data
|
||||||
if (dev->session.params.depth == 16) {
|
if (dev->session.params.depth == 16) {
|
||||||
first_average += (first_line[pixel] + first_line[pixel + 1] * 256);
|
first_average += (first_line[pixel] + first_line[pixel + 1] * 256);
|
||||||
|
@ -3488,11 +3489,13 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
|
||||||
{
|
{
|
||||||
first_average += first_line[pixel];
|
first_average += first_line[pixel];
|
||||||
second_average += second_line[pixel];
|
second_average += second_line[pixel];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
first_average /= total_pixels;
|
||||||
|
second_average /= total_pixels;
|
||||||
|
|
||||||
if (dev->session.params.depth == 16) {
|
if (dev->session.params.depth == 16) {
|
||||||
first_average /= pixel;
|
|
||||||
second_average /= pixel;
|
|
||||||
difference = static_cast<int>(std::fabs(first_average - second_average));
|
difference = static_cast<int>(std::fabs(first_average - second_average));
|
||||||
DBG(DBG_info, "%s: average = %.2f, diff = %.3f\n", __func__,
|
DBG(DBG_info, "%s: average = %.2f, diff = %.3f\n", __func__,
|
||||||
100 * ((second_average) / (256 * 256)),
|
100 * ((second_average) / (256 * 256)),
|
||||||
|
@ -3501,11 +3504,8 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
|
||||||
if (second_average > (100 * 256)
|
if (second_average > (100 * 256)
|
||||||
&& (difference / second_average) < 0.002)
|
&& (difference / second_average) < 0.002)
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
first_average /= pixel;
|
|
||||||
second_average /= pixel;
|
|
||||||
if (DBG_LEVEL >= DBG_data)
|
if (DBG_LEVEL >= DBG_data)
|
||||||
{
|
{
|
||||||
sanei_genesys_write_pnm_file("gl_warmup1.pnm", first_line.data(), 8, channels,
|
sanei_genesys_write_pnm_file("gl_warmup1.pnm", first_line.data(), 8, channels,
|
||||||
|
@ -3519,7 +3519,7 @@ static void genesys_warmup_lamp(Genesys_Device* dev)
|
||||||
if (fabs (first_average - second_average) < 15
|
if (fabs (first_average - second_average) < 15
|
||||||
&& second_average > 55)
|
&& second_average > 55)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sleep another second before next loop */
|
/* sleep another second before next loop */
|
||||||
dev->interface->sleep_ms(1000);
|
dev->interface->sleep_ms(1000);
|
||||||
|
|
|
@ -1418,13 +1418,9 @@ void CommandSetGl124::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
||||||
// wait for lamp warmup by scanning the same line until difference
|
// wait for lamp warmup by scanning the same line until difference
|
||||||
// between 2 scans is below a threshold
|
// between 2 scans is below a threshold
|
||||||
void CommandSetGl124::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void CommandSetGl124::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* reg, int* channels,
|
Genesys_Register_Set* reg) const
|
||||||
int* total_size) const
|
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
int num_pixels;
|
|
||||||
|
|
||||||
*channels=3;
|
|
||||||
|
|
||||||
*reg = dev->reg;
|
*reg = dev->reg;
|
||||||
|
|
||||||
|
@ -1436,7 +1432,7 @@ void CommandSetGl124::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
|
||||||
session.params.pixels = dev->model->x_size_calib_mm * sensor.optical_res / MM_PER_INCH / 2;
|
session.params.pixels = dev->model->x_size_calib_mm * sensor.optical_res / MM_PER_INCH / 2;
|
||||||
session.params.lines = 1;
|
session.params.lines = 1;
|
||||||
session.params.depth = 8;
|
session.params.depth = 8;
|
||||||
session.params.channels = *channels;
|
session.params.channels = 3;
|
||||||
session.params.scan_method = dev->settings.scan_method;
|
session.params.scan_method = dev->settings.scan_method;
|
||||||
session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
|
session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
|
||||||
session.params.color_filter = dev->settings.color_filter;
|
session.params.color_filter = dev->settings.color_filter;
|
||||||
|
@ -1449,10 +1445,6 @@ void CommandSetGl124::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
|
||||||
|
|
||||||
init_regs_for_scan_session(dev, sensor, reg, session);
|
init_regs_for_scan_session(dev, sensor, reg, session);
|
||||||
|
|
||||||
num_pixels = session.output_pixels;
|
|
||||||
|
|
||||||
*total_size = num_pixels * 3 * 1; /* colors * bytes_per_color * scan lines */
|
|
||||||
|
|
||||||
sanei_genesys_set_motor_power(*reg, false);
|
sanei_genesys_set_motor_power(*reg, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,8 +93,7 @@ public:
|
||||||
void init(Genesys_Device* dev) const override;
|
void init(Genesys_Device* dev) const override;
|
||||||
|
|
||||||
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const override;
|
||||||
int* total_size) const override;
|
|
||||||
|
|
||||||
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const override;
|
Genesys_Register_Set& regs) const override;
|
||||||
|
|
|
@ -2458,14 +2458,12 @@ void CommandSetGl646::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void CommandSetGl646::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void CommandSetGl646::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* local_reg, int* channels,
|
Genesys_Register_Set* local_reg) const
|
||||||
int* total_size) const
|
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
(void) sensor;
|
(void) sensor;
|
||||||
|
|
||||||
Genesys_Settings settings;
|
Genesys_Settings settings;
|
||||||
int lines;
|
|
||||||
|
|
||||||
dev->frontend = dev->frontend_initial;
|
dev->frontend = dev->frontend_initial;
|
||||||
|
|
||||||
|
@ -2504,11 +2502,6 @@ void CommandSetGl646::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
|
||||||
/* turn off motor during this scan */
|
/* turn off motor during this scan */
|
||||||
sanei_genesys_set_motor_power(*local_reg, false);
|
sanei_genesys_set_motor_power(*local_reg, false);
|
||||||
|
|
||||||
/* returned value to higher level warmup function */
|
|
||||||
*channels = 1;
|
|
||||||
lines = local_reg->get24(REG_LINCNT) + 1;
|
|
||||||
*total_size = lines * settings.pixels;
|
|
||||||
|
|
||||||
// now registers are ok, write them to scanner
|
// now registers are ok, write them to scanner
|
||||||
gl646_set_fe(dev, local_sensor, AFE_SET, settings.xres);
|
gl646_set_fe(dev, local_sensor, AFE_SET, settings.xres);
|
||||||
}
|
}
|
||||||
|
|
|
@ -446,8 +446,7 @@ public:
|
||||||
void init(Genesys_Device* dev) const override;
|
void init(Genesys_Device* dev) const override;
|
||||||
|
|
||||||
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const override;
|
||||||
int* total_size) const override;
|
|
||||||
|
|
||||||
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const override;
|
Genesys_Register_Set& regs) const override;
|
||||||
|
|
|
@ -2834,8 +2834,7 @@ void CommandSetGl841::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
||||||
// wait for lamp warmup by scanning the same line until difference
|
// wait for lamp warmup by scanning the same line until difference
|
||||||
// between 2 scans is below a threshold
|
// between 2 scans is below a threshold
|
||||||
void CommandSetGl841::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void CommandSetGl841::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* local_reg, int* channels,
|
Genesys_Register_Set* local_reg) const
|
||||||
int* total_size) const
|
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
int num_pixels = 4 * 300;
|
int num_pixels = 4 * 300;
|
||||||
|
@ -2857,13 +2856,9 @@ void CommandSetGl841::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
|
||||||
session.params.pixels = num_pixels;
|
session.params.pixels = num_pixels;
|
||||||
session.params.lines = 1;
|
session.params.lines = 1;
|
||||||
session.params.depth = 16;
|
session.params.depth = 16;
|
||||||
session.params.channels = *channels;
|
session.params.channels = 3;
|
||||||
session.params.scan_method = dev->settings.scan_method;
|
session.params.scan_method = dev->settings.scan_method;
|
||||||
if (*channels == 3) {
|
session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
|
||||||
session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
|
|
||||||
} else {
|
|
||||||
session.params.scan_mode = ScanColorMode::GRAY;
|
|
||||||
}
|
|
||||||
session.params.color_filter = dev->settings.color_filter;
|
session.params.color_filter = dev->settings.color_filter;
|
||||||
session.params.flags = ScanFlag::DISABLE_SHADING |
|
session.params.flags = ScanFlag::DISABLE_SHADING |
|
||||||
ScanFlag::DISABLE_GAMMA |
|
ScanFlag::DISABLE_GAMMA |
|
||||||
|
@ -2873,10 +2868,6 @@ void CommandSetGl841::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
|
||||||
compute_session(dev, session, sensor);
|
compute_session(dev, session, sensor);
|
||||||
|
|
||||||
init_regs_for_scan_session(dev, sensor, local_reg, session);
|
init_regs_for_scan_session(dev, sensor, local_reg, session);
|
||||||
|
|
||||||
num_pixels = session.output_pixels;
|
|
||||||
|
|
||||||
*total_size = num_pixels * 3 * 2 * 1; /* colors * bytes_per_color * scan lines */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -60,8 +60,7 @@ public:
|
||||||
void init(Genesys_Device* dev) const override;
|
void init(Genesys_Device* dev) const override;
|
||||||
|
|
||||||
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const override;
|
||||||
int* total_size) const override;
|
|
||||||
|
|
||||||
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const override;
|
Genesys_Register_Set& regs) const override;
|
||||||
|
|
|
@ -1757,20 +1757,18 @@ void CommandSetGl843::coarse_gain_calibration(Genesys_Device* dev, const Genesys
|
||||||
// wait for lamp warmup by scanning the same line until difference
|
// wait for lamp warmup by scanning the same line until difference
|
||||||
// between 2 scans is below a threshold
|
// between 2 scans is below a threshold
|
||||||
void CommandSetGl843::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void CommandSetGl843::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* reg, int* channels,
|
Genesys_Register_Set* reg) const
|
||||||
int* total_size) const
|
|
||||||
{
|
{
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
(void) sensor;
|
(void) sensor;
|
||||||
|
|
||||||
*channels=3;
|
unsigned channels = 3;
|
||||||
unsigned resolution = dev->model->get_resolution_settings(dev->settings.scan_method)
|
unsigned resolution = dev->model->get_resolution_settings(dev->settings.scan_method)
|
||||||
.get_nearest_resolution_x(600);
|
.get_nearest_resolution_x(600);
|
||||||
|
|
||||||
const auto& calib_sensor = sanei_genesys_find_sensor(dev, resolution, *channels,
|
const auto& calib_sensor = sanei_genesys_find_sensor(dev, resolution, channels,
|
||||||
dev->settings.scan_method);
|
dev->settings.scan_method);
|
||||||
unsigned num_pixels = dev->model->x_size_calib_mm * resolution / MM_PER_INCH / 2;
|
unsigned num_pixels = dev->model->x_size_calib_mm * resolution / MM_PER_INCH / 2;
|
||||||
*total_size = num_pixels * 3 * 1;
|
|
||||||
|
|
||||||
*reg = dev->reg;
|
*reg = dev->reg;
|
||||||
|
|
||||||
|
@ -1782,7 +1780,7 @@ void CommandSetGl843::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se
|
||||||
session.params.pixels = num_pixels;
|
session.params.pixels = num_pixels;
|
||||||
session.params.lines = 1;
|
session.params.lines = 1;
|
||||||
session.params.depth = 8;
|
session.params.depth = 8;
|
||||||
session.params.channels = *channels;
|
session.params.channels = channels;
|
||||||
session.params.scan_method = dev->settings.scan_method;
|
session.params.scan_method = dev->settings.scan_method;
|
||||||
session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
|
session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS;
|
||||||
session.params.color_filter = dev->settings.color_filter;
|
session.params.color_filter = dev->settings.color_filter;
|
||||||
|
|
|
@ -60,8 +60,7 @@ public:
|
||||||
void init(Genesys_Device* dev) const override;
|
void init(Genesys_Device* dev) const override;
|
||||||
|
|
||||||
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const override;
|
||||||
int* total_size) const override;
|
|
||||||
|
|
||||||
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const override;
|
Genesys_Register_Set& regs) const override;
|
||||||
|
|
|
@ -1392,14 +1392,11 @@ bool CommandSetGl846::needs_home_before_init_regs_for_scan(Genesys_Device* dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandSetGl846::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void CommandSetGl846::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const
|
||||||
int* total_size) const
|
|
||||||
{
|
{
|
||||||
(void) dev;
|
(void) dev;
|
||||||
(void) sensor;
|
(void) sensor;
|
||||||
(void) regs;
|
(void) regs;
|
||||||
(void) channels;
|
|
||||||
(void) total_size;
|
|
||||||
throw SaneException("not implemented");
|
throw SaneException("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,8 +60,7 @@ public:
|
||||||
void init(Genesys_Device* dev) const override;
|
void init(Genesys_Device* dev) const override;
|
||||||
|
|
||||||
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const override;
|
||||||
int* total_size) const override;
|
|
||||||
|
|
||||||
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const override;
|
Genesys_Register_Set& regs) const override;
|
||||||
|
|
|
@ -1288,14 +1288,11 @@ bool CommandSetGl847::needs_home_before_init_regs_for_scan(Genesys_Device* dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommandSetGl847::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void CommandSetGl847::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const
|
||||||
int* total_size) const
|
|
||||||
{
|
{
|
||||||
(void) dev;
|
(void) dev;
|
||||||
(void) sensor;
|
(void) sensor;
|
||||||
(void) regs;
|
(void) regs;
|
||||||
(void) channels;
|
|
||||||
(void) total_size;
|
|
||||||
throw SaneException("not implemented");
|
throw SaneException("not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,8 +80,7 @@ public:
|
||||||
void init(Genesys_Device* dev) const override;
|
void init(Genesys_Device* dev) const override;
|
||||||
|
|
||||||
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_warmup(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set* regs, int* channels,
|
Genesys_Register_Set* regs) const override;
|
||||||
int* total_size) const override;
|
|
||||||
|
|
||||||
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
void init_regs_for_shading(Genesys_Device* dev, const Genesys_Sensor& sensor,
|
||||||
Genesys_Register_Set& regs) const override;
|
Genesys_Register_Set& regs) const override;
|
||||||
|
|
Ładowanie…
Reference in New Issue